if_wm.c revision 1.681 1 /* $NetBSD: if_wm.c,v 1.681 2020/07/09 06:42:44 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 * - TX Multi queue improvement (refine queue selection logic)
77 * - Split header buffer for newer descriptors
78 * - EEE (Energy Efficiency Ethernet) for I354
79 * - Virtual Function
80 * - Set LED correctly (based on contents in EEPROM)
81 * - Rework how parameters are loaded from the EEPROM.
82 */
83
84 #include <sys/cdefs.h>
85 __KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.681 2020/07/09 06:42:44 msaitoh Exp $");
86
87 #ifdef _KERNEL_OPT
88 #include "opt_net_mpsafe.h"
89 #include "opt_if_wm.h"
90 #endif
91
92 #include <sys/param.h>
93 #include <sys/systm.h>
94 #include <sys/callout.h>
95 #include <sys/mbuf.h>
96 #include <sys/malloc.h>
97 #include <sys/kmem.h>
98 #include <sys/kernel.h>
99 #include <sys/socket.h>
100 #include <sys/ioctl.h>
101 #include <sys/errno.h>
102 #include <sys/device.h>
103 #include <sys/queue.h>
104 #include <sys/syslog.h>
105 #include <sys/interrupt.h>
106 #include <sys/cpu.h>
107 #include <sys/pcq.h>
108 #include <sys/sysctl.h>
109 #include <sys/workqueue.h>
110
111 #include <sys/rndsource.h>
112
113 #include <net/if.h>
114 #include <net/if_dl.h>
115 #include <net/if_media.h>
116 #include <net/if_ether.h>
117
118 #include <net/bpf.h>
119
120 #include <net/rss_config.h>
121
122 #include <netinet/in.h> /* XXX for struct ip */
123 #include <netinet/in_systm.h> /* XXX for struct ip */
124 #include <netinet/ip.h> /* XXX for struct ip */
125 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */
126 #include <netinet/tcp.h> /* XXX for struct tcphdr */
127
128 #include <sys/bus.h>
129 #include <sys/intr.h>
130 #include <machine/endian.h>
131
132 #include <dev/mii/mii.h>
133 #include <dev/mii/mdio.h>
134 #include <dev/mii/miivar.h>
135 #include <dev/mii/miidevs.h>
136 #include <dev/mii/mii_bitbang.h>
137 #include <dev/mii/ikphyreg.h>
138 #include <dev/mii/igphyreg.h>
139 #include <dev/mii/igphyvar.h>
140 #include <dev/mii/inbmphyreg.h>
141 #include <dev/mii/ihphyreg.h>
142
143 #include <dev/pci/pcireg.h>
144 #include <dev/pci/pcivar.h>
145 #include <dev/pci/pcidevs.h>
146
147 #include <dev/pci/if_wmreg.h>
148 #include <dev/pci/if_wmvar.h>
149
150 #ifdef WM_DEBUG
151 #define WM_DEBUG_LINK __BIT(0)
152 #define WM_DEBUG_TX __BIT(1)
153 #define WM_DEBUG_RX __BIT(2)
154 #define WM_DEBUG_GMII __BIT(3)
155 #define WM_DEBUG_MANAGE __BIT(4)
156 #define WM_DEBUG_NVM __BIT(5)
157 #define WM_DEBUG_INIT __BIT(6)
158 #define WM_DEBUG_LOCK __BIT(7)
159 int wm_debug = WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | WM_DEBUG_GMII
160 | WM_DEBUG_MANAGE | WM_DEBUG_NVM | WM_DEBUG_INIT | WM_DEBUG_LOCK;
161 #define DPRINTF(x, y) do { if (wm_debug & (x)) printf y; } while (0)
162 #else
163 #define DPRINTF(x, y) __nothing
164 #endif /* WM_DEBUG */
165
166 #ifdef NET_MPSAFE
167 #define WM_MPSAFE 1
168 #define WM_CALLOUT_FLAGS CALLOUT_MPSAFE
169 #define WM_SOFTINT_FLAGS SOFTINT_MPSAFE
170 #define WM_WORKQUEUE_FLAGS WQ_PERCPU | WQ_MPSAFE
171 #else
172 #define WM_CALLOUT_FLAGS 0
173 #define WM_SOFTINT_FLAGS 0
174 #define WM_WORKQUEUE_FLAGS WQ_PERCPU
175 #endif
176
177 #define WM_WORKQUEUE_PRI PRI_SOFTNET
178
179 /*
180 * This device driver's max interrupt numbers.
181 */
182 #define WM_MAX_NQUEUEINTR 16
183 #define WM_MAX_NINTR (WM_MAX_NQUEUEINTR + 1)
184
185 #ifndef WM_DISABLE_MSI
186 #define WM_DISABLE_MSI 0
187 #endif
188 #ifndef WM_DISABLE_MSIX
189 #define WM_DISABLE_MSIX 0
190 #endif
191
192 int wm_disable_msi = WM_DISABLE_MSI;
193 int wm_disable_msix = WM_DISABLE_MSIX;
194
195 #ifndef WM_WATCHDOG_TIMEOUT
196 #define WM_WATCHDOG_TIMEOUT 5
197 #endif
198 static int wm_watchdog_timeout = WM_WATCHDOG_TIMEOUT;
199
200 /*
201 * Transmit descriptor list size. Due to errata, we can only have
202 * 256 hardware descriptors in the ring on < 82544, but we use 4096
203 * on >= 82544. We tell the upper layers that they can queue a lot
204 * of packets, and we go ahead and manage up to 64 (16 for the i82547)
205 * of them at a time.
206 *
207 * We allow up to 64 DMA segments per packet. Pathological packet
208 * chains containing many small mbufs have been observed in zero-copy
209 * situations with jumbo frames. If a mbuf chain has more than 64 DMA segments,
210 * m_defrag() is called to reduce it.
211 */
212 #define WM_NTXSEGS 64
213 #define WM_IFQUEUELEN 256
214 #define WM_TXQUEUELEN_MAX 64
215 #define WM_TXQUEUELEN_MAX_82547 16
216 #define WM_TXQUEUELEN(txq) ((txq)->txq_num)
217 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1)
218 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8)
219 #define WM_NTXDESC_82542 256
220 #define WM_NTXDESC_82544 4096
221 #define WM_NTXDESC(txq) ((txq)->txq_ndesc)
222 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1)
223 #define WM_TXDESCS_SIZE(txq) (WM_NTXDESC(txq) * (txq)->txq_descsize)
224 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq))
225 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq))
226
227 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */
228
229 #define WM_TXINTERQSIZE 256
230
231 #ifndef WM_TX_PROCESS_LIMIT_DEFAULT
232 #define WM_TX_PROCESS_LIMIT_DEFAULT 100U
233 #endif
234 #ifndef WM_TX_INTR_PROCESS_LIMIT_DEFAULT
235 #define WM_TX_INTR_PROCESS_LIMIT_DEFAULT 0U
236 #endif
237
238 /*
239 * Receive descriptor list size. We have one Rx buffer for normal
240 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized
241 * packet. We allocate 256 receive descriptors, each with a 2k
242 * buffer (MCLBYTES), which gives us room for 50 jumbo packets.
243 */
244 #define WM_NRXDESC 256U
245 #define WM_NRXDESC_MASK (WM_NRXDESC - 1)
246 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK)
247 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK)
248
249 #ifndef WM_RX_PROCESS_LIMIT_DEFAULT
250 #define WM_RX_PROCESS_LIMIT_DEFAULT 100U
251 #endif
252 #ifndef WM_RX_INTR_PROCESS_LIMIT_DEFAULT
253 #define WM_RX_INTR_PROCESS_LIMIT_DEFAULT 0U
254 #endif
255
256 typedef union txdescs {
257 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544];
258 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544];
259 } txdescs_t;
260
261 typedef union rxdescs {
262 wiseman_rxdesc_t sctxu_rxdescs[WM_NRXDESC];
263 ext_rxdesc_t sctxu_ext_rxdescs[WM_NRXDESC]; /* 82574 only */
264 nq_rxdesc_t sctxu_nq_rxdescs[WM_NRXDESC]; /* 82575 and newer */
265 } rxdescs_t;
266
267 #define WM_CDTXOFF(txq, x) ((txq)->txq_descsize * (x))
268 #define WM_CDRXOFF(rxq, x) ((rxq)->rxq_descsize * (x))
269
270 /*
271 * Software state for transmit jobs.
272 */
273 struct wm_txsoft {
274 struct mbuf *txs_mbuf; /* head of our mbuf chain */
275 bus_dmamap_t txs_dmamap; /* our DMA map */
276 int txs_firstdesc; /* first descriptor in packet */
277 int txs_lastdesc; /* last descriptor in packet */
278 int txs_ndesc; /* # of descriptors used */
279 };
280
281 /*
282 * Software state for receive buffers. Each descriptor gets a 2k (MCLBYTES)
283 * buffer and a DMA map. For packets which fill more than one buffer, we chain
284 * them together.
285 */
286 struct wm_rxsoft {
287 struct mbuf *rxs_mbuf; /* head of our mbuf chain */
288 bus_dmamap_t rxs_dmamap; /* our DMA map */
289 };
290
291 #define WM_LINKUP_TIMEOUT 50
292
293 static uint16_t swfwphysem[] = {
294 SWFW_PHY0_SM,
295 SWFW_PHY1_SM,
296 SWFW_PHY2_SM,
297 SWFW_PHY3_SM
298 };
299
300 static const uint32_t wm_82580_rxpbs_table[] = {
301 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140
302 };
303
304 struct wm_softc;
305
306 #ifdef WM_EVENT_COUNTERS
307 #define WM_Q_EVCNT_DEFINE(qname, evname) \
308 char qname##_##evname##_evcnt_name[sizeof("qname##XX##evname")]; \
309 struct evcnt qname##_ev_##evname;
310
311 #define WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, evtype) \
312 do { \
313 snprintf((q)->qname##_##evname##_evcnt_name, \
314 sizeof((q)->qname##_##evname##_evcnt_name), \
315 "%s%02d%s", #qname, (qnum), #evname); \
316 evcnt_attach_dynamic(&(q)->qname##_ev_##evname, \
317 (evtype), NULL, (xname), \
318 (q)->qname##_##evname##_evcnt_name); \
319 } while (0)
320
321 #define WM_Q_MISC_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
322 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_MISC)
323
324 #define WM_Q_INTR_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
325 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_INTR)
326
327 #define WM_Q_EVCNT_DETACH(qname, evname, q, qnum) \
328 evcnt_detach(&(q)->qname##_ev_##evname);
329 #endif /* WM_EVENT_COUNTERS */
330
331 struct wm_txqueue {
332 kmutex_t *txq_lock; /* lock for tx operations */
333
334 struct wm_softc *txq_sc; /* shortcut (skip struct wm_queue) */
335
336 /* Software state for the transmit descriptors. */
337 int txq_num; /* must be a power of two */
338 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX];
339
340 /* TX control data structures. */
341 int txq_ndesc; /* must be a power of two */
342 size_t txq_descsize; /* a tx descriptor size */
343 txdescs_t *txq_descs_u;
344 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */
345 bus_dma_segment_t txq_desc_seg; /* control data segment */
346 int txq_desc_rseg; /* real number of control segment */
347 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr
348 #define txq_descs txq_descs_u->sctxu_txdescs
349 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs
350
351 bus_addr_t txq_tdt_reg; /* offset of TDT register */
352
353 int txq_free; /* number of free Tx descriptors */
354 int txq_next; /* next ready Tx descriptor */
355
356 int txq_sfree; /* number of free Tx jobs */
357 int txq_snext; /* next free Tx job */
358 int txq_sdirty; /* dirty Tx jobs */
359
360 /* These 4 variables are used only on the 82547. */
361 int txq_fifo_size; /* Tx FIFO size */
362 int txq_fifo_head; /* current head of FIFO */
363 uint32_t txq_fifo_addr; /* internal address of start of FIFO */
364 int txq_fifo_stall; /* Tx FIFO is stalled */
365
366 /*
367 * When ncpu > number of Tx queues, a Tx queue is shared by multiple
368 * CPUs. This queue intermediate them without block.
369 */
370 pcq_t *txq_interq;
371
372 /*
373 * NEWQUEUE devices must use not ifp->if_flags but txq->txq_flags
374 * to manage Tx H/W queue's busy flag.
375 */
376 int txq_flags; /* flags for H/W queue, see below */
377 #define WM_TXQ_NO_SPACE 0x1
378
379 bool txq_stopping;
380
381 bool txq_sending;
382 time_t txq_lastsent;
383
384 /* Checksum flags used for previous packet */
385 uint32_t txq_last_hw_cmd;
386 uint8_t txq_last_hw_fields;
387 uint16_t txq_last_hw_ipcs;
388 uint16_t txq_last_hw_tucs;
389
390 uint32_t txq_packets; /* for AIM */
391 uint32_t txq_bytes; /* for AIM */
392 #ifdef WM_EVENT_COUNTERS
393 /* TX event counters */
394 WM_Q_EVCNT_DEFINE(txq, txsstall) /* Stalled due to no txs */
395 WM_Q_EVCNT_DEFINE(txq, txdstall) /* Stalled due to no txd */
396 WM_Q_EVCNT_DEFINE(txq, fifo_stall) /* FIFO stalls (82547) */
397 WM_Q_EVCNT_DEFINE(txq, txdw) /* Tx descriptor interrupts */
398 WM_Q_EVCNT_DEFINE(txq, txqe) /* Tx queue empty interrupts */
399 /* XXX not used? */
400
401 WM_Q_EVCNT_DEFINE(txq, ipsum) /* IP checksums comp. */
402 WM_Q_EVCNT_DEFINE(txq, tusum) /* TCP/UDP cksums comp. */
403 WM_Q_EVCNT_DEFINE(txq, tusum6) /* TCP/UDP v6 cksums comp. */
404 WM_Q_EVCNT_DEFINE(txq, tso) /* TCP seg offload (IPv4) */
405 WM_Q_EVCNT_DEFINE(txq, tso6) /* TCP seg offload (IPv6) */
406 WM_Q_EVCNT_DEFINE(txq, tsopain) /* Painful header manip. for TSO */
407 WM_Q_EVCNT_DEFINE(txq, pcqdrop) /* Pkt dropped in pcq */
408 WM_Q_EVCNT_DEFINE(txq, descdrop) /* Pkt dropped in MAC desc ring */
409 /* other than toomanyseg */
410
411 WM_Q_EVCNT_DEFINE(txq, toomanyseg) /* Pkt dropped(toomany DMA segs) */
412 WM_Q_EVCNT_DEFINE(txq, defrag) /* m_defrag() */
413 WM_Q_EVCNT_DEFINE(txq, underrun) /* Tx underrun */
414 WM_Q_EVCNT_DEFINE(txq, skipcontext) /* Tx skip wring cksum context */
415
416 char txq_txseg_evcnt_names[WM_NTXSEGS][sizeof("txqXXtxsegXXX")];
417 struct evcnt txq_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */
418 #endif /* WM_EVENT_COUNTERS */
419 };
420
421 struct wm_rxqueue {
422 kmutex_t *rxq_lock; /* lock for rx operations */
423
424 struct wm_softc *rxq_sc; /* shortcut (skip struct wm_queue) */
425
426 /* Software state for the receive descriptors. */
427 struct wm_rxsoft rxq_soft[WM_NRXDESC];
428
429 /* RX control data structures. */
430 int rxq_ndesc; /* must be a power of two */
431 size_t rxq_descsize; /* a rx descriptor size */
432 rxdescs_t *rxq_descs_u;
433 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */
434 bus_dma_segment_t rxq_desc_seg; /* control data segment */
435 int rxq_desc_rseg; /* real number of control segment */
436 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr
437 #define rxq_descs rxq_descs_u->sctxu_rxdescs
438 #define rxq_ext_descs rxq_descs_u->sctxu_ext_rxdescs
439 #define rxq_nq_descs rxq_descs_u->sctxu_nq_rxdescs
440
441 bus_addr_t rxq_rdt_reg; /* offset of RDT register */
442
443 int rxq_ptr; /* next ready Rx desc/queue ent */
444 int rxq_discard;
445 int rxq_len;
446 struct mbuf *rxq_head;
447 struct mbuf *rxq_tail;
448 struct mbuf **rxq_tailp;
449
450 bool rxq_stopping;
451
452 uint32_t rxq_packets; /* for AIM */
453 uint32_t rxq_bytes; /* for AIM */
454 #ifdef WM_EVENT_COUNTERS
455 /* RX event counters */
456 WM_Q_EVCNT_DEFINE(rxq, intr); /* Interrupts */
457 WM_Q_EVCNT_DEFINE(rxq, defer); /* Rx deferred processing */
458
459 WM_Q_EVCNT_DEFINE(rxq, ipsum); /* IP checksums checked */
460 WM_Q_EVCNT_DEFINE(rxq, tusum); /* TCP/UDP cksums checked */
461 #endif
462 };
463
464 struct wm_queue {
465 int wmq_id; /* index of TX/RX queues */
466 int wmq_intr_idx; /* index of MSI-X tables */
467
468 uint32_t wmq_itr; /* interrupt interval per queue. */
469 bool wmq_set_itr;
470
471 struct wm_txqueue wmq_txq;
472 struct wm_rxqueue wmq_rxq;
473
474 bool wmq_txrx_use_workqueue;
475 struct work wmq_cookie;
476 void *wmq_si;
477 };
478
479 struct wm_phyop {
480 int (*acquire)(struct wm_softc *);
481 void (*release)(struct wm_softc *);
482 int (*readreg_locked)(device_t, int, int, uint16_t *);
483 int (*writereg_locked)(device_t, int, int, uint16_t);
484 int reset_delay_us;
485 bool no_errprint;
486 };
487
488 struct wm_nvmop {
489 int (*acquire)(struct wm_softc *);
490 void (*release)(struct wm_softc *);
491 int (*read)(struct wm_softc *, int, int, uint16_t *);
492 };
493
494 /*
495 * Software state per device.
496 */
497 struct wm_softc {
498 device_t sc_dev; /* generic device information */
499 bus_space_tag_t sc_st; /* bus space tag */
500 bus_space_handle_t sc_sh; /* bus space handle */
501 bus_size_t sc_ss; /* bus space size */
502 bus_space_tag_t sc_iot; /* I/O space tag */
503 bus_space_handle_t sc_ioh; /* I/O space handle */
504 bus_size_t sc_ios; /* I/O space size */
505 bus_space_tag_t sc_flasht; /* flash registers space tag */
506 bus_space_handle_t sc_flashh; /* flash registers space handle */
507 bus_size_t sc_flashs; /* flash registers space size */
508 off_t sc_flashreg_offset; /*
509 * offset to flash registers from
510 * start of BAR
511 */
512 bus_dma_tag_t sc_dmat; /* bus DMA tag */
513
514 struct ethercom sc_ethercom; /* ethernet common data */
515 struct mii_data sc_mii; /* MII/media information */
516
517 pci_chipset_tag_t sc_pc;
518 pcitag_t sc_pcitag;
519 int sc_bus_speed; /* PCI/PCIX bus speed */
520 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */
521
522 uint16_t sc_pcidevid; /* PCI device ID */
523 wm_chip_type sc_type; /* MAC type */
524 int sc_rev; /* MAC revision */
525 wm_phy_type sc_phytype; /* PHY type */
526 uint8_t sc_sfptype; /* SFP type */
527 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/
528 #define WM_MEDIATYPE_UNKNOWN 0x00
529 #define WM_MEDIATYPE_FIBER 0x01
530 #define WM_MEDIATYPE_COPPER 0x02
531 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */
532 int sc_funcid; /* unit number of the chip (0 to 3) */
533 int sc_flags; /* flags; see below */
534 u_short sc_if_flags; /* last if_flags */
535 int sc_ec_capenable; /* last ec_capenable */
536 int sc_flowflags; /* 802.3x flow control flags */
537 uint16_t eee_lp_ability; /* EEE link partner's ability */
538 int sc_align_tweak;
539
540 void *sc_ihs[WM_MAX_NINTR]; /*
541 * interrupt cookie.
542 * - legacy and msi use sc_ihs[0] only
543 * - msix use sc_ihs[0] to sc_ihs[nintrs-1]
544 */
545 pci_intr_handle_t *sc_intrs; /*
546 * legacy and msi use sc_intrs[0] only
547 * msix use sc_intrs[0] to sc_ihs[nintrs-1]
548 */
549 int sc_nintrs; /* number of interrupts */
550
551 int sc_link_intr_idx; /* index of MSI-X tables */
552
553 callout_t sc_tick_ch; /* tick callout */
554 bool sc_core_stopping;
555
556 int sc_nvm_ver_major;
557 int sc_nvm_ver_minor;
558 int sc_nvm_ver_build;
559 int sc_nvm_addrbits; /* NVM address bits */
560 unsigned int sc_nvm_wordsize; /* NVM word size */
561 int sc_ich8_flash_base;
562 int sc_ich8_flash_bank_size;
563 int sc_nvm_k1_enabled;
564
565 int sc_nqueues;
566 struct wm_queue *sc_queue;
567 u_int sc_tx_process_limit; /* Tx proc. repeat limit in softint */
568 u_int sc_tx_intr_process_limit; /* Tx proc. repeat limit in H/W intr */
569 u_int sc_rx_process_limit; /* Rx proc. repeat limit in softint */
570 u_int sc_rx_intr_process_limit; /* Rx proc. repeat limit in H/W intr */
571 struct workqueue *sc_queue_wq;
572 bool sc_txrx_use_workqueue;
573
574 int sc_affinity_offset;
575
576 #ifdef WM_EVENT_COUNTERS
577 /* Event counters. */
578 struct evcnt sc_ev_linkintr; /* Link interrupts */
579
580 /* WM_T_82542_2_1 only */
581 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */
582 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */
583 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */
584 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */
585 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */
586 #endif /* WM_EVENT_COUNTERS */
587
588 struct sysctllog *sc_sysctllog;
589
590 /* This variable are used only on the 82547. */
591 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */
592
593 uint32_t sc_ctrl; /* prototype CTRL register */
594 #if 0
595 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */
596 #endif
597 uint32_t sc_icr; /* prototype interrupt bits */
598 uint32_t sc_itr_init; /* prototype intr throttling reg */
599 uint32_t sc_tctl; /* prototype TCTL register */
600 uint32_t sc_rctl; /* prototype RCTL register */
601 uint32_t sc_txcw; /* prototype TXCW register */
602 uint32_t sc_tipg; /* prototype TIPG register */
603 uint32_t sc_fcrtl; /* prototype FCRTL register */
604 uint32_t sc_pba; /* prototype PBA register */
605
606 int sc_tbi_linkup; /* TBI link status */
607 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */
608 int sc_tbi_serdes_ticks; /* tbi ticks */
609
610 int sc_mchash_type; /* multicast filter offset */
611
612 krndsource_t rnd_source; /* random source */
613
614 struct if_percpuq *sc_ipq; /* softint-based input queues */
615
616 kmutex_t *sc_core_lock; /* lock for softc operations */
617 kmutex_t *sc_ich_phymtx; /*
618 * 82574/82583/ICH/PCH specific PHY
619 * mutex. For 82574/82583, the mutex
620 * is used for both PHY and NVM.
621 */
622 kmutex_t *sc_ich_nvmmtx; /* ICH/PCH specific NVM mutex */
623
624 struct wm_phyop phy;
625 struct wm_nvmop nvm;
626 };
627
628 #define WM_CORE_LOCK(_sc) \
629 if ((_sc)->sc_core_lock) mutex_enter((_sc)->sc_core_lock)
630 #define WM_CORE_UNLOCK(_sc) \
631 if ((_sc)->sc_core_lock) mutex_exit((_sc)->sc_core_lock)
632 #define WM_CORE_LOCKED(_sc) \
633 (!(_sc)->sc_core_lock || mutex_owned((_sc)->sc_core_lock))
634
635 #define WM_RXCHAIN_RESET(rxq) \
636 do { \
637 (rxq)->rxq_tailp = &(rxq)->rxq_head; \
638 *(rxq)->rxq_tailp = NULL; \
639 (rxq)->rxq_len = 0; \
640 } while (/*CONSTCOND*/0)
641
642 #define WM_RXCHAIN_LINK(rxq, m) \
643 do { \
644 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \
645 (rxq)->rxq_tailp = &(m)->m_next; \
646 } while (/*CONSTCOND*/0)
647
648 #ifdef WM_EVENT_COUNTERS
649 #define WM_EVCNT_INCR(ev) (ev)->ev_count++
650 #define WM_EVCNT_ADD(ev, val) (ev)->ev_count += (val)
651
652 #define WM_Q_EVCNT_INCR(qname, evname) \
653 WM_EVCNT_INCR(&(qname)->qname##_ev_##evname)
654 #define WM_Q_EVCNT_ADD(qname, evname, val) \
655 WM_EVCNT_ADD(&(qname)->qname##_ev_##evname, (val))
656 #else /* !WM_EVENT_COUNTERS */
657 #define WM_EVCNT_INCR(ev) /* nothing */
658 #define WM_EVCNT_ADD(ev, val) /* nothing */
659
660 #define WM_Q_EVCNT_INCR(qname, evname) /* nothing */
661 #define WM_Q_EVCNT_ADD(qname, evname, val) /* nothing */
662 #endif /* !WM_EVENT_COUNTERS */
663
664 #define CSR_READ(sc, reg) \
665 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
666 #define CSR_WRITE(sc, reg, val) \
667 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
668 #define CSR_WRITE_FLUSH(sc) \
669 (void)CSR_READ((sc), WMREG_STATUS)
670
671 #define ICH8_FLASH_READ32(sc, reg) \
672 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, \
673 (reg) + sc->sc_flashreg_offset)
674 #define ICH8_FLASH_WRITE32(sc, reg, data) \
675 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, \
676 (reg) + sc->sc_flashreg_offset, (data))
677
678 #define ICH8_FLASH_READ16(sc, reg) \
679 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, \
680 (reg) + sc->sc_flashreg_offset)
681 #define ICH8_FLASH_WRITE16(sc, reg, data) \
682 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, \
683 (reg) + sc->sc_flashreg_offset, (data))
684
685 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((txq), (x)))
686 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((rxq), (x)))
687
688 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU)
689 #define WM_CDTXADDR_HI(txq, x) \
690 (sizeof(bus_addr_t) == 8 ? \
691 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0)
692
693 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU)
694 #define WM_CDRXADDR_HI(rxq, x) \
695 (sizeof(bus_addr_t) == 8 ? \
696 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0)
697
698 /*
699 * Register read/write functions.
700 * Other than CSR_{READ|WRITE}().
701 */
702 #if 0
703 static inline uint32_t wm_io_read(struct wm_softc *, int);
704 #endif
705 static inline void wm_io_write(struct wm_softc *, int, uint32_t);
706 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t,
707 uint32_t, uint32_t);
708 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t);
709
710 /*
711 * Descriptor sync/init functions.
712 */
713 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int);
714 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int);
715 static inline void wm_init_rxdesc(struct wm_rxqueue *, int);
716
717 /*
718 * Device driver interface functions and commonly used functions.
719 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
720 */
721 static const struct wm_product *wm_lookup(const struct pci_attach_args *);
722 static int wm_match(device_t, cfdata_t, void *);
723 static void wm_attach(device_t, device_t, void *);
724 static int wm_detach(device_t, int);
725 static bool wm_suspend(device_t, const pmf_qual_t *);
726 static bool wm_resume(device_t, const pmf_qual_t *);
727 static void wm_watchdog(struct ifnet *);
728 static void wm_watchdog_txq(struct ifnet *, struct wm_txqueue *,
729 uint16_t *);
730 static void wm_watchdog_txq_locked(struct ifnet *, struct wm_txqueue *,
731 uint16_t *);
732 static void wm_tick(void *);
733 static int wm_ifflags_cb(struct ethercom *);
734 static int wm_ioctl(struct ifnet *, u_long, void *);
735 /* MAC address related */
736 static uint16_t wm_check_alt_mac_addr(struct wm_softc *);
737 static int wm_read_mac_addr(struct wm_softc *, uint8_t *);
738 static void wm_set_ral(struct wm_softc *, const uint8_t *, int);
739 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *);
740 static int wm_rar_count(struct wm_softc *);
741 static void wm_set_filter(struct wm_softc *);
742 /* Reset and init related */
743 static void wm_set_vlan(struct wm_softc *);
744 static void wm_set_pcie_completion_timeout(struct wm_softc *);
745 static void wm_get_auto_rd_done(struct wm_softc *);
746 static void wm_lan_init_done(struct wm_softc *);
747 static void wm_get_cfg_done(struct wm_softc *);
748 static int wm_phy_post_reset(struct wm_softc *);
749 static int wm_write_smbus_addr(struct wm_softc *);
750 static int wm_init_lcd_from_nvm(struct wm_softc *);
751 static int wm_oem_bits_config_ich8lan(struct wm_softc *, bool);
752 static void wm_initialize_hardware_bits(struct wm_softc *);
753 static uint32_t wm_rxpbs_adjust_82580(uint32_t);
754 static int wm_reset_phy(struct wm_softc *);
755 static void wm_flush_desc_rings(struct wm_softc *);
756 static void wm_reset(struct wm_softc *);
757 static int wm_add_rxbuf(struct wm_rxqueue *, int);
758 static void wm_rxdrain(struct wm_rxqueue *);
759 static void wm_init_rss(struct wm_softc *);
760 static void wm_adjust_qnum(struct wm_softc *, int);
761 static inline bool wm_is_using_msix(struct wm_softc *);
762 static inline bool wm_is_using_multiqueue(struct wm_softc *);
763 static int wm_softint_establish_queue(struct wm_softc *, int, int);
764 static int wm_setup_legacy(struct wm_softc *);
765 static int wm_setup_msix(struct wm_softc *);
766 static int wm_init(struct ifnet *);
767 static int wm_init_locked(struct ifnet *);
768 static void wm_init_sysctls(struct wm_softc *);
769 static void wm_unset_stopping_flags(struct wm_softc *);
770 static void wm_set_stopping_flags(struct wm_softc *);
771 static void wm_stop(struct ifnet *, int);
772 static void wm_stop_locked(struct ifnet *, bool, bool);
773 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *);
774 static void wm_82547_txfifo_stall(void *);
775 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *);
776 static void wm_itrs_writereg(struct wm_softc *, struct wm_queue *);
777 /* DMA related */
778 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *);
779 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *);
780 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *);
781 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *,
782 struct wm_txqueue *);
783 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *);
784 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *);
785 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *,
786 struct wm_rxqueue *);
787 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *);
788 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *);
789 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *);
790 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
791 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
792 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
793 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *,
794 struct wm_txqueue *);
795 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *,
796 struct wm_rxqueue *);
797 static int wm_alloc_txrx_queues(struct wm_softc *);
798 static void wm_free_txrx_queues(struct wm_softc *);
799 static int wm_init_txrx_queues(struct wm_softc *);
800 /* Start */
801 static void wm_tx_offload(struct wm_softc *, struct wm_txqueue *,
802 struct wm_txsoft *, uint32_t *, uint8_t *);
803 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *);
804 static void wm_start(struct ifnet *);
805 static void wm_start_locked(struct ifnet *);
806 static int wm_transmit(struct ifnet *, struct mbuf *);
807 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *);
808 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *,
809 bool);
810 static void wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *,
811 struct wm_txsoft *, uint32_t *, uint32_t *, bool *);
812 static void wm_nq_start(struct ifnet *);
813 static void wm_nq_start_locked(struct ifnet *);
814 static int wm_nq_transmit(struct ifnet *, struct mbuf *);
815 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *);
816 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *,
817 bool);
818 static void wm_deferred_start_locked(struct wm_txqueue *);
819 static void wm_handle_queue(void *);
820 static void wm_handle_queue_work(struct work *, void *);
821 /* Interrupt */
822 static bool wm_txeof(struct wm_txqueue *, u_int);
823 static bool wm_rxeof(struct wm_rxqueue *, u_int);
824 static void wm_linkintr_gmii(struct wm_softc *, uint32_t);
825 static void wm_linkintr_tbi(struct wm_softc *, uint32_t);
826 static void wm_linkintr_serdes(struct wm_softc *, uint32_t);
827 static void wm_linkintr(struct wm_softc *, uint32_t);
828 static int wm_intr_legacy(void *);
829 static inline void wm_txrxintr_disable(struct wm_queue *);
830 static inline void wm_txrxintr_enable(struct wm_queue *);
831 static void wm_itrs_calculate(struct wm_softc *, struct wm_queue *);
832 static int wm_txrxintr_msix(void *);
833 static int wm_linkintr_msix(void *);
834
835 /*
836 * Media related.
837 * GMII, SGMII, TBI, SERDES and SFP.
838 */
839 /* Common */
840 static void wm_tbi_serdes_set_linkled(struct wm_softc *);
841 /* GMII related */
842 static void wm_gmii_reset(struct wm_softc *);
843 static void wm_gmii_setup_phytype(struct wm_softc *, uint32_t, uint16_t);
844 static int wm_get_phy_id_82575(struct wm_softc *);
845 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t);
846 static int wm_gmii_mediachange(struct ifnet *);
847 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
848 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int);
849 static uint16_t wm_i82543_mii_recvbits(struct wm_softc *);
850 static int wm_gmii_i82543_readreg(device_t, int, int, uint16_t *);
851 static int wm_gmii_i82543_writereg(device_t, int, int, uint16_t);
852 static int wm_gmii_mdic_readreg(device_t, int, int, uint16_t *);
853 static int wm_gmii_mdic_writereg(device_t, int, int, uint16_t);
854 static int wm_gmii_i82544_readreg(device_t, int, int, uint16_t *);
855 static int wm_gmii_i82544_readreg_locked(device_t, int, int, uint16_t *);
856 static int wm_gmii_i82544_writereg(device_t, int, int, uint16_t);
857 static int wm_gmii_i82544_writereg_locked(device_t, int, int, uint16_t);
858 static int wm_gmii_i80003_readreg(device_t, int, int, uint16_t *);
859 static int wm_gmii_i80003_writereg(device_t, int, int, uint16_t);
860 static int wm_gmii_bm_readreg(device_t, int, int, uint16_t *);
861 static int wm_gmii_bm_writereg(device_t, int, int, uint16_t);
862 static int wm_enable_phy_wakeup_reg_access_bm(device_t, uint16_t *);
863 static int wm_disable_phy_wakeup_reg_access_bm(device_t, uint16_t *);
864 static int wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int,
865 bool);
866 static int wm_gmii_hv_readreg(device_t, int, int, uint16_t *);
867 static int wm_gmii_hv_readreg_locked(device_t, int, int, uint16_t *);
868 static int wm_gmii_hv_writereg(device_t, int, int, uint16_t);
869 static int wm_gmii_hv_writereg_locked(device_t, int, int, uint16_t);
870 static int wm_gmii_82580_readreg(device_t, int, int, uint16_t *);
871 static int wm_gmii_82580_writereg(device_t, int, int, uint16_t);
872 static int wm_gmii_gs40g_readreg(device_t, int, int, uint16_t *);
873 static int wm_gmii_gs40g_writereg(device_t, int, int, uint16_t);
874 static void wm_gmii_statchg(struct ifnet *);
875 /*
876 * kumeran related (80003, ICH* and PCH*).
877 * These functions are not for accessing MII registers but for accessing
878 * kumeran specific registers.
879 */
880 static int wm_kmrn_readreg(struct wm_softc *, int, uint16_t *);
881 static int wm_kmrn_readreg_locked(struct wm_softc *, int, uint16_t *);
882 static int wm_kmrn_writereg(struct wm_softc *, int, uint16_t);
883 static int wm_kmrn_writereg_locked(struct wm_softc *, int, uint16_t);
884 /* EMI register related */
885 static int wm_access_emi_reg_locked(device_t, int, uint16_t *, bool);
886 static int wm_read_emi_reg_locked(device_t, int, uint16_t *);
887 static int wm_write_emi_reg_locked(device_t, int, uint16_t);
888 /* SGMII */
889 static bool wm_sgmii_uses_mdio(struct wm_softc *);
890 static int wm_sgmii_readreg(device_t, int, int, uint16_t *);
891 static int wm_sgmii_readreg_locked(device_t, int, int, uint16_t *);
892 static int wm_sgmii_writereg(device_t, int, int, uint16_t);
893 static int wm_sgmii_writereg_locked(device_t, int, int, uint16_t);
894 /* TBI related */
895 static bool wm_tbi_havesignal(struct wm_softc *, uint32_t);
896 static void wm_tbi_mediainit(struct wm_softc *);
897 static int wm_tbi_mediachange(struct ifnet *);
898 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
899 static int wm_check_for_link(struct wm_softc *);
900 static void wm_tbi_tick(struct wm_softc *);
901 /* SERDES related */
902 static void wm_serdes_power_up_link_82575(struct wm_softc *);
903 static int wm_serdes_mediachange(struct ifnet *);
904 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *);
905 static void wm_serdes_tick(struct wm_softc *);
906 /* SFP related */
907 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *);
908 static uint32_t wm_sfp_get_media_type(struct wm_softc *);
909
910 /*
911 * NVM related.
912 * Microwire, SPI (w/wo EERD) and Flash.
913 */
914 /* Misc functions */
915 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int);
916 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int);
917 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *);
918 /* Microwire */
919 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *);
920 /* SPI */
921 static int wm_nvm_ready_spi(struct wm_softc *);
922 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *);
923 /* Using with EERD */
924 static int wm_poll_eerd_eewr_done(struct wm_softc *, int);
925 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *);
926 /* Flash */
927 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *,
928 unsigned int *);
929 static int32_t wm_ich8_cycle_init(struct wm_softc *);
930 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t);
931 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t,
932 uint32_t *);
933 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *);
934 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *);
935 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *);
936 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *);
937 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *);
938 /* iNVM */
939 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *);
940 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *);
941 /* Lock, detecting NVM type, validate checksum and read */
942 static int wm_nvm_is_onboard_eeprom(struct wm_softc *);
943 static int wm_nvm_flash_presence_i210(struct wm_softc *);
944 static int wm_nvm_validate_checksum(struct wm_softc *);
945 static void wm_nvm_version_invm(struct wm_softc *);
946 static void wm_nvm_version(struct wm_softc *);
947 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *);
948
949 /*
950 * Hardware semaphores.
951 * Very complexed...
952 */
953 static int wm_get_null(struct wm_softc *);
954 static void wm_put_null(struct wm_softc *);
955 static int wm_get_eecd(struct wm_softc *);
956 static void wm_put_eecd(struct wm_softc *);
957 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */
958 static void wm_put_swsm_semaphore(struct wm_softc *);
959 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t);
960 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t);
961 static int wm_get_nvm_80003(struct wm_softc *);
962 static void wm_put_nvm_80003(struct wm_softc *);
963 static int wm_get_nvm_82571(struct wm_softc *);
964 static void wm_put_nvm_82571(struct wm_softc *);
965 static int wm_get_phy_82575(struct wm_softc *);
966 static void wm_put_phy_82575(struct wm_softc *);
967 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */
968 static void wm_put_swfwhw_semaphore(struct wm_softc *);
969 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */
970 static void wm_put_swflag_ich8lan(struct wm_softc *);
971 static int wm_get_nvm_ich8lan(struct wm_softc *);
972 static void wm_put_nvm_ich8lan(struct wm_softc *);
973 static int wm_get_hw_semaphore_82573(struct wm_softc *);
974 static void wm_put_hw_semaphore_82573(struct wm_softc *);
975
976 /*
977 * Management mode and power management related subroutines.
978 * BMC, AMT, suspend/resume and EEE.
979 */
980 #if 0
981 static int wm_check_mng_mode(struct wm_softc *);
982 static int wm_check_mng_mode_ich8lan(struct wm_softc *);
983 static int wm_check_mng_mode_82574(struct wm_softc *);
984 static int wm_check_mng_mode_generic(struct wm_softc *);
985 #endif
986 static int wm_enable_mng_pass_thru(struct wm_softc *);
987 static bool wm_phy_resetisblocked(struct wm_softc *);
988 static void wm_get_hw_control(struct wm_softc *);
989 static void wm_release_hw_control(struct wm_softc *);
990 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool);
991 static int wm_init_phy_workarounds_pchlan(struct wm_softc *);
992 static void wm_init_manageability(struct wm_softc *);
993 static void wm_release_manageability(struct wm_softc *);
994 static void wm_get_wakeup(struct wm_softc *);
995 static int wm_ulp_disable(struct wm_softc *);
996 static int wm_enable_phy_wakeup(struct wm_softc *);
997 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *);
998 static void wm_suspend_workarounds_ich8lan(struct wm_softc *);
999 static int wm_resume_workarounds_pchlan(struct wm_softc *);
1000 static void wm_enable_wakeup(struct wm_softc *);
1001 static void wm_disable_aspm(struct wm_softc *);
1002 /* LPLU (Low Power Link Up) */
1003 static void wm_lplu_d0_disable(struct wm_softc *);
1004 /* EEE */
1005 static int wm_set_eee_i350(struct wm_softc *);
1006 static int wm_set_eee_pchlan(struct wm_softc *);
1007 static int wm_set_eee(struct wm_softc *);
1008
1009 /*
1010 * Workarounds (mainly PHY related).
1011 * Basically, PHY's workarounds are in the PHY drivers.
1012 */
1013 static int wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *);
1014 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *);
1015 static int wm_hv_phy_workarounds_ich8lan(struct wm_softc *);
1016 static void wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *);
1017 static int wm_lv_phy_workarounds_ich8lan(struct wm_softc *);
1018 static int wm_k1_workaround_lpt_lp(struct wm_softc *, bool);
1019 static int wm_k1_gig_workaround_hv(struct wm_softc *, int);
1020 static int wm_k1_workaround_lv(struct wm_softc *);
1021 static int wm_link_stall_workaround_hv(struct wm_softc *);
1022 static int wm_set_mdio_slow_mode_hv(struct wm_softc *);
1023 static void wm_configure_k1_ich8lan(struct wm_softc *, int);
1024 static void wm_reset_init_script_82575(struct wm_softc *);
1025 static void wm_reset_mdicnfg_82580(struct wm_softc *);
1026 static bool wm_phy_is_accessible_pchlan(struct wm_softc *);
1027 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *);
1028 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool);
1029 static int wm_pll_workaround_i210(struct wm_softc *);
1030 static void wm_legacy_irq_quirk_spt(struct wm_softc *);
1031
1032 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc),
1033 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
1034
1035 /*
1036 * Devices supported by this driver.
1037 */
1038 static const struct wm_product {
1039 pci_vendor_id_t wmp_vendor;
1040 pci_product_id_t wmp_product;
1041 const char *wmp_name;
1042 wm_chip_type wmp_type;
1043 uint32_t wmp_flags;
1044 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN
1045 #define WMP_F_FIBER WM_MEDIATYPE_FIBER
1046 #define WMP_F_COPPER WM_MEDIATYPE_COPPER
1047 #define WMP_F_SERDES WM_MEDIATYPE_SERDES
1048 #define WMP_MEDIATYPE(x) ((x) & 0x03)
1049 } wm_products[] = {
1050 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542,
1051 "Intel i82542 1000BASE-X Ethernet",
1052 WM_T_82542_2_1, WMP_F_FIBER },
1053
1054 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER,
1055 "Intel i82543GC 1000BASE-X Ethernet",
1056 WM_T_82543, WMP_F_FIBER },
1057
1058 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER,
1059 "Intel i82543GC 1000BASE-T Ethernet",
1060 WM_T_82543, WMP_F_COPPER },
1061
1062 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER,
1063 "Intel i82544EI 1000BASE-T Ethernet",
1064 WM_T_82544, WMP_F_COPPER },
1065
1066 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER,
1067 "Intel i82544EI 1000BASE-X Ethernet",
1068 WM_T_82544, WMP_F_FIBER },
1069
1070 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER,
1071 "Intel i82544GC 1000BASE-T Ethernet",
1072 WM_T_82544, WMP_F_COPPER },
1073
1074 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM,
1075 "Intel i82544GC (LOM) 1000BASE-T Ethernet",
1076 WM_T_82544, WMP_F_COPPER },
1077
1078 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM,
1079 "Intel i82540EM 1000BASE-T Ethernet",
1080 WM_T_82540, WMP_F_COPPER },
1081
1082 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM,
1083 "Intel i82540EM (LOM) 1000BASE-T Ethernet",
1084 WM_T_82540, WMP_F_COPPER },
1085
1086 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM,
1087 "Intel i82540EP 1000BASE-T Ethernet",
1088 WM_T_82540, WMP_F_COPPER },
1089
1090 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP,
1091 "Intel i82540EP 1000BASE-T Ethernet",
1092 WM_T_82540, WMP_F_COPPER },
1093
1094 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP,
1095 "Intel i82540EP 1000BASE-T Ethernet",
1096 WM_T_82540, WMP_F_COPPER },
1097
1098 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER,
1099 "Intel i82545EM 1000BASE-T Ethernet",
1100 WM_T_82545, WMP_F_COPPER },
1101
1102 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER,
1103 "Intel i82545GM 1000BASE-T Ethernet",
1104 WM_T_82545_3, WMP_F_COPPER },
1105
1106 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER,
1107 "Intel i82545GM 1000BASE-X Ethernet",
1108 WM_T_82545_3, WMP_F_FIBER },
1109
1110 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES,
1111 "Intel i82545GM Gigabit Ethernet (SERDES)",
1112 WM_T_82545_3, WMP_F_SERDES },
1113
1114 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER,
1115 "Intel i82546EB 1000BASE-T Ethernet",
1116 WM_T_82546, WMP_F_COPPER },
1117
1118 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD,
1119 "Intel i82546EB 1000BASE-T Ethernet",
1120 WM_T_82546, WMP_F_COPPER },
1121
1122 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER,
1123 "Intel i82545EM 1000BASE-X Ethernet",
1124 WM_T_82545, WMP_F_FIBER },
1125
1126 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER,
1127 "Intel i82546EB 1000BASE-X Ethernet",
1128 WM_T_82546, WMP_F_FIBER },
1129
1130 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER,
1131 "Intel i82546GB 1000BASE-T Ethernet",
1132 WM_T_82546_3, WMP_F_COPPER },
1133
1134 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER,
1135 "Intel i82546GB 1000BASE-X Ethernet",
1136 WM_T_82546_3, WMP_F_FIBER },
1137
1138 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES,
1139 "Intel i82546GB Gigabit Ethernet (SERDES)",
1140 WM_T_82546_3, WMP_F_SERDES },
1141
1142 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER,
1143 "i82546GB quad-port Gigabit Ethernet",
1144 WM_T_82546_3, WMP_F_COPPER },
1145
1146 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
1147 "i82546GB quad-port Gigabit Ethernet (KSP3)",
1148 WM_T_82546_3, WMP_F_COPPER },
1149
1150 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE,
1151 "Intel PRO/1000MT (82546GB)",
1152 WM_T_82546_3, WMP_F_COPPER },
1153
1154 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI,
1155 "Intel i82541EI 1000BASE-T Ethernet",
1156 WM_T_82541, WMP_F_COPPER },
1157
1158 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM,
1159 "Intel i82541ER (LOM) 1000BASE-T Ethernet",
1160 WM_T_82541, WMP_F_COPPER },
1161
1162 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE,
1163 "Intel i82541EI Mobile 1000BASE-T Ethernet",
1164 WM_T_82541, WMP_F_COPPER },
1165
1166 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER,
1167 "Intel i82541ER 1000BASE-T Ethernet",
1168 WM_T_82541_2, WMP_F_COPPER },
1169
1170 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI,
1171 "Intel i82541GI 1000BASE-T Ethernet",
1172 WM_T_82541_2, WMP_F_COPPER },
1173
1174 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE,
1175 "Intel i82541GI Mobile 1000BASE-T Ethernet",
1176 WM_T_82541_2, WMP_F_COPPER },
1177
1178 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI,
1179 "Intel i82541PI 1000BASE-T Ethernet",
1180 WM_T_82541_2, WMP_F_COPPER },
1181
1182 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI,
1183 "Intel i82547EI 1000BASE-T Ethernet",
1184 WM_T_82547, WMP_F_COPPER },
1185
1186 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE,
1187 "Intel i82547EI Mobile 1000BASE-T Ethernet",
1188 WM_T_82547, WMP_F_COPPER },
1189
1190 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI,
1191 "Intel i82547GI 1000BASE-T Ethernet",
1192 WM_T_82547_2, WMP_F_COPPER },
1193
1194 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER,
1195 "Intel PRO/1000 PT (82571EB)",
1196 WM_T_82571, WMP_F_COPPER },
1197
1198 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER,
1199 "Intel PRO/1000 PF (82571EB)",
1200 WM_T_82571, WMP_F_FIBER },
1201
1202 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES,
1203 "Intel PRO/1000 PB (82571EB)",
1204 WM_T_82571, WMP_F_SERDES },
1205
1206 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER,
1207 "Intel PRO/1000 QT (82571EB)",
1208 WM_T_82571, WMP_F_COPPER },
1209
1210 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER,
1211 "Intel PRO/1000 PT Quad Port Server Adapter",
1212 WM_T_82571, WMP_F_COPPER },
1213
1214 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER,
1215 "Intel Gigabit PT Quad Port Server ExpressModule",
1216 WM_T_82571, WMP_F_COPPER },
1217
1218 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES,
1219 "Intel 82571EB Dual Gigabit Ethernet (SERDES)",
1220 WM_T_82571, WMP_F_SERDES },
1221
1222 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES,
1223 "Intel 82571EB Quad Gigabit Ethernet (SERDES)",
1224 WM_T_82571, WMP_F_SERDES },
1225
1226 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER,
1227 "Intel 82571EB Quad 1000baseX Ethernet",
1228 WM_T_82571, WMP_F_FIBER },
1229
1230 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER,
1231 "Intel i82572EI 1000baseT Ethernet",
1232 WM_T_82572, WMP_F_COPPER },
1233
1234 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER,
1235 "Intel i82572EI 1000baseX Ethernet",
1236 WM_T_82572, WMP_F_FIBER },
1237
1238 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES,
1239 "Intel i82572EI Gigabit Ethernet (SERDES)",
1240 WM_T_82572, WMP_F_SERDES },
1241
1242 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI,
1243 "Intel i82572EI 1000baseT Ethernet",
1244 WM_T_82572, WMP_F_COPPER },
1245
1246 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E,
1247 "Intel i82573E",
1248 WM_T_82573, WMP_F_COPPER },
1249
1250 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT,
1251 "Intel i82573E IAMT",
1252 WM_T_82573, WMP_F_COPPER },
1253
1254 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L,
1255 "Intel i82573L Gigabit Ethernet",
1256 WM_T_82573, WMP_F_COPPER },
1257
1258 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L,
1259 "Intel i82574L",
1260 WM_T_82574, WMP_F_COPPER },
1261
1262 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA,
1263 "Intel i82574L",
1264 WM_T_82574, WMP_F_COPPER },
1265
1266 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V,
1267 "Intel i82583V",
1268 WM_T_82583, WMP_F_COPPER },
1269
1270 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT,
1271 "i80003 dual 1000baseT Ethernet",
1272 WM_T_80003, WMP_F_COPPER },
1273
1274 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT,
1275 "i80003 dual 1000baseX Ethernet",
1276 WM_T_80003, WMP_F_COPPER },
1277
1278 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT,
1279 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)",
1280 WM_T_80003, WMP_F_SERDES },
1281
1282 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT,
1283 "Intel i80003 1000baseT Ethernet",
1284 WM_T_80003, WMP_F_COPPER },
1285
1286 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT,
1287 "Intel i80003 Gigabit Ethernet (SERDES)",
1288 WM_T_80003, WMP_F_SERDES },
1289
1290 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT,
1291 "Intel i82801H (M_AMT) LAN Controller",
1292 WM_T_ICH8, WMP_F_COPPER },
1293 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT,
1294 "Intel i82801H (AMT) LAN Controller",
1295 WM_T_ICH8, WMP_F_COPPER },
1296 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN,
1297 "Intel i82801H LAN Controller",
1298 WM_T_ICH8, WMP_F_COPPER },
1299 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN,
1300 "Intel i82801H (IFE) 10/100 LAN Controller",
1301 WM_T_ICH8, WMP_F_COPPER },
1302 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN,
1303 "Intel i82801H (M) LAN Controller",
1304 WM_T_ICH8, WMP_F_COPPER },
1305 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT,
1306 "Intel i82801H IFE (GT) 10/100 LAN Controller",
1307 WM_T_ICH8, WMP_F_COPPER },
1308 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G,
1309 "Intel i82801H IFE (G) 10/100 LAN Controller",
1310 WM_T_ICH8, WMP_F_COPPER },
1311 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3,
1312 "82567V-3 LAN Controller",
1313 WM_T_ICH8, WMP_F_COPPER },
1314 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT,
1315 "82801I (AMT) LAN Controller",
1316 WM_T_ICH9, WMP_F_COPPER },
1317 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE,
1318 "82801I 10/100 LAN Controller",
1319 WM_T_ICH9, WMP_F_COPPER },
1320 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G,
1321 "82801I (G) 10/100 LAN Controller",
1322 WM_T_ICH9, WMP_F_COPPER },
1323 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT,
1324 "82801I (GT) 10/100 LAN Controller",
1325 WM_T_ICH9, WMP_F_COPPER },
1326 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C,
1327 "82801I (C) LAN Controller",
1328 WM_T_ICH9, WMP_F_COPPER },
1329 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M,
1330 "82801I mobile LAN Controller",
1331 WM_T_ICH9, WMP_F_COPPER },
1332 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V,
1333 "82801I mobile (V) LAN Controller",
1334 WM_T_ICH9, WMP_F_COPPER },
1335 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
1336 "82801I mobile (AMT) LAN Controller",
1337 WM_T_ICH9, WMP_F_COPPER },
1338 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM,
1339 "82567LM-4 LAN Controller",
1340 WM_T_ICH9, WMP_F_COPPER },
1341 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM,
1342 "82567LM-2 LAN Controller",
1343 WM_T_ICH10, WMP_F_COPPER },
1344 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF,
1345 "82567LF-2 LAN Controller",
1346 WM_T_ICH10, WMP_F_COPPER },
1347 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM,
1348 "82567LM-3 LAN Controller",
1349 WM_T_ICH10, WMP_F_COPPER },
1350 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF,
1351 "82567LF-3 LAN Controller",
1352 WM_T_ICH10, WMP_F_COPPER },
1353 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V,
1354 "82567V-2 LAN Controller",
1355 WM_T_ICH10, WMP_F_COPPER },
1356 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V,
1357 "82567V-3? LAN Controller",
1358 WM_T_ICH10, WMP_F_COPPER },
1359 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE,
1360 "HANKSVILLE LAN Controller",
1361 WM_T_ICH10, WMP_F_COPPER },
1362 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM,
1363 "PCH LAN (82577LM) Controller",
1364 WM_T_PCH, WMP_F_COPPER },
1365 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC,
1366 "PCH LAN (82577LC) Controller",
1367 WM_T_PCH, WMP_F_COPPER },
1368 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM,
1369 "PCH LAN (82578DM) Controller",
1370 WM_T_PCH, WMP_F_COPPER },
1371 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC,
1372 "PCH LAN (82578DC) Controller",
1373 WM_T_PCH, WMP_F_COPPER },
1374 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM,
1375 "PCH2 LAN (82579LM) Controller",
1376 WM_T_PCH2, WMP_F_COPPER },
1377 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V,
1378 "PCH2 LAN (82579V) Controller",
1379 WM_T_PCH2, WMP_F_COPPER },
1380 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER,
1381 "82575EB dual-1000baseT Ethernet",
1382 WM_T_82575, WMP_F_COPPER },
1383 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
1384 "82575EB dual-1000baseX Ethernet (SERDES)",
1385 WM_T_82575, WMP_F_SERDES },
1386 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
1387 "82575GB quad-1000baseT Ethernet",
1388 WM_T_82575, WMP_F_COPPER },
1389 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
1390 "82575GB quad-1000baseT Ethernet (PM)",
1391 WM_T_82575, WMP_F_COPPER },
1392 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER,
1393 "82576 1000BaseT Ethernet",
1394 WM_T_82576, WMP_F_COPPER },
1395 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER,
1396 "82576 1000BaseX Ethernet",
1397 WM_T_82576, WMP_F_FIBER },
1398
1399 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES,
1400 "82576 gigabit Ethernet (SERDES)",
1401 WM_T_82576, WMP_F_SERDES },
1402
1403 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER,
1404 "82576 quad-1000BaseT Ethernet",
1405 WM_T_82576, WMP_F_COPPER },
1406
1407 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2,
1408 "82576 Gigabit ET2 Quad Port Server Adapter",
1409 WM_T_82576, WMP_F_COPPER },
1410
1411 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS,
1412 "82576 gigabit Ethernet",
1413 WM_T_82576, WMP_F_COPPER },
1414
1415 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES,
1416 "82576 gigabit Ethernet (SERDES)",
1417 WM_T_82576, WMP_F_SERDES },
1418 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD,
1419 "82576 quad-gigabit Ethernet (SERDES)",
1420 WM_T_82576, WMP_F_SERDES },
1421
1422 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER,
1423 "82580 1000BaseT Ethernet",
1424 WM_T_82580, WMP_F_COPPER },
1425 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER,
1426 "82580 1000BaseX Ethernet",
1427 WM_T_82580, WMP_F_FIBER },
1428
1429 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES,
1430 "82580 1000BaseT Ethernet (SERDES)",
1431 WM_T_82580, WMP_F_SERDES },
1432
1433 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII,
1434 "82580 gigabit Ethernet (SGMII)",
1435 WM_T_82580, WMP_F_COPPER },
1436 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL,
1437 "82580 dual-1000BaseT Ethernet",
1438 WM_T_82580, WMP_F_COPPER },
1439
1440 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER,
1441 "82580 quad-1000BaseX Ethernet",
1442 WM_T_82580, WMP_F_FIBER },
1443
1444 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII,
1445 "DH89XXCC Gigabit Ethernet (SGMII)",
1446 WM_T_82580, WMP_F_COPPER },
1447
1448 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES,
1449 "DH89XXCC Gigabit Ethernet (SERDES)",
1450 WM_T_82580, WMP_F_SERDES },
1451
1452 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE,
1453 "DH89XXCC 1000BASE-KX Ethernet",
1454 WM_T_82580, WMP_F_SERDES },
1455
1456 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP,
1457 "DH89XXCC Gigabit Ethernet (SFP)",
1458 WM_T_82580, WMP_F_SERDES },
1459
1460 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER,
1461 "I350 Gigabit Network Connection",
1462 WM_T_I350, WMP_F_COPPER },
1463
1464 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER,
1465 "I350 Gigabit Fiber Network Connection",
1466 WM_T_I350, WMP_F_FIBER },
1467
1468 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES,
1469 "I350 Gigabit Backplane Connection",
1470 WM_T_I350, WMP_F_SERDES },
1471
1472 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4,
1473 "I350 Quad Port Gigabit Ethernet",
1474 WM_T_I350, WMP_F_SERDES },
1475
1476 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII,
1477 "I350 Gigabit Connection",
1478 WM_T_I350, WMP_F_COPPER },
1479
1480 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX,
1481 "I354 Gigabit Ethernet (KX)",
1482 WM_T_I354, WMP_F_SERDES },
1483
1484 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII,
1485 "I354 Gigabit Ethernet (SGMII)",
1486 WM_T_I354, WMP_F_COPPER },
1487
1488 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE,
1489 "I354 Gigabit Ethernet (2.5G)",
1490 WM_T_I354, WMP_F_COPPER },
1491
1492 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1,
1493 "I210-T1 Ethernet Server Adapter",
1494 WM_T_I210, WMP_F_COPPER },
1495
1496 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1,
1497 "I210 Ethernet (Copper OEM)",
1498 WM_T_I210, WMP_F_COPPER },
1499
1500 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT,
1501 "I210 Ethernet (Copper IT)",
1502 WM_T_I210, WMP_F_COPPER },
1503
1504 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF,
1505 "I210 Ethernet (Copper, FLASH less)",
1506 WM_T_I210, WMP_F_COPPER },
1507
1508 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER,
1509 "I210 Gigabit Ethernet (Fiber)",
1510 WM_T_I210, WMP_F_FIBER },
1511
1512 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES,
1513 "I210 Gigabit Ethernet (SERDES)",
1514 WM_T_I210, WMP_F_SERDES },
1515
1516 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF,
1517 "I210 Gigabit Ethernet (SERDES, FLASH less)",
1518 WM_T_I210, WMP_F_SERDES },
1519
1520 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII,
1521 "I210 Gigabit Ethernet (SGMII)",
1522 WM_T_I210, WMP_F_COPPER },
1523
1524 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII_WOF,
1525 "I210 Gigabit Ethernet (SGMII, FLASH less)",
1526 WM_T_I210, WMP_F_COPPER },
1527
1528 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER,
1529 "I211 Ethernet (COPPER)",
1530 WM_T_I211, WMP_F_COPPER },
1531 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V,
1532 "I217 V Ethernet Connection",
1533 WM_T_PCH_LPT, WMP_F_COPPER },
1534 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM,
1535 "I217 LM Ethernet Connection",
1536 WM_T_PCH_LPT, WMP_F_COPPER },
1537 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V,
1538 "I218 V Ethernet Connection",
1539 WM_T_PCH_LPT, WMP_F_COPPER },
1540 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2,
1541 "I218 V Ethernet Connection",
1542 WM_T_PCH_LPT, WMP_F_COPPER },
1543 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3,
1544 "I218 V Ethernet Connection",
1545 WM_T_PCH_LPT, WMP_F_COPPER },
1546 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM,
1547 "I218 LM Ethernet Connection",
1548 WM_T_PCH_LPT, WMP_F_COPPER },
1549 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2,
1550 "I218 LM Ethernet Connection",
1551 WM_T_PCH_LPT, WMP_F_COPPER },
1552 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3,
1553 "I218 LM Ethernet Connection",
1554 WM_T_PCH_LPT, WMP_F_COPPER },
1555 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM,
1556 "I219 LM Ethernet Connection",
1557 WM_T_PCH_SPT, WMP_F_COPPER },
1558 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2,
1559 "I219 LM Ethernet Connection",
1560 WM_T_PCH_SPT, WMP_F_COPPER },
1561 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3,
1562 "I219 LM Ethernet Connection",
1563 WM_T_PCH_SPT, WMP_F_COPPER },
1564 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4,
1565 "I219 LM Ethernet Connection",
1566 WM_T_PCH_SPT, WMP_F_COPPER },
1567 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5,
1568 "I219 LM Ethernet Connection",
1569 WM_T_PCH_SPT, WMP_F_COPPER },
1570 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM6,
1571 "I219 LM Ethernet Connection",
1572 WM_T_PCH_CNP, WMP_F_COPPER },
1573 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM7,
1574 "I219 LM Ethernet Connection",
1575 WM_T_PCH_CNP, WMP_F_COPPER },
1576 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM8,
1577 "I219 LM Ethernet Connection",
1578 WM_T_PCH_CNP, WMP_F_COPPER },
1579 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM9,
1580 "I219 LM Ethernet Connection",
1581 WM_T_PCH_CNP, WMP_F_COPPER },
1582 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM10,
1583 "I219 LM Ethernet Connection",
1584 WM_T_PCH_CNP, WMP_F_COPPER },
1585 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM11,
1586 "I219 LM Ethernet Connection",
1587 WM_T_PCH_CNP, WMP_F_COPPER },
1588 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM12,
1589 "I219 LM Ethernet Connection",
1590 WM_T_PCH_SPT, WMP_F_COPPER },
1591 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM13,
1592 "I219 LM Ethernet Connection",
1593 WM_T_PCH_CNP, WMP_F_COPPER },
1594 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM14,
1595 "I219 LM Ethernet Connection",
1596 WM_T_PCH_CNP, WMP_F_COPPER },
1597 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM15,
1598 "I219 LM Ethernet Connection",
1599 WM_T_PCH_CNP, WMP_F_COPPER },
1600 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V,
1601 "I219 V Ethernet Connection",
1602 WM_T_PCH_SPT, WMP_F_COPPER },
1603 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2,
1604 "I219 V Ethernet Connection",
1605 WM_T_PCH_SPT, WMP_F_COPPER },
1606 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4,
1607 "I219 V Ethernet Connection",
1608 WM_T_PCH_SPT, WMP_F_COPPER },
1609 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5,
1610 "I219 V Ethernet Connection",
1611 WM_T_PCH_SPT, WMP_F_COPPER },
1612 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V6,
1613 "I219 V Ethernet Connection",
1614 WM_T_PCH_CNP, WMP_F_COPPER },
1615 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V7,
1616 "I219 V Ethernet Connection",
1617 WM_T_PCH_CNP, WMP_F_COPPER },
1618 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V8,
1619 "I219 V Ethernet Connection",
1620 WM_T_PCH_CNP, WMP_F_COPPER },
1621 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V9,
1622 "I219 V Ethernet Connection",
1623 WM_T_PCH_CNP, WMP_F_COPPER },
1624 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V10,
1625 "I219 V Ethernet Connection",
1626 WM_T_PCH_CNP, WMP_F_COPPER },
1627 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V11,
1628 "I219 V Ethernet Connection",
1629 WM_T_PCH_CNP, WMP_F_COPPER },
1630 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V12,
1631 "I219 V Ethernet Connection",
1632 WM_T_PCH_SPT, WMP_F_COPPER },
1633 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V13,
1634 "I219 V Ethernet Connection",
1635 WM_T_PCH_CNP, WMP_F_COPPER },
1636 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V14,
1637 "I219 V Ethernet Connection",
1638 WM_T_PCH_CNP, WMP_F_COPPER },
1639 { 0, 0,
1640 NULL,
1641 0, 0 },
1642 };
1643
1644 /*
1645 * Register read/write functions.
1646 * Other than CSR_{READ|WRITE}().
1647 */
1648
1649 #if 0 /* Not currently used */
1650 static inline uint32_t
1651 wm_io_read(struct wm_softc *sc, int reg)
1652 {
1653
1654 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1655 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4));
1656 }
1657 #endif
1658
1659 static inline void
1660 wm_io_write(struct wm_softc *sc, int reg, uint32_t val)
1661 {
1662
1663 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1664 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val);
1665 }
1666
1667 static inline void
1668 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off,
1669 uint32_t data)
1670 {
1671 uint32_t regval;
1672 int i;
1673
1674 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
1675
1676 CSR_WRITE(sc, reg, regval);
1677
1678 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) {
1679 delay(5);
1680 if (CSR_READ(sc, reg) & SCTL_CTL_READY)
1681 break;
1682 }
1683 if (i == SCTL_CTL_POLL_TIMEOUT) {
1684 aprint_error("%s: WARNING:"
1685 " i82575 reg 0x%08x setup did not indicate ready\n",
1686 device_xname(sc->sc_dev), reg);
1687 }
1688 }
1689
1690 static inline void
1691 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v)
1692 {
1693 wa->wa_low = htole32(v & 0xffffffffU);
1694 if (sizeof(bus_addr_t) == 8)
1695 wa->wa_high = htole32((uint64_t) v >> 32);
1696 else
1697 wa->wa_high = 0;
1698 }
1699
1700 /*
1701 * Descriptor sync/init functions.
1702 */
1703 static inline void
1704 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops)
1705 {
1706 struct wm_softc *sc = txq->txq_sc;
1707
1708 /* If it will wrap around, sync to the end of the ring. */
1709 if ((start + num) > WM_NTXDESC(txq)) {
1710 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1711 WM_CDTXOFF(txq, start), txq->txq_descsize *
1712 (WM_NTXDESC(txq) - start), ops);
1713 num -= (WM_NTXDESC(txq) - start);
1714 start = 0;
1715 }
1716
1717 /* Now sync whatever is left. */
1718 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1719 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops);
1720 }
1721
1722 static inline void
1723 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops)
1724 {
1725 struct wm_softc *sc = rxq->rxq_sc;
1726
1727 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap,
1728 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops);
1729 }
1730
1731 static inline void
1732 wm_init_rxdesc(struct wm_rxqueue *rxq, int start)
1733 {
1734 struct wm_softc *sc = rxq->rxq_sc;
1735 struct wm_rxsoft *rxs = &rxq->rxq_soft[start];
1736 struct mbuf *m = rxs->rxs_mbuf;
1737
1738 /*
1739 * Note: We scoot the packet forward 2 bytes in the buffer
1740 * so that the payload after the Ethernet header is aligned
1741 * to a 4-byte boundary.
1742
1743 * XXX BRAINDAMAGE ALERT!
1744 * The stupid chip uses the same size for every buffer, which
1745 * is set in the Receive Control register. We are using the 2K
1746 * size option, but what we REALLY want is (2K - 2)! For this
1747 * reason, we can't "scoot" packets longer than the standard
1748 * Ethernet MTU. On strict-alignment platforms, if the total
1749 * size exceeds (2K - 2) we set align_tweak to 0 and let
1750 * the upper layer copy the headers.
1751 */
1752 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak;
1753
1754 if (sc->sc_type == WM_T_82574) {
1755 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start];
1756 rxd->erx_data.erxd_addr =
1757 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1758 rxd->erx_data.erxd_dd = 0;
1759 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
1760 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start];
1761
1762 rxd->nqrx_data.nrxd_paddr =
1763 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1764 /* Currently, split header is not supported. */
1765 rxd->nqrx_data.nrxd_haddr = 0;
1766 } else {
1767 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start];
1768
1769 wm_set_dma_addr(&rxd->wrx_addr,
1770 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1771 rxd->wrx_len = 0;
1772 rxd->wrx_cksum = 0;
1773 rxd->wrx_status = 0;
1774 rxd->wrx_errors = 0;
1775 rxd->wrx_special = 0;
1776 }
1777 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1778
1779 CSR_WRITE(sc, rxq->rxq_rdt_reg, start);
1780 }
1781
1782 /*
1783 * Device driver interface functions and commonly used functions.
1784 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
1785 */
1786
1787 /* Lookup supported device table */
1788 static const struct wm_product *
1789 wm_lookup(const struct pci_attach_args *pa)
1790 {
1791 const struct wm_product *wmp;
1792
1793 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
1794 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
1795 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
1796 return wmp;
1797 }
1798 return NULL;
1799 }
1800
1801 /* The match function (ca_match) */
1802 static int
1803 wm_match(device_t parent, cfdata_t cf, void *aux)
1804 {
1805 struct pci_attach_args *pa = aux;
1806
1807 if (wm_lookup(pa) != NULL)
1808 return 1;
1809
1810 return 0;
1811 }
1812
1813 /* The attach function (ca_attach) */
1814 static void
1815 wm_attach(device_t parent, device_t self, void *aux)
1816 {
1817 struct wm_softc *sc = device_private(self);
1818 struct pci_attach_args *pa = aux;
1819 prop_dictionary_t dict;
1820 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1821 pci_chipset_tag_t pc = pa->pa_pc;
1822 int counts[PCI_INTR_TYPE_SIZE];
1823 pci_intr_type_t max_type;
1824 const char *eetype, *xname;
1825 bus_space_tag_t memt;
1826 bus_space_handle_t memh;
1827 bus_size_t memsize;
1828 int memh_valid;
1829 int i, error;
1830 const struct wm_product *wmp;
1831 prop_data_t ea;
1832 prop_number_t pn;
1833 uint8_t enaddr[ETHER_ADDR_LEN];
1834 char buf[256];
1835 char wqname[MAXCOMLEN];
1836 uint16_t cfg1, cfg2, swdpin, nvmword;
1837 pcireg_t preg, memtype;
1838 uint16_t eeprom_data, apme_mask;
1839 bool force_clear_smbi;
1840 uint32_t link_mode;
1841 uint32_t reg;
1842
1843 sc->sc_dev = self;
1844 callout_init(&sc->sc_tick_ch, WM_CALLOUT_FLAGS);
1845 callout_setfunc(&sc->sc_tick_ch, wm_tick, sc);
1846 sc->sc_core_stopping = false;
1847
1848 wmp = wm_lookup(pa);
1849 #ifdef DIAGNOSTIC
1850 if (wmp == NULL) {
1851 printf("\n");
1852 panic("wm_attach: impossible");
1853 }
1854 #endif
1855 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags);
1856
1857 sc->sc_pc = pa->pa_pc;
1858 sc->sc_pcitag = pa->pa_tag;
1859
1860 if (pci_dma64_available(pa))
1861 sc->sc_dmat = pa->pa_dmat64;
1862 else
1863 sc->sc_dmat = pa->pa_dmat;
1864
1865 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id);
1866 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG));
1867 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1);
1868
1869 sc->sc_type = wmp->wmp_type;
1870
1871 /* Set default function pointers */
1872 sc->phy.acquire = sc->nvm.acquire = wm_get_null;
1873 sc->phy.release = sc->nvm.release = wm_put_null;
1874 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000;
1875
1876 if (sc->sc_type < WM_T_82543) {
1877 if (sc->sc_rev < 2) {
1878 aprint_error_dev(sc->sc_dev,
1879 "i82542 must be at least rev. 2\n");
1880 return;
1881 }
1882 if (sc->sc_rev < 3)
1883 sc->sc_type = WM_T_82542_2_0;
1884 }
1885
1886 /*
1887 * Disable MSI for Errata:
1888 * "Message Signaled Interrupt Feature May Corrupt Write Transactions"
1889 *
1890 * 82544: Errata 25
1891 * 82540: Errata 6 (easy to reproduce device timeout)
1892 * 82545: Errata 4 (easy to reproduce device timeout)
1893 * 82546: Errata 26 (easy to reproduce device timeout)
1894 * 82541: Errata 7 (easy to reproduce device timeout)
1895 *
1896 * "Byte Enables 2 and 3 are not set on MSI writes"
1897 *
1898 * 82571 & 82572: Errata 63
1899 */
1900 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571)
1901 || (sc->sc_type == WM_T_82572))
1902 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY;
1903
1904 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1905 || (sc->sc_type == WM_T_82580)
1906 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
1907 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
1908 sc->sc_flags |= WM_F_NEWQUEUE;
1909
1910 /* Set device properties (mactype) */
1911 dict = device_properties(sc->sc_dev);
1912 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type);
1913
1914 /*
1915 * Map the device. All devices support memory-mapped acccess,
1916 * and it is really required for normal operation.
1917 */
1918 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
1919 switch (memtype) {
1920 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1921 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1922 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
1923 memtype, 0, &memt, &memh, NULL, &memsize) == 0);
1924 break;
1925 default:
1926 memh_valid = 0;
1927 break;
1928 }
1929
1930 if (memh_valid) {
1931 sc->sc_st = memt;
1932 sc->sc_sh = memh;
1933 sc->sc_ss = memsize;
1934 } else {
1935 aprint_error_dev(sc->sc_dev,
1936 "unable to map device registers\n");
1937 return;
1938 }
1939
1940 /*
1941 * In addition, i82544 and later support I/O mapped indirect
1942 * register access. It is not desirable (nor supported in
1943 * this driver) to use it for normal operation, though it is
1944 * required to work around bugs in some chip versions.
1945 */
1946 if (sc->sc_type >= WM_T_82544) {
1947 /* First we have to find the I/O BAR. */
1948 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) {
1949 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
1950 if (memtype == PCI_MAPREG_TYPE_IO)
1951 break;
1952 if (PCI_MAPREG_MEM_TYPE(memtype) ==
1953 PCI_MAPREG_MEM_TYPE_64BIT)
1954 i += 4; /* skip high bits, too */
1955 }
1956 if (i < PCI_MAPREG_END) {
1957 /*
1958 * We found PCI_MAPREG_TYPE_IO. Note that 82580
1959 * (and newer?) chip has no PCI_MAPREG_TYPE_IO.
1960 * It's no problem because newer chips has no this
1961 * bug.
1962 *
1963 * The i8254x doesn't apparently respond when the
1964 * I/O BAR is 0, which looks somewhat like it's not
1965 * been configured.
1966 */
1967 preg = pci_conf_read(pc, pa->pa_tag, i);
1968 if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
1969 aprint_error_dev(sc->sc_dev,
1970 "WARNING: I/O BAR at zero.\n");
1971 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
1972 0, &sc->sc_iot, &sc->sc_ioh,
1973 NULL, &sc->sc_ios) == 0) {
1974 sc->sc_flags |= WM_F_IOH_VALID;
1975 } else
1976 aprint_error_dev(sc->sc_dev,
1977 "WARNING: unable to map I/O space\n");
1978 }
1979
1980 }
1981
1982 /* Enable bus mastering. Disable MWI on the i82542 2.0. */
1983 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
1984 preg |= PCI_COMMAND_MASTER_ENABLE;
1985 if (sc->sc_type < WM_T_82542_2_1)
1986 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
1987 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
1988
1989 /* Power up chip */
1990 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self, NULL))
1991 && error != EOPNOTSUPP) {
1992 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error);
1993 return;
1994 }
1995
1996 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag));
1997 /*
1998 * Don't use MSI-X if we can use only one queue to save interrupt
1999 * resource.
2000 */
2001 if (sc->sc_nqueues > 1) {
2002 max_type = PCI_INTR_TYPE_MSIX;
2003 /*
2004 * 82583 has a MSI-X capability in the PCI configuration space
2005 * but it doesn't support it. At least the document doesn't
2006 * say anything about MSI-X.
2007 */
2008 counts[PCI_INTR_TYPE_MSIX]
2009 = (sc->sc_type == WM_T_82583) ? 0 : sc->sc_nqueues + 1;
2010 } else {
2011 max_type = PCI_INTR_TYPE_MSI;
2012 counts[PCI_INTR_TYPE_MSIX] = 0;
2013 }
2014
2015 /* Allocation settings */
2016 counts[PCI_INTR_TYPE_MSI] = 1;
2017 counts[PCI_INTR_TYPE_INTX] = 1;
2018 /* overridden by disable flags */
2019 if (wm_disable_msi != 0) {
2020 counts[PCI_INTR_TYPE_MSI] = 0;
2021 if (wm_disable_msix != 0) {
2022 max_type = PCI_INTR_TYPE_INTX;
2023 counts[PCI_INTR_TYPE_MSIX] = 0;
2024 }
2025 } else if (wm_disable_msix != 0) {
2026 max_type = PCI_INTR_TYPE_MSI;
2027 counts[PCI_INTR_TYPE_MSIX] = 0;
2028 }
2029
2030 alloc_retry:
2031 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) {
2032 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n");
2033 return;
2034 }
2035
2036 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) {
2037 error = wm_setup_msix(sc);
2038 if (error) {
2039 pci_intr_release(pc, sc->sc_intrs,
2040 counts[PCI_INTR_TYPE_MSIX]);
2041
2042 /* Setup for MSI: Disable MSI-X */
2043 max_type = PCI_INTR_TYPE_MSI;
2044 counts[PCI_INTR_TYPE_MSI] = 1;
2045 counts[PCI_INTR_TYPE_INTX] = 1;
2046 goto alloc_retry;
2047 }
2048 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) {
2049 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */
2050 error = wm_setup_legacy(sc);
2051 if (error) {
2052 pci_intr_release(sc->sc_pc, sc->sc_intrs,
2053 counts[PCI_INTR_TYPE_MSI]);
2054
2055 /* The next try is for INTx: Disable MSI */
2056 max_type = PCI_INTR_TYPE_INTX;
2057 counts[PCI_INTR_TYPE_INTX] = 1;
2058 goto alloc_retry;
2059 }
2060 } else {
2061 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */
2062 error = wm_setup_legacy(sc);
2063 if (error) {
2064 pci_intr_release(sc->sc_pc, sc->sc_intrs,
2065 counts[PCI_INTR_TYPE_INTX]);
2066 return;
2067 }
2068 }
2069
2070 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(sc->sc_dev));
2071 error = workqueue_create(&sc->sc_queue_wq, wqname,
2072 wm_handle_queue_work, sc, WM_WORKQUEUE_PRI, IPL_NET,
2073 WM_WORKQUEUE_FLAGS);
2074 if (error) {
2075 aprint_error_dev(sc->sc_dev,
2076 "unable to create workqueue\n");
2077 goto out;
2078 }
2079
2080 /*
2081 * Check the function ID (unit number of the chip).
2082 */
2083 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3)
2084 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003)
2085 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2086 || (sc->sc_type == WM_T_82580)
2087 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
2088 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS)
2089 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK;
2090 else
2091 sc->sc_funcid = 0;
2092
2093 /*
2094 * Determine a few things about the bus we're connected to.
2095 */
2096 if (sc->sc_type < WM_T_82543) {
2097 /* We don't really know the bus characteristics here. */
2098 sc->sc_bus_speed = 33;
2099 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) {
2100 /*
2101 * CSA (Communication Streaming Architecture) is about as fast
2102 * a 32-bit 66MHz PCI Bus.
2103 */
2104 sc->sc_flags |= WM_F_CSA;
2105 sc->sc_bus_speed = 66;
2106 aprint_verbose_dev(sc->sc_dev,
2107 "Communication Streaming Architecture\n");
2108 if (sc->sc_type == WM_T_82547) {
2109 callout_init(&sc->sc_txfifo_ch, WM_CALLOUT_FLAGS);
2110 callout_setfunc(&sc->sc_txfifo_ch,
2111 wm_82547_txfifo_stall, sc);
2112 aprint_verbose_dev(sc->sc_dev,
2113 "using 82547 Tx FIFO stall work-around\n");
2114 }
2115 } else if (sc->sc_type >= WM_T_82571) {
2116 sc->sc_flags |= WM_F_PCIE;
2117 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
2118 && (sc->sc_type != WM_T_ICH10)
2119 && (sc->sc_type != WM_T_PCH)
2120 && (sc->sc_type != WM_T_PCH2)
2121 && (sc->sc_type != WM_T_PCH_LPT)
2122 && (sc->sc_type != WM_T_PCH_SPT)
2123 && (sc->sc_type != WM_T_PCH_CNP)) {
2124 /* ICH* and PCH* have no PCIe capability registers */
2125 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2126 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff,
2127 NULL) == 0)
2128 aprint_error_dev(sc->sc_dev,
2129 "unable to find PCIe capability\n");
2130 }
2131 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n");
2132 } else {
2133 reg = CSR_READ(sc, WMREG_STATUS);
2134 if (reg & STATUS_BUS64)
2135 sc->sc_flags |= WM_F_BUS64;
2136 if ((reg & STATUS_PCIX_MODE) != 0) {
2137 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb;
2138
2139 sc->sc_flags |= WM_F_PCIX;
2140 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2141 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0)
2142 aprint_error_dev(sc->sc_dev,
2143 "unable to find PCIX capability\n");
2144 else if (sc->sc_type != WM_T_82545_3 &&
2145 sc->sc_type != WM_T_82546_3) {
2146 /*
2147 * Work around a problem caused by the BIOS
2148 * setting the max memory read byte count
2149 * incorrectly.
2150 */
2151 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag,
2152 sc->sc_pcixe_capoff + PCIX_CMD);
2153 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag,
2154 sc->sc_pcixe_capoff + PCIX_STATUS);
2155
2156 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >>
2157 PCIX_CMD_BYTECNT_SHIFT;
2158 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >>
2159 PCIX_STATUS_MAXB_SHIFT;
2160 if (bytecnt > maxb) {
2161 aprint_verbose_dev(sc->sc_dev,
2162 "resetting PCI-X MMRBC: %d -> %d\n",
2163 512 << bytecnt, 512 << maxb);
2164 pcix_cmd = (pcix_cmd &
2165 ~PCIX_CMD_BYTECNT_MASK) |
2166 (maxb << PCIX_CMD_BYTECNT_SHIFT);
2167 pci_conf_write(pa->pa_pc, pa->pa_tag,
2168 sc->sc_pcixe_capoff + PCIX_CMD,
2169 pcix_cmd);
2170 }
2171 }
2172 }
2173 /*
2174 * The quad port adapter is special; it has a PCIX-PCIX
2175 * bridge on the board, and can run the secondary bus at
2176 * a higher speed.
2177 */
2178 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) {
2179 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120
2180 : 66;
2181 } else if (sc->sc_flags & WM_F_PCIX) {
2182 switch (reg & STATUS_PCIXSPD_MASK) {
2183 case STATUS_PCIXSPD_50_66:
2184 sc->sc_bus_speed = 66;
2185 break;
2186 case STATUS_PCIXSPD_66_100:
2187 sc->sc_bus_speed = 100;
2188 break;
2189 case STATUS_PCIXSPD_100_133:
2190 sc->sc_bus_speed = 133;
2191 break;
2192 default:
2193 aprint_error_dev(sc->sc_dev,
2194 "unknown PCIXSPD %d; assuming 66MHz\n",
2195 reg & STATUS_PCIXSPD_MASK);
2196 sc->sc_bus_speed = 66;
2197 break;
2198 }
2199 } else
2200 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33;
2201 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n",
2202 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
2203 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI");
2204 }
2205
2206 /* clear interesting stat counters */
2207 CSR_READ(sc, WMREG_COLC);
2208 CSR_READ(sc, WMREG_RXERRC);
2209
2210 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)
2211 || (sc->sc_type >= WM_T_ICH8))
2212 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2213 if (sc->sc_type >= WM_T_ICH8)
2214 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2215
2216 /* Set PHY, NVM mutex related stuff */
2217 switch (sc->sc_type) {
2218 case WM_T_82542_2_0:
2219 case WM_T_82542_2_1:
2220 case WM_T_82543:
2221 case WM_T_82544:
2222 /* Microwire */
2223 sc->nvm.read = wm_nvm_read_uwire;
2224 sc->sc_nvm_wordsize = 64;
2225 sc->sc_nvm_addrbits = 6;
2226 break;
2227 case WM_T_82540:
2228 case WM_T_82545:
2229 case WM_T_82545_3:
2230 case WM_T_82546:
2231 case WM_T_82546_3:
2232 /* Microwire */
2233 sc->nvm.read = wm_nvm_read_uwire;
2234 reg = CSR_READ(sc, WMREG_EECD);
2235 if (reg & EECD_EE_SIZE) {
2236 sc->sc_nvm_wordsize = 256;
2237 sc->sc_nvm_addrbits = 8;
2238 } else {
2239 sc->sc_nvm_wordsize = 64;
2240 sc->sc_nvm_addrbits = 6;
2241 }
2242 sc->sc_flags |= WM_F_LOCK_EECD;
2243 sc->nvm.acquire = wm_get_eecd;
2244 sc->nvm.release = wm_put_eecd;
2245 break;
2246 case WM_T_82541:
2247 case WM_T_82541_2:
2248 case WM_T_82547:
2249 case WM_T_82547_2:
2250 reg = CSR_READ(sc, WMREG_EECD);
2251 /*
2252 * wm_nvm_set_addrbits_size_eecd() accesses SPI in it only
2253 * on 8254[17], so set flags and functios before calling it.
2254 */
2255 sc->sc_flags |= WM_F_LOCK_EECD;
2256 sc->nvm.acquire = wm_get_eecd;
2257 sc->nvm.release = wm_put_eecd;
2258 if (reg & EECD_EE_TYPE) {
2259 /* SPI */
2260 sc->nvm.read = wm_nvm_read_spi;
2261 sc->sc_flags |= WM_F_EEPROM_SPI;
2262 wm_nvm_set_addrbits_size_eecd(sc);
2263 } else {
2264 /* Microwire */
2265 sc->nvm.read = wm_nvm_read_uwire;
2266 if ((reg & EECD_EE_ABITS) != 0) {
2267 sc->sc_nvm_wordsize = 256;
2268 sc->sc_nvm_addrbits = 8;
2269 } else {
2270 sc->sc_nvm_wordsize = 64;
2271 sc->sc_nvm_addrbits = 6;
2272 }
2273 }
2274 break;
2275 case WM_T_82571:
2276 case WM_T_82572:
2277 /* SPI */
2278 sc->nvm.read = wm_nvm_read_eerd;
2279 /* Not use WM_F_LOCK_EECD because we use EERD */
2280 sc->sc_flags |= WM_F_EEPROM_SPI;
2281 wm_nvm_set_addrbits_size_eecd(sc);
2282 sc->phy.acquire = wm_get_swsm_semaphore;
2283 sc->phy.release = wm_put_swsm_semaphore;
2284 sc->nvm.acquire = wm_get_nvm_82571;
2285 sc->nvm.release = wm_put_nvm_82571;
2286 break;
2287 case WM_T_82573:
2288 case WM_T_82574:
2289 case WM_T_82583:
2290 sc->nvm.read = wm_nvm_read_eerd;
2291 /* Not use WM_F_LOCK_EECD because we use EERD */
2292 if (sc->sc_type == WM_T_82573) {
2293 sc->phy.acquire = wm_get_swsm_semaphore;
2294 sc->phy.release = wm_put_swsm_semaphore;
2295 sc->nvm.acquire = wm_get_nvm_82571;
2296 sc->nvm.release = wm_put_nvm_82571;
2297 } else {
2298 /* Both PHY and NVM use the same semaphore. */
2299 sc->phy.acquire = sc->nvm.acquire
2300 = wm_get_swfwhw_semaphore;
2301 sc->phy.release = sc->nvm.release
2302 = wm_put_swfwhw_semaphore;
2303 }
2304 if (wm_nvm_is_onboard_eeprom(sc) == 0) {
2305 sc->sc_flags |= WM_F_EEPROM_FLASH;
2306 sc->sc_nvm_wordsize = 2048;
2307 } else {
2308 /* SPI */
2309 sc->sc_flags |= WM_F_EEPROM_SPI;
2310 wm_nvm_set_addrbits_size_eecd(sc);
2311 }
2312 break;
2313 case WM_T_82575:
2314 case WM_T_82576:
2315 case WM_T_82580:
2316 case WM_T_I350:
2317 case WM_T_I354:
2318 case WM_T_80003:
2319 /* SPI */
2320 sc->sc_flags |= WM_F_EEPROM_SPI;
2321 wm_nvm_set_addrbits_size_eecd(sc);
2322 if ((sc->sc_type == WM_T_80003)
2323 || (sc->sc_nvm_wordsize < (1 << 15))) {
2324 sc->nvm.read = wm_nvm_read_eerd;
2325 /* Don't use WM_F_LOCK_EECD because we use EERD */
2326 } else {
2327 sc->nvm.read = wm_nvm_read_spi;
2328 sc->sc_flags |= WM_F_LOCK_EECD;
2329 }
2330 sc->phy.acquire = wm_get_phy_82575;
2331 sc->phy.release = wm_put_phy_82575;
2332 sc->nvm.acquire = wm_get_nvm_80003;
2333 sc->nvm.release = wm_put_nvm_80003;
2334 break;
2335 case WM_T_ICH8:
2336 case WM_T_ICH9:
2337 case WM_T_ICH10:
2338 case WM_T_PCH:
2339 case WM_T_PCH2:
2340 case WM_T_PCH_LPT:
2341 sc->nvm.read = wm_nvm_read_ich8;
2342 /* FLASH */
2343 sc->sc_flags |= WM_F_EEPROM_FLASH;
2344 sc->sc_nvm_wordsize = 2048;
2345 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH);
2346 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0,
2347 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) {
2348 aprint_error_dev(sc->sc_dev,
2349 "can't map FLASH registers\n");
2350 goto out;
2351 }
2352 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG);
2353 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) *
2354 ICH_FLASH_SECTOR_SIZE;
2355 sc->sc_ich8_flash_bank_size =
2356 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1;
2357 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK);
2358 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
2359 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t);
2360 sc->sc_flashreg_offset = 0;
2361 sc->phy.acquire = wm_get_swflag_ich8lan;
2362 sc->phy.release = wm_put_swflag_ich8lan;
2363 sc->nvm.acquire = wm_get_nvm_ich8lan;
2364 sc->nvm.release = wm_put_nvm_ich8lan;
2365 break;
2366 case WM_T_PCH_SPT:
2367 case WM_T_PCH_CNP:
2368 sc->nvm.read = wm_nvm_read_spt;
2369 /* SPT has no GFPREG; flash registers mapped through BAR0 */
2370 sc->sc_flags |= WM_F_EEPROM_FLASH;
2371 sc->sc_flasht = sc->sc_st;
2372 sc->sc_flashh = sc->sc_sh;
2373 sc->sc_ich8_flash_base = 0;
2374 sc->sc_nvm_wordsize =
2375 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1)
2376 * NVM_SIZE_MULTIPLIER;
2377 /* It is size in bytes, we want words */
2378 sc->sc_nvm_wordsize /= 2;
2379 /* Assume 2 banks */
2380 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2;
2381 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET;
2382 sc->phy.acquire = wm_get_swflag_ich8lan;
2383 sc->phy.release = wm_put_swflag_ich8lan;
2384 sc->nvm.acquire = wm_get_nvm_ich8lan;
2385 sc->nvm.release = wm_put_nvm_ich8lan;
2386 break;
2387 case WM_T_I210:
2388 case WM_T_I211:
2389 /* Allow a single clear of the SW semaphore on I210 and newer*/
2390 sc->sc_flags |= WM_F_WA_I210_CLSEM;
2391 if (wm_nvm_flash_presence_i210(sc)) {
2392 sc->nvm.read = wm_nvm_read_eerd;
2393 /* Don't use WM_F_LOCK_EECD because we use EERD */
2394 sc->sc_flags |= WM_F_EEPROM_FLASH_HW;
2395 wm_nvm_set_addrbits_size_eecd(sc);
2396 } else {
2397 sc->nvm.read = wm_nvm_read_invm;
2398 sc->sc_flags |= WM_F_EEPROM_INVM;
2399 sc->sc_nvm_wordsize = INVM_SIZE;
2400 }
2401 sc->phy.acquire = wm_get_phy_82575;
2402 sc->phy.release = wm_put_phy_82575;
2403 sc->nvm.acquire = wm_get_nvm_80003;
2404 sc->nvm.release = wm_put_nvm_80003;
2405 break;
2406 default:
2407 break;
2408 }
2409
2410 /* Ensure the SMBI bit is clear before first NVM or PHY access */
2411 switch (sc->sc_type) {
2412 case WM_T_82571:
2413 case WM_T_82572:
2414 reg = CSR_READ(sc, WMREG_SWSM2);
2415 if ((reg & SWSM2_LOCK) == 0) {
2416 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK);
2417 force_clear_smbi = true;
2418 } else
2419 force_clear_smbi = false;
2420 break;
2421 case WM_T_82573:
2422 case WM_T_82574:
2423 case WM_T_82583:
2424 force_clear_smbi = true;
2425 break;
2426 default:
2427 force_clear_smbi = false;
2428 break;
2429 }
2430 if (force_clear_smbi) {
2431 reg = CSR_READ(sc, WMREG_SWSM);
2432 if ((reg & SWSM_SMBI) != 0)
2433 aprint_error_dev(sc->sc_dev,
2434 "Please update the Bootagent\n");
2435 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI);
2436 }
2437
2438 /*
2439 * Defer printing the EEPROM type until after verifying the checksum
2440 * This allows the EEPROM type to be printed correctly in the case
2441 * that no EEPROM is attached.
2442 */
2443 /*
2444 * Validate the EEPROM checksum. If the checksum fails, flag
2445 * this for later, so we can fail future reads from the EEPROM.
2446 */
2447 if (wm_nvm_validate_checksum(sc)) {
2448 /*
2449 * Read twice again because some PCI-e parts fail the
2450 * first check due to the link being in sleep state.
2451 */
2452 if (wm_nvm_validate_checksum(sc))
2453 sc->sc_flags |= WM_F_EEPROM_INVALID;
2454 }
2455
2456 if (sc->sc_flags & WM_F_EEPROM_INVALID)
2457 aprint_verbose_dev(sc->sc_dev, "No EEPROM");
2458 else {
2459 aprint_verbose_dev(sc->sc_dev, "%u words ",
2460 sc->sc_nvm_wordsize);
2461 if (sc->sc_flags & WM_F_EEPROM_INVM)
2462 aprint_verbose("iNVM");
2463 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW)
2464 aprint_verbose("FLASH(HW)");
2465 else if (sc->sc_flags & WM_F_EEPROM_FLASH)
2466 aprint_verbose("FLASH");
2467 else {
2468 if (sc->sc_flags & WM_F_EEPROM_SPI)
2469 eetype = "SPI";
2470 else
2471 eetype = "MicroWire";
2472 aprint_verbose("(%d address bits) %s EEPROM",
2473 sc->sc_nvm_addrbits, eetype);
2474 }
2475 }
2476 wm_nvm_version(sc);
2477 aprint_verbose("\n");
2478
2479 /*
2480 * XXX The first call of wm_gmii_setup_phytype. The result might be
2481 * incorrect.
2482 */
2483 wm_gmii_setup_phytype(sc, 0, 0);
2484
2485 /* Check for WM_F_WOL on some chips before wm_reset() */
2486 switch (sc->sc_type) {
2487 case WM_T_ICH8:
2488 case WM_T_ICH9:
2489 case WM_T_ICH10:
2490 case WM_T_PCH:
2491 case WM_T_PCH2:
2492 case WM_T_PCH_LPT:
2493 case WM_T_PCH_SPT:
2494 case WM_T_PCH_CNP:
2495 apme_mask = WUC_APME;
2496 eeprom_data = CSR_READ(sc, WMREG_WUC);
2497 if ((eeprom_data & apme_mask) != 0)
2498 sc->sc_flags |= WM_F_WOL;
2499 break;
2500 default:
2501 break;
2502 }
2503
2504 /* Reset the chip to a known state. */
2505 wm_reset(sc);
2506
2507 /*
2508 * Check for I21[01] PLL workaround.
2509 *
2510 * Three cases:
2511 * a) Chip is I211.
2512 * b) Chip is I210 and it uses INVM (not FLASH).
2513 * c) Chip is I210 (and it uses FLASH) and the NVM image version < 3.25
2514 */
2515 if (sc->sc_type == WM_T_I211)
2516 sc->sc_flags |= WM_F_PLL_WA_I210;
2517 if (sc->sc_type == WM_T_I210) {
2518 if (!wm_nvm_flash_presence_i210(sc))
2519 sc->sc_flags |= WM_F_PLL_WA_I210;
2520 else if ((sc->sc_nvm_ver_major < 3)
2521 || ((sc->sc_nvm_ver_major == 3)
2522 && (sc->sc_nvm_ver_minor < 25))) {
2523 aprint_verbose_dev(sc->sc_dev,
2524 "ROM image version %d.%d is older than 3.25\n",
2525 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor);
2526 sc->sc_flags |= WM_F_PLL_WA_I210;
2527 }
2528 }
2529 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
2530 wm_pll_workaround_i210(sc);
2531
2532 wm_get_wakeup(sc);
2533
2534 /* Non-AMT based hardware can now take control from firmware */
2535 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
2536 wm_get_hw_control(sc);
2537
2538 /*
2539 * Read the Ethernet address from the EEPROM, if not first found
2540 * in device properties.
2541 */
2542 ea = prop_dictionary_get(dict, "mac-address");
2543 if (ea != NULL) {
2544 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA);
2545 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN);
2546 memcpy(enaddr, prop_data_value(ea), ETHER_ADDR_LEN);
2547 } else {
2548 if (wm_read_mac_addr(sc, enaddr) != 0) {
2549 aprint_error_dev(sc->sc_dev,
2550 "unable to read Ethernet address\n");
2551 goto out;
2552 }
2553 }
2554
2555 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
2556 ether_sprintf(enaddr));
2557
2558 /*
2559 * Read the config info from the EEPROM, and set up various
2560 * bits in the control registers based on their contents.
2561 */
2562 pn = prop_dictionary_get(dict, "i82543-cfg1");
2563 if (pn != NULL) {
2564 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2565 cfg1 = (uint16_t) prop_number_signed_value(pn);
2566 } else {
2567 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) {
2568 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n");
2569 goto out;
2570 }
2571 }
2572
2573 pn = prop_dictionary_get(dict, "i82543-cfg2");
2574 if (pn != NULL) {
2575 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2576 cfg2 = (uint16_t) prop_number_signed_value(pn);
2577 } else {
2578 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) {
2579 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n");
2580 goto out;
2581 }
2582 }
2583
2584 /* check for WM_F_WOL */
2585 switch (sc->sc_type) {
2586 case WM_T_82542_2_0:
2587 case WM_T_82542_2_1:
2588 case WM_T_82543:
2589 /* dummy? */
2590 eeprom_data = 0;
2591 apme_mask = NVM_CFG3_APME;
2592 break;
2593 case WM_T_82544:
2594 apme_mask = NVM_CFG2_82544_APM_EN;
2595 eeprom_data = cfg2;
2596 break;
2597 case WM_T_82546:
2598 case WM_T_82546_3:
2599 case WM_T_82571:
2600 case WM_T_82572:
2601 case WM_T_82573:
2602 case WM_T_82574:
2603 case WM_T_82583:
2604 case WM_T_80003:
2605 case WM_T_82575:
2606 case WM_T_82576:
2607 apme_mask = NVM_CFG3_APME;
2608 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB
2609 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2610 break;
2611 case WM_T_82580:
2612 case WM_T_I350:
2613 case WM_T_I354:
2614 case WM_T_I210:
2615 case WM_T_I211:
2616 apme_mask = NVM_CFG3_APME;
2617 wm_nvm_read(sc,
2618 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA,
2619 1, &eeprom_data);
2620 break;
2621 case WM_T_ICH8:
2622 case WM_T_ICH9:
2623 case WM_T_ICH10:
2624 case WM_T_PCH:
2625 case WM_T_PCH2:
2626 case WM_T_PCH_LPT:
2627 case WM_T_PCH_SPT:
2628 case WM_T_PCH_CNP:
2629 /* Already checked before wm_reset () */
2630 apme_mask = eeprom_data = 0;
2631 break;
2632 default: /* XXX 82540 */
2633 apme_mask = NVM_CFG3_APME;
2634 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2635 break;
2636 }
2637 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */
2638 if ((eeprom_data & apme_mask) != 0)
2639 sc->sc_flags |= WM_F_WOL;
2640
2641 /*
2642 * We have the eeprom settings, now apply the special cases
2643 * where the eeprom may be wrong or the board won't support
2644 * wake on lan on a particular port
2645 */
2646 switch (sc->sc_pcidevid) {
2647 case PCI_PRODUCT_INTEL_82546GB_PCIE:
2648 sc->sc_flags &= ~WM_F_WOL;
2649 break;
2650 case PCI_PRODUCT_INTEL_82546EB_FIBER:
2651 case PCI_PRODUCT_INTEL_82546GB_FIBER:
2652 /* Wake events only supported on port A for dual fiber
2653 * regardless of eeprom setting */
2654 if (sc->sc_funcid == 1)
2655 sc->sc_flags &= ~WM_F_WOL;
2656 break;
2657 case PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3:
2658 /* If quad port adapter, disable WoL on all but port A */
2659 if (sc->sc_funcid != 0)
2660 sc->sc_flags &= ~WM_F_WOL;
2661 break;
2662 case PCI_PRODUCT_INTEL_82571EB_FIBER:
2663 /* Wake events only supported on port A for dual fiber
2664 * regardless of eeprom setting */
2665 if (sc->sc_funcid == 1)
2666 sc->sc_flags &= ~WM_F_WOL;
2667 break;
2668 case PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER:
2669 case PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER:
2670 case PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER:
2671 /* If quad port adapter, disable WoL on all but port A */
2672 if (sc->sc_funcid != 0)
2673 sc->sc_flags &= ~WM_F_WOL;
2674 break;
2675 }
2676
2677 if (sc->sc_type >= WM_T_82575) {
2678 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) {
2679 aprint_debug_dev(sc->sc_dev, "COMPAT = %hx\n",
2680 nvmword);
2681 if ((sc->sc_type == WM_T_82575) ||
2682 (sc->sc_type == WM_T_82576)) {
2683 /* Check NVM for autonegotiation */
2684 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE)
2685 != 0)
2686 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO;
2687 }
2688 if ((sc->sc_type == WM_T_82575) ||
2689 (sc->sc_type == WM_T_I350)) {
2690 if (nvmword & NVM_COMPAT_MAS_EN(sc->sc_funcid))
2691 sc->sc_flags |= WM_F_MAS;
2692 }
2693 }
2694 }
2695
2696 /*
2697 * XXX need special handling for some multiple port cards
2698 * to disable a paticular port.
2699 */
2700
2701 if (sc->sc_type >= WM_T_82544) {
2702 pn = prop_dictionary_get(dict, "i82543-swdpin");
2703 if (pn != NULL) {
2704 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2705 swdpin = (uint16_t) prop_number_signed_value(pn);
2706 } else {
2707 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) {
2708 aprint_error_dev(sc->sc_dev,
2709 "unable to read SWDPIN\n");
2710 goto out;
2711 }
2712 }
2713 }
2714
2715 if (cfg1 & NVM_CFG1_ILOS)
2716 sc->sc_ctrl |= CTRL_ILOS;
2717
2718 /*
2719 * XXX
2720 * This code isn't correct because pin 2 and 3 are located
2721 * in different position on newer chips. Check all datasheet.
2722 *
2723 * Until resolve this problem, check if a chip < 82580
2724 */
2725 if (sc->sc_type <= WM_T_82580) {
2726 if (sc->sc_type >= WM_T_82544) {
2727 sc->sc_ctrl |=
2728 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
2729 CTRL_SWDPIO_SHIFT;
2730 sc->sc_ctrl |=
2731 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
2732 CTRL_SWDPINS_SHIFT;
2733 } else {
2734 sc->sc_ctrl |=
2735 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) <<
2736 CTRL_SWDPIO_SHIFT;
2737 }
2738 }
2739
2740 if ((sc->sc_type >= WM_T_82580) && (sc->sc_type <= WM_T_I211)) {
2741 wm_nvm_read(sc,
2742 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA,
2743 1, &nvmword);
2744 if (nvmword & NVM_CFG3_ILOS)
2745 sc->sc_ctrl |= CTRL_ILOS;
2746 }
2747
2748 #if 0
2749 if (sc->sc_type >= WM_T_82544) {
2750 if (cfg1 & NVM_CFG1_IPS0)
2751 sc->sc_ctrl_ext |= CTRL_EXT_IPS;
2752 if (cfg1 & NVM_CFG1_IPS1)
2753 sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
2754 sc->sc_ctrl_ext |=
2755 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
2756 CTRL_EXT_SWDPIO_SHIFT;
2757 sc->sc_ctrl_ext |=
2758 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
2759 CTRL_EXT_SWDPINS_SHIFT;
2760 } else {
2761 sc->sc_ctrl_ext |=
2762 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) <<
2763 CTRL_EXT_SWDPIO_SHIFT;
2764 }
2765 #endif
2766
2767 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2768 #if 0
2769 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
2770 #endif
2771
2772 if (sc->sc_type == WM_T_PCH) {
2773 uint16_t val;
2774
2775 /* Save the NVM K1 bit setting */
2776 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val);
2777
2778 if ((val & NVM_K1_CONFIG_ENABLE) != 0)
2779 sc->sc_nvm_k1_enabled = 1;
2780 else
2781 sc->sc_nvm_k1_enabled = 0;
2782 }
2783
2784 /* Determine if we're GMII, TBI, SERDES or SGMII mode */
2785 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9
2786 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH
2787 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT
2788 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_PCH_CNP
2789 || sc->sc_type == WM_T_82573
2790 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) {
2791 /* Copper only */
2792 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2793 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350)
2794 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210)
2795 || (sc->sc_type ==WM_T_I211)) {
2796 reg = CSR_READ(sc, WMREG_CTRL_EXT);
2797 link_mode = reg & CTRL_EXT_LINK_MODE_MASK;
2798 switch (link_mode) {
2799 case CTRL_EXT_LINK_MODE_1000KX:
2800 aprint_normal_dev(sc->sc_dev, "1000KX\n");
2801 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2802 break;
2803 case CTRL_EXT_LINK_MODE_SGMII:
2804 if (wm_sgmii_uses_mdio(sc)) {
2805 aprint_normal_dev(sc->sc_dev,
2806 "SGMII(MDIO)\n");
2807 sc->sc_flags |= WM_F_SGMII;
2808 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2809 break;
2810 }
2811 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n");
2812 /*FALLTHROUGH*/
2813 case CTRL_EXT_LINK_MODE_PCIE_SERDES:
2814 sc->sc_mediatype = wm_sfp_get_media_type(sc);
2815 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) {
2816 if (link_mode
2817 == CTRL_EXT_LINK_MODE_SGMII) {
2818 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2819 sc->sc_flags |= WM_F_SGMII;
2820 aprint_verbose_dev(sc->sc_dev,
2821 "SGMII\n");
2822 } else {
2823 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2824 aprint_verbose_dev(sc->sc_dev,
2825 "SERDES\n");
2826 }
2827 break;
2828 }
2829 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
2830 aprint_normal_dev(sc->sc_dev, "SERDES(SFP)\n");
2831 else if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2832 aprint_normal_dev(sc->sc_dev, "SGMII(SFP)\n");
2833 sc->sc_flags |= WM_F_SGMII;
2834 }
2835 /* Do not change link mode for 100BaseFX */
2836 if (sc->sc_sfptype == SFF_SFP_ETH_FLAGS_100FX)
2837 break;
2838
2839 /* Change current link mode setting */
2840 reg &= ~CTRL_EXT_LINK_MODE_MASK;
2841 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2842 reg |= CTRL_EXT_LINK_MODE_SGMII;
2843 else
2844 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES;
2845 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2846 break;
2847 case CTRL_EXT_LINK_MODE_GMII:
2848 default:
2849 aprint_normal_dev(sc->sc_dev, "Copper\n");
2850 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2851 break;
2852 }
2853
2854 reg &= ~CTRL_EXT_I2C_ENA;
2855 if ((sc->sc_flags & WM_F_SGMII) != 0)
2856 reg |= CTRL_EXT_I2C_ENA;
2857 else
2858 reg &= ~CTRL_EXT_I2C_ENA;
2859 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2860 if ((sc->sc_flags & WM_F_SGMII) != 0) {
2861 wm_gmii_setup_phytype(sc, 0, 0);
2862 wm_reset_mdicnfg_82580(sc);
2863 }
2864 } else if (sc->sc_type < WM_T_82543 ||
2865 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
2866 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2867 aprint_error_dev(sc->sc_dev,
2868 "WARNING: TBIMODE set on 1000BASE-T product!\n");
2869 sc->sc_mediatype = WM_MEDIATYPE_FIBER;
2870 }
2871 } else {
2872 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) {
2873 aprint_error_dev(sc->sc_dev,
2874 "WARNING: TBIMODE clear on 1000BASE-X product!\n");
2875 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2876 }
2877 }
2878
2879 if (sc->sc_type >= WM_T_PCH2)
2880 sc->sc_flags |= WM_F_EEE;
2881 else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211)
2882 && (sc->sc_mediatype == WM_MEDIATYPE_COPPER)) {
2883 /* XXX: Need special handling for I354. (not yet) */
2884 if (sc->sc_type != WM_T_I354)
2885 sc->sc_flags |= WM_F_EEE;
2886 }
2887
2888 /* Set device properties (macflags) */
2889 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags);
2890
2891 if (sc->sc_flags != 0) {
2892 snprintb(buf, sizeof(buf), WM_FLAGS, sc->sc_flags);
2893 aprint_verbose_dev(sc->sc_dev, "%s\n", buf);
2894 }
2895
2896 #ifdef WM_MPSAFE
2897 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2898 #else
2899 sc->sc_core_lock = NULL;
2900 #endif
2901
2902 /* Initialize the media structures accordingly. */
2903 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2904 wm_gmii_mediainit(sc, wmp->wmp_product);
2905 else
2906 wm_tbi_mediainit(sc); /* All others */
2907
2908 ifp = &sc->sc_ethercom.ec_if;
2909 xname = device_xname(sc->sc_dev);
2910 strlcpy(ifp->if_xname, xname, IFNAMSIZ);
2911 ifp->if_softc = sc;
2912 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2913 #ifdef WM_MPSAFE
2914 ifp->if_extflags = IFEF_MPSAFE;
2915 #endif
2916 ifp->if_ioctl = wm_ioctl;
2917 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
2918 ifp->if_start = wm_nq_start;
2919 /*
2920 * When the number of CPUs is one and the controller can use
2921 * MSI-X, wm(4) use MSI-X but *does not* use multiqueue.
2922 * That is, wm(4) use two interrupts, one is used for Tx/Rx
2923 * and the other is used for link status changing.
2924 * In this situation, wm_nq_transmit() is disadvantageous
2925 * because of wm_select_txqueue() and pcq(9) overhead.
2926 */
2927 if (wm_is_using_multiqueue(sc))
2928 ifp->if_transmit = wm_nq_transmit;
2929 } else {
2930 ifp->if_start = wm_start;
2931 /*
2932 * wm_transmit() has the same disadvantage as wm_transmit().
2933 */
2934 if (wm_is_using_multiqueue(sc))
2935 ifp->if_transmit = wm_transmit;
2936 }
2937 /* wm(4) doest not use ifp->if_watchdog, use wm_tick as watchdog. */
2938 ifp->if_init = wm_init;
2939 ifp->if_stop = wm_stop;
2940 IFQ_SET_MAXLEN(&ifp->if_snd, uimax(WM_IFQUEUELEN, IFQ_MAXLEN));
2941 IFQ_SET_READY(&ifp->if_snd);
2942
2943 /* Check for jumbo frame */
2944 switch (sc->sc_type) {
2945 case WM_T_82573:
2946 /* XXX limited to 9234 if ASPM is disabled */
2947 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword);
2948 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0)
2949 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2950 break;
2951 case WM_T_82571:
2952 case WM_T_82572:
2953 case WM_T_82574:
2954 case WM_T_82583:
2955 case WM_T_82575:
2956 case WM_T_82576:
2957 case WM_T_82580:
2958 case WM_T_I350:
2959 case WM_T_I354:
2960 case WM_T_I210:
2961 case WM_T_I211:
2962 case WM_T_80003:
2963 case WM_T_ICH9:
2964 case WM_T_ICH10:
2965 case WM_T_PCH2: /* PCH2 supports 9K frame size */
2966 case WM_T_PCH_LPT:
2967 case WM_T_PCH_SPT:
2968 case WM_T_PCH_CNP:
2969 /* XXX limited to 9234 */
2970 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2971 break;
2972 case WM_T_PCH:
2973 /* XXX limited to 4096 */
2974 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2975 break;
2976 case WM_T_82542_2_0:
2977 case WM_T_82542_2_1:
2978 case WM_T_ICH8:
2979 /* No support for jumbo frame */
2980 break;
2981 default:
2982 /* ETHER_MAX_LEN_JUMBO */
2983 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2984 break;
2985 }
2986
2987 /* If we're a i82543 or greater, we can support VLANs. */
2988 if (sc->sc_type >= WM_T_82543) {
2989 sc->sc_ethercom.ec_capabilities |=
2990 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING;
2991 sc->sc_ethercom.ec_capenable |= ETHERCAP_VLAN_HWTAGGING;
2992 }
2993
2994 if ((sc->sc_flags & WM_F_EEE) != 0)
2995 sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE;
2996
2997 /*
2998 * We can perform TCPv4 and UDPv4 checkums in-bound. Only
2999 * on i82543 and later.
3000 */
3001 if (sc->sc_type >= WM_T_82543) {
3002 ifp->if_capabilities |=
3003 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
3004 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
3005 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
3006 IFCAP_CSUM_TCPv6_Tx |
3007 IFCAP_CSUM_UDPv6_Tx;
3008 }
3009
3010 /*
3011 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL.
3012 *
3013 * 82541GI (8086:1076) ... no
3014 * 82572EI (8086:10b9) ... yes
3015 */
3016 if (sc->sc_type >= WM_T_82571) {
3017 ifp->if_capabilities |=
3018 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
3019 }
3020
3021 /*
3022 * If we're a i82544 or greater (except i82547), we can do
3023 * TCP segmentation offload.
3024 */
3025 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) {
3026 ifp->if_capabilities |= IFCAP_TSOv4;
3027 }
3028
3029 if (sc->sc_type >= WM_T_82571) {
3030 ifp->if_capabilities |= IFCAP_TSOv6;
3031 }
3032
3033 sc->sc_tx_process_limit = WM_TX_PROCESS_LIMIT_DEFAULT;
3034 sc->sc_tx_intr_process_limit = WM_TX_INTR_PROCESS_LIMIT_DEFAULT;
3035 sc->sc_rx_process_limit = WM_RX_PROCESS_LIMIT_DEFAULT;
3036 sc->sc_rx_intr_process_limit = WM_RX_INTR_PROCESS_LIMIT_DEFAULT;
3037
3038 /* Attach the interface. */
3039 error = if_initialize(ifp);
3040 if (error != 0) {
3041 aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
3042 error);
3043 return; /* Error */
3044 }
3045 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if);
3046 ether_ifattach(ifp, enaddr);
3047 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb);
3048 if_register(ifp);
3049 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET,
3050 RND_FLAG_DEFAULT);
3051
3052 #ifdef WM_EVENT_COUNTERS
3053 /* Attach event counters. */
3054 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
3055 NULL, xname, "linkintr");
3056
3057 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC,
3058 NULL, xname, "tx_xoff");
3059 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC,
3060 NULL, xname, "tx_xon");
3061 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC,
3062 NULL, xname, "rx_xoff");
3063 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC,
3064 NULL, xname, "rx_xon");
3065 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC,
3066 NULL, xname, "rx_macctl");
3067 #endif /* WM_EVENT_COUNTERS */
3068
3069 sc->sc_txrx_use_workqueue = false;
3070
3071 wm_init_sysctls(sc);
3072
3073 if (pmf_device_register(self, wm_suspend, wm_resume))
3074 pmf_class_network_register(self, ifp);
3075 else
3076 aprint_error_dev(self, "couldn't establish power handler\n");
3077
3078 sc->sc_flags |= WM_F_ATTACHED;
3079 out:
3080 return;
3081 }
3082
3083 /* The detach function (ca_detach) */
3084 static int
3085 wm_detach(device_t self, int flags __unused)
3086 {
3087 struct wm_softc *sc = device_private(self);
3088 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3089 int i;
3090
3091 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
3092 return 0;
3093
3094 /* Stop the interface. Callouts are stopped in it. */
3095 wm_stop(ifp, 1);
3096
3097 pmf_device_deregister(self);
3098
3099 sysctl_teardown(&sc->sc_sysctllog);
3100
3101 #ifdef WM_EVENT_COUNTERS
3102 evcnt_detach(&sc->sc_ev_linkintr);
3103
3104 evcnt_detach(&sc->sc_ev_tx_xoff);
3105 evcnt_detach(&sc->sc_ev_tx_xon);
3106 evcnt_detach(&sc->sc_ev_rx_xoff);
3107 evcnt_detach(&sc->sc_ev_rx_xon);
3108 evcnt_detach(&sc->sc_ev_rx_macctl);
3109 #endif /* WM_EVENT_COUNTERS */
3110
3111 rnd_detach_source(&sc->rnd_source);
3112
3113 /* Tell the firmware about the release */
3114 WM_CORE_LOCK(sc);
3115 wm_release_manageability(sc);
3116 wm_release_hw_control(sc);
3117 wm_enable_wakeup(sc);
3118 WM_CORE_UNLOCK(sc);
3119
3120 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
3121
3122 ether_ifdetach(ifp);
3123 if_detach(ifp);
3124 if_percpuq_destroy(sc->sc_ipq);
3125
3126 /* Delete all remaining media. */
3127 ifmedia_fini(&sc->sc_mii.mii_media);
3128
3129 /* Unload RX dmamaps and free mbufs */
3130 for (i = 0; i < sc->sc_nqueues; i++) {
3131 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
3132 mutex_enter(rxq->rxq_lock);
3133 wm_rxdrain(rxq);
3134 mutex_exit(rxq->rxq_lock);
3135 }
3136 /* Must unlock here */
3137
3138 /* Disestablish the interrupt handler */
3139 for (i = 0; i < sc->sc_nintrs; i++) {
3140 if (sc->sc_ihs[i] != NULL) {
3141 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
3142 sc->sc_ihs[i] = NULL;
3143 }
3144 }
3145 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs);
3146
3147 /* wm_stop() ensure workqueue is stopped. */
3148 workqueue_destroy(sc->sc_queue_wq);
3149
3150 for (i = 0; i < sc->sc_nqueues; i++)
3151 softint_disestablish(sc->sc_queue[i].wmq_si);
3152
3153 wm_free_txrx_queues(sc);
3154
3155 /* Unmap the registers */
3156 if (sc->sc_ss) {
3157 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss);
3158 sc->sc_ss = 0;
3159 }
3160 if (sc->sc_ios) {
3161 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
3162 sc->sc_ios = 0;
3163 }
3164 if (sc->sc_flashs) {
3165 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs);
3166 sc->sc_flashs = 0;
3167 }
3168
3169 if (sc->sc_core_lock)
3170 mutex_obj_free(sc->sc_core_lock);
3171 if (sc->sc_ich_phymtx)
3172 mutex_obj_free(sc->sc_ich_phymtx);
3173 if (sc->sc_ich_nvmmtx)
3174 mutex_obj_free(sc->sc_ich_nvmmtx);
3175
3176 return 0;
3177 }
3178
3179 static bool
3180 wm_suspend(device_t self, const pmf_qual_t *qual)
3181 {
3182 struct wm_softc *sc = device_private(self);
3183
3184 wm_release_manageability(sc);
3185 wm_release_hw_control(sc);
3186 wm_enable_wakeup(sc);
3187
3188 return true;
3189 }
3190
3191 static bool
3192 wm_resume(device_t self, const pmf_qual_t *qual)
3193 {
3194 struct wm_softc *sc = device_private(self);
3195 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3196 pcireg_t reg;
3197 char buf[256];
3198
3199 reg = CSR_READ(sc, WMREG_WUS);
3200 if (reg != 0) {
3201 snprintb(buf, sizeof(buf), WUS_FLAGS, reg);
3202 device_printf(sc->sc_dev, "wakeup status %s\n", buf);
3203 CSR_WRITE(sc, WMREG_WUS, 0xffffffff); /* W1C */
3204 }
3205
3206 if (sc->sc_type >= WM_T_PCH2)
3207 wm_resume_workarounds_pchlan(sc);
3208 if ((ifp->if_flags & IFF_UP) == 0) {
3209 wm_reset(sc);
3210 /* Non-AMT based hardware can now take control from firmware */
3211 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
3212 wm_get_hw_control(sc);
3213 wm_init_manageability(sc);
3214 } else {
3215 /*
3216 * We called pmf_class_network_register(), so if_init() is
3217 * automatically called when IFF_UP. wm_reset(),
3218 * wm_get_hw_control() and wm_init_manageability() are called
3219 * via wm_init().
3220 */
3221 }
3222
3223 return true;
3224 }
3225
3226 /*
3227 * wm_watchdog: [ifnet interface function]
3228 *
3229 * Watchdog timer handler.
3230 */
3231 static void
3232 wm_watchdog(struct ifnet *ifp)
3233 {
3234 int qid;
3235 struct wm_softc *sc = ifp->if_softc;
3236 uint16_t hang_queue = 0; /* Max queue number of wm(4) is 82576's 16. */
3237
3238 for (qid = 0; qid < sc->sc_nqueues; qid++) {
3239 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq;
3240
3241 wm_watchdog_txq(ifp, txq, &hang_queue);
3242 }
3243
3244 /* IF any of queues hanged up, reset the interface. */
3245 if (hang_queue != 0) {
3246 (void)wm_init(ifp);
3247
3248 /*
3249 * There are still some upper layer processing which call
3250 * ifp->if_start(). e.g. ALTQ or one CPU system
3251 */
3252 /* Try to get more packets going. */
3253 ifp->if_start(ifp);
3254 }
3255 }
3256
3257
3258 static void
3259 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang)
3260 {
3261
3262 mutex_enter(txq->txq_lock);
3263 if (txq->txq_sending &&
3264 time_uptime - txq->txq_lastsent > wm_watchdog_timeout)
3265 wm_watchdog_txq_locked(ifp, txq, hang);
3266
3267 mutex_exit(txq->txq_lock);
3268 }
3269
3270 static void
3271 wm_watchdog_txq_locked(struct ifnet *ifp, struct wm_txqueue *txq,
3272 uint16_t *hang)
3273 {
3274 struct wm_softc *sc = ifp->if_softc;
3275 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
3276
3277 KASSERT(mutex_owned(txq->txq_lock));
3278
3279 /*
3280 * Since we're using delayed interrupts, sweep up
3281 * before we report an error.
3282 */
3283 wm_txeof(txq, UINT_MAX);
3284
3285 if (txq->txq_sending)
3286 *hang |= __BIT(wmq->wmq_id);
3287
3288 if (txq->txq_free == WM_NTXDESC(txq)) {
3289 log(LOG_ERR, "%s: device timeout (lost interrupt)\n",
3290 device_xname(sc->sc_dev));
3291 } else {
3292 #ifdef WM_DEBUG
3293 int i, j;
3294 struct wm_txsoft *txs;
3295 #endif
3296 log(LOG_ERR,
3297 "%s: device timeout (txfree %d txsfree %d txnext %d)\n",
3298 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree,
3299 txq->txq_next);
3300 if_statinc(ifp, if_oerrors);
3301 #ifdef WM_DEBUG
3302 for (i = txq->txq_sdirty; i != txq->txq_snext;
3303 i = WM_NEXTTXS(txq, i)) {
3304 txs = &txq->txq_soft[i];
3305 printf("txs %d tx %d -> %d\n",
3306 i, txs->txs_firstdesc, txs->txs_lastdesc);
3307 for (j = txs->txs_firstdesc; ; j = WM_NEXTTX(txq, j)) {
3308 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
3309 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3310 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr);
3311 printf("\t %#08x%08x\n",
3312 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields,
3313 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen);
3314 } else {
3315 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3316 (uint64_t)txq->txq_descs[j].wtx_addr.wa_high << 32 |
3317 txq->txq_descs[j].wtx_addr.wa_low);
3318 printf("\t %#04x%02x%02x%08x\n",
3319 txq->txq_descs[j].wtx_fields.wtxu_vlan,
3320 txq->txq_descs[j].wtx_fields.wtxu_options,
3321 txq->txq_descs[j].wtx_fields.wtxu_status,
3322 txq->txq_descs[j].wtx_cmdlen);
3323 }
3324 if (j == txs->txs_lastdesc)
3325 break;
3326 }
3327 }
3328 #endif
3329 }
3330 }
3331
3332 /*
3333 * wm_tick:
3334 *
3335 * One second timer, used to check link status, sweep up
3336 * completed transmit jobs, etc.
3337 */
3338 static void
3339 wm_tick(void *arg)
3340 {
3341 struct wm_softc *sc = arg;
3342 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3343 #ifndef WM_MPSAFE
3344 int s = splnet();
3345 #endif
3346
3347 WM_CORE_LOCK(sc);
3348
3349 if (sc->sc_core_stopping) {
3350 WM_CORE_UNLOCK(sc);
3351 #ifndef WM_MPSAFE
3352 splx(s);
3353 #endif
3354 return;
3355 }
3356
3357 if (sc->sc_type >= WM_T_82542_2_1) {
3358 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
3359 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
3360 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
3361 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
3362 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
3363 }
3364
3365 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
3366 if_statadd_ref(nsr, if_collisions, CSR_READ(sc, WMREG_COLC));
3367 if_statadd_ref(nsr, if_ierrors, 0ULL /* ensure quad_t */
3368 + CSR_READ(sc, WMREG_CRCERRS)
3369 + CSR_READ(sc, WMREG_ALGNERRC)
3370 + CSR_READ(sc, WMREG_SYMERRC)
3371 + CSR_READ(sc, WMREG_RXERRC)
3372 + CSR_READ(sc, WMREG_SEC)
3373 + CSR_READ(sc, WMREG_CEXTERR)
3374 + CSR_READ(sc, WMREG_RLEC));
3375 /*
3376 * WMREG_RNBC is incremented when there is no available buffers in host
3377 * memory. It does not mean the number of dropped packet. Because
3378 * ethernet controller can receive packets in such case if there is
3379 * space in phy's FIFO.
3380 *
3381 * If you want to know the nubmer of WMREG_RMBC, you should use such as
3382 * own EVCNT instead of if_iqdrops.
3383 */
3384 if_statadd_ref(nsr, if_iqdrops, CSR_READ(sc, WMREG_MPC));
3385 IF_STAT_PUTREF(ifp);
3386
3387 if (sc->sc_flags & WM_F_HAS_MII)
3388 mii_tick(&sc->sc_mii);
3389 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)
3390 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
3391 wm_serdes_tick(sc);
3392 else
3393 wm_tbi_tick(sc);
3394
3395 WM_CORE_UNLOCK(sc);
3396
3397 wm_watchdog(ifp);
3398
3399 callout_schedule(&sc->sc_tick_ch, hz);
3400 }
3401
3402 static int
3403 wm_ifflags_cb(struct ethercom *ec)
3404 {
3405 struct ifnet *ifp = &ec->ec_if;
3406 struct wm_softc *sc = ifp->if_softc;
3407 u_short iffchange;
3408 int ecchange;
3409 bool needreset = false;
3410 int rc = 0;
3411
3412 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3413 device_xname(sc->sc_dev), __func__));
3414
3415 WM_CORE_LOCK(sc);
3416
3417 /*
3418 * Check for if_flags.
3419 * Main usage is to prevent linkdown when opening bpf.
3420 */
3421 iffchange = ifp->if_flags ^ sc->sc_if_flags;
3422 sc->sc_if_flags = ifp->if_flags;
3423 if ((iffchange & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
3424 needreset = true;
3425 goto ec;
3426 }
3427
3428 /* iff related updates */
3429 if ((iffchange & IFF_PROMISC) != 0)
3430 wm_set_filter(sc);
3431
3432 wm_set_vlan(sc);
3433
3434 ec:
3435 /* Check for ec_capenable. */
3436 ecchange = ec->ec_capenable ^ sc->sc_ec_capenable;
3437 sc->sc_ec_capenable = ec->ec_capenable;
3438 if ((ecchange & ~ETHERCAP_EEE) != 0) {
3439 needreset = true;
3440 goto out;
3441 }
3442
3443 /* ec related updates */
3444 wm_set_eee(sc);
3445
3446 out:
3447 if (needreset)
3448 rc = ENETRESET;
3449 WM_CORE_UNLOCK(sc);
3450
3451 return rc;
3452 }
3453
3454 /*
3455 * wm_ioctl: [ifnet interface function]
3456 *
3457 * Handle control requests from the operator.
3458 */
3459 static int
3460 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
3461 {
3462 struct wm_softc *sc = ifp->if_softc;
3463 struct ifreq *ifr = (struct ifreq *)data;
3464 struct ifaddr *ifa = (struct ifaddr *)data;
3465 struct sockaddr_dl *sdl;
3466 int s, error;
3467
3468 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3469 device_xname(sc->sc_dev), __func__));
3470
3471 #ifndef WM_MPSAFE
3472 s = splnet();
3473 #endif
3474 switch (cmd) {
3475 case SIOCSIFMEDIA:
3476 WM_CORE_LOCK(sc);
3477 /* Flow control requires full-duplex mode. */
3478 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
3479 (ifr->ifr_media & IFM_FDX) == 0)
3480 ifr->ifr_media &= ~IFM_ETH_FMASK;
3481 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
3482 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
3483 /* We can do both TXPAUSE and RXPAUSE. */
3484 ifr->ifr_media |=
3485 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
3486 }
3487 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
3488 }
3489 WM_CORE_UNLOCK(sc);
3490 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
3491 break;
3492 case SIOCINITIFADDR:
3493 WM_CORE_LOCK(sc);
3494 if (ifa->ifa_addr->sa_family == AF_LINK) {
3495 sdl = satosdl(ifp->if_dl->ifa_addr);
3496 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len,
3497 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen);
3498 /* Unicast address is the first multicast entry */
3499 wm_set_filter(sc);
3500 error = 0;
3501 WM_CORE_UNLOCK(sc);
3502 break;
3503 }
3504 WM_CORE_UNLOCK(sc);
3505 /*FALLTHROUGH*/
3506 default:
3507 #ifdef WM_MPSAFE
3508 s = splnet();
3509 #endif
3510 /* It may call wm_start, so unlock here */
3511 error = ether_ioctl(ifp, cmd, data);
3512 #ifdef WM_MPSAFE
3513 splx(s);
3514 #endif
3515 if (error != ENETRESET)
3516 break;
3517
3518 error = 0;
3519
3520 if (cmd == SIOCSIFCAP)
3521 error = (*ifp->if_init)(ifp);
3522 else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
3523 ;
3524 else if (ifp->if_flags & IFF_RUNNING) {
3525 /*
3526 * Multicast list has changed; set the hardware filter
3527 * accordingly.
3528 */
3529 WM_CORE_LOCK(sc);
3530 wm_set_filter(sc);
3531 WM_CORE_UNLOCK(sc);
3532 }
3533 break;
3534 }
3535
3536 #ifndef WM_MPSAFE
3537 splx(s);
3538 #endif
3539 return error;
3540 }
3541
3542 /* MAC address related */
3543
3544 /*
3545 * Get the offset of MAC address and return it.
3546 * If error occured, use offset 0.
3547 */
3548 static uint16_t
3549 wm_check_alt_mac_addr(struct wm_softc *sc)
3550 {
3551 uint16_t myea[ETHER_ADDR_LEN / 2];
3552 uint16_t offset = NVM_OFF_MACADDR;
3553
3554 /* Try to read alternative MAC address pointer */
3555 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0)
3556 return 0;
3557
3558 /* Check pointer if it's valid or not. */
3559 if ((offset == 0x0000) || (offset == 0xffff))
3560 return 0;
3561
3562 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid);
3563 /*
3564 * Check whether alternative MAC address is valid or not.
3565 * Some cards have non 0xffff pointer but those don't use
3566 * alternative MAC address in reality.
3567 *
3568 * Check whether the broadcast bit is set or not.
3569 */
3570 if (wm_nvm_read(sc, offset, 1, myea) == 0)
3571 if (((myea[0] & 0xff) & 0x01) == 0)
3572 return offset; /* Found */
3573
3574 /* Not found */
3575 return 0;
3576 }
3577
3578 static int
3579 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr)
3580 {
3581 uint16_t myea[ETHER_ADDR_LEN / 2];
3582 uint16_t offset = NVM_OFF_MACADDR;
3583 int do_invert = 0;
3584
3585 switch (sc->sc_type) {
3586 case WM_T_82580:
3587 case WM_T_I350:
3588 case WM_T_I354:
3589 /* EEPROM Top Level Partitioning */
3590 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0;
3591 break;
3592 case WM_T_82571:
3593 case WM_T_82575:
3594 case WM_T_82576:
3595 case WM_T_80003:
3596 case WM_T_I210:
3597 case WM_T_I211:
3598 offset = wm_check_alt_mac_addr(sc);
3599 if (offset == 0)
3600 if ((sc->sc_funcid & 0x01) == 1)
3601 do_invert = 1;
3602 break;
3603 default:
3604 if ((sc->sc_funcid & 0x01) == 1)
3605 do_invert = 1;
3606 break;
3607 }
3608
3609 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0)
3610 goto bad;
3611
3612 enaddr[0] = myea[0] & 0xff;
3613 enaddr[1] = myea[0] >> 8;
3614 enaddr[2] = myea[1] & 0xff;
3615 enaddr[3] = myea[1] >> 8;
3616 enaddr[4] = myea[2] & 0xff;
3617 enaddr[5] = myea[2] >> 8;
3618
3619 /*
3620 * Toggle the LSB of the MAC address on the second port
3621 * of some dual port cards.
3622 */
3623 if (do_invert != 0)
3624 enaddr[5] ^= 1;
3625
3626 return 0;
3627
3628 bad:
3629 return -1;
3630 }
3631
3632 /*
3633 * wm_set_ral:
3634 *
3635 * Set an entery in the receive address list.
3636 */
3637 static void
3638 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
3639 {
3640 uint32_t ral_lo, ral_hi, addrl, addrh;
3641 uint32_t wlock_mac;
3642 int rv;
3643
3644 if (enaddr != NULL) {
3645 ral_lo = (uint32_t)enaddr[0] | ((uint32_t)enaddr[1] << 8) |
3646 ((uint32_t)enaddr[2] << 16) | ((uint32_t)enaddr[3] << 24);
3647 ral_hi = (uint32_t)enaddr[4] | ((uint32_t)enaddr[5] << 8);
3648 ral_hi |= RAL_AV;
3649 } else {
3650 ral_lo = 0;
3651 ral_hi = 0;
3652 }
3653
3654 switch (sc->sc_type) {
3655 case WM_T_82542_2_0:
3656 case WM_T_82542_2_1:
3657 case WM_T_82543:
3658 CSR_WRITE(sc, WMREG_RAL(idx), ral_lo);
3659 CSR_WRITE_FLUSH(sc);
3660 CSR_WRITE(sc, WMREG_RAH(idx), ral_hi);
3661 CSR_WRITE_FLUSH(sc);
3662 break;
3663 case WM_T_PCH2:
3664 case WM_T_PCH_LPT:
3665 case WM_T_PCH_SPT:
3666 case WM_T_PCH_CNP:
3667 if (idx == 0) {
3668 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3669 CSR_WRITE_FLUSH(sc);
3670 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3671 CSR_WRITE_FLUSH(sc);
3672 return;
3673 }
3674 if (sc->sc_type != WM_T_PCH2) {
3675 wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM),
3676 FWSM_WLOCK_MAC);
3677 addrl = WMREG_SHRAL(idx - 1);
3678 addrh = WMREG_SHRAH(idx - 1);
3679 } else {
3680 wlock_mac = 0;
3681 addrl = WMREG_PCH_LPT_SHRAL(idx - 1);
3682 addrh = WMREG_PCH_LPT_SHRAH(idx - 1);
3683 }
3684
3685 if ((wlock_mac == 0) || (idx <= wlock_mac)) {
3686 rv = wm_get_swflag_ich8lan(sc);
3687 if (rv != 0)
3688 return;
3689 CSR_WRITE(sc, addrl, ral_lo);
3690 CSR_WRITE_FLUSH(sc);
3691 CSR_WRITE(sc, addrh, ral_hi);
3692 CSR_WRITE_FLUSH(sc);
3693 wm_put_swflag_ich8lan(sc);
3694 }
3695
3696 break;
3697 default:
3698 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3699 CSR_WRITE_FLUSH(sc);
3700 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3701 CSR_WRITE_FLUSH(sc);
3702 break;
3703 }
3704 }
3705
3706 /*
3707 * wm_mchash:
3708 *
3709 * Compute the hash of the multicast address for the 4096-bit
3710 * multicast filter.
3711 */
3712 static uint32_t
3713 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
3714 {
3715 static const int lo_shift[4] = { 4, 3, 2, 0 };
3716 static const int hi_shift[4] = { 4, 5, 6, 8 };
3717 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 };
3718 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 };
3719 uint32_t hash;
3720
3721 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3722 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3723 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3724 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){
3725 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) |
3726 (((uint16_t)enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]);
3727 return (hash & 0x3ff);
3728 }
3729 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
3730 (((uint16_t)enaddr[5]) << hi_shift[sc->sc_mchash_type]);
3731
3732 return (hash & 0xfff);
3733 }
3734
3735 /*
3736 *
3737 *
3738 */
3739 static int
3740 wm_rar_count(struct wm_softc *sc)
3741 {
3742 int size;
3743
3744 switch (sc->sc_type) {
3745 case WM_T_ICH8:
3746 size = WM_RAL_TABSIZE_ICH8 -1;
3747 break;
3748 case WM_T_ICH9:
3749 case WM_T_ICH10:
3750 case WM_T_PCH:
3751 size = WM_RAL_TABSIZE_ICH8;
3752 break;
3753 case WM_T_PCH2:
3754 size = WM_RAL_TABSIZE_PCH2;
3755 break;
3756 case WM_T_PCH_LPT:
3757 case WM_T_PCH_SPT:
3758 case WM_T_PCH_CNP:
3759 size = WM_RAL_TABSIZE_PCH_LPT;
3760 break;
3761 case WM_T_82575:
3762 case WM_T_I210:
3763 case WM_T_I211:
3764 size = WM_RAL_TABSIZE_82575;
3765 break;
3766 case WM_T_82576:
3767 case WM_T_82580:
3768 size = WM_RAL_TABSIZE_82576;
3769 break;
3770 case WM_T_I350:
3771 case WM_T_I354:
3772 size = WM_RAL_TABSIZE_I350;
3773 break;
3774 default:
3775 size = WM_RAL_TABSIZE;
3776 }
3777
3778 return size;
3779 }
3780
3781 /*
3782 * wm_set_filter:
3783 *
3784 * Set up the receive filter.
3785 */
3786 static void
3787 wm_set_filter(struct wm_softc *sc)
3788 {
3789 struct ethercom *ec = &sc->sc_ethercom;
3790 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3791 struct ether_multi *enm;
3792 struct ether_multistep step;
3793 bus_addr_t mta_reg;
3794 uint32_t hash, reg, bit;
3795 int i, size, ralmax;
3796
3797 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3798 device_xname(sc->sc_dev), __func__));
3799
3800 if (sc->sc_type >= WM_T_82544)
3801 mta_reg = WMREG_CORDOVA_MTA;
3802 else
3803 mta_reg = WMREG_MTA;
3804
3805 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
3806
3807 if (ifp->if_flags & IFF_BROADCAST)
3808 sc->sc_rctl |= RCTL_BAM;
3809 if (ifp->if_flags & IFF_PROMISC) {
3810 sc->sc_rctl |= RCTL_UPE;
3811 ETHER_LOCK(ec);
3812 ec->ec_flags |= ETHER_F_ALLMULTI;
3813 ETHER_UNLOCK(ec);
3814 goto allmulti;
3815 }
3816
3817 /*
3818 * Set the station address in the first RAL slot, and
3819 * clear the remaining slots.
3820 */
3821 size = wm_rar_count(sc);
3822 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0);
3823
3824 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
3825 || (sc->sc_type == WM_T_PCH_CNP)) {
3826 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC);
3827 switch (i) {
3828 case 0:
3829 /* We can use all entries */
3830 ralmax = size;
3831 break;
3832 case 1:
3833 /* Only RAR[0] */
3834 ralmax = 1;
3835 break;
3836 default:
3837 /* Available SHRA + RAR[0] */
3838 ralmax = i + 1;
3839 }
3840 } else
3841 ralmax = size;
3842 for (i = 1; i < size; i++) {
3843 if (i < ralmax)
3844 wm_set_ral(sc, NULL, i);
3845 }
3846
3847 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3848 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3849 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3850 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP))
3851 size = WM_ICH8_MC_TABSIZE;
3852 else
3853 size = WM_MC_TABSIZE;
3854 /* Clear out the multicast table. */
3855 for (i = 0; i < size; i++) {
3856 CSR_WRITE(sc, mta_reg + (i << 2), 0);
3857 CSR_WRITE_FLUSH(sc);
3858 }
3859
3860 ETHER_LOCK(ec);
3861 ETHER_FIRST_MULTI(step, ec, enm);
3862 while (enm != NULL) {
3863 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
3864 ec->ec_flags |= ETHER_F_ALLMULTI;
3865 ETHER_UNLOCK(ec);
3866 /*
3867 * We must listen to a range of multicast addresses.
3868 * For now, just accept all multicasts, rather than
3869 * trying to set only those filter bits needed to match
3870 * the range. (At this time, the only use of address
3871 * ranges is for IP multicast routing, for which the
3872 * range is big enough to require all bits set.)
3873 */
3874 goto allmulti;
3875 }
3876
3877 hash = wm_mchash(sc, enm->enm_addrlo);
3878
3879 reg = (hash >> 5);
3880 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3881 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3882 || (sc->sc_type == WM_T_PCH2)
3883 || (sc->sc_type == WM_T_PCH_LPT)
3884 || (sc->sc_type == WM_T_PCH_SPT)
3885 || (sc->sc_type == WM_T_PCH_CNP))
3886 reg &= 0x1f;
3887 else
3888 reg &= 0x7f;
3889 bit = hash & 0x1f;
3890
3891 hash = CSR_READ(sc, mta_reg + (reg << 2));
3892 hash |= 1U << bit;
3893
3894 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) {
3895 /*
3896 * 82544 Errata 9: Certain register cannot be written
3897 * with particular alignments in PCI-X bus operation
3898 * (FCAH, MTA and VFTA).
3899 */
3900 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
3901 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3902 CSR_WRITE_FLUSH(sc);
3903 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
3904 CSR_WRITE_FLUSH(sc);
3905 } else {
3906 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3907 CSR_WRITE_FLUSH(sc);
3908 }
3909
3910 ETHER_NEXT_MULTI(step, enm);
3911 }
3912 ec->ec_flags &= ~ETHER_F_ALLMULTI;
3913 ETHER_UNLOCK(ec);
3914
3915 goto setit;
3916
3917 allmulti:
3918 sc->sc_rctl |= RCTL_MPE;
3919
3920 setit:
3921 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
3922 }
3923
3924 /* Reset and init related */
3925
3926 static void
3927 wm_set_vlan(struct wm_softc *sc)
3928 {
3929
3930 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3931 device_xname(sc->sc_dev), __func__));
3932
3933 /* Deal with VLAN enables. */
3934 if (VLAN_ATTACHED(&sc->sc_ethercom))
3935 sc->sc_ctrl |= CTRL_VME;
3936 else
3937 sc->sc_ctrl &= ~CTRL_VME;
3938
3939 /* Write the control registers. */
3940 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
3941 }
3942
3943 static void
3944 wm_set_pcie_completion_timeout(struct wm_softc *sc)
3945 {
3946 uint32_t gcr;
3947 pcireg_t ctrl2;
3948
3949 gcr = CSR_READ(sc, WMREG_GCR);
3950
3951 /* Only take action if timeout value is defaulted to 0 */
3952 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0)
3953 goto out;
3954
3955 if ((gcr & GCR_CAP_VER2) == 0) {
3956 gcr |= GCR_CMPL_TMOUT_10MS;
3957 goto out;
3958 }
3959
3960 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
3961 sc->sc_pcixe_capoff + PCIE_DCSR2);
3962 ctrl2 |= WM_PCIE_DCSR2_16MS;
3963 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
3964 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2);
3965
3966 out:
3967 /* Disable completion timeout resend */
3968 gcr &= ~GCR_CMPL_TMOUT_RESEND;
3969
3970 CSR_WRITE(sc, WMREG_GCR, gcr);
3971 }
3972
3973 void
3974 wm_get_auto_rd_done(struct wm_softc *sc)
3975 {
3976 int i;
3977
3978 /* wait for eeprom to reload */
3979 switch (sc->sc_type) {
3980 case WM_T_82571:
3981 case WM_T_82572:
3982 case WM_T_82573:
3983 case WM_T_82574:
3984 case WM_T_82583:
3985 case WM_T_82575:
3986 case WM_T_82576:
3987 case WM_T_82580:
3988 case WM_T_I350:
3989 case WM_T_I354:
3990 case WM_T_I210:
3991 case WM_T_I211:
3992 case WM_T_80003:
3993 case WM_T_ICH8:
3994 case WM_T_ICH9:
3995 for (i = 0; i < 10; i++) {
3996 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
3997 break;
3998 delay(1000);
3999 }
4000 if (i == 10) {
4001 log(LOG_ERR, "%s: auto read from eeprom failed to "
4002 "complete\n", device_xname(sc->sc_dev));
4003 }
4004 break;
4005 default:
4006 break;
4007 }
4008 }
4009
4010 void
4011 wm_lan_init_done(struct wm_softc *sc)
4012 {
4013 uint32_t reg = 0;
4014 int i;
4015
4016 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4017 device_xname(sc->sc_dev), __func__));
4018
4019 /* Wait for eeprom to reload */
4020 switch (sc->sc_type) {
4021 case WM_T_ICH10:
4022 case WM_T_PCH:
4023 case WM_T_PCH2:
4024 case WM_T_PCH_LPT:
4025 case WM_T_PCH_SPT:
4026 case WM_T_PCH_CNP:
4027 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) {
4028 reg = CSR_READ(sc, WMREG_STATUS);
4029 if ((reg & STATUS_LAN_INIT_DONE) != 0)
4030 break;
4031 delay(100);
4032 }
4033 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) {
4034 log(LOG_ERR, "%s: %s: lan_init_done failed to "
4035 "complete\n", device_xname(sc->sc_dev), __func__);
4036 }
4037 break;
4038 default:
4039 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
4040 __func__);
4041 break;
4042 }
4043
4044 reg &= ~STATUS_LAN_INIT_DONE;
4045 CSR_WRITE(sc, WMREG_STATUS, reg);
4046 }
4047
4048 void
4049 wm_get_cfg_done(struct wm_softc *sc)
4050 {
4051 int mask;
4052 uint32_t reg;
4053 int i;
4054
4055 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4056 device_xname(sc->sc_dev), __func__));
4057
4058 /* Wait for eeprom to reload */
4059 switch (sc->sc_type) {
4060 case WM_T_82542_2_0:
4061 case WM_T_82542_2_1:
4062 /* null */
4063 break;
4064 case WM_T_82543:
4065 case WM_T_82544:
4066 case WM_T_82540:
4067 case WM_T_82545:
4068 case WM_T_82545_3:
4069 case WM_T_82546:
4070 case WM_T_82546_3:
4071 case WM_T_82541:
4072 case WM_T_82541_2:
4073 case WM_T_82547:
4074 case WM_T_82547_2:
4075 case WM_T_82573:
4076 case WM_T_82574:
4077 case WM_T_82583:
4078 /* generic */
4079 delay(10*1000);
4080 break;
4081 case WM_T_80003:
4082 case WM_T_82571:
4083 case WM_T_82572:
4084 case WM_T_82575:
4085 case WM_T_82576:
4086 case WM_T_82580:
4087 case WM_T_I350:
4088 case WM_T_I354:
4089 case WM_T_I210:
4090 case WM_T_I211:
4091 if (sc->sc_type == WM_T_82571) {
4092 /* Only 82571 shares port 0 */
4093 mask = EEMNGCTL_CFGDONE_0;
4094 } else
4095 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid;
4096 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) {
4097 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask)
4098 break;
4099 delay(1000);
4100 }
4101 if (i >= WM_PHY_CFG_TIMEOUT)
4102 DPRINTF(WM_DEBUG_GMII, ("%s: %s failed\n",
4103 device_xname(sc->sc_dev), __func__));
4104 break;
4105 case WM_T_ICH8:
4106 case WM_T_ICH9:
4107 case WM_T_ICH10:
4108 case WM_T_PCH:
4109 case WM_T_PCH2:
4110 case WM_T_PCH_LPT:
4111 case WM_T_PCH_SPT:
4112 case WM_T_PCH_CNP:
4113 delay(10*1000);
4114 if (sc->sc_type >= WM_T_ICH10)
4115 wm_lan_init_done(sc);
4116 else
4117 wm_get_auto_rd_done(sc);
4118
4119 /* Clear PHY Reset Asserted bit */
4120 reg = CSR_READ(sc, WMREG_STATUS);
4121 if ((reg & STATUS_PHYRA) != 0)
4122 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA);
4123 break;
4124 default:
4125 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
4126 __func__);
4127 break;
4128 }
4129 }
4130
4131 int
4132 wm_phy_post_reset(struct wm_softc *sc)
4133 {
4134 device_t dev = sc->sc_dev;
4135 uint16_t reg;
4136 int rv = 0;
4137
4138 /* This function is only for ICH8 and newer. */
4139 if (sc->sc_type < WM_T_ICH8)
4140 return 0;
4141
4142 if (wm_phy_resetisblocked(sc)) {
4143 /* XXX */
4144 device_printf(dev, "PHY is blocked\n");
4145 return -1;
4146 }
4147
4148 /* Allow time for h/w to get to quiescent state after reset */
4149 delay(10*1000);
4150
4151 /* Perform any necessary post-reset workarounds */
4152 if (sc->sc_type == WM_T_PCH)
4153 rv = wm_hv_phy_workarounds_ich8lan(sc);
4154 else if (sc->sc_type == WM_T_PCH2)
4155 rv = wm_lv_phy_workarounds_ich8lan(sc);
4156 if (rv != 0)
4157 return rv;
4158
4159 /* Clear the host wakeup bit after lcd reset */
4160 if (sc->sc_type >= WM_T_PCH) {
4161 wm_gmii_hv_readreg(dev, 2, BM_PORT_GEN_CFG, ®);
4162 reg &= ~BM_WUC_HOST_WU_BIT;
4163 wm_gmii_hv_writereg(dev, 2, BM_PORT_GEN_CFG, reg);
4164 }
4165
4166 /* Configure the LCD with the extended configuration region in NVM */
4167 if ((rv = wm_init_lcd_from_nvm(sc)) != 0)
4168 return rv;
4169
4170 /* Configure the LCD with the OEM bits in NVM */
4171 rv = wm_oem_bits_config_ich8lan(sc, true);
4172
4173 if (sc->sc_type == WM_T_PCH2) {
4174 /* Ungate automatic PHY configuration on non-managed 82579 */
4175 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
4176 delay(10 * 1000);
4177 wm_gate_hw_phy_config_ich8lan(sc, false);
4178 }
4179 /* Set EEE LPI Update Timer to 200usec */
4180 rv = sc->phy.acquire(sc);
4181 if (rv)
4182 return rv;
4183 rv = wm_write_emi_reg_locked(dev,
4184 I82579_LPI_UPDATE_TIMER, 0x1387);
4185 sc->phy.release(sc);
4186 }
4187
4188 return rv;
4189 }
4190
4191 /* Only for PCH and newer */
4192 static int
4193 wm_write_smbus_addr(struct wm_softc *sc)
4194 {
4195 uint32_t strap, freq;
4196 uint16_t phy_data;
4197 int rv;
4198
4199 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4200 device_xname(sc->sc_dev), __func__));
4201 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP);
4202
4203 strap = CSR_READ(sc, WMREG_STRAP);
4204 freq = __SHIFTOUT(strap, STRAP_FREQ);
4205
4206 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_SMB_ADDR, &phy_data);
4207 if (rv != 0)
4208 return -1;
4209
4210 phy_data &= ~HV_SMB_ADDR_ADDR;
4211 phy_data |= __SHIFTOUT(strap, STRAP_SMBUSADDR);
4212 phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
4213
4214 if (sc->sc_phytype == WMPHY_I217) {
4215 /* Restore SMBus frequency */
4216 if (freq --) {
4217 phy_data &= ~(HV_SMB_ADDR_FREQ_LOW
4218 | HV_SMB_ADDR_FREQ_HIGH);
4219 phy_data |= __SHIFTIN((freq & 0x01) != 0,
4220 HV_SMB_ADDR_FREQ_LOW);
4221 phy_data |= __SHIFTIN((freq & 0x02) != 0,
4222 HV_SMB_ADDR_FREQ_HIGH);
4223 } else
4224 DPRINTF(WM_DEBUG_INIT,
4225 ("%s: %s Unsupported SMB frequency in PHY\n",
4226 device_xname(sc->sc_dev), __func__));
4227 }
4228
4229 return wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_SMB_ADDR,
4230 phy_data);
4231 }
4232
4233 static int
4234 wm_init_lcd_from_nvm(struct wm_softc *sc)
4235 {
4236 uint32_t extcnfctr, sw_cfg_mask, cnf_size, word_addr, i, reg;
4237 uint16_t phy_page = 0;
4238 int rv = 0;
4239
4240 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4241 device_xname(sc->sc_dev), __func__));
4242
4243 switch (sc->sc_type) {
4244 case WM_T_ICH8:
4245 if ((sc->sc_phytype == WMPHY_UNKNOWN)
4246 || (sc->sc_phytype != WMPHY_IGP_3))
4247 return 0;
4248
4249 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_AMT)
4250 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_LAN)) {
4251 sw_cfg_mask = FEXTNVM_SW_CONFIG;
4252 break;
4253 }
4254 /* FALLTHROUGH */
4255 case WM_T_PCH:
4256 case WM_T_PCH2:
4257 case WM_T_PCH_LPT:
4258 case WM_T_PCH_SPT:
4259 case WM_T_PCH_CNP:
4260 sw_cfg_mask = FEXTNVM_SW_CONFIG_ICH8M;
4261 break;
4262 default:
4263 return 0;
4264 }
4265
4266 if ((rv = sc->phy.acquire(sc)) != 0)
4267 return rv;
4268
4269 reg = CSR_READ(sc, WMREG_FEXTNVM);
4270 if ((reg & sw_cfg_mask) == 0)
4271 goto release;
4272
4273 /*
4274 * Make sure HW does not configure LCD from PHY extended configuration
4275 * before SW configuration
4276 */
4277 extcnfctr = CSR_READ(sc, WMREG_EXTCNFCTR);
4278 if ((sc->sc_type < WM_T_PCH2)
4279 && ((extcnfctr & EXTCNFCTR_PCIE_WRITE_ENABLE) != 0))
4280 goto release;
4281
4282 DPRINTF(WM_DEBUG_INIT, ("%s: %s: Configure LCD by software\n",
4283 device_xname(sc->sc_dev), __func__));
4284 /* word_addr is in DWORD */
4285 word_addr = __SHIFTOUT(extcnfctr, EXTCNFCTR_EXT_CNF_POINTER) << 1;
4286
4287 reg = CSR_READ(sc, WMREG_EXTCNFSIZE);
4288 cnf_size = __SHIFTOUT(reg, EXTCNFSIZE_LENGTH);
4289 if (cnf_size == 0)
4290 goto release;
4291
4292 if (((sc->sc_type == WM_T_PCH)
4293 && ((extcnfctr & EXTCNFCTR_OEM_WRITE_ENABLE) == 0))
4294 || (sc->sc_type > WM_T_PCH)) {
4295 /*
4296 * HW configures the SMBus address and LEDs when the OEM and
4297 * LCD Write Enable bits are set in the NVM. When both NVM bits
4298 * are cleared, SW will configure them instead.
4299 */
4300 DPRINTF(WM_DEBUG_INIT, ("%s: %s: Configure SMBus and LED\n",
4301 device_xname(sc->sc_dev), __func__));
4302 if ((rv = wm_write_smbus_addr(sc)) != 0)
4303 goto release;
4304
4305 reg = CSR_READ(sc, WMREG_LEDCTL);
4306 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_LED_CONFIG,
4307 (uint16_t)reg);
4308 if (rv != 0)
4309 goto release;
4310 }
4311
4312 /* Configure LCD from extended configuration region. */
4313 for (i = 0; i < cnf_size; i++) {
4314 uint16_t reg_data, reg_addr;
4315
4316 if (wm_nvm_read(sc, (word_addr + i * 2), 1, ®_data) != 0)
4317 goto release;
4318
4319 if (wm_nvm_read(sc, (word_addr + i * 2 + 1), 1, ®_addr) !=0)
4320 goto release;
4321
4322 if (reg_addr == MII_IGPHY_PAGE_SELECT)
4323 phy_page = reg_data;
4324
4325 reg_addr &= IGPHY_MAXREGADDR;
4326 reg_addr |= phy_page;
4327
4328 KASSERT(sc->phy.writereg_locked != NULL);
4329 rv = sc->phy.writereg_locked(sc->sc_dev, 1, reg_addr,
4330 reg_data);
4331 }
4332
4333 release:
4334 sc->phy.release(sc);
4335 return rv;
4336 }
4337
4338 /*
4339 * wm_oem_bits_config_ich8lan - SW-based LCD Configuration
4340 * @sc: pointer to the HW structure
4341 * @d0_state: boolean if entering d0 or d3 device state
4342 *
4343 * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are
4344 * collectively called OEM bits. The OEM Write Enable bit and SW Config bit
4345 * in NVM determines whether HW should configure LPLU and Gbe Disable.
4346 */
4347 int
4348 wm_oem_bits_config_ich8lan(struct wm_softc *sc, bool d0_state)
4349 {
4350 uint32_t mac_reg;
4351 uint16_t oem_reg;
4352 int rv;
4353
4354 if (sc->sc_type < WM_T_PCH)
4355 return 0;
4356
4357 rv = sc->phy.acquire(sc);
4358 if (rv != 0)
4359 return rv;
4360
4361 if (sc->sc_type == WM_T_PCH) {
4362 mac_reg = CSR_READ(sc, WMREG_EXTCNFCTR);
4363 if ((mac_reg & EXTCNFCTR_OEM_WRITE_ENABLE) != 0)
4364 goto release;
4365 }
4366
4367 mac_reg = CSR_READ(sc, WMREG_FEXTNVM);
4368 if ((mac_reg & FEXTNVM_SW_CONFIG_ICH8M) == 0)
4369 goto release;
4370
4371 mac_reg = CSR_READ(sc, WMREG_PHY_CTRL);
4372
4373 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 1, HV_OEM_BITS, &oem_reg);
4374 if (rv != 0)
4375 goto release;
4376 oem_reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
4377
4378 if (d0_state) {
4379 if ((mac_reg & PHY_CTRL_GBE_DIS) != 0)
4380 oem_reg |= HV_OEM_BITS_A1KDIS;
4381 if ((mac_reg & PHY_CTRL_D0A_LPLU) != 0)
4382 oem_reg |= HV_OEM_BITS_LPLU;
4383 } else {
4384 if ((mac_reg & (PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS))
4385 != 0)
4386 oem_reg |= HV_OEM_BITS_A1KDIS;
4387 if ((mac_reg & (PHY_CTRL_D0A_LPLU | PHY_CTRL_NOND0A_LPLU))
4388 != 0)
4389 oem_reg |= HV_OEM_BITS_LPLU;
4390 }
4391
4392 /* Set Restart auto-neg to activate the bits */
4393 if ((d0_state || (sc->sc_type != WM_T_PCH))
4394 && (wm_phy_resetisblocked(sc) == false))
4395 oem_reg |= HV_OEM_BITS_ANEGNOW;
4396
4397 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_OEM_BITS, oem_reg);
4398
4399 release:
4400 sc->phy.release(sc);
4401
4402 return rv;
4403 }
4404
4405 /* Init hardware bits */
4406 void
4407 wm_initialize_hardware_bits(struct wm_softc *sc)
4408 {
4409 uint32_t tarc0, tarc1, reg;
4410
4411 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4412 device_xname(sc->sc_dev), __func__));
4413
4414 /* For 82571 variant, 80003 and ICHs */
4415 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
4416 || (sc->sc_type >= WM_T_80003)) {
4417
4418 /* Transmit Descriptor Control 0 */
4419 reg = CSR_READ(sc, WMREG_TXDCTL(0));
4420 reg |= TXDCTL_COUNT_DESC;
4421 CSR_WRITE(sc, WMREG_TXDCTL(0), reg);
4422
4423 /* Transmit Descriptor Control 1 */
4424 reg = CSR_READ(sc, WMREG_TXDCTL(1));
4425 reg |= TXDCTL_COUNT_DESC;
4426 CSR_WRITE(sc, WMREG_TXDCTL(1), reg);
4427
4428 /* TARC0 */
4429 tarc0 = CSR_READ(sc, WMREG_TARC0);
4430 switch (sc->sc_type) {
4431 case WM_T_82571:
4432 case WM_T_82572:
4433 case WM_T_82573:
4434 case WM_T_82574:
4435 case WM_T_82583:
4436 case WM_T_80003:
4437 /* Clear bits 30..27 */
4438 tarc0 &= ~__BITS(30, 27);
4439 break;
4440 default:
4441 break;
4442 }
4443
4444 switch (sc->sc_type) {
4445 case WM_T_82571:
4446 case WM_T_82572:
4447 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */
4448
4449 tarc1 = CSR_READ(sc, WMREG_TARC1);
4450 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */
4451 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */
4452 /* 8257[12] Errata No.7 */
4453 tarc1 |= __BIT(22); /* TARC1 bits 22 */
4454
4455 /* TARC1 bit 28 */
4456 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4457 tarc1 &= ~__BIT(28);
4458 else
4459 tarc1 |= __BIT(28);
4460 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4461
4462 /*
4463 * 8257[12] Errata No.13
4464 * Disable Dyamic Clock Gating.
4465 */
4466 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4467 reg &= ~CTRL_EXT_DMA_DYN_CLK;
4468 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4469 break;
4470 case WM_T_82573:
4471 case WM_T_82574:
4472 case WM_T_82583:
4473 if ((sc->sc_type == WM_T_82574)
4474 || (sc->sc_type == WM_T_82583))
4475 tarc0 |= __BIT(26); /* TARC0 bit 26 */
4476
4477 /* Extended Device Control */
4478 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4479 reg &= ~__BIT(23); /* Clear bit 23 */
4480 reg |= __BIT(22); /* Set bit 22 */
4481 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4482
4483 /* Device Control */
4484 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */
4485 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4486
4487 /* PCIe Control Register */
4488 /*
4489 * 82573 Errata (unknown).
4490 *
4491 * 82574 Errata 25 and 82583 Errata 12
4492 * "Dropped Rx Packets":
4493 * NVM Image Version 2.1.4 and newer has no this bug.
4494 */
4495 reg = CSR_READ(sc, WMREG_GCR);
4496 reg |= GCR_L1_ACT_WITHOUT_L0S_RX;
4497 CSR_WRITE(sc, WMREG_GCR, reg);
4498
4499 if ((sc->sc_type == WM_T_82574)
4500 || (sc->sc_type == WM_T_82583)) {
4501 /*
4502 * Document says this bit must be set for
4503 * proper operation.
4504 */
4505 reg = CSR_READ(sc, WMREG_GCR);
4506 reg |= __BIT(22);
4507 CSR_WRITE(sc, WMREG_GCR, reg);
4508
4509 /*
4510 * Apply workaround for hardware errata
4511 * documented in errata docs Fixes issue where
4512 * some error prone or unreliable PCIe
4513 * completions are occurring, particularly
4514 * with ASPM enabled. Without fix, issue can
4515 * cause Tx timeouts.
4516 */
4517 reg = CSR_READ(sc, WMREG_GCR2);
4518 reg |= __BIT(0);
4519 CSR_WRITE(sc, WMREG_GCR2, reg);
4520 }
4521 break;
4522 case WM_T_80003:
4523 /* TARC0 */
4524 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
4525 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
4526 tarc0 &= ~__BIT(20); /* Clear bits 20 */
4527
4528 /* TARC1 bit 28 */
4529 tarc1 = CSR_READ(sc, WMREG_TARC1);
4530 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4531 tarc1 &= ~__BIT(28);
4532 else
4533 tarc1 |= __BIT(28);
4534 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4535 break;
4536 case WM_T_ICH8:
4537 case WM_T_ICH9:
4538 case WM_T_ICH10:
4539 case WM_T_PCH:
4540 case WM_T_PCH2:
4541 case WM_T_PCH_LPT:
4542 case WM_T_PCH_SPT:
4543 case WM_T_PCH_CNP:
4544 /* TARC0 */
4545 if (sc->sc_type == WM_T_ICH8) {
4546 /* Set TARC0 bits 29 and 28 */
4547 tarc0 |= __BITS(29, 28);
4548 } else if (sc->sc_type == WM_T_PCH_SPT) {
4549 tarc0 |= __BIT(29);
4550 /*
4551 * Drop bit 28. From Linux.
4552 * See I218/I219 spec update
4553 * "5. Buffer Overrun While the I219 is
4554 * Processing DMA Transactions"
4555 */
4556 tarc0 &= ~__BIT(28);
4557 }
4558 /* Set TARC0 bits 23,24,26,27 */
4559 tarc0 |= __BITS(27, 26) | __BITS(24, 23);
4560
4561 /* CTRL_EXT */
4562 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4563 reg |= __BIT(22); /* Set bit 22 */
4564 /*
4565 * Enable PHY low-power state when MAC is at D3
4566 * w/o WoL
4567 */
4568 if (sc->sc_type >= WM_T_PCH)
4569 reg |= CTRL_EXT_PHYPDEN;
4570 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4571
4572 /* TARC1 */
4573 tarc1 = CSR_READ(sc, WMREG_TARC1);
4574 /* bit 28 */
4575 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4576 tarc1 &= ~__BIT(28);
4577 else
4578 tarc1 |= __BIT(28);
4579 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30);
4580 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4581
4582 /* Device Status */
4583 if (sc->sc_type == WM_T_ICH8) {
4584 reg = CSR_READ(sc, WMREG_STATUS);
4585 reg &= ~__BIT(31);
4586 CSR_WRITE(sc, WMREG_STATUS, reg);
4587
4588 }
4589
4590 /* IOSFPC */
4591 if (sc->sc_type == WM_T_PCH_SPT) {
4592 reg = CSR_READ(sc, WMREG_IOSFPC);
4593 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */
4594 CSR_WRITE(sc, WMREG_IOSFPC, reg);
4595 }
4596 /*
4597 * Work-around descriptor data corruption issue during
4598 * NFS v2 UDP traffic, just disable the NFS filtering
4599 * capability.
4600 */
4601 reg = CSR_READ(sc, WMREG_RFCTL);
4602 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS;
4603 CSR_WRITE(sc, WMREG_RFCTL, reg);
4604 break;
4605 default:
4606 break;
4607 }
4608 CSR_WRITE(sc, WMREG_TARC0, tarc0);
4609
4610 switch (sc->sc_type) {
4611 /*
4612 * 8257[12] Errata No.52, 82573 Errata No.43 and some others.
4613 * Avoid RSS Hash Value bug.
4614 */
4615 case WM_T_82571:
4616 case WM_T_82572:
4617 case WM_T_82573:
4618 case WM_T_80003:
4619 case WM_T_ICH8:
4620 reg = CSR_READ(sc, WMREG_RFCTL);
4621 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
4622 CSR_WRITE(sc, WMREG_RFCTL, reg);
4623 break;
4624 case WM_T_82574:
4625 /* Use extened Rx descriptor. */
4626 reg = CSR_READ(sc, WMREG_RFCTL);
4627 reg |= WMREG_RFCTL_EXSTEN;
4628 CSR_WRITE(sc, WMREG_RFCTL, reg);
4629 break;
4630 default:
4631 break;
4632 }
4633 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) {
4634 /*
4635 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24,
4636 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11:
4637 * "Certain Malformed IPv6 Extension Headers are Not Processed
4638 * Correctly by the Device"
4639 *
4640 * I354(C2000) Errata AVR53:
4641 * "Malformed IPv6 Extension Headers May Result in LAN Device
4642 * Hang"
4643 */
4644 reg = CSR_READ(sc, WMREG_RFCTL);
4645 reg |= WMREG_RFCTL_IPV6EXDIS;
4646 CSR_WRITE(sc, WMREG_RFCTL, reg);
4647 }
4648 }
4649
4650 static uint32_t
4651 wm_rxpbs_adjust_82580(uint32_t val)
4652 {
4653 uint32_t rv = 0;
4654
4655 if (val < __arraycount(wm_82580_rxpbs_table))
4656 rv = wm_82580_rxpbs_table[val];
4657
4658 return rv;
4659 }
4660
4661 /*
4662 * wm_reset_phy:
4663 *
4664 * generic PHY reset function.
4665 * Same as e1000_phy_hw_reset_generic()
4666 */
4667 static int
4668 wm_reset_phy(struct wm_softc *sc)
4669 {
4670 uint32_t reg;
4671
4672 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4673 device_xname(sc->sc_dev), __func__));
4674 if (wm_phy_resetisblocked(sc))
4675 return -1;
4676
4677 sc->phy.acquire(sc);
4678
4679 reg = CSR_READ(sc, WMREG_CTRL);
4680 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
4681 CSR_WRITE_FLUSH(sc);
4682
4683 delay(sc->phy.reset_delay_us);
4684
4685 CSR_WRITE(sc, WMREG_CTRL, reg);
4686 CSR_WRITE_FLUSH(sc);
4687
4688 delay(150);
4689
4690 sc->phy.release(sc);
4691
4692 wm_get_cfg_done(sc);
4693 wm_phy_post_reset(sc);
4694
4695 return 0;
4696 }
4697
4698 /*
4699 * Only used by WM_T_PCH_SPT which does not use multiqueue,
4700 * so it is enough to check sc->sc_queue[0] only.
4701 */
4702 static void
4703 wm_flush_desc_rings(struct wm_softc *sc)
4704 {
4705 pcireg_t preg;
4706 uint32_t reg;
4707 struct wm_txqueue *txq;
4708 wiseman_txdesc_t *txd;
4709 int nexttx;
4710 uint32_t rctl;
4711
4712 /* First, disable MULR fix in FEXTNVM11 */
4713 reg = CSR_READ(sc, WMREG_FEXTNVM11);
4714 reg |= FEXTNVM11_DIS_MULRFIX;
4715 CSR_WRITE(sc, WMREG_FEXTNVM11, reg);
4716
4717 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4718 reg = CSR_READ(sc, WMREG_TDLEN(0));
4719 if (((preg & DESCRING_STATUS_FLUSH_REQ) == 0) || (reg == 0))
4720 return;
4721
4722 /* TX */
4723 device_printf(sc->sc_dev, "Need TX flush (reg = %08x, len = %u)\n",
4724 preg, reg);
4725 reg = CSR_READ(sc, WMREG_TCTL);
4726 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN);
4727
4728 txq = &sc->sc_queue[0].wmq_txq;
4729 nexttx = txq->txq_next;
4730 txd = &txq->txq_descs[nexttx];
4731 wm_set_dma_addr(&txd->wtx_addr, WM_CDTXADDR(txq, nexttx));
4732 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS | 512);
4733 txd->wtx_fields.wtxu_status = 0;
4734 txd->wtx_fields.wtxu_options = 0;
4735 txd->wtx_fields.wtxu_vlan = 0;
4736
4737 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4738 BUS_SPACE_BARRIER_WRITE);
4739
4740 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
4741 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next);
4742 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4743 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
4744 delay(250);
4745
4746 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4747 if ((preg & DESCRING_STATUS_FLUSH_REQ) == 0)
4748 return;
4749
4750 /* RX */
4751 device_printf(sc->sc_dev, "Need RX flush (reg = %08x)\n", preg);
4752 rctl = CSR_READ(sc, WMREG_RCTL);
4753 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4754 CSR_WRITE_FLUSH(sc);
4755 delay(150);
4756
4757 reg = CSR_READ(sc, WMREG_RXDCTL(0));
4758 /* Zero the lower 14 bits (prefetch and host thresholds) */
4759 reg &= 0xffffc000;
4760 /*
4761 * Update thresholds: prefetch threshold to 31, host threshold
4762 * to 1 and make sure the granularity is "descriptors" and not
4763 * "cache lines"
4764 */
4765 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN);
4766 CSR_WRITE(sc, WMREG_RXDCTL(0), reg);
4767
4768 /* Momentarily enable the RX ring for the changes to take effect */
4769 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN);
4770 CSR_WRITE_FLUSH(sc);
4771 delay(150);
4772 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4773 }
4774
4775 /*
4776 * wm_reset:
4777 *
4778 * Reset the i82542 chip.
4779 */
4780 static void
4781 wm_reset(struct wm_softc *sc)
4782 {
4783 int phy_reset = 0;
4784 int i, error = 0;
4785 uint32_t reg;
4786 uint16_t kmreg;
4787 int rv;
4788
4789 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4790 device_xname(sc->sc_dev), __func__));
4791 KASSERT(sc->sc_type != 0);
4792
4793 /*
4794 * Allocate on-chip memory according to the MTU size.
4795 * The Packet Buffer Allocation register must be written
4796 * before the chip is reset.
4797 */
4798 switch (sc->sc_type) {
4799 case WM_T_82547:
4800 case WM_T_82547_2:
4801 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4802 PBA_22K : PBA_30K;
4803 for (i = 0; i < sc->sc_nqueues; i++) {
4804 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
4805 txq->txq_fifo_head = 0;
4806 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT;
4807 txq->txq_fifo_size =
4808 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT;
4809 txq->txq_fifo_stall = 0;
4810 }
4811 break;
4812 case WM_T_82571:
4813 case WM_T_82572:
4814 case WM_T_82575: /* XXX need special handing for jumbo frames */
4815 case WM_T_80003:
4816 sc->sc_pba = PBA_32K;
4817 break;
4818 case WM_T_82573:
4819 sc->sc_pba = PBA_12K;
4820 break;
4821 case WM_T_82574:
4822 case WM_T_82583:
4823 sc->sc_pba = PBA_20K;
4824 break;
4825 case WM_T_82576:
4826 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS);
4827 sc->sc_pba &= RXPBS_SIZE_MASK_82576;
4828 break;
4829 case WM_T_82580:
4830 case WM_T_I350:
4831 case WM_T_I354:
4832 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS));
4833 break;
4834 case WM_T_I210:
4835 case WM_T_I211:
4836 sc->sc_pba = PBA_34K;
4837 break;
4838 case WM_T_ICH8:
4839 /* Workaround for a bit corruption issue in FIFO memory */
4840 sc->sc_pba = PBA_8K;
4841 CSR_WRITE(sc, WMREG_PBS, PBA_16K);
4842 break;
4843 case WM_T_ICH9:
4844 case WM_T_ICH10:
4845 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ?
4846 PBA_14K : PBA_10K;
4847 break;
4848 case WM_T_PCH:
4849 case WM_T_PCH2: /* XXX 14K? */
4850 case WM_T_PCH_LPT:
4851 case WM_T_PCH_SPT:
4852 case WM_T_PCH_CNP:
4853 sc->sc_pba = PBA_26K;
4854 break;
4855 default:
4856 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4857 PBA_40K : PBA_48K;
4858 break;
4859 }
4860 /*
4861 * Only old or non-multiqueue devices have the PBA register
4862 * XXX Need special handling for 82575.
4863 */
4864 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0)
4865 || (sc->sc_type == WM_T_82575))
4866 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba);
4867
4868 /* Prevent the PCI-E bus from sticking */
4869 if (sc->sc_flags & WM_F_PCIE) {
4870 int timeout = 800;
4871
4872 sc->sc_ctrl |= CTRL_GIO_M_DIS;
4873 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4874
4875 while (timeout--) {
4876 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA)
4877 == 0)
4878 break;
4879 delay(100);
4880 }
4881 if (timeout == 0)
4882 device_printf(sc->sc_dev,
4883 "failed to disable busmastering\n");
4884 }
4885
4886 /* Set the completion timeout for interface */
4887 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
4888 || (sc->sc_type == WM_T_82580)
4889 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
4890 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
4891 wm_set_pcie_completion_timeout(sc);
4892
4893 /* Clear interrupt */
4894 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4895 if (wm_is_using_msix(sc)) {
4896 if (sc->sc_type != WM_T_82574) {
4897 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4898 CSR_WRITE(sc, WMREG_EIAC, 0);
4899 } else
4900 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4901 }
4902
4903 /* Stop the transmit and receive processes. */
4904 CSR_WRITE(sc, WMREG_RCTL, 0);
4905 sc->sc_rctl &= ~RCTL_EN;
4906 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP);
4907 CSR_WRITE_FLUSH(sc);
4908
4909 /* XXX set_tbi_sbp_82543() */
4910
4911 delay(10*1000);
4912
4913 /* Must acquire the MDIO ownership before MAC reset */
4914 switch (sc->sc_type) {
4915 case WM_T_82573:
4916 case WM_T_82574:
4917 case WM_T_82583:
4918 error = wm_get_hw_semaphore_82573(sc);
4919 break;
4920 default:
4921 break;
4922 }
4923
4924 /*
4925 * 82541 Errata 29? & 82547 Errata 28?
4926 * See also the description about PHY_RST bit in CTRL register
4927 * in 8254x_GBe_SDM.pdf.
4928 */
4929 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) {
4930 CSR_WRITE(sc, WMREG_CTRL,
4931 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET);
4932 CSR_WRITE_FLUSH(sc);
4933 delay(5000);
4934 }
4935
4936 switch (sc->sc_type) {
4937 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */
4938 case WM_T_82541:
4939 case WM_T_82541_2:
4940 case WM_T_82547:
4941 case WM_T_82547_2:
4942 /*
4943 * On some chipsets, a reset through a memory-mapped write
4944 * cycle can cause the chip to reset before completing the
4945 * write cycle. This causes major headache that can be avoided
4946 * by issuing the reset via indirect register writes through
4947 * I/O space.
4948 *
4949 * So, if we successfully mapped the I/O BAR at attach time,
4950 * use that. Otherwise, try our luck with a memory-mapped
4951 * reset.
4952 */
4953 if (sc->sc_flags & WM_F_IOH_VALID)
4954 wm_io_write(sc, WMREG_CTRL, CTRL_RST);
4955 else
4956 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
4957 break;
4958 case WM_T_82545_3:
4959 case WM_T_82546_3:
4960 /* Use the shadow control register on these chips. */
4961 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST);
4962 break;
4963 case WM_T_80003:
4964 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4965 sc->phy.acquire(sc);
4966 CSR_WRITE(sc, WMREG_CTRL, reg);
4967 sc->phy.release(sc);
4968 break;
4969 case WM_T_ICH8:
4970 case WM_T_ICH9:
4971 case WM_T_ICH10:
4972 case WM_T_PCH:
4973 case WM_T_PCH2:
4974 case WM_T_PCH_LPT:
4975 case WM_T_PCH_SPT:
4976 case WM_T_PCH_CNP:
4977 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4978 if (wm_phy_resetisblocked(sc) == false) {
4979 /*
4980 * Gate automatic PHY configuration by hardware on
4981 * non-managed 82579
4982 */
4983 if ((sc->sc_type == WM_T_PCH2)
4984 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID)
4985 == 0))
4986 wm_gate_hw_phy_config_ich8lan(sc, true);
4987
4988 reg |= CTRL_PHY_RESET;
4989 phy_reset = 1;
4990 } else
4991 device_printf(sc->sc_dev, "XXX reset is blocked!!!\n");
4992 sc->phy.acquire(sc);
4993 CSR_WRITE(sc, WMREG_CTRL, reg);
4994 /* Don't insert a completion barrier when reset */
4995 delay(20*1000);
4996 mutex_exit(sc->sc_ich_phymtx);
4997 break;
4998 case WM_T_82580:
4999 case WM_T_I350:
5000 case WM_T_I354:
5001 case WM_T_I210:
5002 case WM_T_I211:
5003 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
5004 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII)
5005 CSR_WRITE_FLUSH(sc);
5006 delay(5000);
5007 break;
5008 case WM_T_82542_2_0:
5009 case WM_T_82542_2_1:
5010 case WM_T_82543:
5011 case WM_T_82540:
5012 case WM_T_82545:
5013 case WM_T_82546:
5014 case WM_T_82571:
5015 case WM_T_82572:
5016 case WM_T_82573:
5017 case WM_T_82574:
5018 case WM_T_82575:
5019 case WM_T_82576:
5020 case WM_T_82583:
5021 default:
5022 /* Everything else can safely use the documented method. */
5023 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
5024 break;
5025 }
5026
5027 /* Must release the MDIO ownership after MAC reset */
5028 switch (sc->sc_type) {
5029 case WM_T_82573:
5030 case WM_T_82574:
5031 case WM_T_82583:
5032 if (error == 0)
5033 wm_put_hw_semaphore_82573(sc);
5034 break;
5035 default:
5036 break;
5037 }
5038
5039 /* Set Phy Config Counter to 50msec */
5040 if (sc->sc_type == WM_T_PCH2) {
5041 reg = CSR_READ(sc, WMREG_FEXTNVM3);
5042 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
5043 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
5044 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
5045 }
5046
5047 if (phy_reset != 0)
5048 wm_get_cfg_done(sc);
5049
5050 /* Reload EEPROM */
5051 switch (sc->sc_type) {
5052 case WM_T_82542_2_0:
5053 case WM_T_82542_2_1:
5054 case WM_T_82543:
5055 case WM_T_82544:
5056 delay(10);
5057 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
5058 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5059 CSR_WRITE_FLUSH(sc);
5060 delay(2000);
5061 break;
5062 case WM_T_82540:
5063 case WM_T_82545:
5064 case WM_T_82545_3:
5065 case WM_T_82546:
5066 case WM_T_82546_3:
5067 delay(5*1000);
5068 /* XXX Disable HW ARPs on ASF enabled adapters */
5069 break;
5070 case WM_T_82541:
5071 case WM_T_82541_2:
5072 case WM_T_82547:
5073 case WM_T_82547_2:
5074 delay(20000);
5075 /* XXX Disable HW ARPs on ASF enabled adapters */
5076 break;
5077 case WM_T_82571:
5078 case WM_T_82572:
5079 case WM_T_82573:
5080 case WM_T_82574:
5081 case WM_T_82583:
5082 if (sc->sc_flags & WM_F_EEPROM_FLASH) {
5083 delay(10);
5084 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
5085 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5086 CSR_WRITE_FLUSH(sc);
5087 }
5088 /* check EECD_EE_AUTORD */
5089 wm_get_auto_rd_done(sc);
5090 /*
5091 * Phy configuration from NVM just starts after EECD_AUTO_RD
5092 * is set.
5093 */
5094 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574)
5095 || (sc->sc_type == WM_T_82583))
5096 delay(25*1000);
5097 break;
5098 case WM_T_82575:
5099 case WM_T_82576:
5100 case WM_T_82580:
5101 case WM_T_I350:
5102 case WM_T_I354:
5103 case WM_T_I210:
5104 case WM_T_I211:
5105 case WM_T_80003:
5106 /* check EECD_EE_AUTORD */
5107 wm_get_auto_rd_done(sc);
5108 break;
5109 case WM_T_ICH8:
5110 case WM_T_ICH9:
5111 case WM_T_ICH10:
5112 case WM_T_PCH:
5113 case WM_T_PCH2:
5114 case WM_T_PCH_LPT:
5115 case WM_T_PCH_SPT:
5116 case WM_T_PCH_CNP:
5117 break;
5118 default:
5119 panic("%s: unknown type\n", __func__);
5120 }
5121
5122 /* Check whether EEPROM is present or not */
5123 switch (sc->sc_type) {
5124 case WM_T_82575:
5125 case WM_T_82576:
5126 case WM_T_82580:
5127 case WM_T_I350:
5128 case WM_T_I354:
5129 case WM_T_ICH8:
5130 case WM_T_ICH9:
5131 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) {
5132 /* Not found */
5133 sc->sc_flags |= WM_F_EEPROM_INVALID;
5134 if (sc->sc_type == WM_T_82575)
5135 wm_reset_init_script_82575(sc);
5136 }
5137 break;
5138 default:
5139 break;
5140 }
5141
5142 if (phy_reset != 0)
5143 wm_phy_post_reset(sc);
5144
5145 if ((sc->sc_type == WM_T_82580)
5146 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) {
5147 /* Clear global device reset status bit */
5148 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET);
5149 }
5150
5151 /* Clear any pending interrupt events. */
5152 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5153 reg = CSR_READ(sc, WMREG_ICR);
5154 if (wm_is_using_msix(sc)) {
5155 if (sc->sc_type != WM_T_82574) {
5156 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
5157 CSR_WRITE(sc, WMREG_EIAC, 0);
5158 } else
5159 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
5160 }
5161
5162 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
5163 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
5164 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
5165 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){
5166 reg = CSR_READ(sc, WMREG_KABGTXD);
5167 reg |= KABGTXD_BGSQLBIAS;
5168 CSR_WRITE(sc, WMREG_KABGTXD, reg);
5169 }
5170
5171 /* Reload sc_ctrl */
5172 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
5173
5174 wm_set_eee(sc);
5175
5176 /*
5177 * For PCH, this write will make sure that any noise will be detected
5178 * as a CRC error and be dropped rather than show up as a bad packet
5179 * to the DMA engine
5180 */
5181 if (sc->sc_type == WM_T_PCH)
5182 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565);
5183
5184 if (sc->sc_type >= WM_T_82544)
5185 CSR_WRITE(sc, WMREG_WUC, 0);
5186
5187 if (sc->sc_type < WM_T_82575)
5188 wm_disable_aspm(sc); /* Workaround for some chips */
5189
5190 wm_reset_mdicnfg_82580(sc);
5191
5192 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
5193 wm_pll_workaround_i210(sc);
5194
5195 if (sc->sc_type == WM_T_80003) {
5196 /* Default to TRUE to enable the MDIC W/A */
5197 sc->sc_flags |= WM_F_80003_MDIC_WA;
5198
5199 rv = wm_kmrn_readreg(sc,
5200 KUMCTRLSTA_OFFSET >> KUMCTRLSTA_OFFSET_SHIFT, &kmreg);
5201 if (rv == 0) {
5202 if ((kmreg & KUMCTRLSTA_OPMODE_MASK)
5203 == KUMCTRLSTA_OPMODE_INBAND_MDIO)
5204 sc->sc_flags &= ~WM_F_80003_MDIC_WA;
5205 else
5206 sc->sc_flags |= WM_F_80003_MDIC_WA;
5207 }
5208 }
5209 }
5210
5211 /*
5212 * wm_add_rxbuf:
5213 *
5214 * Add a receive buffer to the indiciated descriptor.
5215 */
5216 static int
5217 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx)
5218 {
5219 struct wm_softc *sc = rxq->rxq_sc;
5220 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx];
5221 struct mbuf *m;
5222 int error;
5223
5224 KASSERT(mutex_owned(rxq->rxq_lock));
5225
5226 MGETHDR(m, M_DONTWAIT, MT_DATA);
5227 if (m == NULL)
5228 return ENOBUFS;
5229
5230 MCLGET(m, M_DONTWAIT);
5231 if ((m->m_flags & M_EXT) == 0) {
5232 m_freem(m);
5233 return ENOBUFS;
5234 }
5235
5236 if (rxs->rxs_mbuf != NULL)
5237 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
5238
5239 rxs->rxs_mbuf = m;
5240
5241 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
5242 /*
5243 * Cannot use bus_dmamap_load_mbuf() here because m_data may be
5244 * sc_align_tweak'd between bus_dmamap_load() and bus_dmamap_sync().
5245 */
5246 error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, m->m_ext.ext_buf,
5247 m->m_ext.ext_size, NULL, BUS_DMA_READ | BUS_DMA_NOWAIT);
5248 if (error) {
5249 /* XXX XXX XXX */
5250 aprint_error_dev(sc->sc_dev,
5251 "unable to load rx DMA map %d, error = %d\n", idx, error);
5252 panic("wm_add_rxbuf");
5253 }
5254
5255 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
5256 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
5257
5258 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5259 if ((sc->sc_rctl & RCTL_EN) != 0)
5260 wm_init_rxdesc(rxq, idx);
5261 } else
5262 wm_init_rxdesc(rxq, idx);
5263
5264 return 0;
5265 }
5266
5267 /*
5268 * wm_rxdrain:
5269 *
5270 * Drain the receive queue.
5271 */
5272 static void
5273 wm_rxdrain(struct wm_rxqueue *rxq)
5274 {
5275 struct wm_softc *sc = rxq->rxq_sc;
5276 struct wm_rxsoft *rxs;
5277 int i;
5278
5279 KASSERT(mutex_owned(rxq->rxq_lock));
5280
5281 for (i = 0; i < WM_NRXDESC; i++) {
5282 rxs = &rxq->rxq_soft[i];
5283 if (rxs->rxs_mbuf != NULL) {
5284 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
5285 m_freem(rxs->rxs_mbuf);
5286 rxs->rxs_mbuf = NULL;
5287 }
5288 }
5289 }
5290
5291 /*
5292 * Setup registers for RSS.
5293 *
5294 * XXX not yet VMDq support
5295 */
5296 static void
5297 wm_init_rss(struct wm_softc *sc)
5298 {
5299 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS];
5300 int i;
5301
5302 CTASSERT(sizeof(rss_key) == RSS_KEYSIZE);
5303
5304 for (i = 0; i < RETA_NUM_ENTRIES; i++) {
5305 unsigned int qid, reta_ent;
5306
5307 qid = i % sc->sc_nqueues;
5308 switch (sc->sc_type) {
5309 case WM_T_82574:
5310 reta_ent = __SHIFTIN(qid,
5311 RETA_ENT_QINDEX_MASK_82574);
5312 break;
5313 case WM_T_82575:
5314 reta_ent = __SHIFTIN(qid,
5315 RETA_ENT_QINDEX1_MASK_82575);
5316 break;
5317 default:
5318 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK);
5319 break;
5320 }
5321
5322 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i));
5323 reta_reg &= ~RETA_ENTRY_MASK_Q(i);
5324 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i));
5325 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg);
5326 }
5327
5328 rss_getkey((uint8_t *)rss_key);
5329 for (i = 0; i < RSSRK_NUM_REGS; i++)
5330 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]);
5331
5332 if (sc->sc_type == WM_T_82574)
5333 mrqc = MRQC_ENABLE_RSS_MQ_82574;
5334 else
5335 mrqc = MRQC_ENABLE_RSS_MQ;
5336
5337 /*
5338 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata.
5339 * See IPV6EXDIS bit in wm_initialize_hardware_bits().
5340 */
5341 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP);
5342 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP);
5343 #if 0
5344 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP);
5345 mrqc |= MRQC_RSS_FIELD_IPV6_UDP_EX;
5346 #endif
5347 mrqc |= MRQC_RSS_FIELD_IPV6_TCP_EX;
5348
5349 CSR_WRITE(sc, WMREG_MRQC, mrqc);
5350 }
5351
5352 /*
5353 * Adjust TX and RX queue numbers which the system actulally uses.
5354 *
5355 * The numbers are affected by below parameters.
5356 * - The nubmer of hardware queues
5357 * - The number of MSI-X vectors (= "nvectors" argument)
5358 * - ncpu
5359 */
5360 static void
5361 wm_adjust_qnum(struct wm_softc *sc, int nvectors)
5362 {
5363 int hw_ntxqueues, hw_nrxqueues, hw_nqueues;
5364
5365 if (nvectors < 2) {
5366 sc->sc_nqueues = 1;
5367 return;
5368 }
5369
5370 switch (sc->sc_type) {
5371 case WM_T_82572:
5372 hw_ntxqueues = 2;
5373 hw_nrxqueues = 2;
5374 break;
5375 case WM_T_82574:
5376 hw_ntxqueues = 2;
5377 hw_nrxqueues = 2;
5378 break;
5379 case WM_T_82575:
5380 hw_ntxqueues = 4;
5381 hw_nrxqueues = 4;
5382 break;
5383 case WM_T_82576:
5384 hw_ntxqueues = 16;
5385 hw_nrxqueues = 16;
5386 break;
5387 case WM_T_82580:
5388 case WM_T_I350:
5389 case WM_T_I354:
5390 hw_ntxqueues = 8;
5391 hw_nrxqueues = 8;
5392 break;
5393 case WM_T_I210:
5394 hw_ntxqueues = 4;
5395 hw_nrxqueues = 4;
5396 break;
5397 case WM_T_I211:
5398 hw_ntxqueues = 2;
5399 hw_nrxqueues = 2;
5400 break;
5401 /*
5402 * As below ethernet controllers does not support MSI-X,
5403 * this driver let them not use multiqueue.
5404 * - WM_T_80003
5405 * - WM_T_ICH8
5406 * - WM_T_ICH9
5407 * - WM_T_ICH10
5408 * - WM_T_PCH
5409 * - WM_T_PCH2
5410 * - WM_T_PCH_LPT
5411 */
5412 default:
5413 hw_ntxqueues = 1;
5414 hw_nrxqueues = 1;
5415 break;
5416 }
5417
5418 hw_nqueues = uimin(hw_ntxqueues, hw_nrxqueues);
5419
5420 /*
5421 * As queues more than MSI-X vectors cannot improve scaling, we limit
5422 * the number of queues used actually.
5423 */
5424 if (nvectors < hw_nqueues + 1)
5425 sc->sc_nqueues = nvectors - 1;
5426 else
5427 sc->sc_nqueues = hw_nqueues;
5428
5429 /*
5430 * As queues more then cpus cannot improve scaling, we limit
5431 * the number of queues used actually.
5432 */
5433 if (ncpu < sc->sc_nqueues)
5434 sc->sc_nqueues = ncpu;
5435 }
5436
5437 static inline bool
5438 wm_is_using_msix(struct wm_softc *sc)
5439 {
5440
5441 return (sc->sc_nintrs > 1);
5442 }
5443
5444 static inline bool
5445 wm_is_using_multiqueue(struct wm_softc *sc)
5446 {
5447
5448 return (sc->sc_nqueues > 1);
5449 }
5450
5451 static int
5452 wm_softint_establish_queue(struct wm_softc *sc, int qidx, int intr_idx)
5453 {
5454 struct wm_queue *wmq = &sc->sc_queue[qidx];
5455
5456 wmq->wmq_id = qidx;
5457 wmq->wmq_intr_idx = intr_idx;
5458 wmq->wmq_si = softint_establish(SOFTINT_NET | WM_SOFTINT_FLAGS,
5459 wm_handle_queue, wmq);
5460 if (wmq->wmq_si != NULL)
5461 return 0;
5462
5463 aprint_error_dev(sc->sc_dev, "unable to establish queue[%d] handler\n",
5464 wmq->wmq_id);
5465 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[wmq->wmq_intr_idx]);
5466 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5467 return ENOMEM;
5468 }
5469
5470 /*
5471 * Both single interrupt MSI and INTx can use this function.
5472 */
5473 static int
5474 wm_setup_legacy(struct wm_softc *sc)
5475 {
5476 pci_chipset_tag_t pc = sc->sc_pc;
5477 const char *intrstr = NULL;
5478 char intrbuf[PCI_INTRSTR_LEN];
5479 int error;
5480
5481 error = wm_alloc_txrx_queues(sc);
5482 if (error) {
5483 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5484 error);
5485 return ENOMEM;
5486 }
5487 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf,
5488 sizeof(intrbuf));
5489 #ifdef WM_MPSAFE
5490 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true);
5491 #endif
5492 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
5493 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev));
5494 if (sc->sc_ihs[0] == NULL) {
5495 aprint_error_dev(sc->sc_dev,"unable to establish %s\n",
5496 (pci_intr_type(pc, sc->sc_intrs[0])
5497 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
5498 return ENOMEM;
5499 }
5500
5501 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
5502 sc->sc_nintrs = 1;
5503
5504 return wm_softint_establish_queue(sc, 0, 0);
5505 }
5506
5507 static int
5508 wm_setup_msix(struct wm_softc *sc)
5509 {
5510 void *vih;
5511 kcpuset_t *affinity;
5512 int qidx, error, intr_idx, txrx_established;
5513 pci_chipset_tag_t pc = sc->sc_pc;
5514 const char *intrstr = NULL;
5515 char intrbuf[PCI_INTRSTR_LEN];
5516 char intr_xname[INTRDEVNAMEBUF];
5517
5518 if (sc->sc_nqueues < ncpu) {
5519 /*
5520 * To avoid other devices' interrupts, the affinity of Tx/Rx
5521 * interrupts start from CPU#1.
5522 */
5523 sc->sc_affinity_offset = 1;
5524 } else {
5525 /*
5526 * In this case, this device use all CPUs. So, we unify
5527 * affinitied cpu_index to msix vector number for readability.
5528 */
5529 sc->sc_affinity_offset = 0;
5530 }
5531
5532 error = wm_alloc_txrx_queues(sc);
5533 if (error) {
5534 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5535 error);
5536 return ENOMEM;
5537 }
5538
5539 kcpuset_create(&affinity, false);
5540 intr_idx = 0;
5541
5542 /*
5543 * TX and RX
5544 */
5545 txrx_established = 0;
5546 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5547 struct wm_queue *wmq = &sc->sc_queue[qidx];
5548 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu;
5549
5550 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5551 sizeof(intrbuf));
5552 #ifdef WM_MPSAFE
5553 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx],
5554 PCI_INTR_MPSAFE, true);
5555 #endif
5556 memset(intr_xname, 0, sizeof(intr_xname));
5557 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d",
5558 device_xname(sc->sc_dev), qidx);
5559 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5560 IPL_NET, wm_txrxintr_msix, wmq, intr_xname);
5561 if (vih == NULL) {
5562 aprint_error_dev(sc->sc_dev,
5563 "unable to establish MSI-X(for TX and RX)%s%s\n",
5564 intrstr ? " at " : "",
5565 intrstr ? intrstr : "");
5566
5567 goto fail;
5568 }
5569 kcpuset_zero(affinity);
5570 /* Round-robin affinity */
5571 kcpuset_set(affinity, affinity_to);
5572 error = interrupt_distribute(vih, affinity, NULL);
5573 if (error == 0) {
5574 aprint_normal_dev(sc->sc_dev,
5575 "for TX and RX interrupting at %s affinity to %u\n",
5576 intrstr, affinity_to);
5577 } else {
5578 aprint_normal_dev(sc->sc_dev,
5579 "for TX and RX interrupting at %s\n", intrstr);
5580 }
5581 sc->sc_ihs[intr_idx] = vih;
5582 if (wm_softint_establish_queue(sc, qidx, intr_idx) != 0)
5583 goto fail;
5584 txrx_established++;
5585 intr_idx++;
5586 }
5587
5588 /* LINK */
5589 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5590 sizeof(intrbuf));
5591 #ifdef WM_MPSAFE
5592 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true);
5593 #endif
5594 memset(intr_xname, 0, sizeof(intr_xname));
5595 snprintf(intr_xname, sizeof(intr_xname), "%sLINK",
5596 device_xname(sc->sc_dev));
5597 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5598 IPL_NET, wm_linkintr_msix, sc, intr_xname);
5599 if (vih == NULL) {
5600 aprint_error_dev(sc->sc_dev,
5601 "unable to establish MSI-X(for LINK)%s%s\n",
5602 intrstr ? " at " : "",
5603 intrstr ? intrstr : "");
5604
5605 goto fail;
5606 }
5607 /* Keep default affinity to LINK interrupt */
5608 aprint_normal_dev(sc->sc_dev,
5609 "for LINK interrupting at %s\n", intrstr);
5610 sc->sc_ihs[intr_idx] = vih;
5611 sc->sc_link_intr_idx = intr_idx;
5612
5613 sc->sc_nintrs = sc->sc_nqueues + 1;
5614 kcpuset_destroy(affinity);
5615 return 0;
5616
5617 fail:
5618 for (qidx = 0; qidx < txrx_established; qidx++) {
5619 struct wm_queue *wmq = &sc->sc_queue[qidx];
5620 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]);
5621 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5622 }
5623
5624 kcpuset_destroy(affinity);
5625 return ENOMEM;
5626 }
5627
5628 static void
5629 wm_unset_stopping_flags(struct wm_softc *sc)
5630 {
5631 int i;
5632
5633 KASSERT(WM_CORE_LOCKED(sc));
5634
5635 /* Must unset stopping flags in ascending order. */
5636 for (i = 0; i < sc->sc_nqueues; i++) {
5637 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5638 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5639
5640 mutex_enter(txq->txq_lock);
5641 txq->txq_stopping = false;
5642 mutex_exit(txq->txq_lock);
5643
5644 mutex_enter(rxq->rxq_lock);
5645 rxq->rxq_stopping = false;
5646 mutex_exit(rxq->rxq_lock);
5647 }
5648
5649 sc->sc_core_stopping = false;
5650 }
5651
5652 static void
5653 wm_set_stopping_flags(struct wm_softc *sc)
5654 {
5655 int i;
5656
5657 KASSERT(WM_CORE_LOCKED(sc));
5658
5659 sc->sc_core_stopping = true;
5660
5661 /* Must set stopping flags in ascending order. */
5662 for (i = 0; i < sc->sc_nqueues; i++) {
5663 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5664 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5665
5666 mutex_enter(rxq->rxq_lock);
5667 rxq->rxq_stopping = true;
5668 mutex_exit(rxq->rxq_lock);
5669
5670 mutex_enter(txq->txq_lock);
5671 txq->txq_stopping = true;
5672 mutex_exit(txq->txq_lock);
5673 }
5674 }
5675
5676 /*
5677 * Write interrupt interval value to ITR or EITR
5678 */
5679 static void
5680 wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq)
5681 {
5682
5683 if (!wmq->wmq_set_itr)
5684 return;
5685
5686 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5687 uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK);
5688
5689 /*
5690 * 82575 doesn't have CNT_INGR field.
5691 * So, overwrite counter field by software.
5692 */
5693 if (sc->sc_type == WM_T_82575)
5694 eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575);
5695 else
5696 eitr |= EITR_CNT_INGR;
5697
5698 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx), eitr);
5699 } else if (sc->sc_type == WM_T_82574 && wm_is_using_msix(sc)) {
5700 /*
5701 * 82574 has both ITR and EITR. SET EITR when we use
5702 * the multi queue function with MSI-X.
5703 */
5704 CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx),
5705 wmq->wmq_itr & EITR_ITR_INT_MASK_82574);
5706 } else {
5707 KASSERT(wmq->wmq_id == 0);
5708 CSR_WRITE(sc, WMREG_ITR, wmq->wmq_itr);
5709 }
5710
5711 wmq->wmq_set_itr = false;
5712 }
5713
5714 /*
5715 * TODO
5716 * Below dynamic calculation of itr is almost the same as linux igb,
5717 * however it does not fit to wm(4). So, we will have been disable AIM
5718 * until we will find appropriate calculation of itr.
5719 */
5720 /*
5721 * calculate interrupt interval value to be going to write register in
5722 * wm_itrs_writereg(). This function does not write ITR/EITR register.
5723 */
5724 static void
5725 wm_itrs_calculate(struct wm_softc *sc, struct wm_queue *wmq)
5726 {
5727 #ifdef NOTYET
5728 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
5729 struct wm_txqueue *txq = &wmq->wmq_txq;
5730 uint32_t avg_size = 0;
5731 uint32_t new_itr;
5732
5733 if (rxq->rxq_packets)
5734 avg_size = rxq->rxq_bytes / rxq->rxq_packets;
5735 if (txq->txq_packets)
5736 avg_size = uimax(avg_size, txq->txq_bytes / txq->txq_packets);
5737
5738 if (avg_size == 0) {
5739 new_itr = 450; /* restore default value */
5740 goto out;
5741 }
5742
5743 /* Add 24 bytes to size to account for CRC, preamble, and gap */
5744 avg_size += 24;
5745
5746 /* Don't starve jumbo frames */
5747 avg_size = uimin(avg_size, 3000);
5748
5749 /* Give a little boost to mid-size frames */
5750 if ((avg_size > 300) && (avg_size < 1200))
5751 new_itr = avg_size / 3;
5752 else
5753 new_itr = avg_size / 2;
5754
5755 out:
5756 /*
5757 * The usage of 82574 and 82575 EITR is different from otther NEWQUEUE
5758 * controllers. See sc->sc_itr_init setting in wm_init_locked().
5759 */
5760 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0 || sc->sc_type != WM_T_82575)
5761 new_itr *= 4;
5762
5763 if (new_itr != wmq->wmq_itr) {
5764 wmq->wmq_itr = new_itr;
5765 wmq->wmq_set_itr = true;
5766 } else
5767 wmq->wmq_set_itr = false;
5768
5769 rxq->rxq_packets = 0;
5770 rxq->rxq_bytes = 0;
5771 txq->txq_packets = 0;
5772 txq->txq_bytes = 0;
5773 #endif
5774 }
5775
5776 static void
5777 wm_init_sysctls(struct wm_softc *sc)
5778 {
5779 struct sysctllog **log;
5780 const struct sysctlnode *rnode, *cnode;
5781 int rv;
5782 const char *dvname;
5783
5784 log = &sc->sc_sysctllog;
5785 dvname = device_xname(sc->sc_dev);
5786
5787 rv = sysctl_createv(log, 0, NULL, &rnode,
5788 0, CTLTYPE_NODE, dvname,
5789 SYSCTL_DESCR("wm information and settings"),
5790 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
5791 if (rv != 0)
5792 goto err;
5793
5794 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
5795 CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
5796 NULL, 0, &sc->sc_txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL);
5797 if (rv != 0)
5798 goto teardown;
5799
5800 return;
5801
5802 teardown:
5803 sysctl_teardown(log);
5804 err:
5805 sc->sc_sysctllog = NULL;
5806 device_printf(sc->sc_dev, "%s: sysctl_createv failed, rv = %d\n",
5807 __func__, rv);
5808 }
5809
5810 /*
5811 * wm_init: [ifnet interface function]
5812 *
5813 * Initialize the interface.
5814 */
5815 static int
5816 wm_init(struct ifnet *ifp)
5817 {
5818 struct wm_softc *sc = ifp->if_softc;
5819 int ret;
5820
5821 WM_CORE_LOCK(sc);
5822 ret = wm_init_locked(ifp);
5823 WM_CORE_UNLOCK(sc);
5824
5825 return ret;
5826 }
5827
5828 static int
5829 wm_init_locked(struct ifnet *ifp)
5830 {
5831 struct wm_softc *sc = ifp->if_softc;
5832 struct ethercom *ec = &sc->sc_ethercom;
5833 int i, j, trynum, error = 0;
5834 uint32_t reg, sfp_mask = 0;
5835
5836 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5837 device_xname(sc->sc_dev), __func__));
5838 KASSERT(WM_CORE_LOCKED(sc));
5839
5840 /*
5841 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
5842 * There is a small but measurable benefit to avoiding the adjusment
5843 * of the descriptor so that the headers are aligned, for normal mtu,
5844 * on such platforms. One possibility is that the DMA itself is
5845 * slightly more efficient if the front of the entire packet (instead
5846 * of the front of the headers) is aligned.
5847 *
5848 * Note we must always set align_tweak to 0 if we are using
5849 * jumbo frames.
5850 */
5851 #ifdef __NO_STRICT_ALIGNMENT
5852 sc->sc_align_tweak = 0;
5853 #else
5854 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
5855 sc->sc_align_tweak = 0;
5856 else
5857 sc->sc_align_tweak = 2;
5858 #endif /* __NO_STRICT_ALIGNMENT */
5859
5860 /* Cancel any pending I/O. */
5861 wm_stop_locked(ifp, false, false);
5862
5863 /* Update statistics before reset */
5864 if_statadd2(ifp, if_collisions, CSR_READ(sc, WMREG_COLC),
5865 if_ierrors, CSR_READ(sc, WMREG_RXERRC));
5866
5867 /* PCH_SPT hardware workaround */
5868 if (sc->sc_type == WM_T_PCH_SPT)
5869 wm_flush_desc_rings(sc);
5870
5871 /* Reset the chip to a known state. */
5872 wm_reset(sc);
5873
5874 /*
5875 * AMT based hardware can now take control from firmware
5876 * Do this after reset.
5877 */
5878 if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
5879 wm_get_hw_control(sc);
5880
5881 if ((sc->sc_type >= WM_T_PCH_SPT) &&
5882 pci_intr_type(sc->sc_pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_INTX)
5883 wm_legacy_irq_quirk_spt(sc);
5884
5885 /* Init hardware bits */
5886 wm_initialize_hardware_bits(sc);
5887
5888 /* Reset the PHY. */
5889 if (sc->sc_flags & WM_F_HAS_MII)
5890 wm_gmii_reset(sc);
5891
5892 if (sc->sc_type >= WM_T_ICH8) {
5893 reg = CSR_READ(sc, WMREG_GCR);
5894 /*
5895 * ICH8 No-snoop bits are opposite polarity. Set to snoop by
5896 * default after reset.
5897 */
5898 if (sc->sc_type == WM_T_ICH8)
5899 reg |= GCR_NO_SNOOP_ALL;
5900 else
5901 reg &= ~GCR_NO_SNOOP_ALL;
5902 CSR_WRITE(sc, WMREG_GCR, reg);
5903 }
5904
5905 if ((sc->sc_type >= WM_T_ICH8)
5906 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER)
5907 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3)) {
5908
5909 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5910 reg |= CTRL_EXT_RO_DIS;
5911 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5912 }
5913
5914 /* Calculate (E)ITR value */
5915 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0 && sc->sc_type != WM_T_82575) {
5916 /*
5917 * For NEWQUEUE's EITR (except for 82575).
5918 * 82575's EITR should be set same throttling value as other
5919 * old controllers' ITR because the interrupt/sec calculation
5920 * is the same, that is, 1,000,000,000 / (N * 256).
5921 *
5922 * 82574's EITR should be set same throttling value as ITR.
5923 *
5924 * For N interrupts/sec, set this value to:
5925 * 1,000,000 / N in contrast to ITR throttoling value.
5926 */
5927 sc->sc_itr_init = 450;
5928 } else if (sc->sc_type >= WM_T_82543) {
5929 /*
5930 * Set up the interrupt throttling register (units of 256ns)
5931 * Note that a footnote in Intel's documentation says this
5932 * ticker runs at 1/4 the rate when the chip is in 100Mbit
5933 * or 10Mbit mode. Empirically, it appears to be the case
5934 * that that is also true for the 1024ns units of the other
5935 * interrupt-related timer registers -- so, really, we ought
5936 * to divide this value by 4 when the link speed is low.
5937 *
5938 * XXX implement this division at link speed change!
5939 */
5940
5941 /*
5942 * For N interrupts/sec, set this value to:
5943 * 1,000,000,000 / (N * 256). Note that we set the
5944 * absolute and packet timer values to this value
5945 * divided by 4 to get "simple timer" behavior.
5946 */
5947 sc->sc_itr_init = 1500; /* 2604 ints/sec */
5948 }
5949
5950 error = wm_init_txrx_queues(sc);
5951 if (error)
5952 goto out;
5953
5954 if (((sc->sc_flags & WM_F_SGMII) == 0) &&
5955 (sc->sc_mediatype == WM_MEDIATYPE_SERDES) &&
5956 (sc->sc_type >= WM_T_82575))
5957 wm_serdes_power_up_link_82575(sc);
5958
5959 /* Clear out the VLAN table -- we don't use it (yet). */
5960 CSR_WRITE(sc, WMREG_VET, 0);
5961 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
5962 trynum = 10; /* Due to hw errata */
5963 else
5964 trynum = 1;
5965 for (i = 0; i < WM_VLAN_TABSIZE; i++)
5966 for (j = 0; j < trynum; j++)
5967 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
5968
5969 /*
5970 * Set up flow-control parameters.
5971 *
5972 * XXX Values could probably stand some tuning.
5973 */
5974 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
5975 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH)
5976 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)
5977 && (sc->sc_type != WM_T_PCH_SPT) && (sc->sc_type != WM_T_PCH_CNP)){
5978 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
5979 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
5980 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
5981 }
5982
5983 sc->sc_fcrtl = FCRTL_DFLT;
5984 if (sc->sc_type < WM_T_82543) {
5985 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
5986 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl);
5987 } else {
5988 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
5989 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
5990 }
5991
5992 if (sc->sc_type == WM_T_80003)
5993 CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
5994 else
5995 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
5996
5997 /* Writes the control register. */
5998 wm_set_vlan(sc);
5999
6000 if (sc->sc_flags & WM_F_HAS_MII) {
6001 uint16_t kmreg;
6002
6003 switch (sc->sc_type) {
6004 case WM_T_80003:
6005 case WM_T_ICH8:
6006 case WM_T_ICH9:
6007 case WM_T_ICH10:
6008 case WM_T_PCH:
6009 case WM_T_PCH2:
6010 case WM_T_PCH_LPT:
6011 case WM_T_PCH_SPT:
6012 case WM_T_PCH_CNP:
6013 /*
6014 * Set the mac to wait the maximum time between each
6015 * iteration and increase the max iterations when
6016 * polling the phy; this fixes erroneous timeouts at
6017 * 10Mbps.
6018 */
6019 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
6020 0xFFFF);
6021 wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
6022 &kmreg);
6023 kmreg |= 0x3F;
6024 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
6025 kmreg);
6026 break;
6027 default:
6028 break;
6029 }
6030
6031 if (sc->sc_type == WM_T_80003) {
6032 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6033 reg &= ~CTRL_EXT_LINK_MODE_MASK;
6034 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6035
6036 /* Bypass RX and TX FIFO's */
6037 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
6038 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS
6039 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
6040 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
6041 KUMCTRLSTA_INB_CTRL_DIS_PADDING |
6042 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
6043 }
6044 }
6045 #if 0
6046 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
6047 #endif
6048
6049 /* Set up checksum offload parameters. */
6050 reg = CSR_READ(sc, WMREG_RXCSUM);
6051 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL);
6052 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
6053 reg |= RXCSUM_IPOFL;
6054 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx))
6055 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
6056 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
6057 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL;
6058 CSR_WRITE(sc, WMREG_RXCSUM, reg);
6059
6060 /* Set registers about MSI-X */
6061 if (wm_is_using_msix(sc)) {
6062 uint32_t ivar, qintr_idx;
6063 struct wm_queue *wmq;
6064 unsigned int qid;
6065
6066 if (sc->sc_type == WM_T_82575) {
6067 /* Interrupt control */
6068 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6069 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR;
6070 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6071
6072 /* TX and RX */
6073 for (i = 0; i < sc->sc_nqueues; i++) {
6074 wmq = &sc->sc_queue[i];
6075 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx),
6076 EITR_TX_QUEUE(wmq->wmq_id)
6077 | EITR_RX_QUEUE(wmq->wmq_id));
6078 }
6079 /* Link status */
6080 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx),
6081 EITR_OTHER);
6082 } else if (sc->sc_type == WM_T_82574) {
6083 /* Interrupt control */
6084 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6085 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME;
6086 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6087
6088 /*
6089 * Workaround issue with spurious interrupts
6090 * in MSI-X mode.
6091 * At wm_initialize_hardware_bits(), sc_nintrs has not
6092 * initialized yet. So re-initialize WMREG_RFCTL here.
6093 */
6094 reg = CSR_READ(sc, WMREG_RFCTL);
6095 reg |= WMREG_RFCTL_ACKDIS;
6096 CSR_WRITE(sc, WMREG_RFCTL, reg);
6097
6098 ivar = 0;
6099 /* TX and RX */
6100 for (i = 0; i < sc->sc_nqueues; i++) {
6101 wmq = &sc->sc_queue[i];
6102 qid = wmq->wmq_id;
6103 qintr_idx = wmq->wmq_intr_idx;
6104
6105 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
6106 IVAR_TX_MASK_Q_82574(qid));
6107 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
6108 IVAR_RX_MASK_Q_82574(qid));
6109 }
6110 /* Link status */
6111 ivar |= __SHIFTIN((IVAR_VALID_82574
6112 | sc->sc_link_intr_idx), IVAR_OTHER_MASK);
6113 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB);
6114 } else {
6115 /* Interrupt control */
6116 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX
6117 | GPIE_EIAME | GPIE_PBA);
6118
6119 switch (sc->sc_type) {
6120 case WM_T_82580:
6121 case WM_T_I350:
6122 case WM_T_I354:
6123 case WM_T_I210:
6124 case WM_T_I211:
6125 /* TX and RX */
6126 for (i = 0; i < sc->sc_nqueues; i++) {
6127 wmq = &sc->sc_queue[i];
6128 qid = wmq->wmq_id;
6129 qintr_idx = wmq->wmq_intr_idx;
6130
6131 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid));
6132 ivar &= ~IVAR_TX_MASK_Q(qid);
6133 ivar |= __SHIFTIN((qintr_idx
6134 | IVAR_VALID),
6135 IVAR_TX_MASK_Q(qid));
6136 ivar &= ~IVAR_RX_MASK_Q(qid);
6137 ivar |= __SHIFTIN((qintr_idx
6138 | IVAR_VALID),
6139 IVAR_RX_MASK_Q(qid));
6140 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar);
6141 }
6142 break;
6143 case WM_T_82576:
6144 /* TX and RX */
6145 for (i = 0; i < sc->sc_nqueues; i++) {
6146 wmq = &sc->sc_queue[i];
6147 qid = wmq->wmq_id;
6148 qintr_idx = wmq->wmq_intr_idx;
6149
6150 ivar = CSR_READ(sc,
6151 WMREG_IVAR_Q_82576(qid));
6152 ivar &= ~IVAR_TX_MASK_Q_82576(qid);
6153 ivar |= __SHIFTIN((qintr_idx
6154 | IVAR_VALID),
6155 IVAR_TX_MASK_Q_82576(qid));
6156 ivar &= ~IVAR_RX_MASK_Q_82576(qid);
6157 ivar |= __SHIFTIN((qintr_idx
6158 | IVAR_VALID),
6159 IVAR_RX_MASK_Q_82576(qid));
6160 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid),
6161 ivar);
6162 }
6163 break;
6164 default:
6165 break;
6166 }
6167
6168 /* Link status */
6169 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID),
6170 IVAR_MISC_OTHER);
6171 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar);
6172 }
6173
6174 if (wm_is_using_multiqueue(sc)) {
6175 wm_init_rss(sc);
6176
6177 /*
6178 ** NOTE: Receive Full-Packet Checksum Offload
6179 ** is mutually exclusive with Multiqueue. However
6180 ** this is not the same as TCP/IP checksums which
6181 ** still work.
6182 */
6183 reg = CSR_READ(sc, WMREG_RXCSUM);
6184 reg |= RXCSUM_PCSD;
6185 CSR_WRITE(sc, WMREG_RXCSUM, reg);
6186 }
6187 }
6188
6189 /* Set up the interrupt registers. */
6190 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
6191
6192 /* Enable SFP module insertion interrupt if it's required */
6193 if ((sc->sc_flags & WM_F_SFP) != 0) {
6194 sc->sc_ctrl |= CTRL_EXTLINK_EN;
6195 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
6196 sfp_mask = ICR_GPI(0);
6197 }
6198
6199 if (wm_is_using_msix(sc)) {
6200 uint32_t mask;
6201 struct wm_queue *wmq;
6202
6203 switch (sc->sc_type) {
6204 case WM_T_82574:
6205 mask = 0;
6206 for (i = 0; i < sc->sc_nqueues; i++) {
6207 wmq = &sc->sc_queue[i];
6208 mask |= ICR_TXQ(wmq->wmq_id);
6209 mask |= ICR_RXQ(wmq->wmq_id);
6210 }
6211 mask |= ICR_OTHER;
6212 CSR_WRITE(sc, WMREG_EIAC_82574, mask);
6213 CSR_WRITE(sc, WMREG_IMS, mask | ICR_LSC);
6214 break;
6215 default:
6216 if (sc->sc_type == WM_T_82575) {
6217 mask = 0;
6218 for (i = 0; i < sc->sc_nqueues; i++) {
6219 wmq = &sc->sc_queue[i];
6220 mask |= EITR_TX_QUEUE(wmq->wmq_id);
6221 mask |= EITR_RX_QUEUE(wmq->wmq_id);
6222 }
6223 mask |= EITR_OTHER;
6224 } else {
6225 mask = 0;
6226 for (i = 0; i < sc->sc_nqueues; i++) {
6227 wmq = &sc->sc_queue[i];
6228 mask |= 1 << wmq->wmq_intr_idx;
6229 }
6230 mask |= 1 << sc->sc_link_intr_idx;
6231 }
6232 CSR_WRITE(sc, WMREG_EIAC, mask);
6233 CSR_WRITE(sc, WMREG_EIAM, mask);
6234 CSR_WRITE(sc, WMREG_EIMS, mask);
6235
6236 /* For other interrupts */
6237 CSR_WRITE(sc, WMREG_IMS, ICR_LSC | sfp_mask);
6238 break;
6239 }
6240 } else {
6241 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
6242 ICR_RXO | ICR_RXT0 | sfp_mask;
6243 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
6244 }
6245
6246 /* Set up the inter-packet gap. */
6247 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
6248
6249 if (sc->sc_type >= WM_T_82543) {
6250 for (int qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6251 struct wm_queue *wmq = &sc->sc_queue[qidx];
6252 wm_itrs_writereg(sc, wmq);
6253 }
6254 /*
6255 * Link interrupts occur much less than TX
6256 * interrupts and RX interrupts. So, we don't
6257 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like
6258 * FreeBSD's if_igb.
6259 */
6260 }
6261
6262 /* Set the VLAN ethernetype. */
6263 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
6264
6265 /*
6266 * Set up the transmit control register; we start out with
6267 * a collision distance suitable for FDX, but update it whe
6268 * we resolve the media type.
6269 */
6270 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
6271 | TCTL_CT(TX_COLLISION_THRESHOLD)
6272 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
6273 if (sc->sc_type >= WM_T_82571)
6274 sc->sc_tctl |= TCTL_MULR;
6275 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
6276
6277 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6278 /* Write TDT after TCTL.EN is set. See the document. */
6279 CSR_WRITE(sc, WMREG_TDT(0), 0);
6280 }
6281
6282 if (sc->sc_type == WM_T_80003) {
6283 reg = CSR_READ(sc, WMREG_TCTL_EXT);
6284 reg &= ~TCTL_EXT_GCEX_MASK;
6285 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
6286 CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
6287 }
6288
6289 /* Set the media. */
6290 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
6291 goto out;
6292
6293 /* Configure for OS presence */
6294 wm_init_manageability(sc);
6295
6296 /*
6297 * Set up the receive control register; we actually program the
6298 * register when we set the receive filter. Use multicast address
6299 * offset type 0.
6300 *
6301 * Only the i82544 has the ability to strip the incoming CRC, so we
6302 * don't enable that feature.
6303 */
6304 sc->sc_mchash_type = 0;
6305 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
6306 | __SHIFTIN(sc->sc_mchash_type, RCTL_MO);
6307
6308 /* 82574 use one buffer extended Rx descriptor. */
6309 if (sc->sc_type == WM_T_82574)
6310 sc->sc_rctl |= RCTL_DTYP_ONEBUF;
6311
6312 /*
6313 * The I350 has a bug where it always strips the CRC whether
6314 * asked to or not. So ask for stripped CRC here and cope in rxeof
6315 */
6316 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
6317 || (sc->sc_type == WM_T_I210))
6318 sc->sc_rctl |= RCTL_SECRC;
6319
6320 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
6321 && (ifp->if_mtu > ETHERMTU)) {
6322 sc->sc_rctl |= RCTL_LPE;
6323 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6324 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
6325 }
6326
6327 if (MCLBYTES == 2048)
6328 sc->sc_rctl |= RCTL_2k;
6329 else {
6330 if (sc->sc_type >= WM_T_82543) {
6331 switch (MCLBYTES) {
6332 case 4096:
6333 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k;
6334 break;
6335 case 8192:
6336 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k;
6337 break;
6338 case 16384:
6339 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k;
6340 break;
6341 default:
6342 panic("wm_init: MCLBYTES %d unsupported",
6343 MCLBYTES);
6344 break;
6345 }
6346 } else
6347 panic("wm_init: i82542 requires MCLBYTES = 2048");
6348 }
6349
6350 /* Enable ECC */
6351 switch (sc->sc_type) {
6352 case WM_T_82571:
6353 reg = CSR_READ(sc, WMREG_PBA_ECC);
6354 reg |= PBA_ECC_CORR_EN;
6355 CSR_WRITE(sc, WMREG_PBA_ECC, reg);
6356 break;
6357 case WM_T_PCH_LPT:
6358 case WM_T_PCH_SPT:
6359 case WM_T_PCH_CNP:
6360 reg = CSR_READ(sc, WMREG_PBECCSTS);
6361 reg |= PBECCSTS_UNCORR_ECC_ENABLE;
6362 CSR_WRITE(sc, WMREG_PBECCSTS, reg);
6363
6364 sc->sc_ctrl |= CTRL_MEHE;
6365 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
6366 break;
6367 default:
6368 break;
6369 }
6370
6371 /*
6372 * Set the receive filter.
6373 *
6374 * For 82575 and 82576, the RX descriptors must be initialized after
6375 * the setting of RCTL.EN in wm_set_filter()
6376 */
6377 wm_set_filter(sc);
6378
6379 /* On 575 and later set RDT only if RX enabled */
6380 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6381 int qidx;
6382 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6383 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq;
6384 for (i = 0; i < WM_NRXDESC; i++) {
6385 mutex_enter(rxq->rxq_lock);
6386 wm_init_rxdesc(rxq, i);
6387 mutex_exit(rxq->rxq_lock);
6388
6389 }
6390 }
6391 }
6392
6393 wm_unset_stopping_flags(sc);
6394
6395 /* Start the one second link check clock. */
6396 callout_schedule(&sc->sc_tick_ch, hz);
6397
6398 /* ...all done! */
6399 ifp->if_flags |= IFF_RUNNING;
6400
6401 out:
6402 /* Save last flags for the callback */
6403 sc->sc_if_flags = ifp->if_flags;
6404 sc->sc_ec_capenable = ec->ec_capenable;
6405 if (error)
6406 log(LOG_ERR, "%s: interface not running\n",
6407 device_xname(sc->sc_dev));
6408 return error;
6409 }
6410
6411 /*
6412 * wm_stop: [ifnet interface function]
6413 *
6414 * Stop transmission on the interface.
6415 */
6416 static void
6417 wm_stop(struct ifnet *ifp, int disable)
6418 {
6419 struct wm_softc *sc = ifp->if_softc;
6420
6421 ASSERT_SLEEPABLE();
6422
6423 WM_CORE_LOCK(sc);
6424 wm_stop_locked(ifp, disable ? true : false, true);
6425 WM_CORE_UNLOCK(sc);
6426
6427 /*
6428 * After wm_set_stopping_flags(), it is guaranteed
6429 * wm_handle_queue_work() does not call workqueue_enqueue().
6430 * However, workqueue_wait() cannot call in wm_stop_locked()
6431 * because it can sleep...
6432 * so, call workqueue_wait() here.
6433 */
6434 for (int i = 0; i < sc->sc_nqueues; i++)
6435 workqueue_wait(sc->sc_queue_wq, &sc->sc_queue[i].wmq_cookie);
6436 }
6437
6438 static void
6439 wm_stop_locked(struct ifnet *ifp, bool disable, bool wait)
6440 {
6441 struct wm_softc *sc = ifp->if_softc;
6442 struct wm_txsoft *txs;
6443 int i, qidx;
6444
6445 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
6446 device_xname(sc->sc_dev), __func__));
6447 KASSERT(WM_CORE_LOCKED(sc));
6448
6449 wm_set_stopping_flags(sc);
6450
6451 if (sc->sc_flags & WM_F_HAS_MII) {
6452 /* Down the MII. */
6453 mii_down(&sc->sc_mii);
6454 } else {
6455 #if 0
6456 /* Should we clear PHY's status properly? */
6457 wm_reset(sc);
6458 #endif
6459 }
6460
6461 /* Stop the transmit and receive processes. */
6462 CSR_WRITE(sc, WMREG_TCTL, 0);
6463 CSR_WRITE(sc, WMREG_RCTL, 0);
6464 sc->sc_rctl &= ~RCTL_EN;
6465
6466 /*
6467 * Clear the interrupt mask to ensure the device cannot assert its
6468 * interrupt line.
6469 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to
6470 * service any currently pending or shared interrupt.
6471 */
6472 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
6473 sc->sc_icr = 0;
6474 if (wm_is_using_msix(sc)) {
6475 if (sc->sc_type != WM_T_82574) {
6476 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
6477 CSR_WRITE(sc, WMREG_EIAC, 0);
6478 } else
6479 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
6480 }
6481
6482 /*
6483 * Stop callouts after interrupts are disabled; if we have
6484 * to wait for them, we will be releasing the CORE_LOCK
6485 * briefly, which will unblock interrupts on the current CPU.
6486 */
6487
6488 /* Stop the one second clock. */
6489 if (wait)
6490 callout_halt(&sc->sc_tick_ch, sc->sc_core_lock);
6491 else
6492 callout_stop(&sc->sc_tick_ch);
6493
6494 /* Stop the 82547 Tx FIFO stall check timer. */
6495 if (sc->sc_type == WM_T_82547) {
6496 if (wait)
6497 callout_halt(&sc->sc_txfifo_ch, sc->sc_core_lock);
6498 else
6499 callout_stop(&sc->sc_txfifo_ch);
6500 }
6501
6502 /* Release any queued transmit buffers. */
6503 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6504 struct wm_queue *wmq = &sc->sc_queue[qidx];
6505 struct wm_txqueue *txq = &wmq->wmq_txq;
6506 mutex_enter(txq->txq_lock);
6507 txq->txq_sending = false; /* Ensure watchdog disabled */
6508 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6509 txs = &txq->txq_soft[i];
6510 if (txs->txs_mbuf != NULL) {
6511 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap);
6512 m_freem(txs->txs_mbuf);
6513 txs->txs_mbuf = NULL;
6514 }
6515 }
6516 mutex_exit(txq->txq_lock);
6517 }
6518
6519 /* Mark the interface as down and cancel the watchdog timer. */
6520 ifp->if_flags &= ~IFF_RUNNING;
6521
6522 if (disable) {
6523 for (i = 0; i < sc->sc_nqueues; i++) {
6524 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6525 mutex_enter(rxq->rxq_lock);
6526 wm_rxdrain(rxq);
6527 mutex_exit(rxq->rxq_lock);
6528 }
6529 }
6530
6531 #if 0 /* notyet */
6532 if (sc->sc_type >= WM_T_82544)
6533 CSR_WRITE(sc, WMREG_WUC, 0);
6534 #endif
6535 }
6536
6537 static void
6538 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0)
6539 {
6540 struct mbuf *m;
6541 int i;
6542
6543 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev));
6544 for (m = m0, i = 0; m != NULL; m = m->m_next, i++)
6545 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, "
6546 "m_flags = 0x%08x\n", device_xname(sc->sc_dev),
6547 m->m_data, m->m_len, m->m_flags);
6548 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev),
6549 i, i == 1 ? "" : "s");
6550 }
6551
6552 /*
6553 * wm_82547_txfifo_stall:
6554 *
6555 * Callout used to wait for the 82547 Tx FIFO to drain,
6556 * reset the FIFO pointers, and restart packet transmission.
6557 */
6558 static void
6559 wm_82547_txfifo_stall(void *arg)
6560 {
6561 struct wm_softc *sc = arg;
6562 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6563
6564 mutex_enter(txq->txq_lock);
6565
6566 if (txq->txq_stopping)
6567 goto out;
6568
6569 if (txq->txq_fifo_stall) {
6570 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) &&
6571 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) &&
6572 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) {
6573 /*
6574 * Packets have drained. Stop transmitter, reset
6575 * FIFO pointers, restart transmitter, and kick
6576 * the packet queue.
6577 */
6578 uint32_t tctl = CSR_READ(sc, WMREG_TCTL);
6579 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN);
6580 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr);
6581 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr);
6582 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr);
6583 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr);
6584 CSR_WRITE(sc, WMREG_TCTL, tctl);
6585 CSR_WRITE_FLUSH(sc);
6586
6587 txq->txq_fifo_head = 0;
6588 txq->txq_fifo_stall = 0;
6589 wm_start_locked(&sc->sc_ethercom.ec_if);
6590 } else {
6591 /*
6592 * Still waiting for packets to drain; try again in
6593 * another tick.
6594 */
6595 callout_schedule(&sc->sc_txfifo_ch, 1);
6596 }
6597 }
6598
6599 out:
6600 mutex_exit(txq->txq_lock);
6601 }
6602
6603 /*
6604 * wm_82547_txfifo_bugchk:
6605 *
6606 * Check for bug condition in the 82547 Tx FIFO. We need to
6607 * prevent enqueueing a packet that would wrap around the end
6608 * if the Tx FIFO ring buffer, otherwise the chip will croak.
6609 *
6610 * We do this by checking the amount of space before the end
6611 * of the Tx FIFO buffer. If the packet will not fit, we "stall"
6612 * the Tx FIFO, wait for all remaining packets to drain, reset
6613 * the internal FIFO pointers to the beginning, and restart
6614 * transmission on the interface.
6615 */
6616 #define WM_FIFO_HDR 0x10
6617 #define WM_82547_PAD_LEN 0x3e0
6618 static int
6619 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0)
6620 {
6621 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6622 int space = txq->txq_fifo_size - txq->txq_fifo_head;
6623 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR);
6624
6625 /* Just return if already stalled. */
6626 if (txq->txq_fifo_stall)
6627 return 1;
6628
6629 if (sc->sc_mii.mii_media_active & IFM_FDX) {
6630 /* Stall only occurs in half-duplex mode. */
6631 goto send_packet;
6632 }
6633
6634 if (len >= WM_82547_PAD_LEN + space) {
6635 txq->txq_fifo_stall = 1;
6636 callout_schedule(&sc->sc_txfifo_ch, 1);
6637 return 1;
6638 }
6639
6640 send_packet:
6641 txq->txq_fifo_head += len;
6642 if (txq->txq_fifo_head >= txq->txq_fifo_size)
6643 txq->txq_fifo_head -= txq->txq_fifo_size;
6644
6645 return 0;
6646 }
6647
6648 static int
6649 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6650 {
6651 int error;
6652
6653 /*
6654 * Allocate the control data structures, and create and load the
6655 * DMA map for it.
6656 *
6657 * NOTE: All Tx descriptors must be in the same 4G segment of
6658 * memory. So must Rx descriptors. We simplify by allocating
6659 * both sets within the same 4G segment.
6660 */
6661 if (sc->sc_type < WM_T_82544)
6662 WM_NTXDESC(txq) = WM_NTXDESC_82542;
6663 else
6664 WM_NTXDESC(txq) = WM_NTXDESC_82544;
6665 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6666 txq->txq_descsize = sizeof(nq_txdesc_t);
6667 else
6668 txq->txq_descsize = sizeof(wiseman_txdesc_t);
6669
6670 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq),
6671 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg,
6672 1, &txq->txq_desc_rseg, 0)) != 0) {
6673 aprint_error_dev(sc->sc_dev,
6674 "unable to allocate TX control data, error = %d\n",
6675 error);
6676 goto fail_0;
6677 }
6678
6679 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg,
6680 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq),
6681 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) {
6682 aprint_error_dev(sc->sc_dev,
6683 "unable to map TX control data, error = %d\n", error);
6684 goto fail_1;
6685 }
6686
6687 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1,
6688 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) {
6689 aprint_error_dev(sc->sc_dev,
6690 "unable to create TX control data DMA map, error = %d\n",
6691 error);
6692 goto fail_2;
6693 }
6694
6695 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap,
6696 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) {
6697 aprint_error_dev(sc->sc_dev,
6698 "unable to load TX control data DMA map, error = %d\n",
6699 error);
6700 goto fail_3;
6701 }
6702
6703 return 0;
6704
6705 fail_3:
6706 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6707 fail_2:
6708 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6709 WM_TXDESCS_SIZE(txq));
6710 fail_1:
6711 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6712 fail_0:
6713 return error;
6714 }
6715
6716 static void
6717 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6718 {
6719
6720 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap);
6721 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6722 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6723 WM_TXDESCS_SIZE(txq));
6724 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6725 }
6726
6727 static int
6728 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6729 {
6730 int error;
6731 size_t rxq_descs_size;
6732
6733 /*
6734 * Allocate the control data structures, and create and load the
6735 * DMA map for it.
6736 *
6737 * NOTE: All Tx descriptors must be in the same 4G segment of
6738 * memory. So must Rx descriptors. We simplify by allocating
6739 * both sets within the same 4G segment.
6740 */
6741 rxq->rxq_ndesc = WM_NRXDESC;
6742 if (sc->sc_type == WM_T_82574)
6743 rxq->rxq_descsize = sizeof(ext_rxdesc_t);
6744 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6745 rxq->rxq_descsize = sizeof(nq_rxdesc_t);
6746 else
6747 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t);
6748 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc;
6749
6750 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size,
6751 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg,
6752 1, &rxq->rxq_desc_rseg, 0)) != 0) {
6753 aprint_error_dev(sc->sc_dev,
6754 "unable to allocate RX control data, error = %d\n",
6755 error);
6756 goto fail_0;
6757 }
6758
6759 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg,
6760 rxq->rxq_desc_rseg, rxq_descs_size,
6761 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) {
6762 aprint_error_dev(sc->sc_dev,
6763 "unable to map RX control data, error = %d\n", error);
6764 goto fail_1;
6765 }
6766
6767 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1,
6768 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) {
6769 aprint_error_dev(sc->sc_dev,
6770 "unable to create RX control data DMA map, error = %d\n",
6771 error);
6772 goto fail_2;
6773 }
6774
6775 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap,
6776 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) {
6777 aprint_error_dev(sc->sc_dev,
6778 "unable to load RX control data DMA map, error = %d\n",
6779 error);
6780 goto fail_3;
6781 }
6782
6783 return 0;
6784
6785 fail_3:
6786 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
6787 fail_2:
6788 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
6789 rxq_descs_size);
6790 fail_1:
6791 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
6792 fail_0:
6793 return error;
6794 }
6795
6796 static void
6797 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6798 {
6799
6800 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap);
6801 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
6802 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
6803 rxq->rxq_descsize * rxq->rxq_ndesc);
6804 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
6805 }
6806
6807
6808 static int
6809 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
6810 {
6811 int i, error;
6812
6813 /* Create the transmit buffer DMA maps. */
6814 WM_TXQUEUELEN(txq) =
6815 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ?
6816 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX;
6817 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6818 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA,
6819 WM_NTXSEGS, WTX_MAX_LEN, 0, 0,
6820 &txq->txq_soft[i].txs_dmamap)) != 0) {
6821 aprint_error_dev(sc->sc_dev,
6822 "unable to create Tx DMA map %d, error = %d\n",
6823 i, error);
6824 goto fail;
6825 }
6826 }
6827
6828 return 0;
6829
6830 fail:
6831 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6832 if (txq->txq_soft[i].txs_dmamap != NULL)
6833 bus_dmamap_destroy(sc->sc_dmat,
6834 txq->txq_soft[i].txs_dmamap);
6835 }
6836 return error;
6837 }
6838
6839 static void
6840 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
6841 {
6842 int i;
6843
6844 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6845 if (txq->txq_soft[i].txs_dmamap != NULL)
6846 bus_dmamap_destroy(sc->sc_dmat,
6847 txq->txq_soft[i].txs_dmamap);
6848 }
6849 }
6850
6851 static int
6852 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6853 {
6854 int i, error;
6855
6856 /* Create the receive buffer DMA maps. */
6857 for (i = 0; i < rxq->rxq_ndesc; i++) {
6858 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
6859 MCLBYTES, 0, 0,
6860 &rxq->rxq_soft[i].rxs_dmamap)) != 0) {
6861 aprint_error_dev(sc->sc_dev,
6862 "unable to create Rx DMA map %d error = %d\n",
6863 i, error);
6864 goto fail;
6865 }
6866 rxq->rxq_soft[i].rxs_mbuf = NULL;
6867 }
6868
6869 return 0;
6870
6871 fail:
6872 for (i = 0; i < rxq->rxq_ndesc; i++) {
6873 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
6874 bus_dmamap_destroy(sc->sc_dmat,
6875 rxq->rxq_soft[i].rxs_dmamap);
6876 }
6877 return error;
6878 }
6879
6880 static void
6881 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6882 {
6883 int i;
6884
6885 for (i = 0; i < rxq->rxq_ndesc; i++) {
6886 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
6887 bus_dmamap_destroy(sc->sc_dmat,
6888 rxq->rxq_soft[i].rxs_dmamap);
6889 }
6890 }
6891
6892 /*
6893 * wm_alloc_quques:
6894 * Allocate {tx,rx}descs and {tx,rx} buffers
6895 */
6896 static int
6897 wm_alloc_txrx_queues(struct wm_softc *sc)
6898 {
6899 int i, error, tx_done, rx_done;
6900
6901 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues,
6902 KM_SLEEP);
6903 if (sc->sc_queue == NULL) {
6904 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n");
6905 error = ENOMEM;
6906 goto fail_0;
6907 }
6908
6909 /* For transmission */
6910 error = 0;
6911 tx_done = 0;
6912 for (i = 0; i < sc->sc_nqueues; i++) {
6913 #ifdef WM_EVENT_COUNTERS
6914 int j;
6915 const char *xname;
6916 #endif
6917 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6918 txq->txq_sc = sc;
6919 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
6920
6921 error = wm_alloc_tx_descs(sc, txq);
6922 if (error)
6923 break;
6924 error = wm_alloc_tx_buffer(sc, txq);
6925 if (error) {
6926 wm_free_tx_descs(sc, txq);
6927 break;
6928 }
6929 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP);
6930 if (txq->txq_interq == NULL) {
6931 wm_free_tx_descs(sc, txq);
6932 wm_free_tx_buffer(sc, txq);
6933 error = ENOMEM;
6934 break;
6935 }
6936
6937 #ifdef WM_EVENT_COUNTERS
6938 xname = device_xname(sc->sc_dev);
6939
6940 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname);
6941 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname);
6942 WM_Q_MISC_EVCNT_ATTACH(txq, fifo_stall, txq, i, xname);
6943 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname);
6944 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname);
6945 WM_Q_MISC_EVCNT_ATTACH(txq, ipsum, txq, i, xname);
6946 WM_Q_MISC_EVCNT_ATTACH(txq, tusum, txq, i, xname);
6947 WM_Q_MISC_EVCNT_ATTACH(txq, tusum6, txq, i, xname);
6948 WM_Q_MISC_EVCNT_ATTACH(txq, tso, txq, i, xname);
6949 WM_Q_MISC_EVCNT_ATTACH(txq, tso6, txq, i, xname);
6950 WM_Q_MISC_EVCNT_ATTACH(txq, tsopain, txq, i, xname);
6951
6952 for (j = 0; j < WM_NTXSEGS; j++) {
6953 snprintf(txq->txq_txseg_evcnt_names[j],
6954 sizeof(txq->txq_txseg_evcnt_names[j]), "txq%02dtxseg%d", i, j);
6955 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], EVCNT_TYPE_MISC,
6956 NULL, xname, txq->txq_txseg_evcnt_names[j]);
6957 }
6958
6959 WM_Q_MISC_EVCNT_ATTACH(txq, pcqdrop, txq, i, xname);
6960 WM_Q_MISC_EVCNT_ATTACH(txq, descdrop, txq, i, xname);
6961 WM_Q_MISC_EVCNT_ATTACH(txq, toomanyseg, txq, i, xname);
6962 WM_Q_MISC_EVCNT_ATTACH(txq, defrag, txq, i, xname);
6963 WM_Q_MISC_EVCNT_ATTACH(txq, underrun, txq, i, xname);
6964 WM_Q_MISC_EVCNT_ATTACH(txq, skipcontext, txq, i, xname);
6965 #endif /* WM_EVENT_COUNTERS */
6966
6967 tx_done++;
6968 }
6969 if (error)
6970 goto fail_1;
6971
6972 /* For receive */
6973 error = 0;
6974 rx_done = 0;
6975 for (i = 0; i < sc->sc_nqueues; i++) {
6976 #ifdef WM_EVENT_COUNTERS
6977 const char *xname;
6978 #endif
6979 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6980 rxq->rxq_sc = sc;
6981 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
6982
6983 error = wm_alloc_rx_descs(sc, rxq);
6984 if (error)
6985 break;
6986
6987 error = wm_alloc_rx_buffer(sc, rxq);
6988 if (error) {
6989 wm_free_rx_descs(sc, rxq);
6990 break;
6991 }
6992
6993 #ifdef WM_EVENT_COUNTERS
6994 xname = device_xname(sc->sc_dev);
6995
6996 WM_Q_INTR_EVCNT_ATTACH(rxq, intr, rxq, i, xname);
6997 WM_Q_INTR_EVCNT_ATTACH(rxq, defer, rxq, i, xname);
6998
6999 WM_Q_MISC_EVCNT_ATTACH(rxq, ipsum, rxq, i, xname);
7000 WM_Q_MISC_EVCNT_ATTACH(rxq, tusum, rxq, i, xname);
7001 #endif /* WM_EVENT_COUNTERS */
7002
7003 rx_done++;
7004 }
7005 if (error)
7006 goto fail_2;
7007
7008 return 0;
7009
7010 fail_2:
7011 for (i = 0; i < rx_done; i++) {
7012 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
7013 wm_free_rx_buffer(sc, rxq);
7014 wm_free_rx_descs(sc, rxq);
7015 if (rxq->rxq_lock)
7016 mutex_obj_free(rxq->rxq_lock);
7017 }
7018 fail_1:
7019 for (i = 0; i < tx_done; i++) {
7020 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
7021 pcq_destroy(txq->txq_interq);
7022 wm_free_tx_buffer(sc, txq);
7023 wm_free_tx_descs(sc, txq);
7024 if (txq->txq_lock)
7025 mutex_obj_free(txq->txq_lock);
7026 }
7027
7028 kmem_free(sc->sc_queue,
7029 sizeof(struct wm_queue) * sc->sc_nqueues);
7030 fail_0:
7031 return error;
7032 }
7033
7034 /*
7035 * wm_free_quques:
7036 * Free {tx,rx}descs and {tx,rx} buffers
7037 */
7038 static void
7039 wm_free_txrx_queues(struct wm_softc *sc)
7040 {
7041 int i;
7042
7043 for (i = 0; i < sc->sc_nqueues; i++) {
7044 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
7045
7046 #ifdef WM_EVENT_COUNTERS
7047 WM_Q_EVCNT_DETACH(rxq, intr, rxq, i);
7048 WM_Q_EVCNT_DETACH(rxq, defer, rxq, i);
7049 WM_Q_EVCNT_DETACH(rxq, ipsum, rxq, i);
7050 WM_Q_EVCNT_DETACH(rxq, tusum, rxq, i);
7051 #endif /* WM_EVENT_COUNTERS */
7052
7053 wm_free_rx_buffer(sc, rxq);
7054 wm_free_rx_descs(sc, rxq);
7055 if (rxq->rxq_lock)
7056 mutex_obj_free(rxq->rxq_lock);
7057 }
7058
7059 for (i = 0; i < sc->sc_nqueues; i++) {
7060 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
7061 struct mbuf *m;
7062 #ifdef WM_EVENT_COUNTERS
7063 int j;
7064
7065 WM_Q_EVCNT_DETACH(txq, txsstall, txq, i);
7066 WM_Q_EVCNT_DETACH(txq, txdstall, txq, i);
7067 WM_Q_EVCNT_DETACH(txq, fifo_stall, txq, i);
7068 WM_Q_EVCNT_DETACH(txq, txdw, txq, i);
7069 WM_Q_EVCNT_DETACH(txq, txqe, txq, i);
7070 WM_Q_EVCNT_DETACH(txq, ipsum, txq, i);
7071 WM_Q_EVCNT_DETACH(txq, tusum, txq, i);
7072 WM_Q_EVCNT_DETACH(txq, tusum6, txq, i);
7073 WM_Q_EVCNT_DETACH(txq, tso, txq, i);
7074 WM_Q_EVCNT_DETACH(txq, tso6, txq, i);
7075 WM_Q_EVCNT_DETACH(txq, tsopain, txq, i);
7076
7077 for (j = 0; j < WM_NTXSEGS; j++)
7078 evcnt_detach(&txq->txq_ev_txseg[j]);
7079
7080 WM_Q_EVCNT_DETACH(txq, pcqdrop, txq, i);
7081 WM_Q_EVCNT_DETACH(txq, descdrop, txq, i);
7082 WM_Q_EVCNT_DETACH(txq, toomanyseg, txq, i);
7083 WM_Q_EVCNT_DETACH(txq, defrag, txq, i);
7084 WM_Q_EVCNT_DETACH(txq, underrun, txq, i);
7085 WM_Q_EVCNT_DETACH(txq, skipcontext, txq, i);
7086 #endif /* WM_EVENT_COUNTERS */
7087
7088 /* Drain txq_interq */
7089 while ((m = pcq_get(txq->txq_interq)) != NULL)
7090 m_freem(m);
7091 pcq_destroy(txq->txq_interq);
7092
7093 wm_free_tx_buffer(sc, txq);
7094 wm_free_tx_descs(sc, txq);
7095 if (txq->txq_lock)
7096 mutex_obj_free(txq->txq_lock);
7097 }
7098
7099 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues);
7100 }
7101
7102 static void
7103 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq)
7104 {
7105
7106 KASSERT(mutex_owned(txq->txq_lock));
7107
7108 /* Initialize the transmit descriptor ring. */
7109 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq));
7110 wm_cdtxsync(txq, 0, WM_NTXDESC(txq),
7111 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7112 txq->txq_free = WM_NTXDESC(txq);
7113 txq->txq_next = 0;
7114 }
7115
7116 static void
7117 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq,
7118 struct wm_txqueue *txq)
7119 {
7120
7121 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
7122 device_xname(sc->sc_dev), __func__));
7123 KASSERT(mutex_owned(txq->txq_lock));
7124
7125 if (sc->sc_type < WM_T_82543) {
7126 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0));
7127 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0));
7128 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq));
7129 CSR_WRITE(sc, WMREG_OLD_TDH, 0);
7130 CSR_WRITE(sc, WMREG_OLD_TDT, 0);
7131 CSR_WRITE(sc, WMREG_OLD_TIDV, 128);
7132 } else {
7133 int qid = wmq->wmq_id;
7134
7135 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0));
7136 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0));
7137 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq));
7138 CSR_WRITE(sc, WMREG_TDH(qid), 0);
7139
7140 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7141 /*
7142 * Don't write TDT before TCTL.EN is set.
7143 * See the document.
7144 */
7145 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE
7146 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0)
7147 | TXDCTL_WTHRESH(0));
7148 else {
7149 /* XXX should update with AIM? */
7150 CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4);
7151 if (sc->sc_type >= WM_T_82540) {
7152 /* Should be the same */
7153 CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4);
7154 }
7155
7156 CSR_WRITE(sc, WMREG_TDT(qid), 0);
7157 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) |
7158 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
7159 }
7160 }
7161 }
7162
7163 static void
7164 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq)
7165 {
7166 int i;
7167
7168 KASSERT(mutex_owned(txq->txq_lock));
7169
7170 /* Initialize the transmit job descriptors. */
7171 for (i = 0; i < WM_TXQUEUELEN(txq); i++)
7172 txq->txq_soft[i].txs_mbuf = NULL;
7173 txq->txq_sfree = WM_TXQUEUELEN(txq);
7174 txq->txq_snext = 0;
7175 txq->txq_sdirty = 0;
7176 }
7177
7178 static void
7179 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq,
7180 struct wm_txqueue *txq)
7181 {
7182
7183 KASSERT(mutex_owned(txq->txq_lock));
7184
7185 /*
7186 * Set up some register offsets that are different between
7187 * the i82542 and the i82543 and later chips.
7188 */
7189 if (sc->sc_type < WM_T_82543)
7190 txq->txq_tdt_reg = WMREG_OLD_TDT;
7191 else
7192 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id);
7193
7194 wm_init_tx_descs(sc, txq);
7195 wm_init_tx_regs(sc, wmq, txq);
7196 wm_init_tx_buffer(sc, txq);
7197
7198 txq->txq_flags = 0; /* Clear WM_TXQ_NO_SPACE */
7199 txq->txq_sending = false;
7200 }
7201
7202 static void
7203 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq,
7204 struct wm_rxqueue *rxq)
7205 {
7206
7207 KASSERT(mutex_owned(rxq->rxq_lock));
7208
7209 /*
7210 * Initialize the receive descriptor and receive job
7211 * descriptor rings.
7212 */
7213 if (sc->sc_type < WM_T_82543) {
7214 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0));
7215 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0));
7216 CSR_WRITE(sc, WMREG_OLD_RDLEN0,
7217 rxq->rxq_descsize * rxq->rxq_ndesc);
7218 CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
7219 CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
7220 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD);
7221
7222 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
7223 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
7224 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
7225 CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
7226 CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
7227 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
7228 } else {
7229 int qid = wmq->wmq_id;
7230
7231 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0));
7232 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0));
7233 CSR_WRITE(sc, WMREG_RDLEN(qid),
7234 rxq->rxq_descsize * rxq->rxq_ndesc);
7235
7236 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
7237 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
7238 panic("%s: MCLBYTES %d unsupported for 82575 or higher\n", __func__, MCLBYTES);
7239
7240 /* Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF only. */
7241 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_ADV_ONEBUF
7242 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
7243 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE
7244 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8)
7245 | RXDCTL_WTHRESH(1));
7246 CSR_WRITE(sc, WMREG_RDH(qid), 0);
7247 CSR_WRITE(sc, WMREG_RDT(qid), 0);
7248 } else {
7249 CSR_WRITE(sc, WMREG_RDH(qid), 0);
7250 CSR_WRITE(sc, WMREG_RDT(qid), 0);
7251 /* XXX should update with AIM? */
7252 CSR_WRITE(sc, WMREG_RDTR,
7253 (wmq->wmq_itr / 4) | RDTR_FPD);
7254 /* MUST be same */
7255 CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4);
7256 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) |
7257 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
7258 }
7259 }
7260 }
7261
7262 static int
7263 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
7264 {
7265 struct wm_rxsoft *rxs;
7266 int error, i;
7267
7268 KASSERT(mutex_owned(rxq->rxq_lock));
7269
7270 for (i = 0; i < rxq->rxq_ndesc; i++) {
7271 rxs = &rxq->rxq_soft[i];
7272 if (rxs->rxs_mbuf == NULL) {
7273 if ((error = wm_add_rxbuf(rxq, i)) != 0) {
7274 log(LOG_ERR, "%s: unable to allocate or map "
7275 "rx buffer %d, error = %d\n",
7276 device_xname(sc->sc_dev), i, error);
7277 /*
7278 * XXX Should attempt to run with fewer receive
7279 * XXX buffers instead of just failing.
7280 */
7281 wm_rxdrain(rxq);
7282 return ENOMEM;
7283 }
7284 } else {
7285 /*
7286 * For 82575 and 82576, the RX descriptors must be
7287 * initialized after the setting of RCTL.EN in
7288 * wm_set_filter()
7289 */
7290 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0)
7291 wm_init_rxdesc(rxq, i);
7292 }
7293 }
7294 rxq->rxq_ptr = 0;
7295 rxq->rxq_discard = 0;
7296 WM_RXCHAIN_RESET(rxq);
7297
7298 return 0;
7299 }
7300
7301 static int
7302 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq,
7303 struct wm_rxqueue *rxq)
7304 {
7305
7306 KASSERT(mutex_owned(rxq->rxq_lock));
7307
7308 /*
7309 * Set up some register offsets that are different between
7310 * the i82542 and the i82543 and later chips.
7311 */
7312 if (sc->sc_type < WM_T_82543)
7313 rxq->rxq_rdt_reg = WMREG_OLD_RDT0;
7314 else
7315 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id);
7316
7317 wm_init_rx_regs(sc, wmq, rxq);
7318 return wm_init_rx_buffer(sc, rxq);
7319 }
7320
7321 /*
7322 * wm_init_quques:
7323 * Initialize {tx,rx}descs and {tx,rx} buffers
7324 */
7325 static int
7326 wm_init_txrx_queues(struct wm_softc *sc)
7327 {
7328 int i, error = 0;
7329
7330 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
7331 device_xname(sc->sc_dev), __func__));
7332
7333 for (i = 0; i < sc->sc_nqueues; i++) {
7334 struct wm_queue *wmq = &sc->sc_queue[i];
7335 struct wm_txqueue *txq = &wmq->wmq_txq;
7336 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
7337
7338 /*
7339 * TODO
7340 * Currently, use constant variable instead of AIM.
7341 * Furthermore, the interrupt interval of multiqueue which use
7342 * polling mode is less than default value.
7343 * More tuning and AIM are required.
7344 */
7345 if (wm_is_using_multiqueue(sc))
7346 wmq->wmq_itr = 50;
7347 else
7348 wmq->wmq_itr = sc->sc_itr_init;
7349 wmq->wmq_set_itr = true;
7350
7351 mutex_enter(txq->txq_lock);
7352 wm_init_tx_queue(sc, wmq, txq);
7353 mutex_exit(txq->txq_lock);
7354
7355 mutex_enter(rxq->rxq_lock);
7356 error = wm_init_rx_queue(sc, wmq, rxq);
7357 mutex_exit(rxq->rxq_lock);
7358 if (error)
7359 break;
7360 }
7361
7362 return error;
7363 }
7364
7365 /*
7366 * wm_tx_offload:
7367 *
7368 * Set up TCP/IP checksumming parameters for the
7369 * specified packet.
7370 */
7371 static void
7372 wm_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
7373 struct wm_txsoft *txs, uint32_t *cmdp, uint8_t *fieldsp)
7374 {
7375 struct mbuf *m0 = txs->txs_mbuf;
7376 struct livengood_tcpip_ctxdesc *t;
7377 uint32_t ipcs, tucs, cmd, cmdlen, seg;
7378 uint32_t ipcse;
7379 struct ether_header *eh;
7380 int offset, iphl;
7381 uint8_t fields;
7382
7383 /*
7384 * XXX It would be nice if the mbuf pkthdr had offset
7385 * fields for the protocol headers.
7386 */
7387
7388 eh = mtod(m0, struct ether_header *);
7389 switch (htons(eh->ether_type)) {
7390 case ETHERTYPE_IP:
7391 case ETHERTYPE_IPV6:
7392 offset = ETHER_HDR_LEN;
7393 break;
7394
7395 case ETHERTYPE_VLAN:
7396 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
7397 break;
7398
7399 default:
7400 /* Don't support this protocol or encapsulation. */
7401 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0;
7402 txq->txq_last_hw_ipcs = 0;
7403 txq->txq_last_hw_tucs = 0;
7404 *fieldsp = 0;
7405 *cmdp = 0;
7406 return;
7407 }
7408
7409 if ((m0->m_pkthdr.csum_flags &
7410 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
7411 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
7412 } else
7413 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data);
7414
7415 ipcse = offset + iphl - 1;
7416
7417 cmd = WTX_CMD_DEXT | WTX_DTYP_D;
7418 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE;
7419 seg = 0;
7420 fields = 0;
7421
7422 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
7423 int hlen = offset + iphl;
7424 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
7425
7426 if (__predict_false(m0->m_len <
7427 (hlen + sizeof(struct tcphdr)))) {
7428 /*
7429 * TCP/IP headers are not in the first mbuf; we need
7430 * to do this the slow and painful way. Let's just
7431 * hope this doesn't happen very often.
7432 */
7433 struct tcphdr th;
7434
7435 WM_Q_EVCNT_INCR(txq, tsopain);
7436
7437 m_copydata(m0, hlen, sizeof(th), &th);
7438 if (v4) {
7439 struct ip ip;
7440
7441 m_copydata(m0, offset, sizeof(ip), &ip);
7442 ip.ip_len = 0;
7443 m_copyback(m0,
7444 offset + offsetof(struct ip, ip_len),
7445 sizeof(ip.ip_len), &ip.ip_len);
7446 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
7447 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
7448 } else {
7449 struct ip6_hdr ip6;
7450
7451 m_copydata(m0, offset, sizeof(ip6), &ip6);
7452 ip6.ip6_plen = 0;
7453 m_copyback(m0,
7454 offset + offsetof(struct ip6_hdr, ip6_plen),
7455 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
7456 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
7457 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
7458 }
7459 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
7460 sizeof(th.th_sum), &th.th_sum);
7461
7462 hlen += th.th_off << 2;
7463 } else {
7464 /*
7465 * TCP/IP headers are in the first mbuf; we can do
7466 * this the easy way.
7467 */
7468 struct tcphdr *th;
7469
7470 if (v4) {
7471 struct ip *ip =
7472 (void *)(mtod(m0, char *) + offset);
7473 th = (void *)(mtod(m0, char *) + hlen);
7474
7475 ip->ip_len = 0;
7476 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
7477 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
7478 } else {
7479 struct ip6_hdr *ip6 =
7480 (void *)(mtod(m0, char *) + offset);
7481 th = (void *)(mtod(m0, char *) + hlen);
7482
7483 ip6->ip6_plen = 0;
7484 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
7485 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
7486 }
7487 hlen += th->th_off << 2;
7488 }
7489
7490 if (v4) {
7491 WM_Q_EVCNT_INCR(txq, tso);
7492 cmdlen |= WTX_TCPIP_CMD_IP;
7493 } else {
7494 WM_Q_EVCNT_INCR(txq, tso6);
7495 ipcse = 0;
7496 }
7497 cmd |= WTX_TCPIP_CMD_TSE;
7498 cmdlen |= WTX_TCPIP_CMD_TSE |
7499 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen);
7500 seg = WTX_TCPIP_SEG_HDRLEN(hlen) |
7501 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz);
7502 }
7503
7504 /*
7505 * NOTE: Even if we're not using the IP or TCP/UDP checksum
7506 * offload feature, if we load the context descriptor, we
7507 * MUST provide valid values for IPCSS and TUCSS fields.
7508 */
7509
7510 ipcs = WTX_TCPIP_IPCSS(offset) |
7511 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
7512 WTX_TCPIP_IPCSE(ipcse);
7513 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) {
7514 WM_Q_EVCNT_INCR(txq, ipsum);
7515 fields |= WTX_IXSM;
7516 }
7517
7518 offset += iphl;
7519
7520 if (m0->m_pkthdr.csum_flags &
7521 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) {
7522 WM_Q_EVCNT_INCR(txq, tusum);
7523 fields |= WTX_TXSM;
7524 tucs = WTX_TCPIP_TUCSS(offset) |
7525 WTX_TCPIP_TUCSO(offset +
7526 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) |
7527 WTX_TCPIP_TUCSE(0) /* Rest of packet */;
7528 } else if ((m0->m_pkthdr.csum_flags &
7529 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) {
7530 WM_Q_EVCNT_INCR(txq, tusum6);
7531 fields |= WTX_TXSM;
7532 tucs = WTX_TCPIP_TUCSS(offset) |
7533 WTX_TCPIP_TUCSO(offset +
7534 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) |
7535 WTX_TCPIP_TUCSE(0) /* Rest of packet */;
7536 } else {
7537 /* Just initialize it to a valid TCP context. */
7538 tucs = WTX_TCPIP_TUCSS(offset) |
7539 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
7540 WTX_TCPIP_TUCSE(0) /* Rest of packet */;
7541 }
7542
7543 *cmdp = cmd;
7544 *fieldsp = fields;
7545
7546 /*
7547 * We don't have to write context descriptor for every packet
7548 * except for 82574. For 82574, we must write context descriptor
7549 * for every packet when we use two descriptor queues.
7550 *
7551 * The 82574L can only remember the *last* context used
7552 * regardless of queue that it was use for. We cannot reuse
7553 * contexts on this hardware platform and must generate a new
7554 * context every time. 82574L hardware spec, section 7.2.6,
7555 * second note.
7556 */
7557 if (sc->sc_nqueues < 2) {
7558 /*
7559 *
7560 * Setting up new checksum offload context for every
7561 * frames takes a lot of processing time for hardware.
7562 * This also reduces performance a lot for small sized
7563 * frames so avoid it if driver can use previously
7564 * configured checksum offload context.
7565 * For TSO, in theory we can use the same TSO context only if
7566 * frame is the same type(IP/TCP) and the same MSS. However
7567 * checking whether a frame has the same IP/TCP structure is
7568 * hard thing so just ignore that and always restablish a
7569 * new TSO context.
7570 */
7571 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6))
7572 == 0) {
7573 if (txq->txq_last_hw_cmd == cmd &&
7574 txq->txq_last_hw_fields == fields &&
7575 txq->txq_last_hw_ipcs == (ipcs & 0xffff) &&
7576 txq->txq_last_hw_tucs == (tucs & 0xffff)) {
7577 WM_Q_EVCNT_INCR(txq, skipcontext);
7578 return;
7579 }
7580 }
7581
7582 txq->txq_last_hw_cmd = cmd;
7583 txq->txq_last_hw_fields = fields;
7584 txq->txq_last_hw_ipcs = (ipcs & 0xffff);
7585 txq->txq_last_hw_tucs = (tucs & 0xffff);
7586 }
7587
7588 /* Fill in the context descriptor. */
7589 t = (struct livengood_tcpip_ctxdesc *)
7590 &txq->txq_descs[txq->txq_next];
7591 t->tcpip_ipcs = htole32(ipcs);
7592 t->tcpip_tucs = htole32(tucs);
7593 t->tcpip_cmdlen = htole32(cmdlen);
7594 t->tcpip_seg = htole32(seg);
7595 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
7596
7597 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
7598 txs->txs_ndesc++;
7599 }
7600
7601 static inline int
7602 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m)
7603 {
7604 struct wm_softc *sc = ifp->if_softc;
7605 u_int cpuid = cpu_index(curcpu());
7606
7607 /*
7608 * Currently, simple distribute strategy.
7609 * TODO:
7610 * distribute by flowid(RSS has value).
7611 */
7612 return ((cpuid + ncpu - sc->sc_affinity_offset) % ncpu) % sc->sc_nqueues;
7613 }
7614
7615 /*
7616 * wm_start: [ifnet interface function]
7617 *
7618 * Start packet transmission on the interface.
7619 */
7620 static void
7621 wm_start(struct ifnet *ifp)
7622 {
7623 struct wm_softc *sc = ifp->if_softc;
7624 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7625
7626 #ifdef WM_MPSAFE
7627 KASSERT(if_is_mpsafe(ifp));
7628 #endif
7629 /*
7630 * if_obytes and if_omcasts are added in if_transmit()@if.c.
7631 */
7632
7633 mutex_enter(txq->txq_lock);
7634 if (!txq->txq_stopping)
7635 wm_start_locked(ifp);
7636 mutex_exit(txq->txq_lock);
7637 }
7638
7639 static void
7640 wm_start_locked(struct ifnet *ifp)
7641 {
7642 struct wm_softc *sc = ifp->if_softc;
7643 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7644
7645 wm_send_common_locked(ifp, txq, false);
7646 }
7647
7648 static int
7649 wm_transmit(struct ifnet *ifp, struct mbuf *m)
7650 {
7651 int qid;
7652 struct wm_softc *sc = ifp->if_softc;
7653 struct wm_txqueue *txq;
7654
7655 qid = wm_select_txqueue(ifp, m);
7656 txq = &sc->sc_queue[qid].wmq_txq;
7657
7658 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7659 m_freem(m);
7660 WM_Q_EVCNT_INCR(txq, pcqdrop);
7661 return ENOBUFS;
7662 }
7663
7664 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
7665 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len);
7666 if (m->m_flags & M_MCAST)
7667 if_statinc_ref(nsr, if_omcasts);
7668 IF_STAT_PUTREF(ifp);
7669
7670 if (mutex_tryenter(txq->txq_lock)) {
7671 if (!txq->txq_stopping)
7672 wm_transmit_locked(ifp, txq);
7673 mutex_exit(txq->txq_lock);
7674 }
7675
7676 return 0;
7677 }
7678
7679 static void
7680 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7681 {
7682
7683 wm_send_common_locked(ifp, txq, true);
7684 }
7685
7686 static void
7687 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7688 bool is_transmit)
7689 {
7690 struct wm_softc *sc = ifp->if_softc;
7691 struct mbuf *m0;
7692 struct wm_txsoft *txs;
7693 bus_dmamap_t dmamap;
7694 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso;
7695 bus_addr_t curaddr;
7696 bus_size_t seglen, curlen;
7697 uint32_t cksumcmd;
7698 uint8_t cksumfields;
7699 bool remap = true;
7700
7701 KASSERT(mutex_owned(txq->txq_lock));
7702
7703 if ((ifp->if_flags & IFF_RUNNING) == 0)
7704 return;
7705 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7706 return;
7707
7708 /* Remember the previous number of free descriptors. */
7709 ofree = txq->txq_free;
7710
7711 /*
7712 * Loop through the send queue, setting up transmit descriptors
7713 * until we drain the queue, or use up all available transmit
7714 * descriptors.
7715 */
7716 for (;;) {
7717 m0 = NULL;
7718
7719 /* Get a work queue entry. */
7720 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7721 wm_txeof(txq, UINT_MAX);
7722 if (txq->txq_sfree == 0) {
7723 DPRINTF(WM_DEBUG_TX,
7724 ("%s: TX: no free job descriptors\n",
7725 device_xname(sc->sc_dev)));
7726 WM_Q_EVCNT_INCR(txq, txsstall);
7727 break;
7728 }
7729 }
7730
7731 /* Grab a packet off the queue. */
7732 if (is_transmit)
7733 m0 = pcq_get(txq->txq_interq);
7734 else
7735 IFQ_DEQUEUE(&ifp->if_snd, m0);
7736 if (m0 == NULL)
7737 break;
7738
7739 DPRINTF(WM_DEBUG_TX,
7740 ("%s: TX: have packet to transmit: %p\n",
7741 device_xname(sc->sc_dev), m0));
7742
7743 txs = &txq->txq_soft[txq->txq_snext];
7744 dmamap = txs->txs_dmamap;
7745
7746 use_tso = (m0->m_pkthdr.csum_flags &
7747 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0;
7748
7749 /*
7750 * So says the Linux driver:
7751 * The controller does a simple calculation to make sure
7752 * there is enough room in the FIFO before initiating the
7753 * DMA for each buffer. The calc is:
7754 * 4 = ceil(buffer len / MSS)
7755 * To make sure we don't overrun the FIFO, adjust the max
7756 * buffer len if the MSS drops.
7757 */
7758 dmamap->dm_maxsegsz =
7759 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN)
7760 ? m0->m_pkthdr.segsz << 2
7761 : WTX_MAX_LEN;
7762
7763 /*
7764 * Load the DMA map. If this fails, the packet either
7765 * didn't fit in the allotted number of segments, or we
7766 * were short on resources. For the too-many-segments
7767 * case, we simply report an error and drop the packet,
7768 * since we can't sanely copy a jumbo packet to a single
7769 * buffer.
7770 */
7771 retry:
7772 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
7773 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
7774 if (__predict_false(error)) {
7775 if (error == EFBIG) {
7776 if (remap == true) {
7777 struct mbuf *m;
7778
7779 remap = false;
7780 m = m_defrag(m0, M_NOWAIT);
7781 if (m != NULL) {
7782 WM_Q_EVCNT_INCR(txq, defrag);
7783 m0 = m;
7784 goto retry;
7785 }
7786 }
7787 WM_Q_EVCNT_INCR(txq, toomanyseg);
7788 log(LOG_ERR, "%s: Tx packet consumes too many "
7789 "DMA segments, dropping...\n",
7790 device_xname(sc->sc_dev));
7791 wm_dump_mbuf_chain(sc, m0);
7792 m_freem(m0);
7793 continue;
7794 }
7795 /* Short on resources, just stop for now. */
7796 DPRINTF(WM_DEBUG_TX,
7797 ("%s: TX: dmamap load failed: %d\n",
7798 device_xname(sc->sc_dev), error));
7799 break;
7800 }
7801
7802 segs_needed = dmamap->dm_nsegs;
7803 if (use_tso) {
7804 /* For sentinel descriptor; see below. */
7805 segs_needed++;
7806 }
7807
7808 /*
7809 * Ensure we have enough descriptors free to describe
7810 * the packet. Note, we always reserve one descriptor
7811 * at the end of the ring due to the semantics of the
7812 * TDT register, plus one more in the event we need
7813 * to load offload context.
7814 */
7815 if (segs_needed > txq->txq_free - 2) {
7816 /*
7817 * Not enough free descriptors to transmit this
7818 * packet. We haven't committed anything yet,
7819 * so just unload the DMA map, put the packet
7820 * pack on the queue, and punt. Notify the upper
7821 * layer that there are no more slots left.
7822 */
7823 DPRINTF(WM_DEBUG_TX,
7824 ("%s: TX: need %d (%d) descriptors, have %d\n",
7825 device_xname(sc->sc_dev), dmamap->dm_nsegs,
7826 segs_needed, txq->txq_free - 1));
7827 txq->txq_flags |= WM_TXQ_NO_SPACE;
7828 bus_dmamap_unload(sc->sc_dmat, dmamap);
7829 WM_Q_EVCNT_INCR(txq, txdstall);
7830 break;
7831 }
7832
7833 /*
7834 * Check for 82547 Tx FIFO bug. We need to do this
7835 * once we know we can transmit the packet, since we
7836 * do some internal FIFO space accounting here.
7837 */
7838 if (sc->sc_type == WM_T_82547 &&
7839 wm_82547_txfifo_bugchk(sc, m0)) {
7840 DPRINTF(WM_DEBUG_TX,
7841 ("%s: TX: 82547 Tx FIFO bug detected\n",
7842 device_xname(sc->sc_dev)));
7843 txq->txq_flags |= WM_TXQ_NO_SPACE;
7844 bus_dmamap_unload(sc->sc_dmat, dmamap);
7845 WM_Q_EVCNT_INCR(txq, fifo_stall);
7846 break;
7847 }
7848
7849 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
7850
7851 DPRINTF(WM_DEBUG_TX,
7852 ("%s: TX: packet has %d (%d) DMA segments\n",
7853 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
7854
7855 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
7856
7857 /*
7858 * Store a pointer to the packet so that we can free it
7859 * later.
7860 *
7861 * Initially, we consider the number of descriptors the
7862 * packet uses the number of DMA segments. This may be
7863 * incremented by 1 if we do checksum offload (a descriptor
7864 * is used to set the checksum context).
7865 */
7866 txs->txs_mbuf = m0;
7867 txs->txs_firstdesc = txq->txq_next;
7868 txs->txs_ndesc = segs_needed;
7869
7870 /* Set up offload parameters for this packet. */
7871 if (m0->m_pkthdr.csum_flags &
7872 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
7873 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7874 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
7875 wm_tx_offload(sc, txq, txs, &cksumcmd, &cksumfields);
7876 } else {
7877 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0;
7878 txq->txq_last_hw_ipcs = txq->txq_last_hw_tucs = 0;
7879 cksumcmd = 0;
7880 cksumfields = 0;
7881 }
7882
7883 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS;
7884
7885 /* Sync the DMA map. */
7886 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
7887 BUS_DMASYNC_PREWRITE);
7888
7889 /* Initialize the transmit descriptor. */
7890 for (nexttx = txq->txq_next, seg = 0;
7891 seg < dmamap->dm_nsegs; seg++) {
7892 for (seglen = dmamap->dm_segs[seg].ds_len,
7893 curaddr = dmamap->dm_segs[seg].ds_addr;
7894 seglen != 0;
7895 curaddr += curlen, seglen -= curlen,
7896 nexttx = WM_NEXTTX(txq, nexttx)) {
7897 curlen = seglen;
7898
7899 /*
7900 * So says the Linux driver:
7901 * Work around for premature descriptor
7902 * write-backs in TSO mode. Append a
7903 * 4-byte sentinel descriptor.
7904 */
7905 if (use_tso && seg == dmamap->dm_nsegs - 1 &&
7906 curlen > 8)
7907 curlen -= 4;
7908
7909 wm_set_dma_addr(
7910 &txq->txq_descs[nexttx].wtx_addr, curaddr);
7911 txq->txq_descs[nexttx].wtx_cmdlen
7912 = htole32(cksumcmd | curlen);
7913 txq->txq_descs[nexttx].wtx_fields.wtxu_status
7914 = 0;
7915 txq->txq_descs[nexttx].wtx_fields.wtxu_options
7916 = cksumfields;
7917 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
7918 lasttx = nexttx;
7919
7920 DPRINTF(WM_DEBUG_TX,
7921 ("%s: TX: desc %d: low %#" PRIx64 ", "
7922 "len %#04zx\n",
7923 device_xname(sc->sc_dev), nexttx,
7924 (uint64_t)curaddr, curlen));
7925 }
7926 }
7927
7928 KASSERT(lasttx != -1);
7929
7930 /*
7931 * Set up the command byte on the last descriptor of
7932 * the packet. If we're in the interrupt delay window,
7933 * delay the interrupt.
7934 */
7935 txq->txq_descs[lasttx].wtx_cmdlen |=
7936 htole32(WTX_CMD_EOP | WTX_CMD_RS);
7937
7938 /*
7939 * If VLANs are enabled and the packet has a VLAN tag, set
7940 * up the descriptor to encapsulate the packet for us.
7941 *
7942 * This is only valid on the last descriptor of the packet.
7943 */
7944 if (vlan_has_tag(m0)) {
7945 txq->txq_descs[lasttx].wtx_cmdlen |=
7946 htole32(WTX_CMD_VLE);
7947 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan
7948 = htole16(vlan_get_tag(m0));
7949 }
7950
7951 txs->txs_lastdesc = lasttx;
7952
7953 DPRINTF(WM_DEBUG_TX,
7954 ("%s: TX: desc %d: cmdlen 0x%08x\n",
7955 device_xname(sc->sc_dev),
7956 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
7957
7958 /* Sync the descriptors we're using. */
7959 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
7960 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7961
7962 /* Give the packet to the chip. */
7963 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
7964
7965 DPRINTF(WM_DEBUG_TX,
7966 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
7967
7968 DPRINTF(WM_DEBUG_TX,
7969 ("%s: TX: finished transmitting packet, job %d\n",
7970 device_xname(sc->sc_dev), txq->txq_snext));
7971
7972 /* Advance the tx pointer. */
7973 txq->txq_free -= txs->txs_ndesc;
7974 txq->txq_next = nexttx;
7975
7976 txq->txq_sfree--;
7977 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
7978
7979 /* Pass the packet to any BPF listeners. */
7980 bpf_mtap(ifp, m0, BPF_D_OUT);
7981 }
7982
7983 if (m0 != NULL) {
7984 txq->txq_flags |= WM_TXQ_NO_SPACE;
7985 WM_Q_EVCNT_INCR(txq, descdrop);
7986 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
7987 __func__));
7988 m_freem(m0);
7989 }
7990
7991 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
7992 /* No more slots; notify upper layer. */
7993 txq->txq_flags |= WM_TXQ_NO_SPACE;
7994 }
7995
7996 if (txq->txq_free != ofree) {
7997 /* Set a watchdog timer in case the chip flakes out. */
7998 txq->txq_lastsent = time_uptime;
7999 txq->txq_sending = true;
8000 }
8001 }
8002
8003 /*
8004 * wm_nq_tx_offload:
8005 *
8006 * Set up TCP/IP checksumming parameters for the
8007 * specified packet, for NEWQUEUE devices
8008 */
8009 static void
8010 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
8011 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum)
8012 {
8013 struct mbuf *m0 = txs->txs_mbuf;
8014 uint32_t vl_len, mssidx, cmdc;
8015 struct ether_header *eh;
8016 int offset, iphl;
8017
8018 /*
8019 * XXX It would be nice if the mbuf pkthdr had offset
8020 * fields for the protocol headers.
8021 */
8022 *cmdlenp = 0;
8023 *fieldsp = 0;
8024
8025 eh = mtod(m0, struct ether_header *);
8026 switch (htons(eh->ether_type)) {
8027 case ETHERTYPE_IP:
8028 case ETHERTYPE_IPV6:
8029 offset = ETHER_HDR_LEN;
8030 break;
8031
8032 case ETHERTYPE_VLAN:
8033 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
8034 break;
8035
8036 default:
8037 /* Don't support this protocol or encapsulation. */
8038 *do_csum = false;
8039 return;
8040 }
8041 *do_csum = true;
8042 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS;
8043 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT;
8044
8045 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT);
8046 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0);
8047
8048 if ((m0->m_pkthdr.csum_flags &
8049 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
8050 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
8051 } else {
8052 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data);
8053 }
8054 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT);
8055 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0);
8056
8057 if (vlan_has_tag(m0)) {
8058 vl_len |= ((vlan_get_tag(m0) & NQTXC_VLLEN_VLAN_MASK)
8059 << NQTXC_VLLEN_VLAN_SHIFT);
8060 *cmdlenp |= NQTX_CMD_VLE;
8061 }
8062
8063 mssidx = 0;
8064
8065 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
8066 int hlen = offset + iphl;
8067 int tcp_hlen;
8068 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
8069
8070 if (__predict_false(m0->m_len <
8071 (hlen + sizeof(struct tcphdr)))) {
8072 /*
8073 * TCP/IP headers are not in the first mbuf; we need
8074 * to do this the slow and painful way. Let's just
8075 * hope this doesn't happen very often.
8076 */
8077 struct tcphdr th;
8078
8079 WM_Q_EVCNT_INCR(txq, tsopain);
8080
8081 m_copydata(m0, hlen, sizeof(th), &th);
8082 if (v4) {
8083 struct ip ip;
8084
8085 m_copydata(m0, offset, sizeof(ip), &ip);
8086 ip.ip_len = 0;
8087 m_copyback(m0,
8088 offset + offsetof(struct ip, ip_len),
8089 sizeof(ip.ip_len), &ip.ip_len);
8090 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
8091 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
8092 } else {
8093 struct ip6_hdr ip6;
8094
8095 m_copydata(m0, offset, sizeof(ip6), &ip6);
8096 ip6.ip6_plen = 0;
8097 m_copyback(m0,
8098 offset + offsetof(struct ip6_hdr, ip6_plen),
8099 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
8100 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
8101 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
8102 }
8103 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
8104 sizeof(th.th_sum), &th.th_sum);
8105
8106 tcp_hlen = th.th_off << 2;
8107 } else {
8108 /*
8109 * TCP/IP headers are in the first mbuf; we can do
8110 * this the easy way.
8111 */
8112 struct tcphdr *th;
8113
8114 if (v4) {
8115 struct ip *ip =
8116 (void *)(mtod(m0, char *) + offset);
8117 th = (void *)(mtod(m0, char *) + hlen);
8118
8119 ip->ip_len = 0;
8120 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
8121 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
8122 } else {
8123 struct ip6_hdr *ip6 =
8124 (void *)(mtod(m0, char *) + offset);
8125 th = (void *)(mtod(m0, char *) + hlen);
8126
8127 ip6->ip6_plen = 0;
8128 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
8129 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
8130 }
8131 tcp_hlen = th->th_off << 2;
8132 }
8133 hlen += tcp_hlen;
8134 *cmdlenp |= NQTX_CMD_TSE;
8135
8136 if (v4) {
8137 WM_Q_EVCNT_INCR(txq, tso);
8138 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM;
8139 } else {
8140 WM_Q_EVCNT_INCR(txq, tso6);
8141 *fieldsp |= NQTXD_FIELDS_TUXSM;
8142 }
8143 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT);
8144 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
8145 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT);
8146 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0);
8147 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT);
8148 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0);
8149 } else {
8150 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT);
8151 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
8152 }
8153
8154 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
8155 *fieldsp |= NQTXD_FIELDS_IXSM;
8156 cmdc |= NQTXC_CMD_IP4;
8157 }
8158
8159 if (m0->m_pkthdr.csum_flags &
8160 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
8161 WM_Q_EVCNT_INCR(txq, tusum);
8162 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4))
8163 cmdc |= NQTXC_CMD_TCP;
8164 else
8165 cmdc |= NQTXC_CMD_UDP;
8166
8167 cmdc |= NQTXC_CMD_IP4;
8168 *fieldsp |= NQTXD_FIELDS_TUXSM;
8169 }
8170 if (m0->m_pkthdr.csum_flags &
8171 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
8172 WM_Q_EVCNT_INCR(txq, tusum6);
8173 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6))
8174 cmdc |= NQTXC_CMD_TCP;
8175 else
8176 cmdc |= NQTXC_CMD_UDP;
8177
8178 cmdc |= NQTXC_CMD_IP6;
8179 *fieldsp |= NQTXD_FIELDS_TUXSM;
8180 }
8181
8182 /*
8183 * We don't have to write context descriptor for every packet to
8184 * NEWQUEUE controllers, that is 82575, 82576, 82580, I350, I354,
8185 * I210 and I211. It is enough to write once per a Tx queue for these
8186 * controllers.
8187 * It would be overhead to write context descriptor for every packet,
8188 * however it does not cause problems.
8189 */
8190 /* Fill in the context descriptor. */
8191 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len =
8192 htole32(vl_len);
8193 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0;
8194 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd =
8195 htole32(cmdc);
8196 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx =
8197 htole32(mssidx);
8198 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
8199 DPRINTF(WM_DEBUG_TX,
8200 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev),
8201 txq->txq_next, 0, vl_len));
8202 DPRINTF(WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc));
8203 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
8204 txs->txs_ndesc++;
8205 }
8206
8207 /*
8208 * wm_nq_start: [ifnet interface function]
8209 *
8210 * Start packet transmission on the interface for NEWQUEUE devices
8211 */
8212 static void
8213 wm_nq_start(struct ifnet *ifp)
8214 {
8215 struct wm_softc *sc = ifp->if_softc;
8216 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
8217
8218 #ifdef WM_MPSAFE
8219 KASSERT(if_is_mpsafe(ifp));
8220 #endif
8221 /*
8222 * if_obytes and if_omcasts are added in if_transmit()@if.c.
8223 */
8224
8225 mutex_enter(txq->txq_lock);
8226 if (!txq->txq_stopping)
8227 wm_nq_start_locked(ifp);
8228 mutex_exit(txq->txq_lock);
8229 }
8230
8231 static void
8232 wm_nq_start_locked(struct ifnet *ifp)
8233 {
8234 struct wm_softc *sc = ifp->if_softc;
8235 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
8236
8237 wm_nq_send_common_locked(ifp, txq, false);
8238 }
8239
8240 static int
8241 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m)
8242 {
8243 int qid;
8244 struct wm_softc *sc = ifp->if_softc;
8245 struct wm_txqueue *txq;
8246
8247 qid = wm_select_txqueue(ifp, m);
8248 txq = &sc->sc_queue[qid].wmq_txq;
8249
8250 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
8251 m_freem(m);
8252 WM_Q_EVCNT_INCR(txq, pcqdrop);
8253 return ENOBUFS;
8254 }
8255
8256 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
8257 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len);
8258 if (m->m_flags & M_MCAST)
8259 if_statinc_ref(nsr, if_omcasts);
8260 IF_STAT_PUTREF(ifp);
8261
8262 /*
8263 * The situations which this mutex_tryenter() fails at running time
8264 * are below two patterns.
8265 * (1) contention with interrupt handler(wm_txrxintr_msix())
8266 * (2) contention with deferred if_start softint(wm_handle_queue())
8267 * In the case of (1), the last packet enqueued to txq->txq_interq is
8268 * dequeued by wm_deferred_start_locked(). So, it does not get stuck.
8269 * In the case of (2), the last packet enqueued to txq->txq_interq is
8270 * also dequeued by wm_deferred_start_locked(). So, it does not get
8271 * stuck, either.
8272 */
8273 if (mutex_tryenter(txq->txq_lock)) {
8274 if (!txq->txq_stopping)
8275 wm_nq_transmit_locked(ifp, txq);
8276 mutex_exit(txq->txq_lock);
8277 }
8278
8279 return 0;
8280 }
8281
8282 static void
8283 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
8284 {
8285
8286 wm_nq_send_common_locked(ifp, txq, true);
8287 }
8288
8289 static void
8290 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
8291 bool is_transmit)
8292 {
8293 struct wm_softc *sc = ifp->if_softc;
8294 struct mbuf *m0;
8295 struct wm_txsoft *txs;
8296 bus_dmamap_t dmamap;
8297 int error, nexttx, lasttx = -1, seg, segs_needed;
8298 bool do_csum, sent;
8299 bool remap = true;
8300
8301 KASSERT(mutex_owned(txq->txq_lock));
8302
8303 if ((ifp->if_flags & IFF_RUNNING) == 0)
8304 return;
8305 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
8306 return;
8307
8308 sent = false;
8309
8310 /*
8311 * Loop through the send queue, setting up transmit descriptors
8312 * until we drain the queue, or use up all available transmit
8313 * descriptors.
8314 */
8315 for (;;) {
8316 m0 = NULL;
8317
8318 /* Get a work queue entry. */
8319 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
8320 wm_txeof(txq, UINT_MAX);
8321 if (txq->txq_sfree == 0) {
8322 DPRINTF(WM_DEBUG_TX,
8323 ("%s: TX: no free job descriptors\n",
8324 device_xname(sc->sc_dev)));
8325 WM_Q_EVCNT_INCR(txq, txsstall);
8326 break;
8327 }
8328 }
8329
8330 /* Grab a packet off the queue. */
8331 if (is_transmit)
8332 m0 = pcq_get(txq->txq_interq);
8333 else
8334 IFQ_DEQUEUE(&ifp->if_snd, m0);
8335 if (m0 == NULL)
8336 break;
8337
8338 DPRINTF(WM_DEBUG_TX,
8339 ("%s: TX: have packet to transmit: %p\n",
8340 device_xname(sc->sc_dev), m0));
8341
8342 txs = &txq->txq_soft[txq->txq_snext];
8343 dmamap = txs->txs_dmamap;
8344
8345 /*
8346 * Load the DMA map. If this fails, the packet either
8347 * didn't fit in the allotted number of segments, or we
8348 * were short on resources. For the too-many-segments
8349 * case, we simply report an error and drop the packet,
8350 * since we can't sanely copy a jumbo packet to a single
8351 * buffer.
8352 */
8353 retry:
8354 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
8355 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
8356 if (__predict_false(error)) {
8357 if (error == EFBIG) {
8358 if (remap == true) {
8359 struct mbuf *m;
8360
8361 remap = false;
8362 m = m_defrag(m0, M_NOWAIT);
8363 if (m != NULL) {
8364 WM_Q_EVCNT_INCR(txq, defrag);
8365 m0 = m;
8366 goto retry;
8367 }
8368 }
8369 WM_Q_EVCNT_INCR(txq, toomanyseg);
8370 log(LOG_ERR, "%s: Tx packet consumes too many "
8371 "DMA segments, dropping...\n",
8372 device_xname(sc->sc_dev));
8373 wm_dump_mbuf_chain(sc, m0);
8374 m_freem(m0);
8375 continue;
8376 }
8377 /* Short on resources, just stop for now. */
8378 DPRINTF(WM_DEBUG_TX,
8379 ("%s: TX: dmamap load failed: %d\n",
8380 device_xname(sc->sc_dev), error));
8381 break;
8382 }
8383
8384 segs_needed = dmamap->dm_nsegs;
8385
8386 /*
8387 * Ensure we have enough descriptors free to describe
8388 * the packet. Note, we always reserve one descriptor
8389 * at the end of the ring due to the semantics of the
8390 * TDT register, plus one more in the event we need
8391 * to load offload context.
8392 */
8393 if (segs_needed > txq->txq_free - 2) {
8394 /*
8395 * Not enough free descriptors to transmit this
8396 * packet. We haven't committed anything yet,
8397 * so just unload the DMA map, put the packet
8398 * pack on the queue, and punt. Notify the upper
8399 * layer that there are no more slots left.
8400 */
8401 DPRINTF(WM_DEBUG_TX,
8402 ("%s: TX: need %d (%d) descriptors, have %d\n",
8403 device_xname(sc->sc_dev), dmamap->dm_nsegs,
8404 segs_needed, txq->txq_free - 1));
8405 txq->txq_flags |= WM_TXQ_NO_SPACE;
8406 bus_dmamap_unload(sc->sc_dmat, dmamap);
8407 WM_Q_EVCNT_INCR(txq, txdstall);
8408 break;
8409 }
8410
8411 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
8412
8413 DPRINTF(WM_DEBUG_TX,
8414 ("%s: TX: packet has %d (%d) DMA segments\n",
8415 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
8416
8417 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
8418
8419 /*
8420 * Store a pointer to the packet so that we can free it
8421 * later.
8422 *
8423 * Initially, we consider the number of descriptors the
8424 * packet uses the number of DMA segments. This may be
8425 * incremented by 1 if we do checksum offload (a descriptor
8426 * is used to set the checksum context).
8427 */
8428 txs->txs_mbuf = m0;
8429 txs->txs_firstdesc = txq->txq_next;
8430 txs->txs_ndesc = segs_needed;
8431
8432 /* Set up offload parameters for this packet. */
8433 uint32_t cmdlen, fields, dcmdlen;
8434 if (m0->m_pkthdr.csum_flags &
8435 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
8436 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
8437 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
8438 wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields,
8439 &do_csum);
8440 } else {
8441 do_csum = false;
8442 cmdlen = 0;
8443 fields = 0;
8444 }
8445
8446 /* Sync the DMA map. */
8447 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
8448 BUS_DMASYNC_PREWRITE);
8449
8450 /* Initialize the first transmit descriptor. */
8451 nexttx = txq->txq_next;
8452 if (!do_csum) {
8453 /* Setup a legacy descriptor */
8454 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr,
8455 dmamap->dm_segs[0].ds_addr);
8456 txq->txq_descs[nexttx].wtx_cmdlen =
8457 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len);
8458 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0;
8459 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0;
8460 if (vlan_has_tag(m0)) {
8461 txq->txq_descs[nexttx].wtx_cmdlen |=
8462 htole32(WTX_CMD_VLE);
8463 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =
8464 htole16(vlan_get_tag(m0));
8465 } else
8466 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
8467
8468 dcmdlen = 0;
8469 } else {
8470 /* Setup an advanced data descriptor */
8471 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
8472 htole64(dmamap->dm_segs[0].ds_addr);
8473 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0);
8474 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
8475 htole32(dmamap->dm_segs[0].ds_len | cmdlen);
8476 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields =
8477 htole32(fields);
8478 DPRINTF(WM_DEBUG_TX,
8479 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n",
8480 device_xname(sc->sc_dev), nexttx,
8481 (uint64_t)dmamap->dm_segs[0].ds_addr));
8482 DPRINTF(WM_DEBUG_TX,
8483 ("\t 0x%08x%08x\n", fields,
8484 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen));
8485 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT;
8486 }
8487
8488 lasttx = nexttx;
8489 nexttx = WM_NEXTTX(txq, nexttx);
8490 /*
8491 * Fill in the next descriptors. legacy or advanced format
8492 * is the same here
8493 */
8494 for (seg = 1; seg < dmamap->dm_nsegs;
8495 seg++, nexttx = WM_NEXTTX(txq, nexttx)) {
8496 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
8497 htole64(dmamap->dm_segs[seg].ds_addr);
8498 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
8499 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len);
8500 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0);
8501 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0;
8502 lasttx = nexttx;
8503
8504 DPRINTF(WM_DEBUG_TX,
8505 ("%s: TX: desc %d: %#" PRIx64 ", len %#04zx\n",
8506 device_xname(sc->sc_dev), nexttx,
8507 (uint64_t)dmamap->dm_segs[seg].ds_addr,
8508 dmamap->dm_segs[seg].ds_len));
8509 }
8510
8511 KASSERT(lasttx != -1);
8512
8513 /*
8514 * Set up the command byte on the last descriptor of
8515 * the packet. If we're in the interrupt delay window,
8516 * delay the interrupt.
8517 */
8518 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) ==
8519 (NQTX_CMD_EOP | NQTX_CMD_RS));
8520 txq->txq_descs[lasttx].wtx_cmdlen |=
8521 htole32(WTX_CMD_EOP | WTX_CMD_RS);
8522
8523 txs->txs_lastdesc = lasttx;
8524
8525 DPRINTF(WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n",
8526 device_xname(sc->sc_dev),
8527 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
8528
8529 /* Sync the descriptors we're using. */
8530 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
8531 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
8532
8533 /* Give the packet to the chip. */
8534 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
8535 sent = true;
8536
8537 DPRINTF(WM_DEBUG_TX,
8538 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
8539
8540 DPRINTF(WM_DEBUG_TX,
8541 ("%s: TX: finished transmitting packet, job %d\n",
8542 device_xname(sc->sc_dev), txq->txq_snext));
8543
8544 /* Advance the tx pointer. */
8545 txq->txq_free -= txs->txs_ndesc;
8546 txq->txq_next = nexttx;
8547
8548 txq->txq_sfree--;
8549 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
8550
8551 /* Pass the packet to any BPF listeners. */
8552 bpf_mtap(ifp, m0, BPF_D_OUT);
8553 }
8554
8555 if (m0 != NULL) {
8556 txq->txq_flags |= WM_TXQ_NO_SPACE;
8557 WM_Q_EVCNT_INCR(txq, descdrop);
8558 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
8559 __func__));
8560 m_freem(m0);
8561 }
8562
8563 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
8564 /* No more slots; notify upper layer. */
8565 txq->txq_flags |= WM_TXQ_NO_SPACE;
8566 }
8567
8568 if (sent) {
8569 /* Set a watchdog timer in case the chip flakes out. */
8570 txq->txq_lastsent = time_uptime;
8571 txq->txq_sending = true;
8572 }
8573 }
8574
8575 static void
8576 wm_deferred_start_locked(struct wm_txqueue *txq)
8577 {
8578 struct wm_softc *sc = txq->txq_sc;
8579 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8580 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
8581 int qid = wmq->wmq_id;
8582
8583 KASSERT(mutex_owned(txq->txq_lock));
8584
8585 if (txq->txq_stopping) {
8586 mutex_exit(txq->txq_lock);
8587 return;
8588 }
8589
8590 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
8591 /* XXX need for ALTQ or one CPU system */
8592 if (qid == 0)
8593 wm_nq_start_locked(ifp);
8594 wm_nq_transmit_locked(ifp, txq);
8595 } else {
8596 /* XXX need for ALTQ or one CPU system */
8597 if (qid == 0)
8598 wm_start_locked(ifp);
8599 wm_transmit_locked(ifp, txq);
8600 }
8601 }
8602
8603 /* Interrupt */
8604
8605 /*
8606 * wm_txeof:
8607 *
8608 * Helper; handle transmit interrupts.
8609 */
8610 static bool
8611 wm_txeof(struct wm_txqueue *txq, u_int limit)
8612 {
8613 struct wm_softc *sc = txq->txq_sc;
8614 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8615 struct wm_txsoft *txs;
8616 int count = 0;
8617 int i;
8618 uint8_t status;
8619 bool more = false;
8620
8621 KASSERT(mutex_owned(txq->txq_lock));
8622
8623 if (txq->txq_stopping)
8624 return false;
8625
8626 txq->txq_flags &= ~WM_TXQ_NO_SPACE;
8627
8628 /*
8629 * Go through the Tx list and free mbufs for those
8630 * frames which have been transmitted.
8631 */
8632 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq);
8633 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) {
8634 if (limit-- == 0) {
8635 more = true;
8636 DPRINTF(WM_DEBUG_TX,
8637 ("%s: TX: loop limited, job %d is not processed\n",
8638 device_xname(sc->sc_dev), i));
8639 break;
8640 }
8641
8642 txs = &txq->txq_soft[i];
8643
8644 DPRINTF(WM_DEBUG_TX, ("%s: TX: checking job %d\n",
8645 device_xname(sc->sc_dev), i));
8646
8647 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc,
8648 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
8649
8650 status =
8651 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status;
8652 if ((status & WTX_ST_DD) == 0) {
8653 wm_cdtxsync(txq, txs->txs_lastdesc, 1,
8654 BUS_DMASYNC_PREREAD);
8655 break;
8656 }
8657
8658 count++;
8659 DPRINTF(WM_DEBUG_TX,
8660 ("%s: TX: job %d done: descs %d..%d\n",
8661 device_xname(sc->sc_dev), i, txs->txs_firstdesc,
8662 txs->txs_lastdesc));
8663
8664 /*
8665 * XXX We should probably be using the statistics
8666 * XXX registers, but I don't know if they exist
8667 * XXX on chips before the i82544.
8668 */
8669
8670 #ifdef WM_EVENT_COUNTERS
8671 if (status & WTX_ST_TU)
8672 WM_Q_EVCNT_INCR(txq, underrun);
8673 #endif /* WM_EVENT_COUNTERS */
8674
8675 /*
8676 * 82574 and newer's document says the status field has neither
8677 * EC (Excessive Collision) bit nor LC (Late Collision) bit
8678 * (reserved). Refer "PCIe GbE Controller Open Source Software
8679 * Developer's Manual", 82574 datasheet and newer.
8680 *
8681 * XXX I saw the LC bit was set on I218 even though the media
8682 * was full duplex, so the bit might be used for other
8683 * meaning ...(I have no document).
8684 */
8685
8686 if (((status & (WTX_ST_EC | WTX_ST_LC)) != 0)
8687 && ((sc->sc_type < WM_T_82574)
8688 || (sc->sc_type == WM_T_80003))) {
8689 if_statinc(ifp, if_oerrors);
8690 if (status & WTX_ST_LC)
8691 log(LOG_WARNING, "%s: late collision\n",
8692 device_xname(sc->sc_dev));
8693 else if (status & WTX_ST_EC) {
8694 if_statadd(ifp, if_collisions,
8695 TX_COLLISION_THRESHOLD + 1);
8696 log(LOG_WARNING, "%s: excessive collisions\n",
8697 device_xname(sc->sc_dev));
8698 }
8699 } else
8700 if_statinc(ifp, if_opackets);
8701
8702 txq->txq_packets++;
8703 txq->txq_bytes += txs->txs_mbuf->m_pkthdr.len;
8704
8705 txq->txq_free += txs->txs_ndesc;
8706 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
8707 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
8708 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
8709 m_freem(txs->txs_mbuf);
8710 txs->txs_mbuf = NULL;
8711 }
8712
8713 /* Update the dirty transmit buffer pointer. */
8714 txq->txq_sdirty = i;
8715 DPRINTF(WM_DEBUG_TX,
8716 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i));
8717
8718 if (count != 0)
8719 rnd_add_uint32(&sc->rnd_source, count);
8720
8721 /*
8722 * If there are no more pending transmissions, cancel the watchdog
8723 * timer.
8724 */
8725 if (txq->txq_sfree == WM_TXQUEUELEN(txq))
8726 txq->txq_sending = false;
8727
8728 return more;
8729 }
8730
8731 static inline uint32_t
8732 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx)
8733 {
8734 struct wm_softc *sc = rxq->rxq_sc;
8735
8736 if (sc->sc_type == WM_T_82574)
8737 return EXTRXC_STATUS(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
8738 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8739 return NQRXC_STATUS(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
8740 else
8741 return rxq->rxq_descs[idx].wrx_status;
8742 }
8743
8744 static inline uint32_t
8745 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx)
8746 {
8747 struct wm_softc *sc = rxq->rxq_sc;
8748
8749 if (sc->sc_type == WM_T_82574)
8750 return EXTRXC_ERROR(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
8751 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8752 return NQRXC_ERROR(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
8753 else
8754 return rxq->rxq_descs[idx].wrx_errors;
8755 }
8756
8757 static inline uint16_t
8758 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx)
8759 {
8760 struct wm_softc *sc = rxq->rxq_sc;
8761
8762 if (sc->sc_type == WM_T_82574)
8763 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan;
8764 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8765 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan;
8766 else
8767 return rxq->rxq_descs[idx].wrx_special;
8768 }
8769
8770 static inline int
8771 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx)
8772 {
8773 struct wm_softc *sc = rxq->rxq_sc;
8774
8775 if (sc->sc_type == WM_T_82574)
8776 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen;
8777 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8778 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen;
8779 else
8780 return rxq->rxq_descs[idx].wrx_len;
8781 }
8782
8783 #ifdef WM_DEBUG
8784 static inline uint32_t
8785 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx)
8786 {
8787 struct wm_softc *sc = rxq->rxq_sc;
8788
8789 if (sc->sc_type == WM_T_82574)
8790 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash;
8791 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8792 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash;
8793 else
8794 return 0;
8795 }
8796
8797 static inline uint8_t
8798 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx)
8799 {
8800 struct wm_softc *sc = rxq->rxq_sc;
8801
8802 if (sc->sc_type == WM_T_82574)
8803 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq);
8804 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8805 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc);
8806 else
8807 return 0;
8808 }
8809 #endif /* WM_DEBUG */
8810
8811 static inline bool
8812 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status,
8813 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
8814 {
8815
8816 if (sc->sc_type == WM_T_82574)
8817 return (status & ext_bit) != 0;
8818 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8819 return (status & nq_bit) != 0;
8820 else
8821 return (status & legacy_bit) != 0;
8822 }
8823
8824 static inline bool
8825 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error,
8826 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
8827 {
8828
8829 if (sc->sc_type == WM_T_82574)
8830 return (error & ext_bit) != 0;
8831 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8832 return (error & nq_bit) != 0;
8833 else
8834 return (error & legacy_bit) != 0;
8835 }
8836
8837 static inline bool
8838 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status)
8839 {
8840
8841 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
8842 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP))
8843 return true;
8844 else
8845 return false;
8846 }
8847
8848 static inline bool
8849 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors)
8850 {
8851 struct wm_softc *sc = rxq->rxq_sc;
8852
8853 /* XXX missing error bit for newqueue? */
8854 if (wm_rxdesc_is_set_error(sc, errors,
8855 WRX_ER_CE | WRX_ER_SE | WRX_ER_SEQ | WRX_ER_CXE | WRX_ER_RXE,
8856 EXTRXC_ERROR_CE | EXTRXC_ERROR_SE | EXTRXC_ERROR_SEQ
8857 | EXTRXC_ERROR_CXE | EXTRXC_ERROR_RXE,
8858 NQRXC_ERROR_RXE)) {
8859 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE,
8860 EXTRXC_ERROR_SE, 0))
8861 log(LOG_WARNING, "%s: symbol error\n",
8862 device_xname(sc->sc_dev));
8863 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ,
8864 EXTRXC_ERROR_SEQ, 0))
8865 log(LOG_WARNING, "%s: receive sequence error\n",
8866 device_xname(sc->sc_dev));
8867 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE,
8868 EXTRXC_ERROR_CE, 0))
8869 log(LOG_WARNING, "%s: CRC error\n",
8870 device_xname(sc->sc_dev));
8871 return true;
8872 }
8873
8874 return false;
8875 }
8876
8877 static inline bool
8878 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status)
8879 {
8880 struct wm_softc *sc = rxq->rxq_sc;
8881
8882 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD,
8883 NQRXC_STATUS_DD)) {
8884 /* We have processed all of the receive descriptors. */
8885 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD);
8886 return false;
8887 }
8888
8889 return true;
8890 }
8891
8892 static inline bool
8893 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status,
8894 uint16_t vlantag, struct mbuf *m)
8895 {
8896
8897 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
8898 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) {
8899 vlan_set_tag(m, le16toh(vlantag));
8900 }
8901
8902 return true;
8903 }
8904
8905 static inline void
8906 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status,
8907 uint32_t errors, struct mbuf *m)
8908 {
8909 struct wm_softc *sc = rxq->rxq_sc;
8910
8911 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) {
8912 if (wm_rxdesc_is_set_status(sc, status,
8913 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) {
8914 WM_Q_EVCNT_INCR(rxq, ipsum);
8915 m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
8916 if (wm_rxdesc_is_set_error(sc, errors,
8917 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE))
8918 m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
8919 }
8920 if (wm_rxdesc_is_set_status(sc, status,
8921 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) {
8922 /*
8923 * Note: we don't know if this was TCP or UDP,
8924 * so we just set both bits, and expect the
8925 * upper layers to deal.
8926 */
8927 WM_Q_EVCNT_INCR(rxq, tusum);
8928 m->m_pkthdr.csum_flags |=
8929 M_CSUM_TCPv4 | M_CSUM_UDPv4 |
8930 M_CSUM_TCPv6 | M_CSUM_UDPv6;
8931 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_TCPE,
8932 EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E))
8933 m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
8934 }
8935 }
8936 }
8937
8938 /*
8939 * wm_rxeof:
8940 *
8941 * Helper; handle receive interrupts.
8942 */
8943 static bool
8944 wm_rxeof(struct wm_rxqueue *rxq, u_int limit)
8945 {
8946 struct wm_softc *sc = rxq->rxq_sc;
8947 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8948 struct wm_rxsoft *rxs;
8949 struct mbuf *m;
8950 int i, len;
8951 int count = 0;
8952 uint32_t status, errors;
8953 uint16_t vlantag;
8954 bool more = false;
8955
8956 KASSERT(mutex_owned(rxq->rxq_lock));
8957
8958 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) {
8959 if (limit-- == 0) {
8960 rxq->rxq_ptr = i;
8961 more = true;
8962 DPRINTF(WM_DEBUG_RX,
8963 ("%s: RX: loop limited, descriptor %d is not processed\n",
8964 device_xname(sc->sc_dev), i));
8965 break;
8966 }
8967
8968 rxs = &rxq->rxq_soft[i];
8969
8970 DPRINTF(WM_DEBUG_RX,
8971 ("%s: RX: checking descriptor %d\n",
8972 device_xname(sc->sc_dev), i));
8973 wm_cdrxsync(rxq, i,
8974 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
8975
8976 status = wm_rxdesc_get_status(rxq, i);
8977 errors = wm_rxdesc_get_errors(rxq, i);
8978 len = le16toh(wm_rxdesc_get_pktlen(rxq, i));
8979 vlantag = wm_rxdesc_get_vlantag(rxq, i);
8980 #ifdef WM_DEBUG
8981 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i));
8982 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i);
8983 #endif
8984
8985 if (!wm_rxdesc_dd(rxq, i, status)) {
8986 /*
8987 * Update the receive pointer holding rxq_lock
8988 * consistent with increment counter.
8989 */
8990 rxq->rxq_ptr = i;
8991 break;
8992 }
8993
8994 count++;
8995 if (__predict_false(rxq->rxq_discard)) {
8996 DPRINTF(WM_DEBUG_RX,
8997 ("%s: RX: discarding contents of descriptor %d\n",
8998 device_xname(sc->sc_dev), i));
8999 wm_init_rxdesc(rxq, i);
9000 if (wm_rxdesc_is_eop(rxq, status)) {
9001 /* Reset our state. */
9002 DPRINTF(WM_DEBUG_RX,
9003 ("%s: RX: resetting rxdiscard -> 0\n",
9004 device_xname(sc->sc_dev)));
9005 rxq->rxq_discard = 0;
9006 }
9007 continue;
9008 }
9009
9010 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
9011 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
9012
9013 m = rxs->rxs_mbuf;
9014
9015 /*
9016 * Add a new receive buffer to the ring, unless of
9017 * course the length is zero. Treat the latter as a
9018 * failed mapping.
9019 */
9020 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) {
9021 /*
9022 * Failed, throw away what we've done so
9023 * far, and discard the rest of the packet.
9024 */
9025 if_statinc(ifp, if_ierrors);
9026 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
9027 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
9028 wm_init_rxdesc(rxq, i);
9029 if (!wm_rxdesc_is_eop(rxq, status))
9030 rxq->rxq_discard = 1;
9031 if (rxq->rxq_head != NULL)
9032 m_freem(rxq->rxq_head);
9033 WM_RXCHAIN_RESET(rxq);
9034 DPRINTF(WM_DEBUG_RX,
9035 ("%s: RX: Rx buffer allocation failed, "
9036 "dropping packet%s\n", device_xname(sc->sc_dev),
9037 rxq->rxq_discard ? " (discard)" : ""));
9038 continue;
9039 }
9040
9041 m->m_len = len;
9042 rxq->rxq_len += len;
9043 DPRINTF(WM_DEBUG_RX,
9044 ("%s: RX: buffer at %p len %d\n",
9045 device_xname(sc->sc_dev), m->m_data, len));
9046
9047 /* If this is not the end of the packet, keep looking. */
9048 if (!wm_rxdesc_is_eop(rxq, status)) {
9049 WM_RXCHAIN_LINK(rxq, m);
9050 DPRINTF(WM_DEBUG_RX,
9051 ("%s: RX: not yet EOP, rxlen -> %d\n",
9052 device_xname(sc->sc_dev), rxq->rxq_len));
9053 continue;
9054 }
9055
9056 /*
9057 * Okay, we have the entire packet now. The chip is
9058 * configured to include the FCS except I350 and I21[01]
9059 * (not all chips can be configured to strip it),
9060 * so we need to trim it.
9061 * May need to adjust length of previous mbuf in the
9062 * chain if the current mbuf is too short.
9063 * For an eratta, the RCTL_SECRC bit in RCTL register
9064 * is always set in I350, so we don't trim it.
9065 */
9066 if ((sc->sc_type != WM_T_I350) && (sc->sc_type != WM_T_I354)
9067 && (sc->sc_type != WM_T_I210)
9068 && (sc->sc_type != WM_T_I211)) {
9069 if (m->m_len < ETHER_CRC_LEN) {
9070 rxq->rxq_tail->m_len
9071 -= (ETHER_CRC_LEN - m->m_len);
9072 m->m_len = 0;
9073 } else
9074 m->m_len -= ETHER_CRC_LEN;
9075 len = rxq->rxq_len - ETHER_CRC_LEN;
9076 } else
9077 len = rxq->rxq_len;
9078
9079 WM_RXCHAIN_LINK(rxq, m);
9080
9081 *rxq->rxq_tailp = NULL;
9082 m = rxq->rxq_head;
9083
9084 WM_RXCHAIN_RESET(rxq);
9085
9086 DPRINTF(WM_DEBUG_RX,
9087 ("%s: RX: have entire packet, len -> %d\n",
9088 device_xname(sc->sc_dev), len));
9089
9090 /* If an error occurred, update stats and drop the packet. */
9091 if (wm_rxdesc_has_errors(rxq, errors)) {
9092 m_freem(m);
9093 continue;
9094 }
9095
9096 /* No errors. Receive the packet. */
9097 m_set_rcvif(m, ifp);
9098 m->m_pkthdr.len = len;
9099 /*
9100 * TODO
9101 * should be save rsshash and rsstype to this mbuf.
9102 */
9103 DPRINTF(WM_DEBUG_RX,
9104 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n",
9105 device_xname(sc->sc_dev), rsstype, rsshash));
9106
9107 /*
9108 * If VLANs are enabled, VLAN packets have been unwrapped
9109 * for us. Associate the tag with the packet.
9110 */
9111 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m))
9112 continue;
9113
9114 /* Set up checksum info for this packet. */
9115 wm_rxdesc_ensure_checksum(rxq, status, errors, m);
9116 /*
9117 * Update the receive pointer holding rxq_lock consistent with
9118 * increment counter.
9119 */
9120 rxq->rxq_ptr = i;
9121 rxq->rxq_packets++;
9122 rxq->rxq_bytes += len;
9123 mutex_exit(rxq->rxq_lock);
9124
9125 /* Pass it on. */
9126 if_percpuq_enqueue(sc->sc_ipq, m);
9127
9128 mutex_enter(rxq->rxq_lock);
9129
9130 if (rxq->rxq_stopping)
9131 break;
9132 }
9133
9134 if (count != 0)
9135 rnd_add_uint32(&sc->rnd_source, count);
9136
9137 DPRINTF(WM_DEBUG_RX,
9138 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i));
9139
9140 return more;
9141 }
9142
9143 /*
9144 * wm_linkintr_gmii:
9145 *
9146 * Helper; handle link interrupts for GMII.
9147 */
9148 static void
9149 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr)
9150 {
9151 device_t dev = sc->sc_dev;
9152 uint32_t status, reg;
9153 bool link;
9154 int rv;
9155
9156 KASSERT(WM_CORE_LOCKED(sc));
9157
9158 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(dev),
9159 __func__));
9160
9161 if ((icr & ICR_LSC) == 0) {
9162 if (icr & ICR_RXSEQ)
9163 DPRINTF(WM_DEBUG_LINK,
9164 ("%s: LINK Receive sequence error\n",
9165 device_xname(dev)));
9166 return;
9167 }
9168
9169 /* Link status changed */
9170 status = CSR_READ(sc, WMREG_STATUS);
9171 link = status & STATUS_LU;
9172 if (link) {
9173 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
9174 device_xname(dev),
9175 (status & STATUS_FD) ? "FDX" : "HDX"));
9176 } else {
9177 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
9178 device_xname(dev)));
9179 }
9180 if ((sc->sc_type == WM_T_ICH8) && (link == false))
9181 wm_gig_downshift_workaround_ich8lan(sc);
9182
9183 if ((sc->sc_type == WM_T_ICH8)
9184 && (sc->sc_phytype == WMPHY_IGP_3)) {
9185 wm_kmrn_lock_loss_workaround_ich8lan(sc);
9186 }
9187 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n",
9188 device_xname(dev)));
9189 mii_pollstat(&sc->sc_mii);
9190 if (sc->sc_type == WM_T_82543) {
9191 int miistatus, active;
9192
9193 /*
9194 * With 82543, we need to force speed and
9195 * duplex on the MAC equal to what the PHY
9196 * speed and duplex configuration is.
9197 */
9198 miistatus = sc->sc_mii.mii_media_status;
9199
9200 if (miistatus & IFM_ACTIVE) {
9201 active = sc->sc_mii.mii_media_active;
9202 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
9203 switch (IFM_SUBTYPE(active)) {
9204 case IFM_10_T:
9205 sc->sc_ctrl |= CTRL_SPEED_10;
9206 break;
9207 case IFM_100_TX:
9208 sc->sc_ctrl |= CTRL_SPEED_100;
9209 break;
9210 case IFM_1000_T:
9211 sc->sc_ctrl |= CTRL_SPEED_1000;
9212 break;
9213 default:
9214 /*
9215 * Fiber?
9216 * Shoud not enter here.
9217 */
9218 device_printf(dev, "unknown media (%x)\n",
9219 active);
9220 break;
9221 }
9222 if (active & IFM_FDX)
9223 sc->sc_ctrl |= CTRL_FD;
9224 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9225 }
9226 } else if (sc->sc_type == WM_T_PCH) {
9227 wm_k1_gig_workaround_hv(sc,
9228 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
9229 }
9230
9231 /*
9232 * When connected at 10Mbps half-duplex, some parts are excessively
9233 * aggressive resulting in many collisions. To avoid this, increase
9234 * the IPG and reduce Rx latency in the PHY.
9235 */
9236 if ((sc->sc_type >= WM_T_PCH2) && (sc->sc_type <= WM_T_PCH_CNP)
9237 && link) {
9238 uint32_t tipg_reg;
9239 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED);
9240 bool fdx;
9241 uint16_t emi_addr, emi_val;
9242
9243 tipg_reg = CSR_READ(sc, WMREG_TIPG);
9244 tipg_reg &= ~TIPG_IPGT_MASK;
9245 fdx = status & STATUS_FD;
9246
9247 if (!fdx && (speed == STATUS_SPEED_10)) {
9248 tipg_reg |= 0xff;
9249 /* Reduce Rx latency in analog PHY */
9250 emi_val = 0;
9251 } else if ((sc->sc_type >= WM_T_PCH_SPT) &&
9252 fdx && speed != STATUS_SPEED_1000) {
9253 tipg_reg |= 0xc;
9254 emi_val = 1;
9255 } else {
9256 /* Roll back the default values */
9257 tipg_reg |= 0x08;
9258 emi_val = 1;
9259 }
9260
9261 CSR_WRITE(sc, WMREG_TIPG, tipg_reg);
9262
9263 rv = sc->phy.acquire(sc);
9264 if (rv)
9265 return;
9266
9267 if (sc->sc_type == WM_T_PCH2)
9268 emi_addr = I82579_RX_CONFIG;
9269 else
9270 emi_addr = I217_RX_CONFIG;
9271 rv = wm_write_emi_reg_locked(dev, emi_addr, emi_val);
9272
9273 if (sc->sc_type >= WM_T_PCH_LPT) {
9274 uint16_t phy_reg;
9275
9276 sc->phy.readreg_locked(dev, 2,
9277 I217_PLL_CLOCK_GATE_REG, &phy_reg);
9278 phy_reg &= ~I217_PLL_CLOCK_GATE_MASK;
9279 if (speed == STATUS_SPEED_100
9280 || speed == STATUS_SPEED_10)
9281 phy_reg |= 0x3e8;
9282 else
9283 phy_reg |= 0xfa;
9284 sc->phy.writereg_locked(dev, 2,
9285 I217_PLL_CLOCK_GATE_REG, phy_reg);
9286
9287 if (speed == STATUS_SPEED_1000) {
9288 sc->phy.readreg_locked(dev, 2,
9289 HV_PM_CTRL, &phy_reg);
9290
9291 phy_reg |= HV_PM_CTRL_K1_CLK_REQ;
9292
9293 sc->phy.writereg_locked(dev, 2,
9294 HV_PM_CTRL, phy_reg);
9295 }
9296 }
9297 sc->phy.release(sc);
9298
9299 if (rv)
9300 return;
9301
9302 if (sc->sc_type >= WM_T_PCH_SPT) {
9303 uint16_t data, ptr_gap;
9304
9305 if (speed == STATUS_SPEED_1000) {
9306 rv = sc->phy.acquire(sc);
9307 if (rv)
9308 return;
9309
9310 rv = sc->phy.readreg_locked(dev, 2,
9311 I219_UNKNOWN1, &data);
9312 if (rv) {
9313 sc->phy.release(sc);
9314 return;
9315 }
9316
9317 ptr_gap = (data & (0x3ff << 2)) >> 2;
9318 if (ptr_gap < 0x18) {
9319 data &= ~(0x3ff << 2);
9320 data |= (0x18 << 2);
9321 rv = sc->phy.writereg_locked(dev,
9322 2, I219_UNKNOWN1, data);
9323 }
9324 sc->phy.release(sc);
9325 if (rv)
9326 return;
9327 } else {
9328 rv = sc->phy.acquire(sc);
9329 if (rv)
9330 return;
9331
9332 rv = sc->phy.writereg_locked(dev, 2,
9333 I219_UNKNOWN1, 0xc023);
9334 sc->phy.release(sc);
9335 if (rv)
9336 return;
9337
9338 }
9339 }
9340 }
9341
9342 /*
9343 * I217 Packet Loss issue:
9344 * ensure that FEXTNVM4 Beacon Duration is set correctly
9345 * on power up.
9346 * Set the Beacon Duration for I217 to 8 usec
9347 */
9348 if (sc->sc_type >= WM_T_PCH_LPT) {
9349 reg = CSR_READ(sc, WMREG_FEXTNVM4);
9350 reg &= ~FEXTNVM4_BEACON_DURATION;
9351 reg |= FEXTNVM4_BEACON_DURATION_8US;
9352 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
9353 }
9354
9355 /* Work-around I218 hang issue */
9356 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM) ||
9357 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V) ||
9358 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM3) ||
9359 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V3))
9360 wm_k1_workaround_lpt_lp(sc, link);
9361
9362 if (sc->sc_type >= WM_T_PCH_LPT) {
9363 /*
9364 * Set platform power management values for Latency
9365 * Tolerance Reporting (LTR)
9366 */
9367 wm_platform_pm_pch_lpt(sc,
9368 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
9369 }
9370
9371 /* Clear link partner's EEE ability */
9372 sc->eee_lp_ability = 0;
9373
9374 /* FEXTNVM6 K1-off workaround */
9375 if (sc->sc_type == WM_T_PCH_SPT) {
9376 reg = CSR_READ(sc, WMREG_FEXTNVM6);
9377 if (CSR_READ(sc, WMREG_PCIEANACFG) & FEXTNVM6_K1_OFF_ENABLE)
9378 reg |= FEXTNVM6_K1_OFF_ENABLE;
9379 else
9380 reg &= ~FEXTNVM6_K1_OFF_ENABLE;
9381 CSR_WRITE(sc, WMREG_FEXTNVM6, reg);
9382 }
9383
9384 if (!link)
9385 return;
9386
9387 switch (sc->sc_type) {
9388 case WM_T_PCH2:
9389 wm_k1_workaround_lv(sc);
9390 /* FALLTHROUGH */
9391 case WM_T_PCH:
9392 if (sc->sc_phytype == WMPHY_82578)
9393 wm_link_stall_workaround_hv(sc);
9394 break;
9395 default:
9396 break;
9397 }
9398
9399 /* Enable/Disable EEE after link up */
9400 if (sc->sc_phytype > WMPHY_82579)
9401 wm_set_eee_pchlan(sc);
9402 }
9403
9404 /*
9405 * wm_linkintr_tbi:
9406 *
9407 * Helper; handle link interrupts for TBI mode.
9408 */
9409 static void
9410 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr)
9411 {
9412 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9413 uint32_t status;
9414
9415 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
9416 __func__));
9417
9418 status = CSR_READ(sc, WMREG_STATUS);
9419 if (icr & ICR_LSC) {
9420 wm_check_for_link(sc);
9421 if (status & STATUS_LU) {
9422 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
9423 device_xname(sc->sc_dev),
9424 (status & STATUS_FD) ? "FDX" : "HDX"));
9425 /*
9426 * NOTE: CTRL will update TFCE and RFCE automatically,
9427 * so we should update sc->sc_ctrl
9428 */
9429
9430 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
9431 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
9432 sc->sc_fcrtl &= ~FCRTL_XONE;
9433 if (status & STATUS_FD)
9434 sc->sc_tctl |=
9435 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
9436 else
9437 sc->sc_tctl |=
9438 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
9439 if (sc->sc_ctrl & CTRL_TFCE)
9440 sc->sc_fcrtl |= FCRTL_XONE;
9441 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
9442 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
9443 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl);
9444 sc->sc_tbi_linkup = 1;
9445 if_link_state_change(ifp, LINK_STATE_UP);
9446 } else {
9447 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
9448 device_xname(sc->sc_dev)));
9449 sc->sc_tbi_linkup = 0;
9450 if_link_state_change(ifp, LINK_STATE_DOWN);
9451 }
9452 /* Update LED */
9453 wm_tbi_serdes_set_linkled(sc);
9454 } else if (icr & ICR_RXSEQ)
9455 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: Receive sequence error\n",
9456 device_xname(sc->sc_dev)));
9457 }
9458
9459 /*
9460 * wm_linkintr_serdes:
9461 *
9462 * Helper; handle link interrupts for TBI mode.
9463 */
9464 static void
9465 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr)
9466 {
9467 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9468 struct mii_data *mii = &sc->sc_mii;
9469 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
9470 uint32_t pcs_adv, pcs_lpab, reg;
9471
9472 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
9473 __func__));
9474
9475 if (icr & ICR_LSC) {
9476 /* Check PCS */
9477 reg = CSR_READ(sc, WMREG_PCS_LSTS);
9478 if ((reg & PCS_LSTS_LINKOK) != 0) {
9479 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up\n",
9480 device_xname(sc->sc_dev)));
9481 mii->mii_media_status |= IFM_ACTIVE;
9482 sc->sc_tbi_linkup = 1;
9483 if_link_state_change(ifp, LINK_STATE_UP);
9484 } else {
9485 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
9486 device_xname(sc->sc_dev)));
9487 mii->mii_media_status |= IFM_NONE;
9488 sc->sc_tbi_linkup = 0;
9489 if_link_state_change(ifp, LINK_STATE_DOWN);
9490 wm_tbi_serdes_set_linkled(sc);
9491 return;
9492 }
9493 mii->mii_media_active |= IFM_1000_SX;
9494 if ((reg & PCS_LSTS_FDX) != 0)
9495 mii->mii_media_active |= IFM_FDX;
9496 else
9497 mii->mii_media_active |= IFM_HDX;
9498 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
9499 /* Check flow */
9500 reg = CSR_READ(sc, WMREG_PCS_LSTS);
9501 if ((reg & PCS_LSTS_AN_COMP) == 0) {
9502 DPRINTF(WM_DEBUG_LINK,
9503 ("XXX LINKOK but not ACOMP\n"));
9504 return;
9505 }
9506 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
9507 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
9508 DPRINTF(WM_DEBUG_LINK,
9509 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab));
9510 if ((pcs_adv & TXCW_SYM_PAUSE)
9511 && (pcs_lpab & TXCW_SYM_PAUSE)) {
9512 mii->mii_media_active |= IFM_FLOW
9513 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
9514 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
9515 && (pcs_adv & TXCW_ASYM_PAUSE)
9516 && (pcs_lpab & TXCW_SYM_PAUSE)
9517 && (pcs_lpab & TXCW_ASYM_PAUSE))
9518 mii->mii_media_active |= IFM_FLOW
9519 | IFM_ETH_TXPAUSE;
9520 else if ((pcs_adv & TXCW_SYM_PAUSE)
9521 && (pcs_adv & TXCW_ASYM_PAUSE)
9522 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
9523 && (pcs_lpab & TXCW_ASYM_PAUSE))
9524 mii->mii_media_active |= IFM_FLOW
9525 | IFM_ETH_RXPAUSE;
9526 }
9527 /* Update LED */
9528 wm_tbi_serdes_set_linkled(sc);
9529 } else
9530 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: Receive sequence error\n",
9531 device_xname(sc->sc_dev)));
9532 }
9533
9534 /*
9535 * wm_linkintr:
9536 *
9537 * Helper; handle link interrupts.
9538 */
9539 static void
9540 wm_linkintr(struct wm_softc *sc, uint32_t icr)
9541 {
9542
9543 KASSERT(WM_CORE_LOCKED(sc));
9544
9545 if (sc->sc_flags & WM_F_HAS_MII)
9546 wm_linkintr_gmii(sc, icr);
9547 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES)
9548 && ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)))
9549 wm_linkintr_serdes(sc, icr);
9550 else
9551 wm_linkintr_tbi(sc, icr);
9552 }
9553
9554
9555 static inline void
9556 wm_sched_handle_queue(struct wm_softc *sc, struct wm_queue *wmq)
9557 {
9558
9559 if (wmq->wmq_txrx_use_workqueue)
9560 workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie, curcpu());
9561 else
9562 softint_schedule(wmq->wmq_si);
9563 }
9564
9565 /*
9566 * wm_intr_legacy:
9567 *
9568 * Interrupt service routine for INTx and MSI.
9569 */
9570 static int
9571 wm_intr_legacy(void *arg)
9572 {
9573 struct wm_softc *sc = arg;
9574 struct wm_queue *wmq = &sc->sc_queue[0];
9575 struct wm_txqueue *txq = &wmq->wmq_txq;
9576 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9577 uint32_t icr, rndval = 0;
9578 int handled = 0;
9579
9580 while (1 /* CONSTCOND */) {
9581 icr = CSR_READ(sc, WMREG_ICR);
9582 if ((icr & sc->sc_icr) == 0)
9583 break;
9584 if (handled == 0)
9585 DPRINTF(WM_DEBUG_TX,
9586 ("%s: INTx: got intr\n",device_xname(sc->sc_dev)));
9587 if (rndval == 0)
9588 rndval = icr;
9589
9590 mutex_enter(rxq->rxq_lock);
9591
9592 if (rxq->rxq_stopping) {
9593 mutex_exit(rxq->rxq_lock);
9594 break;
9595 }
9596
9597 handled = 1;
9598
9599 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
9600 if (icr & (ICR_RXDMT0 | ICR_RXT0)) {
9601 DPRINTF(WM_DEBUG_RX,
9602 ("%s: RX: got Rx intr 0x%08x\n",
9603 device_xname(sc->sc_dev),
9604 icr & (ICR_RXDMT0 | ICR_RXT0)));
9605 WM_Q_EVCNT_INCR(rxq, intr);
9606 }
9607 #endif
9608 /*
9609 * wm_rxeof() does *not* call upper layer functions directly,
9610 * as if_percpuq_enqueue() just call softint_schedule().
9611 * So, we can call wm_rxeof() in interrupt context.
9612 */
9613 wm_rxeof(rxq, UINT_MAX);
9614
9615 mutex_exit(rxq->rxq_lock);
9616 mutex_enter(txq->txq_lock);
9617
9618 if (txq->txq_stopping) {
9619 mutex_exit(txq->txq_lock);
9620 break;
9621 }
9622
9623 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
9624 if (icr & ICR_TXDW) {
9625 DPRINTF(WM_DEBUG_TX,
9626 ("%s: TX: got TXDW interrupt\n",
9627 device_xname(sc->sc_dev)));
9628 WM_Q_EVCNT_INCR(txq, txdw);
9629 }
9630 #endif
9631 wm_txeof(txq, UINT_MAX);
9632
9633 mutex_exit(txq->txq_lock);
9634 WM_CORE_LOCK(sc);
9635
9636 if (sc->sc_core_stopping) {
9637 WM_CORE_UNLOCK(sc);
9638 break;
9639 }
9640
9641 if (icr & (ICR_LSC | ICR_RXSEQ)) {
9642 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
9643 wm_linkintr(sc, icr);
9644 }
9645 if ((icr & ICR_GPI(0)) != 0)
9646 device_printf(sc->sc_dev, "got module interrupt\n");
9647
9648 WM_CORE_UNLOCK(sc);
9649
9650 if (icr & ICR_RXO) {
9651 #if defined(WM_DEBUG)
9652 log(LOG_WARNING, "%s: Receive overrun\n",
9653 device_xname(sc->sc_dev));
9654 #endif /* defined(WM_DEBUG) */
9655 }
9656 }
9657
9658 rnd_add_uint32(&sc->rnd_source, rndval);
9659
9660 if (handled) {
9661 /* Try to get more packets going. */
9662 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue;
9663 wm_sched_handle_queue(sc, wmq);
9664 }
9665
9666 return handled;
9667 }
9668
9669 static inline void
9670 wm_txrxintr_disable(struct wm_queue *wmq)
9671 {
9672 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
9673
9674 if (sc->sc_type == WM_T_82574)
9675 CSR_WRITE(sc, WMREG_IMC,
9676 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id));
9677 else if (sc->sc_type == WM_T_82575)
9678 CSR_WRITE(sc, WMREG_EIMC,
9679 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
9680 else
9681 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx);
9682 }
9683
9684 static inline void
9685 wm_txrxintr_enable(struct wm_queue *wmq)
9686 {
9687 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
9688
9689 wm_itrs_calculate(sc, wmq);
9690
9691 /*
9692 * ICR_OTHER which is disabled in wm_linkintr_msix() is enabled here.
9693 * There is no need to care about which of RXQ(0) and RXQ(1) enable
9694 * ICR_OTHER in first, because each RXQ/TXQ interrupt is disabled
9695 * while each wm_handle_queue(wmq) is runnig.
9696 */
9697 if (sc->sc_type == WM_T_82574)
9698 CSR_WRITE(sc, WMREG_IMS,
9699 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id) | ICR_OTHER);
9700 else if (sc->sc_type == WM_T_82575)
9701 CSR_WRITE(sc, WMREG_EIMS,
9702 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
9703 else
9704 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx);
9705 }
9706
9707 static int
9708 wm_txrxintr_msix(void *arg)
9709 {
9710 struct wm_queue *wmq = arg;
9711 struct wm_txqueue *txq = &wmq->wmq_txq;
9712 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9713 struct wm_softc *sc = txq->txq_sc;
9714 u_int txlimit = sc->sc_tx_intr_process_limit;
9715 u_int rxlimit = sc->sc_rx_intr_process_limit;
9716 bool txmore;
9717 bool rxmore;
9718
9719 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id);
9720
9721 DPRINTF(WM_DEBUG_TX,
9722 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev)));
9723
9724 wm_txrxintr_disable(wmq);
9725
9726 mutex_enter(txq->txq_lock);
9727
9728 if (txq->txq_stopping) {
9729 mutex_exit(txq->txq_lock);
9730 return 0;
9731 }
9732
9733 WM_Q_EVCNT_INCR(txq, txdw);
9734 txmore = wm_txeof(txq, txlimit);
9735 /* wm_deferred start() is done in wm_handle_queue(). */
9736 mutex_exit(txq->txq_lock);
9737
9738 DPRINTF(WM_DEBUG_RX,
9739 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev)));
9740 mutex_enter(rxq->rxq_lock);
9741
9742 if (rxq->rxq_stopping) {
9743 mutex_exit(rxq->rxq_lock);
9744 return 0;
9745 }
9746
9747 WM_Q_EVCNT_INCR(rxq, intr);
9748 rxmore = wm_rxeof(rxq, rxlimit);
9749 mutex_exit(rxq->rxq_lock);
9750
9751 wm_itrs_writereg(sc, wmq);
9752
9753 if (txmore || rxmore) {
9754 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue;
9755 wm_sched_handle_queue(sc, wmq);
9756 } else
9757 wm_txrxintr_enable(wmq);
9758
9759 return 1;
9760 }
9761
9762 static void
9763 wm_handle_queue(void *arg)
9764 {
9765 struct wm_queue *wmq = arg;
9766 struct wm_txqueue *txq = &wmq->wmq_txq;
9767 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9768 struct wm_softc *sc = txq->txq_sc;
9769 u_int txlimit = sc->sc_tx_process_limit;
9770 u_int rxlimit = sc->sc_rx_process_limit;
9771 bool txmore;
9772 bool rxmore;
9773
9774 mutex_enter(txq->txq_lock);
9775 if (txq->txq_stopping) {
9776 mutex_exit(txq->txq_lock);
9777 return;
9778 }
9779 txmore = wm_txeof(txq, txlimit);
9780 wm_deferred_start_locked(txq);
9781 mutex_exit(txq->txq_lock);
9782
9783 mutex_enter(rxq->rxq_lock);
9784 if (rxq->rxq_stopping) {
9785 mutex_exit(rxq->rxq_lock);
9786 return;
9787 }
9788 WM_Q_EVCNT_INCR(rxq, defer);
9789 rxmore = wm_rxeof(rxq, rxlimit);
9790 mutex_exit(rxq->rxq_lock);
9791
9792 if (txmore || rxmore) {
9793 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue;
9794 wm_sched_handle_queue(sc, wmq);
9795 } else
9796 wm_txrxintr_enable(wmq);
9797 }
9798
9799 static void
9800 wm_handle_queue_work(struct work *wk, void *context)
9801 {
9802 struct wm_queue *wmq = container_of(wk, struct wm_queue, wmq_cookie);
9803
9804 /*
9805 * "enqueued flag" is not required here.
9806 */
9807 wm_handle_queue(wmq);
9808 }
9809
9810 /*
9811 * wm_linkintr_msix:
9812 *
9813 * Interrupt service routine for link status change for MSI-X.
9814 */
9815 static int
9816 wm_linkintr_msix(void *arg)
9817 {
9818 struct wm_softc *sc = arg;
9819 uint32_t reg;
9820 bool has_rxo;
9821
9822 reg = CSR_READ(sc, WMREG_ICR);
9823 WM_CORE_LOCK(sc);
9824 DPRINTF(WM_DEBUG_LINK,
9825 ("%s: LINK: got link intr. ICR = %08x\n",
9826 device_xname(sc->sc_dev), reg));
9827
9828 if (sc->sc_core_stopping)
9829 goto out;
9830
9831 if ((reg & ICR_LSC) != 0) {
9832 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
9833 wm_linkintr(sc, ICR_LSC);
9834 }
9835 if ((reg & ICR_GPI(0)) != 0)
9836 device_printf(sc->sc_dev, "got module interrupt\n");
9837
9838 /*
9839 * XXX 82574 MSI-X mode workaround
9840 *
9841 * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER
9842 * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor
9843 * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1)
9844 * interrupts by writing WMREG_ICS to process receive packets.
9845 */
9846 if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) {
9847 #if defined(WM_DEBUG)
9848 log(LOG_WARNING, "%s: Receive overrun\n",
9849 device_xname(sc->sc_dev));
9850 #endif /* defined(WM_DEBUG) */
9851
9852 has_rxo = true;
9853 /*
9854 * The RXO interrupt is very high rate when receive traffic is
9855 * high rate. We use polling mode for ICR_OTHER like Tx/Rx
9856 * interrupts. ICR_OTHER will be enabled at the end of
9857 * wm_txrxintr_msix() which is kicked by both ICR_RXQ(0) and
9858 * ICR_RXQ(1) interrupts.
9859 */
9860 CSR_WRITE(sc, WMREG_IMC, ICR_OTHER);
9861
9862 CSR_WRITE(sc, WMREG_ICS, ICR_RXQ(0) | ICR_RXQ(1));
9863 }
9864
9865
9866
9867 out:
9868 WM_CORE_UNLOCK(sc);
9869
9870 if (sc->sc_type == WM_T_82574) {
9871 if (!has_rxo)
9872 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC);
9873 else
9874 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
9875 } else if (sc->sc_type == WM_T_82575)
9876 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER);
9877 else
9878 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx);
9879
9880 return 1;
9881 }
9882
9883 /*
9884 * Media related.
9885 * GMII, SGMII, TBI (and SERDES)
9886 */
9887
9888 /* Common */
9889
9890 /*
9891 * wm_tbi_serdes_set_linkled:
9892 *
9893 * Update the link LED on TBI and SERDES devices.
9894 */
9895 static void
9896 wm_tbi_serdes_set_linkled(struct wm_softc *sc)
9897 {
9898
9899 if (sc->sc_tbi_linkup)
9900 sc->sc_ctrl |= CTRL_SWDPIN(0);
9901 else
9902 sc->sc_ctrl &= ~CTRL_SWDPIN(0);
9903
9904 /* 82540 or newer devices are active low */
9905 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0;
9906
9907 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9908 }
9909
9910 /* GMII related */
9911
9912 /*
9913 * wm_gmii_reset:
9914 *
9915 * Reset the PHY.
9916 */
9917 static void
9918 wm_gmii_reset(struct wm_softc *sc)
9919 {
9920 uint32_t reg;
9921 int rv;
9922
9923 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
9924 device_xname(sc->sc_dev), __func__));
9925
9926 rv = sc->phy.acquire(sc);
9927 if (rv != 0) {
9928 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9929 __func__);
9930 return;
9931 }
9932
9933 switch (sc->sc_type) {
9934 case WM_T_82542_2_0:
9935 case WM_T_82542_2_1:
9936 /* null */
9937 break;
9938 case WM_T_82543:
9939 /*
9940 * With 82543, we need to force speed and duplex on the MAC
9941 * equal to what the PHY speed and duplex configuration is.
9942 * In addition, we need to perform a hardware reset on the PHY
9943 * to take it out of reset.
9944 */
9945 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
9946 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9947
9948 /* The PHY reset pin is active-low. */
9949 reg = CSR_READ(sc, WMREG_CTRL_EXT);
9950 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
9951 CTRL_EXT_SWDPIN(4));
9952 reg |= CTRL_EXT_SWDPIO(4);
9953
9954 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
9955 CSR_WRITE_FLUSH(sc);
9956 delay(10*1000);
9957
9958 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
9959 CSR_WRITE_FLUSH(sc);
9960 delay(150);
9961 #if 0
9962 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
9963 #endif
9964 delay(20*1000); /* XXX extra delay to get PHY ID? */
9965 break;
9966 case WM_T_82544: /* Reset 10000us */
9967 case WM_T_82540:
9968 case WM_T_82545:
9969 case WM_T_82545_3:
9970 case WM_T_82546:
9971 case WM_T_82546_3:
9972 case WM_T_82541:
9973 case WM_T_82541_2:
9974 case WM_T_82547:
9975 case WM_T_82547_2:
9976 case WM_T_82571: /* Reset 100us */
9977 case WM_T_82572:
9978 case WM_T_82573:
9979 case WM_T_82574:
9980 case WM_T_82575:
9981 case WM_T_82576:
9982 case WM_T_82580:
9983 case WM_T_I350:
9984 case WM_T_I354:
9985 case WM_T_I210:
9986 case WM_T_I211:
9987 case WM_T_82583:
9988 case WM_T_80003:
9989 /* Generic reset */
9990 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
9991 CSR_WRITE_FLUSH(sc);
9992 delay(20000);
9993 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9994 CSR_WRITE_FLUSH(sc);
9995 delay(20000);
9996
9997 if ((sc->sc_type == WM_T_82541)
9998 || (sc->sc_type == WM_T_82541_2)
9999 || (sc->sc_type == WM_T_82547)
10000 || (sc->sc_type == WM_T_82547_2)) {
10001 /* Workaround for igp are done in igp_reset() */
10002 /* XXX add code to set LED after phy reset */
10003 }
10004 break;
10005 case WM_T_ICH8:
10006 case WM_T_ICH9:
10007 case WM_T_ICH10:
10008 case WM_T_PCH:
10009 case WM_T_PCH2:
10010 case WM_T_PCH_LPT:
10011 case WM_T_PCH_SPT:
10012 case WM_T_PCH_CNP:
10013 /* Generic reset */
10014 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
10015 CSR_WRITE_FLUSH(sc);
10016 delay(100);
10017 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10018 CSR_WRITE_FLUSH(sc);
10019 delay(150);
10020 break;
10021 default:
10022 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
10023 __func__);
10024 break;
10025 }
10026
10027 sc->phy.release(sc);
10028
10029 /* get_cfg_done */
10030 wm_get_cfg_done(sc);
10031
10032 /* Extra setup */
10033 switch (sc->sc_type) {
10034 case WM_T_82542_2_0:
10035 case WM_T_82542_2_1:
10036 case WM_T_82543:
10037 case WM_T_82544:
10038 case WM_T_82540:
10039 case WM_T_82545:
10040 case WM_T_82545_3:
10041 case WM_T_82546:
10042 case WM_T_82546_3:
10043 case WM_T_82541_2:
10044 case WM_T_82547_2:
10045 case WM_T_82571:
10046 case WM_T_82572:
10047 case WM_T_82573:
10048 case WM_T_82574:
10049 case WM_T_82583:
10050 case WM_T_82575:
10051 case WM_T_82576:
10052 case WM_T_82580:
10053 case WM_T_I350:
10054 case WM_T_I354:
10055 case WM_T_I210:
10056 case WM_T_I211:
10057 case WM_T_80003:
10058 /* Null */
10059 break;
10060 case WM_T_82541:
10061 case WM_T_82547:
10062 /* XXX Configure actively LED after PHY reset */
10063 break;
10064 case WM_T_ICH8:
10065 case WM_T_ICH9:
10066 case WM_T_ICH10:
10067 case WM_T_PCH:
10068 case WM_T_PCH2:
10069 case WM_T_PCH_LPT:
10070 case WM_T_PCH_SPT:
10071 case WM_T_PCH_CNP:
10072 wm_phy_post_reset(sc);
10073 break;
10074 default:
10075 panic("%s: unknown type\n", __func__);
10076 break;
10077 }
10078 }
10079
10080 /*
10081 * Setup sc_phytype and mii_{read|write}reg.
10082 *
10083 * To identify PHY type, correct read/write function should be selected.
10084 * To select correct read/write function, PCI ID or MAC type are required
10085 * without accessing PHY registers.
10086 *
10087 * On the first call of this function, PHY ID is not known yet. Check
10088 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the
10089 * result might be incorrect.
10090 *
10091 * In the second call, PHY OUI and model is used to identify PHY type.
10092 * It might not be perfect because of the lack of compared entry, but it
10093 * would be better than the first call.
10094 *
10095 * If the detected new result and previous assumption is different,
10096 * diagnous message will be printed.
10097 */
10098 static void
10099 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui,
10100 uint16_t phy_model)
10101 {
10102 device_t dev = sc->sc_dev;
10103 struct mii_data *mii = &sc->sc_mii;
10104 uint16_t new_phytype = WMPHY_UNKNOWN;
10105 uint16_t doubt_phytype = WMPHY_UNKNOWN;
10106 mii_readreg_t new_readreg;
10107 mii_writereg_t new_writereg;
10108 bool dodiag = true;
10109
10110 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
10111 device_xname(sc->sc_dev), __func__));
10112
10113 /*
10114 * 1000BASE-T SFP uses SGMII and the first asumed PHY type is always
10115 * incorrect. So don't print diag output when it's 2nd call.
10116 */
10117 if ((sc->sc_sfptype != 0) && (phy_oui == 0) && (phy_model == 0))
10118 dodiag = false;
10119
10120 if (mii->mii_readreg == NULL) {
10121 /*
10122 * This is the first call of this function. For ICH and PCH
10123 * variants, it's difficult to determine the PHY access method
10124 * by sc_type, so use the PCI product ID for some devices.
10125 */
10126
10127 switch (sc->sc_pcidevid) {
10128 case PCI_PRODUCT_INTEL_PCH_M_LM:
10129 case PCI_PRODUCT_INTEL_PCH_M_LC:
10130 /* 82577 */
10131 new_phytype = WMPHY_82577;
10132 break;
10133 case PCI_PRODUCT_INTEL_PCH_D_DM:
10134 case PCI_PRODUCT_INTEL_PCH_D_DC:
10135 /* 82578 */
10136 new_phytype = WMPHY_82578;
10137 break;
10138 case PCI_PRODUCT_INTEL_PCH2_LV_LM:
10139 case PCI_PRODUCT_INTEL_PCH2_LV_V:
10140 /* 82579 */
10141 new_phytype = WMPHY_82579;
10142 break;
10143 case PCI_PRODUCT_INTEL_82801H_82567V_3:
10144 case PCI_PRODUCT_INTEL_82801I_BM:
10145 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */
10146 case PCI_PRODUCT_INTEL_82801J_R_BM_LM:
10147 case PCI_PRODUCT_INTEL_82801J_R_BM_LF:
10148 case PCI_PRODUCT_INTEL_82801J_D_BM_LM:
10149 case PCI_PRODUCT_INTEL_82801J_D_BM_LF:
10150 case PCI_PRODUCT_INTEL_82801J_R_BM_V:
10151 /* ICH8, 9, 10 with 82567 */
10152 new_phytype = WMPHY_BM;
10153 break;
10154 default:
10155 break;
10156 }
10157 } else {
10158 /* It's not the first call. Use PHY OUI and model */
10159 switch (phy_oui) {
10160 case MII_OUI_ATTANSIC: /* XXX ??? */
10161 switch (phy_model) {
10162 case 0x0004: /* XXX */
10163 new_phytype = WMPHY_82578;
10164 break;
10165 default:
10166 break;
10167 }
10168 break;
10169 case MII_OUI_xxMARVELL:
10170 switch (phy_model) {
10171 case MII_MODEL_xxMARVELL_I210:
10172 new_phytype = WMPHY_I210;
10173 break;
10174 case MII_MODEL_xxMARVELL_E1011:
10175 case MII_MODEL_xxMARVELL_E1000_3:
10176 case MII_MODEL_xxMARVELL_E1000_5:
10177 case MII_MODEL_xxMARVELL_E1112:
10178 new_phytype = WMPHY_M88;
10179 break;
10180 case MII_MODEL_xxMARVELL_E1149:
10181 new_phytype = WMPHY_BM;
10182 break;
10183 case MII_MODEL_xxMARVELL_E1111:
10184 case MII_MODEL_xxMARVELL_I347:
10185 case MII_MODEL_xxMARVELL_E1512:
10186 case MII_MODEL_xxMARVELL_E1340M:
10187 case MII_MODEL_xxMARVELL_E1543:
10188 new_phytype = WMPHY_M88;
10189 break;
10190 case MII_MODEL_xxMARVELL_I82563:
10191 new_phytype = WMPHY_GG82563;
10192 break;
10193 default:
10194 break;
10195 }
10196 break;
10197 case MII_OUI_INTEL:
10198 switch (phy_model) {
10199 case MII_MODEL_INTEL_I82577:
10200 new_phytype = WMPHY_82577;
10201 break;
10202 case MII_MODEL_INTEL_I82579:
10203 new_phytype = WMPHY_82579;
10204 break;
10205 case MII_MODEL_INTEL_I217:
10206 new_phytype = WMPHY_I217;
10207 break;
10208 case MII_MODEL_INTEL_I82580:
10209 case MII_MODEL_INTEL_I350:
10210 new_phytype = WMPHY_82580;
10211 break;
10212 default:
10213 break;
10214 }
10215 break;
10216 case MII_OUI_yyINTEL:
10217 switch (phy_model) {
10218 case MII_MODEL_yyINTEL_I82562G:
10219 case MII_MODEL_yyINTEL_I82562EM:
10220 case MII_MODEL_yyINTEL_I82562ET:
10221 new_phytype = WMPHY_IFE;
10222 break;
10223 case MII_MODEL_yyINTEL_IGP01E1000:
10224 new_phytype = WMPHY_IGP;
10225 break;
10226 case MII_MODEL_yyINTEL_I82566:
10227 new_phytype = WMPHY_IGP_3;
10228 break;
10229 default:
10230 break;
10231 }
10232 break;
10233 default:
10234 break;
10235 }
10236
10237 if (dodiag) {
10238 if (new_phytype == WMPHY_UNKNOWN)
10239 aprint_verbose_dev(dev,
10240 "%s: Unknown PHY model. OUI=%06x, "
10241 "model=%04x\n", __func__, phy_oui,
10242 phy_model);
10243
10244 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10245 && (sc->sc_phytype != new_phytype)) {
10246 aprint_error_dev(dev, "Previously assumed PHY "
10247 "type(%u) was incorrect. PHY type from PHY"
10248 "ID = %u\n", sc->sc_phytype, new_phytype);
10249 }
10250 }
10251 }
10252
10253 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */
10254 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) {
10255 /* SGMII */
10256 new_readreg = wm_sgmii_readreg;
10257 new_writereg = wm_sgmii_writereg;
10258 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
10259 /* BM2 (phyaddr == 1) */
10260 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10261 && (new_phytype != WMPHY_BM)
10262 && (new_phytype != WMPHY_UNKNOWN))
10263 doubt_phytype = new_phytype;
10264 new_phytype = WMPHY_BM;
10265 new_readreg = wm_gmii_bm_readreg;
10266 new_writereg = wm_gmii_bm_writereg;
10267 } else if (sc->sc_type >= WM_T_PCH) {
10268 /* All PCH* use _hv_ */
10269 new_readreg = wm_gmii_hv_readreg;
10270 new_writereg = wm_gmii_hv_writereg;
10271 } else if (sc->sc_type >= WM_T_ICH8) {
10272 /* non-82567 ICH8, 9 and 10 */
10273 new_readreg = wm_gmii_i82544_readreg;
10274 new_writereg = wm_gmii_i82544_writereg;
10275 } else if (sc->sc_type >= WM_T_80003) {
10276 /* 80003 */
10277 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10278 && (new_phytype != WMPHY_GG82563)
10279 && (new_phytype != WMPHY_UNKNOWN))
10280 doubt_phytype = new_phytype;
10281 new_phytype = WMPHY_GG82563;
10282 new_readreg = wm_gmii_i80003_readreg;
10283 new_writereg = wm_gmii_i80003_writereg;
10284 } else if (sc->sc_type >= WM_T_I210) {
10285 /* I210 and I211 */
10286 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10287 && (new_phytype != WMPHY_I210)
10288 && (new_phytype != WMPHY_UNKNOWN))
10289 doubt_phytype = new_phytype;
10290 new_phytype = WMPHY_I210;
10291 new_readreg = wm_gmii_gs40g_readreg;
10292 new_writereg = wm_gmii_gs40g_writereg;
10293 } else if (sc->sc_type >= WM_T_82580) {
10294 /* 82580, I350 and I354 */
10295 new_readreg = wm_gmii_82580_readreg;
10296 new_writereg = wm_gmii_82580_writereg;
10297 } else if (sc->sc_type >= WM_T_82544) {
10298 /* 82544, 0, [56], [17], 8257[1234] and 82583 */
10299 new_readreg = wm_gmii_i82544_readreg;
10300 new_writereg = wm_gmii_i82544_writereg;
10301 } else {
10302 new_readreg = wm_gmii_i82543_readreg;
10303 new_writereg = wm_gmii_i82543_writereg;
10304 }
10305
10306 if (new_phytype == WMPHY_BM) {
10307 /* All BM use _bm_ */
10308 new_readreg = wm_gmii_bm_readreg;
10309 new_writereg = wm_gmii_bm_writereg;
10310 }
10311 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_CNP)) {
10312 /* All PCH* use _hv_ */
10313 new_readreg = wm_gmii_hv_readreg;
10314 new_writereg = wm_gmii_hv_writereg;
10315 }
10316
10317 /* Diag output */
10318 if (dodiag) {
10319 if (doubt_phytype != WMPHY_UNKNOWN)
10320 aprint_error_dev(dev, "Assumed new PHY type was "
10321 "incorrect. old = %u, new = %u\n", sc->sc_phytype,
10322 new_phytype);
10323 else if ((sc->sc_phytype != WMPHY_UNKNOWN)
10324 && (sc->sc_phytype != new_phytype))
10325 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
10326 "was incorrect. New PHY type = %u\n",
10327 sc->sc_phytype, new_phytype);
10328
10329 if ((mii->mii_readreg != NULL) &&
10330 (new_phytype == WMPHY_UNKNOWN))
10331 aprint_error_dev(dev, "PHY type is still unknown.\n");
10332
10333 if ((mii->mii_readreg != NULL) &&
10334 (mii->mii_readreg != new_readreg))
10335 aprint_error_dev(dev, "Previously assumed PHY "
10336 "read/write function was incorrect.\n");
10337 }
10338
10339 /* Update now */
10340 sc->sc_phytype = new_phytype;
10341 mii->mii_readreg = new_readreg;
10342 mii->mii_writereg = new_writereg;
10343 if (new_readreg == wm_gmii_hv_readreg) {
10344 sc->phy.readreg_locked = wm_gmii_hv_readreg_locked;
10345 sc->phy.writereg_locked = wm_gmii_hv_writereg_locked;
10346 } else if (new_readreg == wm_sgmii_readreg) {
10347 sc->phy.readreg_locked = wm_sgmii_readreg_locked;
10348 sc->phy.writereg_locked = wm_sgmii_writereg_locked;
10349 } else if (new_readreg == wm_gmii_i82544_readreg) {
10350 sc->phy.readreg_locked = wm_gmii_i82544_readreg_locked;
10351 sc->phy.writereg_locked = wm_gmii_i82544_writereg_locked;
10352 }
10353 }
10354
10355 /*
10356 * wm_get_phy_id_82575:
10357 *
10358 * Return PHY ID. Return -1 if it failed.
10359 */
10360 static int
10361 wm_get_phy_id_82575(struct wm_softc *sc)
10362 {
10363 uint32_t reg;
10364 int phyid = -1;
10365
10366 /* XXX */
10367 if ((sc->sc_flags & WM_F_SGMII) == 0)
10368 return -1;
10369
10370 if (wm_sgmii_uses_mdio(sc)) {
10371 switch (sc->sc_type) {
10372 case WM_T_82575:
10373 case WM_T_82576:
10374 reg = CSR_READ(sc, WMREG_MDIC);
10375 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT;
10376 break;
10377 case WM_T_82580:
10378 case WM_T_I350:
10379 case WM_T_I354:
10380 case WM_T_I210:
10381 case WM_T_I211:
10382 reg = CSR_READ(sc, WMREG_MDICNFG);
10383 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT;
10384 break;
10385 default:
10386 return -1;
10387 }
10388 }
10389
10390 return phyid;
10391 }
10392
10393
10394 /*
10395 * wm_gmii_mediainit:
10396 *
10397 * Initialize media for use on 1000BASE-T devices.
10398 */
10399 static void
10400 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid)
10401 {
10402 device_t dev = sc->sc_dev;
10403 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
10404 struct mii_data *mii = &sc->sc_mii;
10405
10406 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10407 device_xname(sc->sc_dev), __func__));
10408
10409 /* We have GMII. */
10410 sc->sc_flags |= WM_F_HAS_MII;
10411
10412 if (sc->sc_type == WM_T_80003)
10413 sc->sc_tipg = TIPG_1000T_80003_DFLT;
10414 else
10415 sc->sc_tipg = TIPG_1000T_DFLT;
10416
10417 /*
10418 * Let the chip set speed/duplex on its own based on
10419 * signals from the PHY.
10420 * XXXbouyer - I'm not sure this is right for the 80003,
10421 * the em driver only sets CTRL_SLU here - but it seems to work.
10422 */
10423 sc->sc_ctrl |= CTRL_SLU;
10424 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10425
10426 /* Initialize our media structures and probe the GMII. */
10427 mii->mii_ifp = ifp;
10428
10429 mii->mii_statchg = wm_gmii_statchg;
10430
10431 /* get PHY control from SMBus to PCIe */
10432 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
10433 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
10434 || (sc->sc_type == WM_T_PCH_CNP))
10435 wm_init_phy_workarounds_pchlan(sc);
10436
10437 wm_gmii_reset(sc);
10438
10439 sc->sc_ethercom.ec_mii = &sc->sc_mii;
10440 ifmedia_init_with_lock(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange,
10441 wm_gmii_mediastatus, sc->sc_core_lock);
10442
10443 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
10444 || (sc->sc_type == WM_T_82580)
10445 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
10446 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) {
10447 if ((sc->sc_flags & WM_F_SGMII) == 0) {
10448 /* Attach only one port */
10449 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1,
10450 MII_OFFSET_ANY, MIIF_DOPAUSE);
10451 } else {
10452 int i, id;
10453 uint32_t ctrl_ext;
10454
10455 id = wm_get_phy_id_82575(sc);
10456 if (id != -1) {
10457 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff,
10458 id, MII_OFFSET_ANY, MIIF_DOPAUSE);
10459 }
10460 if ((id == -1)
10461 || (LIST_FIRST(&mii->mii_phys) == NULL)) {
10462 /* Power on sgmii phy if it is disabled */
10463 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
10464 CSR_WRITE(sc, WMREG_CTRL_EXT,
10465 ctrl_ext &~ CTRL_EXT_SWDPIN(3));
10466 CSR_WRITE_FLUSH(sc);
10467 delay(300*1000); /* XXX too long */
10468
10469 /*
10470 * From 1 to 8.
10471 *
10472 * I2C access fails with I2C register's ERROR
10473 * bit set, so prevent error message while
10474 * scanning.
10475 */
10476 sc->phy.no_errprint = true;
10477 for (i = 1; i < 8; i++)
10478 mii_attach(sc->sc_dev, &sc->sc_mii,
10479 0xffffffff, i, MII_OFFSET_ANY,
10480 MIIF_DOPAUSE);
10481 sc->phy.no_errprint = false;
10482
10483 /* Restore previous sfp cage power state */
10484 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
10485 }
10486 }
10487 } else
10488 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
10489 MII_OFFSET_ANY, MIIF_DOPAUSE);
10490
10491 /*
10492 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call
10493 * wm_set_mdio_slow_mode_hv() for a workaround and retry.
10494 */
10495 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
10496 || (sc->sc_type == WM_T_PCH_SPT)
10497 || (sc->sc_type == WM_T_PCH_CNP))
10498 && (LIST_FIRST(&mii->mii_phys) == NULL)) {
10499 wm_set_mdio_slow_mode_hv(sc);
10500 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
10501 MII_OFFSET_ANY, MIIF_DOPAUSE);
10502 }
10503
10504 /*
10505 * (For ICH8 variants)
10506 * If PHY detection failed, use BM's r/w function and retry.
10507 */
10508 if (LIST_FIRST(&mii->mii_phys) == NULL) {
10509 /* if failed, retry with *_bm_* */
10510 aprint_verbose_dev(dev, "Assumed PHY access function "
10511 "(type = %d) might be incorrect. Use BM and retry.\n",
10512 sc->sc_phytype);
10513 sc->sc_phytype = WMPHY_BM;
10514 mii->mii_readreg = wm_gmii_bm_readreg;
10515 mii->mii_writereg = wm_gmii_bm_writereg;
10516
10517 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
10518 MII_OFFSET_ANY, MIIF_DOPAUSE);
10519 }
10520
10521 if (LIST_FIRST(&mii->mii_phys) == NULL) {
10522 /* Any PHY wasn't find */
10523 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
10524 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
10525 sc->sc_phytype = WMPHY_NONE;
10526 } else {
10527 struct mii_softc *child = LIST_FIRST(&mii->mii_phys);
10528
10529 /*
10530 * PHY Found! Check PHY type again by the second call of
10531 * wm_gmii_setup_phytype.
10532 */
10533 wm_gmii_setup_phytype(sc, child->mii_mpd_oui,
10534 child->mii_mpd_model);
10535
10536 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
10537 }
10538 }
10539
10540 /*
10541 * wm_gmii_mediachange: [ifmedia interface function]
10542 *
10543 * Set hardware to newly-selected media on a 1000BASE-T device.
10544 */
10545 static int
10546 wm_gmii_mediachange(struct ifnet *ifp)
10547 {
10548 struct wm_softc *sc = ifp->if_softc;
10549 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
10550 uint32_t reg;
10551 int rc;
10552
10553 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10554 device_xname(sc->sc_dev), __func__));
10555 if ((ifp->if_flags & IFF_UP) == 0)
10556 return 0;
10557
10558 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */
10559 if ((sc->sc_type == WM_T_82580)
10560 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210)
10561 || (sc->sc_type == WM_T_I211)) {
10562 reg = CSR_READ(sc, WMREG_PHPM);
10563 reg &= ~PHPM_GO_LINK_D;
10564 CSR_WRITE(sc, WMREG_PHPM, reg);
10565 }
10566
10567 /* Disable D0 LPLU. */
10568 wm_lplu_d0_disable(sc);
10569
10570 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
10571 sc->sc_ctrl |= CTRL_SLU;
10572 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
10573 || (sc->sc_type > WM_T_82543)) {
10574 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
10575 } else {
10576 sc->sc_ctrl &= ~CTRL_ASDE;
10577 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
10578 if (ife->ifm_media & IFM_FDX)
10579 sc->sc_ctrl |= CTRL_FD;
10580 switch (IFM_SUBTYPE(ife->ifm_media)) {
10581 case IFM_10_T:
10582 sc->sc_ctrl |= CTRL_SPEED_10;
10583 break;
10584 case IFM_100_TX:
10585 sc->sc_ctrl |= CTRL_SPEED_100;
10586 break;
10587 case IFM_1000_T:
10588 sc->sc_ctrl |= CTRL_SPEED_1000;
10589 break;
10590 case IFM_NONE:
10591 /* There is no specific setting for IFM_NONE */
10592 break;
10593 default:
10594 panic("wm_gmii_mediachange: bad media 0x%x",
10595 ife->ifm_media);
10596 }
10597 }
10598 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10599 CSR_WRITE_FLUSH(sc);
10600
10601 if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211))
10602 wm_serdes_mediachange(ifp);
10603
10604 if (sc->sc_type <= WM_T_82543)
10605 wm_gmii_reset(sc);
10606 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)
10607 && ((sc->sc_flags & WM_F_SGMII) != 0)) {
10608 /* allow time for SFP cage time to power up phy */
10609 delay(300 * 1000);
10610 wm_gmii_reset(sc);
10611 }
10612
10613 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
10614 return 0;
10615 return rc;
10616 }
10617
10618 /*
10619 * wm_gmii_mediastatus: [ifmedia interface function]
10620 *
10621 * Get the current interface media status on a 1000BASE-T device.
10622 */
10623 static void
10624 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
10625 {
10626 struct wm_softc *sc = ifp->if_softc;
10627
10628 ether_mediastatus(ifp, ifmr);
10629 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
10630 | sc->sc_flowflags;
10631 }
10632
10633 #define MDI_IO CTRL_SWDPIN(2)
10634 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */
10635 #define MDI_CLK CTRL_SWDPIN(3)
10636
10637 static void
10638 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
10639 {
10640 uint32_t i, v;
10641
10642 v = CSR_READ(sc, WMREG_CTRL);
10643 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
10644 v |= MDI_DIR | CTRL_SWDPIO(3);
10645
10646 for (i = __BIT(nbits - 1); i != 0; i >>= 1) {
10647 if (data & i)
10648 v |= MDI_IO;
10649 else
10650 v &= ~MDI_IO;
10651 CSR_WRITE(sc, WMREG_CTRL, v);
10652 CSR_WRITE_FLUSH(sc);
10653 delay(10);
10654 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10655 CSR_WRITE_FLUSH(sc);
10656 delay(10);
10657 CSR_WRITE(sc, WMREG_CTRL, v);
10658 CSR_WRITE_FLUSH(sc);
10659 delay(10);
10660 }
10661 }
10662
10663 static uint16_t
10664 wm_i82543_mii_recvbits(struct wm_softc *sc)
10665 {
10666 uint32_t v, i;
10667 uint16_t data = 0;
10668
10669 v = CSR_READ(sc, WMREG_CTRL);
10670 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
10671 v |= CTRL_SWDPIO(3);
10672
10673 CSR_WRITE(sc, WMREG_CTRL, v);
10674 CSR_WRITE_FLUSH(sc);
10675 delay(10);
10676 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10677 CSR_WRITE_FLUSH(sc);
10678 delay(10);
10679 CSR_WRITE(sc, WMREG_CTRL, v);
10680 CSR_WRITE_FLUSH(sc);
10681 delay(10);
10682
10683 for (i = 0; i < 16; i++) {
10684 data <<= 1;
10685 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10686 CSR_WRITE_FLUSH(sc);
10687 delay(10);
10688 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
10689 data |= 1;
10690 CSR_WRITE(sc, WMREG_CTRL, v);
10691 CSR_WRITE_FLUSH(sc);
10692 delay(10);
10693 }
10694
10695 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10696 CSR_WRITE_FLUSH(sc);
10697 delay(10);
10698 CSR_WRITE(sc, WMREG_CTRL, v);
10699 CSR_WRITE_FLUSH(sc);
10700 delay(10);
10701
10702 return data;
10703 }
10704
10705 #undef MDI_IO
10706 #undef MDI_DIR
10707 #undef MDI_CLK
10708
10709 /*
10710 * wm_gmii_i82543_readreg: [mii interface function]
10711 *
10712 * Read a PHY register on the GMII (i82543 version).
10713 */
10714 static int
10715 wm_gmii_i82543_readreg(device_t dev, int phy, int reg, uint16_t *val)
10716 {
10717 struct wm_softc *sc = device_private(dev);
10718
10719 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
10720 wm_i82543_mii_sendbits(sc, reg | (phy << 5) |
10721 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
10722 *val = wm_i82543_mii_recvbits(sc) & 0xffff;
10723
10724 DPRINTF(WM_DEBUG_GMII, ("%s: GMII: read phy %d reg %d -> 0x%04hx\n",
10725 device_xname(dev), phy, reg, *val));
10726
10727 return 0;
10728 }
10729
10730 /*
10731 * wm_gmii_i82543_writereg: [mii interface function]
10732 *
10733 * Write a PHY register on the GMII (i82543 version).
10734 */
10735 static int
10736 wm_gmii_i82543_writereg(device_t dev, int phy, int reg, uint16_t val)
10737 {
10738 struct wm_softc *sc = device_private(dev);
10739
10740 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
10741 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
10742 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
10743 (MII_COMMAND_START << 30), 32);
10744
10745 return 0;
10746 }
10747
10748 /*
10749 * wm_gmii_mdic_readreg: [mii interface function]
10750 *
10751 * Read a PHY register on the GMII.
10752 */
10753 static int
10754 wm_gmii_mdic_readreg(device_t dev, int phy, int reg, uint16_t *val)
10755 {
10756 struct wm_softc *sc = device_private(dev);
10757 uint32_t mdic = 0;
10758 int i;
10759
10760 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217)
10761 && (reg > MII_ADDRMASK)) {
10762 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10763 __func__, sc->sc_phytype, reg);
10764 reg &= MII_ADDRMASK;
10765 }
10766
10767 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
10768 MDIC_REGADD(reg));
10769
10770 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
10771 delay(50);
10772 mdic = CSR_READ(sc, WMREG_MDIC);
10773 if (mdic & MDIC_READY)
10774 break;
10775 }
10776
10777 if ((mdic & MDIC_READY) == 0) {
10778 DPRINTF(WM_DEBUG_GMII,
10779 ("%s: MDIC read timed out: phy %d reg %d\n",
10780 device_xname(dev), phy, reg));
10781 return ETIMEDOUT;
10782 } else if (mdic & MDIC_E) {
10783 /* This is normal if no PHY is present. */
10784 DPRINTF(WM_DEBUG_GMII, ("%s: MDIC read error: phy %d reg %d\n",
10785 device_xname(sc->sc_dev), phy, reg));
10786 return -1;
10787 } else
10788 *val = MDIC_DATA(mdic);
10789
10790 /*
10791 * Allow some time after each MDIC transaction to avoid
10792 * reading duplicate data in the next MDIC transaction.
10793 */
10794 if (sc->sc_type == WM_T_PCH2)
10795 delay(100);
10796
10797 return 0;
10798 }
10799
10800 /*
10801 * wm_gmii_mdic_writereg: [mii interface function]
10802 *
10803 * Write a PHY register on the GMII.
10804 */
10805 static int
10806 wm_gmii_mdic_writereg(device_t dev, int phy, int reg, uint16_t val)
10807 {
10808 struct wm_softc *sc = device_private(dev);
10809 uint32_t mdic = 0;
10810 int i;
10811
10812 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217)
10813 && (reg > MII_ADDRMASK)) {
10814 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10815 __func__, sc->sc_phytype, reg);
10816 reg &= MII_ADDRMASK;
10817 }
10818
10819 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
10820 MDIC_REGADD(reg) | MDIC_DATA(val));
10821
10822 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
10823 delay(50);
10824 mdic = CSR_READ(sc, WMREG_MDIC);
10825 if (mdic & MDIC_READY)
10826 break;
10827 }
10828
10829 if ((mdic & MDIC_READY) == 0) {
10830 DPRINTF(WM_DEBUG_GMII,
10831 ("%s: MDIC write timed out: phy %d reg %d\n",
10832 device_xname(dev), phy, reg));
10833 return ETIMEDOUT;
10834 } else if (mdic & MDIC_E) {
10835 DPRINTF(WM_DEBUG_GMII,
10836 ("%s: MDIC write error: phy %d reg %d\n",
10837 device_xname(dev), phy, reg));
10838 return -1;
10839 }
10840
10841 /*
10842 * Allow some time after each MDIC transaction to avoid
10843 * reading duplicate data in the next MDIC transaction.
10844 */
10845 if (sc->sc_type == WM_T_PCH2)
10846 delay(100);
10847
10848 return 0;
10849 }
10850
10851 /*
10852 * wm_gmii_i82544_readreg: [mii interface function]
10853 *
10854 * Read a PHY register on the GMII.
10855 */
10856 static int
10857 wm_gmii_i82544_readreg(device_t dev, int phy, int reg, uint16_t *val)
10858 {
10859 struct wm_softc *sc = device_private(dev);
10860 int rv;
10861
10862 if (sc->phy.acquire(sc)) {
10863 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10864 return -1;
10865 }
10866
10867 rv = wm_gmii_i82544_readreg_locked(dev, phy, reg, val);
10868
10869 sc->phy.release(sc);
10870
10871 return rv;
10872 }
10873
10874 static int
10875 wm_gmii_i82544_readreg_locked(device_t dev, int phy, int reg, uint16_t *val)
10876 {
10877 struct wm_softc *sc = device_private(dev);
10878 int rv;
10879
10880 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10881 switch (sc->sc_phytype) {
10882 case WMPHY_IGP:
10883 case WMPHY_IGP_2:
10884 case WMPHY_IGP_3:
10885 rv = wm_gmii_mdic_writereg(dev, phy,
10886 MII_IGPHY_PAGE_SELECT, reg);
10887 if (rv != 0)
10888 return rv;
10889 break;
10890 default:
10891 #ifdef WM_DEBUG
10892 device_printf(dev, "%s: PHYTYPE = 0x%x, addr = %02x\n",
10893 __func__, sc->sc_phytype, reg);
10894 #endif
10895 break;
10896 }
10897 }
10898
10899 return wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
10900 }
10901
10902 /*
10903 * wm_gmii_i82544_writereg: [mii interface function]
10904 *
10905 * Write a PHY register on the GMII.
10906 */
10907 static int
10908 wm_gmii_i82544_writereg(device_t dev, int phy, int reg, uint16_t val)
10909 {
10910 struct wm_softc *sc = device_private(dev);
10911 int rv;
10912
10913 if (sc->phy.acquire(sc)) {
10914 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10915 return -1;
10916 }
10917
10918 rv = wm_gmii_i82544_writereg_locked(dev, phy, reg & MII_ADDRMASK, val);
10919 sc->phy.release(sc);
10920
10921 return rv;
10922 }
10923
10924 static int
10925 wm_gmii_i82544_writereg_locked(device_t dev, int phy, int reg, uint16_t val)
10926 {
10927 struct wm_softc *sc = device_private(dev);
10928 int rv;
10929
10930 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10931 switch (sc->sc_phytype) {
10932 case WMPHY_IGP:
10933 case WMPHY_IGP_2:
10934 case WMPHY_IGP_3:
10935 rv = wm_gmii_mdic_writereg(dev, phy,
10936 MII_IGPHY_PAGE_SELECT, reg);
10937 if (rv != 0)
10938 return rv;
10939 break;
10940 default:
10941 #ifdef WM_DEBUG
10942 device_printf(dev, "%s: PHYTYPE == 0x%x, addr = %02x",
10943 __func__, sc->sc_phytype, reg);
10944 #endif
10945 break;
10946 }
10947 }
10948
10949 return wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10950 }
10951
10952 /*
10953 * wm_gmii_i80003_readreg: [mii interface function]
10954 *
10955 * Read a PHY register on the kumeran
10956 * This could be handled by the PHY layer if we didn't have to lock the
10957 * ressource ...
10958 */
10959 static int
10960 wm_gmii_i80003_readreg(device_t dev, int phy, int reg, uint16_t *val)
10961 {
10962 struct wm_softc *sc = device_private(dev);
10963 int page_select;
10964 uint16_t temp, temp2;
10965 int rv = 0;
10966
10967 if (phy != 1) /* Only one PHY on kumeran bus */
10968 return -1;
10969
10970 if (sc->phy.acquire(sc)) {
10971 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10972 return -1;
10973 }
10974
10975 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
10976 page_select = GG82563_PHY_PAGE_SELECT;
10977 else {
10978 /*
10979 * Use Alternative Page Select register to access registers
10980 * 30 and 31.
10981 */
10982 page_select = GG82563_PHY_PAGE_SELECT_ALT;
10983 }
10984 temp = reg >> GG82563_PAGE_SHIFT;
10985 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0)
10986 goto out;
10987
10988 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
10989 /*
10990 * Wait more 200us for a bug of the ready bit in the MDIC
10991 * register.
10992 */
10993 delay(200);
10994 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2);
10995 if ((rv != 0) || (temp2 != temp)) {
10996 device_printf(dev, "%s failed\n", __func__);
10997 rv = -1;
10998 goto out;
10999 }
11000 delay(200);
11001 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11002 delay(200);
11003 } else
11004 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11005
11006 out:
11007 sc->phy.release(sc);
11008 return rv;
11009 }
11010
11011 /*
11012 * wm_gmii_i80003_writereg: [mii interface function]
11013 *
11014 * Write a PHY register on the kumeran.
11015 * This could be handled by the PHY layer if we didn't have to lock the
11016 * ressource ...
11017 */
11018 static int
11019 wm_gmii_i80003_writereg(device_t dev, int phy, int reg, uint16_t val)
11020 {
11021 struct wm_softc *sc = device_private(dev);
11022 int page_select, rv;
11023 uint16_t temp, temp2;
11024
11025 if (phy != 1) /* Only one PHY on kumeran bus */
11026 return -1;
11027
11028 if (sc->phy.acquire(sc)) {
11029 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11030 return -1;
11031 }
11032
11033 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
11034 page_select = GG82563_PHY_PAGE_SELECT;
11035 else {
11036 /*
11037 * Use Alternative Page Select register to access registers
11038 * 30 and 31.
11039 */
11040 page_select = GG82563_PHY_PAGE_SELECT_ALT;
11041 }
11042 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT;
11043 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0)
11044 goto out;
11045
11046 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
11047 /*
11048 * Wait more 200us for a bug of the ready bit in the MDIC
11049 * register.
11050 */
11051 delay(200);
11052 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2);
11053 if ((rv != 0) || (temp2 != temp)) {
11054 device_printf(dev, "%s failed\n", __func__);
11055 rv = -1;
11056 goto out;
11057 }
11058 delay(200);
11059 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11060 delay(200);
11061 } else
11062 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11063
11064 out:
11065 sc->phy.release(sc);
11066 return rv;
11067 }
11068
11069 /*
11070 * wm_gmii_bm_readreg: [mii interface function]
11071 *
11072 * Read a PHY register on the kumeran
11073 * This could be handled by the PHY layer if we didn't have to lock the
11074 * ressource ...
11075 */
11076 static int
11077 wm_gmii_bm_readreg(device_t dev, int phy, int reg, uint16_t *val)
11078 {
11079 struct wm_softc *sc = device_private(dev);
11080 uint16_t page = reg >> BME1000_PAGE_SHIFT;
11081 int rv;
11082
11083 if (sc->phy.acquire(sc)) {
11084 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11085 return -1;
11086 }
11087
11088 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
11089 phy = ((page >= 768) || ((page == 0) && (reg == 25))
11090 || (reg == 31)) ? 1 : phy;
11091 /* Page 800 works differently than the rest so it has its own func */
11092 if (page == BM_WUC_PAGE) {
11093 rv = wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false);
11094 goto release;
11095 }
11096
11097 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
11098 if ((phy == 1) && (sc->sc_type != WM_T_82574)
11099 && (sc->sc_type != WM_T_82583))
11100 rv = wm_gmii_mdic_writereg(dev, phy,
11101 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
11102 else
11103 rv = wm_gmii_mdic_writereg(dev, phy,
11104 BME1000_PHY_PAGE_SELECT, page);
11105 if (rv != 0)
11106 goto release;
11107 }
11108
11109 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11110
11111 release:
11112 sc->phy.release(sc);
11113 return rv;
11114 }
11115
11116 /*
11117 * wm_gmii_bm_writereg: [mii interface function]
11118 *
11119 * Write a PHY register on the kumeran.
11120 * This could be handled by the PHY layer if we didn't have to lock the
11121 * ressource ...
11122 */
11123 static int
11124 wm_gmii_bm_writereg(device_t dev, int phy, int reg, uint16_t val)
11125 {
11126 struct wm_softc *sc = device_private(dev);
11127 uint16_t page = reg >> BME1000_PAGE_SHIFT;
11128 int rv;
11129
11130 if (sc->phy.acquire(sc)) {
11131 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11132 return -1;
11133 }
11134
11135 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
11136 phy = ((page >= 768) || ((page == 0) && (reg == 25))
11137 || (reg == 31)) ? 1 : phy;
11138 /* Page 800 works differently than the rest so it has its own func */
11139 if (page == BM_WUC_PAGE) {
11140 rv = wm_access_phy_wakeup_reg_bm(dev, reg, &val, false, false);
11141 goto release;
11142 }
11143
11144 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
11145 if ((phy == 1) && (sc->sc_type != WM_T_82574)
11146 && (sc->sc_type != WM_T_82583))
11147 rv = wm_gmii_mdic_writereg(dev, phy,
11148 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
11149 else
11150 rv = wm_gmii_mdic_writereg(dev, phy,
11151 BME1000_PHY_PAGE_SELECT, page);
11152 if (rv != 0)
11153 goto release;
11154 }
11155
11156 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11157
11158 release:
11159 sc->phy.release(sc);
11160 return rv;
11161 }
11162
11163 /*
11164 * wm_enable_phy_wakeup_reg_access_bm - enable access to BM wakeup registers
11165 * @dev: pointer to the HW structure
11166 * @phy_reg: pointer to store original contents of BM_WUC_ENABLE_REG
11167 *
11168 * Assumes semaphore already acquired and phy_reg points to a valid memory
11169 * address to store contents of the BM_WUC_ENABLE_REG register.
11170 */
11171 static int
11172 wm_enable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp)
11173 {
11174 uint16_t temp;
11175 int rv;
11176
11177 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
11178 device_xname(dev), __func__));
11179
11180 if (!phy_regp)
11181 return -1;
11182
11183 /* All page select, port ctrl and wakeup registers use phy address 1 */
11184
11185 /* Select Port Control Registers page */
11186 rv = wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
11187 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT);
11188 if (rv != 0)
11189 return rv;
11190
11191 /* Read WUCE and save it */
11192 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_ENABLE_REG, phy_regp);
11193 if (rv != 0)
11194 return rv;
11195
11196 /* Enable both PHY wakeup mode and Wakeup register page writes.
11197 * Prevent a power state change by disabling ME and Host PHY wakeup.
11198 */
11199 temp = *phy_regp;
11200 temp |= BM_WUC_ENABLE_BIT;
11201 temp &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT);
11202
11203 if ((rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, temp)) != 0)
11204 return rv;
11205
11206 /* Select Host Wakeup Registers page - caller now able to write
11207 * registers on the Wakeup registers page
11208 */
11209 return wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
11210 BM_WUC_PAGE << IGP3_PAGE_SHIFT);
11211 }
11212
11213 /*
11214 * wm_disable_phy_wakeup_reg_access_bm - disable access to BM wakeup regs
11215 * @dev: pointer to the HW structure
11216 * @phy_reg: pointer to original contents of BM_WUC_ENABLE_REG
11217 *
11218 * Restore BM_WUC_ENABLE_REG to its original value.
11219 *
11220 * Assumes semaphore already acquired and *phy_reg is the contents of the
11221 * BM_WUC_ENABLE_REG before register(s) on BM_WUC_PAGE were accessed by
11222 * caller.
11223 */
11224 static int
11225 wm_disable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp)
11226 {
11227
11228 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
11229 device_xname(dev), __func__));
11230
11231 if (!phy_regp)
11232 return -1;
11233
11234 /* Select Port Control Registers page */
11235 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
11236 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT);
11237
11238 /* Restore 769.17 to its original value */
11239 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, *phy_regp);
11240
11241 return 0;
11242 }
11243
11244 /*
11245 * wm_access_phy_wakeup_reg_bm - Read/write BM PHY wakeup register
11246 * @sc: pointer to the HW structure
11247 * @offset: register offset to be read or written
11248 * @val: pointer to the data to read or write
11249 * @rd: determines if operation is read or write
11250 * @page_set: BM_WUC_PAGE already set and access enabled
11251 *
11252 * Read the PHY register at offset and store the retrieved information in
11253 * data, or write data to PHY register at offset. Note the procedure to
11254 * access the PHY wakeup registers is different than reading the other PHY
11255 * registers. It works as such:
11256 * 1) Set 769.17.2 (page 769, register 17, bit 2) = 1
11257 * 2) Set page to 800 for host (801 if we were manageability)
11258 * 3) Write the address using the address opcode (0x11)
11259 * 4) Read or write the data using the data opcode (0x12)
11260 * 5) Restore 769.17.2 to its original value
11261 *
11262 * Steps 1 and 2 are done by wm_enable_phy_wakeup_reg_access_bm() and
11263 * step 5 is done by wm_disable_phy_wakeup_reg_access_bm().
11264 *
11265 * Assumes semaphore is already acquired. When page_set==TRUE, assumes
11266 * the PHY page is set to BM_WUC_PAGE (i.e. a function in the call stack
11267 * is responsible for calls to wm_[enable|disable]_phy_wakeup_reg_bm()).
11268 */
11269 static int
11270 wm_access_phy_wakeup_reg_bm(device_t dev, int offset, int16_t *val, int rd,
11271 bool page_set)
11272 {
11273 struct wm_softc *sc = device_private(dev);
11274 uint16_t regnum = BM_PHY_REG_NUM(offset);
11275 uint16_t page = BM_PHY_REG_PAGE(offset);
11276 uint16_t wuce;
11277 int rv = 0;
11278
11279 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
11280 device_xname(dev), __func__));
11281 /* XXX Gig must be disabled for MDIO accesses to page 800 */
11282 if ((sc->sc_type == WM_T_PCH)
11283 && ((CSR_READ(sc, WMREG_PHY_CTRL) & PHY_CTRL_GBE_DIS) == 0)) {
11284 device_printf(dev,
11285 "Attempting to access page %d while gig enabled.\n", page);
11286 }
11287
11288 if (!page_set) {
11289 /* Enable access to PHY wakeup registers */
11290 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce);
11291 if (rv != 0) {
11292 device_printf(dev,
11293 "%s: Could not enable PHY wakeup reg access\n",
11294 __func__);
11295 return rv;
11296 }
11297 }
11298 DPRINTF(WM_DEBUG_GMII, ("%s: %s: Accessing PHY page %d reg 0x%x\n",
11299 device_xname(sc->sc_dev), __func__, page, regnum));
11300
11301 /*
11302 * 2) Access PHY wakeup register.
11303 * See wm_access_phy_wakeup_reg_bm.
11304 */
11305
11306 /* Write the Wakeup register page offset value using opcode 0x11 */
11307 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ADDRESS_OPCODE, regnum);
11308 if (rv != 0)
11309 return rv;
11310
11311 if (rd) {
11312 /* Read the Wakeup register page value using opcode 0x12 */
11313 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_DATA_OPCODE, val);
11314 } else {
11315 /* Write the Wakeup register page value using opcode 0x12 */
11316 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_DATA_OPCODE, *val);
11317 }
11318 if (rv != 0)
11319 return rv;
11320
11321 if (!page_set)
11322 rv = wm_disable_phy_wakeup_reg_access_bm(dev, &wuce);
11323
11324 return rv;
11325 }
11326
11327 /*
11328 * wm_gmii_hv_readreg: [mii interface function]
11329 *
11330 * Read a PHY register on the kumeran
11331 * This could be handled by the PHY layer if we didn't have to lock the
11332 * ressource ...
11333 */
11334 static int
11335 wm_gmii_hv_readreg(device_t dev, int phy, int reg, uint16_t *val)
11336 {
11337 struct wm_softc *sc = device_private(dev);
11338 int rv;
11339
11340 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
11341 device_xname(dev), __func__));
11342 if (sc->phy.acquire(sc)) {
11343 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11344 return -1;
11345 }
11346
11347 rv = wm_gmii_hv_readreg_locked(dev, phy, reg, val);
11348 sc->phy.release(sc);
11349 return rv;
11350 }
11351
11352 static int
11353 wm_gmii_hv_readreg_locked(device_t dev, int phy, int reg, uint16_t *val)
11354 {
11355 uint16_t page = BM_PHY_REG_PAGE(reg);
11356 uint16_t regnum = BM_PHY_REG_NUM(reg);
11357 int rv;
11358
11359 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
11360
11361 /* Page 800 works differently than the rest so it has its own func */
11362 if (page == BM_WUC_PAGE)
11363 return wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false);
11364
11365 /*
11366 * Lower than page 768 works differently than the rest so it has its
11367 * own func
11368 */
11369 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
11370 device_printf(dev, "gmii_hv_readreg!!!\n");
11371 return -1;
11372 }
11373
11374 /*
11375 * XXX I21[789] documents say that the SMBus Address register is at
11376 * PHY address 01, Page 0 (not 768), Register 26.
11377 */
11378 if (page == HV_INTC_FC_PAGE_START)
11379 page = 0;
11380
11381 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
11382 rv = wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
11383 page << BME1000_PAGE_SHIFT);
11384 if (rv != 0)
11385 return rv;
11386 }
11387
11388 return wm_gmii_mdic_readreg(dev, phy, regnum & MII_ADDRMASK, val);
11389 }
11390
11391 /*
11392 * wm_gmii_hv_writereg: [mii interface function]
11393 *
11394 * Write a PHY register on the kumeran.
11395 * This could be handled by the PHY layer if we didn't have to lock the
11396 * ressource ...
11397 */
11398 static int
11399 wm_gmii_hv_writereg(device_t dev, int phy, int reg, uint16_t val)
11400 {
11401 struct wm_softc *sc = device_private(dev);
11402 int rv;
11403
11404 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
11405 device_xname(dev), __func__));
11406
11407 if (sc->phy.acquire(sc)) {
11408 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11409 return -1;
11410 }
11411
11412 rv = wm_gmii_hv_writereg_locked(dev, phy, reg, val);
11413 sc->phy.release(sc);
11414
11415 return rv;
11416 }
11417
11418 static int
11419 wm_gmii_hv_writereg_locked(device_t dev, int phy, int reg, uint16_t val)
11420 {
11421 struct wm_softc *sc = device_private(dev);
11422 uint16_t page = BM_PHY_REG_PAGE(reg);
11423 uint16_t regnum = BM_PHY_REG_NUM(reg);
11424 int rv;
11425
11426 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
11427
11428 /* Page 800 works differently than the rest so it has its own func */
11429 if (page == BM_WUC_PAGE)
11430 return wm_access_phy_wakeup_reg_bm(dev, reg, &val, false,
11431 false);
11432
11433 /*
11434 * Lower than page 768 works differently than the rest so it has its
11435 * own func
11436 */
11437 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
11438 device_printf(dev, "gmii_hv_writereg!!!\n");
11439 return -1;
11440 }
11441
11442 {
11443 /*
11444 * XXX I21[789] documents say that the SMBus Address register
11445 * is at PHY address 01, Page 0 (not 768), Register 26.
11446 */
11447 if (page == HV_INTC_FC_PAGE_START)
11448 page = 0;
11449
11450 /*
11451 * XXX Workaround MDIO accesses being disabled after entering
11452 * IEEE Power Down (whenever bit 11 of the PHY control
11453 * register is set)
11454 */
11455 if (sc->sc_phytype == WMPHY_82578) {
11456 struct mii_softc *child;
11457
11458 child = LIST_FIRST(&sc->sc_mii.mii_phys);
11459 if ((child != NULL) && (child->mii_mpd_rev >= 1)
11460 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0)
11461 && ((val & (1 << 11)) != 0)) {
11462 device_printf(dev, "XXX need workaround\n");
11463 }
11464 }
11465
11466 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
11467 rv = wm_gmii_mdic_writereg(dev, 1,
11468 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
11469 if (rv != 0)
11470 return rv;
11471 }
11472 }
11473
11474 return wm_gmii_mdic_writereg(dev, phy, regnum & MII_ADDRMASK, val);
11475 }
11476
11477 /*
11478 * wm_gmii_82580_readreg: [mii interface function]
11479 *
11480 * Read a PHY register on the 82580 and I350.
11481 * This could be handled by the PHY layer if we didn't have to lock the
11482 * ressource ...
11483 */
11484 static int
11485 wm_gmii_82580_readreg(device_t dev, int phy, int reg, uint16_t *val)
11486 {
11487 struct wm_softc *sc = device_private(dev);
11488 int rv;
11489
11490 if (sc->phy.acquire(sc) != 0) {
11491 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11492 return -1;
11493 }
11494
11495 #ifdef DIAGNOSTIC
11496 if (reg > MII_ADDRMASK) {
11497 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
11498 __func__, sc->sc_phytype, reg);
11499 reg &= MII_ADDRMASK;
11500 }
11501 #endif
11502 rv = wm_gmii_mdic_readreg(dev, phy, reg, val);
11503
11504 sc->phy.release(sc);
11505 return rv;
11506 }
11507
11508 /*
11509 * wm_gmii_82580_writereg: [mii interface function]
11510 *
11511 * Write a PHY register on the 82580 and I350.
11512 * This could be handled by the PHY layer if we didn't have to lock the
11513 * ressource ...
11514 */
11515 static int
11516 wm_gmii_82580_writereg(device_t dev, int phy, int reg, uint16_t val)
11517 {
11518 struct wm_softc *sc = device_private(dev);
11519 int rv;
11520
11521 if (sc->phy.acquire(sc) != 0) {
11522 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11523 return -1;
11524 }
11525
11526 #ifdef DIAGNOSTIC
11527 if (reg > MII_ADDRMASK) {
11528 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
11529 __func__, sc->sc_phytype, reg);
11530 reg &= MII_ADDRMASK;
11531 }
11532 #endif
11533 rv = wm_gmii_mdic_writereg(dev, phy, reg, val);
11534
11535 sc->phy.release(sc);
11536 return rv;
11537 }
11538
11539 /*
11540 * wm_gmii_gs40g_readreg: [mii interface function]
11541 *
11542 * Read a PHY register on the I2100 and I211.
11543 * This could be handled by the PHY layer if we didn't have to lock the
11544 * ressource ...
11545 */
11546 static int
11547 wm_gmii_gs40g_readreg(device_t dev, int phy, int reg, uint16_t *val)
11548 {
11549 struct wm_softc *sc = device_private(dev);
11550 int page, offset;
11551 int rv;
11552
11553 /* Acquire semaphore */
11554 if (sc->phy.acquire(sc)) {
11555 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11556 return -1;
11557 }
11558
11559 /* Page select */
11560 page = reg >> GS40G_PAGE_SHIFT;
11561 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
11562 if (rv != 0)
11563 goto release;
11564
11565 /* Read reg */
11566 offset = reg & GS40G_OFFSET_MASK;
11567 rv = wm_gmii_mdic_readreg(dev, phy, offset, val);
11568
11569 release:
11570 sc->phy.release(sc);
11571 return rv;
11572 }
11573
11574 /*
11575 * wm_gmii_gs40g_writereg: [mii interface function]
11576 *
11577 * Write a PHY register on the I210 and I211.
11578 * This could be handled by the PHY layer if we didn't have to lock the
11579 * ressource ...
11580 */
11581 static int
11582 wm_gmii_gs40g_writereg(device_t dev, int phy, int reg, uint16_t val)
11583 {
11584 struct wm_softc *sc = device_private(dev);
11585 uint16_t page;
11586 int offset, rv;
11587
11588 /* Acquire semaphore */
11589 if (sc->phy.acquire(sc)) {
11590 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11591 return -1;
11592 }
11593
11594 /* Page select */
11595 page = reg >> GS40G_PAGE_SHIFT;
11596 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
11597 if (rv != 0)
11598 goto release;
11599
11600 /* Write reg */
11601 offset = reg & GS40G_OFFSET_MASK;
11602 rv = wm_gmii_mdic_writereg(dev, phy, offset, val);
11603
11604 release:
11605 /* Release semaphore */
11606 sc->phy.release(sc);
11607 return rv;
11608 }
11609
11610 /*
11611 * wm_gmii_statchg: [mii interface function]
11612 *
11613 * Callback from MII layer when media changes.
11614 */
11615 static void
11616 wm_gmii_statchg(struct ifnet *ifp)
11617 {
11618 struct wm_softc *sc = ifp->if_softc;
11619 struct mii_data *mii = &sc->sc_mii;
11620
11621 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE);
11622 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
11623 sc->sc_fcrtl &= ~FCRTL_XONE;
11624
11625 /* Get flow control negotiation result. */
11626 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
11627 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) {
11628 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
11629 mii->mii_media_active &= ~IFM_ETH_FMASK;
11630 }
11631
11632 if (sc->sc_flowflags & IFM_FLOW) {
11633 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) {
11634 sc->sc_ctrl |= CTRL_TFCE;
11635 sc->sc_fcrtl |= FCRTL_XONE;
11636 }
11637 if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
11638 sc->sc_ctrl |= CTRL_RFCE;
11639 }
11640
11641 if (mii->mii_media_active & IFM_FDX) {
11642 DPRINTF(WM_DEBUG_LINK,
11643 ("%s: LINK: statchg: FDX\n", ifp->if_xname));
11644 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
11645 } else {
11646 DPRINTF(WM_DEBUG_LINK,
11647 ("%s: LINK: statchg: HDX\n", ifp->if_xname));
11648 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
11649 }
11650
11651 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11652 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
11653 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
11654 : WMREG_FCRTL, sc->sc_fcrtl);
11655 if (sc->sc_type == WM_T_80003) {
11656 switch (IFM_SUBTYPE(mii->mii_media_active)) {
11657 case IFM_1000_T:
11658 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
11659 KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
11660 sc->sc_tipg = TIPG_1000T_80003_DFLT;
11661 break;
11662 default:
11663 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
11664 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
11665 sc->sc_tipg = TIPG_10_100_80003_DFLT;
11666 break;
11667 }
11668 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
11669 }
11670 }
11671
11672 /* kumeran related (80003, ICH* and PCH*) */
11673
11674 /*
11675 * wm_kmrn_readreg:
11676 *
11677 * Read a kumeran register
11678 */
11679 static int
11680 wm_kmrn_readreg(struct wm_softc *sc, int reg, uint16_t *val)
11681 {
11682 int rv;
11683
11684 if (sc->sc_type == WM_T_80003)
11685 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
11686 else
11687 rv = sc->phy.acquire(sc);
11688 if (rv != 0) {
11689 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
11690 __func__);
11691 return rv;
11692 }
11693
11694 rv = wm_kmrn_readreg_locked(sc, reg, val);
11695
11696 if (sc->sc_type == WM_T_80003)
11697 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
11698 else
11699 sc->phy.release(sc);
11700
11701 return rv;
11702 }
11703
11704 static int
11705 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg, uint16_t *val)
11706 {
11707
11708 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
11709 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
11710 KUMCTRLSTA_REN);
11711 CSR_WRITE_FLUSH(sc);
11712 delay(2);
11713
11714 *val = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
11715
11716 return 0;
11717 }
11718
11719 /*
11720 * wm_kmrn_writereg:
11721 *
11722 * Write a kumeran register
11723 */
11724 static int
11725 wm_kmrn_writereg(struct wm_softc *sc, int reg, uint16_t val)
11726 {
11727 int rv;
11728
11729 if (sc->sc_type == WM_T_80003)
11730 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
11731 else
11732 rv = sc->phy.acquire(sc);
11733 if (rv != 0) {
11734 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
11735 __func__);
11736 return rv;
11737 }
11738
11739 rv = wm_kmrn_writereg_locked(sc, reg, val);
11740
11741 if (sc->sc_type == WM_T_80003)
11742 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
11743 else
11744 sc->phy.release(sc);
11745
11746 return rv;
11747 }
11748
11749 static int
11750 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, uint16_t val)
11751 {
11752
11753 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
11754 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | val);
11755
11756 return 0;
11757 }
11758
11759 /*
11760 * EMI register related (82579, WMPHY_I217(PCH2 and newer))
11761 * This access method is different from IEEE MMD.
11762 */
11763 static int
11764 wm_access_emi_reg_locked(device_t dev, int reg, uint16_t *val, bool rd)
11765 {
11766 struct wm_softc *sc = device_private(dev);
11767 int rv;
11768
11769 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_ADDR, reg);
11770 if (rv != 0)
11771 return rv;
11772
11773 if (rd)
11774 rv = sc->phy.readreg_locked(dev, 2, I82579_EMI_DATA, val);
11775 else
11776 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_DATA, *val);
11777 return rv;
11778 }
11779
11780 static int
11781 wm_read_emi_reg_locked(device_t dev, int reg, uint16_t *val)
11782 {
11783
11784 return wm_access_emi_reg_locked(dev, reg, val, true);
11785 }
11786
11787 static int
11788 wm_write_emi_reg_locked(device_t dev, int reg, uint16_t val)
11789 {
11790
11791 return wm_access_emi_reg_locked(dev, reg, &val, false);
11792 }
11793
11794 /* SGMII related */
11795
11796 /*
11797 * wm_sgmii_uses_mdio
11798 *
11799 * Check whether the transaction is to the internal PHY or the external
11800 * MDIO interface. Return true if it's MDIO.
11801 */
11802 static bool
11803 wm_sgmii_uses_mdio(struct wm_softc *sc)
11804 {
11805 uint32_t reg;
11806 bool ismdio = false;
11807
11808 switch (sc->sc_type) {
11809 case WM_T_82575:
11810 case WM_T_82576:
11811 reg = CSR_READ(sc, WMREG_MDIC);
11812 ismdio = ((reg & MDIC_DEST) != 0);
11813 break;
11814 case WM_T_82580:
11815 case WM_T_I350:
11816 case WM_T_I354:
11817 case WM_T_I210:
11818 case WM_T_I211:
11819 reg = CSR_READ(sc, WMREG_MDICNFG);
11820 ismdio = ((reg & MDICNFG_DEST) != 0);
11821 break;
11822 default:
11823 break;
11824 }
11825
11826 return ismdio;
11827 }
11828
11829 /*
11830 * wm_sgmii_readreg: [mii interface function]
11831 *
11832 * Read a PHY register on the SGMII
11833 * This could be handled by the PHY layer if we didn't have to lock the
11834 * ressource ...
11835 */
11836 static int
11837 wm_sgmii_readreg(device_t dev, int phy, int reg, uint16_t *val)
11838 {
11839 struct wm_softc *sc = device_private(dev);
11840 int rv;
11841
11842 if (sc->phy.acquire(sc)) {
11843 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11844 return -1;
11845 }
11846
11847 rv = wm_sgmii_readreg_locked(dev, phy, reg, val);
11848
11849 sc->phy.release(sc);
11850 return rv;
11851 }
11852
11853 static int
11854 wm_sgmii_readreg_locked(device_t dev, int phy, int reg, uint16_t *val)
11855 {
11856 struct wm_softc *sc = device_private(dev);
11857 uint32_t i2ccmd;
11858 int i, rv = 0;
11859
11860 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
11861 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
11862 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
11863
11864 /* Poll the ready bit */
11865 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
11866 delay(50);
11867 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
11868 if (i2ccmd & I2CCMD_READY)
11869 break;
11870 }
11871 if ((i2ccmd & I2CCMD_READY) == 0) {
11872 device_printf(dev, "I2CCMD Read did not complete\n");
11873 rv = ETIMEDOUT;
11874 }
11875 if ((i2ccmd & I2CCMD_ERROR) != 0) {
11876 if (!sc->phy.no_errprint)
11877 device_printf(dev, "I2CCMD Error bit set\n");
11878 rv = EIO;
11879 }
11880
11881 *val = (uint16_t)((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00);
11882
11883 return rv;
11884 }
11885
11886 /*
11887 * wm_sgmii_writereg: [mii interface function]
11888 *
11889 * Write a PHY register on the SGMII.
11890 * This could be handled by the PHY layer if we didn't have to lock the
11891 * ressource ...
11892 */
11893 static int
11894 wm_sgmii_writereg(device_t dev, int phy, int reg, uint16_t val)
11895 {
11896 struct wm_softc *sc = device_private(dev);
11897 int rv;
11898
11899 if (sc->phy.acquire(sc) != 0) {
11900 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11901 return -1;
11902 }
11903
11904 rv = wm_sgmii_writereg_locked(dev, phy, reg, val);
11905
11906 sc->phy.release(sc);
11907
11908 return rv;
11909 }
11910
11911 static int
11912 wm_sgmii_writereg_locked(device_t dev, int phy, int reg, uint16_t val)
11913 {
11914 struct wm_softc *sc = device_private(dev);
11915 uint32_t i2ccmd;
11916 uint16_t swapdata;
11917 int rv = 0;
11918 int i;
11919
11920 /* Swap the data bytes for the I2C interface */
11921 swapdata = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00);
11922 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
11923 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_WRITE | swapdata;
11924 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
11925
11926 /* Poll the ready bit */
11927 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
11928 delay(50);
11929 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
11930 if (i2ccmd & I2CCMD_READY)
11931 break;
11932 }
11933 if ((i2ccmd & I2CCMD_READY) == 0) {
11934 device_printf(dev, "I2CCMD Write did not complete\n");
11935 rv = ETIMEDOUT;
11936 }
11937 if ((i2ccmd & I2CCMD_ERROR) != 0) {
11938 device_printf(dev, "I2CCMD Error bit set\n");
11939 rv = EIO;
11940 }
11941
11942 return rv;
11943 }
11944
11945 /* TBI related */
11946
11947 static bool
11948 wm_tbi_havesignal(struct wm_softc *sc, uint32_t ctrl)
11949 {
11950 bool sig;
11951
11952 sig = ctrl & CTRL_SWDPIN(1);
11953
11954 /*
11955 * On 82543 and 82544, the CTRL_SWDPIN(1) bit will be 0 if the optics
11956 * detect a signal, 1 if they don't.
11957 */
11958 if ((sc->sc_type == WM_T_82543) || (sc->sc_type == WM_T_82544))
11959 sig = !sig;
11960
11961 return sig;
11962 }
11963
11964 /*
11965 * wm_tbi_mediainit:
11966 *
11967 * Initialize media for use on 1000BASE-X devices.
11968 */
11969 static void
11970 wm_tbi_mediainit(struct wm_softc *sc)
11971 {
11972 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
11973 const char *sep = "";
11974
11975 if (sc->sc_type < WM_T_82543)
11976 sc->sc_tipg = TIPG_WM_DFLT;
11977 else
11978 sc->sc_tipg = TIPG_LG_DFLT;
11979
11980 sc->sc_tbi_serdes_anegticks = 5;
11981
11982 /* Initialize our media structures */
11983 sc->sc_mii.mii_ifp = ifp;
11984 sc->sc_ethercom.ec_mii = &sc->sc_mii;
11985
11986 if (((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211))
11987 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
11988 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK,
11989 wm_serdes_mediachange, wm_serdes_mediastatus,
11990 sc->sc_core_lock);
11991 } else {
11992 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK,
11993 wm_tbi_mediachange, wm_tbi_mediastatus, sc->sc_core_lock);
11994 }
11995
11996 /*
11997 * SWD Pins:
11998 *
11999 * 0 = Link LED (output)
12000 * 1 = Loss Of Signal (input)
12001 */
12002 sc->sc_ctrl |= CTRL_SWDPIO(0);
12003
12004 /* XXX Perhaps this is only for TBI */
12005 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES)
12006 sc->sc_ctrl &= ~CTRL_SWDPIO(1);
12007
12008 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
12009 sc->sc_ctrl &= ~CTRL_LRST;
12010
12011 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12012
12013 #define ADD(ss, mm, dd) \
12014 do { \
12015 aprint_normal("%s%s", sep, ss); \
12016 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \
12017 sep = ", "; \
12018 } while (/*CONSTCOND*/0)
12019
12020 aprint_normal_dev(sc->sc_dev, "");
12021
12022 if (sc->sc_type == WM_T_I354) {
12023 uint32_t status;
12024
12025 status = CSR_READ(sc, WMREG_STATUS);
12026 if (((status & STATUS_2P5_SKU) != 0)
12027 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
12028 ADD("2500baseKX-FDX", IFM_2500_KX | IFM_FDX,ANAR_X_FD);
12029 } else
12030 ADD("1000baseKX-FDX", IFM_1000_KX | IFM_FDX,ANAR_X_FD);
12031 } else if (sc->sc_type == WM_T_82545) {
12032 /* Only 82545 is LX (XXX except SFP) */
12033 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
12034 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
12035 } else if (sc->sc_sfptype != 0) {
12036 /* XXX wm(4) fiber/serdes don't use ifm_data */
12037 switch (sc->sc_sfptype) {
12038 default:
12039 case SFF_SFP_ETH_FLAGS_1000SX:
12040 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
12041 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
12042 break;
12043 case SFF_SFP_ETH_FLAGS_1000LX:
12044 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
12045 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
12046 break;
12047 case SFF_SFP_ETH_FLAGS_1000CX:
12048 ADD("1000baseCX", IFM_1000_CX, ANAR_X_HD);
12049 ADD("1000baseCX-FDX", IFM_1000_CX | IFM_FDX, ANAR_X_FD);
12050 break;
12051 case SFF_SFP_ETH_FLAGS_1000T:
12052 ADD("1000baseT", IFM_1000_T, 0);
12053 ADD("1000baseT-FDX", IFM_1000_T | IFM_FDX, 0);
12054 break;
12055 case SFF_SFP_ETH_FLAGS_100FX:
12056 ADD("100baseFX", IFM_100_FX, ANAR_TX);
12057 ADD("100baseFX-FDX", IFM_100_FX | IFM_FDX, ANAR_TX_FD);
12058 break;
12059 }
12060 } else {
12061 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
12062 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
12063 }
12064 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD);
12065 aprint_normal("\n");
12066
12067 #undef ADD
12068
12069 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
12070 }
12071
12072 /*
12073 * wm_tbi_mediachange: [ifmedia interface function]
12074 *
12075 * Set hardware to newly-selected media on a 1000BASE-X device.
12076 */
12077 static int
12078 wm_tbi_mediachange(struct ifnet *ifp)
12079 {
12080 struct wm_softc *sc = ifp->if_softc;
12081 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
12082 uint32_t status, ctrl;
12083 bool signal;
12084 int i;
12085
12086 KASSERT(sc->sc_mediatype != WM_MEDIATYPE_COPPER);
12087 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
12088 /* XXX need some work for >= 82571 and < 82575 */
12089 if (sc->sc_type < WM_T_82575)
12090 return 0;
12091 }
12092
12093 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
12094 || (sc->sc_type >= WM_T_82575))
12095 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
12096
12097 sc->sc_ctrl &= ~CTRL_LRST;
12098 sc->sc_txcw = TXCW_ANE;
12099 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
12100 sc->sc_txcw |= TXCW_FD | TXCW_HD;
12101 else if (ife->ifm_media & IFM_FDX)
12102 sc->sc_txcw |= TXCW_FD;
12103 else
12104 sc->sc_txcw |= TXCW_HD;
12105
12106 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0)
12107 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE;
12108
12109 DPRINTF(WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n",
12110 device_xname(sc->sc_dev), sc->sc_txcw));
12111 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
12112 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12113 CSR_WRITE_FLUSH(sc);
12114 delay(1000);
12115
12116 ctrl = CSR_READ(sc, WMREG_CTRL);
12117 signal = wm_tbi_havesignal(sc, ctrl);
12118
12119 DPRINTF(WM_DEBUG_LINK, ("%s: signal = %d\n", device_xname(sc->sc_dev),
12120 signal));
12121
12122 if (signal) {
12123 /* Have signal; wait for the link to come up. */
12124 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
12125 delay(10000);
12126 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
12127 break;
12128 }
12129
12130 DPRINTF(WM_DEBUG_LINK,("%s: i = %d after waiting for link\n",
12131 device_xname(sc->sc_dev), i));
12132
12133 status = CSR_READ(sc, WMREG_STATUS);
12134 DPRINTF(WM_DEBUG_LINK,
12135 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n",
12136 device_xname(sc->sc_dev), status, STATUS_LU));
12137 if (status & STATUS_LU) {
12138 /* Link is up. */
12139 DPRINTF(WM_DEBUG_LINK,
12140 ("%s: LINK: set media -> link up %s\n",
12141 device_xname(sc->sc_dev),
12142 (status & STATUS_FD) ? "FDX" : "HDX"));
12143
12144 /*
12145 * NOTE: CTRL will update TFCE and RFCE automatically,
12146 * so we should update sc->sc_ctrl
12147 */
12148 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
12149 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
12150 sc->sc_fcrtl &= ~FCRTL_XONE;
12151 if (status & STATUS_FD)
12152 sc->sc_tctl |=
12153 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
12154 else
12155 sc->sc_tctl |=
12156 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
12157 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE)
12158 sc->sc_fcrtl |= FCRTL_XONE;
12159 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
12160 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
12161 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl);
12162 sc->sc_tbi_linkup = 1;
12163 } else {
12164 if (i == WM_LINKUP_TIMEOUT)
12165 wm_check_for_link(sc);
12166 /* Link is down. */
12167 DPRINTF(WM_DEBUG_LINK,
12168 ("%s: LINK: set media -> link down\n",
12169 device_xname(sc->sc_dev)));
12170 sc->sc_tbi_linkup = 0;
12171 }
12172 } else {
12173 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
12174 device_xname(sc->sc_dev)));
12175 sc->sc_tbi_linkup = 0;
12176 }
12177
12178 wm_tbi_serdes_set_linkled(sc);
12179
12180 return 0;
12181 }
12182
12183 /*
12184 * wm_tbi_mediastatus: [ifmedia interface function]
12185 *
12186 * Get the current interface media status on a 1000BASE-X device.
12187 */
12188 static void
12189 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
12190 {
12191 struct wm_softc *sc = ifp->if_softc;
12192 uint32_t ctrl, status;
12193
12194 ifmr->ifm_status = IFM_AVALID;
12195 ifmr->ifm_active = IFM_ETHER;
12196
12197 status = CSR_READ(sc, WMREG_STATUS);
12198 if ((status & STATUS_LU) == 0) {
12199 ifmr->ifm_active |= IFM_NONE;
12200 return;
12201 }
12202
12203 ifmr->ifm_status |= IFM_ACTIVE;
12204 /* Only 82545 is LX */
12205 if (sc->sc_type == WM_T_82545)
12206 ifmr->ifm_active |= IFM_1000_LX;
12207 else
12208 ifmr->ifm_active |= IFM_1000_SX;
12209 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
12210 ifmr->ifm_active |= IFM_FDX;
12211 else
12212 ifmr->ifm_active |= IFM_HDX;
12213 ctrl = CSR_READ(sc, WMREG_CTRL);
12214 if (ctrl & CTRL_RFCE)
12215 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
12216 if (ctrl & CTRL_TFCE)
12217 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
12218 }
12219
12220 /* XXX TBI only */
12221 static int
12222 wm_check_for_link(struct wm_softc *sc)
12223 {
12224 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
12225 uint32_t rxcw;
12226 uint32_t ctrl;
12227 uint32_t status;
12228 bool signal;
12229
12230 DPRINTF(WM_DEBUG_LINK, ("%s: %s called\n",
12231 device_xname(sc->sc_dev), __func__));
12232
12233 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
12234 /* XXX need some work for >= 82571 */
12235 if (sc->sc_type >= WM_T_82571) {
12236 sc->sc_tbi_linkup = 1;
12237 return 0;
12238 }
12239 }
12240
12241 rxcw = CSR_READ(sc, WMREG_RXCW);
12242 ctrl = CSR_READ(sc, WMREG_CTRL);
12243 status = CSR_READ(sc, WMREG_STATUS);
12244 signal = wm_tbi_havesignal(sc, ctrl);
12245
12246 DPRINTF(WM_DEBUG_LINK,
12247 ("%s: %s: signal = %d, status_lu = %d, rxcw_c = %d\n",
12248 device_xname(sc->sc_dev), __func__, signal,
12249 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0)));
12250
12251 /*
12252 * SWDPIN LU RXCW
12253 * 0 0 0
12254 * 0 0 1 (should not happen)
12255 * 0 1 0 (should not happen)
12256 * 0 1 1 (should not happen)
12257 * 1 0 0 Disable autonego and force linkup
12258 * 1 0 1 got /C/ but not linkup yet
12259 * 1 1 0 (linkup)
12260 * 1 1 1 If IFM_AUTO, back to autonego
12261 *
12262 */
12263 if (signal && ((status & STATUS_LU) == 0) && ((rxcw & RXCW_C) == 0)) {
12264 DPRINTF(WM_DEBUG_LINK,
12265 ("%s: %s: force linkup and fullduplex\n",
12266 device_xname(sc->sc_dev), __func__));
12267 sc->sc_tbi_linkup = 0;
12268 /* Disable auto-negotiation in the TXCW register */
12269 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
12270
12271 /*
12272 * Force link-up and also force full-duplex.
12273 *
12274 * NOTE: CTRL was updated TFCE and RFCE automatically,
12275 * so we should update sc->sc_ctrl
12276 */
12277 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD;
12278 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12279 } else if (((status & STATUS_LU) != 0)
12280 && ((rxcw & RXCW_C) != 0)
12281 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
12282 sc->sc_tbi_linkup = 1;
12283 DPRINTF(WM_DEBUG_LINK, ("%s: %s: go back to autonego\n",
12284 device_xname(sc->sc_dev),
12285 __func__));
12286 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
12287 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
12288 } else if (signal && ((rxcw & RXCW_C) != 0)) {
12289 DPRINTF(WM_DEBUG_LINK, ("%s: %s: /C/",
12290 device_xname(sc->sc_dev), __func__));
12291 } else {
12292 DPRINTF(WM_DEBUG_LINK, ("%s: %s: linkup %08x,%08x,%08x\n",
12293 device_xname(sc->sc_dev), __func__, rxcw, ctrl,
12294 status));
12295 }
12296
12297 return 0;
12298 }
12299
12300 /*
12301 * wm_tbi_tick:
12302 *
12303 * Check the link on TBI devices.
12304 * This function acts as mii_tick().
12305 */
12306 static void
12307 wm_tbi_tick(struct wm_softc *sc)
12308 {
12309 struct mii_data *mii = &sc->sc_mii;
12310 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
12311 uint32_t status;
12312
12313 KASSERT(WM_CORE_LOCKED(sc));
12314
12315 status = CSR_READ(sc, WMREG_STATUS);
12316
12317 /* XXX is this needed? */
12318 (void)CSR_READ(sc, WMREG_RXCW);
12319 (void)CSR_READ(sc, WMREG_CTRL);
12320
12321 /* set link status */
12322 if ((status & STATUS_LU) == 0) {
12323 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: checklink -> down\n",
12324 device_xname(sc->sc_dev)));
12325 sc->sc_tbi_linkup = 0;
12326 } else if (sc->sc_tbi_linkup == 0) {
12327 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: checklink -> up %s\n",
12328 device_xname(sc->sc_dev),
12329 (status & STATUS_FD) ? "FDX" : "HDX"));
12330 sc->sc_tbi_linkup = 1;
12331 sc->sc_tbi_serdes_ticks = 0;
12332 }
12333
12334 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0)
12335 goto setled;
12336
12337 if ((status & STATUS_LU) == 0) {
12338 sc->sc_tbi_linkup = 0;
12339 /* If the timer expired, retry autonegotiation */
12340 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
12341 && (++sc->sc_tbi_serdes_ticks
12342 >= sc->sc_tbi_serdes_anegticks)) {
12343 DPRINTF(WM_DEBUG_LINK, ("%s: %s: EXPIRE\n",
12344 device_xname(sc->sc_dev), __func__));
12345 sc->sc_tbi_serdes_ticks = 0;
12346 /*
12347 * Reset the link, and let autonegotiation do
12348 * its thing
12349 */
12350 sc->sc_ctrl |= CTRL_LRST;
12351 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12352 CSR_WRITE_FLUSH(sc);
12353 delay(1000);
12354 sc->sc_ctrl &= ~CTRL_LRST;
12355 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12356 CSR_WRITE_FLUSH(sc);
12357 delay(1000);
12358 CSR_WRITE(sc, WMREG_TXCW,
12359 sc->sc_txcw & ~TXCW_ANE);
12360 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
12361 }
12362 }
12363
12364 setled:
12365 wm_tbi_serdes_set_linkled(sc);
12366 }
12367
12368 /* SERDES related */
12369 static void
12370 wm_serdes_power_up_link_82575(struct wm_softc *sc)
12371 {
12372 uint32_t reg;
12373
12374 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
12375 && ((sc->sc_flags & WM_F_SGMII) == 0))
12376 return;
12377
12378 /* Enable PCS to turn on link */
12379 reg = CSR_READ(sc, WMREG_PCS_CFG);
12380 reg |= PCS_CFG_PCS_EN;
12381 CSR_WRITE(sc, WMREG_PCS_CFG, reg);
12382
12383 /* Power up the laser */
12384 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12385 reg &= ~CTRL_EXT_SWDPIN(3);
12386 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
12387
12388 /* Flush the write to verify completion */
12389 CSR_WRITE_FLUSH(sc);
12390 delay(1000);
12391 }
12392
12393 static int
12394 wm_serdes_mediachange(struct ifnet *ifp)
12395 {
12396 struct wm_softc *sc = ifp->if_softc;
12397 bool pcs_autoneg = true; /* XXX */
12398 uint32_t ctrl_ext, pcs_lctl, reg;
12399
12400 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
12401 && ((sc->sc_flags & WM_F_SGMII) == 0))
12402 return 0;
12403
12404 /* XXX Currently, this function is not called on 8257[12] */
12405 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
12406 || (sc->sc_type >= WM_T_82575))
12407 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
12408
12409 /* Power on the sfp cage if present */
12410 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
12411 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
12412 ctrl_ext |= CTRL_EXT_I2C_ENA;
12413 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
12414
12415 sc->sc_ctrl |= CTRL_SLU;
12416
12417 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576))
12418 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1);
12419
12420 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL);
12421 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) {
12422 case CTRL_EXT_LINK_MODE_SGMII:
12423 /* SGMII mode lets the phy handle forcing speed/duplex */
12424 pcs_autoneg = true;
12425 /* Autoneg time out should be disabled for SGMII mode */
12426 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT;
12427 break;
12428 case CTRL_EXT_LINK_MODE_1000KX:
12429 pcs_autoneg = false;
12430 /* FALLTHROUGH */
12431 default:
12432 if ((sc->sc_type == WM_T_82575)
12433 || (sc->sc_type == WM_T_82576)) {
12434 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0)
12435 pcs_autoneg = false;
12436 }
12437 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD
12438 | CTRL_FRCFDX;
12439
12440 /* Set speed of 1000/Full if speed/duplex is forced */
12441 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL;
12442 }
12443 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12444
12445 pcs_lctl &= ~(PCS_LCTL_AN_ENABLE | PCS_LCTL_FLV_LINK_UP |
12446 PCS_LCTL_FSD | PCS_LCTL_FORCE_LINK);
12447
12448 if (pcs_autoneg) {
12449 /* Set PCS register for autoneg */
12450 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART;
12451
12452 /* Disable force flow control for autoneg */
12453 pcs_lctl &= ~PCS_LCTL_FORCE_FC;
12454
12455 /* Configure flow control advertisement for autoneg */
12456 reg = CSR_READ(sc, WMREG_PCS_ANADV);
12457 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE);
12458 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE;
12459 CSR_WRITE(sc, WMREG_PCS_ANADV, reg);
12460 } else
12461 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC;
12462
12463 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl);
12464
12465 return 0;
12466 }
12467
12468 static void
12469 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
12470 {
12471 struct wm_softc *sc = ifp->if_softc;
12472 struct mii_data *mii = &sc->sc_mii;
12473 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
12474 uint32_t pcs_adv, pcs_lpab, reg;
12475
12476 ifmr->ifm_status = IFM_AVALID;
12477 ifmr->ifm_active = IFM_ETHER;
12478
12479 /* Check PCS */
12480 reg = CSR_READ(sc, WMREG_PCS_LSTS);
12481 if ((reg & PCS_LSTS_LINKOK) == 0) {
12482 ifmr->ifm_active |= IFM_NONE;
12483 sc->sc_tbi_linkup = 0;
12484 goto setled;
12485 }
12486
12487 sc->sc_tbi_linkup = 1;
12488 ifmr->ifm_status |= IFM_ACTIVE;
12489 if (sc->sc_type == WM_T_I354) {
12490 uint32_t status;
12491
12492 status = CSR_READ(sc, WMREG_STATUS);
12493 if (((status & STATUS_2P5_SKU) != 0)
12494 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
12495 ifmr->ifm_active |= IFM_2500_KX;
12496 } else
12497 ifmr->ifm_active |= IFM_1000_KX;
12498 } else {
12499 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) {
12500 case PCS_LSTS_SPEED_10:
12501 ifmr->ifm_active |= IFM_10_T; /* XXX */
12502 break;
12503 case PCS_LSTS_SPEED_100:
12504 ifmr->ifm_active |= IFM_100_FX; /* XXX */
12505 break;
12506 case PCS_LSTS_SPEED_1000:
12507 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
12508 break;
12509 default:
12510 device_printf(sc->sc_dev, "Unknown speed\n");
12511 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
12512 break;
12513 }
12514 }
12515 if ((reg & PCS_LSTS_FDX) != 0)
12516 ifmr->ifm_active |= IFM_FDX;
12517 else
12518 ifmr->ifm_active |= IFM_HDX;
12519 mii->mii_media_active &= ~IFM_ETH_FMASK;
12520 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
12521 /* Check flow */
12522 reg = CSR_READ(sc, WMREG_PCS_LSTS);
12523 if ((reg & PCS_LSTS_AN_COMP) == 0) {
12524 DPRINTF(WM_DEBUG_LINK, ("XXX LINKOK but not ACOMP\n"));
12525 goto setled;
12526 }
12527 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
12528 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
12529 DPRINTF(WM_DEBUG_LINK,
12530 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab));
12531 if ((pcs_adv & TXCW_SYM_PAUSE)
12532 && (pcs_lpab & TXCW_SYM_PAUSE)) {
12533 mii->mii_media_active |= IFM_FLOW
12534 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
12535 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
12536 && (pcs_adv & TXCW_ASYM_PAUSE)
12537 && (pcs_lpab & TXCW_SYM_PAUSE)
12538 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
12539 mii->mii_media_active |= IFM_FLOW
12540 | IFM_ETH_TXPAUSE;
12541 } else if ((pcs_adv & TXCW_SYM_PAUSE)
12542 && (pcs_adv & TXCW_ASYM_PAUSE)
12543 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
12544 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
12545 mii->mii_media_active |= IFM_FLOW
12546 | IFM_ETH_RXPAUSE;
12547 }
12548 }
12549 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
12550 | (mii->mii_media_active & IFM_ETH_FMASK);
12551 setled:
12552 wm_tbi_serdes_set_linkled(sc);
12553 }
12554
12555 /*
12556 * wm_serdes_tick:
12557 *
12558 * Check the link on serdes devices.
12559 */
12560 static void
12561 wm_serdes_tick(struct wm_softc *sc)
12562 {
12563 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
12564 struct mii_data *mii = &sc->sc_mii;
12565 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
12566 uint32_t reg;
12567
12568 KASSERT(WM_CORE_LOCKED(sc));
12569
12570 mii->mii_media_status = IFM_AVALID;
12571 mii->mii_media_active = IFM_ETHER;
12572
12573 /* Check PCS */
12574 reg = CSR_READ(sc, WMREG_PCS_LSTS);
12575 if ((reg & PCS_LSTS_LINKOK) != 0) {
12576 mii->mii_media_status |= IFM_ACTIVE;
12577 sc->sc_tbi_linkup = 1;
12578 sc->sc_tbi_serdes_ticks = 0;
12579 mii->mii_media_active |= IFM_1000_SX; /* XXX */
12580 if ((reg & PCS_LSTS_FDX) != 0)
12581 mii->mii_media_active |= IFM_FDX;
12582 else
12583 mii->mii_media_active |= IFM_HDX;
12584 } else {
12585 mii->mii_media_status |= IFM_NONE;
12586 sc->sc_tbi_linkup = 0;
12587 /* If the timer expired, retry autonegotiation */
12588 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
12589 && (++sc->sc_tbi_serdes_ticks
12590 >= sc->sc_tbi_serdes_anegticks)) {
12591 DPRINTF(WM_DEBUG_LINK, ("%s: %s: EXPIRE\n",
12592 device_xname(sc->sc_dev), __func__));
12593 sc->sc_tbi_serdes_ticks = 0;
12594 /* XXX */
12595 wm_serdes_mediachange(ifp);
12596 }
12597 }
12598
12599 wm_tbi_serdes_set_linkled(sc);
12600 }
12601
12602 /* SFP related */
12603
12604 static int
12605 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data)
12606 {
12607 uint32_t i2ccmd;
12608 int i;
12609
12610 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
12611 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
12612
12613 /* Poll the ready bit */
12614 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
12615 delay(50);
12616 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
12617 if (i2ccmd & I2CCMD_READY)
12618 break;
12619 }
12620 if ((i2ccmd & I2CCMD_READY) == 0)
12621 return -1;
12622 if ((i2ccmd & I2CCMD_ERROR) != 0)
12623 return -1;
12624
12625 *data = i2ccmd & 0x00ff;
12626
12627 return 0;
12628 }
12629
12630 static uint32_t
12631 wm_sfp_get_media_type(struct wm_softc *sc)
12632 {
12633 uint32_t ctrl_ext;
12634 uint8_t val = 0;
12635 int timeout = 3;
12636 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN;
12637 int rv = -1;
12638
12639 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
12640 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
12641 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA);
12642 CSR_WRITE_FLUSH(sc);
12643
12644 /* Read SFP module data */
12645 while (timeout) {
12646 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val);
12647 if (rv == 0)
12648 break;
12649 delay(100*1000); /* XXX too big */
12650 timeout--;
12651 }
12652 if (rv != 0)
12653 goto out;
12654
12655 switch (val) {
12656 case SFF_SFP_ID_SFF:
12657 aprint_normal_dev(sc->sc_dev,
12658 "Module/Connector soldered to board\n");
12659 break;
12660 case SFF_SFP_ID_SFP:
12661 sc->sc_flags |= WM_F_SFP;
12662 break;
12663 case SFF_SFP_ID_UNKNOWN:
12664 goto out;
12665 default:
12666 break;
12667 }
12668
12669 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val);
12670 if (rv != 0)
12671 goto out;
12672
12673 sc->sc_sfptype = val;
12674 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0)
12675 mediatype = WM_MEDIATYPE_SERDES;
12676 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0) {
12677 sc->sc_flags |= WM_F_SGMII;
12678 mediatype = WM_MEDIATYPE_COPPER;
12679 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0) {
12680 sc->sc_flags |= WM_F_SGMII;
12681 mediatype = WM_MEDIATYPE_SERDES;
12682 } else {
12683 device_printf(sc->sc_dev, "%s: unknown media type? (0x%hhx)\n",
12684 __func__, sc->sc_sfptype);
12685 sc->sc_sfptype = 0; /* XXX unknown */
12686 }
12687
12688 out:
12689 /* Restore I2C interface setting */
12690 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
12691
12692 return mediatype;
12693 }
12694
12695 /*
12696 * NVM related.
12697 * Microwire, SPI (w/wo EERD) and Flash.
12698 */
12699
12700 /* Both spi and uwire */
12701
12702 /*
12703 * wm_eeprom_sendbits:
12704 *
12705 * Send a series of bits to the EEPROM.
12706 */
12707 static void
12708 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits)
12709 {
12710 uint32_t reg;
12711 int x;
12712
12713 reg = CSR_READ(sc, WMREG_EECD);
12714
12715 for (x = nbits; x > 0; x--) {
12716 if (bits & (1U << (x - 1)))
12717 reg |= EECD_DI;
12718 else
12719 reg &= ~EECD_DI;
12720 CSR_WRITE(sc, WMREG_EECD, reg);
12721 CSR_WRITE_FLUSH(sc);
12722 delay(2);
12723 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
12724 CSR_WRITE_FLUSH(sc);
12725 delay(2);
12726 CSR_WRITE(sc, WMREG_EECD, reg);
12727 CSR_WRITE_FLUSH(sc);
12728 delay(2);
12729 }
12730 }
12731
12732 /*
12733 * wm_eeprom_recvbits:
12734 *
12735 * Receive a series of bits from the EEPROM.
12736 */
12737 static void
12738 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits)
12739 {
12740 uint32_t reg, val;
12741 int x;
12742
12743 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI;
12744
12745 val = 0;
12746 for (x = nbits; x > 0; x--) {
12747 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
12748 CSR_WRITE_FLUSH(sc);
12749 delay(2);
12750 if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
12751 val |= (1U << (x - 1));
12752 CSR_WRITE(sc, WMREG_EECD, reg);
12753 CSR_WRITE_FLUSH(sc);
12754 delay(2);
12755 }
12756 *valp = val;
12757 }
12758
12759 /* Microwire */
12760
12761 /*
12762 * wm_nvm_read_uwire:
12763 *
12764 * Read a word from the EEPROM using the MicroWire protocol.
12765 */
12766 static int
12767 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
12768 {
12769 uint32_t reg, val;
12770 int i;
12771
12772 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12773 device_xname(sc->sc_dev), __func__));
12774
12775 if (sc->nvm.acquire(sc) != 0)
12776 return -1;
12777
12778 for (i = 0; i < wordcnt; i++) {
12779 /* Clear SK and DI. */
12780 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI);
12781 CSR_WRITE(sc, WMREG_EECD, reg);
12782
12783 /*
12784 * XXX: workaround for a bug in qemu-0.12.x and prior
12785 * and Xen.
12786 *
12787 * We use this workaround only for 82540 because qemu's
12788 * e1000 act as 82540.
12789 */
12790 if (sc->sc_type == WM_T_82540) {
12791 reg |= EECD_SK;
12792 CSR_WRITE(sc, WMREG_EECD, reg);
12793 reg &= ~EECD_SK;
12794 CSR_WRITE(sc, WMREG_EECD, reg);
12795 CSR_WRITE_FLUSH(sc);
12796 delay(2);
12797 }
12798 /* XXX: end of workaround */
12799
12800 /* Set CHIP SELECT. */
12801 reg |= EECD_CS;
12802 CSR_WRITE(sc, WMREG_EECD, reg);
12803 CSR_WRITE_FLUSH(sc);
12804 delay(2);
12805
12806 /* Shift in the READ command. */
12807 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3);
12808
12809 /* Shift in address. */
12810 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits);
12811
12812 /* Shift out the data. */
12813 wm_eeprom_recvbits(sc, &val, 16);
12814 data[i] = val & 0xffff;
12815
12816 /* Clear CHIP SELECT. */
12817 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS;
12818 CSR_WRITE(sc, WMREG_EECD, reg);
12819 CSR_WRITE_FLUSH(sc);
12820 delay(2);
12821 }
12822
12823 sc->nvm.release(sc);
12824 return 0;
12825 }
12826
12827 /* SPI */
12828
12829 /*
12830 * Set SPI and FLASH related information from the EECD register.
12831 * For 82541 and 82547, the word size is taken from EEPROM.
12832 */
12833 static int
12834 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc)
12835 {
12836 int size;
12837 uint32_t reg;
12838 uint16_t data;
12839
12840 reg = CSR_READ(sc, WMREG_EECD);
12841 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8;
12842
12843 /* Read the size of NVM from EECD by default */
12844 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
12845 switch (sc->sc_type) {
12846 case WM_T_82541:
12847 case WM_T_82541_2:
12848 case WM_T_82547:
12849 case WM_T_82547_2:
12850 /* Set dummy value to access EEPROM */
12851 sc->sc_nvm_wordsize = 64;
12852 if (wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data) != 0) {
12853 aprint_error_dev(sc->sc_dev,
12854 "%s: failed to read EEPROM size\n", __func__);
12855 }
12856 reg = data;
12857 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
12858 if (size == 0)
12859 size = 6; /* 64 word size */
12860 else
12861 size += NVM_WORD_SIZE_BASE_SHIFT + 1;
12862 break;
12863 case WM_T_80003:
12864 case WM_T_82571:
12865 case WM_T_82572:
12866 case WM_T_82573: /* SPI case */
12867 case WM_T_82574: /* SPI case */
12868 case WM_T_82583: /* SPI case */
12869 size += NVM_WORD_SIZE_BASE_SHIFT;
12870 if (size > 14)
12871 size = 14;
12872 break;
12873 case WM_T_82575:
12874 case WM_T_82576:
12875 case WM_T_82580:
12876 case WM_T_I350:
12877 case WM_T_I354:
12878 case WM_T_I210:
12879 case WM_T_I211:
12880 size += NVM_WORD_SIZE_BASE_SHIFT;
12881 if (size > 15)
12882 size = 15;
12883 break;
12884 default:
12885 aprint_error_dev(sc->sc_dev,
12886 "%s: unknown device(%d)?\n", __func__, sc->sc_type);
12887 return -1;
12888 break;
12889 }
12890
12891 sc->sc_nvm_wordsize = 1 << size;
12892
12893 return 0;
12894 }
12895
12896 /*
12897 * wm_nvm_ready_spi:
12898 *
12899 * Wait for a SPI EEPROM to be ready for commands.
12900 */
12901 static int
12902 wm_nvm_ready_spi(struct wm_softc *sc)
12903 {
12904 uint32_t val;
12905 int usec;
12906
12907 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12908 device_xname(sc->sc_dev), __func__));
12909
12910 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) {
12911 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8);
12912 wm_eeprom_recvbits(sc, &val, 8);
12913 if ((val & SPI_SR_RDY) == 0)
12914 break;
12915 }
12916 if (usec >= SPI_MAX_RETRIES) {
12917 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n");
12918 return -1;
12919 }
12920 return 0;
12921 }
12922
12923 /*
12924 * wm_nvm_read_spi:
12925 *
12926 * Read a work from the EEPROM using the SPI protocol.
12927 */
12928 static int
12929 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
12930 {
12931 uint32_t reg, val;
12932 int i;
12933 uint8_t opc;
12934 int rv = 0;
12935
12936 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12937 device_xname(sc->sc_dev), __func__));
12938
12939 if (sc->nvm.acquire(sc) != 0)
12940 return -1;
12941
12942 /* Clear SK and CS. */
12943 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS);
12944 CSR_WRITE(sc, WMREG_EECD, reg);
12945 CSR_WRITE_FLUSH(sc);
12946 delay(2);
12947
12948 if ((rv = wm_nvm_ready_spi(sc)) != 0)
12949 goto out;
12950
12951 /* Toggle CS to flush commands. */
12952 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS);
12953 CSR_WRITE_FLUSH(sc);
12954 delay(2);
12955 CSR_WRITE(sc, WMREG_EECD, reg);
12956 CSR_WRITE_FLUSH(sc);
12957 delay(2);
12958
12959 opc = SPI_OPC_READ;
12960 if (sc->sc_nvm_addrbits == 8 && word >= 128)
12961 opc |= SPI_OPC_A8;
12962
12963 wm_eeprom_sendbits(sc, opc, 8);
12964 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits);
12965
12966 for (i = 0; i < wordcnt; i++) {
12967 wm_eeprom_recvbits(sc, &val, 16);
12968 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8);
12969 }
12970
12971 /* Raise CS and clear SK. */
12972 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS;
12973 CSR_WRITE(sc, WMREG_EECD, reg);
12974 CSR_WRITE_FLUSH(sc);
12975 delay(2);
12976
12977 out:
12978 sc->nvm.release(sc);
12979 return rv;
12980 }
12981
12982 /* Using with EERD */
12983
12984 static int
12985 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw)
12986 {
12987 uint32_t attempts = 100000;
12988 uint32_t i, reg = 0;
12989 int32_t done = -1;
12990
12991 for (i = 0; i < attempts; i++) {
12992 reg = CSR_READ(sc, rw);
12993
12994 if (reg & EERD_DONE) {
12995 done = 0;
12996 break;
12997 }
12998 delay(5);
12999 }
13000
13001 return done;
13002 }
13003
13004 static int
13005 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt, uint16_t *data)
13006 {
13007 int i, eerd = 0;
13008 int rv = 0;
13009
13010 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
13011 device_xname(sc->sc_dev), __func__));
13012
13013 if (sc->nvm.acquire(sc) != 0)
13014 return -1;
13015
13016 for (i = 0; i < wordcnt; i++) {
13017 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START;
13018 CSR_WRITE(sc, WMREG_EERD, eerd);
13019 rv = wm_poll_eerd_eewr_done(sc, WMREG_EERD);
13020 if (rv != 0) {
13021 aprint_error_dev(sc->sc_dev, "EERD polling failed: "
13022 "offset=%d. wordcnt=%d\n", offset, wordcnt);
13023 break;
13024 }
13025 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT);
13026 }
13027
13028 sc->nvm.release(sc);
13029 return rv;
13030 }
13031
13032 /* Flash */
13033
13034 static int
13035 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank)
13036 {
13037 uint32_t eecd;
13038 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1;
13039 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t);
13040 uint32_t nvm_dword = 0;
13041 uint8_t sig_byte = 0;
13042 int rv;
13043
13044 switch (sc->sc_type) {
13045 case WM_T_PCH_SPT:
13046 case WM_T_PCH_CNP:
13047 bank1_offset = sc->sc_ich8_flash_bank_size * 2;
13048 act_offset = ICH_NVM_SIG_WORD * 2;
13049
13050 /* Set bank to 0 in case flash read fails. */
13051 *bank = 0;
13052
13053 /* Check bank 0 */
13054 rv = wm_read_ich8_dword(sc, act_offset, &nvm_dword);
13055 if (rv != 0)
13056 return rv;
13057 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8);
13058 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13059 *bank = 0;
13060 return 0;
13061 }
13062
13063 /* Check bank 1 */
13064 rv = wm_read_ich8_dword(sc, act_offset + bank1_offset,
13065 &nvm_dword);
13066 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8);
13067 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13068 *bank = 1;
13069 return 0;
13070 }
13071 aprint_error_dev(sc->sc_dev,
13072 "%s: no valid NVM bank present (%u)\n", __func__, *bank);
13073 return -1;
13074 case WM_T_ICH8:
13075 case WM_T_ICH9:
13076 eecd = CSR_READ(sc, WMREG_EECD);
13077 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) {
13078 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0;
13079 return 0;
13080 }
13081 /* FALLTHROUGH */
13082 default:
13083 /* Default to 0 */
13084 *bank = 0;
13085
13086 /* Check bank 0 */
13087 wm_read_ich8_byte(sc, act_offset, &sig_byte);
13088 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13089 *bank = 0;
13090 return 0;
13091 }
13092
13093 /* Check bank 1 */
13094 wm_read_ich8_byte(sc, act_offset + bank1_offset,
13095 &sig_byte);
13096 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13097 *bank = 1;
13098 return 0;
13099 }
13100 }
13101
13102 DPRINTF(WM_DEBUG_NVM, ("%s: No valid NVM bank present\n",
13103 device_xname(sc->sc_dev)));
13104 return -1;
13105 }
13106
13107 /******************************************************************************
13108 * This function does initial flash setup so that a new read/write/erase cycle
13109 * can be started.
13110 *
13111 * sc - The pointer to the hw structure
13112 ****************************************************************************/
13113 static int32_t
13114 wm_ich8_cycle_init(struct wm_softc *sc)
13115 {
13116 uint16_t hsfsts;
13117 int32_t error = 1;
13118 int32_t i = 0;
13119
13120 if (sc->sc_type >= WM_T_PCH_SPT)
13121 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) & 0xffffUL;
13122 else
13123 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
13124
13125 /* May be check the Flash Des Valid bit in Hw status */
13126 if ((hsfsts & HSFSTS_FLDVAL) == 0)
13127 return error;
13128
13129 /* Clear FCERR in Hw status by writing 1 */
13130 /* Clear DAEL in Hw status by writing a 1 */
13131 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL;
13132
13133 if (sc->sc_type >= WM_T_PCH_SPT)
13134 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, hsfsts & 0xffffUL);
13135 else
13136 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
13137
13138 /*
13139 * Either we should have a hardware SPI cycle in progress bit to check
13140 * against, in order to start a new cycle or FDONE bit should be
13141 * changed in the hardware so that it is 1 after hardware reset, which
13142 * can then be used as an indication whether a cycle is in progress or
13143 * has been completed .. we should also have some software semaphore
13144 * mechanism to guard FDONE or the cycle in progress bit so that two
13145 * threads access to those bits can be sequentiallized or a way so that
13146 * 2 threads don't start the cycle at the same time
13147 */
13148
13149 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
13150 /*
13151 * There is no cycle running at present, so we can start a
13152 * cycle
13153 */
13154
13155 /* Begin by setting Flash Cycle Done. */
13156 hsfsts |= HSFSTS_DONE;
13157 if (sc->sc_type >= WM_T_PCH_SPT)
13158 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13159 hsfsts & 0xffffUL);
13160 else
13161 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
13162 error = 0;
13163 } else {
13164 /*
13165 * Otherwise poll for sometime so the current cycle has a
13166 * chance to end before giving up.
13167 */
13168 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
13169 if (sc->sc_type >= WM_T_PCH_SPT)
13170 hsfsts = ICH8_FLASH_READ32(sc,
13171 ICH_FLASH_HSFSTS) & 0xffffUL;
13172 else
13173 hsfsts = ICH8_FLASH_READ16(sc,
13174 ICH_FLASH_HSFSTS);
13175 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
13176 error = 0;
13177 break;
13178 }
13179 delay(1);
13180 }
13181 if (error == 0) {
13182 /*
13183 * Successful in waiting for previous cycle to timeout,
13184 * now set the Flash Cycle Done.
13185 */
13186 hsfsts |= HSFSTS_DONE;
13187 if (sc->sc_type >= WM_T_PCH_SPT)
13188 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13189 hsfsts & 0xffffUL);
13190 else
13191 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS,
13192 hsfsts);
13193 }
13194 }
13195 return error;
13196 }
13197
13198 /******************************************************************************
13199 * This function starts a flash cycle and waits for its completion
13200 *
13201 * sc - The pointer to the hw structure
13202 ****************************************************************************/
13203 static int32_t
13204 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout)
13205 {
13206 uint16_t hsflctl;
13207 uint16_t hsfsts;
13208 int32_t error = 1;
13209 uint32_t i = 0;
13210
13211 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
13212 if (sc->sc_type >= WM_T_PCH_SPT)
13213 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) >> 16;
13214 else
13215 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
13216 hsflctl |= HSFCTL_GO;
13217 if (sc->sc_type >= WM_T_PCH_SPT)
13218 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13219 (uint32_t)hsflctl << 16);
13220 else
13221 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
13222
13223 /* Wait till FDONE bit is set to 1 */
13224 do {
13225 if (sc->sc_type >= WM_T_PCH_SPT)
13226 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS)
13227 & 0xffffUL;
13228 else
13229 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
13230 if (hsfsts & HSFSTS_DONE)
13231 break;
13232 delay(1);
13233 i++;
13234 } while (i < timeout);
13235 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0)
13236 error = 0;
13237
13238 return error;
13239 }
13240
13241 /******************************************************************************
13242 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers.
13243 *
13244 * sc - The pointer to the hw structure
13245 * index - The index of the byte or word to read.
13246 * size - Size of data to read, 1=byte 2=word, 4=dword
13247 * data - Pointer to the word to store the value read.
13248 *****************************************************************************/
13249 static int32_t
13250 wm_read_ich8_data(struct wm_softc *sc, uint32_t index,
13251 uint32_t size, uint32_t *data)
13252 {
13253 uint16_t hsfsts;
13254 uint16_t hsflctl;
13255 uint32_t flash_linear_address;
13256 uint32_t flash_data = 0;
13257 int32_t error = 1;
13258 int32_t count = 0;
13259
13260 if (size < 1 || size > 4 || data == 0x0 ||
13261 index > ICH_FLASH_LINEAR_ADDR_MASK)
13262 return error;
13263
13264 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
13265 sc->sc_ich8_flash_base;
13266
13267 do {
13268 delay(1);
13269 /* Steps */
13270 error = wm_ich8_cycle_init(sc);
13271 if (error)
13272 break;
13273
13274 if (sc->sc_type >= WM_T_PCH_SPT)
13275 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS)
13276 >> 16;
13277 else
13278 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
13279 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
13280 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT)
13281 & HSFCTL_BCOUNT_MASK;
13282 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT;
13283 if (sc->sc_type >= WM_T_PCH_SPT) {
13284 /*
13285 * In SPT, This register is in Lan memory space, not
13286 * flash. Therefore, only 32 bit access is supported.
13287 */
13288 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13289 (uint32_t)hsflctl << 16);
13290 } else
13291 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
13292
13293 /*
13294 * Write the last 24 bits of index into Flash Linear address
13295 * field in Flash Address
13296 */
13297 /* TODO: TBD maybe check the index against the size of flash */
13298
13299 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address);
13300
13301 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT);
13302
13303 /*
13304 * Check if FCERR is set to 1, if set to 1, clear it and try
13305 * the whole sequence a few more times, else read in (shift in)
13306 * the Flash Data0, the order is least significant byte first
13307 * msb to lsb
13308 */
13309 if (error == 0) {
13310 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0);
13311 if (size == 1)
13312 *data = (uint8_t)(flash_data & 0x000000FF);
13313 else if (size == 2)
13314 *data = (uint16_t)(flash_data & 0x0000FFFF);
13315 else if (size == 4)
13316 *data = (uint32_t)flash_data;
13317 break;
13318 } else {
13319 /*
13320 * If we've gotten here, then things are probably
13321 * completely hosed, but if the error condition is
13322 * detected, it won't hurt to give it another try...
13323 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
13324 */
13325 if (sc->sc_type >= WM_T_PCH_SPT)
13326 hsfsts = ICH8_FLASH_READ32(sc,
13327 ICH_FLASH_HSFSTS) & 0xffffUL;
13328 else
13329 hsfsts = ICH8_FLASH_READ16(sc,
13330 ICH_FLASH_HSFSTS);
13331
13332 if (hsfsts & HSFSTS_ERR) {
13333 /* Repeat for some time before giving up. */
13334 continue;
13335 } else if ((hsfsts & HSFSTS_DONE) == 0)
13336 break;
13337 }
13338 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
13339
13340 return error;
13341 }
13342
13343 /******************************************************************************
13344 * Reads a single byte from the NVM using the ICH8 flash access registers.
13345 *
13346 * sc - pointer to wm_hw structure
13347 * index - The index of the byte to read.
13348 * data - Pointer to a byte to store the value read.
13349 *****************************************************************************/
13350 static int32_t
13351 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data)
13352 {
13353 int32_t status;
13354 uint32_t word = 0;
13355
13356 status = wm_read_ich8_data(sc, index, 1, &word);
13357 if (status == 0)
13358 *data = (uint8_t)word;
13359 else
13360 *data = 0;
13361
13362 return status;
13363 }
13364
13365 /******************************************************************************
13366 * Reads a word from the NVM using the ICH8 flash access registers.
13367 *
13368 * sc - pointer to wm_hw structure
13369 * index - The starting byte index of the word to read.
13370 * data - Pointer to a word to store the value read.
13371 *****************************************************************************/
13372 static int32_t
13373 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data)
13374 {
13375 int32_t status;
13376 uint32_t word = 0;
13377
13378 status = wm_read_ich8_data(sc, index, 2, &word);
13379 if (status == 0)
13380 *data = (uint16_t)word;
13381 else
13382 *data = 0;
13383
13384 return status;
13385 }
13386
13387 /******************************************************************************
13388 * Reads a dword from the NVM using the ICH8 flash access registers.
13389 *
13390 * sc - pointer to wm_hw structure
13391 * index - The starting byte index of the word to read.
13392 * data - Pointer to a word to store the value read.
13393 *****************************************************************************/
13394 static int32_t
13395 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data)
13396 {
13397 int32_t status;
13398
13399 status = wm_read_ich8_data(sc, index, 4, data);
13400 return status;
13401 }
13402
13403 /******************************************************************************
13404 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
13405 * register.
13406 *
13407 * sc - Struct containing variables accessed by shared code
13408 * offset - offset of word in the EEPROM to read
13409 * data - word read from the EEPROM
13410 * words - number of words to read
13411 *****************************************************************************/
13412 static int
13413 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data)
13414 {
13415 int32_t rv = 0;
13416 uint32_t flash_bank = 0;
13417 uint32_t act_offset = 0;
13418 uint32_t bank_offset = 0;
13419 uint16_t word = 0;
13420 uint16_t i = 0;
13421
13422 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
13423 device_xname(sc->sc_dev), __func__));
13424
13425 if (sc->nvm.acquire(sc) != 0)
13426 return -1;
13427
13428 /*
13429 * We need to know which is the valid flash bank. In the event
13430 * that we didn't allocate eeprom_shadow_ram, we may not be
13431 * managing flash_bank. So it cannot be trusted and needs
13432 * to be updated with each read.
13433 */
13434 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
13435 if (rv) {
13436 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
13437 device_xname(sc->sc_dev)));
13438 flash_bank = 0;
13439 }
13440
13441 /*
13442 * Adjust offset appropriately if we're on bank 1 - adjust for word
13443 * size
13444 */
13445 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
13446
13447 for (i = 0; i < words; i++) {
13448 /* The NVM part needs a byte offset, hence * 2 */
13449 act_offset = bank_offset + ((offset + i) * 2);
13450 rv = wm_read_ich8_word(sc, act_offset, &word);
13451 if (rv) {
13452 aprint_error_dev(sc->sc_dev,
13453 "%s: failed to read NVM\n", __func__);
13454 break;
13455 }
13456 data[i] = word;
13457 }
13458
13459 sc->nvm.release(sc);
13460 return rv;
13461 }
13462
13463 /******************************************************************************
13464 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access
13465 * register.
13466 *
13467 * sc - Struct containing variables accessed by shared code
13468 * offset - offset of word in the EEPROM to read
13469 * data - word read from the EEPROM
13470 * words - number of words to read
13471 *****************************************************************************/
13472 static int
13473 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data)
13474 {
13475 int32_t rv = 0;
13476 uint32_t flash_bank = 0;
13477 uint32_t act_offset = 0;
13478 uint32_t bank_offset = 0;
13479 uint32_t dword = 0;
13480 uint16_t i = 0;
13481
13482 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
13483 device_xname(sc->sc_dev), __func__));
13484
13485 if (sc->nvm.acquire(sc) != 0)
13486 return -1;
13487
13488 /*
13489 * We need to know which is the valid flash bank. In the event
13490 * that we didn't allocate eeprom_shadow_ram, we may not be
13491 * managing flash_bank. So it cannot be trusted and needs
13492 * to be updated with each read.
13493 */
13494 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
13495 if (rv) {
13496 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
13497 device_xname(sc->sc_dev)));
13498 flash_bank = 0;
13499 }
13500
13501 /*
13502 * Adjust offset appropriately if we're on bank 1 - adjust for word
13503 * size
13504 */
13505 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
13506
13507 for (i = 0; i < words; i++) {
13508 /* The NVM part needs a byte offset, hence * 2 */
13509 act_offset = bank_offset + ((offset + i) * 2);
13510 /* but we must read dword aligned, so mask ... */
13511 rv = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword);
13512 if (rv) {
13513 aprint_error_dev(sc->sc_dev,
13514 "%s: failed to read NVM\n", __func__);
13515 break;
13516 }
13517 /* ... and pick out low or high word */
13518 if ((act_offset & 0x2) == 0)
13519 data[i] = (uint16_t)(dword & 0xFFFF);
13520 else
13521 data[i] = (uint16_t)((dword >> 16) & 0xFFFF);
13522 }
13523
13524 sc->nvm.release(sc);
13525 return rv;
13526 }
13527
13528 /* iNVM */
13529
13530 static int
13531 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data)
13532 {
13533 int32_t rv = 0;
13534 uint32_t invm_dword;
13535 uint16_t i;
13536 uint8_t record_type, word_address;
13537
13538 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
13539 device_xname(sc->sc_dev), __func__));
13540
13541 for (i = 0; i < INVM_SIZE; i++) {
13542 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i));
13543 /* Get record type */
13544 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
13545 if (record_type == INVM_UNINITIALIZED_STRUCTURE)
13546 break;
13547 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE)
13548 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
13549 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE)
13550 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
13551 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) {
13552 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
13553 if (word_address == address) {
13554 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
13555 rv = 0;
13556 break;
13557 }
13558 }
13559 }
13560
13561 return rv;
13562 }
13563
13564 static int
13565 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data)
13566 {
13567 int rv = 0;
13568 int i;
13569
13570 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
13571 device_xname(sc->sc_dev), __func__));
13572
13573 if (sc->nvm.acquire(sc) != 0)
13574 return -1;
13575
13576 for (i = 0; i < words; i++) {
13577 switch (offset + i) {
13578 case NVM_OFF_MACADDR:
13579 case NVM_OFF_MACADDR1:
13580 case NVM_OFF_MACADDR2:
13581 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]);
13582 if (rv != 0) {
13583 data[i] = 0xffff;
13584 rv = -1;
13585 }
13586 break;
13587 case NVM_OFF_CFG1: /* == INVM_AUTOLOAD */
13588 rv = wm_nvm_read_word_invm(sc, offset, data);
13589 if (rv != 0) {
13590 *data = INVM_DEFAULT_AL;
13591 rv = 0;
13592 }
13593 break;
13594 case NVM_OFF_CFG2:
13595 rv = wm_nvm_read_word_invm(sc, offset, data);
13596 if (rv != 0) {
13597 *data = NVM_INIT_CTRL_2_DEFAULT_I211;
13598 rv = 0;
13599 }
13600 break;
13601 case NVM_OFF_CFG4:
13602 rv = wm_nvm_read_word_invm(sc, offset, data);
13603 if (rv != 0) {
13604 *data = NVM_INIT_CTRL_4_DEFAULT_I211;
13605 rv = 0;
13606 }
13607 break;
13608 case NVM_OFF_LED_1_CFG:
13609 rv = wm_nvm_read_word_invm(sc, offset, data);
13610 if (rv != 0) {
13611 *data = NVM_LED_1_CFG_DEFAULT_I211;
13612 rv = 0;
13613 }
13614 break;
13615 case NVM_OFF_LED_0_2_CFG:
13616 rv = wm_nvm_read_word_invm(sc, offset, data);
13617 if (rv != 0) {
13618 *data = NVM_LED_0_2_CFG_DEFAULT_I211;
13619 rv = 0;
13620 }
13621 break;
13622 case NVM_OFF_ID_LED_SETTINGS:
13623 rv = wm_nvm_read_word_invm(sc, offset, data);
13624 if (rv != 0) {
13625 *data = ID_LED_RESERVED_FFFF;
13626 rv = 0;
13627 }
13628 break;
13629 default:
13630 DPRINTF(WM_DEBUG_NVM,
13631 ("NVM word 0x%02x is not mapped.\n", offset));
13632 *data = NVM_RESERVED_WORD;
13633 break;
13634 }
13635 }
13636
13637 sc->nvm.release(sc);
13638 return rv;
13639 }
13640
13641 /* Lock, detecting NVM type, validate checksum, version and read */
13642
13643 static int
13644 wm_nvm_is_onboard_eeprom(struct wm_softc *sc)
13645 {
13646 uint32_t eecd = 0;
13647
13648 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574
13649 || sc->sc_type == WM_T_82583) {
13650 eecd = CSR_READ(sc, WMREG_EECD);
13651
13652 /* Isolate bits 15 & 16 */
13653 eecd = ((eecd >> 15) & 0x03);
13654
13655 /* If both bits are set, device is Flash type */
13656 if (eecd == 0x03)
13657 return 0;
13658 }
13659 return 1;
13660 }
13661
13662 static int
13663 wm_nvm_flash_presence_i210(struct wm_softc *sc)
13664 {
13665 uint32_t eec;
13666
13667 eec = CSR_READ(sc, WMREG_EEC);
13668 if ((eec & EEC_FLASH_DETECTED) != 0)
13669 return 1;
13670
13671 return 0;
13672 }
13673
13674 /*
13675 * wm_nvm_validate_checksum
13676 *
13677 * The checksum is defined as the sum of the first 64 (16 bit) words.
13678 */
13679 static int
13680 wm_nvm_validate_checksum(struct wm_softc *sc)
13681 {
13682 uint16_t checksum;
13683 uint16_t eeprom_data;
13684 #ifdef WM_DEBUG
13685 uint16_t csum_wordaddr, valid_checksum;
13686 #endif
13687 int i;
13688
13689 checksum = 0;
13690
13691 /* Don't check for I211 */
13692 if (sc->sc_type == WM_T_I211)
13693 return 0;
13694
13695 #ifdef WM_DEBUG
13696 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
13697 || (sc->sc_type == WM_T_PCH_CNP)) {
13698 csum_wordaddr = NVM_OFF_COMPAT;
13699 valid_checksum = NVM_COMPAT_VALID_CHECKSUM;
13700 } else {
13701 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1;
13702 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM;
13703 }
13704
13705 /* Dump EEPROM image for debug */
13706 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
13707 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
13708 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
13709 /* XXX PCH_SPT? */
13710 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data);
13711 if ((eeprom_data & valid_checksum) == 0)
13712 DPRINTF(WM_DEBUG_NVM,
13713 ("%s: NVM need to be updated (%04x != %04x)\n",
13714 device_xname(sc->sc_dev), eeprom_data,
13715 valid_checksum));
13716 }
13717
13718 if ((wm_debug & WM_DEBUG_NVM) != 0) {
13719 printf("%s: NVM dump:\n", device_xname(sc->sc_dev));
13720 for (i = 0; i < NVM_SIZE; i++) {
13721 if (wm_nvm_read(sc, i, 1, &eeprom_data))
13722 printf("XXXX ");
13723 else
13724 printf("%04hx ", eeprom_data);
13725 if (i % 8 == 7)
13726 printf("\n");
13727 }
13728 }
13729
13730 #endif /* WM_DEBUG */
13731
13732 for (i = 0; i < NVM_SIZE; i++) {
13733 if (wm_nvm_read(sc, i, 1, &eeprom_data))
13734 return 1;
13735 checksum += eeprom_data;
13736 }
13737
13738 if (checksum != (uint16_t) NVM_CHECKSUM) {
13739 #ifdef WM_DEBUG
13740 printf("%s: NVM checksum mismatch (%04x != %04x)\n",
13741 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM);
13742 #endif
13743 }
13744
13745 return 0;
13746 }
13747
13748 static void
13749 wm_nvm_version_invm(struct wm_softc *sc)
13750 {
13751 uint32_t dword;
13752
13753 /*
13754 * Linux's code to decode version is very strange, so we don't
13755 * obey that algorithm and just use word 61 as the document.
13756 * Perhaps it's not perfect though...
13757 *
13758 * Example:
13759 *
13760 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6)
13761 */
13762 dword = CSR_READ(sc, WM_INVM_DATA_REG(61));
13763 dword = __SHIFTOUT(dword, INVM_VER_1);
13764 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR);
13765 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR);
13766 }
13767
13768 static void
13769 wm_nvm_version(struct wm_softc *sc)
13770 {
13771 uint16_t major, minor, build, patch;
13772 uint16_t uid0, uid1;
13773 uint16_t nvm_data;
13774 uint16_t off;
13775 bool check_version = false;
13776 bool check_optionrom = false;
13777 bool have_build = false;
13778 bool have_uid = true;
13779
13780 /*
13781 * Version format:
13782 *
13783 * XYYZ
13784 * X0YZ
13785 * X0YY
13786 *
13787 * Example:
13788 *
13789 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10)
13790 * 82571 0x50a6 5.10.6?
13791 * 82572 0x506a 5.6.10?
13792 * 82572EI 0x5069 5.6.9?
13793 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4)
13794 * 0x2013 2.1.3?
13795 * 82583 0x10a0 1.10.0? (document says it's default value)
13796 * ICH8+82567 0x0040 0.4.0?
13797 * ICH9+82566 0x1040 1.4.0?
13798 *ICH10+82567 0x0043 0.4.3?
13799 * PCH+82577 0x00c1 0.12.1?
13800 * PCH2+82579 0x00d3 0.13.3?
13801 * 0x00d4 0.13.4?
13802 * LPT+I218 0x0023 0.2.3?
13803 * SPT+I219 0x0084 0.8.4?
13804 * CNP+I219 0x0054 0.5.4?
13805 */
13806
13807 /*
13808 * XXX
13809 * Qemu's e1000e emulation (82574L)'s SPI has only 64 words.
13810 * I've never seen on real 82574 hardware with such small SPI ROM.
13811 */
13812 if ((sc->sc_nvm_wordsize < NVM_OFF_IMAGE_UID1)
13813 || (wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1) != 0))
13814 have_uid = false;
13815
13816 switch (sc->sc_type) {
13817 case WM_T_82571:
13818 case WM_T_82572:
13819 case WM_T_82574:
13820 case WM_T_82583:
13821 check_version = true;
13822 check_optionrom = true;
13823 have_build = true;
13824 break;
13825 case WM_T_ICH8:
13826 case WM_T_ICH9:
13827 case WM_T_ICH10:
13828 case WM_T_PCH:
13829 case WM_T_PCH2:
13830 case WM_T_PCH_LPT:
13831 case WM_T_PCH_SPT:
13832 case WM_T_PCH_CNP:
13833 check_version = true;
13834 have_build = true;
13835 have_uid = false;
13836 break;
13837 case WM_T_82575:
13838 case WM_T_82576:
13839 case WM_T_82580:
13840 if (have_uid && (uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID)
13841 check_version = true;
13842 break;
13843 case WM_T_I211:
13844 wm_nvm_version_invm(sc);
13845 have_uid = false;
13846 goto printver;
13847 case WM_T_I210:
13848 if (!wm_nvm_flash_presence_i210(sc)) {
13849 wm_nvm_version_invm(sc);
13850 have_uid = false;
13851 goto printver;
13852 }
13853 /* FALLTHROUGH */
13854 case WM_T_I350:
13855 case WM_T_I354:
13856 check_version = true;
13857 check_optionrom = true;
13858 break;
13859 default:
13860 return;
13861 }
13862 if (check_version
13863 && (wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data) == 0)) {
13864 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
13865 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) {
13866 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT;
13867 build = nvm_data & NVM_BUILD_MASK;
13868 have_build = true;
13869 } else
13870 minor = nvm_data & 0x00ff;
13871
13872 /* Decimal */
13873 minor = (minor / 16) * 10 + (minor % 16);
13874 sc->sc_nvm_ver_major = major;
13875 sc->sc_nvm_ver_minor = minor;
13876
13877 printver:
13878 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major,
13879 sc->sc_nvm_ver_minor);
13880 if (have_build) {
13881 sc->sc_nvm_ver_build = build;
13882 aprint_verbose(".%d", build);
13883 }
13884 }
13885
13886 /* Assume the Option ROM area is at avove NVM_SIZE */
13887 if ((sc->sc_nvm_wordsize > NVM_SIZE) && check_optionrom
13888 && (wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off) == 0)) {
13889 /* Option ROM Version */
13890 if ((off != 0x0000) && (off != 0xffff)) {
13891 int rv;
13892
13893 off += NVM_COMBO_VER_OFF;
13894 rv = wm_nvm_read(sc, off + 1, 1, &uid1);
13895 rv |= wm_nvm_read(sc, off, 1, &uid0);
13896 if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff)
13897 && (uid1 != 0) && (uid1 != 0xffff)) {
13898 /* 16bits */
13899 major = uid0 >> 8;
13900 build = (uid0 << 8) | (uid1 >> 8);
13901 patch = uid1 & 0x00ff;
13902 aprint_verbose(", option ROM Version %d.%d.%d",
13903 major, build, patch);
13904 }
13905 }
13906 }
13907
13908 if (have_uid && (wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0) == 0))
13909 aprint_verbose(", Image Unique ID %08x", (uid1 << 16) | uid0);
13910 }
13911
13912 /*
13913 * wm_nvm_read:
13914 *
13915 * Read data from the serial EEPROM.
13916 */
13917 static int
13918 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
13919 {
13920 int rv;
13921
13922 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
13923 device_xname(sc->sc_dev), __func__));
13924
13925 if (sc->sc_flags & WM_F_EEPROM_INVALID)
13926 return -1;
13927
13928 rv = sc->nvm.read(sc, word, wordcnt, data);
13929
13930 return rv;
13931 }
13932
13933 /*
13934 * Hardware semaphores.
13935 * Very complexed...
13936 */
13937
13938 static int
13939 wm_get_null(struct wm_softc *sc)
13940 {
13941
13942 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13943 device_xname(sc->sc_dev), __func__));
13944 return 0;
13945 }
13946
13947 static void
13948 wm_put_null(struct wm_softc *sc)
13949 {
13950
13951 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13952 device_xname(sc->sc_dev), __func__));
13953 return;
13954 }
13955
13956 static int
13957 wm_get_eecd(struct wm_softc *sc)
13958 {
13959 uint32_t reg;
13960 int x;
13961
13962 DPRINTF(WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
13963 device_xname(sc->sc_dev), __func__));
13964
13965 reg = CSR_READ(sc, WMREG_EECD);
13966
13967 /* Request EEPROM access. */
13968 reg |= EECD_EE_REQ;
13969 CSR_WRITE(sc, WMREG_EECD, reg);
13970
13971 /* ..and wait for it to be granted. */
13972 for (x = 0; x < 1000; x++) {
13973 reg = CSR_READ(sc, WMREG_EECD);
13974 if (reg & EECD_EE_GNT)
13975 break;
13976 delay(5);
13977 }
13978 if ((reg & EECD_EE_GNT) == 0) {
13979 aprint_error_dev(sc->sc_dev,
13980 "could not acquire EEPROM GNT\n");
13981 reg &= ~EECD_EE_REQ;
13982 CSR_WRITE(sc, WMREG_EECD, reg);
13983 return -1;
13984 }
13985
13986 return 0;
13987 }
13988
13989 static void
13990 wm_nvm_eec_clock_raise(struct wm_softc *sc, uint32_t *eecd)
13991 {
13992
13993 *eecd |= EECD_SK;
13994 CSR_WRITE(sc, WMREG_EECD, *eecd);
13995 CSR_WRITE_FLUSH(sc);
13996 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
13997 delay(1);
13998 else
13999 delay(50);
14000 }
14001
14002 static void
14003 wm_nvm_eec_clock_lower(struct wm_softc *sc, uint32_t *eecd)
14004 {
14005
14006 *eecd &= ~EECD_SK;
14007 CSR_WRITE(sc, WMREG_EECD, *eecd);
14008 CSR_WRITE_FLUSH(sc);
14009 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
14010 delay(1);
14011 else
14012 delay(50);
14013 }
14014
14015 static void
14016 wm_put_eecd(struct wm_softc *sc)
14017 {
14018 uint32_t reg;
14019
14020 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14021 device_xname(sc->sc_dev), __func__));
14022
14023 /* Stop nvm */
14024 reg = CSR_READ(sc, WMREG_EECD);
14025 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) {
14026 /* Pull CS high */
14027 reg |= EECD_CS;
14028 wm_nvm_eec_clock_lower(sc, ®);
14029 } else {
14030 /* CS on Microwire is active-high */
14031 reg &= ~(EECD_CS | EECD_DI);
14032 CSR_WRITE(sc, WMREG_EECD, reg);
14033 wm_nvm_eec_clock_raise(sc, ®);
14034 wm_nvm_eec_clock_lower(sc, ®);
14035 }
14036
14037 reg = CSR_READ(sc, WMREG_EECD);
14038 reg &= ~EECD_EE_REQ;
14039 CSR_WRITE(sc, WMREG_EECD, reg);
14040
14041 return;
14042 }
14043
14044 /*
14045 * Get hardware semaphore.
14046 * Same as e1000_get_hw_semaphore_generic()
14047 */
14048 static int
14049 wm_get_swsm_semaphore(struct wm_softc *sc)
14050 {
14051 int32_t timeout;
14052 uint32_t swsm;
14053
14054 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14055 device_xname(sc->sc_dev), __func__));
14056 KASSERT(sc->sc_nvm_wordsize > 0);
14057
14058 retry:
14059 /* Get the SW semaphore. */
14060 timeout = sc->sc_nvm_wordsize + 1;
14061 while (timeout) {
14062 swsm = CSR_READ(sc, WMREG_SWSM);
14063
14064 if ((swsm & SWSM_SMBI) == 0)
14065 break;
14066
14067 delay(50);
14068 timeout--;
14069 }
14070
14071 if (timeout == 0) {
14072 if ((sc->sc_flags & WM_F_WA_I210_CLSEM) != 0) {
14073 /*
14074 * In rare circumstances, the SW semaphore may already
14075 * be held unintentionally. Clear the semaphore once
14076 * before giving up.
14077 */
14078 sc->sc_flags &= ~WM_F_WA_I210_CLSEM;
14079 wm_put_swsm_semaphore(sc);
14080 goto retry;
14081 }
14082 aprint_error_dev(sc->sc_dev,
14083 "could not acquire SWSM SMBI\n");
14084 return 1;
14085 }
14086
14087 /* Get the FW semaphore. */
14088 timeout = sc->sc_nvm_wordsize + 1;
14089 while (timeout) {
14090 swsm = CSR_READ(sc, WMREG_SWSM);
14091 swsm |= SWSM_SWESMBI;
14092 CSR_WRITE(sc, WMREG_SWSM, swsm);
14093 /* If we managed to set the bit we got the semaphore. */
14094 swsm = CSR_READ(sc, WMREG_SWSM);
14095 if (swsm & SWSM_SWESMBI)
14096 break;
14097
14098 delay(50);
14099 timeout--;
14100 }
14101
14102 if (timeout == 0) {
14103 aprint_error_dev(sc->sc_dev,
14104 "could not acquire SWSM SWESMBI\n");
14105 /* Release semaphores */
14106 wm_put_swsm_semaphore(sc);
14107 return 1;
14108 }
14109 return 0;
14110 }
14111
14112 /*
14113 * Put hardware semaphore.
14114 * Same as e1000_put_hw_semaphore_generic()
14115 */
14116 static void
14117 wm_put_swsm_semaphore(struct wm_softc *sc)
14118 {
14119 uint32_t swsm;
14120
14121 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14122 device_xname(sc->sc_dev), __func__));
14123
14124 swsm = CSR_READ(sc, WMREG_SWSM);
14125 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI);
14126 CSR_WRITE(sc, WMREG_SWSM, swsm);
14127 }
14128
14129 /*
14130 * Get SW/FW semaphore.
14131 * Same as e1000_acquire_swfw_sync_{80003es2lan,82575}().
14132 */
14133 static int
14134 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
14135 {
14136 uint32_t swfw_sync;
14137 uint32_t swmask = mask << SWFW_SOFT_SHIFT;
14138 uint32_t fwmask = mask << SWFW_FIRM_SHIFT;
14139 int timeout;
14140
14141 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14142 device_xname(sc->sc_dev), __func__));
14143
14144 if (sc->sc_type == WM_T_80003)
14145 timeout = 50;
14146 else
14147 timeout = 200;
14148
14149 while (timeout) {
14150 if (wm_get_swsm_semaphore(sc)) {
14151 aprint_error_dev(sc->sc_dev,
14152 "%s: failed to get semaphore\n",
14153 __func__);
14154 return 1;
14155 }
14156 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
14157 if ((swfw_sync & (swmask | fwmask)) == 0) {
14158 swfw_sync |= swmask;
14159 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
14160 wm_put_swsm_semaphore(sc);
14161 return 0;
14162 }
14163 wm_put_swsm_semaphore(sc);
14164 delay(5000);
14165 timeout--;
14166 }
14167 device_printf(sc->sc_dev,
14168 "failed to get swfw semaphore mask 0x%x swfw 0x%x\n",
14169 mask, swfw_sync);
14170 return 1;
14171 }
14172
14173 static void
14174 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
14175 {
14176 uint32_t swfw_sync;
14177
14178 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14179 device_xname(sc->sc_dev), __func__));
14180
14181 while (wm_get_swsm_semaphore(sc) != 0)
14182 continue;
14183
14184 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
14185 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT);
14186 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
14187
14188 wm_put_swsm_semaphore(sc);
14189 }
14190
14191 static int
14192 wm_get_nvm_80003(struct wm_softc *sc)
14193 {
14194 int rv;
14195
14196 DPRINTF(WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
14197 device_xname(sc->sc_dev), __func__));
14198
14199 if ((rv = wm_get_swfw_semaphore(sc, SWFW_EEP_SM)) != 0) {
14200 aprint_error_dev(sc->sc_dev,
14201 "%s: failed to get semaphore(SWFW)\n", __func__);
14202 return rv;
14203 }
14204
14205 if (((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14206 && (rv = wm_get_eecd(sc)) != 0) {
14207 aprint_error_dev(sc->sc_dev,
14208 "%s: failed to get semaphore(EECD)\n", __func__);
14209 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
14210 return rv;
14211 }
14212
14213 return 0;
14214 }
14215
14216 static void
14217 wm_put_nvm_80003(struct wm_softc *sc)
14218 {
14219
14220 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14221 device_xname(sc->sc_dev), __func__));
14222
14223 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14224 wm_put_eecd(sc);
14225 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
14226 }
14227
14228 static int
14229 wm_get_nvm_82571(struct wm_softc *sc)
14230 {
14231 int rv;
14232
14233 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14234 device_xname(sc->sc_dev), __func__));
14235
14236 if ((rv = wm_get_swsm_semaphore(sc)) != 0)
14237 return rv;
14238
14239 switch (sc->sc_type) {
14240 case WM_T_82573:
14241 break;
14242 default:
14243 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14244 rv = wm_get_eecd(sc);
14245 break;
14246 }
14247
14248 if (rv != 0) {
14249 aprint_error_dev(sc->sc_dev,
14250 "%s: failed to get semaphore\n",
14251 __func__);
14252 wm_put_swsm_semaphore(sc);
14253 }
14254
14255 return rv;
14256 }
14257
14258 static void
14259 wm_put_nvm_82571(struct wm_softc *sc)
14260 {
14261
14262 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14263 device_xname(sc->sc_dev), __func__));
14264
14265 switch (sc->sc_type) {
14266 case WM_T_82573:
14267 break;
14268 default:
14269 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14270 wm_put_eecd(sc);
14271 break;
14272 }
14273
14274 wm_put_swsm_semaphore(sc);
14275 }
14276
14277 static int
14278 wm_get_phy_82575(struct wm_softc *sc)
14279 {
14280
14281 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14282 device_xname(sc->sc_dev), __func__));
14283 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
14284 }
14285
14286 static void
14287 wm_put_phy_82575(struct wm_softc *sc)
14288 {
14289
14290 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14291 device_xname(sc->sc_dev), __func__));
14292 return wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
14293 }
14294
14295 static int
14296 wm_get_swfwhw_semaphore(struct wm_softc *sc)
14297 {
14298 uint32_t ext_ctrl;
14299 int timeout = 200;
14300
14301 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14302 device_xname(sc->sc_dev), __func__));
14303
14304 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
14305 for (timeout = 0; timeout < 200; timeout++) {
14306 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14307 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
14308 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14309
14310 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14311 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
14312 return 0;
14313 delay(5000);
14314 }
14315 device_printf(sc->sc_dev,
14316 "failed to get swfwhw semaphore ext_ctrl 0x%x\n", ext_ctrl);
14317 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
14318 return 1;
14319 }
14320
14321 static void
14322 wm_put_swfwhw_semaphore(struct wm_softc *sc)
14323 {
14324 uint32_t ext_ctrl;
14325
14326 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14327 device_xname(sc->sc_dev), __func__));
14328
14329 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14330 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14331 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14332
14333 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
14334 }
14335
14336 static int
14337 wm_get_swflag_ich8lan(struct wm_softc *sc)
14338 {
14339 uint32_t ext_ctrl;
14340 int timeout;
14341
14342 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14343 device_xname(sc->sc_dev), __func__));
14344 mutex_enter(sc->sc_ich_phymtx);
14345 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) {
14346 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14347 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0)
14348 break;
14349 delay(1000);
14350 }
14351 if (timeout >= WM_PHY_CFG_TIMEOUT) {
14352 device_printf(sc->sc_dev,
14353 "SW has already locked the resource\n");
14354 goto out;
14355 }
14356
14357 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
14358 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14359 for (timeout = 0; timeout < 1000; timeout++) {
14360 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14361 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
14362 break;
14363 delay(1000);
14364 }
14365 if (timeout >= 1000) {
14366 device_printf(sc->sc_dev, "failed to acquire semaphore\n");
14367 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14368 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14369 goto out;
14370 }
14371 return 0;
14372
14373 out:
14374 mutex_exit(sc->sc_ich_phymtx);
14375 return 1;
14376 }
14377
14378 static void
14379 wm_put_swflag_ich8lan(struct wm_softc *sc)
14380 {
14381 uint32_t ext_ctrl;
14382
14383 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14384 device_xname(sc->sc_dev), __func__));
14385 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14386 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) {
14387 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14388 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14389 } else {
14390 device_printf(sc->sc_dev, "Semaphore unexpectedly released\n");
14391 }
14392
14393 mutex_exit(sc->sc_ich_phymtx);
14394 }
14395
14396 static int
14397 wm_get_nvm_ich8lan(struct wm_softc *sc)
14398 {
14399
14400 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14401 device_xname(sc->sc_dev), __func__));
14402 mutex_enter(sc->sc_ich_nvmmtx);
14403
14404 return 0;
14405 }
14406
14407 static void
14408 wm_put_nvm_ich8lan(struct wm_softc *sc)
14409 {
14410
14411 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14412 device_xname(sc->sc_dev), __func__));
14413 mutex_exit(sc->sc_ich_nvmmtx);
14414 }
14415
14416 static int
14417 wm_get_hw_semaphore_82573(struct wm_softc *sc)
14418 {
14419 int i = 0;
14420 uint32_t reg;
14421
14422 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14423 device_xname(sc->sc_dev), __func__));
14424
14425 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14426 do {
14427 CSR_WRITE(sc, WMREG_EXTCNFCTR,
14428 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP);
14429 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14430 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0)
14431 break;
14432 delay(2*1000);
14433 i++;
14434 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT);
14435
14436 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) {
14437 wm_put_hw_semaphore_82573(sc);
14438 log(LOG_ERR, "%s: Driver can't access the PHY\n",
14439 device_xname(sc->sc_dev));
14440 return -1;
14441 }
14442
14443 return 0;
14444 }
14445
14446 static void
14447 wm_put_hw_semaphore_82573(struct wm_softc *sc)
14448 {
14449 uint32_t reg;
14450
14451 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14452 device_xname(sc->sc_dev), __func__));
14453
14454 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14455 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14456 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
14457 }
14458
14459 /*
14460 * Management mode and power management related subroutines.
14461 * BMC, AMT, suspend/resume and EEE.
14462 */
14463
14464 #ifdef WM_WOL
14465 static int
14466 wm_check_mng_mode(struct wm_softc *sc)
14467 {
14468 int rv;
14469
14470 switch (sc->sc_type) {
14471 case WM_T_ICH8:
14472 case WM_T_ICH9:
14473 case WM_T_ICH10:
14474 case WM_T_PCH:
14475 case WM_T_PCH2:
14476 case WM_T_PCH_LPT:
14477 case WM_T_PCH_SPT:
14478 case WM_T_PCH_CNP:
14479 rv = wm_check_mng_mode_ich8lan(sc);
14480 break;
14481 case WM_T_82574:
14482 case WM_T_82583:
14483 rv = wm_check_mng_mode_82574(sc);
14484 break;
14485 case WM_T_82571:
14486 case WM_T_82572:
14487 case WM_T_82573:
14488 case WM_T_80003:
14489 rv = wm_check_mng_mode_generic(sc);
14490 break;
14491 default:
14492 /* Noting to do */
14493 rv = 0;
14494 break;
14495 }
14496
14497 return rv;
14498 }
14499
14500 static int
14501 wm_check_mng_mode_ich8lan(struct wm_softc *sc)
14502 {
14503 uint32_t fwsm;
14504
14505 fwsm = CSR_READ(sc, WMREG_FWSM);
14506
14507 if (((fwsm & FWSM_FW_VALID) != 0)
14508 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
14509 return 1;
14510
14511 return 0;
14512 }
14513
14514 static int
14515 wm_check_mng_mode_82574(struct wm_softc *sc)
14516 {
14517 uint16_t data;
14518
14519 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
14520
14521 if ((data & NVM_CFG2_MNGM_MASK) != 0)
14522 return 1;
14523
14524 return 0;
14525 }
14526
14527 static int
14528 wm_check_mng_mode_generic(struct wm_softc *sc)
14529 {
14530 uint32_t fwsm;
14531
14532 fwsm = CSR_READ(sc, WMREG_FWSM);
14533
14534 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE)
14535 return 1;
14536
14537 return 0;
14538 }
14539 #endif /* WM_WOL */
14540
14541 static int
14542 wm_enable_mng_pass_thru(struct wm_softc *sc)
14543 {
14544 uint32_t manc, fwsm, factps;
14545
14546 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0)
14547 return 0;
14548
14549 manc = CSR_READ(sc, WMREG_MANC);
14550
14551 DPRINTF(WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n",
14552 device_xname(sc->sc_dev), manc));
14553 if ((manc & MANC_RECV_TCO_EN) == 0)
14554 return 0;
14555
14556 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) {
14557 fwsm = CSR_READ(sc, WMREG_FWSM);
14558 factps = CSR_READ(sc, WMREG_FACTPS);
14559 if (((factps & FACTPS_MNGCG) == 0)
14560 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
14561 return 1;
14562 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
14563 uint16_t data;
14564
14565 factps = CSR_READ(sc, WMREG_FACTPS);
14566 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
14567 DPRINTF(WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n",
14568 device_xname(sc->sc_dev), factps, data));
14569 if (((factps & FACTPS_MNGCG) == 0)
14570 && ((data & NVM_CFG2_MNGM_MASK)
14571 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT)))
14572 return 1;
14573 } else if (((manc & MANC_SMBUS_EN) != 0)
14574 && ((manc & MANC_ASF_EN) == 0))
14575 return 1;
14576
14577 return 0;
14578 }
14579
14580 static bool
14581 wm_phy_resetisblocked(struct wm_softc *sc)
14582 {
14583 bool blocked = false;
14584 uint32_t reg;
14585 int i = 0;
14586
14587 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14588 device_xname(sc->sc_dev), __func__));
14589
14590 switch (sc->sc_type) {
14591 case WM_T_ICH8:
14592 case WM_T_ICH9:
14593 case WM_T_ICH10:
14594 case WM_T_PCH:
14595 case WM_T_PCH2:
14596 case WM_T_PCH_LPT:
14597 case WM_T_PCH_SPT:
14598 case WM_T_PCH_CNP:
14599 do {
14600 reg = CSR_READ(sc, WMREG_FWSM);
14601 if ((reg & FWSM_RSPCIPHY) == 0) {
14602 blocked = true;
14603 delay(10*1000);
14604 continue;
14605 }
14606 blocked = false;
14607 } while (blocked && (i++ < 30));
14608 return blocked;
14609 break;
14610 case WM_T_82571:
14611 case WM_T_82572:
14612 case WM_T_82573:
14613 case WM_T_82574:
14614 case WM_T_82583:
14615 case WM_T_80003:
14616 reg = CSR_READ(sc, WMREG_MANC);
14617 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0)
14618 return true;
14619 else
14620 return false;
14621 break;
14622 default:
14623 /* No problem */
14624 break;
14625 }
14626
14627 return false;
14628 }
14629
14630 static void
14631 wm_get_hw_control(struct wm_softc *sc)
14632 {
14633 uint32_t reg;
14634
14635 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14636 device_xname(sc->sc_dev), __func__));
14637
14638 if (sc->sc_type == WM_T_82573) {
14639 reg = CSR_READ(sc, WMREG_SWSM);
14640 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD);
14641 } else if (sc->sc_type >= WM_T_82571) {
14642 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14643 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
14644 }
14645 }
14646
14647 static void
14648 wm_release_hw_control(struct wm_softc *sc)
14649 {
14650 uint32_t reg;
14651
14652 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
14653 device_xname(sc->sc_dev), __func__));
14654
14655 if (sc->sc_type == WM_T_82573) {
14656 reg = CSR_READ(sc, WMREG_SWSM);
14657 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD);
14658 } else if (sc->sc_type >= WM_T_82571) {
14659 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14660 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD);
14661 }
14662 }
14663
14664 static void
14665 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate)
14666 {
14667 uint32_t reg;
14668
14669 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14670 device_xname(sc->sc_dev), __func__));
14671
14672 if (sc->sc_type < WM_T_PCH2)
14673 return;
14674
14675 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14676
14677 if (gate)
14678 reg |= EXTCNFCTR_GATE_PHY_CFG;
14679 else
14680 reg &= ~EXTCNFCTR_GATE_PHY_CFG;
14681
14682 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
14683 }
14684
14685 static int
14686 wm_init_phy_workarounds_pchlan(struct wm_softc *sc)
14687 {
14688 uint32_t fwsm, reg;
14689 int rv = 0;
14690
14691 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14692 device_xname(sc->sc_dev), __func__));
14693
14694 /* Gate automatic PHY configuration by hardware on non-managed 82579 */
14695 wm_gate_hw_phy_config_ich8lan(sc, true);
14696
14697 /* Disable ULP */
14698 wm_ulp_disable(sc);
14699
14700 /* Acquire PHY semaphore */
14701 rv = sc->phy.acquire(sc);
14702 if (rv != 0) {
14703 DPRINTF(WM_DEBUG_INIT, ("%s: %s: failed\n",
14704 device_xname(sc->sc_dev), __func__));
14705 return -1;
14706 }
14707
14708 /* The MAC-PHY interconnect may be in SMBus mode. If the PHY is
14709 * inaccessible and resetting the PHY is not blocked, toggle the
14710 * LANPHYPC Value bit to force the interconnect to PCIe mode.
14711 */
14712 fwsm = CSR_READ(sc, WMREG_FWSM);
14713 switch (sc->sc_type) {
14714 case WM_T_PCH_LPT:
14715 case WM_T_PCH_SPT:
14716 case WM_T_PCH_CNP:
14717 if (wm_phy_is_accessible_pchlan(sc))
14718 break;
14719
14720 /* Before toggling LANPHYPC, see if PHY is accessible by
14721 * forcing MAC to SMBus mode first.
14722 */
14723 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14724 reg |= CTRL_EXT_FORCE_SMBUS;
14725 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14726 #if 0
14727 /* XXX Isn't this required??? */
14728 CSR_WRITE_FLUSH(sc);
14729 #endif
14730 /* Wait 50 milliseconds for MAC to finish any retries
14731 * that it might be trying to perform from previous
14732 * attempts to acknowledge any phy read requests.
14733 */
14734 delay(50 * 1000);
14735 /* FALLTHROUGH */
14736 case WM_T_PCH2:
14737 if (wm_phy_is_accessible_pchlan(sc) == true)
14738 break;
14739 /* FALLTHROUGH */
14740 case WM_T_PCH:
14741 if (sc->sc_type == WM_T_PCH)
14742 if ((fwsm & FWSM_FW_VALID) != 0)
14743 break;
14744
14745 if (wm_phy_resetisblocked(sc) == true) {
14746 device_printf(sc->sc_dev, "XXX reset is blocked(3)\n");
14747 break;
14748 }
14749
14750 /* Toggle LANPHYPC Value bit */
14751 wm_toggle_lanphypc_pch_lpt(sc);
14752
14753 if (sc->sc_type >= WM_T_PCH_LPT) {
14754 if (wm_phy_is_accessible_pchlan(sc) == true)
14755 break;
14756
14757 /* Toggling LANPHYPC brings the PHY out of SMBus mode
14758 * so ensure that the MAC is also out of SMBus mode
14759 */
14760 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14761 reg &= ~CTRL_EXT_FORCE_SMBUS;
14762 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14763
14764 if (wm_phy_is_accessible_pchlan(sc) == true)
14765 break;
14766 rv = -1;
14767 }
14768 break;
14769 default:
14770 break;
14771 }
14772
14773 /* Release semaphore */
14774 sc->phy.release(sc);
14775
14776 if (rv == 0) {
14777 /* Check to see if able to reset PHY. Print error if not */
14778 if (wm_phy_resetisblocked(sc)) {
14779 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n");
14780 goto out;
14781 }
14782
14783 /* Reset the PHY before any access to it. Doing so, ensures
14784 * that the PHY is in a known good state before we read/write
14785 * PHY registers. The generic reset is sufficient here,
14786 * because we haven't determined the PHY type yet.
14787 */
14788 if (wm_reset_phy(sc) != 0)
14789 goto out;
14790
14791 /* On a successful reset, possibly need to wait for the PHY
14792 * to quiesce to an accessible state before returning control
14793 * to the calling function. If the PHY does not quiesce, then
14794 * return E1000E_BLK_PHY_RESET, as this is the condition that
14795 * the PHY is in.
14796 */
14797 if (wm_phy_resetisblocked(sc))
14798 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n");
14799 }
14800
14801 out:
14802 /* Ungate automatic PHY configuration on non-managed 82579 */
14803 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) {
14804 delay(10*1000);
14805 wm_gate_hw_phy_config_ich8lan(sc, false);
14806 }
14807
14808 return 0;
14809 }
14810
14811 static void
14812 wm_init_manageability(struct wm_softc *sc)
14813 {
14814
14815 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14816 device_xname(sc->sc_dev), __func__));
14817 if (sc->sc_flags & WM_F_HAS_MANAGE) {
14818 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H);
14819 uint32_t manc = CSR_READ(sc, WMREG_MANC);
14820
14821 /* Disable hardware interception of ARP */
14822 manc &= ~MANC_ARP_EN;
14823
14824 /* Enable receiving management packets to the host */
14825 if (sc->sc_type >= WM_T_82571) {
14826 manc |= MANC_EN_MNG2HOST;
14827 manc2h |= MANC2H_PORT_623 | MANC2H_PORT_624;
14828 CSR_WRITE(sc, WMREG_MANC2H, manc2h);
14829 }
14830
14831 CSR_WRITE(sc, WMREG_MANC, manc);
14832 }
14833 }
14834
14835 static void
14836 wm_release_manageability(struct wm_softc *sc)
14837 {
14838
14839 if (sc->sc_flags & WM_F_HAS_MANAGE) {
14840 uint32_t manc = CSR_READ(sc, WMREG_MANC);
14841
14842 manc |= MANC_ARP_EN;
14843 if (sc->sc_type >= WM_T_82571)
14844 manc &= ~MANC_EN_MNG2HOST;
14845
14846 CSR_WRITE(sc, WMREG_MANC, manc);
14847 }
14848 }
14849
14850 static void
14851 wm_get_wakeup(struct wm_softc *sc)
14852 {
14853
14854 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */
14855 switch (sc->sc_type) {
14856 case WM_T_82573:
14857 case WM_T_82583:
14858 sc->sc_flags |= WM_F_HAS_AMT;
14859 /* FALLTHROUGH */
14860 case WM_T_80003:
14861 case WM_T_82575:
14862 case WM_T_82576:
14863 case WM_T_82580:
14864 case WM_T_I350:
14865 case WM_T_I354:
14866 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0)
14867 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID;
14868 /* FALLTHROUGH */
14869 case WM_T_82541:
14870 case WM_T_82541_2:
14871 case WM_T_82547:
14872 case WM_T_82547_2:
14873 case WM_T_82571:
14874 case WM_T_82572:
14875 case WM_T_82574:
14876 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
14877 break;
14878 case WM_T_ICH8:
14879 case WM_T_ICH9:
14880 case WM_T_ICH10:
14881 case WM_T_PCH:
14882 case WM_T_PCH2:
14883 case WM_T_PCH_LPT:
14884 case WM_T_PCH_SPT:
14885 case WM_T_PCH_CNP:
14886 sc->sc_flags |= WM_F_HAS_AMT;
14887 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
14888 break;
14889 default:
14890 break;
14891 }
14892
14893 /* 1: HAS_MANAGE */
14894 if (wm_enable_mng_pass_thru(sc) != 0)
14895 sc->sc_flags |= WM_F_HAS_MANAGE;
14896
14897 /*
14898 * Note that the WOL flags is set after the resetting of the eeprom
14899 * stuff
14900 */
14901 }
14902
14903 /*
14904 * Unconfigure Ultra Low Power mode.
14905 * Only for I217 and newer (see below).
14906 */
14907 static int
14908 wm_ulp_disable(struct wm_softc *sc)
14909 {
14910 uint32_t reg;
14911 uint16_t phyreg;
14912 int i = 0, rv = 0;
14913
14914 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14915 device_xname(sc->sc_dev), __func__));
14916 /* Exclude old devices */
14917 if ((sc->sc_type < WM_T_PCH_LPT)
14918 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM)
14919 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V)
14920 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2)
14921 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2))
14922 return 0;
14923
14924 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) {
14925 /* Request ME un-configure ULP mode in the PHY */
14926 reg = CSR_READ(sc, WMREG_H2ME);
14927 reg &= ~H2ME_ULP;
14928 reg |= H2ME_ENFORCE_SETTINGS;
14929 CSR_WRITE(sc, WMREG_H2ME, reg);
14930
14931 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */
14932 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) {
14933 if (i++ == 30) {
14934 device_printf(sc->sc_dev, "%s timed out\n",
14935 __func__);
14936 return -1;
14937 }
14938 delay(10 * 1000);
14939 }
14940 reg = CSR_READ(sc, WMREG_H2ME);
14941 reg &= ~H2ME_ENFORCE_SETTINGS;
14942 CSR_WRITE(sc, WMREG_H2ME, reg);
14943
14944 return 0;
14945 }
14946
14947 /* Acquire semaphore */
14948 rv = sc->phy.acquire(sc);
14949 if (rv != 0) {
14950 DPRINTF(WM_DEBUG_INIT, ("%s: %s: failed\n",
14951 device_xname(sc->sc_dev), __func__));
14952 return -1;
14953 }
14954
14955 /* Toggle LANPHYPC */
14956 wm_toggle_lanphypc_pch_lpt(sc);
14957
14958 /* Unforce SMBus mode in PHY */
14959 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL, &phyreg);
14960 if (rv != 0) {
14961 uint32_t reg2;
14962
14963 aprint_debug_dev(sc->sc_dev, "%s: Force SMBus first.\n",
14964 __func__);
14965 reg2 = CSR_READ(sc, WMREG_CTRL_EXT);
14966 reg2 |= CTRL_EXT_FORCE_SMBUS;
14967 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2);
14968 delay(50 * 1000);
14969
14970 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL,
14971 &phyreg);
14972 if (rv != 0)
14973 goto release;
14974 }
14975 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS;
14976 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, phyreg);
14977
14978 /* Unforce SMBus mode in MAC */
14979 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14980 reg &= ~CTRL_EXT_FORCE_SMBUS;
14981 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14982
14983 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL, &phyreg);
14984 if (rv != 0)
14985 goto release;
14986 phyreg |= HV_PM_CTRL_K1_ENA;
14987 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, phyreg);
14988
14989 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1,
14990 &phyreg);
14991 if (rv != 0)
14992 goto release;
14993 phyreg &= ~(I218_ULP_CONFIG1_IND
14994 | I218_ULP_CONFIG1_STICKY_ULP
14995 | I218_ULP_CONFIG1_RESET_TO_SMBUS
14996 | I218_ULP_CONFIG1_WOL_HOST
14997 | I218_ULP_CONFIG1_INBAND_EXIT
14998 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC
14999 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST
15000 | I218_ULP_CONFIG1_DIS_SMB_PERST);
15001 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg);
15002 phyreg |= I218_ULP_CONFIG1_START;
15003 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg);
15004
15005 reg = CSR_READ(sc, WMREG_FEXTNVM7);
15006 reg &= ~FEXTNVM7_DIS_SMB_PERST;
15007 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
15008
15009 release:
15010 /* Release semaphore */
15011 sc->phy.release(sc);
15012 wm_gmii_reset(sc);
15013 delay(50 * 1000);
15014
15015 return rv;
15016 }
15017
15018 /* WOL in the newer chipset interfaces (pchlan) */
15019 static int
15020 wm_enable_phy_wakeup(struct wm_softc *sc)
15021 {
15022 device_t dev = sc->sc_dev;
15023 uint32_t mreg, moff;
15024 uint16_t wuce, wuc, wufc, preg;
15025 int i, rv;
15026
15027 KASSERT(sc->sc_type >= WM_T_PCH);
15028
15029 /* Copy MAC RARs to PHY RARs */
15030 wm_copy_rx_addrs_to_phy_ich8lan(sc);
15031
15032 /* Activate PHY wakeup */
15033 rv = sc->phy.acquire(sc);
15034 if (rv != 0) {
15035 device_printf(dev, "%s: failed to acquire semaphore\n",
15036 __func__);
15037 return rv;
15038 }
15039
15040 /*
15041 * Enable access to PHY wakeup registers.
15042 * BM_MTA, BM_RCTL, BM_WUFC and BM_WUC are in BM_WUC_PAGE.
15043 */
15044 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce);
15045 if (rv != 0) {
15046 device_printf(dev,
15047 "%s: Could not enable PHY wakeup reg access\n", __func__);
15048 goto release;
15049 }
15050
15051 /* Copy MAC MTA to PHY MTA */
15052 for (i = 0; i < WM_ICH8_MC_TABSIZE; i++) {
15053 uint16_t lo, hi;
15054
15055 mreg = CSR_READ(sc, WMREG_CORDOVA_MTA + (i * 4));
15056 lo = (uint16_t)(mreg & 0xffff);
15057 hi = (uint16_t)((mreg >> 16) & 0xffff);
15058 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i), &lo, 0, true);
15059 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i) + 1, &hi, 0, true);
15060 }
15061
15062 /* Configure PHY Rx Control register */
15063 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 1, true);
15064 mreg = CSR_READ(sc, WMREG_RCTL);
15065 if (mreg & RCTL_UPE)
15066 preg |= BM_RCTL_UPE;
15067 if (mreg & RCTL_MPE)
15068 preg |= BM_RCTL_MPE;
15069 preg &= ~(BM_RCTL_MO_MASK);
15070 moff = __SHIFTOUT(mreg, RCTL_MO);
15071 if (moff != 0)
15072 preg |= moff << BM_RCTL_MO_SHIFT;
15073 if (mreg & RCTL_BAM)
15074 preg |= BM_RCTL_BAM;
15075 if (mreg & RCTL_PMCF)
15076 preg |= BM_RCTL_PMCF;
15077 mreg = CSR_READ(sc, WMREG_CTRL);
15078 if (mreg & CTRL_RFCE)
15079 preg |= BM_RCTL_RFCE;
15080 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 0, true);
15081
15082 wuc = WUC_APME | WUC_PME_EN;
15083 wufc = WUFC_MAG;
15084 /* Enable PHY wakeup in MAC register */
15085 CSR_WRITE(sc, WMREG_WUC,
15086 WUC_PHY_WAKE | WUC_PME_STATUS | WUC_APMPME | wuc);
15087 CSR_WRITE(sc, WMREG_WUFC, wufc);
15088
15089 /* Configure and enable PHY wakeup in PHY registers */
15090 wm_access_phy_wakeup_reg_bm(dev, BM_WUC, &wuc, 0, true);
15091 wm_access_phy_wakeup_reg_bm(dev, BM_WUFC, &wufc, 0, true);
15092
15093 wuce |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
15094 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce);
15095
15096 release:
15097 sc->phy.release(sc);
15098
15099 return 0;
15100 }
15101
15102 /* Power down workaround on D3 */
15103 static void
15104 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc)
15105 {
15106 uint32_t reg;
15107 uint16_t phyreg;
15108 int i;
15109
15110 for (i = 0; i < 2; i++) {
15111 /* Disable link */
15112 reg = CSR_READ(sc, WMREG_PHY_CTRL);
15113 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
15114 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
15115
15116 /*
15117 * Call gig speed drop workaround on Gig disable before
15118 * accessing any PHY registers
15119 */
15120 if (sc->sc_type == WM_T_ICH8)
15121 wm_gig_downshift_workaround_ich8lan(sc);
15122
15123 /* Write VR power-down enable */
15124 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg);
15125 phyreg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
15126 phyreg |= IGP3_VR_CTRL_MODE_SHUTDOWN;
15127 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, phyreg);
15128
15129 /* Read it back and test */
15130 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg);
15131 phyreg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
15132 if ((phyreg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0))
15133 break;
15134
15135 /* Issue PHY reset and repeat at most one more time */
15136 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
15137 }
15138 }
15139
15140 /*
15141 * wm_suspend_workarounds_ich8lan - workarounds needed during S0->Sx
15142 * @sc: pointer to the HW structure
15143 *
15144 * During S0 to Sx transition, it is possible the link remains at gig
15145 * instead of negotiating to a lower speed. Before going to Sx, set
15146 * 'Gig Disable' to force link speed negotiation to a lower speed based on
15147 * the LPLU setting in the NVM or custom setting. For PCH and newer parts,
15148 * the OEM bits PHY register (LED, GbE disable and LPLU configurations) also
15149 * needs to be written.
15150 * Parts that support (and are linked to a partner which support) EEE in
15151 * 100Mbps should disable LPLU since 100Mbps w/ EEE requires less power
15152 * than 10Mbps w/o EEE.
15153 */
15154 static void
15155 wm_suspend_workarounds_ich8lan(struct wm_softc *sc)
15156 {
15157 device_t dev = sc->sc_dev;
15158 struct ethercom *ec = &sc->sc_ethercom;
15159 uint32_t phy_ctrl;
15160 int rv;
15161
15162 phy_ctrl = CSR_READ(sc, WMREG_PHY_CTRL);
15163 phy_ctrl |= PHY_CTRL_GBE_DIS;
15164
15165 KASSERT((sc->sc_type >= WM_T_ICH8) && (sc->sc_type <= WM_T_PCH_CNP));
15166
15167 if (sc->sc_phytype == WMPHY_I217) {
15168 uint16_t devid = sc->sc_pcidevid;
15169
15170 if ((devid == PCI_PRODUCT_INTEL_I218_LM) ||
15171 (devid == PCI_PRODUCT_INTEL_I218_V) ||
15172 (devid == PCI_PRODUCT_INTEL_I218_LM3) ||
15173 (devid == PCI_PRODUCT_INTEL_I218_V3) ||
15174 (sc->sc_type >= WM_T_PCH_SPT))
15175 CSR_WRITE(sc, WMREG_FEXTNVM6,
15176 CSR_READ(sc, WMREG_FEXTNVM6)
15177 & ~FEXTNVM6_REQ_PLL_CLK);
15178
15179 if (sc->phy.acquire(sc) != 0)
15180 goto out;
15181
15182 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) {
15183 uint16_t eee_advert;
15184
15185 rv = wm_read_emi_reg_locked(dev,
15186 I217_EEE_ADVERTISEMENT, &eee_advert);
15187 if (rv)
15188 goto release;
15189
15190 /*
15191 * Disable LPLU if both link partners support 100BaseT
15192 * EEE and 100Full is advertised on both ends of the
15193 * link, and enable Auto Enable LPI since there will
15194 * be no driver to enable LPI while in Sx.
15195 */
15196 if ((eee_advert & AN_EEEADVERT_100_TX) &&
15197 (sc->eee_lp_ability & AN_EEEADVERT_100_TX)) {
15198 uint16_t anar, phy_reg;
15199
15200 sc->phy.readreg_locked(dev, 2, MII_ANAR,
15201 &anar);
15202 if (anar & ANAR_TX_FD) {
15203 phy_ctrl &= ~(PHY_CTRL_D0A_LPLU |
15204 PHY_CTRL_NOND0A_LPLU);
15205
15206 /* Set Auto Enable LPI after link up */
15207 sc->phy.readreg_locked(dev, 2,
15208 I217_LPI_GPIO_CTRL, &phy_reg);
15209 phy_reg |= I217_LPI_GPIO_CTRL_AUTO_EN_LPI;
15210 sc->phy.writereg_locked(dev, 2,
15211 I217_LPI_GPIO_CTRL, phy_reg);
15212 }
15213 }
15214 }
15215
15216 /*
15217 * For i217 Intel Rapid Start Technology support,
15218 * when the system is going into Sx and no manageability engine
15219 * is present, the driver must configure proxy to reset only on
15220 * power good. LPI (Low Power Idle) state must also reset only
15221 * on power good, as well as the MTA (Multicast table array).
15222 * The SMBus release must also be disabled on LCD reset.
15223 */
15224
15225 /*
15226 * Enable MTA to reset for Intel Rapid Start Technology
15227 * Support
15228 */
15229
15230 release:
15231 sc->phy.release(sc);
15232 }
15233 out:
15234 CSR_WRITE(sc, WMREG_PHY_CTRL, phy_ctrl);
15235
15236 if (sc->sc_type == WM_T_ICH8)
15237 wm_gig_downshift_workaround_ich8lan(sc);
15238
15239 if (sc->sc_type >= WM_T_PCH) {
15240 wm_oem_bits_config_ich8lan(sc, false);
15241
15242 /* Reset PHY to activate OEM bits on 82577/8 */
15243 if (sc->sc_type == WM_T_PCH)
15244 wm_reset_phy(sc);
15245
15246 if (sc->phy.acquire(sc) != 0)
15247 return;
15248 wm_write_smbus_addr(sc);
15249 sc->phy.release(sc);
15250 }
15251 }
15252
15253 /*
15254 * wm_resume_workarounds_pchlan - workarounds needed during Sx->S0
15255 * @sc: pointer to the HW structure
15256 *
15257 * During Sx to S0 transitions on non-managed devices or managed devices
15258 * on which PHY resets are not blocked, if the PHY registers cannot be
15259 * accessed properly by the s/w toggle the LANPHYPC value to power cycle
15260 * the PHY.
15261 * On i217, setup Intel Rapid Start Technology.
15262 */
15263 static int
15264 wm_resume_workarounds_pchlan(struct wm_softc *sc)
15265 {
15266 device_t dev = sc->sc_dev;
15267 int rv;
15268
15269 if (sc->sc_type < WM_T_PCH2)
15270 return 0;
15271
15272 rv = wm_init_phy_workarounds_pchlan(sc);
15273 if (rv != 0)
15274 return -1;
15275
15276 /* For i217 Intel Rapid Start Technology support when the system
15277 * is transitioning from Sx and no manageability engine is present
15278 * configure SMBus to restore on reset, disable proxy, and enable
15279 * the reset on MTA (Multicast table array).
15280 */
15281 if (sc->sc_phytype == WMPHY_I217) {
15282 uint16_t phy_reg;
15283
15284 if (sc->phy.acquire(sc) != 0)
15285 return -1;
15286
15287 /* Clear Auto Enable LPI after link up */
15288 sc->phy.readreg_locked(dev, 1, I217_LPI_GPIO_CTRL, &phy_reg);
15289 phy_reg &= ~I217_LPI_GPIO_CTRL_AUTO_EN_LPI;
15290 sc->phy.writereg_locked(dev, 1, I217_LPI_GPIO_CTRL, phy_reg);
15291
15292 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
15293 /* Restore clear on SMB if no manageability engine
15294 * is present
15295 */
15296 rv = sc->phy.readreg_locked(dev, 1, I217_MEMPWR,
15297 &phy_reg);
15298 if (rv != 0)
15299 goto release;
15300 phy_reg |= I217_MEMPWR_DISABLE_SMB_RELEASE;
15301 sc->phy.writereg_locked(dev, 1, I217_MEMPWR, phy_reg);
15302
15303 /* Disable Proxy */
15304 sc->phy.writereg_locked(dev, 1, I217_PROXY_CTRL, 0);
15305 }
15306 /* Enable reset on MTA */
15307 sc->phy.readreg_locked(dev, 1, I217_CFGREG, &phy_reg);
15308 if (rv != 0)
15309 goto release;
15310 phy_reg &= ~I217_CGFREG_ENABLE_MTA_RESET;
15311 sc->phy.writereg_locked(dev, 1, I217_CFGREG, phy_reg);
15312
15313 release:
15314 sc->phy.release(sc);
15315 return rv;
15316 }
15317
15318 return 0;
15319 }
15320
15321 static void
15322 wm_enable_wakeup(struct wm_softc *sc)
15323 {
15324 uint32_t reg, pmreg;
15325 pcireg_t pmode;
15326 int rv = 0;
15327
15328 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15329 device_xname(sc->sc_dev), __func__));
15330
15331 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
15332 &pmreg, NULL) == 0)
15333 return;
15334
15335 if ((sc->sc_flags & WM_F_WOL) == 0)
15336 goto pme;
15337
15338 /* Advertise the wakeup capability */
15339 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2)
15340 | CTRL_SWDPIN(3));
15341
15342 /* Keep the laser running on fiber adapters */
15343 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
15344 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
15345 reg = CSR_READ(sc, WMREG_CTRL_EXT);
15346 reg |= CTRL_EXT_SWDPIN(3);
15347 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
15348 }
15349
15350 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) ||
15351 (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) ||
15352 (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) ||
15353 (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP))
15354 wm_suspend_workarounds_ich8lan(sc);
15355
15356 #if 0 /* For the multicast packet */
15357 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG;
15358 reg |= WUFC_MC;
15359 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE);
15360 #endif
15361
15362 if (sc->sc_type >= WM_T_PCH) {
15363 rv = wm_enable_phy_wakeup(sc);
15364 if (rv != 0)
15365 goto pme;
15366 } else {
15367 /* Enable wakeup by the MAC */
15368 CSR_WRITE(sc, WMREG_WUC, WUC_APME | WUC_PME_EN);
15369 CSR_WRITE(sc, WMREG_WUFC, WUFC_MAG);
15370 }
15371
15372 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
15373 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
15374 || (sc->sc_type == WM_T_PCH2))
15375 && (sc->sc_phytype == WMPHY_IGP_3))
15376 wm_igp3_phy_powerdown_workaround_ich8lan(sc);
15377
15378 pme:
15379 /* Request PME */
15380 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR);
15381 pmode |= PCI_PMCSR_PME_STS; /* in case it's already set (W1C) */
15382 if ((rv == 0) && (sc->sc_flags & WM_F_WOL) != 0) {
15383 /* For WOL */
15384 pmode |= PCI_PMCSR_PME_EN;
15385 } else {
15386 /* Disable WOL */
15387 pmode &= ~PCI_PMCSR_PME_EN;
15388 }
15389 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode);
15390 }
15391
15392 /* Disable ASPM L0s and/or L1 for workaround */
15393 static void
15394 wm_disable_aspm(struct wm_softc *sc)
15395 {
15396 pcireg_t reg, mask = 0;
15397 unsigned const char *str = "";
15398
15399 /*
15400 * Only for PCIe device which has PCIe capability in the PCI config
15401 * space.
15402 */
15403 if (((sc->sc_flags & WM_F_PCIE) == 0) || (sc->sc_pcixe_capoff == 0))
15404 return;
15405
15406 switch (sc->sc_type) {
15407 case WM_T_82571:
15408 case WM_T_82572:
15409 /*
15410 * 8257[12] Errata 13: Device Does Not Support PCIe Active
15411 * State Power management L1 State (ASPM L1).
15412 */
15413 mask = PCIE_LCSR_ASPM_L1;
15414 str = "L1 is";
15415 break;
15416 case WM_T_82573:
15417 case WM_T_82574:
15418 case WM_T_82583:
15419 /*
15420 * The 82573 disappears when PCIe ASPM L0s is enabled.
15421 *
15422 * The 82574 and 82583 does not support PCIe ASPM L0s with
15423 * some chipset. The document of 82574 and 82583 says that
15424 * disabling L0s with some specific chipset is sufficient,
15425 * but we follow as of the Intel em driver does.
15426 *
15427 * References:
15428 * Errata 8 of the Specification Update of i82573.
15429 * Errata 20 of the Specification Update of i82574.
15430 * Errata 9 of the Specification Update of i82583.
15431 */
15432 mask = PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S;
15433 str = "L0s and L1 are";
15434 break;
15435 default:
15436 return;
15437 }
15438
15439 reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
15440 sc->sc_pcixe_capoff + PCIE_LCSR);
15441 reg &= ~mask;
15442 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
15443 sc->sc_pcixe_capoff + PCIE_LCSR, reg);
15444
15445 /* Print only in wm_attach() */
15446 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
15447 aprint_verbose_dev(sc->sc_dev,
15448 "ASPM %s disabled to workaround the errata.\n", str);
15449 }
15450
15451 /* LPLU */
15452
15453 static void
15454 wm_lplu_d0_disable(struct wm_softc *sc)
15455 {
15456 struct mii_data *mii = &sc->sc_mii;
15457 uint32_t reg;
15458 uint16_t phyval;
15459
15460 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15461 device_xname(sc->sc_dev), __func__));
15462
15463 if (sc->sc_phytype == WMPHY_IFE)
15464 return;
15465
15466 switch (sc->sc_type) {
15467 case WM_T_82571:
15468 case WM_T_82572:
15469 case WM_T_82573:
15470 case WM_T_82575:
15471 case WM_T_82576:
15472 mii->mii_readreg(sc->sc_dev, 1, MII_IGPHY_POWER_MGMT, &phyval);
15473 phyval &= ~PMR_D0_LPLU;
15474 mii->mii_writereg(sc->sc_dev, 1, MII_IGPHY_POWER_MGMT, phyval);
15475 break;
15476 case WM_T_82580:
15477 case WM_T_I350:
15478 case WM_T_I210:
15479 case WM_T_I211:
15480 reg = CSR_READ(sc, WMREG_PHPM);
15481 reg &= ~PHPM_D0A_LPLU;
15482 CSR_WRITE(sc, WMREG_PHPM, reg);
15483 break;
15484 case WM_T_82574:
15485 case WM_T_82583:
15486 case WM_T_ICH8:
15487 case WM_T_ICH9:
15488 case WM_T_ICH10:
15489 reg = CSR_READ(sc, WMREG_PHY_CTRL);
15490 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU);
15491 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
15492 CSR_WRITE_FLUSH(sc);
15493 break;
15494 case WM_T_PCH:
15495 case WM_T_PCH2:
15496 case WM_T_PCH_LPT:
15497 case WM_T_PCH_SPT:
15498 case WM_T_PCH_CNP:
15499 wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS, &phyval);
15500 phyval &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
15501 if (wm_phy_resetisblocked(sc) == false)
15502 phyval |= HV_OEM_BITS_ANEGNOW;
15503 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, phyval);
15504 break;
15505 default:
15506 break;
15507 }
15508 }
15509
15510 /* EEE */
15511
15512 static int
15513 wm_set_eee_i350(struct wm_softc *sc)
15514 {
15515 struct ethercom *ec = &sc->sc_ethercom;
15516 uint32_t ipcnfg, eeer;
15517 uint32_t ipcnfg_mask
15518 = IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN | IPCNFG_10BASE_TE;
15519 uint32_t eeer_mask = EEER_TX_LPI_EN | EEER_RX_LPI_EN | EEER_LPI_FC;
15520
15521 KASSERT(sc->sc_mediatype == WM_MEDIATYPE_COPPER);
15522
15523 ipcnfg = CSR_READ(sc, WMREG_IPCNFG);
15524 eeer = CSR_READ(sc, WMREG_EEER);
15525
15526 /* Enable or disable per user setting */
15527 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) {
15528 ipcnfg |= ipcnfg_mask;
15529 eeer |= eeer_mask;
15530 } else {
15531 ipcnfg &= ~ipcnfg_mask;
15532 eeer &= ~eeer_mask;
15533 }
15534
15535 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg);
15536 CSR_WRITE(sc, WMREG_EEER, eeer);
15537 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */
15538 CSR_READ(sc, WMREG_EEER); /* XXX flush? */
15539
15540 return 0;
15541 }
15542
15543 static int
15544 wm_set_eee_pchlan(struct wm_softc *sc)
15545 {
15546 device_t dev = sc->sc_dev;
15547 struct ethercom *ec = &sc->sc_ethercom;
15548 uint16_t lpa, pcs_status, adv_addr, adv, lpi_ctrl, data;
15549 int rv = 0;
15550
15551 switch (sc->sc_phytype) {
15552 case WMPHY_82579:
15553 lpa = I82579_EEE_LP_ABILITY;
15554 pcs_status = I82579_EEE_PCS_STATUS;
15555 adv_addr = I82579_EEE_ADVERTISEMENT;
15556 break;
15557 case WMPHY_I217:
15558 lpa = I217_EEE_LP_ABILITY;
15559 pcs_status = I217_EEE_PCS_STATUS;
15560 adv_addr = I217_EEE_ADVERTISEMENT;
15561 break;
15562 default:
15563 return 0;
15564 }
15565
15566 if (sc->phy.acquire(sc)) {
15567 device_printf(dev, "%s: failed to get semaphore\n", __func__);
15568 return 0;
15569 }
15570
15571 rv = sc->phy.readreg_locked(dev, 1, I82579_LPI_CTRL, &lpi_ctrl);
15572 if (rv != 0)
15573 goto release;
15574
15575 /* Clear bits that enable EEE in various speeds */
15576 lpi_ctrl &= ~I82579_LPI_CTRL_ENABLE;
15577
15578 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) {
15579 /* Save off link partner's EEE ability */
15580 rv = wm_read_emi_reg_locked(dev, lpa, &sc->eee_lp_ability);
15581 if (rv != 0)
15582 goto release;
15583
15584 /* Read EEE advertisement */
15585 if ((rv = wm_read_emi_reg_locked(dev, adv_addr, &adv)) != 0)
15586 goto release;
15587
15588 /*
15589 * Enable EEE only for speeds in which the link partner is
15590 * EEE capable and for which we advertise EEE.
15591 */
15592 if (adv & sc->eee_lp_ability & AN_EEEADVERT_1000_T)
15593 lpi_ctrl |= I82579_LPI_CTRL_EN_1000;
15594 if (adv & sc->eee_lp_ability & AN_EEEADVERT_100_TX) {
15595 sc->phy.readreg_locked(dev, 2, MII_ANLPAR, &data);
15596 if ((data & ANLPAR_TX_FD) != 0)
15597 lpi_ctrl |= I82579_LPI_CTRL_EN_100;
15598 else {
15599 /*
15600 * EEE is not supported in 100Half, so ignore
15601 * partner's EEE in 100 ability if full-duplex
15602 * is not advertised.
15603 */
15604 sc->eee_lp_ability
15605 &= ~AN_EEEADVERT_100_TX;
15606 }
15607 }
15608 }
15609
15610 if (sc->sc_phytype == WMPHY_82579) {
15611 rv = wm_read_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, &data);
15612 if (rv != 0)
15613 goto release;
15614
15615 data &= ~I82579_LPI_PLL_SHUT_100;
15616 rv = wm_write_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, data);
15617 }
15618
15619 /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */
15620 if ((rv = wm_read_emi_reg_locked(dev, pcs_status, &data)) != 0)
15621 goto release;
15622
15623 rv = sc->phy.writereg_locked(dev, 1, I82579_LPI_CTRL, lpi_ctrl);
15624 release:
15625 sc->phy.release(sc);
15626
15627 return rv;
15628 }
15629
15630 static int
15631 wm_set_eee(struct wm_softc *sc)
15632 {
15633 struct ethercom *ec = &sc->sc_ethercom;
15634
15635 if ((ec->ec_capabilities & ETHERCAP_EEE) == 0)
15636 return 0;
15637
15638 if (sc->sc_type == WM_T_I354) {
15639 /* I354 uses an external PHY */
15640 return 0; /* not yet */
15641 } else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211))
15642 return wm_set_eee_i350(sc);
15643 else if (sc->sc_type >= WM_T_PCH2)
15644 return wm_set_eee_pchlan(sc);
15645
15646 return 0;
15647 }
15648
15649 /*
15650 * Workarounds (mainly PHY related).
15651 * Basically, PHY's workarounds are in the PHY drivers.
15652 */
15653
15654 /* Work-around for 82566 Kumeran PCS lock loss */
15655 static int
15656 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc)
15657 {
15658 struct mii_data *mii = &sc->sc_mii;
15659 uint32_t status = CSR_READ(sc, WMREG_STATUS);
15660 int i, reg, rv;
15661 uint16_t phyreg;
15662
15663 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15664 device_xname(sc->sc_dev), __func__));
15665
15666 /* If the link is not up, do nothing */
15667 if ((status & STATUS_LU) == 0)
15668 return 0;
15669
15670 /* Nothing to do if the link is other than 1Gbps */
15671 if (__SHIFTOUT(status, STATUS_SPEED) != STATUS_SPEED_1000)
15672 return 0;
15673
15674 for (i = 0; i < 10; i++) {
15675 /* read twice */
15676 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg);
15677 if (rv != 0)
15678 return rv;
15679 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg);
15680 if (rv != 0)
15681 return rv;
15682
15683 if ((phyreg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0)
15684 goto out; /* GOOD! */
15685
15686 /* Reset the PHY */
15687 wm_reset_phy(sc);
15688 delay(5*1000);
15689 }
15690
15691 /* Disable GigE link negotiation */
15692 reg = CSR_READ(sc, WMREG_PHY_CTRL);
15693 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
15694 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
15695
15696 /*
15697 * Call gig speed drop workaround on Gig disable before accessing
15698 * any PHY registers.
15699 */
15700 wm_gig_downshift_workaround_ich8lan(sc);
15701
15702 out:
15703 return 0;
15704 }
15705
15706 /*
15707 * wm_gig_downshift_workaround_ich8lan - WoL from S5 stops working
15708 * @sc: pointer to the HW structure
15709 *
15710 * Steps to take when dropping from 1Gb/s (eg. link cable removal (LSC),
15711 * LPLU, Gig disable, MDIC PHY reset):
15712 * 1) Set Kumeran Near-end loopback
15713 * 2) Clear Kumeran Near-end loopback
15714 * Should only be called for ICH8[m] devices with any 1G Phy.
15715 */
15716 static void
15717 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc)
15718 {
15719 uint16_t kmreg;
15720
15721 /* Only for igp3 */
15722 if (sc->sc_phytype == WMPHY_IGP_3) {
15723 if (wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG, &kmreg) != 0)
15724 return;
15725 kmreg |= KUMCTRLSTA_DIAG_NELPBK;
15726 if (wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg) != 0)
15727 return;
15728 kmreg &= ~KUMCTRLSTA_DIAG_NELPBK;
15729 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg);
15730 }
15731 }
15732
15733 /*
15734 * Workaround for pch's PHYs
15735 * XXX should be moved to new PHY driver?
15736 */
15737 static int
15738 wm_hv_phy_workarounds_ich8lan(struct wm_softc *sc)
15739 {
15740 device_t dev = sc->sc_dev;
15741 struct mii_data *mii = &sc->sc_mii;
15742 struct mii_softc *child;
15743 uint16_t phy_data, phyrev = 0;
15744 int phytype = sc->sc_phytype;
15745 int rv;
15746
15747 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15748 device_xname(dev), __func__));
15749 KASSERT(sc->sc_type == WM_T_PCH);
15750
15751 /* Set MDIO slow mode before any other MDIO access */
15752 if (phytype == WMPHY_82577)
15753 if ((rv = wm_set_mdio_slow_mode_hv(sc)) != 0)
15754 return rv;
15755
15756 child = LIST_FIRST(&mii->mii_phys);
15757 if (child != NULL)
15758 phyrev = child->mii_mpd_rev;
15759
15760 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/
15761 if ((child != NULL) &&
15762 (((phytype == WMPHY_82577) && ((phyrev == 1) || (phyrev == 2))) ||
15763 ((phytype == WMPHY_82578) && (phyrev == 1)))) {
15764 /* Disable generation of early preamble (0x4431) */
15765 rv = mii->mii_readreg(dev, 2, BM_RATE_ADAPTATION_CTRL,
15766 &phy_data);
15767 if (rv != 0)
15768 return rv;
15769 phy_data &= ~(BM_RATE_ADAPTATION_CTRL_RX_RXDV_PRE |
15770 BM_RATE_ADAPTATION_CTRL_RX_CRS_PRE);
15771 rv = mii->mii_writereg(dev, 2, BM_RATE_ADAPTATION_CTRL,
15772 phy_data);
15773 if (rv != 0)
15774 return rv;
15775
15776 /* Preamble tuning for SSC */
15777 rv = mii->mii_writereg(dev, 2, HV_KMRN_FIFO_CTRLSTA, 0xa204);
15778 if (rv != 0)
15779 return rv;
15780 }
15781
15782 /* 82578 */
15783 if (phytype == WMPHY_82578) {
15784 /*
15785 * Return registers to default by doing a soft reset then
15786 * writing 0x3140 to the control register
15787 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1
15788 */
15789 if ((child != NULL) && (phyrev < 2)) {
15790 PHY_RESET(child);
15791 rv = mii->mii_writereg(dev, 2, MII_BMCR, 0x3140);
15792 if (rv != 0)
15793 return rv;
15794 }
15795 }
15796
15797 /* Select page 0 */
15798 if ((rv = sc->phy.acquire(sc)) != 0)
15799 return rv;
15800 rv = wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT, 0);
15801 sc->phy.release(sc);
15802 if (rv != 0)
15803 return rv;
15804
15805 /*
15806 * Configure the K1 Si workaround during phy reset assuming there is
15807 * link so that it disables K1 if link is in 1Gbps.
15808 */
15809 if ((rv = wm_k1_gig_workaround_hv(sc, 1)) != 0)
15810 return rv;
15811
15812 /* Workaround for link disconnects on a busy hub in half duplex */
15813 rv = sc->phy.acquire(sc);
15814 if (rv)
15815 return rv;
15816 rv = sc->phy.readreg_locked(dev, 2, BM_PORT_GEN_CFG, &phy_data);
15817 if (rv)
15818 goto release;
15819 rv = sc->phy.writereg_locked(dev, 2, BM_PORT_GEN_CFG,
15820 phy_data & 0x00ff);
15821 if (rv)
15822 goto release;
15823
15824 /* Set MSE higher to enable link to stay up when noise is high */
15825 rv = wm_write_emi_reg_locked(dev, I82577_MSE_THRESHOLD, 0x0034);
15826 release:
15827 sc->phy.release(sc);
15828
15829 return rv;
15830 }
15831
15832 /*
15833 * wm_copy_rx_addrs_to_phy_ich8lan - Copy Rx addresses from MAC to PHY
15834 * @sc: pointer to the HW structure
15835 */
15836 static void
15837 wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *sc)
15838 {
15839 device_t dev = sc->sc_dev;
15840 uint32_t mac_reg;
15841 uint16_t i, wuce;
15842 int count;
15843
15844 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15845 device_xname(sc->sc_dev), __func__));
15846
15847 if (sc->phy.acquire(sc) != 0)
15848 return;
15849 if (wm_enable_phy_wakeup_reg_access_bm(dev, &wuce) != 0)
15850 goto release;
15851
15852 /* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */
15853 count = wm_rar_count(sc);
15854 for (i = 0; i < count; i++) {
15855 uint16_t lo, hi;
15856 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAL(i));
15857 lo = (uint16_t)(mac_reg & 0xffff);
15858 hi = (uint16_t)((mac_reg >> 16) & 0xffff);
15859 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_L(i), &lo, 0, true);
15860 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_M(i), &hi, 0, true);
15861
15862 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAH(i));
15863 lo = (uint16_t)(mac_reg & 0xffff);
15864 hi = (uint16_t)((mac_reg & RAL_AV) >> 16);
15865 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_H(i), &lo, 0, true);
15866 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_CTRL(i), &hi, 0, true);
15867 }
15868
15869 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce);
15870
15871 release:
15872 sc->phy.release(sc);
15873 }
15874
15875 /*
15876 * wm_lv_phy_workarounds_ich8lan - A series of Phy workarounds to be
15877 * done after every PHY reset.
15878 */
15879 static int
15880 wm_lv_phy_workarounds_ich8lan(struct wm_softc *sc)
15881 {
15882 device_t dev = sc->sc_dev;
15883 int rv;
15884
15885 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15886 device_xname(dev), __func__));
15887 KASSERT(sc->sc_type == WM_T_PCH2);
15888
15889 /* Set MDIO slow mode before any other MDIO access */
15890 rv = wm_set_mdio_slow_mode_hv(sc);
15891 if (rv != 0)
15892 return rv;
15893
15894 rv = sc->phy.acquire(sc);
15895 if (rv != 0)
15896 return rv;
15897 /* Set MSE higher to enable link to stay up when noise is high */
15898 rv = wm_write_emi_reg_locked(dev, I82579_MSE_THRESHOLD, 0x0034);
15899 if (rv != 0)
15900 goto release;
15901 /* Drop link after 5 times MSE threshold was reached */
15902 rv = wm_write_emi_reg_locked(dev, I82579_MSE_LINK_DOWN, 0x0005);
15903 release:
15904 sc->phy.release(sc);
15905
15906 return rv;
15907 }
15908
15909 /**
15910 * wm_k1_workaround_lpt_lp - K1 workaround on Lynxpoint-LP
15911 * @link: link up bool flag
15912 *
15913 * When K1 is enabled for 1Gbps, the MAC can miss 2 DMA completion indications
15914 * preventing further DMA write requests. Workaround the issue by disabling
15915 * the de-assertion of the clock request when in 1Gpbs mode.
15916 * Also, set appropriate Tx re-transmission timeouts for 10 and 100Half link
15917 * speeds in order to avoid Tx hangs.
15918 **/
15919 static int
15920 wm_k1_workaround_lpt_lp(struct wm_softc *sc, bool link)
15921 {
15922 uint32_t fextnvm6 = CSR_READ(sc, WMREG_FEXTNVM6);
15923 uint32_t status = CSR_READ(sc, WMREG_STATUS);
15924 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED);
15925 uint16_t phyreg;
15926
15927 if (link && (speed == STATUS_SPEED_1000)) {
15928 sc->phy.acquire(sc);
15929 int rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG,
15930 &phyreg);
15931 if (rv != 0)
15932 goto release;
15933 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG,
15934 phyreg & ~KUMCTRLSTA_K1_ENABLE);
15935 if (rv != 0)
15936 goto release;
15937 delay(20);
15938 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6 | FEXTNVM6_REQ_PLL_CLK);
15939
15940 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG,
15941 &phyreg);
15942 release:
15943 sc->phy.release(sc);
15944 return rv;
15945 }
15946
15947 fextnvm6 &= ~FEXTNVM6_REQ_PLL_CLK;
15948
15949 struct mii_softc *child = LIST_FIRST(&sc->sc_mii.mii_phys);
15950 if (((child != NULL) && (child->mii_mpd_rev > 5))
15951 || !link
15952 || ((speed == STATUS_SPEED_100) && (status & STATUS_FD)))
15953 goto update_fextnvm6;
15954
15955 wm_gmii_hv_readreg(sc->sc_dev, 2, I217_INBAND_CTRL, &phyreg);
15956
15957 /* Clear link status transmit timeout */
15958 phyreg &= ~I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_MASK;
15959 if (speed == STATUS_SPEED_100) {
15960 /* Set inband Tx timeout to 5x10us for 100Half */
15961 phyreg |= 5 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT;
15962
15963 /* Do not extend the K1 entry latency for 100Half */
15964 fextnvm6 &= ~FEXTNVM6_ENABLE_K1_ENTRY_CONDITION;
15965 } else {
15966 /* Set inband Tx timeout to 50x10us for 10Full/Half */
15967 phyreg |= 50 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT;
15968
15969 /* Extend the K1 entry latency for 10 Mbps */
15970 fextnvm6 |= FEXTNVM6_ENABLE_K1_ENTRY_CONDITION;
15971 }
15972
15973 wm_gmii_hv_writereg(sc->sc_dev, 2, I217_INBAND_CTRL, phyreg);
15974
15975 update_fextnvm6:
15976 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6);
15977 return 0;
15978 }
15979
15980 /*
15981 * wm_k1_gig_workaround_hv - K1 Si workaround
15982 * @sc: pointer to the HW structure
15983 * @link: link up bool flag
15984 *
15985 * If K1 is enabled for 1Gbps, the MAC might stall when transitioning
15986 * from a lower speed. This workaround disables K1 whenever link is at 1Gig
15987 * If link is down, the function will restore the default K1 setting located
15988 * in the NVM.
15989 */
15990 static int
15991 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link)
15992 {
15993 int k1_enable = sc->sc_nvm_k1_enabled;
15994
15995 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
15996 device_xname(sc->sc_dev), __func__));
15997
15998 if (sc->phy.acquire(sc) != 0)
15999 return -1;
16000
16001 if (link) {
16002 k1_enable = 0;
16003
16004 /* Link stall fix for link up */
16005 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG,
16006 0x0100);
16007 } else {
16008 /* Link stall fix for link down */
16009 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG,
16010 0x4100);
16011 }
16012
16013 wm_configure_k1_ich8lan(sc, k1_enable);
16014 sc->phy.release(sc);
16015
16016 return 0;
16017 }
16018
16019 /*
16020 * wm_k1_workaround_lv - K1 Si workaround
16021 * @sc: pointer to the HW structure
16022 *
16023 * Workaround to set the K1 beacon duration for 82579 parts in 10Mbps
16024 * Disable K1 for 1000 and 100 speeds
16025 */
16026 static int
16027 wm_k1_workaround_lv(struct wm_softc *sc)
16028 {
16029 uint32_t reg;
16030 uint16_t phyreg;
16031 int rv;
16032
16033 if (sc->sc_type != WM_T_PCH2)
16034 return 0;
16035
16036 /* Set K1 beacon duration based on 10Mbps speed */
16037 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, HV_M_STATUS, &phyreg);
16038 if (rv != 0)
16039 return rv;
16040
16041 if ((phyreg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE))
16042 == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) {
16043 if (phyreg &
16044 (HV_M_STATUS_SPEED_1000 | HV_M_STATUS_SPEED_100)) {
16045 /* LV 1G/100 Packet drop issue wa */
16046 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_PM_CTRL,
16047 &phyreg);
16048 if (rv != 0)
16049 return rv;
16050 phyreg &= ~HV_PM_CTRL_K1_ENA;
16051 rv = wm_gmii_hv_writereg(sc->sc_dev, 1, HV_PM_CTRL,
16052 phyreg);
16053 if (rv != 0)
16054 return rv;
16055 } else {
16056 /* For 10Mbps */
16057 reg = CSR_READ(sc, WMREG_FEXTNVM4);
16058 reg &= ~FEXTNVM4_BEACON_DURATION;
16059 reg |= FEXTNVM4_BEACON_DURATION_16US;
16060 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
16061 }
16062 }
16063
16064 return 0;
16065 }
16066
16067 /*
16068 * wm_link_stall_workaround_hv - Si workaround
16069 * @sc: pointer to the HW structure
16070 *
16071 * This function works around a Si bug where the link partner can get
16072 * a link up indication before the PHY does. If small packets are sent
16073 * by the link partner they can be placed in the packet buffer without
16074 * being properly accounted for by the PHY and will stall preventing
16075 * further packets from being received. The workaround is to clear the
16076 * packet buffer after the PHY detects link up.
16077 */
16078 static int
16079 wm_link_stall_workaround_hv(struct wm_softc *sc)
16080 {
16081 uint16_t phyreg;
16082
16083 if (sc->sc_phytype != WMPHY_82578)
16084 return 0;
16085
16086 /* Do not apply workaround if in PHY loopback bit 14 set */
16087 wm_gmii_hv_readreg(sc->sc_dev, 2, MII_BMCR, &phyreg);
16088 if ((phyreg & BMCR_LOOP) != 0)
16089 return 0;
16090
16091 /* Check if link is up and at 1Gbps */
16092 wm_gmii_hv_readreg(sc->sc_dev, 2, BM_CS_STATUS, &phyreg);
16093 phyreg &= BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED
16094 | BM_CS_STATUS_SPEED_MASK;
16095 if (phyreg != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED
16096 | BM_CS_STATUS_SPEED_1000))
16097 return 0;
16098
16099 delay(200 * 1000); /* XXX too big */
16100
16101 /* Flush the packets in the fifo buffer */
16102 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL,
16103 HV_MUX_DATA_CTRL_GEN_TO_MAC | HV_MUX_DATA_CTRL_FORCE_SPEED);
16104 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL,
16105 HV_MUX_DATA_CTRL_GEN_TO_MAC);
16106
16107 return 0;
16108 }
16109
16110 static int
16111 wm_set_mdio_slow_mode_hv(struct wm_softc *sc)
16112 {
16113 int rv;
16114 uint16_t reg;
16115
16116 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, ®);
16117 if (rv != 0)
16118 return rv;
16119
16120 return wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL,
16121 reg | HV_KMRN_MDIO_SLOW);
16122 }
16123
16124 /*
16125 * wm_configure_k1_ich8lan - Configure K1 power state
16126 * @sc: pointer to the HW structure
16127 * @enable: K1 state to configure
16128 *
16129 * Configure the K1 power state based on the provided parameter.
16130 * Assumes semaphore already acquired.
16131 */
16132 static void
16133 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable)
16134 {
16135 uint32_t ctrl, ctrl_ext, tmp;
16136 uint16_t kmreg;
16137 int rv;
16138
16139 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP);
16140
16141 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, &kmreg);
16142 if (rv != 0)
16143 return;
16144
16145 if (k1_enable)
16146 kmreg |= KUMCTRLSTA_K1_ENABLE;
16147 else
16148 kmreg &= ~KUMCTRLSTA_K1_ENABLE;
16149
16150 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmreg);
16151 if (rv != 0)
16152 return;
16153
16154 delay(20);
16155
16156 ctrl = CSR_READ(sc, WMREG_CTRL);
16157 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
16158
16159 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100);
16160 tmp |= CTRL_FRCSPD;
16161
16162 CSR_WRITE(sc, WMREG_CTRL, tmp);
16163 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS);
16164 CSR_WRITE_FLUSH(sc);
16165 delay(20);
16166
16167 CSR_WRITE(sc, WMREG_CTRL, ctrl);
16168 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
16169 CSR_WRITE_FLUSH(sc);
16170 delay(20);
16171
16172 return;
16173 }
16174
16175 /* special case - for 82575 - need to do manual init ... */
16176 static void
16177 wm_reset_init_script_82575(struct wm_softc *sc)
16178 {
16179 /*
16180 * Remark: this is untested code - we have no board without EEPROM
16181 * same setup as mentioned int the FreeBSD driver for the i82575
16182 */
16183
16184 /* SerDes configuration via SERDESCTRL */
16185 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c);
16186 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
16187 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23);
16188 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
16189
16190 /* CCM configuration via CCMCTL register */
16191 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
16192 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
16193
16194 /* PCIe lanes configuration */
16195 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec);
16196 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf);
16197 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
16198 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81);
16199
16200 /* PCIe PLL Configuration */
16201 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
16202 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
16203 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
16204 }
16205
16206 static void
16207 wm_reset_mdicnfg_82580(struct wm_softc *sc)
16208 {
16209 uint32_t reg;
16210 uint16_t nvmword;
16211 int rv;
16212
16213 if (sc->sc_type != WM_T_82580)
16214 return;
16215 if ((sc->sc_flags & WM_F_SGMII) == 0)
16216 return;
16217
16218 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid)
16219 + NVM_OFF_CFG3_PORTA, 1, &nvmword);
16220 if (rv != 0) {
16221 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n",
16222 __func__);
16223 return;
16224 }
16225
16226 reg = CSR_READ(sc, WMREG_MDICNFG);
16227 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO)
16228 reg |= MDICNFG_DEST;
16229 if (nvmword & NVM_CFG3_PORTA_COM_MDIO)
16230 reg |= MDICNFG_COM_MDIO;
16231 CSR_WRITE(sc, WMREG_MDICNFG, reg);
16232 }
16233
16234 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff))
16235
16236 static bool
16237 wm_phy_is_accessible_pchlan(struct wm_softc *sc)
16238 {
16239 uint32_t reg;
16240 uint16_t id1, id2;
16241 int i, rv;
16242
16243 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
16244 device_xname(sc->sc_dev), __func__));
16245 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP);
16246
16247 id1 = id2 = 0xffff;
16248 for (i = 0; i < 2; i++) {
16249 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1,
16250 &id1);
16251 if ((rv != 0) || MII_INVALIDID(id1))
16252 continue;
16253 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2,
16254 &id2);
16255 if ((rv != 0) || MII_INVALIDID(id2))
16256 continue;
16257 break;
16258 }
16259 if ((rv == 0) && !MII_INVALIDID(id1) && !MII_INVALIDID(id2))
16260 goto out;
16261
16262 /*
16263 * In case the PHY needs to be in mdio slow mode,
16264 * set slow mode and try to get the PHY id again.
16265 */
16266 rv = 0;
16267 if (sc->sc_type < WM_T_PCH_LPT) {
16268 sc->phy.release(sc);
16269 wm_set_mdio_slow_mode_hv(sc);
16270 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR1, &id1);
16271 rv |= wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR2, &id2);
16272 sc->phy.acquire(sc);
16273 }
16274 if ((rv != 0) || MII_INVALIDID(id1) || MII_INVALIDID(id2)) {
16275 device_printf(sc->sc_dev, "XXX return with false\n");
16276 return false;
16277 }
16278 out:
16279 if (sc->sc_type >= WM_T_PCH_LPT) {
16280 /* Only unforce SMBus if ME is not active */
16281 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
16282 uint16_t phyreg;
16283
16284 /* Unforce SMBus mode in PHY */
16285 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2,
16286 CV_SMB_CTRL, &phyreg);
16287 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS;
16288 wm_gmii_hv_writereg_locked(sc->sc_dev, 2,
16289 CV_SMB_CTRL, phyreg);
16290
16291 /* Unforce SMBus mode in MAC */
16292 reg = CSR_READ(sc, WMREG_CTRL_EXT);
16293 reg &= ~CTRL_EXT_FORCE_SMBUS;
16294 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
16295 }
16296 }
16297 return true;
16298 }
16299
16300 static void
16301 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc)
16302 {
16303 uint32_t reg;
16304 int i;
16305
16306 /* Set PHY Config Counter to 50msec */
16307 reg = CSR_READ(sc, WMREG_FEXTNVM3);
16308 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
16309 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
16310 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
16311
16312 /* Toggle LANPHYPC */
16313 reg = CSR_READ(sc, WMREG_CTRL);
16314 reg |= CTRL_LANPHYPC_OVERRIDE;
16315 reg &= ~CTRL_LANPHYPC_VALUE;
16316 CSR_WRITE(sc, WMREG_CTRL, reg);
16317 CSR_WRITE_FLUSH(sc);
16318 delay(1000);
16319 reg &= ~CTRL_LANPHYPC_OVERRIDE;
16320 CSR_WRITE(sc, WMREG_CTRL, reg);
16321 CSR_WRITE_FLUSH(sc);
16322
16323 if (sc->sc_type < WM_T_PCH_LPT)
16324 delay(50 * 1000);
16325 else {
16326 i = 20;
16327
16328 do {
16329 delay(5 * 1000);
16330 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0)
16331 && i--);
16332
16333 delay(30 * 1000);
16334 }
16335 }
16336
16337 static int
16338 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link)
16339 {
16340 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ)
16341 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND;
16342 uint32_t rxa;
16343 uint16_t scale = 0, lat_enc = 0;
16344 int32_t obff_hwm = 0;
16345 int64_t lat_ns, value;
16346
16347 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
16348 device_xname(sc->sc_dev), __func__));
16349
16350 if (link) {
16351 uint16_t max_snoop, max_nosnoop, max_ltr_enc;
16352 uint32_t status;
16353 uint16_t speed;
16354 pcireg_t preg;
16355
16356 status = CSR_READ(sc, WMREG_STATUS);
16357 switch (__SHIFTOUT(status, STATUS_SPEED)) {
16358 case STATUS_SPEED_10:
16359 speed = 10;
16360 break;
16361 case STATUS_SPEED_100:
16362 speed = 100;
16363 break;
16364 case STATUS_SPEED_1000:
16365 speed = 1000;
16366 break;
16367 default:
16368 device_printf(sc->sc_dev, "Unknown speed "
16369 "(status = %08x)\n", status);
16370 return -1;
16371 }
16372
16373 /* Rx Packet Buffer Allocation size (KB) */
16374 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK;
16375
16376 /*
16377 * Determine the maximum latency tolerated by the device.
16378 *
16379 * Per the PCIe spec, the tolerated latencies are encoded as
16380 * a 3-bit encoded scale (only 0-5 are valid) multiplied by
16381 * a 10-bit value (0-1023) to provide a range from 1 ns to
16382 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns,
16383 * 1=2^5ns, 2=2^10ns,...5=2^25ns.
16384 */
16385 lat_ns = ((int64_t)rxa * 1024 -
16386 (2 * ((int64_t)sc->sc_ethercom.ec_if.if_mtu
16387 + ETHER_HDR_LEN))) * 8 * 1000;
16388 if (lat_ns < 0)
16389 lat_ns = 0;
16390 else
16391 lat_ns /= speed;
16392 value = lat_ns;
16393
16394 while (value > LTRV_VALUE) {
16395 scale ++;
16396 value = howmany(value, __BIT(5));
16397 }
16398 if (scale > LTRV_SCALE_MAX) {
16399 device_printf(sc->sc_dev,
16400 "Invalid LTR latency scale %d\n", scale);
16401 return -1;
16402 }
16403 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value);
16404
16405 /* Determine the maximum latency tolerated by the platform */
16406 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
16407 WM_PCI_LTR_CAP_LPT);
16408 max_snoop = preg & 0xffff;
16409 max_nosnoop = preg >> 16;
16410
16411 max_ltr_enc = MAX(max_snoop, max_nosnoop);
16412
16413 if (lat_enc > max_ltr_enc) {
16414 lat_enc = max_ltr_enc;
16415 lat_ns = __SHIFTOUT(lat_enc, PCI_LTR_MAXSNOOPLAT_VAL)
16416 * PCI_LTR_SCALETONS(
16417 __SHIFTOUT(lat_enc,
16418 PCI_LTR_MAXSNOOPLAT_SCALE));
16419 }
16420
16421 if (lat_ns) {
16422 lat_ns *= speed * 1000;
16423 lat_ns /= 8;
16424 lat_ns /= 1000000000;
16425 obff_hwm = (int32_t)(rxa - lat_ns);
16426 }
16427 if ((obff_hwm < 0) || (obff_hwm > SVT_OFF_HWM)) {
16428 device_printf(sc->sc_dev, "Invalid high water mark %d"
16429 "(rxa = %d, lat_ns = %d)\n",
16430 obff_hwm, (int32_t)rxa, (int32_t)lat_ns);
16431 return -1;
16432 }
16433 }
16434 /* Snoop and No-Snoop latencies the same */
16435 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP);
16436 CSR_WRITE(sc, WMREG_LTRV, reg);
16437
16438 /* Set OBFF high water mark */
16439 reg = CSR_READ(sc, WMREG_SVT) & ~SVT_OFF_HWM;
16440 reg |= obff_hwm;
16441 CSR_WRITE(sc, WMREG_SVT, reg);
16442
16443 /* Enable OBFF */
16444 reg = CSR_READ(sc, WMREG_SVCR);
16445 reg |= SVCR_OFF_EN | SVCR_OFF_MASKINT;
16446 CSR_WRITE(sc, WMREG_SVCR, reg);
16447
16448 return 0;
16449 }
16450
16451 /*
16452 * I210 Errata 25 and I211 Errata 10
16453 * Slow System Clock.
16454 *
16455 * Note that this function is called on both FLASH and iNVM case on NetBSD.
16456 */
16457 static int
16458 wm_pll_workaround_i210(struct wm_softc *sc)
16459 {
16460 uint32_t mdicnfg, wuc;
16461 uint32_t reg;
16462 pcireg_t pcireg;
16463 uint32_t pmreg;
16464 uint16_t nvmword, tmp_nvmword;
16465 uint16_t phyval;
16466 bool wa_done = false;
16467 int i, rv = 0;
16468
16469 /* Get Power Management cap offset */
16470 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
16471 &pmreg, NULL) == 0)
16472 return -1;
16473
16474 /* Save WUC and MDICNFG registers */
16475 wuc = CSR_READ(sc, WMREG_WUC);
16476 mdicnfg = CSR_READ(sc, WMREG_MDICNFG);
16477
16478 reg = mdicnfg & ~MDICNFG_DEST;
16479 CSR_WRITE(sc, WMREG_MDICNFG, reg);
16480
16481 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0) {
16482 /*
16483 * The default value of the Initialization Control Word 1
16484 * is the same on both I210's FLASH_HW and I21[01]'s iNVM.
16485 */
16486 nvmword = INVM_DEFAULT_AL;
16487 }
16488 tmp_nvmword = nvmword | INVM_PLL_WO_VAL;
16489
16490 for (i = 0; i < WM_MAX_PLL_TRIES; i++) {
16491 wm_gmii_gs40g_readreg(sc->sc_dev, 1,
16492 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG, &phyval);
16493
16494 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) {
16495 rv = 0;
16496 break; /* OK */
16497 } else
16498 rv = -1;
16499
16500 wa_done = true;
16501 /* Directly reset the internal PHY */
16502 reg = CSR_READ(sc, WMREG_CTRL);
16503 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
16504
16505 reg = CSR_READ(sc, WMREG_CTRL_EXT);
16506 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE;
16507 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
16508
16509 CSR_WRITE(sc, WMREG_WUC, 0);
16510 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16);
16511 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
16512
16513 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
16514 pmreg + PCI_PMCSR);
16515 pcireg |= PCI_PMCSR_STATE_D3;
16516 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
16517 pmreg + PCI_PMCSR, pcireg);
16518 delay(1000);
16519 pcireg &= ~PCI_PMCSR_STATE_D3;
16520 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
16521 pmreg + PCI_PMCSR, pcireg);
16522
16523 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16);
16524 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
16525
16526 /* Restore WUC register */
16527 CSR_WRITE(sc, WMREG_WUC, wuc);
16528 }
16529
16530 /* Restore MDICNFG setting */
16531 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg);
16532 if (wa_done)
16533 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n");
16534 return rv;
16535 }
16536
16537 static void
16538 wm_legacy_irq_quirk_spt(struct wm_softc *sc)
16539 {
16540 uint32_t reg;
16541
16542 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
16543 device_xname(sc->sc_dev), __func__));
16544 KASSERT((sc->sc_type == WM_T_PCH_SPT)
16545 || (sc->sc_type == WM_T_PCH_CNP));
16546
16547 reg = CSR_READ(sc, WMREG_FEXTNVM7);
16548 reg |= FEXTNVM7_SIDE_CLK_UNGATE;
16549 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
16550
16551 reg = CSR_READ(sc, WMREG_FEXTNVM9);
16552 reg |= FEXTNVM9_IOSFSB_CLKGATE_DIS | FEXTNVM9_IOSFSB_CLKREQ_DIS;
16553 CSR_WRITE(sc, WMREG_FEXTNVM9, reg);
16554 }
16555