if_wm.c revision 1.715 1 /* $NetBSD: if_wm.c,v 1.715 2021/10/20 08:10:26 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.715 2021/10/20 08:10:26 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 #include <sys/atomic.h>
111
112 #include <sys/rndsource.h>
113
114 #include <net/if.h>
115 #include <net/if_dl.h>
116 #include <net/if_media.h>
117 #include <net/if_ether.h>
118
119 #include <net/bpf.h>
120
121 #include <net/rss_config.h>
122
123 #include <netinet/in.h> /* XXX for struct ip */
124 #include <netinet/in_systm.h> /* XXX for struct ip */
125 #include <netinet/ip.h> /* XXX for struct ip */
126 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */
127 #include <netinet/tcp.h> /* XXX for struct tcphdr */
128
129 #include <sys/bus.h>
130 #include <sys/intr.h>
131 #include <machine/endian.h>
132
133 #include <dev/mii/mii.h>
134 #include <dev/mii/mdio.h>
135 #include <dev/mii/miivar.h>
136 #include <dev/mii/miidevs.h>
137 #include <dev/mii/mii_bitbang.h>
138 #include <dev/mii/ikphyreg.h>
139 #include <dev/mii/igphyreg.h>
140 #include <dev/mii/igphyvar.h>
141 #include <dev/mii/inbmphyreg.h>
142 #include <dev/mii/ihphyreg.h>
143 #include <dev/mii/makphyreg.h>
144
145 #include <dev/pci/pcireg.h>
146 #include <dev/pci/pcivar.h>
147 #include <dev/pci/pcidevs.h>
148
149 #include <dev/pci/if_wmreg.h>
150 #include <dev/pci/if_wmvar.h>
151
152 #ifdef WM_DEBUG
153 #define WM_DEBUG_LINK __BIT(0)
154 #define WM_DEBUG_TX __BIT(1)
155 #define WM_DEBUG_RX __BIT(2)
156 #define WM_DEBUG_GMII __BIT(3)
157 #define WM_DEBUG_MANAGE __BIT(4)
158 #define WM_DEBUG_NVM __BIT(5)
159 #define WM_DEBUG_INIT __BIT(6)
160 #define WM_DEBUG_LOCK __BIT(7)
161
162 #if 0
163 #define WM_DEBUG_DEFAULT WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | \
164 WM_DEBUG_GMII | WM_DEBUG_MANAGE | WM_DEBUG_NVM | WM_DEBUG_INIT | \
165 WM_DEBUG_LOCK
166 #endif
167
168 #define DPRINTF(sc, x, y) \
169 do { \
170 if ((sc)->sc_debug & (x)) \
171 printf y; \
172 } while (0)
173 #else
174 #define DPRINTF(sc, x, y) __nothing
175 #endif /* WM_DEBUG */
176
177 #ifdef NET_MPSAFE
178 #define WM_MPSAFE 1
179 #define WM_CALLOUT_FLAGS CALLOUT_MPSAFE
180 #define WM_SOFTINT_FLAGS SOFTINT_MPSAFE
181 #define WM_WORKQUEUE_FLAGS WQ_PERCPU | WQ_MPSAFE
182 #else
183 #define WM_CALLOUT_FLAGS 0
184 #define WM_SOFTINT_FLAGS 0
185 #define WM_WORKQUEUE_FLAGS WQ_PERCPU
186 #endif
187
188 #define WM_WORKQUEUE_PRI PRI_SOFTNET
189
190 /*
191 * This device driver's max interrupt numbers.
192 */
193 #define WM_MAX_NQUEUEINTR 16
194 #define WM_MAX_NINTR (WM_MAX_NQUEUEINTR + 1)
195
196 #ifndef WM_DISABLE_MSI
197 #define WM_DISABLE_MSI 0
198 #endif
199 #ifndef WM_DISABLE_MSIX
200 #define WM_DISABLE_MSIX 0
201 #endif
202
203 int wm_disable_msi = WM_DISABLE_MSI;
204 int wm_disable_msix = WM_DISABLE_MSIX;
205
206 #ifndef WM_WATCHDOG_TIMEOUT
207 #define WM_WATCHDOG_TIMEOUT 5
208 #endif
209 static int wm_watchdog_timeout = WM_WATCHDOG_TIMEOUT;
210
211 /*
212 * Transmit descriptor list size. Due to errata, we can only have
213 * 256 hardware descriptors in the ring on < 82544, but we use 4096
214 * on >= 82544. We tell the upper layers that they can queue a lot
215 * of packets, and we go ahead and manage up to 64 (16 for the i82547)
216 * of them at a time.
217 *
218 * We allow up to 64 DMA segments per packet. Pathological packet
219 * chains containing many small mbufs have been observed in zero-copy
220 * situations with jumbo frames. If a mbuf chain has more than 64 DMA segments,
221 * m_defrag() is called to reduce it.
222 */
223 #define WM_NTXSEGS 64
224 #define WM_IFQUEUELEN 256
225 #define WM_TXQUEUELEN_MAX 64
226 #define WM_TXQUEUELEN_MAX_82547 16
227 #define WM_TXQUEUELEN(txq) ((txq)->txq_num)
228 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1)
229 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8)
230 #define WM_NTXDESC_82542 256
231 #define WM_NTXDESC_82544 4096
232 #define WM_NTXDESC(txq) ((txq)->txq_ndesc)
233 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1)
234 #define WM_TXDESCS_SIZE(txq) (WM_NTXDESC(txq) * (txq)->txq_descsize)
235 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq))
236 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq))
237
238 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */
239
240 #define WM_TXINTERQSIZE 256
241
242 #ifndef WM_TX_PROCESS_LIMIT_DEFAULT
243 #define WM_TX_PROCESS_LIMIT_DEFAULT 100U
244 #endif
245 #ifndef WM_TX_INTR_PROCESS_LIMIT_DEFAULT
246 #define WM_TX_INTR_PROCESS_LIMIT_DEFAULT 0U
247 #endif
248
249 /*
250 * Receive descriptor list size. We have one Rx buffer for normal
251 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized
252 * packet. We allocate 256 receive descriptors, each with a 2k
253 * buffer (MCLBYTES), which gives us room for 50 jumbo packets.
254 */
255 #define WM_NRXDESC 256U
256 #define WM_NRXDESC_MASK (WM_NRXDESC - 1)
257 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK)
258 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK)
259
260 #ifndef WM_RX_PROCESS_LIMIT_DEFAULT
261 #define WM_RX_PROCESS_LIMIT_DEFAULT 100U
262 #endif
263 #ifndef WM_RX_INTR_PROCESS_LIMIT_DEFAULT
264 #define WM_RX_INTR_PROCESS_LIMIT_DEFAULT 0U
265 #endif
266
267 typedef union txdescs {
268 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544];
269 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544];
270 } txdescs_t;
271
272 typedef union rxdescs {
273 wiseman_rxdesc_t sctxu_rxdescs[WM_NRXDESC];
274 ext_rxdesc_t sctxu_ext_rxdescs[WM_NRXDESC]; /* 82574 only */
275 nq_rxdesc_t sctxu_nq_rxdescs[WM_NRXDESC]; /* 82575 and newer */
276 } rxdescs_t;
277
278 #define WM_CDTXOFF(txq, x) ((txq)->txq_descsize * (x))
279 #define WM_CDRXOFF(rxq, x) ((rxq)->rxq_descsize * (x))
280
281 /*
282 * Software state for transmit jobs.
283 */
284 struct wm_txsoft {
285 struct mbuf *txs_mbuf; /* head of our mbuf chain */
286 bus_dmamap_t txs_dmamap; /* our DMA map */
287 int txs_firstdesc; /* first descriptor in packet */
288 int txs_lastdesc; /* last descriptor in packet */
289 int txs_ndesc; /* # of descriptors used */
290 };
291
292 /*
293 * Software state for receive buffers. Each descriptor gets a 2k (MCLBYTES)
294 * buffer and a DMA map. For packets which fill more than one buffer, we chain
295 * them together.
296 */
297 struct wm_rxsoft {
298 struct mbuf *rxs_mbuf; /* head of our mbuf chain */
299 bus_dmamap_t rxs_dmamap; /* our DMA map */
300 };
301
302 #define WM_LINKUP_TIMEOUT 50
303
304 static uint16_t swfwphysem[] = {
305 SWFW_PHY0_SM,
306 SWFW_PHY1_SM,
307 SWFW_PHY2_SM,
308 SWFW_PHY3_SM
309 };
310
311 static const uint32_t wm_82580_rxpbs_table[] = {
312 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140
313 };
314
315 struct wm_softc;
316
317 #if defined(_LP64) && !defined(WM_DISABLE_EVENT_COUNTERS)
318 #if !defined(WM_EVENT_COUNTERS)
319 #define WM_EVENT_COUNTERS 1
320 #endif
321 #endif
322
323 #ifdef WM_EVENT_COUNTERS
324 #define WM_Q_EVCNT_DEFINE(qname, evname) \
325 char qname##_##evname##_evcnt_name[sizeof("qname##XX##evname")]; \
326 struct evcnt qname##_ev_##evname;
327
328 #define WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, evtype) \
329 do { \
330 snprintf((q)->qname##_##evname##_evcnt_name, \
331 sizeof((q)->qname##_##evname##_evcnt_name), \
332 "%s%02d%s", #qname, (qnum), #evname); \
333 evcnt_attach_dynamic(&(q)->qname##_ev_##evname, \
334 (evtype), NULL, (xname), \
335 (q)->qname##_##evname##_evcnt_name); \
336 } while (0)
337
338 #define WM_Q_MISC_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
339 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_MISC)
340
341 #define WM_Q_INTR_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
342 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_INTR)
343
344 #define WM_Q_EVCNT_DETACH(qname, evname, q, qnum) \
345 evcnt_detach(&(q)->qname##_ev_##evname);
346 #endif /* WM_EVENT_COUNTERS */
347
348 struct wm_txqueue {
349 kmutex_t *txq_lock; /* lock for tx operations */
350
351 struct wm_softc *txq_sc; /* shortcut (skip struct wm_queue) */
352
353 /* Software state for the transmit descriptors. */
354 int txq_num; /* must be a power of two */
355 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX];
356
357 /* TX control data structures. */
358 int txq_ndesc; /* must be a power of two */
359 size_t txq_descsize; /* a tx descriptor size */
360 txdescs_t *txq_descs_u;
361 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */
362 bus_dma_segment_t txq_desc_seg; /* control data segment */
363 int txq_desc_rseg; /* real number of control segment */
364 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr
365 #define txq_descs txq_descs_u->sctxu_txdescs
366 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs
367
368 bus_addr_t txq_tdt_reg; /* offset of TDT register */
369
370 int txq_free; /* number of free Tx descriptors */
371 int txq_next; /* next ready Tx descriptor */
372
373 int txq_sfree; /* number of free Tx jobs */
374 int txq_snext; /* next free Tx job */
375 int txq_sdirty; /* dirty Tx jobs */
376
377 /* These 4 variables are used only on the 82547. */
378 int txq_fifo_size; /* Tx FIFO size */
379 int txq_fifo_head; /* current head of FIFO */
380 uint32_t txq_fifo_addr; /* internal address of start of FIFO */
381 int txq_fifo_stall; /* Tx FIFO is stalled */
382
383 /*
384 * When ncpu > number of Tx queues, a Tx queue is shared by multiple
385 * CPUs. This queue intermediate them without block.
386 */
387 pcq_t *txq_interq;
388
389 /*
390 * NEWQUEUE devices must use not ifp->if_flags but txq->txq_flags
391 * to manage Tx H/W queue's busy flag.
392 */
393 int txq_flags; /* flags for H/W queue, see below */
394 #define WM_TXQ_NO_SPACE 0x1
395 #define WM_TXQ_LINKDOWN_DISCARD 0x2
396
397 bool txq_stopping;
398
399 bool txq_sending;
400 time_t txq_lastsent;
401
402 /* Checksum flags used for previous packet */
403 uint32_t txq_last_hw_cmd;
404 uint8_t txq_last_hw_fields;
405 uint16_t txq_last_hw_ipcs;
406 uint16_t txq_last_hw_tucs;
407
408 uint32_t txq_packets; /* for AIM */
409 uint32_t txq_bytes; /* for AIM */
410 #ifdef WM_EVENT_COUNTERS
411 /* TX event counters */
412 WM_Q_EVCNT_DEFINE(txq, txsstall) /* Stalled due to no txs */
413 WM_Q_EVCNT_DEFINE(txq, txdstall) /* Stalled due to no txd */
414 WM_Q_EVCNT_DEFINE(txq, fifo_stall) /* FIFO stalls (82547) */
415 WM_Q_EVCNT_DEFINE(txq, txdw) /* Tx descriptor interrupts */
416 WM_Q_EVCNT_DEFINE(txq, txqe) /* Tx queue empty interrupts */
417 /* XXX not used? */
418
419 WM_Q_EVCNT_DEFINE(txq, ipsum) /* IP checksums comp. */
420 WM_Q_EVCNT_DEFINE(txq, tusum) /* TCP/UDP cksums comp. */
421 WM_Q_EVCNT_DEFINE(txq, tusum6) /* TCP/UDP v6 cksums comp. */
422 WM_Q_EVCNT_DEFINE(txq, tso) /* TCP seg offload (IPv4) */
423 WM_Q_EVCNT_DEFINE(txq, tso6) /* TCP seg offload (IPv6) */
424 WM_Q_EVCNT_DEFINE(txq, tsopain) /* Painful header manip. for TSO */
425 WM_Q_EVCNT_DEFINE(txq, pcqdrop) /* Pkt dropped in pcq */
426 WM_Q_EVCNT_DEFINE(txq, descdrop) /* Pkt dropped in MAC desc ring */
427 /* other than toomanyseg */
428
429 WM_Q_EVCNT_DEFINE(txq, toomanyseg) /* Pkt dropped(toomany DMA segs) */
430 WM_Q_EVCNT_DEFINE(txq, defrag) /* m_defrag() */
431 WM_Q_EVCNT_DEFINE(txq, underrun) /* Tx underrun */
432 WM_Q_EVCNT_DEFINE(txq, skipcontext) /* Tx skip wring cksum context */
433
434 char txq_txseg_evcnt_names[WM_NTXSEGS][sizeof("txqXXtxsegXXX")];
435 struct evcnt txq_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */
436 #endif /* WM_EVENT_COUNTERS */
437 };
438
439 struct wm_rxqueue {
440 kmutex_t *rxq_lock; /* lock for rx operations */
441
442 struct wm_softc *rxq_sc; /* shortcut (skip struct wm_queue) */
443
444 /* Software state for the receive descriptors. */
445 struct wm_rxsoft rxq_soft[WM_NRXDESC];
446
447 /* RX control data structures. */
448 int rxq_ndesc; /* must be a power of two */
449 size_t rxq_descsize; /* a rx descriptor size */
450 rxdescs_t *rxq_descs_u;
451 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */
452 bus_dma_segment_t rxq_desc_seg; /* control data segment */
453 int rxq_desc_rseg; /* real number of control segment */
454 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr
455 #define rxq_descs rxq_descs_u->sctxu_rxdescs
456 #define rxq_ext_descs rxq_descs_u->sctxu_ext_rxdescs
457 #define rxq_nq_descs rxq_descs_u->sctxu_nq_rxdescs
458
459 bus_addr_t rxq_rdt_reg; /* offset of RDT register */
460
461 int rxq_ptr; /* next ready Rx desc/queue ent */
462 int rxq_discard;
463 int rxq_len;
464 struct mbuf *rxq_head;
465 struct mbuf *rxq_tail;
466 struct mbuf **rxq_tailp;
467
468 bool rxq_stopping;
469
470 uint32_t rxq_packets; /* for AIM */
471 uint32_t rxq_bytes; /* for AIM */
472 #ifdef WM_EVENT_COUNTERS
473 /* RX event counters */
474 WM_Q_EVCNT_DEFINE(rxq, intr); /* Interrupts */
475 WM_Q_EVCNT_DEFINE(rxq, defer); /* Rx deferred processing */
476
477 WM_Q_EVCNT_DEFINE(rxq, ipsum); /* IP checksums checked */
478 WM_Q_EVCNT_DEFINE(rxq, tusum); /* TCP/UDP cksums checked */
479 #endif
480 };
481
482 struct wm_queue {
483 int wmq_id; /* index of TX/RX queues */
484 int wmq_intr_idx; /* index of MSI-X tables */
485
486 uint32_t wmq_itr; /* interrupt interval per queue. */
487 bool wmq_set_itr;
488
489 struct wm_txqueue wmq_txq;
490 struct wm_rxqueue wmq_rxq;
491 char sysctlname[32]; /* Name for sysctl */
492
493 bool wmq_txrx_use_workqueue;
494 struct work wmq_cookie;
495 void *wmq_si;
496 };
497
498 struct wm_phyop {
499 int (*acquire)(struct wm_softc *);
500 void (*release)(struct wm_softc *);
501 int (*readreg_locked)(device_t, int, int, uint16_t *);
502 int (*writereg_locked)(device_t, int, int, uint16_t);
503 int reset_delay_us;
504 bool no_errprint;
505 };
506
507 struct wm_nvmop {
508 int (*acquire)(struct wm_softc *);
509 void (*release)(struct wm_softc *);
510 int (*read)(struct wm_softc *, int, int, uint16_t *);
511 };
512
513 /*
514 * Software state per device.
515 */
516 struct wm_softc {
517 device_t sc_dev; /* generic device information */
518 bus_space_tag_t sc_st; /* bus space tag */
519 bus_space_handle_t sc_sh; /* bus space handle */
520 bus_size_t sc_ss; /* bus space size */
521 bus_space_tag_t sc_iot; /* I/O space tag */
522 bus_space_handle_t sc_ioh; /* I/O space handle */
523 bus_size_t sc_ios; /* I/O space size */
524 bus_space_tag_t sc_flasht; /* flash registers space tag */
525 bus_space_handle_t sc_flashh; /* flash registers space handle */
526 bus_size_t sc_flashs; /* flash registers space size */
527 off_t sc_flashreg_offset; /*
528 * offset to flash registers from
529 * start of BAR
530 */
531 bus_dma_tag_t sc_dmat; /* bus DMA tag */
532
533 struct ethercom sc_ethercom; /* ethernet common data */
534 struct mii_data sc_mii; /* MII/media information */
535
536 pci_chipset_tag_t sc_pc;
537 pcitag_t sc_pcitag;
538 int sc_bus_speed; /* PCI/PCIX bus speed */
539 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */
540
541 uint16_t sc_pcidevid; /* PCI device ID */
542 wm_chip_type sc_type; /* MAC type */
543 int sc_rev; /* MAC revision */
544 wm_phy_type sc_phytype; /* PHY type */
545 uint8_t sc_sfptype; /* SFP type */
546 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/
547 #define WM_MEDIATYPE_UNKNOWN 0x00
548 #define WM_MEDIATYPE_FIBER 0x01
549 #define WM_MEDIATYPE_COPPER 0x02
550 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */
551 int sc_funcid; /* unit number of the chip (0 to 3) */
552 int sc_flags; /* flags; see below */
553 u_short sc_if_flags; /* last if_flags */
554 int sc_ec_capenable; /* last ec_capenable */
555 int sc_flowflags; /* 802.3x flow control flags */
556 uint16_t eee_lp_ability; /* EEE link partner's ability */
557 int sc_align_tweak;
558
559 void *sc_ihs[WM_MAX_NINTR]; /*
560 * interrupt cookie.
561 * - legacy and msi use sc_ihs[0] only
562 * - msix use sc_ihs[0] to sc_ihs[nintrs-1]
563 */
564 pci_intr_handle_t *sc_intrs; /*
565 * legacy and msi use sc_intrs[0] only
566 * msix use sc_intrs[0] to sc_ihs[nintrs-1]
567 */
568 int sc_nintrs; /* number of interrupts */
569
570 int sc_link_intr_idx; /* index of MSI-X tables */
571
572 callout_t sc_tick_ch; /* tick callout */
573 bool sc_core_stopping;
574
575 int sc_nvm_ver_major;
576 int sc_nvm_ver_minor;
577 int sc_nvm_ver_build;
578 int sc_nvm_addrbits; /* NVM address bits */
579 unsigned int sc_nvm_wordsize; /* NVM word size */
580 int sc_ich8_flash_base;
581 int sc_ich8_flash_bank_size;
582 int sc_nvm_k1_enabled;
583
584 int sc_nqueues;
585 struct wm_queue *sc_queue;
586 u_int sc_tx_process_limit; /* Tx proc. repeat limit in softint */
587 u_int sc_tx_intr_process_limit; /* Tx proc. repeat limit in H/W intr */
588 u_int sc_rx_process_limit; /* Rx proc. repeat limit in softint */
589 u_int sc_rx_intr_process_limit; /* Rx proc. repeat limit in H/W intr */
590 struct workqueue *sc_queue_wq;
591 bool sc_txrx_use_workqueue;
592
593 int sc_affinity_offset;
594
595 #ifdef WM_EVENT_COUNTERS
596 /* Event counters. */
597 struct evcnt sc_ev_linkintr; /* Link interrupts */
598
599 /* WM_T_82542_2_1 only */
600 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */
601 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */
602 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */
603 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */
604 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */
605 #endif /* WM_EVENT_COUNTERS */
606
607 struct sysctllog *sc_sysctllog;
608
609 /* This variable are used only on the 82547. */
610 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */
611
612 uint32_t sc_ctrl; /* prototype CTRL register */
613 #if 0
614 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */
615 #endif
616 uint32_t sc_icr; /* prototype interrupt bits */
617 uint32_t sc_itr_init; /* prototype intr throttling reg */
618 uint32_t sc_tctl; /* prototype TCTL register */
619 uint32_t sc_rctl; /* prototype RCTL register */
620 uint32_t sc_txcw; /* prototype TXCW register */
621 uint32_t sc_tipg; /* prototype TIPG register */
622 uint32_t sc_fcrtl; /* prototype FCRTL register */
623 uint32_t sc_pba; /* prototype PBA register */
624
625 int sc_tbi_linkup; /* TBI link status */
626 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */
627 int sc_tbi_serdes_ticks; /* tbi ticks */
628
629 int sc_mchash_type; /* multicast filter offset */
630
631 krndsource_t rnd_source; /* random source */
632
633 struct if_percpuq *sc_ipq; /* softint-based input queues */
634
635 kmutex_t *sc_core_lock; /* lock for softc operations */
636 kmutex_t *sc_ich_phymtx; /*
637 * 82574/82583/ICH/PCH specific PHY
638 * mutex. For 82574/82583, the mutex
639 * is used for both PHY and NVM.
640 */
641 kmutex_t *sc_ich_nvmmtx; /* ICH/PCH specific NVM mutex */
642
643 struct wm_phyop phy;
644 struct wm_nvmop nvm;
645 #ifdef WM_DEBUG
646 uint32_t sc_debug;
647 #endif
648 };
649
650 #define WM_CORE_LOCK(_sc) \
651 if ((_sc)->sc_core_lock) mutex_enter((_sc)->sc_core_lock)
652 #define WM_CORE_UNLOCK(_sc) \
653 if ((_sc)->sc_core_lock) mutex_exit((_sc)->sc_core_lock)
654 #define WM_CORE_LOCKED(_sc) \
655 (!(_sc)->sc_core_lock || mutex_owned((_sc)->sc_core_lock))
656
657 #define WM_RXCHAIN_RESET(rxq) \
658 do { \
659 (rxq)->rxq_tailp = &(rxq)->rxq_head; \
660 *(rxq)->rxq_tailp = NULL; \
661 (rxq)->rxq_len = 0; \
662 } while (/*CONSTCOND*/0)
663
664 #define WM_RXCHAIN_LINK(rxq, m) \
665 do { \
666 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \
667 (rxq)->rxq_tailp = &(m)->m_next; \
668 } while (/*CONSTCOND*/0)
669
670 #ifdef WM_EVENT_COUNTERS
671 #ifdef __HAVE_ATOMIC64_LOADSTORE
672 #define WM_EVCNT_INCR(ev) \
673 atomic_store_relaxed(&((ev)->ev_count), \
674 atomic_load_relaxed(&(ev)->ev_count) + 1)
675 #define WM_EVCNT_ADD(ev, val) \
676 atomic_store_relaxed(&((ev)->ev_count), \
677 atomic_load_relaxed(&(ev)->ev_count) + (val))
678 #else
679 #define WM_EVCNT_INCR(ev) \
680 ((ev)->ev_count)++
681 #define WM_EVCNT_ADD(ev, val) \
682 (ev)->ev_count += (val)
683 #endif
684
685 #define WM_Q_EVCNT_INCR(qname, evname) \
686 WM_EVCNT_INCR(&(qname)->qname##_ev_##evname)
687 #define WM_Q_EVCNT_ADD(qname, evname, val) \
688 WM_EVCNT_ADD(&(qname)->qname##_ev_##evname, (val))
689 #else /* !WM_EVENT_COUNTERS */
690 #define WM_EVCNT_INCR(ev) /* nothing */
691 #define WM_EVCNT_ADD(ev, val) /* nothing */
692
693 #define WM_Q_EVCNT_INCR(qname, evname) /* nothing */
694 #define WM_Q_EVCNT_ADD(qname, evname, val) /* nothing */
695 #endif /* !WM_EVENT_COUNTERS */
696
697 #define CSR_READ(sc, reg) \
698 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
699 #define CSR_WRITE(sc, reg, val) \
700 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
701 #define CSR_WRITE_FLUSH(sc) \
702 (void)CSR_READ((sc), WMREG_STATUS)
703
704 #define ICH8_FLASH_READ32(sc, reg) \
705 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, \
706 (reg) + sc->sc_flashreg_offset)
707 #define ICH8_FLASH_WRITE32(sc, reg, data) \
708 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, \
709 (reg) + sc->sc_flashreg_offset, (data))
710
711 #define ICH8_FLASH_READ16(sc, reg) \
712 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, \
713 (reg) + sc->sc_flashreg_offset)
714 #define ICH8_FLASH_WRITE16(sc, reg, data) \
715 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, \
716 (reg) + sc->sc_flashreg_offset, (data))
717
718 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((txq), (x)))
719 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((rxq), (x)))
720
721 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU)
722 #define WM_CDTXADDR_HI(txq, x) \
723 (sizeof(bus_addr_t) == 8 ? \
724 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0)
725
726 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU)
727 #define WM_CDRXADDR_HI(rxq, x) \
728 (sizeof(bus_addr_t) == 8 ? \
729 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0)
730
731 /*
732 * Register read/write functions.
733 * Other than CSR_{READ|WRITE}().
734 */
735 #if 0
736 static inline uint32_t wm_io_read(struct wm_softc *, int);
737 #endif
738 static inline void wm_io_write(struct wm_softc *, int, uint32_t);
739 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t,
740 uint32_t, uint32_t);
741 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t);
742
743 /*
744 * Descriptor sync/init functions.
745 */
746 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int);
747 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int);
748 static inline void wm_init_rxdesc(struct wm_rxqueue *, int);
749
750 /*
751 * Device driver interface functions and commonly used functions.
752 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
753 */
754 static const struct wm_product *wm_lookup(const struct pci_attach_args *);
755 static int wm_match(device_t, cfdata_t, void *);
756 static void wm_attach(device_t, device_t, void *);
757 static int wm_detach(device_t, int);
758 static bool wm_suspend(device_t, const pmf_qual_t *);
759 static bool wm_resume(device_t, const pmf_qual_t *);
760 static void wm_watchdog(struct ifnet *);
761 static void wm_watchdog_txq(struct ifnet *, struct wm_txqueue *,
762 uint16_t *);
763 static void wm_watchdog_txq_locked(struct ifnet *, struct wm_txqueue *,
764 uint16_t *);
765 static void wm_tick(void *);
766 static int wm_ifflags_cb(struct ethercom *);
767 static int wm_ioctl(struct ifnet *, u_long, void *);
768 /* MAC address related */
769 static uint16_t wm_check_alt_mac_addr(struct wm_softc *);
770 static int wm_read_mac_addr(struct wm_softc *, uint8_t *);
771 static void wm_set_ral(struct wm_softc *, const uint8_t *, int);
772 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *);
773 static int wm_rar_count(struct wm_softc *);
774 static void wm_set_filter(struct wm_softc *);
775 /* Reset and init related */
776 static void wm_set_vlan(struct wm_softc *);
777 static void wm_set_pcie_completion_timeout(struct wm_softc *);
778 static void wm_get_auto_rd_done(struct wm_softc *);
779 static void wm_lan_init_done(struct wm_softc *);
780 static void wm_get_cfg_done(struct wm_softc *);
781 static int wm_phy_post_reset(struct wm_softc *);
782 static int wm_write_smbus_addr(struct wm_softc *);
783 static int wm_init_lcd_from_nvm(struct wm_softc *);
784 static int wm_oem_bits_config_ich8lan(struct wm_softc *, bool);
785 static void wm_initialize_hardware_bits(struct wm_softc *);
786 static uint32_t wm_rxpbs_adjust_82580(uint32_t);
787 static int wm_reset_phy(struct wm_softc *);
788 static void wm_flush_desc_rings(struct wm_softc *);
789 static void wm_reset(struct wm_softc *);
790 static int wm_add_rxbuf(struct wm_rxqueue *, int);
791 static void wm_rxdrain(struct wm_rxqueue *);
792 static void wm_init_rss(struct wm_softc *);
793 static void wm_adjust_qnum(struct wm_softc *, int);
794 static inline bool wm_is_using_msix(struct wm_softc *);
795 static inline bool wm_is_using_multiqueue(struct wm_softc *);
796 static int wm_softint_establish_queue(struct wm_softc *, int, int);
797 static int wm_setup_legacy(struct wm_softc *);
798 static int wm_setup_msix(struct wm_softc *);
799 static int wm_init(struct ifnet *);
800 static int wm_init_locked(struct ifnet *);
801 static void wm_init_sysctls(struct wm_softc *);
802 static void wm_unset_stopping_flags(struct wm_softc *);
803 static void wm_set_stopping_flags(struct wm_softc *);
804 static void wm_stop(struct ifnet *, int);
805 static void wm_stop_locked(struct ifnet *, bool, bool);
806 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *);
807 static void wm_82547_txfifo_stall(void *);
808 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *);
809 static void wm_itrs_writereg(struct wm_softc *, struct wm_queue *);
810 /* DMA related */
811 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *);
812 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *);
813 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *);
814 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *,
815 struct wm_txqueue *);
816 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *);
817 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *);
818 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *,
819 struct wm_rxqueue *);
820 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *);
821 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *);
822 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *);
823 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
824 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
825 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
826 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *,
827 struct wm_txqueue *);
828 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *,
829 struct wm_rxqueue *);
830 static int wm_alloc_txrx_queues(struct wm_softc *);
831 static void wm_free_txrx_queues(struct wm_softc *);
832 static int wm_init_txrx_queues(struct wm_softc *);
833 /* Start */
834 static void wm_tx_offload(struct wm_softc *, struct wm_txqueue *,
835 struct wm_txsoft *, uint32_t *, uint8_t *);
836 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *);
837 static void wm_start(struct ifnet *);
838 static void wm_start_locked(struct ifnet *);
839 static int wm_transmit(struct ifnet *, struct mbuf *);
840 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *);
841 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *,
842 bool);
843 static void wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *,
844 struct wm_txsoft *, uint32_t *, uint32_t *, bool *);
845 static void wm_nq_start(struct ifnet *);
846 static void wm_nq_start_locked(struct ifnet *);
847 static int wm_nq_transmit(struct ifnet *, struct mbuf *);
848 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *);
849 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *,
850 bool);
851 static void wm_deferred_start_locked(struct wm_txqueue *);
852 static void wm_handle_queue(void *);
853 static void wm_handle_queue_work(struct work *, void *);
854 /* Interrupt */
855 static bool wm_txeof(struct wm_txqueue *, u_int);
856 static bool wm_rxeof(struct wm_rxqueue *, u_int);
857 static void wm_linkintr_gmii(struct wm_softc *, uint32_t);
858 static void wm_linkintr_tbi(struct wm_softc *, uint32_t);
859 static void wm_linkintr_serdes(struct wm_softc *, uint32_t);
860 static void wm_linkintr(struct wm_softc *, uint32_t);
861 static int wm_intr_legacy(void *);
862 static inline void wm_txrxintr_disable(struct wm_queue *);
863 static inline void wm_txrxintr_enable(struct wm_queue *);
864 static void wm_itrs_calculate(struct wm_softc *, struct wm_queue *);
865 static int wm_txrxintr_msix(void *);
866 static int wm_linkintr_msix(void *);
867
868 /*
869 * Media related.
870 * GMII, SGMII, TBI, SERDES and SFP.
871 */
872 /* Common */
873 static void wm_tbi_serdes_set_linkled(struct wm_softc *);
874 /* GMII related */
875 static void wm_gmii_reset(struct wm_softc *);
876 static void wm_gmii_setup_phytype(struct wm_softc *, uint32_t, uint16_t);
877 static int wm_get_phy_id_82575(struct wm_softc *);
878 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t);
879 static int wm_gmii_mediachange(struct ifnet *);
880 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
881 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int);
882 static uint16_t wm_i82543_mii_recvbits(struct wm_softc *);
883 static int wm_gmii_i82543_readreg(device_t, int, int, uint16_t *);
884 static int wm_gmii_i82543_writereg(device_t, int, int, uint16_t);
885 static int wm_gmii_mdic_readreg(device_t, int, int, uint16_t *);
886 static int wm_gmii_mdic_writereg(device_t, int, int, uint16_t);
887 static int wm_gmii_i82544_readreg(device_t, int, int, uint16_t *);
888 static int wm_gmii_i82544_readreg_locked(device_t, int, int, uint16_t *);
889 static int wm_gmii_i82544_writereg(device_t, int, int, uint16_t);
890 static int wm_gmii_i82544_writereg_locked(device_t, int, int, uint16_t);
891 static int wm_gmii_i80003_readreg(device_t, int, int, uint16_t *);
892 static int wm_gmii_i80003_writereg(device_t, int, int, uint16_t);
893 static int wm_gmii_bm_readreg(device_t, int, int, uint16_t *);
894 static int wm_gmii_bm_writereg(device_t, int, int, uint16_t);
895 static int wm_enable_phy_wakeup_reg_access_bm(device_t, uint16_t *);
896 static int wm_disable_phy_wakeup_reg_access_bm(device_t, uint16_t *);
897 static int wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int,
898 bool);
899 static int wm_gmii_hv_readreg(device_t, int, int, uint16_t *);
900 static int wm_gmii_hv_readreg_locked(device_t, int, int, uint16_t *);
901 static int wm_gmii_hv_writereg(device_t, int, int, uint16_t);
902 static int wm_gmii_hv_writereg_locked(device_t, int, int, uint16_t);
903 static int wm_gmii_82580_readreg(device_t, int, int, uint16_t *);
904 static int wm_gmii_82580_writereg(device_t, int, int, uint16_t);
905 static int wm_gmii_gs40g_readreg(device_t, int, int, uint16_t *);
906 static int wm_gmii_gs40g_writereg(device_t, int, int, uint16_t);
907 static void wm_gmii_statchg(struct ifnet *);
908 /*
909 * kumeran related (80003, ICH* and PCH*).
910 * These functions are not for accessing MII registers but for accessing
911 * kumeran specific registers.
912 */
913 static int wm_kmrn_readreg(struct wm_softc *, int, uint16_t *);
914 static int wm_kmrn_readreg_locked(struct wm_softc *, int, uint16_t *);
915 static int wm_kmrn_writereg(struct wm_softc *, int, uint16_t);
916 static int wm_kmrn_writereg_locked(struct wm_softc *, int, uint16_t);
917 /* EMI register related */
918 static int wm_access_emi_reg_locked(device_t, int, uint16_t *, bool);
919 static int wm_read_emi_reg_locked(device_t, int, uint16_t *);
920 static int wm_write_emi_reg_locked(device_t, int, uint16_t);
921 /* SGMII */
922 static bool wm_sgmii_uses_mdio(struct wm_softc *);
923 static void wm_sgmii_sfp_preconfig(struct wm_softc *);
924 static int wm_sgmii_readreg(device_t, int, int, uint16_t *);
925 static int wm_sgmii_readreg_locked(device_t, int, int, uint16_t *);
926 static int wm_sgmii_writereg(device_t, int, int, uint16_t);
927 static int wm_sgmii_writereg_locked(device_t, int, int, uint16_t);
928 /* TBI related */
929 static bool wm_tbi_havesignal(struct wm_softc *, uint32_t);
930 static void wm_tbi_mediainit(struct wm_softc *);
931 static int wm_tbi_mediachange(struct ifnet *);
932 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
933 static int wm_check_for_link(struct wm_softc *);
934 static void wm_tbi_tick(struct wm_softc *);
935 /* SERDES related */
936 static void wm_serdes_power_up_link_82575(struct wm_softc *);
937 static int wm_serdes_mediachange(struct ifnet *);
938 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *);
939 static void wm_serdes_tick(struct wm_softc *);
940 /* SFP related */
941 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *);
942 static uint32_t wm_sfp_get_media_type(struct wm_softc *);
943
944 /*
945 * NVM related.
946 * Microwire, SPI (w/wo EERD) and Flash.
947 */
948 /* Misc functions */
949 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int);
950 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int);
951 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *);
952 /* Microwire */
953 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *);
954 /* SPI */
955 static int wm_nvm_ready_spi(struct wm_softc *);
956 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *);
957 /* Using with EERD */
958 static int wm_poll_eerd_eewr_done(struct wm_softc *, int);
959 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *);
960 /* Flash */
961 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *,
962 unsigned int *);
963 static int32_t wm_ich8_cycle_init(struct wm_softc *);
964 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t);
965 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t,
966 uint32_t *);
967 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *);
968 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *);
969 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *);
970 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *);
971 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *);
972 /* iNVM */
973 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *);
974 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *);
975 /* Lock, detecting NVM type, validate checksum and read */
976 static int wm_nvm_is_onboard_eeprom(struct wm_softc *);
977 static int wm_nvm_flash_presence_i210(struct wm_softc *);
978 static int wm_nvm_validate_checksum(struct wm_softc *);
979 static void wm_nvm_version_invm(struct wm_softc *);
980 static void wm_nvm_version(struct wm_softc *);
981 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *);
982
983 /*
984 * Hardware semaphores.
985 * Very complexed...
986 */
987 static int wm_get_null(struct wm_softc *);
988 static void wm_put_null(struct wm_softc *);
989 static int wm_get_eecd(struct wm_softc *);
990 static void wm_put_eecd(struct wm_softc *);
991 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */
992 static void wm_put_swsm_semaphore(struct wm_softc *);
993 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t);
994 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t);
995 static int wm_get_nvm_80003(struct wm_softc *);
996 static void wm_put_nvm_80003(struct wm_softc *);
997 static int wm_get_nvm_82571(struct wm_softc *);
998 static void wm_put_nvm_82571(struct wm_softc *);
999 static int wm_get_phy_82575(struct wm_softc *);
1000 static void wm_put_phy_82575(struct wm_softc *);
1001 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */
1002 static void wm_put_swfwhw_semaphore(struct wm_softc *);
1003 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */
1004 static void wm_put_swflag_ich8lan(struct wm_softc *);
1005 static int wm_get_nvm_ich8lan(struct wm_softc *);
1006 static void wm_put_nvm_ich8lan(struct wm_softc *);
1007 static int wm_get_hw_semaphore_82573(struct wm_softc *);
1008 static void wm_put_hw_semaphore_82573(struct wm_softc *);
1009
1010 /*
1011 * Management mode and power management related subroutines.
1012 * BMC, AMT, suspend/resume and EEE.
1013 */
1014 #if 0
1015 static int wm_check_mng_mode(struct wm_softc *);
1016 static int wm_check_mng_mode_ich8lan(struct wm_softc *);
1017 static int wm_check_mng_mode_82574(struct wm_softc *);
1018 static int wm_check_mng_mode_generic(struct wm_softc *);
1019 #endif
1020 static int wm_enable_mng_pass_thru(struct wm_softc *);
1021 static bool wm_phy_resetisblocked(struct wm_softc *);
1022 static void wm_get_hw_control(struct wm_softc *);
1023 static void wm_release_hw_control(struct wm_softc *);
1024 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool);
1025 static int wm_init_phy_workarounds_pchlan(struct wm_softc *);
1026 static void wm_init_manageability(struct wm_softc *);
1027 static void wm_release_manageability(struct wm_softc *);
1028 static void wm_get_wakeup(struct wm_softc *);
1029 static int wm_ulp_disable(struct wm_softc *);
1030 static int wm_enable_phy_wakeup(struct wm_softc *);
1031 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *);
1032 static void wm_suspend_workarounds_ich8lan(struct wm_softc *);
1033 static int wm_resume_workarounds_pchlan(struct wm_softc *);
1034 static void wm_enable_wakeup(struct wm_softc *);
1035 static void wm_disable_aspm(struct wm_softc *);
1036 /* LPLU (Low Power Link Up) */
1037 static void wm_lplu_d0_disable(struct wm_softc *);
1038 /* EEE */
1039 static int wm_set_eee_i350(struct wm_softc *);
1040 static int wm_set_eee_pchlan(struct wm_softc *);
1041 static int wm_set_eee(struct wm_softc *);
1042
1043 /*
1044 * Workarounds (mainly PHY related).
1045 * Basically, PHY's workarounds are in the PHY drivers.
1046 */
1047 static int wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *);
1048 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *);
1049 static int wm_hv_phy_workarounds_ich8lan(struct wm_softc *);
1050 static void wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *);
1051 static void wm_copy_rx_addrs_to_phy_ich8lan_locked(struct wm_softc *);
1052 static int wm_lv_jumbo_workaround_ich8lan(struct wm_softc *, bool);
1053 static int wm_lv_phy_workarounds_ich8lan(struct wm_softc *);
1054 static int wm_k1_workaround_lpt_lp(struct wm_softc *, bool);
1055 static int wm_k1_gig_workaround_hv(struct wm_softc *, int);
1056 static int wm_k1_workaround_lv(struct wm_softc *);
1057 static int wm_link_stall_workaround_hv(struct wm_softc *);
1058 static int wm_set_mdio_slow_mode_hv(struct wm_softc *);
1059 static void wm_configure_k1_ich8lan(struct wm_softc *, int);
1060 static void wm_reset_init_script_82575(struct wm_softc *);
1061 static void wm_reset_mdicnfg_82580(struct wm_softc *);
1062 static bool wm_phy_is_accessible_pchlan(struct wm_softc *);
1063 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *);
1064 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool);
1065 static int wm_pll_workaround_i210(struct wm_softc *);
1066 static void wm_legacy_irq_quirk_spt(struct wm_softc *);
1067 static bool wm_phy_need_linkdown_discard(struct wm_softc *);
1068 static void wm_set_linkdown_discard(struct wm_softc *);
1069 static void wm_clear_linkdown_discard(struct wm_softc *);
1070
1071 #ifdef WM_DEBUG
1072 static int wm_sysctl_debug(SYSCTLFN_PROTO);
1073 #endif
1074
1075 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc),
1076 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
1077
1078 /*
1079 * Devices supported by this driver.
1080 */
1081 static const struct wm_product {
1082 pci_vendor_id_t wmp_vendor;
1083 pci_product_id_t wmp_product;
1084 const char *wmp_name;
1085 wm_chip_type wmp_type;
1086 uint32_t wmp_flags;
1087 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN
1088 #define WMP_F_FIBER WM_MEDIATYPE_FIBER
1089 #define WMP_F_COPPER WM_MEDIATYPE_COPPER
1090 #define WMP_F_SERDES WM_MEDIATYPE_SERDES
1091 #define WMP_MEDIATYPE(x) ((x) & 0x03)
1092 } wm_products[] = {
1093 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542,
1094 "Intel i82542 1000BASE-X Ethernet",
1095 WM_T_82542_2_1, WMP_F_FIBER },
1096
1097 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER,
1098 "Intel i82543GC 1000BASE-X Ethernet",
1099 WM_T_82543, WMP_F_FIBER },
1100
1101 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER,
1102 "Intel i82543GC 1000BASE-T Ethernet",
1103 WM_T_82543, WMP_F_COPPER },
1104
1105 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER,
1106 "Intel i82544EI 1000BASE-T Ethernet",
1107 WM_T_82544, WMP_F_COPPER },
1108
1109 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER,
1110 "Intel i82544EI 1000BASE-X Ethernet",
1111 WM_T_82544, WMP_F_FIBER },
1112
1113 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER,
1114 "Intel i82544GC 1000BASE-T Ethernet",
1115 WM_T_82544, WMP_F_COPPER },
1116
1117 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM,
1118 "Intel i82544GC (LOM) 1000BASE-T Ethernet",
1119 WM_T_82544, WMP_F_COPPER },
1120
1121 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM,
1122 "Intel i82540EM 1000BASE-T Ethernet",
1123 WM_T_82540, WMP_F_COPPER },
1124
1125 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM,
1126 "Intel i82540EM (LOM) 1000BASE-T Ethernet",
1127 WM_T_82540, WMP_F_COPPER },
1128
1129 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM,
1130 "Intel i82540EP 1000BASE-T Ethernet",
1131 WM_T_82540, WMP_F_COPPER },
1132
1133 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP,
1134 "Intel i82540EP 1000BASE-T Ethernet",
1135 WM_T_82540, WMP_F_COPPER },
1136
1137 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP,
1138 "Intel i82540EP 1000BASE-T Ethernet",
1139 WM_T_82540, WMP_F_COPPER },
1140
1141 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER,
1142 "Intel i82545EM 1000BASE-T Ethernet",
1143 WM_T_82545, WMP_F_COPPER },
1144
1145 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER,
1146 "Intel i82545GM 1000BASE-T Ethernet",
1147 WM_T_82545_3, WMP_F_COPPER },
1148
1149 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER,
1150 "Intel i82545GM 1000BASE-X Ethernet",
1151 WM_T_82545_3, WMP_F_FIBER },
1152
1153 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES,
1154 "Intel i82545GM Gigabit Ethernet (SERDES)",
1155 WM_T_82545_3, WMP_F_SERDES },
1156
1157 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER,
1158 "Intel i82546EB 1000BASE-T Ethernet",
1159 WM_T_82546, WMP_F_COPPER },
1160
1161 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD,
1162 "Intel i82546EB 1000BASE-T Ethernet",
1163 WM_T_82546, WMP_F_COPPER },
1164
1165 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER,
1166 "Intel i82545EM 1000BASE-X Ethernet",
1167 WM_T_82545, WMP_F_FIBER },
1168
1169 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER,
1170 "Intel i82546EB 1000BASE-X Ethernet",
1171 WM_T_82546, WMP_F_FIBER },
1172
1173 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER,
1174 "Intel i82546GB 1000BASE-T Ethernet",
1175 WM_T_82546_3, WMP_F_COPPER },
1176
1177 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER,
1178 "Intel i82546GB 1000BASE-X Ethernet",
1179 WM_T_82546_3, WMP_F_FIBER },
1180
1181 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES,
1182 "Intel i82546GB Gigabit Ethernet (SERDES)",
1183 WM_T_82546_3, WMP_F_SERDES },
1184
1185 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER,
1186 "i82546GB quad-port Gigabit Ethernet",
1187 WM_T_82546_3, WMP_F_COPPER },
1188
1189 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
1190 "i82546GB quad-port Gigabit Ethernet (KSP3)",
1191 WM_T_82546_3, WMP_F_COPPER },
1192
1193 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE,
1194 "Intel PRO/1000MT (82546GB)",
1195 WM_T_82546_3, WMP_F_COPPER },
1196
1197 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI,
1198 "Intel i82541EI 1000BASE-T Ethernet",
1199 WM_T_82541, WMP_F_COPPER },
1200
1201 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM,
1202 "Intel i82541ER (LOM) 1000BASE-T Ethernet",
1203 WM_T_82541, WMP_F_COPPER },
1204
1205 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE,
1206 "Intel i82541EI Mobile 1000BASE-T Ethernet",
1207 WM_T_82541, WMP_F_COPPER },
1208
1209 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER,
1210 "Intel i82541ER 1000BASE-T Ethernet",
1211 WM_T_82541_2, WMP_F_COPPER },
1212
1213 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI,
1214 "Intel i82541GI 1000BASE-T Ethernet",
1215 WM_T_82541_2, WMP_F_COPPER },
1216
1217 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE,
1218 "Intel i82541GI Mobile 1000BASE-T Ethernet",
1219 WM_T_82541_2, WMP_F_COPPER },
1220
1221 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI,
1222 "Intel i82541PI 1000BASE-T Ethernet",
1223 WM_T_82541_2, WMP_F_COPPER },
1224
1225 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI,
1226 "Intel i82547EI 1000BASE-T Ethernet",
1227 WM_T_82547, WMP_F_COPPER },
1228
1229 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE,
1230 "Intel i82547EI Mobile 1000BASE-T Ethernet",
1231 WM_T_82547, WMP_F_COPPER },
1232
1233 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI,
1234 "Intel i82547GI 1000BASE-T Ethernet",
1235 WM_T_82547_2, WMP_F_COPPER },
1236
1237 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER,
1238 "Intel PRO/1000 PT (82571EB)",
1239 WM_T_82571, WMP_F_COPPER },
1240
1241 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER,
1242 "Intel PRO/1000 PF (82571EB)",
1243 WM_T_82571, WMP_F_FIBER },
1244
1245 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES,
1246 "Intel PRO/1000 PB (82571EB)",
1247 WM_T_82571, WMP_F_SERDES },
1248
1249 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER,
1250 "Intel PRO/1000 QT (82571EB)",
1251 WM_T_82571, WMP_F_COPPER },
1252
1253 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER,
1254 "Intel PRO/1000 PT Quad Port Server Adapter",
1255 WM_T_82571, WMP_F_COPPER },
1256
1257 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER,
1258 "Intel Gigabit PT Quad Port Server ExpressModule",
1259 WM_T_82571, WMP_F_COPPER },
1260
1261 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES,
1262 "Intel 82571EB Dual Gigabit Ethernet (SERDES)",
1263 WM_T_82571, WMP_F_SERDES },
1264
1265 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES,
1266 "Intel 82571EB Quad Gigabit Ethernet (SERDES)",
1267 WM_T_82571, WMP_F_SERDES },
1268
1269 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER,
1270 "Intel 82571EB Quad 1000baseX Ethernet",
1271 WM_T_82571, WMP_F_FIBER },
1272
1273 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER,
1274 "Intel i82572EI 1000baseT Ethernet",
1275 WM_T_82572, WMP_F_COPPER },
1276
1277 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER,
1278 "Intel i82572EI 1000baseX Ethernet",
1279 WM_T_82572, WMP_F_FIBER },
1280
1281 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES,
1282 "Intel i82572EI Gigabit Ethernet (SERDES)",
1283 WM_T_82572, WMP_F_SERDES },
1284
1285 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI,
1286 "Intel i82572EI 1000baseT Ethernet",
1287 WM_T_82572, WMP_F_COPPER },
1288
1289 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E,
1290 "Intel i82573E",
1291 WM_T_82573, WMP_F_COPPER },
1292
1293 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT,
1294 "Intel i82573E IAMT",
1295 WM_T_82573, WMP_F_COPPER },
1296
1297 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L,
1298 "Intel i82573L Gigabit Ethernet",
1299 WM_T_82573, WMP_F_COPPER },
1300
1301 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L,
1302 "Intel i82574L",
1303 WM_T_82574, WMP_F_COPPER },
1304
1305 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA,
1306 "Intel i82574L",
1307 WM_T_82574, WMP_F_COPPER },
1308
1309 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V,
1310 "Intel i82583V",
1311 WM_T_82583, WMP_F_COPPER },
1312
1313 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT,
1314 "i80003 dual 1000baseT Ethernet",
1315 WM_T_80003, WMP_F_COPPER },
1316
1317 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT,
1318 "i80003 dual 1000baseX Ethernet",
1319 WM_T_80003, WMP_F_COPPER },
1320
1321 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT,
1322 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)",
1323 WM_T_80003, WMP_F_SERDES },
1324
1325 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT,
1326 "Intel i80003 1000baseT Ethernet",
1327 WM_T_80003, WMP_F_COPPER },
1328
1329 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT,
1330 "Intel i80003 Gigabit Ethernet (SERDES)",
1331 WM_T_80003, WMP_F_SERDES },
1332
1333 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT,
1334 "Intel i82801H (M_AMT) LAN Controller",
1335 WM_T_ICH8, WMP_F_COPPER },
1336 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT,
1337 "Intel i82801H (AMT) LAN Controller",
1338 WM_T_ICH8, WMP_F_COPPER },
1339 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN,
1340 "Intel i82801H LAN Controller",
1341 WM_T_ICH8, WMP_F_COPPER },
1342 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN,
1343 "Intel i82801H (IFE) 10/100 LAN Controller",
1344 WM_T_ICH8, WMP_F_COPPER },
1345 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN,
1346 "Intel i82801H (M) LAN Controller",
1347 WM_T_ICH8, WMP_F_COPPER },
1348 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT,
1349 "Intel i82801H IFE (GT) 10/100 LAN Controller",
1350 WM_T_ICH8, WMP_F_COPPER },
1351 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G,
1352 "Intel i82801H IFE (G) 10/100 LAN Controller",
1353 WM_T_ICH8, WMP_F_COPPER },
1354 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3,
1355 "82567V-3 LAN Controller",
1356 WM_T_ICH8, WMP_F_COPPER },
1357 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT,
1358 "82801I (AMT) LAN Controller",
1359 WM_T_ICH9, WMP_F_COPPER },
1360 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE,
1361 "82801I 10/100 LAN Controller",
1362 WM_T_ICH9, WMP_F_COPPER },
1363 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G,
1364 "82801I (G) 10/100 LAN Controller",
1365 WM_T_ICH9, WMP_F_COPPER },
1366 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT,
1367 "82801I (GT) 10/100 LAN Controller",
1368 WM_T_ICH9, WMP_F_COPPER },
1369 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C,
1370 "82801I (C) LAN Controller",
1371 WM_T_ICH9, WMP_F_COPPER },
1372 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M,
1373 "82801I mobile LAN Controller",
1374 WM_T_ICH9, WMP_F_COPPER },
1375 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V,
1376 "82801I mobile (V) LAN Controller",
1377 WM_T_ICH9, WMP_F_COPPER },
1378 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
1379 "82801I mobile (AMT) LAN Controller",
1380 WM_T_ICH9, WMP_F_COPPER },
1381 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM,
1382 "82567LM-4 LAN Controller",
1383 WM_T_ICH9, WMP_F_COPPER },
1384 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM,
1385 "82567LM-2 LAN Controller",
1386 WM_T_ICH10, WMP_F_COPPER },
1387 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF,
1388 "82567LF-2 LAN Controller",
1389 WM_T_ICH10, WMP_F_COPPER },
1390 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM,
1391 "82567LM-3 LAN Controller",
1392 WM_T_ICH10, WMP_F_COPPER },
1393 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF,
1394 "82567LF-3 LAN Controller",
1395 WM_T_ICH10, WMP_F_COPPER },
1396 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V,
1397 "82567V-2 LAN Controller",
1398 WM_T_ICH10, WMP_F_COPPER },
1399 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V,
1400 "82567V-3? LAN Controller",
1401 WM_T_ICH10, WMP_F_COPPER },
1402 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE,
1403 "HANKSVILLE LAN Controller",
1404 WM_T_ICH10, WMP_F_COPPER },
1405 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM,
1406 "PCH LAN (82577LM) Controller",
1407 WM_T_PCH, WMP_F_COPPER },
1408 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC,
1409 "PCH LAN (82577LC) Controller",
1410 WM_T_PCH, WMP_F_COPPER },
1411 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM,
1412 "PCH LAN (82578DM) Controller",
1413 WM_T_PCH, WMP_F_COPPER },
1414 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC,
1415 "PCH LAN (82578DC) Controller",
1416 WM_T_PCH, WMP_F_COPPER },
1417 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM,
1418 "PCH2 LAN (82579LM) Controller",
1419 WM_T_PCH2, WMP_F_COPPER },
1420 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V,
1421 "PCH2 LAN (82579V) Controller",
1422 WM_T_PCH2, WMP_F_COPPER },
1423 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER,
1424 "82575EB dual-1000baseT Ethernet",
1425 WM_T_82575, WMP_F_COPPER },
1426 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
1427 "82575EB dual-1000baseX Ethernet (SERDES)",
1428 WM_T_82575, WMP_F_SERDES },
1429 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
1430 "82575GB quad-1000baseT Ethernet",
1431 WM_T_82575, WMP_F_COPPER },
1432 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
1433 "82575GB quad-1000baseT Ethernet (PM)",
1434 WM_T_82575, WMP_F_COPPER },
1435 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER,
1436 "82576 1000BaseT Ethernet",
1437 WM_T_82576, WMP_F_COPPER },
1438 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER,
1439 "82576 1000BaseX Ethernet",
1440 WM_T_82576, WMP_F_FIBER },
1441
1442 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES,
1443 "82576 gigabit Ethernet (SERDES)",
1444 WM_T_82576, WMP_F_SERDES },
1445
1446 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER,
1447 "82576 quad-1000BaseT Ethernet",
1448 WM_T_82576, WMP_F_COPPER },
1449
1450 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2,
1451 "82576 Gigabit ET2 Quad Port Server Adapter",
1452 WM_T_82576, WMP_F_COPPER },
1453
1454 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS,
1455 "82576 gigabit Ethernet",
1456 WM_T_82576, WMP_F_COPPER },
1457
1458 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES,
1459 "82576 gigabit Ethernet (SERDES)",
1460 WM_T_82576, WMP_F_SERDES },
1461 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD,
1462 "82576 quad-gigabit Ethernet (SERDES)",
1463 WM_T_82576, WMP_F_SERDES },
1464
1465 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER,
1466 "82580 1000BaseT Ethernet",
1467 WM_T_82580, WMP_F_COPPER },
1468 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER,
1469 "82580 1000BaseX Ethernet",
1470 WM_T_82580, WMP_F_FIBER },
1471
1472 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES,
1473 "82580 1000BaseT Ethernet (SERDES)",
1474 WM_T_82580, WMP_F_SERDES },
1475
1476 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII,
1477 "82580 gigabit Ethernet (SGMII)",
1478 WM_T_82580, WMP_F_COPPER },
1479 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL,
1480 "82580 dual-1000BaseT Ethernet",
1481 WM_T_82580, WMP_F_COPPER },
1482
1483 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER,
1484 "82580 quad-1000BaseX Ethernet",
1485 WM_T_82580, WMP_F_FIBER },
1486
1487 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII,
1488 "DH89XXCC Gigabit Ethernet (SGMII)",
1489 WM_T_82580, WMP_F_COPPER },
1490
1491 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES,
1492 "DH89XXCC Gigabit Ethernet (SERDES)",
1493 WM_T_82580, WMP_F_SERDES },
1494
1495 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE,
1496 "DH89XXCC 1000BASE-KX Ethernet",
1497 WM_T_82580, WMP_F_SERDES },
1498
1499 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP,
1500 "DH89XXCC Gigabit Ethernet (SFP)",
1501 WM_T_82580, WMP_F_SERDES },
1502
1503 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER,
1504 "I350 Gigabit Network Connection",
1505 WM_T_I350, WMP_F_COPPER },
1506
1507 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER,
1508 "I350 Gigabit Fiber Network Connection",
1509 WM_T_I350, WMP_F_FIBER },
1510
1511 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES,
1512 "I350 Gigabit Backplane Connection",
1513 WM_T_I350, WMP_F_SERDES },
1514
1515 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4,
1516 "I350 Quad Port Gigabit Ethernet",
1517 WM_T_I350, WMP_F_SERDES },
1518
1519 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII,
1520 "I350 Gigabit Connection",
1521 WM_T_I350, WMP_F_COPPER },
1522
1523 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX,
1524 "I354 Gigabit Ethernet (KX)",
1525 WM_T_I354, WMP_F_SERDES },
1526
1527 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII,
1528 "I354 Gigabit Ethernet (SGMII)",
1529 WM_T_I354, WMP_F_COPPER },
1530
1531 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE,
1532 "I354 Gigabit Ethernet (2.5G)",
1533 WM_T_I354, WMP_F_COPPER },
1534
1535 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1,
1536 "I210-T1 Ethernet Server Adapter",
1537 WM_T_I210, WMP_F_COPPER },
1538
1539 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1,
1540 "I210 Ethernet (Copper OEM)",
1541 WM_T_I210, WMP_F_COPPER },
1542
1543 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT,
1544 "I210 Ethernet (Copper IT)",
1545 WM_T_I210, WMP_F_COPPER },
1546
1547 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF,
1548 "I210 Ethernet (Copper, FLASH less)",
1549 WM_T_I210, WMP_F_COPPER },
1550
1551 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER,
1552 "I210 Gigabit Ethernet (Fiber)",
1553 WM_T_I210, WMP_F_FIBER },
1554
1555 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES,
1556 "I210 Gigabit Ethernet (SERDES)",
1557 WM_T_I210, WMP_F_SERDES },
1558
1559 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF,
1560 "I210 Gigabit Ethernet (SERDES, FLASH less)",
1561 WM_T_I210, WMP_F_SERDES },
1562
1563 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII,
1564 "I210 Gigabit Ethernet (SGMII)",
1565 WM_T_I210, WMP_F_COPPER },
1566
1567 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII_WOF,
1568 "I210 Gigabit Ethernet (SGMII, FLASH less)",
1569 WM_T_I210, WMP_F_COPPER },
1570
1571 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER,
1572 "I211 Ethernet (COPPER)",
1573 WM_T_I211, WMP_F_COPPER },
1574 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V,
1575 "I217 V Ethernet Connection",
1576 WM_T_PCH_LPT, WMP_F_COPPER },
1577 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM,
1578 "I217 LM Ethernet Connection",
1579 WM_T_PCH_LPT, WMP_F_COPPER },
1580 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V,
1581 "I218 V Ethernet Connection",
1582 WM_T_PCH_LPT, WMP_F_COPPER },
1583 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2,
1584 "I218 V Ethernet Connection",
1585 WM_T_PCH_LPT, WMP_F_COPPER },
1586 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3,
1587 "I218 V Ethernet Connection",
1588 WM_T_PCH_LPT, WMP_F_COPPER },
1589 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM,
1590 "I218 LM Ethernet Connection",
1591 WM_T_PCH_LPT, WMP_F_COPPER },
1592 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2,
1593 "I218 LM Ethernet Connection",
1594 WM_T_PCH_LPT, WMP_F_COPPER },
1595 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3,
1596 "I218 LM Ethernet Connection",
1597 WM_T_PCH_LPT, WMP_F_COPPER },
1598 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM,
1599 "I219 LM Ethernet Connection",
1600 WM_T_PCH_SPT, WMP_F_COPPER },
1601 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2,
1602 "I219 LM (2) Ethernet Connection",
1603 WM_T_PCH_SPT, WMP_F_COPPER },
1604 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3,
1605 "I219 LM (3) Ethernet Connection",
1606 WM_T_PCH_SPT, WMP_F_COPPER },
1607 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4,
1608 "I219 LM (4) Ethernet Connection",
1609 WM_T_PCH_SPT, WMP_F_COPPER },
1610 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5,
1611 "I219 LM (5) Ethernet Connection",
1612 WM_T_PCH_SPT, WMP_F_COPPER },
1613 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM6,
1614 "I219 LM (6) Ethernet Connection",
1615 WM_T_PCH_CNP, WMP_F_COPPER },
1616 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM7,
1617 "I219 LM (7) Ethernet Connection",
1618 WM_T_PCH_CNP, WMP_F_COPPER },
1619 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM8,
1620 "I219 LM (8) Ethernet Connection",
1621 WM_T_PCH_CNP, WMP_F_COPPER },
1622 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM9,
1623 "I219 LM (9) Ethernet Connection",
1624 WM_T_PCH_CNP, WMP_F_COPPER },
1625 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM10,
1626 "I219 LM (10) Ethernet Connection",
1627 WM_T_PCH_CNP, WMP_F_COPPER },
1628 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM11,
1629 "I219 LM (11) Ethernet Connection",
1630 WM_T_PCH_CNP, WMP_F_COPPER },
1631 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM12,
1632 "I219 LM (12) Ethernet Connection",
1633 WM_T_PCH_SPT, WMP_F_COPPER },
1634 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM13,
1635 "I219 LM (13) Ethernet Connection",
1636 WM_T_PCH_CNP, WMP_F_COPPER },
1637 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM14,
1638 "I219 LM (14) Ethernet Connection",
1639 WM_T_PCH_CNP, WMP_F_COPPER },
1640 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM15,
1641 "I219 LM (15) Ethernet Connection",
1642 WM_T_PCH_CNP, WMP_F_COPPER },
1643 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM16,
1644 "I219 LM (16) Ethernet Connection",
1645 WM_T_PCH_CNP, WMP_F_COPPER },
1646 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM17,
1647 "I219 LM (17) Ethernet Connection",
1648 WM_T_PCH_CNP, WMP_F_COPPER },
1649 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM18,
1650 "I219 LM (18) Ethernet Connection",
1651 WM_T_PCH_CNP, WMP_F_COPPER },
1652 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM19,
1653 "I219 LM (19) Ethernet Connection",
1654 WM_T_PCH_CNP, WMP_F_COPPER },
1655 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V,
1656 "I219 V Ethernet Connection",
1657 WM_T_PCH_SPT, WMP_F_COPPER },
1658 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2,
1659 "I219 V (2) Ethernet Connection",
1660 WM_T_PCH_SPT, WMP_F_COPPER },
1661 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4,
1662 "I219 V (4) Ethernet Connection",
1663 WM_T_PCH_SPT, WMP_F_COPPER },
1664 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5,
1665 "I219 V (5) Ethernet Connection",
1666 WM_T_PCH_SPT, WMP_F_COPPER },
1667 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V6,
1668 "I219 V (6) Ethernet Connection",
1669 WM_T_PCH_CNP, WMP_F_COPPER },
1670 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V7,
1671 "I219 V (7) Ethernet Connection",
1672 WM_T_PCH_CNP, WMP_F_COPPER },
1673 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V8,
1674 "I219 V (8) Ethernet Connection",
1675 WM_T_PCH_CNP, WMP_F_COPPER },
1676 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V9,
1677 "I219 V (9) Ethernet Connection",
1678 WM_T_PCH_CNP, WMP_F_COPPER },
1679 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V10,
1680 "I219 V (10) Ethernet Connection",
1681 WM_T_PCH_CNP, WMP_F_COPPER },
1682 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V11,
1683 "I219 V (11) Ethernet Connection",
1684 WM_T_PCH_CNP, WMP_F_COPPER },
1685 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V12,
1686 "I219 V (12) Ethernet Connection",
1687 WM_T_PCH_SPT, WMP_F_COPPER },
1688 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V13,
1689 "I219 V (13) Ethernet Connection",
1690 WM_T_PCH_CNP, WMP_F_COPPER },
1691 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V14,
1692 "I219 V (14) Ethernet Connection",
1693 WM_T_PCH_CNP, WMP_F_COPPER },
1694 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V15,
1695 "I219 V (15) Ethernet Connection",
1696 WM_T_PCH_CNP, WMP_F_COPPER },
1697 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V16,
1698 "I219 V (16) Ethernet Connection",
1699 WM_T_PCH_CNP, WMP_F_COPPER },
1700 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V17,
1701 "I219 V (17) Ethernet Connection",
1702 WM_T_PCH_CNP, WMP_F_COPPER },
1703 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V18,
1704 "I219 V (18) Ethernet Connection",
1705 WM_T_PCH_CNP, WMP_F_COPPER },
1706 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V19,
1707 "I219 V (19) Ethernet Connection",
1708 WM_T_PCH_CNP, WMP_F_COPPER },
1709 { 0, 0,
1710 NULL,
1711 0, 0 },
1712 };
1713
1714 /*
1715 * Register read/write functions.
1716 * Other than CSR_{READ|WRITE}().
1717 */
1718
1719 #if 0 /* Not currently used */
1720 static inline uint32_t
1721 wm_io_read(struct wm_softc *sc, int reg)
1722 {
1723
1724 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1725 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4));
1726 }
1727 #endif
1728
1729 static inline void
1730 wm_io_write(struct wm_softc *sc, int reg, uint32_t val)
1731 {
1732
1733 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1734 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val);
1735 }
1736
1737 static inline void
1738 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off,
1739 uint32_t data)
1740 {
1741 uint32_t regval;
1742 int i;
1743
1744 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
1745
1746 CSR_WRITE(sc, reg, regval);
1747
1748 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) {
1749 delay(5);
1750 if (CSR_READ(sc, reg) & SCTL_CTL_READY)
1751 break;
1752 }
1753 if (i == SCTL_CTL_POLL_TIMEOUT) {
1754 aprint_error("%s: WARNING:"
1755 " i82575 reg 0x%08x setup did not indicate ready\n",
1756 device_xname(sc->sc_dev), reg);
1757 }
1758 }
1759
1760 static inline void
1761 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v)
1762 {
1763 wa->wa_low = htole32(v & 0xffffffffU);
1764 if (sizeof(bus_addr_t) == 8)
1765 wa->wa_high = htole32((uint64_t) v >> 32);
1766 else
1767 wa->wa_high = 0;
1768 }
1769
1770 /*
1771 * Descriptor sync/init functions.
1772 */
1773 static inline void
1774 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops)
1775 {
1776 struct wm_softc *sc = txq->txq_sc;
1777
1778 /* If it will wrap around, sync to the end of the ring. */
1779 if ((start + num) > WM_NTXDESC(txq)) {
1780 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1781 WM_CDTXOFF(txq, start), txq->txq_descsize *
1782 (WM_NTXDESC(txq) - start), ops);
1783 num -= (WM_NTXDESC(txq) - start);
1784 start = 0;
1785 }
1786
1787 /* Now sync whatever is left. */
1788 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1789 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops);
1790 }
1791
1792 static inline void
1793 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops)
1794 {
1795 struct wm_softc *sc = rxq->rxq_sc;
1796
1797 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap,
1798 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops);
1799 }
1800
1801 static inline void
1802 wm_init_rxdesc(struct wm_rxqueue *rxq, int start)
1803 {
1804 struct wm_softc *sc = rxq->rxq_sc;
1805 struct wm_rxsoft *rxs = &rxq->rxq_soft[start];
1806 struct mbuf *m = rxs->rxs_mbuf;
1807
1808 /*
1809 * Note: We scoot the packet forward 2 bytes in the buffer
1810 * so that the payload after the Ethernet header is aligned
1811 * to a 4-byte boundary.
1812
1813 * XXX BRAINDAMAGE ALERT!
1814 * The stupid chip uses the same size for every buffer, which
1815 * is set in the Receive Control register. We are using the 2K
1816 * size option, but what we REALLY want is (2K - 2)! For this
1817 * reason, we can't "scoot" packets longer than the standard
1818 * Ethernet MTU. On strict-alignment platforms, if the total
1819 * size exceeds (2K - 2) we set align_tweak to 0 and let
1820 * the upper layer copy the headers.
1821 */
1822 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak;
1823
1824 if (sc->sc_type == WM_T_82574) {
1825 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start];
1826 rxd->erx_data.erxd_addr =
1827 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1828 rxd->erx_data.erxd_dd = 0;
1829 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
1830 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start];
1831
1832 rxd->nqrx_data.nrxd_paddr =
1833 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1834 /* Currently, split header is not supported. */
1835 rxd->nqrx_data.nrxd_haddr = 0;
1836 } else {
1837 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start];
1838
1839 wm_set_dma_addr(&rxd->wrx_addr,
1840 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1841 rxd->wrx_len = 0;
1842 rxd->wrx_cksum = 0;
1843 rxd->wrx_status = 0;
1844 rxd->wrx_errors = 0;
1845 rxd->wrx_special = 0;
1846 }
1847 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1848
1849 CSR_WRITE(sc, rxq->rxq_rdt_reg, start);
1850 }
1851
1852 /*
1853 * Device driver interface functions and commonly used functions.
1854 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
1855 */
1856
1857 /* Lookup supported device table */
1858 static const struct wm_product *
1859 wm_lookup(const struct pci_attach_args *pa)
1860 {
1861 const struct wm_product *wmp;
1862
1863 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
1864 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
1865 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
1866 return wmp;
1867 }
1868 return NULL;
1869 }
1870
1871 /* The match function (ca_match) */
1872 static int
1873 wm_match(device_t parent, cfdata_t cf, void *aux)
1874 {
1875 struct pci_attach_args *pa = aux;
1876
1877 if (wm_lookup(pa) != NULL)
1878 return 1;
1879
1880 return 0;
1881 }
1882
1883 /* The attach function (ca_attach) */
1884 static void
1885 wm_attach(device_t parent, device_t self, void *aux)
1886 {
1887 struct wm_softc *sc = device_private(self);
1888 struct pci_attach_args *pa = aux;
1889 prop_dictionary_t dict;
1890 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1891 pci_chipset_tag_t pc = pa->pa_pc;
1892 int counts[PCI_INTR_TYPE_SIZE];
1893 pci_intr_type_t max_type;
1894 const char *eetype, *xname;
1895 bus_space_tag_t memt;
1896 bus_space_handle_t memh;
1897 bus_size_t memsize;
1898 int memh_valid;
1899 int i, error;
1900 const struct wm_product *wmp;
1901 prop_data_t ea;
1902 prop_number_t pn;
1903 uint8_t enaddr[ETHER_ADDR_LEN];
1904 char buf[256];
1905 char wqname[MAXCOMLEN];
1906 uint16_t cfg1, cfg2, swdpin, nvmword;
1907 pcireg_t preg, memtype;
1908 uint16_t eeprom_data, apme_mask;
1909 bool force_clear_smbi;
1910 uint32_t link_mode;
1911 uint32_t reg;
1912
1913 #if defined(WM_DEBUG) && defined(WM_DEBUG_DEFAULT)
1914 sc->sc_debug = WM_DEBUG_DEFAULT;
1915 #endif
1916 sc->sc_dev = self;
1917 callout_init(&sc->sc_tick_ch, WM_CALLOUT_FLAGS);
1918 callout_setfunc(&sc->sc_tick_ch, wm_tick, sc);
1919 sc->sc_core_stopping = false;
1920
1921 wmp = wm_lookup(pa);
1922 #ifdef DIAGNOSTIC
1923 if (wmp == NULL) {
1924 printf("\n");
1925 panic("wm_attach: impossible");
1926 }
1927 #endif
1928 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags);
1929
1930 sc->sc_pc = pa->pa_pc;
1931 sc->sc_pcitag = pa->pa_tag;
1932
1933 if (pci_dma64_available(pa))
1934 sc->sc_dmat = pa->pa_dmat64;
1935 else
1936 sc->sc_dmat = pa->pa_dmat;
1937
1938 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id);
1939 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG));
1940 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1);
1941
1942 sc->sc_type = wmp->wmp_type;
1943
1944 /* Set default function pointers */
1945 sc->phy.acquire = sc->nvm.acquire = wm_get_null;
1946 sc->phy.release = sc->nvm.release = wm_put_null;
1947 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000;
1948
1949 if (sc->sc_type < WM_T_82543) {
1950 if (sc->sc_rev < 2) {
1951 aprint_error_dev(sc->sc_dev,
1952 "i82542 must be at least rev. 2\n");
1953 return;
1954 }
1955 if (sc->sc_rev < 3)
1956 sc->sc_type = WM_T_82542_2_0;
1957 }
1958
1959 /*
1960 * Disable MSI for Errata:
1961 * "Message Signaled Interrupt Feature May Corrupt Write Transactions"
1962 *
1963 * 82544: Errata 25
1964 * 82540: Errata 6 (easy to reproduce device timeout)
1965 * 82545: Errata 4 (easy to reproduce device timeout)
1966 * 82546: Errata 26 (easy to reproduce device timeout)
1967 * 82541: Errata 7 (easy to reproduce device timeout)
1968 *
1969 * "Byte Enables 2 and 3 are not set on MSI writes"
1970 *
1971 * 82571 & 82572: Errata 63
1972 */
1973 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571)
1974 || (sc->sc_type == WM_T_82572))
1975 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY;
1976
1977 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1978 || (sc->sc_type == WM_T_82580)
1979 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
1980 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
1981 sc->sc_flags |= WM_F_NEWQUEUE;
1982
1983 /* Set device properties (mactype) */
1984 dict = device_properties(sc->sc_dev);
1985 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type);
1986
1987 /*
1988 * Map the device. All devices support memory-mapped acccess,
1989 * and it is really required for normal operation.
1990 */
1991 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
1992 switch (memtype) {
1993 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1994 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1995 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
1996 memtype, 0, &memt, &memh, NULL, &memsize) == 0);
1997 break;
1998 default:
1999 memh_valid = 0;
2000 break;
2001 }
2002
2003 if (memh_valid) {
2004 sc->sc_st = memt;
2005 sc->sc_sh = memh;
2006 sc->sc_ss = memsize;
2007 } else {
2008 aprint_error_dev(sc->sc_dev,
2009 "unable to map device registers\n");
2010 return;
2011 }
2012
2013 /*
2014 * In addition, i82544 and later support I/O mapped indirect
2015 * register access. It is not desirable (nor supported in
2016 * this driver) to use it for normal operation, though it is
2017 * required to work around bugs in some chip versions.
2018 */
2019 switch (sc->sc_type) {
2020 case WM_T_82544:
2021 case WM_T_82541:
2022 case WM_T_82541_2:
2023 case WM_T_82547:
2024 case WM_T_82547_2:
2025 /* First we have to find the I/O BAR. */
2026 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) {
2027 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
2028 if (memtype == PCI_MAPREG_TYPE_IO)
2029 break;
2030 if (PCI_MAPREG_MEM_TYPE(memtype) ==
2031 PCI_MAPREG_MEM_TYPE_64BIT)
2032 i += 4; /* skip high bits, too */
2033 }
2034 if (i < PCI_MAPREG_END) {
2035 /*
2036 * We found PCI_MAPREG_TYPE_IO. Note that 82580
2037 * (and newer?) chip has no PCI_MAPREG_TYPE_IO.
2038 * It's no problem because newer chips has no this
2039 * bug.
2040 *
2041 * The i8254x doesn't apparently respond when the
2042 * I/O BAR is 0, which looks somewhat like it's not
2043 * been configured.
2044 */
2045 preg = pci_conf_read(pc, pa->pa_tag, i);
2046 if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
2047 aprint_error_dev(sc->sc_dev,
2048 "WARNING: I/O BAR at zero.\n");
2049 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
2050 0, &sc->sc_iot, &sc->sc_ioh,
2051 NULL, &sc->sc_ios) == 0) {
2052 sc->sc_flags |= WM_F_IOH_VALID;
2053 } else
2054 aprint_error_dev(sc->sc_dev,
2055 "WARNING: unable to map I/O space\n");
2056 }
2057 break;
2058 default:
2059 break;
2060 }
2061
2062 /* Enable bus mastering. Disable MWI on the i82542 2.0. */
2063 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
2064 preg |= PCI_COMMAND_MASTER_ENABLE;
2065 if (sc->sc_type < WM_T_82542_2_1)
2066 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
2067 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
2068
2069 /* Power up chip */
2070 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self, NULL))
2071 && error != EOPNOTSUPP) {
2072 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error);
2073 return;
2074 }
2075
2076 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag));
2077 /*
2078 * Don't use MSI-X if we can use only one queue to save interrupt
2079 * resource.
2080 */
2081 if (sc->sc_nqueues > 1) {
2082 max_type = PCI_INTR_TYPE_MSIX;
2083 /*
2084 * 82583 has a MSI-X capability in the PCI configuration space
2085 * but it doesn't support it. At least the document doesn't
2086 * say anything about MSI-X.
2087 */
2088 counts[PCI_INTR_TYPE_MSIX]
2089 = (sc->sc_type == WM_T_82583) ? 0 : sc->sc_nqueues + 1;
2090 } else {
2091 max_type = PCI_INTR_TYPE_MSI;
2092 counts[PCI_INTR_TYPE_MSIX] = 0;
2093 }
2094
2095 /* Allocation settings */
2096 counts[PCI_INTR_TYPE_MSI] = 1;
2097 counts[PCI_INTR_TYPE_INTX] = 1;
2098 /* overridden by disable flags */
2099 if (wm_disable_msi != 0) {
2100 counts[PCI_INTR_TYPE_MSI] = 0;
2101 if (wm_disable_msix != 0) {
2102 max_type = PCI_INTR_TYPE_INTX;
2103 counts[PCI_INTR_TYPE_MSIX] = 0;
2104 }
2105 } else if (wm_disable_msix != 0) {
2106 max_type = PCI_INTR_TYPE_MSI;
2107 counts[PCI_INTR_TYPE_MSIX] = 0;
2108 }
2109
2110 alloc_retry:
2111 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) {
2112 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n");
2113 return;
2114 }
2115
2116 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) {
2117 error = wm_setup_msix(sc);
2118 if (error) {
2119 pci_intr_release(pc, sc->sc_intrs,
2120 counts[PCI_INTR_TYPE_MSIX]);
2121
2122 /* Setup for MSI: Disable MSI-X */
2123 max_type = PCI_INTR_TYPE_MSI;
2124 counts[PCI_INTR_TYPE_MSI] = 1;
2125 counts[PCI_INTR_TYPE_INTX] = 1;
2126 goto alloc_retry;
2127 }
2128 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) {
2129 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */
2130 error = wm_setup_legacy(sc);
2131 if (error) {
2132 pci_intr_release(sc->sc_pc, sc->sc_intrs,
2133 counts[PCI_INTR_TYPE_MSI]);
2134
2135 /* The next try is for INTx: Disable MSI */
2136 max_type = PCI_INTR_TYPE_INTX;
2137 counts[PCI_INTR_TYPE_INTX] = 1;
2138 goto alloc_retry;
2139 }
2140 } else {
2141 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */
2142 error = wm_setup_legacy(sc);
2143 if (error) {
2144 pci_intr_release(sc->sc_pc, sc->sc_intrs,
2145 counts[PCI_INTR_TYPE_INTX]);
2146 return;
2147 }
2148 }
2149
2150 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(sc->sc_dev));
2151 error = workqueue_create(&sc->sc_queue_wq, wqname,
2152 wm_handle_queue_work, sc, WM_WORKQUEUE_PRI, IPL_NET,
2153 WM_WORKQUEUE_FLAGS);
2154 if (error) {
2155 aprint_error_dev(sc->sc_dev,
2156 "unable to create workqueue\n");
2157 goto out;
2158 }
2159
2160 /*
2161 * Check the function ID (unit number of the chip).
2162 */
2163 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3)
2164 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003)
2165 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2166 || (sc->sc_type == WM_T_82580)
2167 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
2168 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS)
2169 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK;
2170 else
2171 sc->sc_funcid = 0;
2172
2173 /*
2174 * Determine a few things about the bus we're connected to.
2175 */
2176 if (sc->sc_type < WM_T_82543) {
2177 /* We don't really know the bus characteristics here. */
2178 sc->sc_bus_speed = 33;
2179 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) {
2180 /*
2181 * CSA (Communication Streaming Architecture) is about as fast
2182 * a 32-bit 66MHz PCI Bus.
2183 */
2184 sc->sc_flags |= WM_F_CSA;
2185 sc->sc_bus_speed = 66;
2186 aprint_verbose_dev(sc->sc_dev,
2187 "Communication Streaming Architecture\n");
2188 if (sc->sc_type == WM_T_82547) {
2189 callout_init(&sc->sc_txfifo_ch, WM_CALLOUT_FLAGS);
2190 callout_setfunc(&sc->sc_txfifo_ch,
2191 wm_82547_txfifo_stall, sc);
2192 aprint_verbose_dev(sc->sc_dev,
2193 "using 82547 Tx FIFO stall work-around\n");
2194 }
2195 } else if (sc->sc_type >= WM_T_82571) {
2196 sc->sc_flags |= WM_F_PCIE;
2197 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
2198 && (sc->sc_type != WM_T_ICH10)
2199 && (sc->sc_type != WM_T_PCH)
2200 && (sc->sc_type != WM_T_PCH2)
2201 && (sc->sc_type != WM_T_PCH_LPT)
2202 && (sc->sc_type != WM_T_PCH_SPT)
2203 && (sc->sc_type != WM_T_PCH_CNP)) {
2204 /* ICH* and PCH* have no PCIe capability registers */
2205 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2206 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff,
2207 NULL) == 0)
2208 aprint_error_dev(sc->sc_dev,
2209 "unable to find PCIe capability\n");
2210 }
2211 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n");
2212 } else {
2213 reg = CSR_READ(sc, WMREG_STATUS);
2214 if (reg & STATUS_BUS64)
2215 sc->sc_flags |= WM_F_BUS64;
2216 if ((reg & STATUS_PCIX_MODE) != 0) {
2217 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb;
2218
2219 sc->sc_flags |= WM_F_PCIX;
2220 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2221 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0)
2222 aprint_error_dev(sc->sc_dev,
2223 "unable to find PCIX capability\n");
2224 else if (sc->sc_type != WM_T_82545_3 &&
2225 sc->sc_type != WM_T_82546_3) {
2226 /*
2227 * Work around a problem caused by the BIOS
2228 * setting the max memory read byte count
2229 * incorrectly.
2230 */
2231 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag,
2232 sc->sc_pcixe_capoff + PCIX_CMD);
2233 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag,
2234 sc->sc_pcixe_capoff + PCIX_STATUS);
2235
2236 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >>
2237 PCIX_CMD_BYTECNT_SHIFT;
2238 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >>
2239 PCIX_STATUS_MAXB_SHIFT;
2240 if (bytecnt > maxb) {
2241 aprint_verbose_dev(sc->sc_dev,
2242 "resetting PCI-X MMRBC: %d -> %d\n",
2243 512 << bytecnt, 512 << maxb);
2244 pcix_cmd = (pcix_cmd &
2245 ~PCIX_CMD_BYTECNT_MASK) |
2246 (maxb << PCIX_CMD_BYTECNT_SHIFT);
2247 pci_conf_write(pa->pa_pc, pa->pa_tag,
2248 sc->sc_pcixe_capoff + PCIX_CMD,
2249 pcix_cmd);
2250 }
2251 }
2252 }
2253 /*
2254 * The quad port adapter is special; it has a PCIX-PCIX
2255 * bridge on the board, and can run the secondary bus at
2256 * a higher speed.
2257 */
2258 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) {
2259 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120
2260 : 66;
2261 } else if (sc->sc_flags & WM_F_PCIX) {
2262 switch (reg & STATUS_PCIXSPD_MASK) {
2263 case STATUS_PCIXSPD_50_66:
2264 sc->sc_bus_speed = 66;
2265 break;
2266 case STATUS_PCIXSPD_66_100:
2267 sc->sc_bus_speed = 100;
2268 break;
2269 case STATUS_PCIXSPD_100_133:
2270 sc->sc_bus_speed = 133;
2271 break;
2272 default:
2273 aprint_error_dev(sc->sc_dev,
2274 "unknown PCIXSPD %d; assuming 66MHz\n",
2275 reg & STATUS_PCIXSPD_MASK);
2276 sc->sc_bus_speed = 66;
2277 break;
2278 }
2279 } else
2280 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33;
2281 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n",
2282 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
2283 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI");
2284 }
2285
2286 /* clear interesting stat counters */
2287 CSR_READ(sc, WMREG_COLC);
2288 CSR_READ(sc, WMREG_RXERRC);
2289
2290 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)
2291 || (sc->sc_type >= WM_T_ICH8))
2292 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2293 if (sc->sc_type >= WM_T_ICH8)
2294 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2295
2296 /* Set PHY, NVM mutex related stuff */
2297 switch (sc->sc_type) {
2298 case WM_T_82542_2_0:
2299 case WM_T_82542_2_1:
2300 case WM_T_82543:
2301 case WM_T_82544:
2302 /* Microwire */
2303 sc->nvm.read = wm_nvm_read_uwire;
2304 sc->sc_nvm_wordsize = 64;
2305 sc->sc_nvm_addrbits = 6;
2306 break;
2307 case WM_T_82540:
2308 case WM_T_82545:
2309 case WM_T_82545_3:
2310 case WM_T_82546:
2311 case WM_T_82546_3:
2312 /* Microwire */
2313 sc->nvm.read = wm_nvm_read_uwire;
2314 reg = CSR_READ(sc, WMREG_EECD);
2315 if (reg & EECD_EE_SIZE) {
2316 sc->sc_nvm_wordsize = 256;
2317 sc->sc_nvm_addrbits = 8;
2318 } else {
2319 sc->sc_nvm_wordsize = 64;
2320 sc->sc_nvm_addrbits = 6;
2321 }
2322 sc->sc_flags |= WM_F_LOCK_EECD;
2323 sc->nvm.acquire = wm_get_eecd;
2324 sc->nvm.release = wm_put_eecd;
2325 break;
2326 case WM_T_82541:
2327 case WM_T_82541_2:
2328 case WM_T_82547:
2329 case WM_T_82547_2:
2330 reg = CSR_READ(sc, WMREG_EECD);
2331 /*
2332 * wm_nvm_set_addrbits_size_eecd() accesses SPI in it only
2333 * on 8254[17], so set flags and functios before calling it.
2334 */
2335 sc->sc_flags |= WM_F_LOCK_EECD;
2336 sc->nvm.acquire = wm_get_eecd;
2337 sc->nvm.release = wm_put_eecd;
2338 if (reg & EECD_EE_TYPE) {
2339 /* SPI */
2340 sc->nvm.read = wm_nvm_read_spi;
2341 sc->sc_flags |= WM_F_EEPROM_SPI;
2342 wm_nvm_set_addrbits_size_eecd(sc);
2343 } else {
2344 /* Microwire */
2345 sc->nvm.read = wm_nvm_read_uwire;
2346 if ((reg & EECD_EE_ABITS) != 0) {
2347 sc->sc_nvm_wordsize = 256;
2348 sc->sc_nvm_addrbits = 8;
2349 } else {
2350 sc->sc_nvm_wordsize = 64;
2351 sc->sc_nvm_addrbits = 6;
2352 }
2353 }
2354 break;
2355 case WM_T_82571:
2356 case WM_T_82572:
2357 /* SPI */
2358 sc->nvm.read = wm_nvm_read_eerd;
2359 /* Not use WM_F_LOCK_EECD because we use EERD */
2360 sc->sc_flags |= WM_F_EEPROM_SPI;
2361 wm_nvm_set_addrbits_size_eecd(sc);
2362 sc->phy.acquire = wm_get_swsm_semaphore;
2363 sc->phy.release = wm_put_swsm_semaphore;
2364 sc->nvm.acquire = wm_get_nvm_82571;
2365 sc->nvm.release = wm_put_nvm_82571;
2366 break;
2367 case WM_T_82573:
2368 case WM_T_82574:
2369 case WM_T_82583:
2370 sc->nvm.read = wm_nvm_read_eerd;
2371 /* Not use WM_F_LOCK_EECD because we use EERD */
2372 if (sc->sc_type == WM_T_82573) {
2373 sc->phy.acquire = wm_get_swsm_semaphore;
2374 sc->phy.release = wm_put_swsm_semaphore;
2375 sc->nvm.acquire = wm_get_nvm_82571;
2376 sc->nvm.release = wm_put_nvm_82571;
2377 } else {
2378 /* Both PHY and NVM use the same semaphore. */
2379 sc->phy.acquire = sc->nvm.acquire
2380 = wm_get_swfwhw_semaphore;
2381 sc->phy.release = sc->nvm.release
2382 = wm_put_swfwhw_semaphore;
2383 }
2384 if (wm_nvm_is_onboard_eeprom(sc) == 0) {
2385 sc->sc_flags |= WM_F_EEPROM_FLASH;
2386 sc->sc_nvm_wordsize = 2048;
2387 } else {
2388 /* SPI */
2389 sc->sc_flags |= WM_F_EEPROM_SPI;
2390 wm_nvm_set_addrbits_size_eecd(sc);
2391 }
2392 break;
2393 case WM_T_82575:
2394 case WM_T_82576:
2395 case WM_T_82580:
2396 case WM_T_I350:
2397 case WM_T_I354:
2398 case WM_T_80003:
2399 /* SPI */
2400 sc->sc_flags |= WM_F_EEPROM_SPI;
2401 wm_nvm_set_addrbits_size_eecd(sc);
2402 if ((sc->sc_type == WM_T_80003)
2403 || (sc->sc_nvm_wordsize < (1 << 15))) {
2404 sc->nvm.read = wm_nvm_read_eerd;
2405 /* Don't use WM_F_LOCK_EECD because we use EERD */
2406 } else {
2407 sc->nvm.read = wm_nvm_read_spi;
2408 sc->sc_flags |= WM_F_LOCK_EECD;
2409 }
2410 sc->phy.acquire = wm_get_phy_82575;
2411 sc->phy.release = wm_put_phy_82575;
2412 sc->nvm.acquire = wm_get_nvm_80003;
2413 sc->nvm.release = wm_put_nvm_80003;
2414 break;
2415 case WM_T_ICH8:
2416 case WM_T_ICH9:
2417 case WM_T_ICH10:
2418 case WM_T_PCH:
2419 case WM_T_PCH2:
2420 case WM_T_PCH_LPT:
2421 sc->nvm.read = wm_nvm_read_ich8;
2422 /* FLASH */
2423 sc->sc_flags |= WM_F_EEPROM_FLASH;
2424 sc->sc_nvm_wordsize = 2048;
2425 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH);
2426 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0,
2427 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) {
2428 aprint_error_dev(sc->sc_dev,
2429 "can't map FLASH registers\n");
2430 goto out;
2431 }
2432 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG);
2433 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) *
2434 ICH_FLASH_SECTOR_SIZE;
2435 sc->sc_ich8_flash_bank_size =
2436 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1;
2437 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK);
2438 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
2439 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t);
2440 sc->sc_flashreg_offset = 0;
2441 sc->phy.acquire = wm_get_swflag_ich8lan;
2442 sc->phy.release = wm_put_swflag_ich8lan;
2443 sc->nvm.acquire = wm_get_nvm_ich8lan;
2444 sc->nvm.release = wm_put_nvm_ich8lan;
2445 break;
2446 case WM_T_PCH_SPT:
2447 case WM_T_PCH_CNP:
2448 sc->nvm.read = wm_nvm_read_spt;
2449 /* SPT has no GFPREG; flash registers mapped through BAR0 */
2450 sc->sc_flags |= WM_F_EEPROM_FLASH;
2451 sc->sc_flasht = sc->sc_st;
2452 sc->sc_flashh = sc->sc_sh;
2453 sc->sc_ich8_flash_base = 0;
2454 sc->sc_nvm_wordsize =
2455 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1)
2456 * NVM_SIZE_MULTIPLIER;
2457 /* It is size in bytes, we want words */
2458 sc->sc_nvm_wordsize /= 2;
2459 /* Assume 2 banks */
2460 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2;
2461 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET;
2462 sc->phy.acquire = wm_get_swflag_ich8lan;
2463 sc->phy.release = wm_put_swflag_ich8lan;
2464 sc->nvm.acquire = wm_get_nvm_ich8lan;
2465 sc->nvm.release = wm_put_nvm_ich8lan;
2466 break;
2467 case WM_T_I210:
2468 case WM_T_I211:
2469 /* Allow a single clear of the SW semaphore on I210 and newer*/
2470 sc->sc_flags |= WM_F_WA_I210_CLSEM;
2471 if (wm_nvm_flash_presence_i210(sc)) {
2472 sc->nvm.read = wm_nvm_read_eerd;
2473 /* Don't use WM_F_LOCK_EECD because we use EERD */
2474 sc->sc_flags |= WM_F_EEPROM_FLASH_HW;
2475 wm_nvm_set_addrbits_size_eecd(sc);
2476 } else {
2477 sc->nvm.read = wm_nvm_read_invm;
2478 sc->sc_flags |= WM_F_EEPROM_INVM;
2479 sc->sc_nvm_wordsize = INVM_SIZE;
2480 }
2481 sc->phy.acquire = wm_get_phy_82575;
2482 sc->phy.release = wm_put_phy_82575;
2483 sc->nvm.acquire = wm_get_nvm_80003;
2484 sc->nvm.release = wm_put_nvm_80003;
2485 break;
2486 default:
2487 break;
2488 }
2489
2490 /* Ensure the SMBI bit is clear before first NVM or PHY access */
2491 switch (sc->sc_type) {
2492 case WM_T_82571:
2493 case WM_T_82572:
2494 reg = CSR_READ(sc, WMREG_SWSM2);
2495 if ((reg & SWSM2_LOCK) == 0) {
2496 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK);
2497 force_clear_smbi = true;
2498 } else
2499 force_clear_smbi = false;
2500 break;
2501 case WM_T_82573:
2502 case WM_T_82574:
2503 case WM_T_82583:
2504 force_clear_smbi = true;
2505 break;
2506 default:
2507 force_clear_smbi = false;
2508 break;
2509 }
2510 if (force_clear_smbi) {
2511 reg = CSR_READ(sc, WMREG_SWSM);
2512 if ((reg & SWSM_SMBI) != 0)
2513 aprint_error_dev(sc->sc_dev,
2514 "Please update the Bootagent\n");
2515 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI);
2516 }
2517
2518 /*
2519 * Defer printing the EEPROM type until after verifying the checksum
2520 * This allows the EEPROM type to be printed correctly in the case
2521 * that no EEPROM is attached.
2522 */
2523 /*
2524 * Validate the EEPROM checksum. If the checksum fails, flag
2525 * this for later, so we can fail future reads from the EEPROM.
2526 */
2527 if (wm_nvm_validate_checksum(sc)) {
2528 /*
2529 * Read twice again because some PCI-e parts fail the
2530 * first check due to the link being in sleep state.
2531 */
2532 if (wm_nvm_validate_checksum(sc))
2533 sc->sc_flags |= WM_F_EEPROM_INVALID;
2534 }
2535
2536 if (sc->sc_flags & WM_F_EEPROM_INVALID)
2537 aprint_verbose_dev(sc->sc_dev, "No EEPROM");
2538 else {
2539 aprint_verbose_dev(sc->sc_dev, "%u words ",
2540 sc->sc_nvm_wordsize);
2541 if (sc->sc_flags & WM_F_EEPROM_INVM)
2542 aprint_verbose("iNVM");
2543 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW)
2544 aprint_verbose("FLASH(HW)");
2545 else if (sc->sc_flags & WM_F_EEPROM_FLASH)
2546 aprint_verbose("FLASH");
2547 else {
2548 if (sc->sc_flags & WM_F_EEPROM_SPI)
2549 eetype = "SPI";
2550 else
2551 eetype = "MicroWire";
2552 aprint_verbose("(%d address bits) %s EEPROM",
2553 sc->sc_nvm_addrbits, eetype);
2554 }
2555 }
2556 wm_nvm_version(sc);
2557 aprint_verbose("\n");
2558
2559 /*
2560 * XXX The first call of wm_gmii_setup_phytype. The result might be
2561 * incorrect.
2562 */
2563 wm_gmii_setup_phytype(sc, 0, 0);
2564
2565 /* Check for WM_F_WOL on some chips before wm_reset() */
2566 switch (sc->sc_type) {
2567 case WM_T_ICH8:
2568 case WM_T_ICH9:
2569 case WM_T_ICH10:
2570 case WM_T_PCH:
2571 case WM_T_PCH2:
2572 case WM_T_PCH_LPT:
2573 case WM_T_PCH_SPT:
2574 case WM_T_PCH_CNP:
2575 apme_mask = WUC_APME;
2576 eeprom_data = CSR_READ(sc, WMREG_WUC);
2577 if ((eeprom_data & apme_mask) != 0)
2578 sc->sc_flags |= WM_F_WOL;
2579 break;
2580 default:
2581 break;
2582 }
2583
2584 /* Reset the chip to a known state. */
2585 wm_reset(sc);
2586
2587 /*
2588 * Check for I21[01] PLL workaround.
2589 *
2590 * Three cases:
2591 * a) Chip is I211.
2592 * b) Chip is I210 and it uses INVM (not FLASH).
2593 * c) Chip is I210 (and it uses FLASH) and the NVM image version < 3.25
2594 */
2595 if (sc->sc_type == WM_T_I211)
2596 sc->sc_flags |= WM_F_PLL_WA_I210;
2597 if (sc->sc_type == WM_T_I210) {
2598 if (!wm_nvm_flash_presence_i210(sc))
2599 sc->sc_flags |= WM_F_PLL_WA_I210;
2600 else if ((sc->sc_nvm_ver_major < 3)
2601 || ((sc->sc_nvm_ver_major == 3)
2602 && (sc->sc_nvm_ver_minor < 25))) {
2603 aprint_verbose_dev(sc->sc_dev,
2604 "ROM image version %d.%d is older than 3.25\n",
2605 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor);
2606 sc->sc_flags |= WM_F_PLL_WA_I210;
2607 }
2608 }
2609 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
2610 wm_pll_workaround_i210(sc);
2611
2612 wm_get_wakeup(sc);
2613
2614 /* Non-AMT based hardware can now take control from firmware */
2615 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
2616 wm_get_hw_control(sc);
2617
2618 /*
2619 * Read the Ethernet address from the EEPROM, if not first found
2620 * in device properties.
2621 */
2622 ea = prop_dictionary_get(dict, "mac-address");
2623 if (ea != NULL) {
2624 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA);
2625 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN);
2626 memcpy(enaddr, prop_data_value(ea), ETHER_ADDR_LEN);
2627 } else {
2628 if (wm_read_mac_addr(sc, enaddr) != 0) {
2629 aprint_error_dev(sc->sc_dev,
2630 "unable to read Ethernet address\n");
2631 goto out;
2632 }
2633 }
2634
2635 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
2636 ether_sprintf(enaddr));
2637
2638 /*
2639 * Read the config info from the EEPROM, and set up various
2640 * bits in the control registers based on their contents.
2641 */
2642 pn = prop_dictionary_get(dict, "i82543-cfg1");
2643 if (pn != NULL) {
2644 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2645 cfg1 = (uint16_t) prop_number_signed_value(pn);
2646 } else {
2647 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) {
2648 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n");
2649 goto out;
2650 }
2651 }
2652
2653 pn = prop_dictionary_get(dict, "i82543-cfg2");
2654 if (pn != NULL) {
2655 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2656 cfg2 = (uint16_t) prop_number_signed_value(pn);
2657 } else {
2658 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) {
2659 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n");
2660 goto out;
2661 }
2662 }
2663
2664 /* check for WM_F_WOL */
2665 switch (sc->sc_type) {
2666 case WM_T_82542_2_0:
2667 case WM_T_82542_2_1:
2668 case WM_T_82543:
2669 /* dummy? */
2670 eeprom_data = 0;
2671 apme_mask = NVM_CFG3_APME;
2672 break;
2673 case WM_T_82544:
2674 apme_mask = NVM_CFG2_82544_APM_EN;
2675 eeprom_data = cfg2;
2676 break;
2677 case WM_T_82546:
2678 case WM_T_82546_3:
2679 case WM_T_82571:
2680 case WM_T_82572:
2681 case WM_T_82573:
2682 case WM_T_82574:
2683 case WM_T_82583:
2684 case WM_T_80003:
2685 case WM_T_82575:
2686 case WM_T_82576:
2687 apme_mask = NVM_CFG3_APME;
2688 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB
2689 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2690 break;
2691 case WM_T_82580:
2692 case WM_T_I350:
2693 case WM_T_I354:
2694 case WM_T_I210:
2695 case WM_T_I211:
2696 apme_mask = NVM_CFG3_APME;
2697 wm_nvm_read(sc,
2698 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA,
2699 1, &eeprom_data);
2700 break;
2701 case WM_T_ICH8:
2702 case WM_T_ICH9:
2703 case WM_T_ICH10:
2704 case WM_T_PCH:
2705 case WM_T_PCH2:
2706 case WM_T_PCH_LPT:
2707 case WM_T_PCH_SPT:
2708 case WM_T_PCH_CNP:
2709 /* Already checked before wm_reset () */
2710 apme_mask = eeprom_data = 0;
2711 break;
2712 default: /* XXX 82540 */
2713 apme_mask = NVM_CFG3_APME;
2714 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2715 break;
2716 }
2717 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */
2718 if ((eeprom_data & apme_mask) != 0)
2719 sc->sc_flags |= WM_F_WOL;
2720
2721 /*
2722 * We have the eeprom settings, now apply the special cases
2723 * where the eeprom may be wrong or the board won't support
2724 * wake on lan on a particular port
2725 */
2726 switch (sc->sc_pcidevid) {
2727 case PCI_PRODUCT_INTEL_82546GB_PCIE:
2728 sc->sc_flags &= ~WM_F_WOL;
2729 break;
2730 case PCI_PRODUCT_INTEL_82546EB_FIBER:
2731 case PCI_PRODUCT_INTEL_82546GB_FIBER:
2732 /* Wake events only supported on port A for dual fiber
2733 * regardless of eeprom setting */
2734 if (sc->sc_funcid == 1)
2735 sc->sc_flags &= ~WM_F_WOL;
2736 break;
2737 case PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3:
2738 /* If quad port adapter, disable WoL on all but port A */
2739 if (sc->sc_funcid != 0)
2740 sc->sc_flags &= ~WM_F_WOL;
2741 break;
2742 case PCI_PRODUCT_INTEL_82571EB_FIBER:
2743 /* Wake events only supported on port A for dual fiber
2744 * regardless of eeprom setting */
2745 if (sc->sc_funcid == 1)
2746 sc->sc_flags &= ~WM_F_WOL;
2747 break;
2748 case PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER:
2749 case PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER:
2750 case PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER:
2751 /* If quad port adapter, disable WoL on all but port A */
2752 if (sc->sc_funcid != 0)
2753 sc->sc_flags &= ~WM_F_WOL;
2754 break;
2755 }
2756
2757 if (sc->sc_type >= WM_T_82575) {
2758 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) {
2759 aprint_debug_dev(sc->sc_dev, "COMPAT = %hx\n",
2760 nvmword);
2761 if ((sc->sc_type == WM_T_82575) ||
2762 (sc->sc_type == WM_T_82576)) {
2763 /* Check NVM for autonegotiation */
2764 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE)
2765 != 0)
2766 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO;
2767 }
2768 if ((sc->sc_type == WM_T_82575) ||
2769 (sc->sc_type == WM_T_I350)) {
2770 if (nvmword & NVM_COMPAT_MAS_EN(sc->sc_funcid))
2771 sc->sc_flags |= WM_F_MAS;
2772 }
2773 }
2774 }
2775
2776 /*
2777 * XXX need special handling for some multiple port cards
2778 * to disable a paticular port.
2779 */
2780
2781 if (sc->sc_type >= WM_T_82544) {
2782 pn = prop_dictionary_get(dict, "i82543-swdpin");
2783 if (pn != NULL) {
2784 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2785 swdpin = (uint16_t) prop_number_signed_value(pn);
2786 } else {
2787 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) {
2788 aprint_error_dev(sc->sc_dev,
2789 "unable to read SWDPIN\n");
2790 goto out;
2791 }
2792 }
2793 }
2794
2795 if (cfg1 & NVM_CFG1_ILOS)
2796 sc->sc_ctrl |= CTRL_ILOS;
2797
2798 /*
2799 * XXX
2800 * This code isn't correct because pin 2 and 3 are located
2801 * in different position on newer chips. Check all datasheet.
2802 *
2803 * Until resolve this problem, check if a chip < 82580
2804 */
2805 if (sc->sc_type <= WM_T_82580) {
2806 if (sc->sc_type >= WM_T_82544) {
2807 sc->sc_ctrl |=
2808 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
2809 CTRL_SWDPIO_SHIFT;
2810 sc->sc_ctrl |=
2811 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
2812 CTRL_SWDPINS_SHIFT;
2813 } else {
2814 sc->sc_ctrl |=
2815 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) <<
2816 CTRL_SWDPIO_SHIFT;
2817 }
2818 }
2819
2820 if ((sc->sc_type >= WM_T_82580) && (sc->sc_type <= WM_T_I211)) {
2821 wm_nvm_read(sc,
2822 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA,
2823 1, &nvmword);
2824 if (nvmword & NVM_CFG3_ILOS)
2825 sc->sc_ctrl |= CTRL_ILOS;
2826 }
2827
2828 #if 0
2829 if (sc->sc_type >= WM_T_82544) {
2830 if (cfg1 & NVM_CFG1_IPS0)
2831 sc->sc_ctrl_ext |= CTRL_EXT_IPS;
2832 if (cfg1 & NVM_CFG1_IPS1)
2833 sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
2834 sc->sc_ctrl_ext |=
2835 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
2836 CTRL_EXT_SWDPIO_SHIFT;
2837 sc->sc_ctrl_ext |=
2838 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
2839 CTRL_EXT_SWDPINS_SHIFT;
2840 } else {
2841 sc->sc_ctrl_ext |=
2842 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) <<
2843 CTRL_EXT_SWDPIO_SHIFT;
2844 }
2845 #endif
2846
2847 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2848 #if 0
2849 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
2850 #endif
2851
2852 if (sc->sc_type == WM_T_PCH) {
2853 uint16_t val;
2854
2855 /* Save the NVM K1 bit setting */
2856 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val);
2857
2858 if ((val & NVM_K1_CONFIG_ENABLE) != 0)
2859 sc->sc_nvm_k1_enabled = 1;
2860 else
2861 sc->sc_nvm_k1_enabled = 0;
2862 }
2863
2864 /* Determine if we're GMII, TBI, SERDES or SGMII mode */
2865 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9
2866 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH
2867 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT
2868 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_PCH_CNP
2869 || sc->sc_type == WM_T_82573
2870 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) {
2871 /* Copper only */
2872 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2873 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350)
2874 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210)
2875 || (sc->sc_type ==WM_T_I211)) {
2876 reg = CSR_READ(sc, WMREG_CTRL_EXT);
2877 link_mode = reg & CTRL_EXT_LINK_MODE_MASK;
2878 switch (link_mode) {
2879 case CTRL_EXT_LINK_MODE_1000KX:
2880 aprint_normal_dev(sc->sc_dev, "1000KX\n");
2881 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2882 break;
2883 case CTRL_EXT_LINK_MODE_SGMII:
2884 if (wm_sgmii_uses_mdio(sc)) {
2885 aprint_normal_dev(sc->sc_dev,
2886 "SGMII(MDIO)\n");
2887 sc->sc_flags |= WM_F_SGMII;
2888 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2889 break;
2890 }
2891 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n");
2892 /*FALLTHROUGH*/
2893 case CTRL_EXT_LINK_MODE_PCIE_SERDES:
2894 sc->sc_mediatype = wm_sfp_get_media_type(sc);
2895 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) {
2896 if (link_mode
2897 == CTRL_EXT_LINK_MODE_SGMII) {
2898 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2899 sc->sc_flags |= WM_F_SGMII;
2900 aprint_verbose_dev(sc->sc_dev,
2901 "SGMII\n");
2902 } else {
2903 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2904 aprint_verbose_dev(sc->sc_dev,
2905 "SERDES\n");
2906 }
2907 break;
2908 }
2909 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
2910 aprint_normal_dev(sc->sc_dev, "SERDES(SFP)\n");
2911 else if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2912 aprint_normal_dev(sc->sc_dev, "SGMII(SFP)\n");
2913 sc->sc_flags |= WM_F_SGMII;
2914 }
2915 /* Do not change link mode for 100BaseFX */
2916 if (sc->sc_sfptype == SFF_SFP_ETH_FLAGS_100FX)
2917 break;
2918
2919 /* Change current link mode setting */
2920 reg &= ~CTRL_EXT_LINK_MODE_MASK;
2921 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2922 reg |= CTRL_EXT_LINK_MODE_SGMII;
2923 else
2924 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES;
2925 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2926 break;
2927 case CTRL_EXT_LINK_MODE_GMII:
2928 default:
2929 aprint_normal_dev(sc->sc_dev, "Copper\n");
2930 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2931 break;
2932 }
2933
2934 reg &= ~CTRL_EXT_I2C_ENA;
2935 if ((sc->sc_flags & WM_F_SGMII) != 0)
2936 reg |= CTRL_EXT_I2C_ENA;
2937 else
2938 reg &= ~CTRL_EXT_I2C_ENA;
2939 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2940 if ((sc->sc_flags & WM_F_SGMII) != 0) {
2941 if (!wm_sgmii_uses_mdio(sc))
2942 wm_gmii_setup_phytype(sc, 0, 0);
2943 wm_reset_mdicnfg_82580(sc);
2944 }
2945 } else if (sc->sc_type < WM_T_82543 ||
2946 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
2947 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2948 aprint_error_dev(sc->sc_dev,
2949 "WARNING: TBIMODE set on 1000BASE-T product!\n");
2950 sc->sc_mediatype = WM_MEDIATYPE_FIBER;
2951 }
2952 } else {
2953 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) {
2954 aprint_error_dev(sc->sc_dev,
2955 "WARNING: TBIMODE clear on 1000BASE-X product!\n");
2956 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2957 }
2958 }
2959
2960 if (sc->sc_type >= WM_T_PCH2)
2961 sc->sc_flags |= WM_F_EEE;
2962 else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211)
2963 && (sc->sc_mediatype == WM_MEDIATYPE_COPPER)) {
2964 /* XXX: Need special handling for I354. (not yet) */
2965 if (sc->sc_type != WM_T_I354)
2966 sc->sc_flags |= WM_F_EEE;
2967 }
2968
2969 /*
2970 * The I350 has a bug where it always strips the CRC whether
2971 * asked to or not. So ask for stripped CRC here and cope in rxeof
2972 */
2973 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
2974 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
2975 sc->sc_flags |= WM_F_CRC_STRIP;
2976
2977 /* Set device properties (macflags) */
2978 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags);
2979
2980 if (sc->sc_flags != 0) {
2981 snprintb(buf, sizeof(buf), WM_FLAGS, sc->sc_flags);
2982 aprint_verbose_dev(sc->sc_dev, "%s\n", buf);
2983 }
2984
2985 #ifdef WM_MPSAFE
2986 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2987 #else
2988 sc->sc_core_lock = NULL;
2989 #endif
2990
2991 /* Initialize the media structures accordingly. */
2992 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2993 wm_gmii_mediainit(sc, wmp->wmp_product);
2994 else
2995 wm_tbi_mediainit(sc); /* All others */
2996
2997 ifp = &sc->sc_ethercom.ec_if;
2998 xname = device_xname(sc->sc_dev);
2999 strlcpy(ifp->if_xname, xname, IFNAMSIZ);
3000 ifp->if_softc = sc;
3001 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
3002 #ifdef WM_MPSAFE
3003 ifp->if_extflags = IFEF_MPSAFE;
3004 #endif
3005 ifp->if_ioctl = wm_ioctl;
3006 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
3007 ifp->if_start = wm_nq_start;
3008 /*
3009 * When the number of CPUs is one and the controller can use
3010 * MSI-X, wm(4) use MSI-X but *does not* use multiqueue.
3011 * That is, wm(4) use two interrupts, one is used for Tx/Rx
3012 * and the other is used for link status changing.
3013 * In this situation, wm_nq_transmit() is disadvantageous
3014 * because of wm_select_txqueue() and pcq(9) overhead.
3015 */
3016 if (wm_is_using_multiqueue(sc))
3017 ifp->if_transmit = wm_nq_transmit;
3018 } else {
3019 ifp->if_start = wm_start;
3020 /*
3021 * wm_transmit() has the same disadvantage as wm_transmit().
3022 */
3023 if (wm_is_using_multiqueue(sc))
3024 ifp->if_transmit = wm_transmit;
3025 }
3026 /* wm(4) doest not use ifp->if_watchdog, use wm_tick as watchdog. */
3027 ifp->if_init = wm_init;
3028 ifp->if_stop = wm_stop;
3029 IFQ_SET_MAXLEN(&ifp->if_snd, uimax(WM_IFQUEUELEN, IFQ_MAXLEN));
3030 IFQ_SET_READY(&ifp->if_snd);
3031
3032 /* Check for jumbo frame */
3033 switch (sc->sc_type) {
3034 case WM_T_82573:
3035 /* XXX limited to 9234 if ASPM is disabled */
3036 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword);
3037 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0)
3038 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
3039 break;
3040 case WM_T_82571:
3041 case WM_T_82572:
3042 case WM_T_82574:
3043 case WM_T_82583:
3044 case WM_T_82575:
3045 case WM_T_82576:
3046 case WM_T_82580:
3047 case WM_T_I350:
3048 case WM_T_I354:
3049 case WM_T_I210:
3050 case WM_T_I211:
3051 case WM_T_80003:
3052 case WM_T_ICH9:
3053 case WM_T_ICH10:
3054 case WM_T_PCH2: /* PCH2 supports 9K frame size */
3055 case WM_T_PCH_LPT:
3056 case WM_T_PCH_SPT:
3057 case WM_T_PCH_CNP:
3058 /* XXX limited to 9234 */
3059 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
3060 break;
3061 case WM_T_PCH:
3062 /* XXX limited to 4096 */
3063 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
3064 break;
3065 case WM_T_82542_2_0:
3066 case WM_T_82542_2_1:
3067 case WM_T_ICH8:
3068 /* No support for jumbo frame */
3069 break;
3070 default:
3071 /* ETHER_MAX_LEN_JUMBO */
3072 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
3073 break;
3074 }
3075
3076 /* If we're a i82543 or greater, we can support VLANs. */
3077 if (sc->sc_type >= WM_T_82543) {
3078 sc->sc_ethercom.ec_capabilities |=
3079 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING;
3080 sc->sc_ethercom.ec_capenable |= ETHERCAP_VLAN_HWTAGGING;
3081 }
3082
3083 if ((sc->sc_flags & WM_F_EEE) != 0)
3084 sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE;
3085
3086 /*
3087 * We can perform TCPv4 and UDPv4 checkums in-bound. Only
3088 * on i82543 and later.
3089 */
3090 if (sc->sc_type >= WM_T_82543) {
3091 ifp->if_capabilities |=
3092 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
3093 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
3094 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
3095 IFCAP_CSUM_TCPv6_Tx |
3096 IFCAP_CSUM_UDPv6_Tx;
3097 }
3098
3099 /*
3100 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL.
3101 *
3102 * 82541GI (8086:1076) ... no
3103 * 82572EI (8086:10b9) ... yes
3104 */
3105 if (sc->sc_type >= WM_T_82571) {
3106 ifp->if_capabilities |=
3107 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
3108 }
3109
3110 /*
3111 * If we're a i82544 or greater (except i82547), we can do
3112 * TCP segmentation offload.
3113 */
3114 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) {
3115 ifp->if_capabilities |= IFCAP_TSOv4;
3116 }
3117
3118 if (sc->sc_type >= WM_T_82571) {
3119 ifp->if_capabilities |= IFCAP_TSOv6;
3120 }
3121
3122 sc->sc_tx_process_limit = WM_TX_PROCESS_LIMIT_DEFAULT;
3123 sc->sc_tx_intr_process_limit = WM_TX_INTR_PROCESS_LIMIT_DEFAULT;
3124 sc->sc_rx_process_limit = WM_RX_PROCESS_LIMIT_DEFAULT;
3125 sc->sc_rx_intr_process_limit = WM_RX_INTR_PROCESS_LIMIT_DEFAULT;
3126
3127 /* Attach the interface. */
3128 if_initialize(ifp);
3129 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if);
3130 ether_ifattach(ifp, enaddr);
3131 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb);
3132 if_register(ifp);
3133 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET,
3134 RND_FLAG_DEFAULT);
3135
3136 #ifdef WM_EVENT_COUNTERS
3137 /* Attach event counters. */
3138 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
3139 NULL, xname, "linkintr");
3140
3141 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC,
3142 NULL, xname, "tx_xoff");
3143 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC,
3144 NULL, xname, "tx_xon");
3145 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC,
3146 NULL, xname, "rx_xoff");
3147 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC,
3148 NULL, xname, "rx_xon");
3149 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC,
3150 NULL, xname, "rx_macctl");
3151 #endif /* WM_EVENT_COUNTERS */
3152
3153 sc->sc_txrx_use_workqueue = false;
3154
3155 if (wm_phy_need_linkdown_discard(sc))
3156 wm_set_linkdown_discard(sc);
3157
3158 wm_init_sysctls(sc);
3159
3160 if (pmf_device_register(self, wm_suspend, wm_resume))
3161 pmf_class_network_register(self, ifp);
3162 else
3163 aprint_error_dev(self, "couldn't establish power handler\n");
3164
3165 sc->sc_flags |= WM_F_ATTACHED;
3166 out:
3167 return;
3168 }
3169
3170 /* The detach function (ca_detach) */
3171 static int
3172 wm_detach(device_t self, int flags __unused)
3173 {
3174 struct wm_softc *sc = device_private(self);
3175 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3176 int i;
3177
3178 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
3179 return 0;
3180
3181 /* Stop the interface. Callouts are stopped in it. */
3182 wm_stop(ifp, 1);
3183
3184 pmf_device_deregister(self);
3185
3186 sysctl_teardown(&sc->sc_sysctllog);
3187
3188 #ifdef WM_EVENT_COUNTERS
3189 evcnt_detach(&sc->sc_ev_linkintr);
3190
3191 evcnt_detach(&sc->sc_ev_tx_xoff);
3192 evcnt_detach(&sc->sc_ev_tx_xon);
3193 evcnt_detach(&sc->sc_ev_rx_xoff);
3194 evcnt_detach(&sc->sc_ev_rx_xon);
3195 evcnt_detach(&sc->sc_ev_rx_macctl);
3196 #endif /* WM_EVENT_COUNTERS */
3197
3198 rnd_detach_source(&sc->rnd_source);
3199
3200 /* Tell the firmware about the release */
3201 WM_CORE_LOCK(sc);
3202 wm_release_manageability(sc);
3203 wm_release_hw_control(sc);
3204 wm_enable_wakeup(sc);
3205 WM_CORE_UNLOCK(sc);
3206
3207 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
3208
3209 ether_ifdetach(ifp);
3210 if_detach(ifp);
3211 if_percpuq_destroy(sc->sc_ipq);
3212
3213 /* Delete all remaining media. */
3214 ifmedia_fini(&sc->sc_mii.mii_media);
3215
3216 /* Unload RX dmamaps and free mbufs */
3217 for (i = 0; i < sc->sc_nqueues; i++) {
3218 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
3219 mutex_enter(rxq->rxq_lock);
3220 wm_rxdrain(rxq);
3221 mutex_exit(rxq->rxq_lock);
3222 }
3223 /* Must unlock here */
3224
3225 /* Disestablish the interrupt handler */
3226 for (i = 0; i < sc->sc_nintrs; i++) {
3227 if (sc->sc_ihs[i] != NULL) {
3228 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
3229 sc->sc_ihs[i] = NULL;
3230 }
3231 }
3232 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs);
3233
3234 /* wm_stop() ensure workqueue is stopped. */
3235 workqueue_destroy(sc->sc_queue_wq);
3236
3237 for (i = 0; i < sc->sc_nqueues; i++)
3238 softint_disestablish(sc->sc_queue[i].wmq_si);
3239
3240 wm_free_txrx_queues(sc);
3241
3242 /* Unmap the registers */
3243 if (sc->sc_ss) {
3244 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss);
3245 sc->sc_ss = 0;
3246 }
3247 if (sc->sc_ios) {
3248 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
3249 sc->sc_ios = 0;
3250 }
3251 if (sc->sc_flashs) {
3252 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs);
3253 sc->sc_flashs = 0;
3254 }
3255
3256 if (sc->sc_core_lock)
3257 mutex_obj_free(sc->sc_core_lock);
3258 if (sc->sc_ich_phymtx)
3259 mutex_obj_free(sc->sc_ich_phymtx);
3260 if (sc->sc_ich_nvmmtx)
3261 mutex_obj_free(sc->sc_ich_nvmmtx);
3262
3263 return 0;
3264 }
3265
3266 static bool
3267 wm_suspend(device_t self, const pmf_qual_t *qual)
3268 {
3269 struct wm_softc *sc = device_private(self);
3270
3271 wm_release_manageability(sc);
3272 wm_release_hw_control(sc);
3273 wm_enable_wakeup(sc);
3274
3275 return true;
3276 }
3277
3278 static bool
3279 wm_resume(device_t self, const pmf_qual_t *qual)
3280 {
3281 struct wm_softc *sc = device_private(self);
3282 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3283 pcireg_t reg;
3284 char buf[256];
3285
3286 reg = CSR_READ(sc, WMREG_WUS);
3287 if (reg != 0) {
3288 snprintb(buf, sizeof(buf), WUS_FLAGS, reg);
3289 device_printf(sc->sc_dev, "wakeup status %s\n", buf);
3290 CSR_WRITE(sc, WMREG_WUS, 0xffffffff); /* W1C */
3291 }
3292
3293 if (sc->sc_type >= WM_T_PCH2)
3294 wm_resume_workarounds_pchlan(sc);
3295 if ((ifp->if_flags & IFF_UP) == 0) {
3296 /* >= PCH_SPT hardware workaround before reset. */
3297 if (sc->sc_type >= WM_T_PCH_SPT)
3298 wm_flush_desc_rings(sc);
3299
3300 wm_reset(sc);
3301 /* Non-AMT based hardware can now take control from firmware */
3302 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
3303 wm_get_hw_control(sc);
3304 wm_init_manageability(sc);
3305 } else {
3306 /*
3307 * We called pmf_class_network_register(), so if_init() is
3308 * automatically called when IFF_UP. wm_reset(),
3309 * wm_get_hw_control() and wm_init_manageability() are called
3310 * via wm_init().
3311 */
3312 }
3313
3314 return true;
3315 }
3316
3317 /*
3318 * wm_watchdog: [ifnet interface function]
3319 *
3320 * Watchdog timer handler.
3321 */
3322 static void
3323 wm_watchdog(struct ifnet *ifp)
3324 {
3325 int qid;
3326 struct wm_softc *sc = ifp->if_softc;
3327 uint16_t hang_queue = 0; /* Max queue number of wm(4) is 82576's 16. */
3328
3329 for (qid = 0; qid < sc->sc_nqueues; qid++) {
3330 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq;
3331
3332 wm_watchdog_txq(ifp, txq, &hang_queue);
3333 }
3334
3335 /* IF any of queues hanged up, reset the interface. */
3336 if (hang_queue != 0) {
3337 (void)wm_init(ifp);
3338
3339 /*
3340 * There are still some upper layer processing which call
3341 * ifp->if_start(). e.g. ALTQ or one CPU system
3342 */
3343 /* Try to get more packets going. */
3344 ifp->if_start(ifp);
3345 }
3346 }
3347
3348
3349 static void
3350 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang)
3351 {
3352
3353 mutex_enter(txq->txq_lock);
3354 if (txq->txq_sending &&
3355 time_uptime - txq->txq_lastsent > wm_watchdog_timeout)
3356 wm_watchdog_txq_locked(ifp, txq, hang);
3357
3358 mutex_exit(txq->txq_lock);
3359 }
3360
3361 static void
3362 wm_watchdog_txq_locked(struct ifnet *ifp, struct wm_txqueue *txq,
3363 uint16_t *hang)
3364 {
3365 struct wm_softc *sc = ifp->if_softc;
3366 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
3367
3368 KASSERT(mutex_owned(txq->txq_lock));
3369
3370 /*
3371 * Since we're using delayed interrupts, sweep up
3372 * before we report an error.
3373 */
3374 wm_txeof(txq, UINT_MAX);
3375
3376 if (txq->txq_sending)
3377 *hang |= __BIT(wmq->wmq_id);
3378
3379 if (txq->txq_free == WM_NTXDESC(txq)) {
3380 log(LOG_ERR, "%s: device timeout (lost interrupt)\n",
3381 device_xname(sc->sc_dev));
3382 } else {
3383 #ifdef WM_DEBUG
3384 int i, j;
3385 struct wm_txsoft *txs;
3386 #endif
3387 log(LOG_ERR,
3388 "%s: device timeout (txfree %d txsfree %d txnext %d)\n",
3389 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree,
3390 txq->txq_next);
3391 if_statinc(ifp, if_oerrors);
3392 #ifdef WM_DEBUG
3393 for (i = txq->txq_sdirty; i != txq->txq_snext;
3394 i = WM_NEXTTXS(txq, i)) {
3395 txs = &txq->txq_soft[i];
3396 printf("txs %d tx %d -> %d\n",
3397 i, txs->txs_firstdesc, txs->txs_lastdesc);
3398 for (j = txs->txs_firstdesc; ; j = WM_NEXTTX(txq, j)) {
3399 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
3400 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3401 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr);
3402 printf("\t %#08x%08x\n",
3403 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields,
3404 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen);
3405 } else {
3406 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3407 (uint64_t)txq->txq_descs[j].wtx_addr.wa_high << 32 |
3408 txq->txq_descs[j].wtx_addr.wa_low);
3409 printf("\t %#04x%02x%02x%08x\n",
3410 txq->txq_descs[j].wtx_fields.wtxu_vlan,
3411 txq->txq_descs[j].wtx_fields.wtxu_options,
3412 txq->txq_descs[j].wtx_fields.wtxu_status,
3413 txq->txq_descs[j].wtx_cmdlen);
3414 }
3415 if (j == txs->txs_lastdesc)
3416 break;
3417 }
3418 }
3419 #endif
3420 }
3421 }
3422
3423 /*
3424 * wm_tick:
3425 *
3426 * One second timer, used to check link status, sweep up
3427 * completed transmit jobs, etc.
3428 */
3429 static void
3430 wm_tick(void *arg)
3431 {
3432 struct wm_softc *sc = arg;
3433 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3434 #ifndef WM_MPSAFE
3435 int s = splnet();
3436 #endif
3437
3438 WM_CORE_LOCK(sc);
3439
3440 if (sc->sc_core_stopping) {
3441 WM_CORE_UNLOCK(sc);
3442 #ifndef WM_MPSAFE
3443 splx(s);
3444 #endif
3445 return;
3446 }
3447
3448 if (sc->sc_type >= WM_T_82542_2_1) {
3449 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
3450 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
3451 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
3452 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
3453 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
3454 }
3455
3456 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
3457 if_statadd_ref(nsr, if_collisions, CSR_READ(sc, WMREG_COLC));
3458 if_statadd_ref(nsr, if_ierrors, 0ULL /* ensure quad_t */
3459 + CSR_READ(sc, WMREG_CRCERRS)
3460 + CSR_READ(sc, WMREG_ALGNERRC)
3461 + CSR_READ(sc, WMREG_SYMERRC)
3462 + CSR_READ(sc, WMREG_RXERRC)
3463 + CSR_READ(sc, WMREG_SEC)
3464 + CSR_READ(sc, WMREG_CEXTERR)
3465 + CSR_READ(sc, WMREG_RLEC));
3466 /*
3467 * WMREG_RNBC is incremented when there is no available buffers in host
3468 * memory. It does not mean the number of dropped packet. Because
3469 * ethernet controller can receive packets in such case if there is
3470 * space in phy's FIFO.
3471 *
3472 * If you want to know the nubmer of WMREG_RMBC, you should use such as
3473 * own EVCNT instead of if_iqdrops.
3474 */
3475 if_statadd_ref(nsr, if_iqdrops, CSR_READ(sc, WMREG_MPC));
3476 IF_STAT_PUTREF(ifp);
3477
3478 if (sc->sc_flags & WM_F_HAS_MII)
3479 mii_tick(&sc->sc_mii);
3480 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)
3481 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
3482 wm_serdes_tick(sc);
3483 else
3484 wm_tbi_tick(sc);
3485
3486 WM_CORE_UNLOCK(sc);
3487
3488 wm_watchdog(ifp);
3489
3490 callout_schedule(&sc->sc_tick_ch, hz);
3491 }
3492
3493 static int
3494 wm_ifflags_cb(struct ethercom *ec)
3495 {
3496 struct ifnet *ifp = &ec->ec_if;
3497 struct wm_softc *sc = ifp->if_softc;
3498 u_short iffchange;
3499 int ecchange;
3500 bool needreset = false;
3501 int rc = 0;
3502
3503 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
3504 device_xname(sc->sc_dev), __func__));
3505
3506 WM_CORE_LOCK(sc);
3507
3508 /*
3509 * Check for if_flags.
3510 * Main usage is to prevent linkdown when opening bpf.
3511 */
3512 iffchange = ifp->if_flags ^ sc->sc_if_flags;
3513 sc->sc_if_flags = ifp->if_flags;
3514 if ((iffchange & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
3515 needreset = true;
3516 goto ec;
3517 }
3518
3519 /* iff related updates */
3520 if ((iffchange & IFF_PROMISC) != 0)
3521 wm_set_filter(sc);
3522
3523 wm_set_vlan(sc);
3524
3525 ec:
3526 /* Check for ec_capenable. */
3527 ecchange = ec->ec_capenable ^ sc->sc_ec_capenable;
3528 sc->sc_ec_capenable = ec->ec_capenable;
3529 if ((ecchange & ~ETHERCAP_EEE) != 0) {
3530 needreset = true;
3531 goto out;
3532 }
3533
3534 /* ec related updates */
3535 wm_set_eee(sc);
3536
3537 out:
3538 if (needreset)
3539 rc = ENETRESET;
3540 WM_CORE_UNLOCK(sc);
3541
3542 return rc;
3543 }
3544
3545 static bool
3546 wm_phy_need_linkdown_discard(struct wm_softc *sc)
3547 {
3548
3549 switch (sc->sc_phytype) {
3550 case WMPHY_82577: /* ihphy */
3551 case WMPHY_82578: /* atphy */
3552 case WMPHY_82579: /* ihphy */
3553 case WMPHY_I217: /* ihphy */
3554 case WMPHY_82580: /* ihphy */
3555 case WMPHY_I350: /* ihphy */
3556 return true;
3557 default:
3558 return false;
3559 }
3560 }
3561
3562 static void
3563 wm_set_linkdown_discard(struct wm_softc *sc)
3564 {
3565
3566 for (int i = 0; i < sc->sc_nqueues; i++) {
3567 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
3568
3569 mutex_enter(txq->txq_lock);
3570 txq->txq_flags |= WM_TXQ_LINKDOWN_DISCARD;
3571 mutex_exit(txq->txq_lock);
3572 }
3573 }
3574
3575 static void
3576 wm_clear_linkdown_discard(struct wm_softc *sc)
3577 {
3578
3579 for (int i = 0; i < sc->sc_nqueues; i++) {
3580 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
3581
3582 mutex_enter(txq->txq_lock);
3583 txq->txq_flags &= ~WM_TXQ_LINKDOWN_DISCARD;
3584 mutex_exit(txq->txq_lock);
3585 }
3586 }
3587
3588 /*
3589 * wm_ioctl: [ifnet interface function]
3590 *
3591 * Handle control requests from the operator.
3592 */
3593 static int
3594 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
3595 {
3596 struct wm_softc *sc = ifp->if_softc;
3597 struct ifreq *ifr = (struct ifreq *)data;
3598 struct ifaddr *ifa = (struct ifaddr *)data;
3599 struct sockaddr_dl *sdl;
3600 int s, error;
3601
3602 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
3603 device_xname(sc->sc_dev), __func__));
3604
3605 #ifndef WM_MPSAFE
3606 s = splnet();
3607 #endif
3608 switch (cmd) {
3609 case SIOCSIFMEDIA:
3610 WM_CORE_LOCK(sc);
3611 /* Flow control requires full-duplex mode. */
3612 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
3613 (ifr->ifr_media & IFM_FDX) == 0)
3614 ifr->ifr_media &= ~IFM_ETH_FMASK;
3615 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
3616 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
3617 /* We can do both TXPAUSE and RXPAUSE. */
3618 ifr->ifr_media |=
3619 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
3620 }
3621 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
3622 }
3623 WM_CORE_UNLOCK(sc);
3624 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
3625 if (error == 0 && wm_phy_need_linkdown_discard(sc)) {
3626 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_NONE)
3627 wm_set_linkdown_discard(sc);
3628 else
3629 wm_clear_linkdown_discard(sc);
3630 }
3631 break;
3632 case SIOCINITIFADDR:
3633 WM_CORE_LOCK(sc);
3634 if (ifa->ifa_addr->sa_family == AF_LINK) {
3635 sdl = satosdl(ifp->if_dl->ifa_addr);
3636 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len,
3637 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen);
3638 /* Unicast address is the first multicast entry */
3639 wm_set_filter(sc);
3640 error = 0;
3641 WM_CORE_UNLOCK(sc);
3642 break;
3643 }
3644 WM_CORE_UNLOCK(sc);
3645 if (((ifp->if_flags & IFF_UP) == 0) && wm_phy_need_linkdown_discard(sc))
3646 wm_clear_linkdown_discard(sc);
3647 /*FALLTHROUGH*/
3648 default:
3649 if (cmd == SIOCSIFFLAGS && wm_phy_need_linkdown_discard(sc)) {
3650 if (((ifp->if_flags & IFF_UP) == 0) && ((ifr->ifr_flags & IFF_UP) != 0)) {
3651 wm_clear_linkdown_discard(sc);
3652 } else if (((ifp->if_flags & IFF_UP) != 0) && ((ifr->ifr_flags & IFF_UP) == 0)) {
3653 wm_set_linkdown_discard(sc);
3654 }
3655 }
3656 #ifdef WM_MPSAFE
3657 s = splnet();
3658 #endif
3659 /* It may call wm_start, so unlock here */
3660 error = ether_ioctl(ifp, cmd, data);
3661 #ifdef WM_MPSAFE
3662 splx(s);
3663 #endif
3664 if (error != ENETRESET)
3665 break;
3666
3667 error = 0;
3668
3669 if (cmd == SIOCSIFCAP)
3670 error = (*ifp->if_init)(ifp);
3671 else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
3672 ;
3673 else if (ifp->if_flags & IFF_RUNNING) {
3674 /*
3675 * Multicast list has changed; set the hardware filter
3676 * accordingly.
3677 */
3678 WM_CORE_LOCK(sc);
3679 wm_set_filter(sc);
3680 WM_CORE_UNLOCK(sc);
3681 }
3682 break;
3683 }
3684
3685 #ifndef WM_MPSAFE
3686 splx(s);
3687 #endif
3688 return error;
3689 }
3690
3691 /* MAC address related */
3692
3693 /*
3694 * Get the offset of MAC address and return it.
3695 * If error occured, use offset 0.
3696 */
3697 static uint16_t
3698 wm_check_alt_mac_addr(struct wm_softc *sc)
3699 {
3700 uint16_t myea[ETHER_ADDR_LEN / 2];
3701 uint16_t offset = NVM_OFF_MACADDR;
3702
3703 /* Try to read alternative MAC address pointer */
3704 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0)
3705 return 0;
3706
3707 /* Check pointer if it's valid or not. */
3708 if ((offset == 0x0000) || (offset == 0xffff))
3709 return 0;
3710
3711 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid);
3712 /*
3713 * Check whether alternative MAC address is valid or not.
3714 * Some cards have non 0xffff pointer but those don't use
3715 * alternative MAC address in reality.
3716 *
3717 * Check whether the broadcast bit is set or not.
3718 */
3719 if (wm_nvm_read(sc, offset, 1, myea) == 0)
3720 if (((myea[0] & 0xff) & 0x01) == 0)
3721 return offset; /* Found */
3722
3723 /* Not found */
3724 return 0;
3725 }
3726
3727 static int
3728 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr)
3729 {
3730 uint16_t myea[ETHER_ADDR_LEN / 2];
3731 uint16_t offset = NVM_OFF_MACADDR;
3732 int do_invert = 0;
3733
3734 switch (sc->sc_type) {
3735 case WM_T_82580:
3736 case WM_T_I350:
3737 case WM_T_I354:
3738 /* EEPROM Top Level Partitioning */
3739 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0;
3740 break;
3741 case WM_T_82571:
3742 case WM_T_82575:
3743 case WM_T_82576:
3744 case WM_T_80003:
3745 case WM_T_I210:
3746 case WM_T_I211:
3747 offset = wm_check_alt_mac_addr(sc);
3748 if (offset == 0)
3749 if ((sc->sc_funcid & 0x01) == 1)
3750 do_invert = 1;
3751 break;
3752 default:
3753 if ((sc->sc_funcid & 0x01) == 1)
3754 do_invert = 1;
3755 break;
3756 }
3757
3758 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0)
3759 goto bad;
3760
3761 enaddr[0] = myea[0] & 0xff;
3762 enaddr[1] = myea[0] >> 8;
3763 enaddr[2] = myea[1] & 0xff;
3764 enaddr[3] = myea[1] >> 8;
3765 enaddr[4] = myea[2] & 0xff;
3766 enaddr[5] = myea[2] >> 8;
3767
3768 /*
3769 * Toggle the LSB of the MAC address on the second port
3770 * of some dual port cards.
3771 */
3772 if (do_invert != 0)
3773 enaddr[5] ^= 1;
3774
3775 return 0;
3776
3777 bad:
3778 return -1;
3779 }
3780
3781 /*
3782 * wm_set_ral:
3783 *
3784 * Set an entery in the receive address list.
3785 */
3786 static void
3787 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
3788 {
3789 uint32_t ral_lo, ral_hi, addrl, addrh;
3790 uint32_t wlock_mac;
3791 int rv;
3792
3793 if (enaddr != NULL) {
3794 ral_lo = (uint32_t)enaddr[0] | ((uint32_t)enaddr[1] << 8) |
3795 ((uint32_t)enaddr[2] << 16) | ((uint32_t)enaddr[3] << 24);
3796 ral_hi = (uint32_t)enaddr[4] | ((uint32_t)enaddr[5] << 8);
3797 ral_hi |= RAL_AV;
3798 } else {
3799 ral_lo = 0;
3800 ral_hi = 0;
3801 }
3802
3803 switch (sc->sc_type) {
3804 case WM_T_82542_2_0:
3805 case WM_T_82542_2_1:
3806 case WM_T_82543:
3807 CSR_WRITE(sc, WMREG_RAL(idx), ral_lo);
3808 CSR_WRITE_FLUSH(sc);
3809 CSR_WRITE(sc, WMREG_RAH(idx), ral_hi);
3810 CSR_WRITE_FLUSH(sc);
3811 break;
3812 case WM_T_PCH2:
3813 case WM_T_PCH_LPT:
3814 case WM_T_PCH_SPT:
3815 case WM_T_PCH_CNP:
3816 if (idx == 0) {
3817 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3818 CSR_WRITE_FLUSH(sc);
3819 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3820 CSR_WRITE_FLUSH(sc);
3821 return;
3822 }
3823 if (sc->sc_type != WM_T_PCH2) {
3824 wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM),
3825 FWSM_WLOCK_MAC);
3826 addrl = WMREG_SHRAL(idx - 1);
3827 addrh = WMREG_SHRAH(idx - 1);
3828 } else {
3829 wlock_mac = 0;
3830 addrl = WMREG_PCH_LPT_SHRAL(idx - 1);
3831 addrh = WMREG_PCH_LPT_SHRAH(idx - 1);
3832 }
3833
3834 if ((wlock_mac == 0) || (idx <= wlock_mac)) {
3835 rv = wm_get_swflag_ich8lan(sc);
3836 if (rv != 0)
3837 return;
3838 CSR_WRITE(sc, addrl, ral_lo);
3839 CSR_WRITE_FLUSH(sc);
3840 CSR_WRITE(sc, addrh, ral_hi);
3841 CSR_WRITE_FLUSH(sc);
3842 wm_put_swflag_ich8lan(sc);
3843 }
3844
3845 break;
3846 default:
3847 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3848 CSR_WRITE_FLUSH(sc);
3849 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3850 CSR_WRITE_FLUSH(sc);
3851 break;
3852 }
3853 }
3854
3855 /*
3856 * wm_mchash:
3857 *
3858 * Compute the hash of the multicast address for the 4096-bit
3859 * multicast filter.
3860 */
3861 static uint32_t
3862 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
3863 {
3864 static const int lo_shift[4] = { 4, 3, 2, 0 };
3865 static const int hi_shift[4] = { 4, 5, 6, 8 };
3866 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 };
3867 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 };
3868 uint32_t hash;
3869
3870 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3871 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3872 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3873 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){
3874 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) |
3875 (((uint16_t)enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]);
3876 return (hash & 0x3ff);
3877 }
3878 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
3879 (((uint16_t)enaddr[5]) << hi_shift[sc->sc_mchash_type]);
3880
3881 return (hash & 0xfff);
3882 }
3883
3884 /*
3885 *
3886 *
3887 */
3888 static int
3889 wm_rar_count(struct wm_softc *sc)
3890 {
3891 int size;
3892
3893 switch (sc->sc_type) {
3894 case WM_T_ICH8:
3895 size = WM_RAL_TABSIZE_ICH8 -1;
3896 break;
3897 case WM_T_ICH9:
3898 case WM_T_ICH10:
3899 case WM_T_PCH:
3900 size = WM_RAL_TABSIZE_ICH8;
3901 break;
3902 case WM_T_PCH2:
3903 size = WM_RAL_TABSIZE_PCH2;
3904 break;
3905 case WM_T_PCH_LPT:
3906 case WM_T_PCH_SPT:
3907 case WM_T_PCH_CNP:
3908 size = WM_RAL_TABSIZE_PCH_LPT;
3909 break;
3910 case WM_T_82575:
3911 case WM_T_I210:
3912 case WM_T_I211:
3913 size = WM_RAL_TABSIZE_82575;
3914 break;
3915 case WM_T_82576:
3916 case WM_T_82580:
3917 size = WM_RAL_TABSIZE_82576;
3918 break;
3919 case WM_T_I350:
3920 case WM_T_I354:
3921 size = WM_RAL_TABSIZE_I350;
3922 break;
3923 default:
3924 size = WM_RAL_TABSIZE;
3925 }
3926
3927 return size;
3928 }
3929
3930 /*
3931 * wm_set_filter:
3932 *
3933 * Set up the receive filter.
3934 */
3935 static void
3936 wm_set_filter(struct wm_softc *sc)
3937 {
3938 struct ethercom *ec = &sc->sc_ethercom;
3939 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3940 struct ether_multi *enm;
3941 struct ether_multistep step;
3942 bus_addr_t mta_reg;
3943 uint32_t hash, reg, bit;
3944 int i, size, ralmax, rv;
3945
3946 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
3947 device_xname(sc->sc_dev), __func__));
3948
3949 if (sc->sc_type >= WM_T_82544)
3950 mta_reg = WMREG_CORDOVA_MTA;
3951 else
3952 mta_reg = WMREG_MTA;
3953
3954 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
3955
3956 if (ifp->if_flags & IFF_BROADCAST)
3957 sc->sc_rctl |= RCTL_BAM;
3958 if (ifp->if_flags & IFF_PROMISC) {
3959 sc->sc_rctl |= RCTL_UPE;
3960 ETHER_LOCK(ec);
3961 ec->ec_flags |= ETHER_F_ALLMULTI;
3962 ETHER_UNLOCK(ec);
3963 goto allmulti;
3964 }
3965
3966 /*
3967 * Set the station address in the first RAL slot, and
3968 * clear the remaining slots.
3969 */
3970 size = wm_rar_count(sc);
3971 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0);
3972
3973 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
3974 || (sc->sc_type == WM_T_PCH_CNP)) {
3975 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC);
3976 switch (i) {
3977 case 0:
3978 /* We can use all entries */
3979 ralmax = size;
3980 break;
3981 case 1:
3982 /* Only RAR[0] */
3983 ralmax = 1;
3984 break;
3985 default:
3986 /* Available SHRA + RAR[0] */
3987 ralmax = i + 1;
3988 }
3989 } else
3990 ralmax = size;
3991 for (i = 1; i < size; i++) {
3992 if (i < ralmax)
3993 wm_set_ral(sc, NULL, i);
3994 }
3995
3996 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3997 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3998 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3999 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP))
4000 size = WM_ICH8_MC_TABSIZE;
4001 else
4002 size = WM_MC_TABSIZE;
4003 /* Clear out the multicast table. */
4004 for (i = 0; i < size; i++) {
4005 CSR_WRITE(sc, mta_reg + (i << 2), 0);
4006 CSR_WRITE_FLUSH(sc);
4007 }
4008
4009 ETHER_LOCK(ec);
4010 ETHER_FIRST_MULTI(step, ec, enm);
4011 while (enm != NULL) {
4012 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
4013 ec->ec_flags |= ETHER_F_ALLMULTI;
4014 ETHER_UNLOCK(ec);
4015 /*
4016 * We must listen to a range of multicast addresses.
4017 * For now, just accept all multicasts, rather than
4018 * trying to set only those filter bits needed to match
4019 * the range. (At this time, the only use of address
4020 * ranges is for IP multicast routing, for which the
4021 * range is big enough to require all bits set.)
4022 */
4023 goto allmulti;
4024 }
4025
4026 hash = wm_mchash(sc, enm->enm_addrlo);
4027
4028 reg = (hash >> 5);
4029 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
4030 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
4031 || (sc->sc_type == WM_T_PCH2)
4032 || (sc->sc_type == WM_T_PCH_LPT)
4033 || (sc->sc_type == WM_T_PCH_SPT)
4034 || (sc->sc_type == WM_T_PCH_CNP))
4035 reg &= 0x1f;
4036 else
4037 reg &= 0x7f;
4038 bit = hash & 0x1f;
4039
4040 hash = CSR_READ(sc, mta_reg + (reg << 2));
4041 hash |= 1U << bit;
4042
4043 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) {
4044 /*
4045 * 82544 Errata 9: Certain register cannot be written
4046 * with particular alignments in PCI-X bus operation
4047 * (FCAH, MTA and VFTA).
4048 */
4049 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
4050 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
4051 CSR_WRITE_FLUSH(sc);
4052 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
4053 CSR_WRITE_FLUSH(sc);
4054 } else {
4055 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
4056 CSR_WRITE_FLUSH(sc);
4057 }
4058
4059 ETHER_NEXT_MULTI(step, enm);
4060 }
4061 ec->ec_flags &= ~ETHER_F_ALLMULTI;
4062 ETHER_UNLOCK(ec);
4063
4064 goto setit;
4065
4066 allmulti:
4067 sc->sc_rctl |= RCTL_MPE;
4068
4069 setit:
4070 if (sc->sc_type >= WM_T_PCH2) {
4071 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
4072 && (ifp->if_mtu > ETHERMTU))
4073 rv = wm_lv_jumbo_workaround_ich8lan(sc, true);
4074 else
4075 rv = wm_lv_jumbo_workaround_ich8lan(sc, false);
4076 if (rv != 0)
4077 device_printf(sc->sc_dev,
4078 "Failed to do workaround for jumbo frame.\n");
4079 }
4080
4081 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
4082 }
4083
4084 /* Reset and init related */
4085
4086 static void
4087 wm_set_vlan(struct wm_softc *sc)
4088 {
4089
4090 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4091 device_xname(sc->sc_dev), __func__));
4092
4093 /* Deal with VLAN enables. */
4094 if (VLAN_ATTACHED(&sc->sc_ethercom))
4095 sc->sc_ctrl |= CTRL_VME;
4096 else
4097 sc->sc_ctrl &= ~CTRL_VME;
4098
4099 /* Write the control registers. */
4100 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4101 }
4102
4103 static void
4104 wm_set_pcie_completion_timeout(struct wm_softc *sc)
4105 {
4106 uint32_t gcr;
4107 pcireg_t ctrl2;
4108
4109 gcr = CSR_READ(sc, WMREG_GCR);
4110
4111 /* Only take action if timeout value is defaulted to 0 */
4112 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0)
4113 goto out;
4114
4115 if ((gcr & GCR_CAP_VER2) == 0) {
4116 gcr |= GCR_CMPL_TMOUT_10MS;
4117 goto out;
4118 }
4119
4120 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
4121 sc->sc_pcixe_capoff + PCIE_DCSR2);
4122 ctrl2 |= WM_PCIE_DCSR2_16MS;
4123 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
4124 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2);
4125
4126 out:
4127 /* Disable completion timeout resend */
4128 gcr &= ~GCR_CMPL_TMOUT_RESEND;
4129
4130 CSR_WRITE(sc, WMREG_GCR, gcr);
4131 }
4132
4133 void
4134 wm_get_auto_rd_done(struct wm_softc *sc)
4135 {
4136 int i;
4137
4138 /* wait for eeprom to reload */
4139 switch (sc->sc_type) {
4140 case WM_T_82571:
4141 case WM_T_82572:
4142 case WM_T_82573:
4143 case WM_T_82574:
4144 case WM_T_82583:
4145 case WM_T_82575:
4146 case WM_T_82576:
4147 case WM_T_82580:
4148 case WM_T_I350:
4149 case WM_T_I354:
4150 case WM_T_I210:
4151 case WM_T_I211:
4152 case WM_T_80003:
4153 case WM_T_ICH8:
4154 case WM_T_ICH9:
4155 for (i = 0; i < 10; i++) {
4156 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
4157 break;
4158 delay(1000);
4159 }
4160 if (i == 10) {
4161 log(LOG_ERR, "%s: auto read from eeprom failed to "
4162 "complete\n", device_xname(sc->sc_dev));
4163 }
4164 break;
4165 default:
4166 break;
4167 }
4168 }
4169
4170 void
4171 wm_lan_init_done(struct wm_softc *sc)
4172 {
4173 uint32_t reg = 0;
4174 int i;
4175
4176 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4177 device_xname(sc->sc_dev), __func__));
4178
4179 /* Wait for eeprom to reload */
4180 switch (sc->sc_type) {
4181 case WM_T_ICH10:
4182 case WM_T_PCH:
4183 case WM_T_PCH2:
4184 case WM_T_PCH_LPT:
4185 case WM_T_PCH_SPT:
4186 case WM_T_PCH_CNP:
4187 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) {
4188 reg = CSR_READ(sc, WMREG_STATUS);
4189 if ((reg & STATUS_LAN_INIT_DONE) != 0)
4190 break;
4191 delay(100);
4192 }
4193 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) {
4194 log(LOG_ERR, "%s: %s: lan_init_done failed to "
4195 "complete\n", device_xname(sc->sc_dev), __func__);
4196 }
4197 break;
4198 default:
4199 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
4200 __func__);
4201 break;
4202 }
4203
4204 reg &= ~STATUS_LAN_INIT_DONE;
4205 CSR_WRITE(sc, WMREG_STATUS, reg);
4206 }
4207
4208 void
4209 wm_get_cfg_done(struct wm_softc *sc)
4210 {
4211 int mask;
4212 uint32_t reg;
4213 int i;
4214
4215 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4216 device_xname(sc->sc_dev), __func__));
4217
4218 /* Wait for eeprom to reload */
4219 switch (sc->sc_type) {
4220 case WM_T_82542_2_0:
4221 case WM_T_82542_2_1:
4222 /* null */
4223 break;
4224 case WM_T_82543:
4225 case WM_T_82544:
4226 case WM_T_82540:
4227 case WM_T_82545:
4228 case WM_T_82545_3:
4229 case WM_T_82546:
4230 case WM_T_82546_3:
4231 case WM_T_82541:
4232 case WM_T_82541_2:
4233 case WM_T_82547:
4234 case WM_T_82547_2:
4235 case WM_T_82573:
4236 case WM_T_82574:
4237 case WM_T_82583:
4238 /* generic */
4239 delay(10*1000);
4240 break;
4241 case WM_T_80003:
4242 case WM_T_82571:
4243 case WM_T_82572:
4244 case WM_T_82575:
4245 case WM_T_82576:
4246 case WM_T_82580:
4247 case WM_T_I350:
4248 case WM_T_I354:
4249 case WM_T_I210:
4250 case WM_T_I211:
4251 if (sc->sc_type == WM_T_82571) {
4252 /* Only 82571 shares port 0 */
4253 mask = EEMNGCTL_CFGDONE_0;
4254 } else
4255 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid;
4256 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) {
4257 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask)
4258 break;
4259 delay(1000);
4260 }
4261 if (i >= WM_PHY_CFG_TIMEOUT)
4262 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s failed\n",
4263 device_xname(sc->sc_dev), __func__));
4264 break;
4265 case WM_T_ICH8:
4266 case WM_T_ICH9:
4267 case WM_T_ICH10:
4268 case WM_T_PCH:
4269 case WM_T_PCH2:
4270 case WM_T_PCH_LPT:
4271 case WM_T_PCH_SPT:
4272 case WM_T_PCH_CNP:
4273 delay(10*1000);
4274 if (sc->sc_type >= WM_T_ICH10)
4275 wm_lan_init_done(sc);
4276 else
4277 wm_get_auto_rd_done(sc);
4278
4279 /* Clear PHY Reset Asserted bit */
4280 reg = CSR_READ(sc, WMREG_STATUS);
4281 if ((reg & STATUS_PHYRA) != 0)
4282 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA);
4283 break;
4284 default:
4285 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
4286 __func__);
4287 break;
4288 }
4289 }
4290
4291 int
4292 wm_phy_post_reset(struct wm_softc *sc)
4293 {
4294 device_t dev = sc->sc_dev;
4295 uint16_t reg;
4296 int rv = 0;
4297
4298 /* This function is only for ICH8 and newer. */
4299 if (sc->sc_type < WM_T_ICH8)
4300 return 0;
4301
4302 if (wm_phy_resetisblocked(sc)) {
4303 /* XXX */
4304 device_printf(dev, "PHY is blocked\n");
4305 return -1;
4306 }
4307
4308 /* Allow time for h/w to get to quiescent state after reset */
4309 delay(10*1000);
4310
4311 /* Perform any necessary post-reset workarounds */
4312 if (sc->sc_type == WM_T_PCH)
4313 rv = wm_hv_phy_workarounds_ich8lan(sc);
4314 else if (sc->sc_type == WM_T_PCH2)
4315 rv = wm_lv_phy_workarounds_ich8lan(sc);
4316 if (rv != 0)
4317 return rv;
4318
4319 /* Clear the host wakeup bit after lcd reset */
4320 if (sc->sc_type >= WM_T_PCH) {
4321 wm_gmii_hv_readreg(dev, 2, BM_PORT_GEN_CFG, ®);
4322 reg &= ~BM_WUC_HOST_WU_BIT;
4323 wm_gmii_hv_writereg(dev, 2, BM_PORT_GEN_CFG, reg);
4324 }
4325
4326 /* Configure the LCD with the extended configuration region in NVM */
4327 if ((rv = wm_init_lcd_from_nvm(sc)) != 0)
4328 return rv;
4329
4330 /* Configure the LCD with the OEM bits in NVM */
4331 rv = wm_oem_bits_config_ich8lan(sc, true);
4332
4333 if (sc->sc_type == WM_T_PCH2) {
4334 /* Ungate automatic PHY configuration on non-managed 82579 */
4335 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
4336 delay(10 * 1000);
4337 wm_gate_hw_phy_config_ich8lan(sc, false);
4338 }
4339 /* Set EEE LPI Update Timer to 200usec */
4340 rv = sc->phy.acquire(sc);
4341 if (rv)
4342 return rv;
4343 rv = wm_write_emi_reg_locked(dev,
4344 I82579_LPI_UPDATE_TIMER, 0x1387);
4345 sc->phy.release(sc);
4346 }
4347
4348 return rv;
4349 }
4350
4351 /* Only for PCH and newer */
4352 static int
4353 wm_write_smbus_addr(struct wm_softc *sc)
4354 {
4355 uint32_t strap, freq;
4356 uint16_t phy_data;
4357 int rv;
4358
4359 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4360 device_xname(sc->sc_dev), __func__));
4361 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP);
4362
4363 strap = CSR_READ(sc, WMREG_STRAP);
4364 freq = __SHIFTOUT(strap, STRAP_FREQ);
4365
4366 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_SMB_ADDR, &phy_data);
4367 if (rv != 0)
4368 return -1;
4369
4370 phy_data &= ~HV_SMB_ADDR_ADDR;
4371 phy_data |= __SHIFTOUT(strap, STRAP_SMBUSADDR);
4372 phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
4373
4374 if (sc->sc_phytype == WMPHY_I217) {
4375 /* Restore SMBus frequency */
4376 if (freq --) {
4377 phy_data &= ~(HV_SMB_ADDR_FREQ_LOW
4378 | HV_SMB_ADDR_FREQ_HIGH);
4379 phy_data |= __SHIFTIN((freq & 0x01) != 0,
4380 HV_SMB_ADDR_FREQ_LOW);
4381 phy_data |= __SHIFTIN((freq & 0x02) != 0,
4382 HV_SMB_ADDR_FREQ_HIGH);
4383 } else
4384 DPRINTF(sc, WM_DEBUG_INIT,
4385 ("%s: %s Unsupported SMB frequency in PHY\n",
4386 device_xname(sc->sc_dev), __func__));
4387 }
4388
4389 return wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_SMB_ADDR,
4390 phy_data);
4391 }
4392
4393 static int
4394 wm_init_lcd_from_nvm(struct wm_softc *sc)
4395 {
4396 uint32_t extcnfctr, sw_cfg_mask, cnf_size, word_addr, i, reg;
4397 uint16_t phy_page = 0;
4398 int rv = 0;
4399
4400 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4401 device_xname(sc->sc_dev), __func__));
4402
4403 switch (sc->sc_type) {
4404 case WM_T_ICH8:
4405 if ((sc->sc_phytype == WMPHY_UNKNOWN)
4406 || (sc->sc_phytype != WMPHY_IGP_3))
4407 return 0;
4408
4409 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_AMT)
4410 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_LAN)) {
4411 sw_cfg_mask = FEXTNVM_SW_CONFIG;
4412 break;
4413 }
4414 /* FALLTHROUGH */
4415 case WM_T_PCH:
4416 case WM_T_PCH2:
4417 case WM_T_PCH_LPT:
4418 case WM_T_PCH_SPT:
4419 case WM_T_PCH_CNP:
4420 sw_cfg_mask = FEXTNVM_SW_CONFIG_ICH8M;
4421 break;
4422 default:
4423 return 0;
4424 }
4425
4426 if ((rv = sc->phy.acquire(sc)) != 0)
4427 return rv;
4428
4429 reg = CSR_READ(sc, WMREG_FEXTNVM);
4430 if ((reg & sw_cfg_mask) == 0)
4431 goto release;
4432
4433 /*
4434 * Make sure HW does not configure LCD from PHY extended configuration
4435 * before SW configuration
4436 */
4437 extcnfctr = CSR_READ(sc, WMREG_EXTCNFCTR);
4438 if ((sc->sc_type < WM_T_PCH2)
4439 && ((extcnfctr & EXTCNFCTR_PCIE_WRITE_ENABLE) != 0))
4440 goto release;
4441
4442 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: Configure LCD by software\n",
4443 device_xname(sc->sc_dev), __func__));
4444 /* word_addr is in DWORD */
4445 word_addr = __SHIFTOUT(extcnfctr, EXTCNFCTR_EXT_CNF_POINTER) << 1;
4446
4447 reg = CSR_READ(sc, WMREG_EXTCNFSIZE);
4448 cnf_size = __SHIFTOUT(reg, EXTCNFSIZE_LENGTH);
4449 if (cnf_size == 0)
4450 goto release;
4451
4452 if (((sc->sc_type == WM_T_PCH)
4453 && ((extcnfctr & EXTCNFCTR_OEM_WRITE_ENABLE) == 0))
4454 || (sc->sc_type > WM_T_PCH)) {
4455 /*
4456 * HW configures the SMBus address and LEDs when the OEM and
4457 * LCD Write Enable bits are set in the NVM. When both NVM bits
4458 * are cleared, SW will configure them instead.
4459 */
4460 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: Configure SMBus and LED\n",
4461 device_xname(sc->sc_dev), __func__));
4462 if ((rv = wm_write_smbus_addr(sc)) != 0)
4463 goto release;
4464
4465 reg = CSR_READ(sc, WMREG_LEDCTL);
4466 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_LED_CONFIG,
4467 (uint16_t)reg);
4468 if (rv != 0)
4469 goto release;
4470 }
4471
4472 /* Configure LCD from extended configuration region. */
4473 for (i = 0; i < cnf_size; i++) {
4474 uint16_t reg_data, reg_addr;
4475
4476 if (wm_nvm_read(sc, (word_addr + i * 2), 1, ®_data) != 0)
4477 goto release;
4478
4479 if (wm_nvm_read(sc, (word_addr + i * 2 + 1), 1, ®_addr) !=0)
4480 goto release;
4481
4482 if (reg_addr == IGPHY_PAGE_SELECT)
4483 phy_page = reg_data;
4484
4485 reg_addr &= IGPHY_MAXREGADDR;
4486 reg_addr |= phy_page;
4487
4488 KASSERT(sc->phy.writereg_locked != NULL);
4489 rv = sc->phy.writereg_locked(sc->sc_dev, 1, reg_addr,
4490 reg_data);
4491 }
4492
4493 release:
4494 sc->phy.release(sc);
4495 return rv;
4496 }
4497
4498 /*
4499 * wm_oem_bits_config_ich8lan - SW-based LCD Configuration
4500 * @sc: pointer to the HW structure
4501 * @d0_state: boolean if entering d0 or d3 device state
4502 *
4503 * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are
4504 * collectively called OEM bits. The OEM Write Enable bit and SW Config bit
4505 * in NVM determines whether HW should configure LPLU and Gbe Disable.
4506 */
4507 int
4508 wm_oem_bits_config_ich8lan(struct wm_softc *sc, bool d0_state)
4509 {
4510 uint32_t mac_reg;
4511 uint16_t oem_reg;
4512 int rv;
4513
4514 if (sc->sc_type < WM_T_PCH)
4515 return 0;
4516
4517 rv = sc->phy.acquire(sc);
4518 if (rv != 0)
4519 return rv;
4520
4521 if (sc->sc_type == WM_T_PCH) {
4522 mac_reg = CSR_READ(sc, WMREG_EXTCNFCTR);
4523 if ((mac_reg & EXTCNFCTR_OEM_WRITE_ENABLE) != 0)
4524 goto release;
4525 }
4526
4527 mac_reg = CSR_READ(sc, WMREG_FEXTNVM);
4528 if ((mac_reg & FEXTNVM_SW_CONFIG_ICH8M) == 0)
4529 goto release;
4530
4531 mac_reg = CSR_READ(sc, WMREG_PHY_CTRL);
4532
4533 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 1, HV_OEM_BITS, &oem_reg);
4534 if (rv != 0)
4535 goto release;
4536 oem_reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
4537
4538 if (d0_state) {
4539 if ((mac_reg & PHY_CTRL_GBE_DIS) != 0)
4540 oem_reg |= HV_OEM_BITS_A1KDIS;
4541 if ((mac_reg & PHY_CTRL_D0A_LPLU) != 0)
4542 oem_reg |= HV_OEM_BITS_LPLU;
4543 } else {
4544 if ((mac_reg & (PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS))
4545 != 0)
4546 oem_reg |= HV_OEM_BITS_A1KDIS;
4547 if ((mac_reg & (PHY_CTRL_D0A_LPLU | PHY_CTRL_NOND0A_LPLU))
4548 != 0)
4549 oem_reg |= HV_OEM_BITS_LPLU;
4550 }
4551
4552 /* Set Restart auto-neg to activate the bits */
4553 if ((d0_state || (sc->sc_type != WM_T_PCH))
4554 && (wm_phy_resetisblocked(sc) == false))
4555 oem_reg |= HV_OEM_BITS_ANEGNOW;
4556
4557 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_OEM_BITS, oem_reg);
4558
4559 release:
4560 sc->phy.release(sc);
4561
4562 return rv;
4563 }
4564
4565 /* Init hardware bits */
4566 void
4567 wm_initialize_hardware_bits(struct wm_softc *sc)
4568 {
4569 uint32_t tarc0, tarc1, reg;
4570
4571 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4572 device_xname(sc->sc_dev), __func__));
4573
4574 /* For 82571 variant, 80003 and ICHs */
4575 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
4576 || (sc->sc_type >= WM_T_80003)) {
4577
4578 /* Transmit Descriptor Control 0 */
4579 reg = CSR_READ(sc, WMREG_TXDCTL(0));
4580 reg |= TXDCTL_COUNT_DESC;
4581 CSR_WRITE(sc, WMREG_TXDCTL(0), reg);
4582
4583 /* Transmit Descriptor Control 1 */
4584 reg = CSR_READ(sc, WMREG_TXDCTL(1));
4585 reg |= TXDCTL_COUNT_DESC;
4586 CSR_WRITE(sc, WMREG_TXDCTL(1), reg);
4587
4588 /* TARC0 */
4589 tarc0 = CSR_READ(sc, WMREG_TARC0);
4590 switch (sc->sc_type) {
4591 case WM_T_82571:
4592 case WM_T_82572:
4593 case WM_T_82573:
4594 case WM_T_82574:
4595 case WM_T_82583:
4596 case WM_T_80003:
4597 /* Clear bits 30..27 */
4598 tarc0 &= ~__BITS(30, 27);
4599 break;
4600 default:
4601 break;
4602 }
4603
4604 switch (sc->sc_type) {
4605 case WM_T_82571:
4606 case WM_T_82572:
4607 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */
4608
4609 tarc1 = CSR_READ(sc, WMREG_TARC1);
4610 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */
4611 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */
4612 /* 8257[12] Errata No.7 */
4613 tarc1 |= __BIT(22); /* TARC1 bits 22 */
4614
4615 /* TARC1 bit 28 */
4616 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4617 tarc1 &= ~__BIT(28);
4618 else
4619 tarc1 |= __BIT(28);
4620 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4621
4622 /*
4623 * 8257[12] Errata No.13
4624 * Disable Dyamic Clock Gating.
4625 */
4626 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4627 reg &= ~CTRL_EXT_DMA_DYN_CLK;
4628 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4629 break;
4630 case WM_T_82573:
4631 case WM_T_82574:
4632 case WM_T_82583:
4633 if ((sc->sc_type == WM_T_82574)
4634 || (sc->sc_type == WM_T_82583))
4635 tarc0 |= __BIT(26); /* TARC0 bit 26 */
4636
4637 /* Extended Device Control */
4638 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4639 reg &= ~__BIT(23); /* Clear bit 23 */
4640 reg |= __BIT(22); /* Set bit 22 */
4641 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4642
4643 /* Device Control */
4644 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */
4645 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4646
4647 /* PCIe Control Register */
4648 /*
4649 * 82573 Errata (unknown).
4650 *
4651 * 82574 Errata 25 and 82583 Errata 12
4652 * "Dropped Rx Packets":
4653 * NVM Image Version 2.1.4 and newer has no this bug.
4654 */
4655 reg = CSR_READ(sc, WMREG_GCR);
4656 reg |= GCR_L1_ACT_WITHOUT_L0S_RX;
4657 CSR_WRITE(sc, WMREG_GCR, reg);
4658
4659 if ((sc->sc_type == WM_T_82574)
4660 || (sc->sc_type == WM_T_82583)) {
4661 /*
4662 * Document says this bit must be set for
4663 * proper operation.
4664 */
4665 reg = CSR_READ(sc, WMREG_GCR);
4666 reg |= __BIT(22);
4667 CSR_WRITE(sc, WMREG_GCR, reg);
4668
4669 /*
4670 * Apply workaround for hardware errata
4671 * documented in errata docs Fixes issue where
4672 * some error prone or unreliable PCIe
4673 * completions are occurring, particularly
4674 * with ASPM enabled. Without fix, issue can
4675 * cause Tx timeouts.
4676 */
4677 reg = CSR_READ(sc, WMREG_GCR2);
4678 reg |= __BIT(0);
4679 CSR_WRITE(sc, WMREG_GCR2, reg);
4680 }
4681 break;
4682 case WM_T_80003:
4683 /* TARC0 */
4684 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
4685 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
4686 tarc0 &= ~__BIT(20); /* Clear bits 20 */
4687
4688 /* TARC1 bit 28 */
4689 tarc1 = CSR_READ(sc, WMREG_TARC1);
4690 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4691 tarc1 &= ~__BIT(28);
4692 else
4693 tarc1 |= __BIT(28);
4694 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4695 break;
4696 case WM_T_ICH8:
4697 case WM_T_ICH9:
4698 case WM_T_ICH10:
4699 case WM_T_PCH:
4700 case WM_T_PCH2:
4701 case WM_T_PCH_LPT:
4702 case WM_T_PCH_SPT:
4703 case WM_T_PCH_CNP:
4704 /* TARC0 */
4705 if (sc->sc_type == WM_T_ICH8) {
4706 /* Set TARC0 bits 29 and 28 */
4707 tarc0 |= __BITS(29, 28);
4708 } else if (sc->sc_type == WM_T_PCH_SPT) {
4709 tarc0 |= __BIT(29);
4710 /*
4711 * Drop bit 28. From Linux.
4712 * See I218/I219 spec update
4713 * "5. Buffer Overrun While the I219 is
4714 * Processing DMA Transactions"
4715 */
4716 tarc0 &= ~__BIT(28);
4717 }
4718 /* Set TARC0 bits 23,24,26,27 */
4719 tarc0 |= __BITS(27, 26) | __BITS(24, 23);
4720
4721 /* CTRL_EXT */
4722 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4723 reg |= __BIT(22); /* Set bit 22 */
4724 /*
4725 * Enable PHY low-power state when MAC is at D3
4726 * w/o WoL
4727 */
4728 if (sc->sc_type >= WM_T_PCH)
4729 reg |= CTRL_EXT_PHYPDEN;
4730 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4731
4732 /* TARC1 */
4733 tarc1 = CSR_READ(sc, WMREG_TARC1);
4734 /* bit 28 */
4735 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4736 tarc1 &= ~__BIT(28);
4737 else
4738 tarc1 |= __BIT(28);
4739 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30);
4740 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4741
4742 /* Device Status */
4743 if (sc->sc_type == WM_T_ICH8) {
4744 reg = CSR_READ(sc, WMREG_STATUS);
4745 reg &= ~__BIT(31);
4746 CSR_WRITE(sc, WMREG_STATUS, reg);
4747
4748 }
4749
4750 /* IOSFPC */
4751 if (sc->sc_type == WM_T_PCH_SPT) {
4752 reg = CSR_READ(sc, WMREG_IOSFPC);
4753 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */
4754 CSR_WRITE(sc, WMREG_IOSFPC, reg);
4755 }
4756 /*
4757 * Work-around descriptor data corruption issue during
4758 * NFS v2 UDP traffic, just disable the NFS filtering
4759 * capability.
4760 */
4761 reg = CSR_READ(sc, WMREG_RFCTL);
4762 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS;
4763 CSR_WRITE(sc, WMREG_RFCTL, reg);
4764 break;
4765 default:
4766 break;
4767 }
4768 CSR_WRITE(sc, WMREG_TARC0, tarc0);
4769
4770 switch (sc->sc_type) {
4771 /*
4772 * 8257[12] Errata No.52, 82573 Errata No.43 and some others.
4773 * Avoid RSS Hash Value bug.
4774 */
4775 case WM_T_82571:
4776 case WM_T_82572:
4777 case WM_T_82573:
4778 case WM_T_80003:
4779 case WM_T_ICH8:
4780 reg = CSR_READ(sc, WMREG_RFCTL);
4781 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
4782 CSR_WRITE(sc, WMREG_RFCTL, reg);
4783 break;
4784 case WM_T_82574:
4785 /* Use extened Rx descriptor. */
4786 reg = CSR_READ(sc, WMREG_RFCTL);
4787 reg |= WMREG_RFCTL_EXSTEN;
4788 CSR_WRITE(sc, WMREG_RFCTL, reg);
4789 break;
4790 default:
4791 break;
4792 }
4793 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) {
4794 /*
4795 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24,
4796 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11:
4797 * "Certain Malformed IPv6 Extension Headers are Not Processed
4798 * Correctly by the Device"
4799 *
4800 * I354(C2000) Errata AVR53:
4801 * "Malformed IPv6 Extension Headers May Result in LAN Device
4802 * Hang"
4803 */
4804 reg = CSR_READ(sc, WMREG_RFCTL);
4805 reg |= WMREG_RFCTL_IPV6EXDIS;
4806 CSR_WRITE(sc, WMREG_RFCTL, reg);
4807 }
4808 }
4809
4810 static uint32_t
4811 wm_rxpbs_adjust_82580(uint32_t val)
4812 {
4813 uint32_t rv = 0;
4814
4815 if (val < __arraycount(wm_82580_rxpbs_table))
4816 rv = wm_82580_rxpbs_table[val];
4817
4818 return rv;
4819 }
4820
4821 /*
4822 * wm_reset_phy:
4823 *
4824 * generic PHY reset function.
4825 * Same as e1000_phy_hw_reset_generic()
4826 */
4827 static int
4828 wm_reset_phy(struct wm_softc *sc)
4829 {
4830 uint32_t reg;
4831
4832 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4833 device_xname(sc->sc_dev), __func__));
4834 if (wm_phy_resetisblocked(sc))
4835 return -1;
4836
4837 sc->phy.acquire(sc);
4838
4839 reg = CSR_READ(sc, WMREG_CTRL);
4840 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
4841 CSR_WRITE_FLUSH(sc);
4842
4843 delay(sc->phy.reset_delay_us);
4844
4845 CSR_WRITE(sc, WMREG_CTRL, reg);
4846 CSR_WRITE_FLUSH(sc);
4847
4848 delay(150);
4849
4850 sc->phy.release(sc);
4851
4852 wm_get_cfg_done(sc);
4853 wm_phy_post_reset(sc);
4854
4855 return 0;
4856 }
4857
4858 /*
4859 * wm_flush_desc_rings - remove all descriptors from the descriptor rings.
4860 *
4861 * In i219, the descriptor rings must be emptied before resetting the HW
4862 * or before changing the device state to D3 during runtime (runtime PM).
4863 *
4864 * Failure to do this will cause the HW to enter a unit hang state which can
4865 * only be released by PCI reset on the device.
4866 *
4867 * I219 does not use multiqueue, so it is enough to check sc->sc_queue[0] only.
4868 */
4869 static void
4870 wm_flush_desc_rings(struct wm_softc *sc)
4871 {
4872 pcireg_t preg;
4873 uint32_t reg;
4874 struct wm_txqueue *txq;
4875 wiseman_txdesc_t *txd;
4876 int nexttx;
4877 uint32_t rctl;
4878
4879 /* First, disable MULR fix in FEXTNVM11 */
4880 reg = CSR_READ(sc, WMREG_FEXTNVM11);
4881 reg |= FEXTNVM11_DIS_MULRFIX;
4882 CSR_WRITE(sc, WMREG_FEXTNVM11, reg);
4883
4884 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4885 reg = CSR_READ(sc, WMREG_TDLEN(0));
4886 if (((preg & DESCRING_STATUS_FLUSH_REQ) == 0) || (reg == 0))
4887 return;
4888
4889 /*
4890 * Remove all descriptors from the tx_ring.
4891 *
4892 * We want to clear all pending descriptors from the TX ring. Zeroing
4893 * happens when the HW reads the regs. We assign the ring itself as
4894 * the data of the next descriptor. We don't care about the data we are
4895 * about to reset the HW.
4896 */
4897 #ifdef WM_DEBUG
4898 device_printf(sc->sc_dev, "Need TX flush (reg = %08x)\n", preg);
4899 #endif
4900 reg = CSR_READ(sc, WMREG_TCTL);
4901 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN);
4902
4903 txq = &sc->sc_queue[0].wmq_txq;
4904 nexttx = txq->txq_next;
4905 txd = &txq->txq_descs[nexttx];
4906 wm_set_dma_addr(&txd->wtx_addr, txq->txq_desc_dma);
4907 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS | 512);
4908 txd->wtx_fields.wtxu_status = 0;
4909 txd->wtx_fields.wtxu_options = 0;
4910 txd->wtx_fields.wtxu_vlan = 0;
4911
4912 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4913 BUS_SPACE_BARRIER_WRITE);
4914
4915 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
4916 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next);
4917 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4918 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
4919 delay(250);
4920
4921 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4922 if ((preg & DESCRING_STATUS_FLUSH_REQ) == 0)
4923 return;
4924
4925 /*
4926 * Mark all descriptors in the RX ring as consumed and disable the
4927 * rx ring.
4928 */
4929 #ifdef WM_DEBUG
4930 device_printf(sc->sc_dev, "Need RX flush (reg = %08x)\n", preg);
4931 #endif
4932 rctl = CSR_READ(sc, WMREG_RCTL);
4933 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4934 CSR_WRITE_FLUSH(sc);
4935 delay(150);
4936
4937 reg = CSR_READ(sc, WMREG_RXDCTL(0));
4938 /* Zero the lower 14 bits (prefetch and host thresholds) */
4939 reg &= 0xffffc000;
4940 /*
4941 * Update thresholds: prefetch threshold to 31, host threshold
4942 * to 1 and make sure the granularity is "descriptors" and not
4943 * "cache lines"
4944 */
4945 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN);
4946 CSR_WRITE(sc, WMREG_RXDCTL(0), reg);
4947
4948 /* Momentarily enable the RX ring for the changes to take effect */
4949 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN);
4950 CSR_WRITE_FLUSH(sc);
4951 delay(150);
4952 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4953 }
4954
4955 /*
4956 * wm_reset:
4957 *
4958 * Reset the i82542 chip.
4959 */
4960 static void
4961 wm_reset(struct wm_softc *sc)
4962 {
4963 int phy_reset = 0;
4964 int i, error = 0;
4965 uint32_t reg;
4966 uint16_t kmreg;
4967 int rv;
4968
4969 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
4970 device_xname(sc->sc_dev), __func__));
4971 KASSERT(sc->sc_type != 0);
4972
4973 /*
4974 * Allocate on-chip memory according to the MTU size.
4975 * The Packet Buffer Allocation register must be written
4976 * before the chip is reset.
4977 */
4978 switch (sc->sc_type) {
4979 case WM_T_82547:
4980 case WM_T_82547_2:
4981 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4982 PBA_22K : PBA_30K;
4983 for (i = 0; i < sc->sc_nqueues; i++) {
4984 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
4985 txq->txq_fifo_head = 0;
4986 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT;
4987 txq->txq_fifo_size =
4988 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT;
4989 txq->txq_fifo_stall = 0;
4990 }
4991 break;
4992 case WM_T_82571:
4993 case WM_T_82572:
4994 case WM_T_82575: /* XXX need special handing for jumbo frames */
4995 case WM_T_80003:
4996 sc->sc_pba = PBA_32K;
4997 break;
4998 case WM_T_82573:
4999 sc->sc_pba = PBA_12K;
5000 break;
5001 case WM_T_82574:
5002 case WM_T_82583:
5003 sc->sc_pba = PBA_20K;
5004 break;
5005 case WM_T_82576:
5006 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS);
5007 sc->sc_pba &= RXPBS_SIZE_MASK_82576;
5008 break;
5009 case WM_T_82580:
5010 case WM_T_I350:
5011 case WM_T_I354:
5012 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS));
5013 break;
5014 case WM_T_I210:
5015 case WM_T_I211:
5016 sc->sc_pba = PBA_34K;
5017 break;
5018 case WM_T_ICH8:
5019 /* Workaround for a bit corruption issue in FIFO memory */
5020 sc->sc_pba = PBA_8K;
5021 CSR_WRITE(sc, WMREG_PBS, PBA_16K);
5022 break;
5023 case WM_T_ICH9:
5024 case WM_T_ICH10:
5025 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ?
5026 PBA_14K : PBA_10K;
5027 break;
5028 case WM_T_PCH:
5029 case WM_T_PCH2: /* XXX 14K? */
5030 case WM_T_PCH_LPT:
5031 case WM_T_PCH_SPT:
5032 case WM_T_PCH_CNP:
5033 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 1500 ?
5034 PBA_12K : PBA_26K;
5035 break;
5036 default:
5037 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
5038 PBA_40K : PBA_48K;
5039 break;
5040 }
5041 /*
5042 * Only old or non-multiqueue devices have the PBA register
5043 * XXX Need special handling for 82575.
5044 */
5045 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0)
5046 || (sc->sc_type == WM_T_82575))
5047 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba);
5048
5049 /* Prevent the PCI-E bus from sticking */
5050 if (sc->sc_flags & WM_F_PCIE) {
5051 int timeout = 800;
5052
5053 sc->sc_ctrl |= CTRL_GIO_M_DIS;
5054 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
5055
5056 while (timeout--) {
5057 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA)
5058 == 0)
5059 break;
5060 delay(100);
5061 }
5062 if (timeout == 0)
5063 device_printf(sc->sc_dev,
5064 "failed to disable busmastering\n");
5065 }
5066
5067 /* Set the completion timeout for interface */
5068 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
5069 || (sc->sc_type == WM_T_82580)
5070 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
5071 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
5072 wm_set_pcie_completion_timeout(sc);
5073
5074 /* Clear interrupt */
5075 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5076 if (wm_is_using_msix(sc)) {
5077 if (sc->sc_type != WM_T_82574) {
5078 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
5079 CSR_WRITE(sc, WMREG_EIAC, 0);
5080 } else
5081 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
5082 }
5083
5084 /* Stop the transmit and receive processes. */
5085 CSR_WRITE(sc, WMREG_RCTL, 0);
5086 sc->sc_rctl &= ~RCTL_EN;
5087 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP);
5088 CSR_WRITE_FLUSH(sc);
5089
5090 /* XXX set_tbi_sbp_82543() */
5091
5092 delay(10*1000);
5093
5094 /* Must acquire the MDIO ownership before MAC reset */
5095 switch (sc->sc_type) {
5096 case WM_T_82573:
5097 case WM_T_82574:
5098 case WM_T_82583:
5099 error = wm_get_hw_semaphore_82573(sc);
5100 break;
5101 default:
5102 break;
5103 }
5104
5105 /*
5106 * 82541 Errata 29? & 82547 Errata 28?
5107 * See also the description about PHY_RST bit in CTRL register
5108 * in 8254x_GBe_SDM.pdf.
5109 */
5110 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) {
5111 CSR_WRITE(sc, WMREG_CTRL,
5112 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET);
5113 CSR_WRITE_FLUSH(sc);
5114 delay(5000);
5115 }
5116
5117 switch (sc->sc_type) {
5118 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */
5119 case WM_T_82541:
5120 case WM_T_82541_2:
5121 case WM_T_82547:
5122 case WM_T_82547_2:
5123 /*
5124 * On some chipsets, a reset through a memory-mapped write
5125 * cycle can cause the chip to reset before completing the
5126 * write cycle. This causes major headache that can be avoided
5127 * by issuing the reset via indirect register writes through
5128 * I/O space.
5129 *
5130 * So, if we successfully mapped the I/O BAR at attach time,
5131 * use that. Otherwise, try our luck with a memory-mapped
5132 * reset.
5133 */
5134 if (sc->sc_flags & WM_F_IOH_VALID)
5135 wm_io_write(sc, WMREG_CTRL, CTRL_RST);
5136 else
5137 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
5138 break;
5139 case WM_T_82545_3:
5140 case WM_T_82546_3:
5141 /* Use the shadow control register on these chips. */
5142 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST);
5143 break;
5144 case WM_T_80003:
5145 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
5146 sc->phy.acquire(sc);
5147 CSR_WRITE(sc, WMREG_CTRL, reg);
5148 sc->phy.release(sc);
5149 break;
5150 case WM_T_ICH8:
5151 case WM_T_ICH9:
5152 case WM_T_ICH10:
5153 case WM_T_PCH:
5154 case WM_T_PCH2:
5155 case WM_T_PCH_LPT:
5156 case WM_T_PCH_SPT:
5157 case WM_T_PCH_CNP:
5158 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
5159 if (wm_phy_resetisblocked(sc) == false) {
5160 /*
5161 * Gate automatic PHY configuration by hardware on
5162 * non-managed 82579
5163 */
5164 if ((sc->sc_type == WM_T_PCH2)
5165 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID)
5166 == 0))
5167 wm_gate_hw_phy_config_ich8lan(sc, true);
5168
5169 reg |= CTRL_PHY_RESET;
5170 phy_reset = 1;
5171 } else
5172 device_printf(sc->sc_dev, "XXX reset is blocked!!!\n");
5173 sc->phy.acquire(sc);
5174 CSR_WRITE(sc, WMREG_CTRL, reg);
5175 /* Don't insert a completion barrier when reset */
5176 delay(20*1000);
5177 mutex_exit(sc->sc_ich_phymtx);
5178 break;
5179 case WM_T_82580:
5180 case WM_T_I350:
5181 case WM_T_I354:
5182 case WM_T_I210:
5183 case WM_T_I211:
5184 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
5185 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII)
5186 CSR_WRITE_FLUSH(sc);
5187 delay(5000);
5188 break;
5189 case WM_T_82542_2_0:
5190 case WM_T_82542_2_1:
5191 case WM_T_82543:
5192 case WM_T_82540:
5193 case WM_T_82545:
5194 case WM_T_82546:
5195 case WM_T_82571:
5196 case WM_T_82572:
5197 case WM_T_82573:
5198 case WM_T_82574:
5199 case WM_T_82575:
5200 case WM_T_82576:
5201 case WM_T_82583:
5202 default:
5203 /* Everything else can safely use the documented method. */
5204 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
5205 break;
5206 }
5207
5208 /* Must release the MDIO ownership after MAC reset */
5209 switch (sc->sc_type) {
5210 case WM_T_82573:
5211 case WM_T_82574:
5212 case WM_T_82583:
5213 if (error == 0)
5214 wm_put_hw_semaphore_82573(sc);
5215 break;
5216 default:
5217 break;
5218 }
5219
5220 /* Set Phy Config Counter to 50msec */
5221 if (sc->sc_type == WM_T_PCH2) {
5222 reg = CSR_READ(sc, WMREG_FEXTNVM3);
5223 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
5224 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
5225 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
5226 }
5227
5228 if (phy_reset != 0)
5229 wm_get_cfg_done(sc);
5230
5231 /* Reload EEPROM */
5232 switch (sc->sc_type) {
5233 case WM_T_82542_2_0:
5234 case WM_T_82542_2_1:
5235 case WM_T_82543:
5236 case WM_T_82544:
5237 delay(10);
5238 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
5239 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5240 CSR_WRITE_FLUSH(sc);
5241 delay(2000);
5242 break;
5243 case WM_T_82540:
5244 case WM_T_82545:
5245 case WM_T_82545_3:
5246 case WM_T_82546:
5247 case WM_T_82546_3:
5248 delay(5*1000);
5249 /* XXX Disable HW ARPs on ASF enabled adapters */
5250 break;
5251 case WM_T_82541:
5252 case WM_T_82541_2:
5253 case WM_T_82547:
5254 case WM_T_82547_2:
5255 delay(20000);
5256 /* XXX Disable HW ARPs on ASF enabled adapters */
5257 break;
5258 case WM_T_82571:
5259 case WM_T_82572:
5260 case WM_T_82573:
5261 case WM_T_82574:
5262 case WM_T_82583:
5263 if (sc->sc_flags & WM_F_EEPROM_FLASH) {
5264 delay(10);
5265 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
5266 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5267 CSR_WRITE_FLUSH(sc);
5268 }
5269 /* check EECD_EE_AUTORD */
5270 wm_get_auto_rd_done(sc);
5271 /*
5272 * Phy configuration from NVM just starts after EECD_AUTO_RD
5273 * is set.
5274 */
5275 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574)
5276 || (sc->sc_type == WM_T_82583))
5277 delay(25*1000);
5278 break;
5279 case WM_T_82575:
5280 case WM_T_82576:
5281 case WM_T_82580:
5282 case WM_T_I350:
5283 case WM_T_I354:
5284 case WM_T_I210:
5285 case WM_T_I211:
5286 case WM_T_80003:
5287 /* check EECD_EE_AUTORD */
5288 wm_get_auto_rd_done(sc);
5289 break;
5290 case WM_T_ICH8:
5291 case WM_T_ICH9:
5292 case WM_T_ICH10:
5293 case WM_T_PCH:
5294 case WM_T_PCH2:
5295 case WM_T_PCH_LPT:
5296 case WM_T_PCH_SPT:
5297 case WM_T_PCH_CNP:
5298 break;
5299 default:
5300 panic("%s: unknown type\n", __func__);
5301 }
5302
5303 /* Check whether EEPROM is present or not */
5304 switch (sc->sc_type) {
5305 case WM_T_82575:
5306 case WM_T_82576:
5307 case WM_T_82580:
5308 case WM_T_I350:
5309 case WM_T_I354:
5310 case WM_T_ICH8:
5311 case WM_T_ICH9:
5312 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) {
5313 /* Not found */
5314 sc->sc_flags |= WM_F_EEPROM_INVALID;
5315 if (sc->sc_type == WM_T_82575)
5316 wm_reset_init_script_82575(sc);
5317 }
5318 break;
5319 default:
5320 break;
5321 }
5322
5323 if (phy_reset != 0)
5324 wm_phy_post_reset(sc);
5325
5326 if ((sc->sc_type == WM_T_82580)
5327 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) {
5328 /* Clear global device reset status bit */
5329 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET);
5330 }
5331
5332 /* Clear any pending interrupt events. */
5333 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5334 reg = CSR_READ(sc, WMREG_ICR);
5335 if (wm_is_using_msix(sc)) {
5336 if (sc->sc_type != WM_T_82574) {
5337 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
5338 CSR_WRITE(sc, WMREG_EIAC, 0);
5339 } else
5340 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
5341 }
5342
5343 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
5344 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
5345 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
5346 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){
5347 reg = CSR_READ(sc, WMREG_KABGTXD);
5348 reg |= KABGTXD_BGSQLBIAS;
5349 CSR_WRITE(sc, WMREG_KABGTXD, reg);
5350 }
5351
5352 /* Reload sc_ctrl */
5353 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
5354
5355 wm_set_eee(sc);
5356
5357 /*
5358 * For PCH, this write will make sure that any noise will be detected
5359 * as a CRC error and be dropped rather than show up as a bad packet
5360 * to the DMA engine
5361 */
5362 if (sc->sc_type == WM_T_PCH)
5363 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565);
5364
5365 if (sc->sc_type >= WM_T_82544)
5366 CSR_WRITE(sc, WMREG_WUC, 0);
5367
5368 if (sc->sc_type < WM_T_82575)
5369 wm_disable_aspm(sc); /* Workaround for some chips */
5370
5371 wm_reset_mdicnfg_82580(sc);
5372
5373 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
5374 wm_pll_workaround_i210(sc);
5375
5376 if (sc->sc_type == WM_T_80003) {
5377 /* Default to TRUE to enable the MDIC W/A */
5378 sc->sc_flags |= WM_F_80003_MDIC_WA;
5379
5380 rv = wm_kmrn_readreg(sc,
5381 KUMCTRLSTA_OFFSET >> KUMCTRLSTA_OFFSET_SHIFT, &kmreg);
5382 if (rv == 0) {
5383 if ((kmreg & KUMCTRLSTA_OPMODE_MASK)
5384 == KUMCTRLSTA_OPMODE_INBAND_MDIO)
5385 sc->sc_flags &= ~WM_F_80003_MDIC_WA;
5386 else
5387 sc->sc_flags |= WM_F_80003_MDIC_WA;
5388 }
5389 }
5390 }
5391
5392 /*
5393 * wm_add_rxbuf:
5394 *
5395 * Add a receive buffer to the indiciated descriptor.
5396 */
5397 static int
5398 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx)
5399 {
5400 struct wm_softc *sc = rxq->rxq_sc;
5401 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx];
5402 struct mbuf *m;
5403 int error;
5404
5405 KASSERT(mutex_owned(rxq->rxq_lock));
5406
5407 MGETHDR(m, M_DONTWAIT, MT_DATA);
5408 if (m == NULL)
5409 return ENOBUFS;
5410
5411 MCLGET(m, M_DONTWAIT);
5412 if ((m->m_flags & M_EXT) == 0) {
5413 m_freem(m);
5414 return ENOBUFS;
5415 }
5416
5417 if (rxs->rxs_mbuf != NULL)
5418 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
5419
5420 rxs->rxs_mbuf = m;
5421
5422 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
5423 /*
5424 * Cannot use bus_dmamap_load_mbuf() here because m_data may be
5425 * sc_align_tweak'd between bus_dmamap_load() and bus_dmamap_sync().
5426 */
5427 error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, m->m_ext.ext_buf,
5428 m->m_ext.ext_size, NULL, BUS_DMA_READ | BUS_DMA_NOWAIT);
5429 if (error) {
5430 /* XXX XXX XXX */
5431 aprint_error_dev(sc->sc_dev,
5432 "unable to load rx DMA map %d, error = %d\n", idx, error);
5433 panic("wm_add_rxbuf");
5434 }
5435
5436 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
5437 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
5438
5439 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5440 if ((sc->sc_rctl & RCTL_EN) != 0)
5441 wm_init_rxdesc(rxq, idx);
5442 } else
5443 wm_init_rxdesc(rxq, idx);
5444
5445 return 0;
5446 }
5447
5448 /*
5449 * wm_rxdrain:
5450 *
5451 * Drain the receive queue.
5452 */
5453 static void
5454 wm_rxdrain(struct wm_rxqueue *rxq)
5455 {
5456 struct wm_softc *sc = rxq->rxq_sc;
5457 struct wm_rxsoft *rxs;
5458 int i;
5459
5460 KASSERT(mutex_owned(rxq->rxq_lock));
5461
5462 for (i = 0; i < WM_NRXDESC; i++) {
5463 rxs = &rxq->rxq_soft[i];
5464 if (rxs->rxs_mbuf != NULL) {
5465 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
5466 m_freem(rxs->rxs_mbuf);
5467 rxs->rxs_mbuf = NULL;
5468 }
5469 }
5470 }
5471
5472 /*
5473 * Setup registers for RSS.
5474 *
5475 * XXX not yet VMDq support
5476 */
5477 static void
5478 wm_init_rss(struct wm_softc *sc)
5479 {
5480 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS];
5481 int i;
5482
5483 CTASSERT(sizeof(rss_key) == RSS_KEYSIZE);
5484
5485 for (i = 0; i < RETA_NUM_ENTRIES; i++) {
5486 unsigned int qid, reta_ent;
5487
5488 qid = i % sc->sc_nqueues;
5489 switch (sc->sc_type) {
5490 case WM_T_82574:
5491 reta_ent = __SHIFTIN(qid,
5492 RETA_ENT_QINDEX_MASK_82574);
5493 break;
5494 case WM_T_82575:
5495 reta_ent = __SHIFTIN(qid,
5496 RETA_ENT_QINDEX1_MASK_82575);
5497 break;
5498 default:
5499 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK);
5500 break;
5501 }
5502
5503 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i));
5504 reta_reg &= ~RETA_ENTRY_MASK_Q(i);
5505 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i));
5506 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg);
5507 }
5508
5509 rss_getkey((uint8_t *)rss_key);
5510 for (i = 0; i < RSSRK_NUM_REGS; i++)
5511 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]);
5512
5513 if (sc->sc_type == WM_T_82574)
5514 mrqc = MRQC_ENABLE_RSS_MQ_82574;
5515 else
5516 mrqc = MRQC_ENABLE_RSS_MQ;
5517
5518 /*
5519 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata.
5520 * See IPV6EXDIS bit in wm_initialize_hardware_bits().
5521 */
5522 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP);
5523 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP);
5524 #if 0
5525 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP);
5526 mrqc |= MRQC_RSS_FIELD_IPV6_UDP_EX;
5527 #endif
5528 mrqc |= MRQC_RSS_FIELD_IPV6_TCP_EX;
5529
5530 CSR_WRITE(sc, WMREG_MRQC, mrqc);
5531 }
5532
5533 /*
5534 * Adjust TX and RX queue numbers which the system actulally uses.
5535 *
5536 * The numbers are affected by below parameters.
5537 * - The nubmer of hardware queues
5538 * - The number of MSI-X vectors (= "nvectors" argument)
5539 * - ncpu
5540 */
5541 static void
5542 wm_adjust_qnum(struct wm_softc *sc, int nvectors)
5543 {
5544 int hw_ntxqueues, hw_nrxqueues, hw_nqueues;
5545
5546 if (nvectors < 2) {
5547 sc->sc_nqueues = 1;
5548 return;
5549 }
5550
5551 switch (sc->sc_type) {
5552 case WM_T_82572:
5553 hw_ntxqueues = 2;
5554 hw_nrxqueues = 2;
5555 break;
5556 case WM_T_82574:
5557 hw_ntxqueues = 2;
5558 hw_nrxqueues = 2;
5559 break;
5560 case WM_T_82575:
5561 hw_ntxqueues = 4;
5562 hw_nrxqueues = 4;
5563 break;
5564 case WM_T_82576:
5565 hw_ntxqueues = 16;
5566 hw_nrxqueues = 16;
5567 break;
5568 case WM_T_82580:
5569 case WM_T_I350:
5570 case WM_T_I354:
5571 hw_ntxqueues = 8;
5572 hw_nrxqueues = 8;
5573 break;
5574 case WM_T_I210:
5575 hw_ntxqueues = 4;
5576 hw_nrxqueues = 4;
5577 break;
5578 case WM_T_I211:
5579 hw_ntxqueues = 2;
5580 hw_nrxqueues = 2;
5581 break;
5582 /*
5583 * As below ethernet controllers does not support MSI-X,
5584 * this driver let them not use multiqueue.
5585 * - WM_T_80003
5586 * - WM_T_ICH8
5587 * - WM_T_ICH9
5588 * - WM_T_ICH10
5589 * - WM_T_PCH
5590 * - WM_T_PCH2
5591 * - WM_T_PCH_LPT
5592 */
5593 default:
5594 hw_ntxqueues = 1;
5595 hw_nrxqueues = 1;
5596 break;
5597 }
5598
5599 hw_nqueues = uimin(hw_ntxqueues, hw_nrxqueues);
5600
5601 /*
5602 * As queues more than MSI-X vectors cannot improve scaling, we limit
5603 * the number of queues used actually.
5604 */
5605 if (nvectors < hw_nqueues + 1)
5606 sc->sc_nqueues = nvectors - 1;
5607 else
5608 sc->sc_nqueues = hw_nqueues;
5609
5610 /*
5611 * As queues more then cpus cannot improve scaling, we limit
5612 * the number of queues used actually.
5613 */
5614 if (ncpu < sc->sc_nqueues)
5615 sc->sc_nqueues = ncpu;
5616 }
5617
5618 static inline bool
5619 wm_is_using_msix(struct wm_softc *sc)
5620 {
5621
5622 return (sc->sc_nintrs > 1);
5623 }
5624
5625 static inline bool
5626 wm_is_using_multiqueue(struct wm_softc *sc)
5627 {
5628
5629 return (sc->sc_nqueues > 1);
5630 }
5631
5632 static int
5633 wm_softint_establish_queue(struct wm_softc *sc, int qidx, int intr_idx)
5634 {
5635 struct wm_queue *wmq = &sc->sc_queue[qidx];
5636
5637 wmq->wmq_id = qidx;
5638 wmq->wmq_intr_idx = intr_idx;
5639 wmq->wmq_si = softint_establish(SOFTINT_NET | WM_SOFTINT_FLAGS,
5640 wm_handle_queue, wmq);
5641 if (wmq->wmq_si != NULL)
5642 return 0;
5643
5644 aprint_error_dev(sc->sc_dev, "unable to establish queue[%d] handler\n",
5645 wmq->wmq_id);
5646 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[wmq->wmq_intr_idx]);
5647 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5648 return ENOMEM;
5649 }
5650
5651 /*
5652 * Both single interrupt MSI and INTx can use this function.
5653 */
5654 static int
5655 wm_setup_legacy(struct wm_softc *sc)
5656 {
5657 pci_chipset_tag_t pc = sc->sc_pc;
5658 const char *intrstr = NULL;
5659 char intrbuf[PCI_INTRSTR_LEN];
5660 int error;
5661
5662 error = wm_alloc_txrx_queues(sc);
5663 if (error) {
5664 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5665 error);
5666 return ENOMEM;
5667 }
5668 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf,
5669 sizeof(intrbuf));
5670 #ifdef WM_MPSAFE
5671 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true);
5672 #endif
5673 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
5674 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev));
5675 if (sc->sc_ihs[0] == NULL) {
5676 aprint_error_dev(sc->sc_dev,"unable to establish %s\n",
5677 (pci_intr_type(pc, sc->sc_intrs[0])
5678 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
5679 return ENOMEM;
5680 }
5681
5682 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
5683 sc->sc_nintrs = 1;
5684
5685 return wm_softint_establish_queue(sc, 0, 0);
5686 }
5687
5688 static int
5689 wm_setup_msix(struct wm_softc *sc)
5690 {
5691 void *vih;
5692 kcpuset_t *affinity;
5693 int qidx, error, intr_idx, txrx_established;
5694 pci_chipset_tag_t pc = sc->sc_pc;
5695 const char *intrstr = NULL;
5696 char intrbuf[PCI_INTRSTR_LEN];
5697 char intr_xname[INTRDEVNAMEBUF];
5698
5699 if (sc->sc_nqueues < ncpu) {
5700 /*
5701 * To avoid other devices' interrupts, the affinity of Tx/Rx
5702 * interrupts start from CPU#1.
5703 */
5704 sc->sc_affinity_offset = 1;
5705 } else {
5706 /*
5707 * In this case, this device use all CPUs. So, we unify
5708 * affinitied cpu_index to msix vector number for readability.
5709 */
5710 sc->sc_affinity_offset = 0;
5711 }
5712
5713 error = wm_alloc_txrx_queues(sc);
5714 if (error) {
5715 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5716 error);
5717 return ENOMEM;
5718 }
5719
5720 kcpuset_create(&affinity, false);
5721 intr_idx = 0;
5722
5723 /*
5724 * TX and RX
5725 */
5726 txrx_established = 0;
5727 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5728 struct wm_queue *wmq = &sc->sc_queue[qidx];
5729 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu;
5730
5731 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5732 sizeof(intrbuf));
5733 #ifdef WM_MPSAFE
5734 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx],
5735 PCI_INTR_MPSAFE, true);
5736 #endif
5737 memset(intr_xname, 0, sizeof(intr_xname));
5738 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d",
5739 device_xname(sc->sc_dev), qidx);
5740 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5741 IPL_NET, wm_txrxintr_msix, wmq, intr_xname);
5742 if (vih == NULL) {
5743 aprint_error_dev(sc->sc_dev,
5744 "unable to establish MSI-X(for TX and RX)%s%s\n",
5745 intrstr ? " at " : "",
5746 intrstr ? intrstr : "");
5747
5748 goto fail;
5749 }
5750 kcpuset_zero(affinity);
5751 /* Round-robin affinity */
5752 kcpuset_set(affinity, affinity_to);
5753 error = interrupt_distribute(vih, affinity, NULL);
5754 if (error == 0) {
5755 aprint_normal_dev(sc->sc_dev,
5756 "for TX and RX interrupting at %s affinity to %u\n",
5757 intrstr, affinity_to);
5758 } else {
5759 aprint_normal_dev(sc->sc_dev,
5760 "for TX and RX interrupting at %s\n", intrstr);
5761 }
5762 sc->sc_ihs[intr_idx] = vih;
5763 if (wm_softint_establish_queue(sc, qidx, intr_idx) != 0)
5764 goto fail;
5765 txrx_established++;
5766 intr_idx++;
5767 }
5768
5769 /* LINK */
5770 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5771 sizeof(intrbuf));
5772 #ifdef WM_MPSAFE
5773 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true);
5774 #endif
5775 memset(intr_xname, 0, sizeof(intr_xname));
5776 snprintf(intr_xname, sizeof(intr_xname), "%sLINK",
5777 device_xname(sc->sc_dev));
5778 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5779 IPL_NET, wm_linkintr_msix, sc, intr_xname);
5780 if (vih == NULL) {
5781 aprint_error_dev(sc->sc_dev,
5782 "unable to establish MSI-X(for LINK)%s%s\n",
5783 intrstr ? " at " : "",
5784 intrstr ? intrstr : "");
5785
5786 goto fail;
5787 }
5788 /* Keep default affinity to LINK interrupt */
5789 aprint_normal_dev(sc->sc_dev,
5790 "for LINK interrupting at %s\n", intrstr);
5791 sc->sc_ihs[intr_idx] = vih;
5792 sc->sc_link_intr_idx = intr_idx;
5793
5794 sc->sc_nintrs = sc->sc_nqueues + 1;
5795 kcpuset_destroy(affinity);
5796 return 0;
5797
5798 fail:
5799 for (qidx = 0; qidx < txrx_established; qidx++) {
5800 struct wm_queue *wmq = &sc->sc_queue[qidx];
5801 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]);
5802 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5803 }
5804
5805 kcpuset_destroy(affinity);
5806 return ENOMEM;
5807 }
5808
5809 static void
5810 wm_unset_stopping_flags(struct wm_softc *sc)
5811 {
5812 int i;
5813
5814 KASSERT(WM_CORE_LOCKED(sc));
5815
5816 /* Must unset stopping flags in ascending order. */
5817 for (i = 0; i < sc->sc_nqueues; i++) {
5818 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5819 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5820
5821 mutex_enter(txq->txq_lock);
5822 txq->txq_stopping = false;
5823 mutex_exit(txq->txq_lock);
5824
5825 mutex_enter(rxq->rxq_lock);
5826 rxq->rxq_stopping = false;
5827 mutex_exit(rxq->rxq_lock);
5828 }
5829
5830 sc->sc_core_stopping = false;
5831 }
5832
5833 static void
5834 wm_set_stopping_flags(struct wm_softc *sc)
5835 {
5836 int i;
5837
5838 KASSERT(WM_CORE_LOCKED(sc));
5839
5840 sc->sc_core_stopping = true;
5841
5842 /* Must set stopping flags in ascending order. */
5843 for (i = 0; i < sc->sc_nqueues; i++) {
5844 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5845 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5846
5847 mutex_enter(rxq->rxq_lock);
5848 rxq->rxq_stopping = true;
5849 mutex_exit(rxq->rxq_lock);
5850
5851 mutex_enter(txq->txq_lock);
5852 txq->txq_stopping = true;
5853 mutex_exit(txq->txq_lock);
5854 }
5855 }
5856
5857 /*
5858 * Write interrupt interval value to ITR or EITR
5859 */
5860 static void
5861 wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq)
5862 {
5863
5864 if (!wmq->wmq_set_itr)
5865 return;
5866
5867 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5868 uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK);
5869
5870 /*
5871 * 82575 doesn't have CNT_INGR field.
5872 * So, overwrite counter field by software.
5873 */
5874 if (sc->sc_type == WM_T_82575)
5875 eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575);
5876 else
5877 eitr |= EITR_CNT_INGR;
5878
5879 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx), eitr);
5880 } else if (sc->sc_type == WM_T_82574 && wm_is_using_msix(sc)) {
5881 /*
5882 * 82574 has both ITR and EITR. SET EITR when we use
5883 * the multi queue function with MSI-X.
5884 */
5885 CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx),
5886 wmq->wmq_itr & EITR_ITR_INT_MASK_82574);
5887 } else {
5888 KASSERT(wmq->wmq_id == 0);
5889 CSR_WRITE(sc, WMREG_ITR, wmq->wmq_itr);
5890 }
5891
5892 wmq->wmq_set_itr = false;
5893 }
5894
5895 /*
5896 * TODO
5897 * Below dynamic calculation of itr is almost the same as linux igb,
5898 * however it does not fit to wm(4). So, we will have been disable AIM
5899 * until we will find appropriate calculation of itr.
5900 */
5901 /*
5902 * calculate interrupt interval value to be going to write register in
5903 * wm_itrs_writereg(). This function does not write ITR/EITR register.
5904 */
5905 static void
5906 wm_itrs_calculate(struct wm_softc *sc, struct wm_queue *wmq)
5907 {
5908 #ifdef NOTYET
5909 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
5910 struct wm_txqueue *txq = &wmq->wmq_txq;
5911 uint32_t avg_size = 0;
5912 uint32_t new_itr;
5913
5914 if (rxq->rxq_packets)
5915 avg_size = rxq->rxq_bytes / rxq->rxq_packets;
5916 if (txq->txq_packets)
5917 avg_size = uimax(avg_size, txq->txq_bytes / txq->txq_packets);
5918
5919 if (avg_size == 0) {
5920 new_itr = 450; /* restore default value */
5921 goto out;
5922 }
5923
5924 /* Add 24 bytes to size to account for CRC, preamble, and gap */
5925 avg_size += 24;
5926
5927 /* Don't starve jumbo frames */
5928 avg_size = uimin(avg_size, 3000);
5929
5930 /* Give a little boost to mid-size frames */
5931 if ((avg_size > 300) && (avg_size < 1200))
5932 new_itr = avg_size / 3;
5933 else
5934 new_itr = avg_size / 2;
5935
5936 out:
5937 /*
5938 * The usage of 82574 and 82575 EITR is different from otther NEWQUEUE
5939 * controllers. See sc->sc_itr_init setting in wm_init_locked().
5940 */
5941 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0 || sc->sc_type != WM_T_82575)
5942 new_itr *= 4;
5943
5944 if (new_itr != wmq->wmq_itr) {
5945 wmq->wmq_itr = new_itr;
5946 wmq->wmq_set_itr = true;
5947 } else
5948 wmq->wmq_set_itr = false;
5949
5950 rxq->rxq_packets = 0;
5951 rxq->rxq_bytes = 0;
5952 txq->txq_packets = 0;
5953 txq->txq_bytes = 0;
5954 #endif
5955 }
5956
5957 static void
5958 wm_init_sysctls(struct wm_softc *sc)
5959 {
5960 struct sysctllog **log;
5961 const struct sysctlnode *rnode, *qnode, *cnode;
5962 int i, rv;
5963 const char *dvname;
5964
5965 log = &sc->sc_sysctllog;
5966 dvname = device_xname(sc->sc_dev);
5967
5968 rv = sysctl_createv(log, 0, NULL, &rnode,
5969 0, CTLTYPE_NODE, dvname,
5970 SYSCTL_DESCR("wm information and settings"),
5971 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
5972 if (rv != 0)
5973 goto err;
5974
5975 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
5976 CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
5977 NULL, 0, &sc->sc_txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL);
5978 if (rv != 0)
5979 goto teardown;
5980
5981 for (i = 0; i < sc->sc_nqueues; i++) {
5982 struct wm_queue *wmq = &sc->sc_queue[i];
5983 struct wm_txqueue *txq = &wmq->wmq_txq;
5984 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
5985
5986 snprintf(sc->sc_queue[i].sysctlname,
5987 sizeof(sc->sc_queue[i].sysctlname), "q%d", i);
5988
5989 if (sysctl_createv(log, 0, &rnode, &qnode,
5990 0, CTLTYPE_NODE,
5991 sc->sc_queue[i].sysctlname, SYSCTL_DESCR("Queue Name"),
5992 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
5993 break;
5994 if (sysctl_createv(log, 0, &qnode, &cnode,
5995 CTLFLAG_READONLY, CTLTYPE_INT,
5996 "txq_free", SYSCTL_DESCR("TX queue free"),
5997 NULL, 0, &txq->txq_free,
5998 0, CTL_CREATE, CTL_EOL) != 0)
5999 break;
6000 if (sysctl_createv(log, 0, &qnode, &cnode,
6001 CTLFLAG_READONLY, CTLTYPE_INT,
6002 "txq_next", SYSCTL_DESCR("TX queue next"),
6003 NULL, 0, &txq->txq_next,
6004 0, CTL_CREATE, CTL_EOL) != 0)
6005 break;
6006
6007 if (sysctl_createv(log, 0, &qnode, &cnode,
6008 CTLFLAG_READONLY, CTLTYPE_INT,
6009 "rxq_ptr", SYSCTL_DESCR("RX queue pointer"),
6010 NULL, 0, &rxq->rxq_ptr,
6011 0, CTL_CREATE, CTL_EOL) != 0)
6012 break;
6013 }
6014
6015 #ifdef WM_DEBUG
6016 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
6017 CTLTYPE_INT, "debug_flags",
6018 SYSCTL_DESCR(
6019 "Debug flags:\n" \
6020 "\t0x01 LINK\n" \
6021 "\t0x02 TX\n" \
6022 "\t0x04 RX\n" \
6023 "\t0x08 GMII\n" \
6024 "\t0x10 MANAGE\n" \
6025 "\t0x20 NVM\n" \
6026 "\t0x40 INIT\n" \
6027 "\t0x80 LOCK"),
6028 wm_sysctl_debug, 0, (void *)sc, 0, CTL_CREATE, CTL_EOL);
6029 if (rv != 0)
6030 goto teardown;
6031 #endif
6032
6033 return;
6034
6035 teardown:
6036 sysctl_teardown(log);
6037 err:
6038 sc->sc_sysctllog = NULL;
6039 device_printf(sc->sc_dev, "%s: sysctl_createv failed, rv = %d\n",
6040 __func__, rv);
6041 }
6042
6043 /*
6044 * wm_init: [ifnet interface function]
6045 *
6046 * Initialize the interface.
6047 */
6048 static int
6049 wm_init(struct ifnet *ifp)
6050 {
6051 struct wm_softc *sc = ifp->if_softc;
6052 int ret;
6053
6054 WM_CORE_LOCK(sc);
6055 ret = wm_init_locked(ifp);
6056 WM_CORE_UNLOCK(sc);
6057
6058 return ret;
6059 }
6060
6061 static int
6062 wm_init_locked(struct ifnet *ifp)
6063 {
6064 struct wm_softc *sc = ifp->if_softc;
6065 struct ethercom *ec = &sc->sc_ethercom;
6066 int i, j, trynum, error = 0;
6067 uint32_t reg, sfp_mask = 0;
6068
6069 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
6070 device_xname(sc->sc_dev), __func__));
6071 KASSERT(WM_CORE_LOCKED(sc));
6072
6073 /*
6074 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
6075 * There is a small but measurable benefit to avoiding the adjusment
6076 * of the descriptor so that the headers are aligned, for normal mtu,
6077 * on such platforms. One possibility is that the DMA itself is
6078 * slightly more efficient if the front of the entire packet (instead
6079 * of the front of the headers) is aligned.
6080 *
6081 * Note we must always set align_tweak to 0 if we are using
6082 * jumbo frames.
6083 */
6084 #ifdef __NO_STRICT_ALIGNMENT
6085 sc->sc_align_tweak = 0;
6086 #else
6087 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
6088 sc->sc_align_tweak = 0;
6089 else
6090 sc->sc_align_tweak = 2;
6091 #endif /* __NO_STRICT_ALIGNMENT */
6092
6093 /* Cancel any pending I/O. */
6094 wm_stop_locked(ifp, false, false);
6095
6096 /* Update statistics before reset */
6097 if_statadd2(ifp, if_collisions, CSR_READ(sc, WMREG_COLC),
6098 if_ierrors, CSR_READ(sc, WMREG_RXERRC));
6099
6100 /* >= PCH_SPT hardware workaround before reset. */
6101 if (sc->sc_type >= WM_T_PCH_SPT)
6102 wm_flush_desc_rings(sc);
6103
6104 /* Reset the chip to a known state. */
6105 wm_reset(sc);
6106
6107 /*
6108 * AMT based hardware can now take control from firmware
6109 * Do this after reset.
6110 */
6111 if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
6112 wm_get_hw_control(sc);
6113
6114 if ((sc->sc_type >= WM_T_PCH_SPT) &&
6115 pci_intr_type(sc->sc_pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_INTX)
6116 wm_legacy_irq_quirk_spt(sc);
6117
6118 /* Init hardware bits */
6119 wm_initialize_hardware_bits(sc);
6120
6121 /* Reset the PHY. */
6122 if (sc->sc_flags & WM_F_HAS_MII)
6123 wm_gmii_reset(sc);
6124
6125 if (sc->sc_type >= WM_T_ICH8) {
6126 reg = CSR_READ(sc, WMREG_GCR);
6127 /*
6128 * ICH8 No-snoop bits are opposite polarity. Set to snoop by
6129 * default after reset.
6130 */
6131 if (sc->sc_type == WM_T_ICH8)
6132 reg |= GCR_NO_SNOOP_ALL;
6133 else
6134 reg &= ~GCR_NO_SNOOP_ALL;
6135 CSR_WRITE(sc, WMREG_GCR, reg);
6136 }
6137
6138 if ((sc->sc_type >= WM_T_ICH8)
6139 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER)
6140 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3)) {
6141
6142 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6143 reg |= CTRL_EXT_RO_DIS;
6144 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6145 }
6146
6147 /* Calculate (E)ITR value */
6148 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0 && sc->sc_type != WM_T_82575) {
6149 /*
6150 * For NEWQUEUE's EITR (except for 82575).
6151 * 82575's EITR should be set same throttling value as other
6152 * old controllers' ITR because the interrupt/sec calculation
6153 * is the same, that is, 1,000,000,000 / (N * 256).
6154 *
6155 * 82574's EITR should be set same throttling value as ITR.
6156 *
6157 * For N interrupts/sec, set this value to:
6158 * 1,000,000 / N in contrast to ITR throttoling value.
6159 */
6160 sc->sc_itr_init = 450;
6161 } else if (sc->sc_type >= WM_T_82543) {
6162 /*
6163 * Set up the interrupt throttling register (units of 256ns)
6164 * Note that a footnote in Intel's documentation says this
6165 * ticker runs at 1/4 the rate when the chip is in 100Mbit
6166 * or 10Mbit mode. Empirically, it appears to be the case
6167 * that that is also true for the 1024ns units of the other
6168 * interrupt-related timer registers -- so, really, we ought
6169 * to divide this value by 4 when the link speed is low.
6170 *
6171 * XXX implement this division at link speed change!
6172 */
6173
6174 /*
6175 * For N interrupts/sec, set this value to:
6176 * 1,000,000,000 / (N * 256). Note that we set the
6177 * absolute and packet timer values to this value
6178 * divided by 4 to get "simple timer" behavior.
6179 */
6180 sc->sc_itr_init = 1500; /* 2604 ints/sec */
6181 }
6182
6183 error = wm_init_txrx_queues(sc);
6184 if (error)
6185 goto out;
6186
6187 if (((sc->sc_flags & WM_F_SGMII) == 0) &&
6188 (sc->sc_mediatype == WM_MEDIATYPE_SERDES) &&
6189 (sc->sc_type >= WM_T_82575))
6190 wm_serdes_power_up_link_82575(sc);
6191
6192 /* Clear out the VLAN table -- we don't use it (yet). */
6193 CSR_WRITE(sc, WMREG_VET, 0);
6194 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
6195 trynum = 10; /* Due to hw errata */
6196 else
6197 trynum = 1;
6198 for (i = 0; i < WM_VLAN_TABSIZE; i++)
6199 for (j = 0; j < trynum; j++)
6200 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
6201
6202 /*
6203 * Set up flow-control parameters.
6204 *
6205 * XXX Values could probably stand some tuning.
6206 */
6207 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
6208 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH)
6209 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)
6210 && (sc->sc_type != WM_T_PCH_SPT) && (sc->sc_type != WM_T_PCH_CNP)){
6211 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
6212 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
6213 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
6214 }
6215
6216 sc->sc_fcrtl = FCRTL_DFLT;
6217 if (sc->sc_type < WM_T_82543) {
6218 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
6219 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl);
6220 } else {
6221 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
6222 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
6223 }
6224
6225 if (sc->sc_type == WM_T_80003)
6226 CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
6227 else
6228 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
6229
6230 /* Writes the control register. */
6231 wm_set_vlan(sc);
6232
6233 if (sc->sc_flags & WM_F_HAS_MII) {
6234 uint16_t kmreg;
6235
6236 switch (sc->sc_type) {
6237 case WM_T_80003:
6238 case WM_T_ICH8:
6239 case WM_T_ICH9:
6240 case WM_T_ICH10:
6241 case WM_T_PCH:
6242 case WM_T_PCH2:
6243 case WM_T_PCH_LPT:
6244 case WM_T_PCH_SPT:
6245 case WM_T_PCH_CNP:
6246 /*
6247 * Set the mac to wait the maximum time between each
6248 * iteration and increase the max iterations when
6249 * polling the phy; this fixes erroneous timeouts at
6250 * 10Mbps.
6251 */
6252 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
6253 0xFFFF);
6254 wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
6255 &kmreg);
6256 kmreg |= 0x3F;
6257 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
6258 kmreg);
6259 break;
6260 default:
6261 break;
6262 }
6263
6264 if (sc->sc_type == WM_T_80003) {
6265 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6266 reg &= ~CTRL_EXT_LINK_MODE_MASK;
6267 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6268
6269 /* Bypass RX and TX FIFO's */
6270 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
6271 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS
6272 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
6273 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
6274 KUMCTRLSTA_INB_CTRL_DIS_PADDING |
6275 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
6276 }
6277 }
6278 #if 0
6279 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
6280 #endif
6281
6282 /* Set up checksum offload parameters. */
6283 reg = CSR_READ(sc, WMREG_RXCSUM);
6284 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL);
6285 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
6286 reg |= RXCSUM_IPOFL;
6287 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx))
6288 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
6289 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
6290 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL;
6291 CSR_WRITE(sc, WMREG_RXCSUM, reg);
6292
6293 /* Set registers about MSI-X */
6294 if (wm_is_using_msix(sc)) {
6295 uint32_t ivar, qintr_idx;
6296 struct wm_queue *wmq;
6297 unsigned int qid;
6298
6299 if (sc->sc_type == WM_T_82575) {
6300 /* Interrupt control */
6301 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6302 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR;
6303 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6304
6305 /* TX and RX */
6306 for (i = 0; i < sc->sc_nqueues; i++) {
6307 wmq = &sc->sc_queue[i];
6308 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx),
6309 EITR_TX_QUEUE(wmq->wmq_id)
6310 | EITR_RX_QUEUE(wmq->wmq_id));
6311 }
6312 /* Link status */
6313 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx),
6314 EITR_OTHER);
6315 } else if (sc->sc_type == WM_T_82574) {
6316 /* Interrupt control */
6317 reg = CSR_READ(sc, WMREG_CTRL_EXT);
6318 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME;
6319 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
6320
6321 /*
6322 * Workaround issue with spurious interrupts
6323 * in MSI-X mode.
6324 * At wm_initialize_hardware_bits(), sc_nintrs has not
6325 * initialized yet. So re-initialize WMREG_RFCTL here.
6326 */
6327 reg = CSR_READ(sc, WMREG_RFCTL);
6328 reg |= WMREG_RFCTL_ACKDIS;
6329 CSR_WRITE(sc, WMREG_RFCTL, reg);
6330
6331 ivar = 0;
6332 /* TX and RX */
6333 for (i = 0; i < sc->sc_nqueues; i++) {
6334 wmq = &sc->sc_queue[i];
6335 qid = wmq->wmq_id;
6336 qintr_idx = wmq->wmq_intr_idx;
6337
6338 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
6339 IVAR_TX_MASK_Q_82574(qid));
6340 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
6341 IVAR_RX_MASK_Q_82574(qid));
6342 }
6343 /* Link status */
6344 ivar |= __SHIFTIN((IVAR_VALID_82574
6345 | sc->sc_link_intr_idx), IVAR_OTHER_MASK);
6346 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB);
6347 } else {
6348 /* Interrupt control */
6349 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX
6350 | GPIE_EIAME | GPIE_PBA);
6351
6352 switch (sc->sc_type) {
6353 case WM_T_82580:
6354 case WM_T_I350:
6355 case WM_T_I354:
6356 case WM_T_I210:
6357 case WM_T_I211:
6358 /* TX and RX */
6359 for (i = 0; i < sc->sc_nqueues; i++) {
6360 wmq = &sc->sc_queue[i];
6361 qid = wmq->wmq_id;
6362 qintr_idx = wmq->wmq_intr_idx;
6363
6364 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid));
6365 ivar &= ~IVAR_TX_MASK_Q(qid);
6366 ivar |= __SHIFTIN((qintr_idx
6367 | IVAR_VALID),
6368 IVAR_TX_MASK_Q(qid));
6369 ivar &= ~IVAR_RX_MASK_Q(qid);
6370 ivar |= __SHIFTIN((qintr_idx
6371 | IVAR_VALID),
6372 IVAR_RX_MASK_Q(qid));
6373 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar);
6374 }
6375 break;
6376 case WM_T_82576:
6377 /* TX and RX */
6378 for (i = 0; i < sc->sc_nqueues; i++) {
6379 wmq = &sc->sc_queue[i];
6380 qid = wmq->wmq_id;
6381 qintr_idx = wmq->wmq_intr_idx;
6382
6383 ivar = CSR_READ(sc,
6384 WMREG_IVAR_Q_82576(qid));
6385 ivar &= ~IVAR_TX_MASK_Q_82576(qid);
6386 ivar |= __SHIFTIN((qintr_idx
6387 | IVAR_VALID),
6388 IVAR_TX_MASK_Q_82576(qid));
6389 ivar &= ~IVAR_RX_MASK_Q_82576(qid);
6390 ivar |= __SHIFTIN((qintr_idx
6391 | IVAR_VALID),
6392 IVAR_RX_MASK_Q_82576(qid));
6393 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid),
6394 ivar);
6395 }
6396 break;
6397 default:
6398 break;
6399 }
6400
6401 /* Link status */
6402 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID),
6403 IVAR_MISC_OTHER);
6404 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar);
6405 }
6406
6407 if (wm_is_using_multiqueue(sc)) {
6408 wm_init_rss(sc);
6409
6410 /*
6411 ** NOTE: Receive Full-Packet Checksum Offload
6412 ** is mutually exclusive with Multiqueue. However
6413 ** this is not the same as TCP/IP checksums which
6414 ** still work.
6415 */
6416 reg = CSR_READ(sc, WMREG_RXCSUM);
6417 reg |= RXCSUM_PCSD;
6418 CSR_WRITE(sc, WMREG_RXCSUM, reg);
6419 }
6420 }
6421
6422 /* Set up the interrupt registers. */
6423 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
6424
6425 /* Enable SFP module insertion interrupt if it's required */
6426 if ((sc->sc_flags & WM_F_SFP) != 0) {
6427 sc->sc_ctrl |= CTRL_EXTLINK_EN;
6428 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
6429 sfp_mask = ICR_GPI(0);
6430 }
6431
6432 if (wm_is_using_msix(sc)) {
6433 uint32_t mask;
6434 struct wm_queue *wmq;
6435
6436 switch (sc->sc_type) {
6437 case WM_T_82574:
6438 mask = 0;
6439 for (i = 0; i < sc->sc_nqueues; i++) {
6440 wmq = &sc->sc_queue[i];
6441 mask |= ICR_TXQ(wmq->wmq_id);
6442 mask |= ICR_RXQ(wmq->wmq_id);
6443 }
6444 mask |= ICR_OTHER;
6445 CSR_WRITE(sc, WMREG_EIAC_82574, mask);
6446 CSR_WRITE(sc, WMREG_IMS, mask | ICR_LSC);
6447 break;
6448 default:
6449 if (sc->sc_type == WM_T_82575) {
6450 mask = 0;
6451 for (i = 0; i < sc->sc_nqueues; i++) {
6452 wmq = &sc->sc_queue[i];
6453 mask |= EITR_TX_QUEUE(wmq->wmq_id);
6454 mask |= EITR_RX_QUEUE(wmq->wmq_id);
6455 }
6456 mask |= EITR_OTHER;
6457 } else {
6458 mask = 0;
6459 for (i = 0; i < sc->sc_nqueues; i++) {
6460 wmq = &sc->sc_queue[i];
6461 mask |= 1 << wmq->wmq_intr_idx;
6462 }
6463 mask |= 1 << sc->sc_link_intr_idx;
6464 }
6465 CSR_WRITE(sc, WMREG_EIAC, mask);
6466 CSR_WRITE(sc, WMREG_EIAM, mask);
6467 CSR_WRITE(sc, WMREG_EIMS, mask);
6468
6469 /* For other interrupts */
6470 CSR_WRITE(sc, WMREG_IMS, ICR_LSC | sfp_mask);
6471 break;
6472 }
6473 } else {
6474 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
6475 ICR_RXO | ICR_RXT0 | sfp_mask;
6476 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
6477 }
6478
6479 /* Set up the inter-packet gap. */
6480 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
6481
6482 if (sc->sc_type >= WM_T_82543) {
6483 for (int qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6484 struct wm_queue *wmq = &sc->sc_queue[qidx];
6485 wm_itrs_writereg(sc, wmq);
6486 }
6487 /*
6488 * Link interrupts occur much less than TX
6489 * interrupts and RX interrupts. So, we don't
6490 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like
6491 * FreeBSD's if_igb.
6492 */
6493 }
6494
6495 /* Set the VLAN ethernetype. */
6496 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
6497
6498 /*
6499 * Set up the transmit control register; we start out with
6500 * a collision distance suitable for FDX, but update it whe
6501 * we resolve the media type.
6502 */
6503 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
6504 | TCTL_CT(TX_COLLISION_THRESHOLD)
6505 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
6506 if (sc->sc_type >= WM_T_82571)
6507 sc->sc_tctl |= TCTL_MULR;
6508 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
6509
6510 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6511 /* Write TDT after TCTL.EN is set. See the document. */
6512 CSR_WRITE(sc, WMREG_TDT(0), 0);
6513 }
6514
6515 if (sc->sc_type == WM_T_80003) {
6516 reg = CSR_READ(sc, WMREG_TCTL_EXT);
6517 reg &= ~TCTL_EXT_GCEX_MASK;
6518 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
6519 CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
6520 }
6521
6522 /* Set the media. */
6523 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
6524 goto out;
6525
6526 /* Configure for OS presence */
6527 wm_init_manageability(sc);
6528
6529 /*
6530 * Set up the receive control register; we actually program the
6531 * register when we set the receive filter. Use multicast address
6532 * offset type 0.
6533 *
6534 * Only the i82544 has the ability to strip the incoming CRC, so we
6535 * don't enable that feature.
6536 */
6537 sc->sc_mchash_type = 0;
6538 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
6539 | __SHIFTIN(sc->sc_mchash_type, RCTL_MO);
6540
6541 /* 82574 use one buffer extended Rx descriptor. */
6542 if (sc->sc_type == WM_T_82574)
6543 sc->sc_rctl |= RCTL_DTYP_ONEBUF;
6544
6545 if ((sc->sc_flags & WM_F_CRC_STRIP) != 0)
6546 sc->sc_rctl |= RCTL_SECRC;
6547
6548 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
6549 && (ifp->if_mtu > ETHERMTU)) {
6550 sc->sc_rctl |= RCTL_LPE;
6551 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6552 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
6553 }
6554
6555 if (MCLBYTES == 2048)
6556 sc->sc_rctl |= RCTL_2k;
6557 else {
6558 if (sc->sc_type >= WM_T_82543) {
6559 switch (MCLBYTES) {
6560 case 4096:
6561 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k;
6562 break;
6563 case 8192:
6564 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k;
6565 break;
6566 case 16384:
6567 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k;
6568 break;
6569 default:
6570 panic("wm_init: MCLBYTES %d unsupported",
6571 MCLBYTES);
6572 break;
6573 }
6574 } else
6575 panic("wm_init: i82542 requires MCLBYTES = 2048");
6576 }
6577
6578 /* Enable ECC */
6579 switch (sc->sc_type) {
6580 case WM_T_82571:
6581 reg = CSR_READ(sc, WMREG_PBA_ECC);
6582 reg |= PBA_ECC_CORR_EN;
6583 CSR_WRITE(sc, WMREG_PBA_ECC, reg);
6584 break;
6585 case WM_T_PCH_LPT:
6586 case WM_T_PCH_SPT:
6587 case WM_T_PCH_CNP:
6588 reg = CSR_READ(sc, WMREG_PBECCSTS);
6589 reg |= PBECCSTS_UNCORR_ECC_ENABLE;
6590 CSR_WRITE(sc, WMREG_PBECCSTS, reg);
6591
6592 sc->sc_ctrl |= CTRL_MEHE;
6593 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
6594 break;
6595 default:
6596 break;
6597 }
6598
6599 /*
6600 * Set the receive filter.
6601 *
6602 * For 82575 and 82576, the RX descriptors must be initialized after
6603 * the setting of RCTL.EN in wm_set_filter()
6604 */
6605 wm_set_filter(sc);
6606
6607 /* On 575 and later set RDT only if RX enabled */
6608 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6609 int qidx;
6610 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6611 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq;
6612 for (i = 0; i < WM_NRXDESC; i++) {
6613 mutex_enter(rxq->rxq_lock);
6614 wm_init_rxdesc(rxq, i);
6615 mutex_exit(rxq->rxq_lock);
6616
6617 }
6618 }
6619 }
6620
6621 wm_unset_stopping_flags(sc);
6622
6623 /* Start the one second link check clock. */
6624 callout_schedule(&sc->sc_tick_ch, hz);
6625
6626 /* ...all done! */
6627 ifp->if_flags |= IFF_RUNNING;
6628
6629 out:
6630 /* Save last flags for the callback */
6631 sc->sc_if_flags = ifp->if_flags;
6632 sc->sc_ec_capenable = ec->ec_capenable;
6633 if (error)
6634 log(LOG_ERR, "%s: interface not running\n",
6635 device_xname(sc->sc_dev));
6636 return error;
6637 }
6638
6639 /*
6640 * wm_stop: [ifnet interface function]
6641 *
6642 * Stop transmission on the interface.
6643 */
6644 static void
6645 wm_stop(struct ifnet *ifp, int disable)
6646 {
6647 struct wm_softc *sc = ifp->if_softc;
6648
6649 ASSERT_SLEEPABLE();
6650
6651 WM_CORE_LOCK(sc);
6652 wm_stop_locked(ifp, disable ? true : false, true);
6653 WM_CORE_UNLOCK(sc);
6654
6655 /*
6656 * After wm_set_stopping_flags(), it is guaranteed
6657 * wm_handle_queue_work() does not call workqueue_enqueue().
6658 * However, workqueue_wait() cannot call in wm_stop_locked()
6659 * because it can sleep...
6660 * so, call workqueue_wait() here.
6661 */
6662 for (int i = 0; i < sc->sc_nqueues; i++)
6663 workqueue_wait(sc->sc_queue_wq, &sc->sc_queue[i].wmq_cookie);
6664 }
6665
6666 static void
6667 wm_stop_locked(struct ifnet *ifp, bool disable, bool wait)
6668 {
6669 struct wm_softc *sc = ifp->if_softc;
6670 struct wm_txsoft *txs;
6671 int i, qidx;
6672
6673 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
6674 device_xname(sc->sc_dev), __func__));
6675 KASSERT(WM_CORE_LOCKED(sc));
6676
6677 wm_set_stopping_flags(sc);
6678
6679 if (sc->sc_flags & WM_F_HAS_MII) {
6680 /* Down the MII. */
6681 mii_down(&sc->sc_mii);
6682 } else {
6683 #if 0
6684 /* Should we clear PHY's status properly? */
6685 wm_reset(sc);
6686 #endif
6687 }
6688
6689 /* Stop the transmit and receive processes. */
6690 CSR_WRITE(sc, WMREG_TCTL, 0);
6691 CSR_WRITE(sc, WMREG_RCTL, 0);
6692 sc->sc_rctl &= ~RCTL_EN;
6693
6694 /*
6695 * Clear the interrupt mask to ensure the device cannot assert its
6696 * interrupt line.
6697 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to
6698 * service any currently pending or shared interrupt.
6699 */
6700 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
6701 sc->sc_icr = 0;
6702 if (wm_is_using_msix(sc)) {
6703 if (sc->sc_type != WM_T_82574) {
6704 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
6705 CSR_WRITE(sc, WMREG_EIAC, 0);
6706 } else
6707 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
6708 }
6709
6710 /*
6711 * Stop callouts after interrupts are disabled; if we have
6712 * to wait for them, we will be releasing the CORE_LOCK
6713 * briefly, which will unblock interrupts on the current CPU.
6714 */
6715
6716 /* Stop the one second clock. */
6717 if (wait)
6718 callout_halt(&sc->sc_tick_ch, sc->sc_core_lock);
6719 else
6720 callout_stop(&sc->sc_tick_ch);
6721
6722 /* Stop the 82547 Tx FIFO stall check timer. */
6723 if (sc->sc_type == WM_T_82547) {
6724 if (wait)
6725 callout_halt(&sc->sc_txfifo_ch, sc->sc_core_lock);
6726 else
6727 callout_stop(&sc->sc_txfifo_ch);
6728 }
6729
6730 /* Release any queued transmit buffers. */
6731 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6732 struct wm_queue *wmq = &sc->sc_queue[qidx];
6733 struct wm_txqueue *txq = &wmq->wmq_txq;
6734 struct mbuf *m;
6735
6736 mutex_enter(txq->txq_lock);
6737 txq->txq_sending = false; /* Ensure watchdog disabled */
6738 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6739 txs = &txq->txq_soft[i];
6740 if (txs->txs_mbuf != NULL) {
6741 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap);
6742 m_freem(txs->txs_mbuf);
6743 txs->txs_mbuf = NULL;
6744 }
6745 }
6746 /* Drain txq_interq */
6747 while ((m = pcq_get(txq->txq_interq)) != NULL)
6748 m_freem(m);
6749 mutex_exit(txq->txq_lock);
6750 }
6751
6752 /* Mark the interface as down and cancel the watchdog timer. */
6753 ifp->if_flags &= ~IFF_RUNNING;
6754
6755 if (disable) {
6756 for (i = 0; i < sc->sc_nqueues; i++) {
6757 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6758 mutex_enter(rxq->rxq_lock);
6759 wm_rxdrain(rxq);
6760 mutex_exit(rxq->rxq_lock);
6761 }
6762 }
6763
6764 #if 0 /* notyet */
6765 if (sc->sc_type >= WM_T_82544)
6766 CSR_WRITE(sc, WMREG_WUC, 0);
6767 #endif
6768 }
6769
6770 static void
6771 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0)
6772 {
6773 struct mbuf *m;
6774 int i;
6775
6776 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev));
6777 for (m = m0, i = 0; m != NULL; m = m->m_next, i++)
6778 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, "
6779 "m_flags = 0x%08x\n", device_xname(sc->sc_dev),
6780 m->m_data, m->m_len, m->m_flags);
6781 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev),
6782 i, i == 1 ? "" : "s");
6783 }
6784
6785 /*
6786 * wm_82547_txfifo_stall:
6787 *
6788 * Callout used to wait for the 82547 Tx FIFO to drain,
6789 * reset the FIFO pointers, and restart packet transmission.
6790 */
6791 static void
6792 wm_82547_txfifo_stall(void *arg)
6793 {
6794 struct wm_softc *sc = arg;
6795 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6796
6797 mutex_enter(txq->txq_lock);
6798
6799 if (txq->txq_stopping)
6800 goto out;
6801
6802 if (txq->txq_fifo_stall) {
6803 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) &&
6804 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) &&
6805 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) {
6806 /*
6807 * Packets have drained. Stop transmitter, reset
6808 * FIFO pointers, restart transmitter, and kick
6809 * the packet queue.
6810 */
6811 uint32_t tctl = CSR_READ(sc, WMREG_TCTL);
6812 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN);
6813 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr);
6814 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr);
6815 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr);
6816 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr);
6817 CSR_WRITE(sc, WMREG_TCTL, tctl);
6818 CSR_WRITE_FLUSH(sc);
6819
6820 txq->txq_fifo_head = 0;
6821 txq->txq_fifo_stall = 0;
6822 wm_start_locked(&sc->sc_ethercom.ec_if);
6823 } else {
6824 /*
6825 * Still waiting for packets to drain; try again in
6826 * another tick.
6827 */
6828 callout_schedule(&sc->sc_txfifo_ch, 1);
6829 }
6830 }
6831
6832 out:
6833 mutex_exit(txq->txq_lock);
6834 }
6835
6836 /*
6837 * wm_82547_txfifo_bugchk:
6838 *
6839 * Check for bug condition in the 82547 Tx FIFO. We need to
6840 * prevent enqueueing a packet that would wrap around the end
6841 * if the Tx FIFO ring buffer, otherwise the chip will croak.
6842 *
6843 * We do this by checking the amount of space before the end
6844 * of the Tx FIFO buffer. If the packet will not fit, we "stall"
6845 * the Tx FIFO, wait for all remaining packets to drain, reset
6846 * the internal FIFO pointers to the beginning, and restart
6847 * transmission on the interface.
6848 */
6849 #define WM_FIFO_HDR 0x10
6850 #define WM_82547_PAD_LEN 0x3e0
6851 static int
6852 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0)
6853 {
6854 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6855 int space = txq->txq_fifo_size - txq->txq_fifo_head;
6856 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR);
6857
6858 /* Just return if already stalled. */
6859 if (txq->txq_fifo_stall)
6860 return 1;
6861
6862 if (sc->sc_mii.mii_media_active & IFM_FDX) {
6863 /* Stall only occurs in half-duplex mode. */
6864 goto send_packet;
6865 }
6866
6867 if (len >= WM_82547_PAD_LEN + space) {
6868 txq->txq_fifo_stall = 1;
6869 callout_schedule(&sc->sc_txfifo_ch, 1);
6870 return 1;
6871 }
6872
6873 send_packet:
6874 txq->txq_fifo_head += len;
6875 if (txq->txq_fifo_head >= txq->txq_fifo_size)
6876 txq->txq_fifo_head -= txq->txq_fifo_size;
6877
6878 return 0;
6879 }
6880
6881 static int
6882 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6883 {
6884 int error;
6885
6886 /*
6887 * Allocate the control data structures, and create and load the
6888 * DMA map for it.
6889 *
6890 * NOTE: All Tx descriptors must be in the same 4G segment of
6891 * memory. So must Rx descriptors. We simplify by allocating
6892 * both sets within the same 4G segment.
6893 */
6894 if (sc->sc_type < WM_T_82544)
6895 WM_NTXDESC(txq) = WM_NTXDESC_82542;
6896 else
6897 WM_NTXDESC(txq) = WM_NTXDESC_82544;
6898 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6899 txq->txq_descsize = sizeof(nq_txdesc_t);
6900 else
6901 txq->txq_descsize = sizeof(wiseman_txdesc_t);
6902
6903 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq),
6904 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg,
6905 1, &txq->txq_desc_rseg, 0)) != 0) {
6906 aprint_error_dev(sc->sc_dev,
6907 "unable to allocate TX control data, error = %d\n",
6908 error);
6909 goto fail_0;
6910 }
6911
6912 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg,
6913 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq),
6914 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) {
6915 aprint_error_dev(sc->sc_dev,
6916 "unable to map TX control data, error = %d\n", error);
6917 goto fail_1;
6918 }
6919
6920 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1,
6921 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) {
6922 aprint_error_dev(sc->sc_dev,
6923 "unable to create TX control data DMA map, error = %d\n",
6924 error);
6925 goto fail_2;
6926 }
6927
6928 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap,
6929 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) {
6930 aprint_error_dev(sc->sc_dev,
6931 "unable to load TX control data DMA map, error = %d\n",
6932 error);
6933 goto fail_3;
6934 }
6935
6936 return 0;
6937
6938 fail_3:
6939 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6940 fail_2:
6941 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6942 WM_TXDESCS_SIZE(txq));
6943 fail_1:
6944 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6945 fail_0:
6946 return error;
6947 }
6948
6949 static void
6950 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6951 {
6952
6953 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap);
6954 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6955 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6956 WM_TXDESCS_SIZE(txq));
6957 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6958 }
6959
6960 static int
6961 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6962 {
6963 int error;
6964 size_t rxq_descs_size;
6965
6966 /*
6967 * Allocate the control data structures, and create and load the
6968 * DMA map for it.
6969 *
6970 * NOTE: All Tx descriptors must be in the same 4G segment of
6971 * memory. So must Rx descriptors. We simplify by allocating
6972 * both sets within the same 4G segment.
6973 */
6974 rxq->rxq_ndesc = WM_NRXDESC;
6975 if (sc->sc_type == WM_T_82574)
6976 rxq->rxq_descsize = sizeof(ext_rxdesc_t);
6977 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6978 rxq->rxq_descsize = sizeof(nq_rxdesc_t);
6979 else
6980 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t);
6981 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc;
6982
6983 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size,
6984 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg,
6985 1, &rxq->rxq_desc_rseg, 0)) != 0) {
6986 aprint_error_dev(sc->sc_dev,
6987 "unable to allocate RX control data, error = %d\n",
6988 error);
6989 goto fail_0;
6990 }
6991
6992 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg,
6993 rxq->rxq_desc_rseg, rxq_descs_size,
6994 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) {
6995 aprint_error_dev(sc->sc_dev,
6996 "unable to map RX control data, error = %d\n", error);
6997 goto fail_1;
6998 }
6999
7000 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1,
7001 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) {
7002 aprint_error_dev(sc->sc_dev,
7003 "unable to create RX control data DMA map, error = %d\n",
7004 error);
7005 goto fail_2;
7006 }
7007
7008 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap,
7009 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) {
7010 aprint_error_dev(sc->sc_dev,
7011 "unable to load RX control data DMA map, error = %d\n",
7012 error);
7013 goto fail_3;
7014 }
7015
7016 return 0;
7017
7018 fail_3:
7019 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
7020 fail_2:
7021 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
7022 rxq_descs_size);
7023 fail_1:
7024 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
7025 fail_0:
7026 return error;
7027 }
7028
7029 static void
7030 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
7031 {
7032
7033 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap);
7034 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
7035 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
7036 rxq->rxq_descsize * rxq->rxq_ndesc);
7037 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
7038 }
7039
7040
7041 static int
7042 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
7043 {
7044 int i, error;
7045
7046 /* Create the transmit buffer DMA maps. */
7047 WM_TXQUEUELEN(txq) =
7048 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ?
7049 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX;
7050 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
7051 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA,
7052 WM_NTXSEGS, WTX_MAX_LEN, 0, 0,
7053 &txq->txq_soft[i].txs_dmamap)) != 0) {
7054 aprint_error_dev(sc->sc_dev,
7055 "unable to create Tx DMA map %d, error = %d\n",
7056 i, error);
7057 goto fail;
7058 }
7059 }
7060
7061 return 0;
7062
7063 fail:
7064 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
7065 if (txq->txq_soft[i].txs_dmamap != NULL)
7066 bus_dmamap_destroy(sc->sc_dmat,
7067 txq->txq_soft[i].txs_dmamap);
7068 }
7069 return error;
7070 }
7071
7072 static void
7073 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
7074 {
7075 int i;
7076
7077 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
7078 if (txq->txq_soft[i].txs_dmamap != NULL)
7079 bus_dmamap_destroy(sc->sc_dmat,
7080 txq->txq_soft[i].txs_dmamap);
7081 }
7082 }
7083
7084 static int
7085 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
7086 {
7087 int i, error;
7088
7089 /* Create the receive buffer DMA maps. */
7090 for (i = 0; i < rxq->rxq_ndesc; i++) {
7091 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
7092 MCLBYTES, 0, 0,
7093 &rxq->rxq_soft[i].rxs_dmamap)) != 0) {
7094 aprint_error_dev(sc->sc_dev,
7095 "unable to create Rx DMA map %d error = %d\n",
7096 i, error);
7097 goto fail;
7098 }
7099 rxq->rxq_soft[i].rxs_mbuf = NULL;
7100 }
7101
7102 return 0;
7103
7104 fail:
7105 for (i = 0; i < rxq->rxq_ndesc; i++) {
7106 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
7107 bus_dmamap_destroy(sc->sc_dmat,
7108 rxq->rxq_soft[i].rxs_dmamap);
7109 }
7110 return error;
7111 }
7112
7113 static void
7114 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
7115 {
7116 int i;
7117
7118 for (i = 0; i < rxq->rxq_ndesc; i++) {
7119 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
7120 bus_dmamap_destroy(sc->sc_dmat,
7121 rxq->rxq_soft[i].rxs_dmamap);
7122 }
7123 }
7124
7125 /*
7126 * wm_alloc_quques:
7127 * Allocate {tx,rx}descs and {tx,rx} buffers
7128 */
7129 static int
7130 wm_alloc_txrx_queues(struct wm_softc *sc)
7131 {
7132 int i, error, tx_done, rx_done;
7133
7134 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues,
7135 KM_SLEEP);
7136 if (sc->sc_queue == NULL) {
7137 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n");
7138 error = ENOMEM;
7139 goto fail_0;
7140 }
7141
7142 /* For transmission */
7143 error = 0;
7144 tx_done = 0;
7145 for (i = 0; i < sc->sc_nqueues; i++) {
7146 #ifdef WM_EVENT_COUNTERS
7147 int j;
7148 const char *xname;
7149 #endif
7150 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
7151 txq->txq_sc = sc;
7152 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
7153
7154 error = wm_alloc_tx_descs(sc, txq);
7155 if (error)
7156 break;
7157 error = wm_alloc_tx_buffer(sc, txq);
7158 if (error) {
7159 wm_free_tx_descs(sc, txq);
7160 break;
7161 }
7162 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP);
7163 if (txq->txq_interq == NULL) {
7164 wm_free_tx_descs(sc, txq);
7165 wm_free_tx_buffer(sc, txq);
7166 error = ENOMEM;
7167 break;
7168 }
7169
7170 #ifdef WM_EVENT_COUNTERS
7171 xname = device_xname(sc->sc_dev);
7172
7173 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname);
7174 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname);
7175 WM_Q_MISC_EVCNT_ATTACH(txq, fifo_stall, txq, i, xname);
7176 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname);
7177 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname);
7178 WM_Q_MISC_EVCNT_ATTACH(txq, ipsum, txq, i, xname);
7179 WM_Q_MISC_EVCNT_ATTACH(txq, tusum, txq, i, xname);
7180 WM_Q_MISC_EVCNT_ATTACH(txq, tusum6, txq, i, xname);
7181 WM_Q_MISC_EVCNT_ATTACH(txq, tso, txq, i, xname);
7182 WM_Q_MISC_EVCNT_ATTACH(txq, tso6, txq, i, xname);
7183 WM_Q_MISC_EVCNT_ATTACH(txq, tsopain, txq, i, xname);
7184
7185 for (j = 0; j < WM_NTXSEGS; j++) {
7186 snprintf(txq->txq_txseg_evcnt_names[j],
7187 sizeof(txq->txq_txseg_evcnt_names[j]), "txq%02dtxseg%d", i, j);
7188 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], EVCNT_TYPE_MISC,
7189 NULL, xname, txq->txq_txseg_evcnt_names[j]);
7190 }
7191
7192 WM_Q_MISC_EVCNT_ATTACH(txq, pcqdrop, txq, i, xname);
7193 WM_Q_MISC_EVCNT_ATTACH(txq, descdrop, txq, i, xname);
7194 WM_Q_MISC_EVCNT_ATTACH(txq, toomanyseg, txq, i, xname);
7195 WM_Q_MISC_EVCNT_ATTACH(txq, defrag, txq, i, xname);
7196 WM_Q_MISC_EVCNT_ATTACH(txq, underrun, txq, i, xname);
7197 WM_Q_MISC_EVCNT_ATTACH(txq, skipcontext, txq, i, xname);
7198 #endif /* WM_EVENT_COUNTERS */
7199
7200 tx_done++;
7201 }
7202 if (error)
7203 goto fail_1;
7204
7205 /* For receive */
7206 error = 0;
7207 rx_done = 0;
7208 for (i = 0; i < sc->sc_nqueues; i++) {
7209 #ifdef WM_EVENT_COUNTERS
7210 const char *xname;
7211 #endif
7212 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
7213 rxq->rxq_sc = sc;
7214 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
7215
7216 error = wm_alloc_rx_descs(sc, rxq);
7217 if (error)
7218 break;
7219
7220 error = wm_alloc_rx_buffer(sc, rxq);
7221 if (error) {
7222 wm_free_rx_descs(sc, rxq);
7223 break;
7224 }
7225
7226 #ifdef WM_EVENT_COUNTERS
7227 xname = device_xname(sc->sc_dev);
7228
7229 WM_Q_INTR_EVCNT_ATTACH(rxq, intr, rxq, i, xname);
7230 WM_Q_INTR_EVCNT_ATTACH(rxq, defer, rxq, i, xname);
7231
7232 WM_Q_MISC_EVCNT_ATTACH(rxq, ipsum, rxq, i, xname);
7233 WM_Q_MISC_EVCNT_ATTACH(rxq, tusum, rxq, i, xname);
7234 #endif /* WM_EVENT_COUNTERS */
7235
7236 rx_done++;
7237 }
7238 if (error)
7239 goto fail_2;
7240
7241 return 0;
7242
7243 fail_2:
7244 for (i = 0; i < rx_done; i++) {
7245 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
7246 wm_free_rx_buffer(sc, rxq);
7247 wm_free_rx_descs(sc, rxq);
7248 if (rxq->rxq_lock)
7249 mutex_obj_free(rxq->rxq_lock);
7250 }
7251 fail_1:
7252 for (i = 0; i < tx_done; i++) {
7253 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
7254 pcq_destroy(txq->txq_interq);
7255 wm_free_tx_buffer(sc, txq);
7256 wm_free_tx_descs(sc, txq);
7257 if (txq->txq_lock)
7258 mutex_obj_free(txq->txq_lock);
7259 }
7260
7261 kmem_free(sc->sc_queue,
7262 sizeof(struct wm_queue) * sc->sc_nqueues);
7263 fail_0:
7264 return error;
7265 }
7266
7267 /*
7268 * wm_free_quques:
7269 * Free {tx,rx}descs and {tx,rx} buffers
7270 */
7271 static void
7272 wm_free_txrx_queues(struct wm_softc *sc)
7273 {
7274 int i;
7275
7276 for (i = 0; i < sc->sc_nqueues; i++) {
7277 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
7278
7279 #ifdef WM_EVENT_COUNTERS
7280 WM_Q_EVCNT_DETACH(rxq, intr, rxq, i);
7281 WM_Q_EVCNT_DETACH(rxq, defer, rxq, i);
7282 WM_Q_EVCNT_DETACH(rxq, ipsum, rxq, i);
7283 WM_Q_EVCNT_DETACH(rxq, tusum, rxq, i);
7284 #endif /* WM_EVENT_COUNTERS */
7285
7286 wm_free_rx_buffer(sc, rxq);
7287 wm_free_rx_descs(sc, rxq);
7288 if (rxq->rxq_lock)
7289 mutex_obj_free(rxq->rxq_lock);
7290 }
7291
7292 for (i = 0; i < sc->sc_nqueues; i++) {
7293 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
7294 struct mbuf *m;
7295 #ifdef WM_EVENT_COUNTERS
7296 int j;
7297
7298 WM_Q_EVCNT_DETACH(txq, txsstall, txq, i);
7299 WM_Q_EVCNT_DETACH(txq, txdstall, txq, i);
7300 WM_Q_EVCNT_DETACH(txq, fifo_stall, txq, i);
7301 WM_Q_EVCNT_DETACH(txq, txdw, txq, i);
7302 WM_Q_EVCNT_DETACH(txq, txqe, txq, i);
7303 WM_Q_EVCNT_DETACH(txq, ipsum, txq, i);
7304 WM_Q_EVCNT_DETACH(txq, tusum, txq, i);
7305 WM_Q_EVCNT_DETACH(txq, tusum6, txq, i);
7306 WM_Q_EVCNT_DETACH(txq, tso, txq, i);
7307 WM_Q_EVCNT_DETACH(txq, tso6, txq, i);
7308 WM_Q_EVCNT_DETACH(txq, tsopain, txq, i);
7309
7310 for (j = 0; j < WM_NTXSEGS; j++)
7311 evcnt_detach(&txq->txq_ev_txseg[j]);
7312
7313 WM_Q_EVCNT_DETACH(txq, pcqdrop, txq, i);
7314 WM_Q_EVCNT_DETACH(txq, descdrop, txq, i);
7315 WM_Q_EVCNT_DETACH(txq, toomanyseg, txq, i);
7316 WM_Q_EVCNT_DETACH(txq, defrag, txq, i);
7317 WM_Q_EVCNT_DETACH(txq, underrun, txq, i);
7318 WM_Q_EVCNT_DETACH(txq, skipcontext, txq, i);
7319 #endif /* WM_EVENT_COUNTERS */
7320
7321 /* Drain txq_interq */
7322 while ((m = pcq_get(txq->txq_interq)) != NULL)
7323 m_freem(m);
7324 pcq_destroy(txq->txq_interq);
7325
7326 wm_free_tx_buffer(sc, txq);
7327 wm_free_tx_descs(sc, txq);
7328 if (txq->txq_lock)
7329 mutex_obj_free(txq->txq_lock);
7330 }
7331
7332 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues);
7333 }
7334
7335 static void
7336 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq)
7337 {
7338
7339 KASSERT(mutex_owned(txq->txq_lock));
7340
7341 /* Initialize the transmit descriptor ring. */
7342 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq));
7343 wm_cdtxsync(txq, 0, WM_NTXDESC(txq),
7344 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7345 txq->txq_free = WM_NTXDESC(txq);
7346 txq->txq_next = 0;
7347 }
7348
7349 static void
7350 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq,
7351 struct wm_txqueue *txq)
7352 {
7353
7354 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
7355 device_xname(sc->sc_dev), __func__));
7356 KASSERT(mutex_owned(txq->txq_lock));
7357
7358 if (sc->sc_type < WM_T_82543) {
7359 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0));
7360 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0));
7361 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq));
7362 CSR_WRITE(sc, WMREG_OLD_TDH, 0);
7363 CSR_WRITE(sc, WMREG_OLD_TDT, 0);
7364 CSR_WRITE(sc, WMREG_OLD_TIDV, 128);
7365 } else {
7366 int qid = wmq->wmq_id;
7367
7368 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0));
7369 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0));
7370 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq));
7371 CSR_WRITE(sc, WMREG_TDH(qid), 0);
7372
7373 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7374 /*
7375 * Don't write TDT before TCTL.EN is set.
7376 * See the document.
7377 */
7378 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE
7379 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0)
7380 | TXDCTL_WTHRESH(0));
7381 else {
7382 /* XXX should update with AIM? */
7383 CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4);
7384 if (sc->sc_type >= WM_T_82540) {
7385 /* Should be the same */
7386 CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4);
7387 }
7388
7389 CSR_WRITE(sc, WMREG_TDT(qid), 0);
7390 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) |
7391 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
7392 }
7393 }
7394 }
7395
7396 static void
7397 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq)
7398 {
7399 int i;
7400
7401 KASSERT(mutex_owned(txq->txq_lock));
7402
7403 /* Initialize the transmit job descriptors. */
7404 for (i = 0; i < WM_TXQUEUELEN(txq); i++)
7405 txq->txq_soft[i].txs_mbuf = NULL;
7406 txq->txq_sfree = WM_TXQUEUELEN(txq);
7407 txq->txq_snext = 0;
7408 txq->txq_sdirty = 0;
7409 }
7410
7411 static void
7412 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq,
7413 struct wm_txqueue *txq)
7414 {
7415
7416 KASSERT(mutex_owned(txq->txq_lock));
7417
7418 /*
7419 * Set up some register offsets that are different between
7420 * the i82542 and the i82543 and later chips.
7421 */
7422 if (sc->sc_type < WM_T_82543)
7423 txq->txq_tdt_reg = WMREG_OLD_TDT;
7424 else
7425 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id);
7426
7427 wm_init_tx_descs(sc, txq);
7428 wm_init_tx_regs(sc, wmq, txq);
7429 wm_init_tx_buffer(sc, txq);
7430
7431 txq->txq_flags = 0; /* Clear WM_TXQ_NO_SPACE */
7432 txq->txq_sending = false;
7433 }
7434
7435 static void
7436 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq,
7437 struct wm_rxqueue *rxq)
7438 {
7439
7440 KASSERT(mutex_owned(rxq->rxq_lock));
7441
7442 /*
7443 * Initialize the receive descriptor and receive job
7444 * descriptor rings.
7445 */
7446 if (sc->sc_type < WM_T_82543) {
7447 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0));
7448 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0));
7449 CSR_WRITE(sc, WMREG_OLD_RDLEN0,
7450 rxq->rxq_descsize * rxq->rxq_ndesc);
7451 CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
7452 CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
7453 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD);
7454
7455 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
7456 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
7457 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
7458 CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
7459 CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
7460 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
7461 } else {
7462 int qid = wmq->wmq_id;
7463
7464 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0));
7465 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0));
7466 CSR_WRITE(sc, WMREG_RDLEN(qid),
7467 rxq->rxq_descsize * rxq->rxq_ndesc);
7468
7469 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
7470 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
7471 panic("%s: MCLBYTES %d unsupported for 82575 or higher\n", __func__, MCLBYTES);
7472
7473 /* Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF only. */
7474 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_ADV_ONEBUF
7475 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
7476 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE
7477 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8)
7478 | RXDCTL_WTHRESH(1));
7479 CSR_WRITE(sc, WMREG_RDH(qid), 0);
7480 CSR_WRITE(sc, WMREG_RDT(qid), 0);
7481 } else {
7482 CSR_WRITE(sc, WMREG_RDH(qid), 0);
7483 CSR_WRITE(sc, WMREG_RDT(qid), 0);
7484 /* XXX should update with AIM? */
7485 CSR_WRITE(sc, WMREG_RDTR,
7486 (wmq->wmq_itr / 4) | RDTR_FPD);
7487 /* MUST be same */
7488 CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4);
7489 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) |
7490 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
7491 }
7492 }
7493 }
7494
7495 static int
7496 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
7497 {
7498 struct wm_rxsoft *rxs;
7499 int error, i;
7500
7501 KASSERT(mutex_owned(rxq->rxq_lock));
7502
7503 for (i = 0; i < rxq->rxq_ndesc; i++) {
7504 rxs = &rxq->rxq_soft[i];
7505 if (rxs->rxs_mbuf == NULL) {
7506 if ((error = wm_add_rxbuf(rxq, i)) != 0) {
7507 log(LOG_ERR, "%s: unable to allocate or map "
7508 "rx buffer %d, error = %d\n",
7509 device_xname(sc->sc_dev), i, error);
7510 /*
7511 * XXX Should attempt to run with fewer receive
7512 * XXX buffers instead of just failing.
7513 */
7514 wm_rxdrain(rxq);
7515 return ENOMEM;
7516 }
7517 } else {
7518 /*
7519 * For 82575 and 82576, the RX descriptors must be
7520 * initialized after the setting of RCTL.EN in
7521 * wm_set_filter()
7522 */
7523 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0)
7524 wm_init_rxdesc(rxq, i);
7525 }
7526 }
7527 rxq->rxq_ptr = 0;
7528 rxq->rxq_discard = 0;
7529 WM_RXCHAIN_RESET(rxq);
7530
7531 return 0;
7532 }
7533
7534 static int
7535 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq,
7536 struct wm_rxqueue *rxq)
7537 {
7538
7539 KASSERT(mutex_owned(rxq->rxq_lock));
7540
7541 /*
7542 * Set up some register offsets that are different between
7543 * the i82542 and the i82543 and later chips.
7544 */
7545 if (sc->sc_type < WM_T_82543)
7546 rxq->rxq_rdt_reg = WMREG_OLD_RDT0;
7547 else
7548 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id);
7549
7550 wm_init_rx_regs(sc, wmq, rxq);
7551 return wm_init_rx_buffer(sc, rxq);
7552 }
7553
7554 /*
7555 * wm_init_quques:
7556 * Initialize {tx,rx}descs and {tx,rx} buffers
7557 */
7558 static int
7559 wm_init_txrx_queues(struct wm_softc *sc)
7560 {
7561 int i, error = 0;
7562
7563 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
7564 device_xname(sc->sc_dev), __func__));
7565
7566 for (i = 0; i < sc->sc_nqueues; i++) {
7567 struct wm_queue *wmq = &sc->sc_queue[i];
7568 struct wm_txqueue *txq = &wmq->wmq_txq;
7569 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
7570
7571 /*
7572 * TODO
7573 * Currently, use constant variable instead of AIM.
7574 * Furthermore, the interrupt interval of multiqueue which use
7575 * polling mode is less than default value.
7576 * More tuning and AIM are required.
7577 */
7578 if (wm_is_using_multiqueue(sc))
7579 wmq->wmq_itr = 50;
7580 else
7581 wmq->wmq_itr = sc->sc_itr_init;
7582 wmq->wmq_set_itr = true;
7583
7584 mutex_enter(txq->txq_lock);
7585 wm_init_tx_queue(sc, wmq, txq);
7586 mutex_exit(txq->txq_lock);
7587
7588 mutex_enter(rxq->rxq_lock);
7589 error = wm_init_rx_queue(sc, wmq, rxq);
7590 mutex_exit(rxq->rxq_lock);
7591 if (error)
7592 break;
7593 }
7594
7595 return error;
7596 }
7597
7598 /*
7599 * wm_tx_offload:
7600 *
7601 * Set up TCP/IP checksumming parameters for the
7602 * specified packet.
7603 */
7604 static void
7605 wm_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
7606 struct wm_txsoft *txs, uint32_t *cmdp, uint8_t *fieldsp)
7607 {
7608 struct mbuf *m0 = txs->txs_mbuf;
7609 struct livengood_tcpip_ctxdesc *t;
7610 uint32_t ipcs, tucs, cmd, cmdlen, seg;
7611 uint32_t ipcse;
7612 struct ether_header *eh;
7613 int offset, iphl;
7614 uint8_t fields;
7615
7616 /*
7617 * XXX It would be nice if the mbuf pkthdr had offset
7618 * fields for the protocol headers.
7619 */
7620
7621 eh = mtod(m0, struct ether_header *);
7622 switch (htons(eh->ether_type)) {
7623 case ETHERTYPE_IP:
7624 case ETHERTYPE_IPV6:
7625 offset = ETHER_HDR_LEN;
7626 break;
7627
7628 case ETHERTYPE_VLAN:
7629 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
7630 break;
7631
7632 default:
7633 /* Don't support this protocol or encapsulation. */
7634 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0;
7635 txq->txq_last_hw_ipcs = 0;
7636 txq->txq_last_hw_tucs = 0;
7637 *fieldsp = 0;
7638 *cmdp = 0;
7639 return;
7640 }
7641
7642 if ((m0->m_pkthdr.csum_flags &
7643 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
7644 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
7645 } else
7646 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data);
7647
7648 ipcse = offset + iphl - 1;
7649
7650 cmd = WTX_CMD_DEXT | WTX_DTYP_D;
7651 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE;
7652 seg = 0;
7653 fields = 0;
7654
7655 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
7656 int hlen = offset + iphl;
7657 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
7658
7659 if (__predict_false(m0->m_len <
7660 (hlen + sizeof(struct tcphdr)))) {
7661 /*
7662 * TCP/IP headers are not in the first mbuf; we need
7663 * to do this the slow and painful way. Let's just
7664 * hope this doesn't happen very often.
7665 */
7666 struct tcphdr th;
7667
7668 WM_Q_EVCNT_INCR(txq, tsopain);
7669
7670 m_copydata(m0, hlen, sizeof(th), &th);
7671 if (v4) {
7672 struct ip ip;
7673
7674 m_copydata(m0, offset, sizeof(ip), &ip);
7675 ip.ip_len = 0;
7676 m_copyback(m0,
7677 offset + offsetof(struct ip, ip_len),
7678 sizeof(ip.ip_len), &ip.ip_len);
7679 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
7680 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
7681 } else {
7682 struct ip6_hdr ip6;
7683
7684 m_copydata(m0, offset, sizeof(ip6), &ip6);
7685 ip6.ip6_plen = 0;
7686 m_copyback(m0,
7687 offset + offsetof(struct ip6_hdr, ip6_plen),
7688 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
7689 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
7690 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
7691 }
7692 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
7693 sizeof(th.th_sum), &th.th_sum);
7694
7695 hlen += th.th_off << 2;
7696 } else {
7697 /*
7698 * TCP/IP headers are in the first mbuf; we can do
7699 * this the easy way.
7700 */
7701 struct tcphdr *th;
7702
7703 if (v4) {
7704 struct ip *ip =
7705 (void *)(mtod(m0, char *) + offset);
7706 th = (void *)(mtod(m0, char *) + hlen);
7707
7708 ip->ip_len = 0;
7709 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
7710 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
7711 } else {
7712 struct ip6_hdr *ip6 =
7713 (void *)(mtod(m0, char *) + offset);
7714 th = (void *)(mtod(m0, char *) + hlen);
7715
7716 ip6->ip6_plen = 0;
7717 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
7718 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
7719 }
7720 hlen += th->th_off << 2;
7721 }
7722
7723 if (v4) {
7724 WM_Q_EVCNT_INCR(txq, tso);
7725 cmdlen |= WTX_TCPIP_CMD_IP;
7726 } else {
7727 WM_Q_EVCNT_INCR(txq, tso6);
7728 ipcse = 0;
7729 }
7730 cmd |= WTX_TCPIP_CMD_TSE;
7731 cmdlen |= WTX_TCPIP_CMD_TSE |
7732 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen);
7733 seg = WTX_TCPIP_SEG_HDRLEN(hlen) |
7734 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz);
7735 }
7736
7737 /*
7738 * NOTE: Even if we're not using the IP or TCP/UDP checksum
7739 * offload feature, if we load the context descriptor, we
7740 * MUST provide valid values for IPCSS and TUCSS fields.
7741 */
7742
7743 ipcs = WTX_TCPIP_IPCSS(offset) |
7744 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
7745 WTX_TCPIP_IPCSE(ipcse);
7746 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) {
7747 WM_Q_EVCNT_INCR(txq, ipsum);
7748 fields |= WTX_IXSM;
7749 }
7750
7751 offset += iphl;
7752
7753 if (m0->m_pkthdr.csum_flags &
7754 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) {
7755 WM_Q_EVCNT_INCR(txq, tusum);
7756 fields |= WTX_TXSM;
7757 tucs = WTX_TCPIP_TUCSS(offset) |
7758 WTX_TCPIP_TUCSO(offset +
7759 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) |
7760 WTX_TCPIP_TUCSE(0) /* Rest of packet */;
7761 } else if ((m0->m_pkthdr.csum_flags &
7762 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) {
7763 WM_Q_EVCNT_INCR(txq, tusum6);
7764 fields |= WTX_TXSM;
7765 tucs = WTX_TCPIP_TUCSS(offset) |
7766 WTX_TCPIP_TUCSO(offset +
7767 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) |
7768 WTX_TCPIP_TUCSE(0) /* Rest of packet */;
7769 } else {
7770 /* Just initialize it to a valid TCP context. */
7771 tucs = WTX_TCPIP_TUCSS(offset) |
7772 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
7773 WTX_TCPIP_TUCSE(0) /* Rest of packet */;
7774 }
7775
7776 *cmdp = cmd;
7777 *fieldsp = fields;
7778
7779 /*
7780 * We don't have to write context descriptor for every packet
7781 * except for 82574. For 82574, we must write context descriptor
7782 * for every packet when we use two descriptor queues.
7783 *
7784 * The 82574L can only remember the *last* context used
7785 * regardless of queue that it was use for. We cannot reuse
7786 * contexts on this hardware platform and must generate a new
7787 * context every time. 82574L hardware spec, section 7.2.6,
7788 * second note.
7789 */
7790 if (sc->sc_nqueues < 2) {
7791 /*
7792 * Setting up new checksum offload context for every
7793 * frames takes a lot of processing time for hardware.
7794 * This also reduces performance a lot for small sized
7795 * frames so avoid it if driver can use previously
7796 * configured checksum offload context.
7797 * For TSO, in theory we can use the same TSO context only if
7798 * frame is the same type(IP/TCP) and the same MSS. However
7799 * checking whether a frame has the same IP/TCP structure is
7800 * hard thing so just ignore that and always restablish a
7801 * new TSO context.
7802 */
7803 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6))
7804 == 0) {
7805 if (txq->txq_last_hw_cmd == cmd &&
7806 txq->txq_last_hw_fields == fields &&
7807 txq->txq_last_hw_ipcs == (ipcs & 0xffff) &&
7808 txq->txq_last_hw_tucs == (tucs & 0xffff)) {
7809 WM_Q_EVCNT_INCR(txq, skipcontext);
7810 return;
7811 }
7812 }
7813
7814 txq->txq_last_hw_cmd = cmd;
7815 txq->txq_last_hw_fields = fields;
7816 txq->txq_last_hw_ipcs = (ipcs & 0xffff);
7817 txq->txq_last_hw_tucs = (tucs & 0xffff);
7818 }
7819
7820 /* Fill in the context descriptor. */
7821 t = (struct livengood_tcpip_ctxdesc *)
7822 &txq->txq_descs[txq->txq_next];
7823 t->tcpip_ipcs = htole32(ipcs);
7824 t->tcpip_tucs = htole32(tucs);
7825 t->tcpip_cmdlen = htole32(cmdlen);
7826 t->tcpip_seg = htole32(seg);
7827 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
7828
7829 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
7830 txs->txs_ndesc++;
7831 }
7832
7833 static inline int
7834 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m)
7835 {
7836 struct wm_softc *sc = ifp->if_softc;
7837 u_int cpuid = cpu_index(curcpu());
7838
7839 /*
7840 * Currently, simple distribute strategy.
7841 * TODO:
7842 * distribute by flowid(RSS has value).
7843 */
7844 return ((cpuid + ncpu - sc->sc_affinity_offset) % ncpu) % sc->sc_nqueues;
7845 }
7846
7847 static inline bool
7848 wm_linkdown_discard(struct wm_txqueue *txq)
7849 {
7850
7851 if ((txq->txq_flags & WM_TXQ_LINKDOWN_DISCARD) != 0)
7852 return true;
7853
7854 return false;
7855 }
7856
7857 /*
7858 * wm_start: [ifnet interface function]
7859 *
7860 * Start packet transmission on the interface.
7861 */
7862 static void
7863 wm_start(struct ifnet *ifp)
7864 {
7865 struct wm_softc *sc = ifp->if_softc;
7866 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7867
7868 #ifdef WM_MPSAFE
7869 KASSERT(if_is_mpsafe(ifp));
7870 #endif
7871 /*
7872 * if_obytes and if_omcasts are added in if_transmit()@if.c.
7873 */
7874
7875 mutex_enter(txq->txq_lock);
7876 if (!txq->txq_stopping)
7877 wm_start_locked(ifp);
7878 mutex_exit(txq->txq_lock);
7879 }
7880
7881 static void
7882 wm_start_locked(struct ifnet *ifp)
7883 {
7884 struct wm_softc *sc = ifp->if_softc;
7885 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7886
7887 wm_send_common_locked(ifp, txq, false);
7888 }
7889
7890 static int
7891 wm_transmit(struct ifnet *ifp, struct mbuf *m)
7892 {
7893 int qid;
7894 struct wm_softc *sc = ifp->if_softc;
7895 struct wm_txqueue *txq;
7896
7897 qid = wm_select_txqueue(ifp, m);
7898 txq = &sc->sc_queue[qid].wmq_txq;
7899
7900 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7901 m_freem(m);
7902 WM_Q_EVCNT_INCR(txq, pcqdrop);
7903 return ENOBUFS;
7904 }
7905
7906 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
7907 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len);
7908 if (m->m_flags & M_MCAST)
7909 if_statinc_ref(nsr, if_omcasts);
7910 IF_STAT_PUTREF(ifp);
7911
7912 if (mutex_tryenter(txq->txq_lock)) {
7913 if (!txq->txq_stopping)
7914 wm_transmit_locked(ifp, txq);
7915 mutex_exit(txq->txq_lock);
7916 }
7917
7918 return 0;
7919 }
7920
7921 static void
7922 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7923 {
7924
7925 wm_send_common_locked(ifp, txq, true);
7926 }
7927
7928 static void
7929 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7930 bool is_transmit)
7931 {
7932 struct wm_softc *sc = ifp->if_softc;
7933 struct mbuf *m0;
7934 struct wm_txsoft *txs;
7935 bus_dmamap_t dmamap;
7936 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso;
7937 bus_addr_t curaddr;
7938 bus_size_t seglen, curlen;
7939 uint32_t cksumcmd;
7940 uint8_t cksumfields;
7941 bool remap = true;
7942
7943 KASSERT(mutex_owned(txq->txq_lock));
7944
7945 if ((ifp->if_flags & IFF_RUNNING) == 0)
7946 return;
7947 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7948 return;
7949
7950 if (__predict_false(wm_linkdown_discard(txq))) {
7951 do {
7952 if (is_transmit)
7953 m0 = pcq_get(txq->txq_interq);
7954 else
7955 IFQ_DEQUEUE(&ifp->if_snd, m0);
7956 /*
7957 * increment successed packet counter as in the case
7958 * which the packet is discarded by link down PHY.
7959 */
7960 if (m0 != NULL)
7961 if_statinc(ifp, if_opackets);
7962 m_freem(m0);
7963 } while (m0 != NULL);
7964 return;
7965 }
7966
7967 /* Remember the previous number of free descriptors. */
7968 ofree = txq->txq_free;
7969
7970 /*
7971 * Loop through the send queue, setting up transmit descriptors
7972 * until we drain the queue, or use up all available transmit
7973 * descriptors.
7974 */
7975 for (;;) {
7976 m0 = NULL;
7977
7978 /* Get a work queue entry. */
7979 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7980 wm_txeof(txq, UINT_MAX);
7981 if (txq->txq_sfree == 0) {
7982 DPRINTF(sc, WM_DEBUG_TX,
7983 ("%s: TX: no free job descriptors\n",
7984 device_xname(sc->sc_dev)));
7985 WM_Q_EVCNT_INCR(txq, txsstall);
7986 break;
7987 }
7988 }
7989
7990 /* Grab a packet off the queue. */
7991 if (is_transmit)
7992 m0 = pcq_get(txq->txq_interq);
7993 else
7994 IFQ_DEQUEUE(&ifp->if_snd, m0);
7995 if (m0 == NULL)
7996 break;
7997
7998 DPRINTF(sc, WM_DEBUG_TX,
7999 ("%s: TX: have packet to transmit: %p\n",
8000 device_xname(sc->sc_dev), m0));
8001
8002 txs = &txq->txq_soft[txq->txq_snext];
8003 dmamap = txs->txs_dmamap;
8004
8005 use_tso = (m0->m_pkthdr.csum_flags &
8006 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0;
8007
8008 /*
8009 * So says the Linux driver:
8010 * The controller does a simple calculation to make sure
8011 * there is enough room in the FIFO before initiating the
8012 * DMA for each buffer. The calc is:
8013 * 4 = ceil(buffer len / MSS)
8014 * To make sure we don't overrun the FIFO, adjust the max
8015 * buffer len if the MSS drops.
8016 */
8017 dmamap->dm_maxsegsz =
8018 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN)
8019 ? m0->m_pkthdr.segsz << 2
8020 : WTX_MAX_LEN;
8021
8022 /*
8023 * Load the DMA map. If this fails, the packet either
8024 * didn't fit in the allotted number of segments, or we
8025 * were short on resources. For the too-many-segments
8026 * case, we simply report an error and drop the packet,
8027 * since we can't sanely copy a jumbo packet to a single
8028 * buffer.
8029 */
8030 retry:
8031 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
8032 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
8033 if (__predict_false(error)) {
8034 if (error == EFBIG) {
8035 if (remap == true) {
8036 struct mbuf *m;
8037
8038 remap = false;
8039 m = m_defrag(m0, M_NOWAIT);
8040 if (m != NULL) {
8041 WM_Q_EVCNT_INCR(txq, defrag);
8042 m0 = m;
8043 goto retry;
8044 }
8045 }
8046 WM_Q_EVCNT_INCR(txq, toomanyseg);
8047 log(LOG_ERR, "%s: Tx packet consumes too many "
8048 "DMA segments, dropping...\n",
8049 device_xname(sc->sc_dev));
8050 wm_dump_mbuf_chain(sc, m0);
8051 m_freem(m0);
8052 continue;
8053 }
8054 /* Short on resources, just stop for now. */
8055 DPRINTF(sc, WM_DEBUG_TX,
8056 ("%s: TX: dmamap load failed: %d\n",
8057 device_xname(sc->sc_dev), error));
8058 break;
8059 }
8060
8061 segs_needed = dmamap->dm_nsegs;
8062 if (use_tso) {
8063 /* For sentinel descriptor; see below. */
8064 segs_needed++;
8065 }
8066
8067 /*
8068 * Ensure we have enough descriptors free to describe
8069 * the packet. Note, we always reserve one descriptor
8070 * at the end of the ring due to the semantics of the
8071 * TDT register, plus one more in the event we need
8072 * to load offload context.
8073 */
8074 if (segs_needed > txq->txq_free - 2) {
8075 /*
8076 * Not enough free descriptors to transmit this
8077 * packet. We haven't committed anything yet,
8078 * so just unload the DMA map, put the packet
8079 * pack on the queue, and punt. Notify the upper
8080 * layer that there are no more slots left.
8081 */
8082 DPRINTF(sc, WM_DEBUG_TX,
8083 ("%s: TX: need %d (%d) descriptors, have %d\n",
8084 device_xname(sc->sc_dev), dmamap->dm_nsegs,
8085 segs_needed, txq->txq_free - 1));
8086 txq->txq_flags |= WM_TXQ_NO_SPACE;
8087 bus_dmamap_unload(sc->sc_dmat, dmamap);
8088 WM_Q_EVCNT_INCR(txq, txdstall);
8089 break;
8090 }
8091
8092 /*
8093 * Check for 82547 Tx FIFO bug. We need to do this
8094 * once we know we can transmit the packet, since we
8095 * do some internal FIFO space accounting here.
8096 */
8097 if (sc->sc_type == WM_T_82547 &&
8098 wm_82547_txfifo_bugchk(sc, m0)) {
8099 DPRINTF(sc, WM_DEBUG_TX,
8100 ("%s: TX: 82547 Tx FIFO bug detected\n",
8101 device_xname(sc->sc_dev)));
8102 txq->txq_flags |= WM_TXQ_NO_SPACE;
8103 bus_dmamap_unload(sc->sc_dmat, dmamap);
8104 WM_Q_EVCNT_INCR(txq, fifo_stall);
8105 break;
8106 }
8107
8108 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
8109
8110 DPRINTF(sc, WM_DEBUG_TX,
8111 ("%s: TX: packet has %d (%d) DMA segments\n",
8112 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
8113
8114 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
8115
8116 /*
8117 * Store a pointer to the packet so that we can free it
8118 * later.
8119 *
8120 * Initially, we consider the number of descriptors the
8121 * packet uses the number of DMA segments. This may be
8122 * incremented by 1 if we do checksum offload (a descriptor
8123 * is used to set the checksum context).
8124 */
8125 txs->txs_mbuf = m0;
8126 txs->txs_firstdesc = txq->txq_next;
8127 txs->txs_ndesc = segs_needed;
8128
8129 /* Set up offload parameters for this packet. */
8130 if (m0->m_pkthdr.csum_flags &
8131 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
8132 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
8133 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
8134 wm_tx_offload(sc, txq, txs, &cksumcmd, &cksumfields);
8135 } else {
8136 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0;
8137 txq->txq_last_hw_ipcs = txq->txq_last_hw_tucs = 0;
8138 cksumcmd = 0;
8139 cksumfields = 0;
8140 }
8141
8142 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS;
8143
8144 /* Sync the DMA map. */
8145 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
8146 BUS_DMASYNC_PREWRITE);
8147
8148 /* Initialize the transmit descriptor. */
8149 for (nexttx = txq->txq_next, seg = 0;
8150 seg < dmamap->dm_nsegs; seg++) {
8151 for (seglen = dmamap->dm_segs[seg].ds_len,
8152 curaddr = dmamap->dm_segs[seg].ds_addr;
8153 seglen != 0;
8154 curaddr += curlen, seglen -= curlen,
8155 nexttx = WM_NEXTTX(txq, nexttx)) {
8156 curlen = seglen;
8157
8158 /*
8159 * So says the Linux driver:
8160 * Work around for premature descriptor
8161 * write-backs in TSO mode. Append a
8162 * 4-byte sentinel descriptor.
8163 */
8164 if (use_tso && seg == dmamap->dm_nsegs - 1 &&
8165 curlen > 8)
8166 curlen -= 4;
8167
8168 wm_set_dma_addr(
8169 &txq->txq_descs[nexttx].wtx_addr, curaddr);
8170 txq->txq_descs[nexttx].wtx_cmdlen
8171 = htole32(cksumcmd | curlen);
8172 txq->txq_descs[nexttx].wtx_fields.wtxu_status
8173 = 0;
8174 txq->txq_descs[nexttx].wtx_fields.wtxu_options
8175 = cksumfields;
8176 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
8177 lasttx = nexttx;
8178
8179 DPRINTF(sc, WM_DEBUG_TX,
8180 ("%s: TX: desc %d: low %#" PRIx64 ", "
8181 "len %#04zx\n",
8182 device_xname(sc->sc_dev), nexttx,
8183 (uint64_t)curaddr, curlen));
8184 }
8185 }
8186
8187 KASSERT(lasttx != -1);
8188
8189 /*
8190 * Set up the command byte on the last descriptor of
8191 * the packet. If we're in the interrupt delay window,
8192 * delay the interrupt.
8193 */
8194 txq->txq_descs[lasttx].wtx_cmdlen |=
8195 htole32(WTX_CMD_EOP | WTX_CMD_RS);
8196
8197 /*
8198 * If VLANs are enabled and the packet has a VLAN tag, set
8199 * up the descriptor to encapsulate the packet for us.
8200 *
8201 * This is only valid on the last descriptor of the packet.
8202 */
8203 if (vlan_has_tag(m0)) {
8204 txq->txq_descs[lasttx].wtx_cmdlen |=
8205 htole32(WTX_CMD_VLE);
8206 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan
8207 = htole16(vlan_get_tag(m0));
8208 }
8209
8210 txs->txs_lastdesc = lasttx;
8211
8212 DPRINTF(sc, WM_DEBUG_TX,
8213 ("%s: TX: desc %d: cmdlen 0x%08x\n",
8214 device_xname(sc->sc_dev),
8215 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
8216
8217 /* Sync the descriptors we're using. */
8218 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
8219 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
8220
8221 /* Give the packet to the chip. */
8222 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
8223
8224 DPRINTF(sc, WM_DEBUG_TX,
8225 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
8226
8227 DPRINTF(sc, WM_DEBUG_TX,
8228 ("%s: TX: finished transmitting packet, job %d\n",
8229 device_xname(sc->sc_dev), txq->txq_snext));
8230
8231 /* Advance the tx pointer. */
8232 txq->txq_free -= txs->txs_ndesc;
8233 txq->txq_next = nexttx;
8234
8235 txq->txq_sfree--;
8236 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
8237
8238 /* Pass the packet to any BPF listeners. */
8239 bpf_mtap(ifp, m0, BPF_D_OUT);
8240 }
8241
8242 if (m0 != NULL) {
8243 txq->txq_flags |= WM_TXQ_NO_SPACE;
8244 WM_Q_EVCNT_INCR(txq, descdrop);
8245 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
8246 __func__));
8247 m_freem(m0);
8248 }
8249
8250 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
8251 /* No more slots; notify upper layer. */
8252 txq->txq_flags |= WM_TXQ_NO_SPACE;
8253 }
8254
8255 if (txq->txq_free != ofree) {
8256 /* Set a watchdog timer in case the chip flakes out. */
8257 txq->txq_lastsent = time_uptime;
8258 txq->txq_sending = true;
8259 }
8260 }
8261
8262 /*
8263 * wm_nq_tx_offload:
8264 *
8265 * Set up TCP/IP checksumming parameters for the
8266 * specified packet, for NEWQUEUE devices
8267 */
8268 static void
8269 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
8270 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum)
8271 {
8272 struct mbuf *m0 = txs->txs_mbuf;
8273 uint32_t vl_len, mssidx, cmdc;
8274 struct ether_header *eh;
8275 int offset, iphl;
8276
8277 /*
8278 * XXX It would be nice if the mbuf pkthdr had offset
8279 * fields for the protocol headers.
8280 */
8281 *cmdlenp = 0;
8282 *fieldsp = 0;
8283
8284 eh = mtod(m0, struct ether_header *);
8285 switch (htons(eh->ether_type)) {
8286 case ETHERTYPE_IP:
8287 case ETHERTYPE_IPV6:
8288 offset = ETHER_HDR_LEN;
8289 break;
8290
8291 case ETHERTYPE_VLAN:
8292 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
8293 break;
8294
8295 default:
8296 /* Don't support this protocol or encapsulation. */
8297 *do_csum = false;
8298 return;
8299 }
8300 *do_csum = true;
8301 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS;
8302 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT;
8303
8304 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT);
8305 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0);
8306
8307 if ((m0->m_pkthdr.csum_flags &
8308 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
8309 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
8310 } else {
8311 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data);
8312 }
8313 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT);
8314 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0);
8315
8316 if (vlan_has_tag(m0)) {
8317 vl_len |= ((vlan_get_tag(m0) & NQTXC_VLLEN_VLAN_MASK)
8318 << NQTXC_VLLEN_VLAN_SHIFT);
8319 *cmdlenp |= NQTX_CMD_VLE;
8320 }
8321
8322 mssidx = 0;
8323
8324 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
8325 int hlen = offset + iphl;
8326 int tcp_hlen;
8327 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
8328
8329 if (__predict_false(m0->m_len <
8330 (hlen + sizeof(struct tcphdr)))) {
8331 /*
8332 * TCP/IP headers are not in the first mbuf; we need
8333 * to do this the slow and painful way. Let's just
8334 * hope this doesn't happen very often.
8335 */
8336 struct tcphdr th;
8337
8338 WM_Q_EVCNT_INCR(txq, tsopain);
8339
8340 m_copydata(m0, hlen, sizeof(th), &th);
8341 if (v4) {
8342 struct ip ip;
8343
8344 m_copydata(m0, offset, sizeof(ip), &ip);
8345 ip.ip_len = 0;
8346 m_copyback(m0,
8347 offset + offsetof(struct ip, ip_len),
8348 sizeof(ip.ip_len), &ip.ip_len);
8349 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
8350 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
8351 } else {
8352 struct ip6_hdr ip6;
8353
8354 m_copydata(m0, offset, sizeof(ip6), &ip6);
8355 ip6.ip6_plen = 0;
8356 m_copyback(m0,
8357 offset + offsetof(struct ip6_hdr, ip6_plen),
8358 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
8359 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
8360 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
8361 }
8362 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
8363 sizeof(th.th_sum), &th.th_sum);
8364
8365 tcp_hlen = th.th_off << 2;
8366 } else {
8367 /*
8368 * TCP/IP headers are in the first mbuf; we can do
8369 * this the easy way.
8370 */
8371 struct tcphdr *th;
8372
8373 if (v4) {
8374 struct ip *ip =
8375 (void *)(mtod(m0, char *) + offset);
8376 th = (void *)(mtod(m0, char *) + hlen);
8377
8378 ip->ip_len = 0;
8379 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
8380 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
8381 } else {
8382 struct ip6_hdr *ip6 =
8383 (void *)(mtod(m0, char *) + offset);
8384 th = (void *)(mtod(m0, char *) + hlen);
8385
8386 ip6->ip6_plen = 0;
8387 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
8388 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
8389 }
8390 tcp_hlen = th->th_off << 2;
8391 }
8392 hlen += tcp_hlen;
8393 *cmdlenp |= NQTX_CMD_TSE;
8394
8395 if (v4) {
8396 WM_Q_EVCNT_INCR(txq, tso);
8397 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM;
8398 } else {
8399 WM_Q_EVCNT_INCR(txq, tso6);
8400 *fieldsp |= NQTXD_FIELDS_TUXSM;
8401 }
8402 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT);
8403 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
8404 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT);
8405 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0);
8406 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT);
8407 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0);
8408 } else {
8409 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT);
8410 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
8411 }
8412
8413 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
8414 *fieldsp |= NQTXD_FIELDS_IXSM;
8415 cmdc |= NQTXC_CMD_IP4;
8416 }
8417
8418 if (m0->m_pkthdr.csum_flags &
8419 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
8420 WM_Q_EVCNT_INCR(txq, tusum);
8421 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4))
8422 cmdc |= NQTXC_CMD_TCP;
8423 else
8424 cmdc |= NQTXC_CMD_UDP;
8425
8426 cmdc |= NQTXC_CMD_IP4;
8427 *fieldsp |= NQTXD_FIELDS_TUXSM;
8428 }
8429 if (m0->m_pkthdr.csum_flags &
8430 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
8431 WM_Q_EVCNT_INCR(txq, tusum6);
8432 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6))
8433 cmdc |= NQTXC_CMD_TCP;
8434 else
8435 cmdc |= NQTXC_CMD_UDP;
8436
8437 cmdc |= NQTXC_CMD_IP6;
8438 *fieldsp |= NQTXD_FIELDS_TUXSM;
8439 }
8440
8441 /*
8442 * We don't have to write context descriptor for every packet to
8443 * NEWQUEUE controllers, that is 82575, 82576, 82580, I350, I354,
8444 * I210 and I211. It is enough to write once per a Tx queue for these
8445 * controllers.
8446 * It would be overhead to write context descriptor for every packet,
8447 * however it does not cause problems.
8448 */
8449 /* Fill in the context descriptor. */
8450 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len =
8451 htole32(vl_len);
8452 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0;
8453 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd =
8454 htole32(cmdc);
8455 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx =
8456 htole32(mssidx);
8457 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
8458 DPRINTF(sc, WM_DEBUG_TX,
8459 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev),
8460 txq->txq_next, 0, vl_len));
8461 DPRINTF(sc, WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc));
8462 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
8463 txs->txs_ndesc++;
8464 }
8465
8466 /*
8467 * wm_nq_start: [ifnet interface function]
8468 *
8469 * Start packet transmission on the interface for NEWQUEUE devices
8470 */
8471 static void
8472 wm_nq_start(struct ifnet *ifp)
8473 {
8474 struct wm_softc *sc = ifp->if_softc;
8475 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
8476
8477 #ifdef WM_MPSAFE
8478 KASSERT(if_is_mpsafe(ifp));
8479 #endif
8480 /*
8481 * if_obytes and if_omcasts are added in if_transmit()@if.c.
8482 */
8483
8484 mutex_enter(txq->txq_lock);
8485 if (!txq->txq_stopping)
8486 wm_nq_start_locked(ifp);
8487 mutex_exit(txq->txq_lock);
8488 }
8489
8490 static void
8491 wm_nq_start_locked(struct ifnet *ifp)
8492 {
8493 struct wm_softc *sc = ifp->if_softc;
8494 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
8495
8496 wm_nq_send_common_locked(ifp, txq, false);
8497 }
8498
8499 static int
8500 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m)
8501 {
8502 int qid;
8503 struct wm_softc *sc = ifp->if_softc;
8504 struct wm_txqueue *txq;
8505
8506 qid = wm_select_txqueue(ifp, m);
8507 txq = &sc->sc_queue[qid].wmq_txq;
8508
8509 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
8510 m_freem(m);
8511 WM_Q_EVCNT_INCR(txq, pcqdrop);
8512 return ENOBUFS;
8513 }
8514
8515 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
8516 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len);
8517 if (m->m_flags & M_MCAST)
8518 if_statinc_ref(nsr, if_omcasts);
8519 IF_STAT_PUTREF(ifp);
8520
8521 /*
8522 * The situations which this mutex_tryenter() fails at running time
8523 * are below two patterns.
8524 * (1) contention with interrupt handler(wm_txrxintr_msix())
8525 * (2) contention with deferred if_start softint(wm_handle_queue())
8526 * In the case of (1), the last packet enqueued to txq->txq_interq is
8527 * dequeued by wm_deferred_start_locked(). So, it does not get stuck.
8528 * In the case of (2), the last packet enqueued to txq->txq_interq is
8529 * also dequeued by wm_deferred_start_locked(). So, it does not get
8530 * stuck, either.
8531 */
8532 if (mutex_tryenter(txq->txq_lock)) {
8533 if (!txq->txq_stopping)
8534 wm_nq_transmit_locked(ifp, txq);
8535 mutex_exit(txq->txq_lock);
8536 }
8537
8538 return 0;
8539 }
8540
8541 static void
8542 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
8543 {
8544
8545 wm_nq_send_common_locked(ifp, txq, true);
8546 }
8547
8548 static void
8549 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
8550 bool is_transmit)
8551 {
8552 struct wm_softc *sc = ifp->if_softc;
8553 struct mbuf *m0;
8554 struct wm_txsoft *txs;
8555 bus_dmamap_t dmamap;
8556 int error, nexttx, lasttx = -1, seg, segs_needed;
8557 bool do_csum, sent;
8558 bool remap = true;
8559
8560 KASSERT(mutex_owned(txq->txq_lock));
8561
8562 if ((ifp->if_flags & IFF_RUNNING) == 0)
8563 return;
8564 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
8565 return;
8566
8567 if (__predict_false(wm_linkdown_discard(txq))) {
8568 do {
8569 if (is_transmit)
8570 m0 = pcq_get(txq->txq_interq);
8571 else
8572 IFQ_DEQUEUE(&ifp->if_snd, m0);
8573 /*
8574 * increment successed packet counter as in the case
8575 * which the packet is discarded by link down PHY.
8576 */
8577 if (m0 != NULL)
8578 if_statinc(ifp, if_opackets);
8579 m_freem(m0);
8580 } while (m0 != NULL);
8581 return;
8582 }
8583
8584 sent = false;
8585
8586 /*
8587 * Loop through the send queue, setting up transmit descriptors
8588 * until we drain the queue, or use up all available transmit
8589 * descriptors.
8590 */
8591 for (;;) {
8592 m0 = NULL;
8593
8594 /* Get a work queue entry. */
8595 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
8596 wm_txeof(txq, UINT_MAX);
8597 if (txq->txq_sfree == 0) {
8598 DPRINTF(sc, WM_DEBUG_TX,
8599 ("%s: TX: no free job descriptors\n",
8600 device_xname(sc->sc_dev)));
8601 WM_Q_EVCNT_INCR(txq, txsstall);
8602 break;
8603 }
8604 }
8605
8606 /* Grab a packet off the queue. */
8607 if (is_transmit)
8608 m0 = pcq_get(txq->txq_interq);
8609 else
8610 IFQ_DEQUEUE(&ifp->if_snd, m0);
8611 if (m0 == NULL)
8612 break;
8613
8614 DPRINTF(sc, WM_DEBUG_TX,
8615 ("%s: TX: have packet to transmit: %p\n",
8616 device_xname(sc->sc_dev), m0));
8617
8618 txs = &txq->txq_soft[txq->txq_snext];
8619 dmamap = txs->txs_dmamap;
8620
8621 /*
8622 * Load the DMA map. If this fails, the packet either
8623 * didn't fit in the allotted number of segments, or we
8624 * were short on resources. For the too-many-segments
8625 * case, we simply report an error and drop the packet,
8626 * since we can't sanely copy a jumbo packet to a single
8627 * buffer.
8628 */
8629 retry:
8630 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
8631 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
8632 if (__predict_false(error)) {
8633 if (error == EFBIG) {
8634 if (remap == true) {
8635 struct mbuf *m;
8636
8637 remap = false;
8638 m = m_defrag(m0, M_NOWAIT);
8639 if (m != NULL) {
8640 WM_Q_EVCNT_INCR(txq, defrag);
8641 m0 = m;
8642 goto retry;
8643 }
8644 }
8645 WM_Q_EVCNT_INCR(txq, toomanyseg);
8646 log(LOG_ERR, "%s: Tx packet consumes too many "
8647 "DMA segments, dropping...\n",
8648 device_xname(sc->sc_dev));
8649 wm_dump_mbuf_chain(sc, m0);
8650 m_freem(m0);
8651 continue;
8652 }
8653 /* Short on resources, just stop for now. */
8654 DPRINTF(sc, WM_DEBUG_TX,
8655 ("%s: TX: dmamap load failed: %d\n",
8656 device_xname(sc->sc_dev), error));
8657 break;
8658 }
8659
8660 segs_needed = dmamap->dm_nsegs;
8661
8662 /*
8663 * Ensure we have enough descriptors free to describe
8664 * the packet. Note, we always reserve one descriptor
8665 * at the end of the ring due to the semantics of the
8666 * TDT register, plus one more in the event we need
8667 * to load offload context.
8668 */
8669 if (segs_needed > txq->txq_free - 2) {
8670 /*
8671 * Not enough free descriptors to transmit this
8672 * packet. We haven't committed anything yet,
8673 * so just unload the DMA map, put the packet
8674 * pack on the queue, and punt. Notify the upper
8675 * layer that there are no more slots left.
8676 */
8677 DPRINTF(sc, WM_DEBUG_TX,
8678 ("%s: TX: need %d (%d) descriptors, have %d\n",
8679 device_xname(sc->sc_dev), dmamap->dm_nsegs,
8680 segs_needed, txq->txq_free - 1));
8681 txq->txq_flags |= WM_TXQ_NO_SPACE;
8682 bus_dmamap_unload(sc->sc_dmat, dmamap);
8683 WM_Q_EVCNT_INCR(txq, txdstall);
8684 break;
8685 }
8686
8687 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
8688
8689 DPRINTF(sc, WM_DEBUG_TX,
8690 ("%s: TX: packet has %d (%d) DMA segments\n",
8691 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
8692
8693 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
8694
8695 /*
8696 * Store a pointer to the packet so that we can free it
8697 * later.
8698 *
8699 * Initially, we consider the number of descriptors the
8700 * packet uses the number of DMA segments. This may be
8701 * incremented by 1 if we do checksum offload (a descriptor
8702 * is used to set the checksum context).
8703 */
8704 txs->txs_mbuf = m0;
8705 txs->txs_firstdesc = txq->txq_next;
8706 txs->txs_ndesc = segs_needed;
8707
8708 /* Set up offload parameters for this packet. */
8709 uint32_t cmdlen, fields, dcmdlen;
8710 if (m0->m_pkthdr.csum_flags &
8711 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
8712 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
8713 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
8714 wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields,
8715 &do_csum);
8716 } else {
8717 do_csum = false;
8718 cmdlen = 0;
8719 fields = 0;
8720 }
8721
8722 /* Sync the DMA map. */
8723 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
8724 BUS_DMASYNC_PREWRITE);
8725
8726 /* Initialize the first transmit descriptor. */
8727 nexttx = txq->txq_next;
8728 if (!do_csum) {
8729 /* Setup a legacy descriptor */
8730 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr,
8731 dmamap->dm_segs[0].ds_addr);
8732 txq->txq_descs[nexttx].wtx_cmdlen =
8733 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len);
8734 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0;
8735 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0;
8736 if (vlan_has_tag(m0)) {
8737 txq->txq_descs[nexttx].wtx_cmdlen |=
8738 htole32(WTX_CMD_VLE);
8739 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =
8740 htole16(vlan_get_tag(m0));
8741 } else
8742 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
8743
8744 dcmdlen = 0;
8745 } else {
8746 /* Setup an advanced data descriptor */
8747 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
8748 htole64(dmamap->dm_segs[0].ds_addr);
8749 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0);
8750 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
8751 htole32(dmamap->dm_segs[0].ds_len | cmdlen);
8752 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields =
8753 htole32(fields);
8754 DPRINTF(sc, WM_DEBUG_TX,
8755 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n",
8756 device_xname(sc->sc_dev), nexttx,
8757 (uint64_t)dmamap->dm_segs[0].ds_addr));
8758 DPRINTF(sc, WM_DEBUG_TX,
8759 ("\t 0x%08x%08x\n", fields,
8760 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen));
8761 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT;
8762 }
8763
8764 lasttx = nexttx;
8765 nexttx = WM_NEXTTX(txq, nexttx);
8766 /*
8767 * Fill in the next descriptors. legacy or advanced format
8768 * is the same here
8769 */
8770 for (seg = 1; seg < dmamap->dm_nsegs;
8771 seg++, nexttx = WM_NEXTTX(txq, nexttx)) {
8772 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
8773 htole64(dmamap->dm_segs[seg].ds_addr);
8774 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
8775 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len);
8776 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0);
8777 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0;
8778 lasttx = nexttx;
8779
8780 DPRINTF(sc, WM_DEBUG_TX,
8781 ("%s: TX: desc %d: %#" PRIx64 ", len %#04zx\n",
8782 device_xname(sc->sc_dev), nexttx,
8783 (uint64_t)dmamap->dm_segs[seg].ds_addr,
8784 dmamap->dm_segs[seg].ds_len));
8785 }
8786
8787 KASSERT(lasttx != -1);
8788
8789 /*
8790 * Set up the command byte on the last descriptor of
8791 * the packet. If we're in the interrupt delay window,
8792 * delay the interrupt.
8793 */
8794 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) ==
8795 (NQTX_CMD_EOP | NQTX_CMD_RS));
8796 txq->txq_descs[lasttx].wtx_cmdlen |=
8797 htole32(WTX_CMD_EOP | WTX_CMD_RS);
8798
8799 txs->txs_lastdesc = lasttx;
8800
8801 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n",
8802 device_xname(sc->sc_dev),
8803 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
8804
8805 /* Sync the descriptors we're using. */
8806 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
8807 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
8808
8809 /* Give the packet to the chip. */
8810 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
8811 sent = true;
8812
8813 DPRINTF(sc, WM_DEBUG_TX,
8814 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
8815
8816 DPRINTF(sc, WM_DEBUG_TX,
8817 ("%s: TX: finished transmitting packet, job %d\n",
8818 device_xname(sc->sc_dev), txq->txq_snext));
8819
8820 /* Advance the tx pointer. */
8821 txq->txq_free -= txs->txs_ndesc;
8822 txq->txq_next = nexttx;
8823
8824 txq->txq_sfree--;
8825 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
8826
8827 /* Pass the packet to any BPF listeners. */
8828 bpf_mtap(ifp, m0, BPF_D_OUT);
8829 }
8830
8831 if (m0 != NULL) {
8832 txq->txq_flags |= WM_TXQ_NO_SPACE;
8833 WM_Q_EVCNT_INCR(txq, descdrop);
8834 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
8835 __func__));
8836 m_freem(m0);
8837 }
8838
8839 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
8840 /* No more slots; notify upper layer. */
8841 txq->txq_flags |= WM_TXQ_NO_SPACE;
8842 }
8843
8844 if (sent) {
8845 /* Set a watchdog timer in case the chip flakes out. */
8846 txq->txq_lastsent = time_uptime;
8847 txq->txq_sending = true;
8848 }
8849 }
8850
8851 static void
8852 wm_deferred_start_locked(struct wm_txqueue *txq)
8853 {
8854 struct wm_softc *sc = txq->txq_sc;
8855 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8856 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
8857 int qid = wmq->wmq_id;
8858
8859 KASSERT(mutex_owned(txq->txq_lock));
8860
8861 if (txq->txq_stopping) {
8862 mutex_exit(txq->txq_lock);
8863 return;
8864 }
8865
8866 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
8867 /* XXX need for ALTQ or one CPU system */
8868 if (qid == 0)
8869 wm_nq_start_locked(ifp);
8870 wm_nq_transmit_locked(ifp, txq);
8871 } else {
8872 /* XXX need for ALTQ or one CPU system */
8873 if (qid == 0)
8874 wm_start_locked(ifp);
8875 wm_transmit_locked(ifp, txq);
8876 }
8877 }
8878
8879 /* Interrupt */
8880
8881 /*
8882 * wm_txeof:
8883 *
8884 * Helper; handle transmit interrupts.
8885 */
8886 static bool
8887 wm_txeof(struct wm_txqueue *txq, u_int limit)
8888 {
8889 struct wm_softc *sc = txq->txq_sc;
8890 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8891 struct wm_txsoft *txs;
8892 int count = 0;
8893 int i;
8894 uint8_t status;
8895 bool more = false;
8896
8897 KASSERT(mutex_owned(txq->txq_lock));
8898
8899 if (txq->txq_stopping)
8900 return false;
8901
8902 txq->txq_flags &= ~WM_TXQ_NO_SPACE;
8903
8904 /*
8905 * Go through the Tx list and free mbufs for those
8906 * frames which have been transmitted.
8907 */
8908 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq);
8909 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) {
8910 if (limit-- == 0) {
8911 more = true;
8912 DPRINTF(sc, WM_DEBUG_TX,
8913 ("%s: TX: loop limited, job %d is not processed\n",
8914 device_xname(sc->sc_dev), i));
8915 break;
8916 }
8917
8918 txs = &txq->txq_soft[i];
8919
8920 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: checking job %d\n",
8921 device_xname(sc->sc_dev), i));
8922
8923 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc,
8924 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
8925
8926 status =
8927 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status;
8928 if ((status & WTX_ST_DD) == 0) {
8929 wm_cdtxsync(txq, txs->txs_lastdesc, 1,
8930 BUS_DMASYNC_PREREAD);
8931 break;
8932 }
8933
8934 count++;
8935 DPRINTF(sc, WM_DEBUG_TX,
8936 ("%s: TX: job %d done: descs %d..%d\n",
8937 device_xname(sc->sc_dev), i, txs->txs_firstdesc,
8938 txs->txs_lastdesc));
8939
8940 /*
8941 * XXX We should probably be using the statistics
8942 * XXX registers, but I don't know if they exist
8943 * XXX on chips before the i82544.
8944 */
8945
8946 #ifdef WM_EVENT_COUNTERS
8947 if (status & WTX_ST_TU)
8948 WM_Q_EVCNT_INCR(txq, underrun);
8949 #endif /* WM_EVENT_COUNTERS */
8950
8951 /*
8952 * 82574 and newer's document says the status field has neither
8953 * EC (Excessive Collision) bit nor LC (Late Collision) bit
8954 * (reserved). Refer "PCIe GbE Controller Open Source Software
8955 * Developer's Manual", 82574 datasheet and newer.
8956 *
8957 * XXX I saw the LC bit was set on I218 even though the media
8958 * was full duplex, so the bit might be used for other
8959 * meaning ...(I have no document).
8960 */
8961
8962 if (((status & (WTX_ST_EC | WTX_ST_LC)) != 0)
8963 && ((sc->sc_type < WM_T_82574)
8964 || (sc->sc_type == WM_T_80003))) {
8965 if_statinc(ifp, if_oerrors);
8966 if (status & WTX_ST_LC)
8967 log(LOG_WARNING, "%s: late collision\n",
8968 device_xname(sc->sc_dev));
8969 else if (status & WTX_ST_EC) {
8970 if_statadd(ifp, if_collisions,
8971 TX_COLLISION_THRESHOLD + 1);
8972 log(LOG_WARNING, "%s: excessive collisions\n",
8973 device_xname(sc->sc_dev));
8974 }
8975 } else
8976 if_statinc(ifp, if_opackets);
8977
8978 txq->txq_packets++;
8979 txq->txq_bytes += txs->txs_mbuf->m_pkthdr.len;
8980
8981 txq->txq_free += txs->txs_ndesc;
8982 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
8983 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
8984 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
8985 m_freem(txs->txs_mbuf);
8986 txs->txs_mbuf = NULL;
8987 }
8988
8989 /* Update the dirty transmit buffer pointer. */
8990 txq->txq_sdirty = i;
8991 DPRINTF(sc, WM_DEBUG_TX,
8992 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i));
8993
8994 if (count != 0)
8995 rnd_add_uint32(&sc->rnd_source, count);
8996
8997 /*
8998 * If there are no more pending transmissions, cancel the watchdog
8999 * timer.
9000 */
9001 if (txq->txq_sfree == WM_TXQUEUELEN(txq))
9002 txq->txq_sending = false;
9003
9004 return more;
9005 }
9006
9007 static inline uint32_t
9008 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx)
9009 {
9010 struct wm_softc *sc = rxq->rxq_sc;
9011
9012 if (sc->sc_type == WM_T_82574)
9013 return EXTRXC_STATUS(
9014 le32toh(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat));
9015 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9016 return NQRXC_STATUS(
9017 le32toh(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat));
9018 else
9019 return rxq->rxq_descs[idx].wrx_status;
9020 }
9021
9022 static inline uint32_t
9023 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx)
9024 {
9025 struct wm_softc *sc = rxq->rxq_sc;
9026
9027 if (sc->sc_type == WM_T_82574)
9028 return EXTRXC_ERROR(
9029 le32toh(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat));
9030 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9031 return NQRXC_ERROR(
9032 le32toh(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat));
9033 else
9034 return rxq->rxq_descs[idx].wrx_errors;
9035 }
9036
9037 static inline uint16_t
9038 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx)
9039 {
9040 struct wm_softc *sc = rxq->rxq_sc;
9041
9042 if (sc->sc_type == WM_T_82574)
9043 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan;
9044 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9045 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan;
9046 else
9047 return rxq->rxq_descs[idx].wrx_special;
9048 }
9049
9050 static inline int
9051 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx)
9052 {
9053 struct wm_softc *sc = rxq->rxq_sc;
9054
9055 if (sc->sc_type == WM_T_82574)
9056 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen;
9057 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9058 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen;
9059 else
9060 return rxq->rxq_descs[idx].wrx_len;
9061 }
9062
9063 #ifdef WM_DEBUG
9064 static inline uint32_t
9065 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx)
9066 {
9067 struct wm_softc *sc = rxq->rxq_sc;
9068
9069 if (sc->sc_type == WM_T_82574)
9070 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash;
9071 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9072 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash;
9073 else
9074 return 0;
9075 }
9076
9077 static inline uint8_t
9078 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx)
9079 {
9080 struct wm_softc *sc = rxq->rxq_sc;
9081
9082 if (sc->sc_type == WM_T_82574)
9083 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq);
9084 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9085 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc);
9086 else
9087 return 0;
9088 }
9089 #endif /* WM_DEBUG */
9090
9091 static inline bool
9092 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status,
9093 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
9094 {
9095
9096 if (sc->sc_type == WM_T_82574)
9097 return (status & ext_bit) != 0;
9098 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9099 return (status & nq_bit) != 0;
9100 else
9101 return (status & legacy_bit) != 0;
9102 }
9103
9104 static inline bool
9105 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error,
9106 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
9107 {
9108
9109 if (sc->sc_type == WM_T_82574)
9110 return (error & ext_bit) != 0;
9111 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
9112 return (error & nq_bit) != 0;
9113 else
9114 return (error & legacy_bit) != 0;
9115 }
9116
9117 static inline bool
9118 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status)
9119 {
9120
9121 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
9122 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP))
9123 return true;
9124 else
9125 return false;
9126 }
9127
9128 static inline bool
9129 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors)
9130 {
9131 struct wm_softc *sc = rxq->rxq_sc;
9132
9133 /* XXX missing error bit for newqueue? */
9134 if (wm_rxdesc_is_set_error(sc, errors,
9135 WRX_ER_CE | WRX_ER_SE | WRX_ER_SEQ | WRX_ER_CXE | WRX_ER_RXE,
9136 EXTRXC_ERROR_CE | EXTRXC_ERROR_SE | EXTRXC_ERROR_SEQ
9137 | EXTRXC_ERROR_CXE | EXTRXC_ERROR_RXE,
9138 NQRXC_ERROR_RXE)) {
9139 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE,
9140 EXTRXC_ERROR_SE, 0))
9141 log(LOG_WARNING, "%s: symbol error\n",
9142 device_xname(sc->sc_dev));
9143 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ,
9144 EXTRXC_ERROR_SEQ, 0))
9145 log(LOG_WARNING, "%s: receive sequence error\n",
9146 device_xname(sc->sc_dev));
9147 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE,
9148 EXTRXC_ERROR_CE, 0))
9149 log(LOG_WARNING, "%s: CRC error\n",
9150 device_xname(sc->sc_dev));
9151 return true;
9152 }
9153
9154 return false;
9155 }
9156
9157 static inline bool
9158 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status)
9159 {
9160 struct wm_softc *sc = rxq->rxq_sc;
9161
9162 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD,
9163 NQRXC_STATUS_DD)) {
9164 /* We have processed all of the receive descriptors. */
9165 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD);
9166 return false;
9167 }
9168
9169 return true;
9170 }
9171
9172 static inline bool
9173 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status,
9174 uint16_t vlantag, struct mbuf *m)
9175 {
9176
9177 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
9178 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) {
9179 vlan_set_tag(m, le16toh(vlantag));
9180 }
9181
9182 return true;
9183 }
9184
9185 static inline void
9186 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status,
9187 uint32_t errors, struct mbuf *m)
9188 {
9189 struct wm_softc *sc = rxq->rxq_sc;
9190
9191 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) {
9192 if (wm_rxdesc_is_set_status(sc, status,
9193 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) {
9194 WM_Q_EVCNT_INCR(rxq, ipsum);
9195 m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
9196 if (wm_rxdesc_is_set_error(sc, errors,
9197 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE))
9198 m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
9199 }
9200 if (wm_rxdesc_is_set_status(sc, status,
9201 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) {
9202 /*
9203 * Note: we don't know if this was TCP or UDP,
9204 * so we just set both bits, and expect the
9205 * upper layers to deal.
9206 */
9207 WM_Q_EVCNT_INCR(rxq, tusum);
9208 m->m_pkthdr.csum_flags |=
9209 M_CSUM_TCPv4 | M_CSUM_UDPv4 |
9210 M_CSUM_TCPv6 | M_CSUM_UDPv6;
9211 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_TCPE,
9212 EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E))
9213 m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
9214 }
9215 }
9216 }
9217
9218 /*
9219 * wm_rxeof:
9220 *
9221 * Helper; handle receive interrupts.
9222 */
9223 static bool
9224 wm_rxeof(struct wm_rxqueue *rxq, u_int limit)
9225 {
9226 struct wm_softc *sc = rxq->rxq_sc;
9227 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9228 struct wm_rxsoft *rxs;
9229 struct mbuf *m;
9230 int i, len;
9231 int count = 0;
9232 uint32_t status, errors;
9233 uint16_t vlantag;
9234 bool more = false;
9235
9236 KASSERT(mutex_owned(rxq->rxq_lock));
9237
9238 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) {
9239 if (limit-- == 0) {
9240 more = true;
9241 DPRINTF(sc, WM_DEBUG_RX,
9242 ("%s: RX: loop limited, descriptor %d is not processed\n",
9243 device_xname(sc->sc_dev), i));
9244 break;
9245 }
9246
9247 rxs = &rxq->rxq_soft[i];
9248
9249 DPRINTF(sc, WM_DEBUG_RX,
9250 ("%s: RX: checking descriptor %d\n",
9251 device_xname(sc->sc_dev), i));
9252 wm_cdrxsync(rxq, i,
9253 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
9254
9255 status = wm_rxdesc_get_status(rxq, i);
9256 errors = wm_rxdesc_get_errors(rxq, i);
9257 len = le16toh(wm_rxdesc_get_pktlen(rxq, i));
9258 vlantag = wm_rxdesc_get_vlantag(rxq, i);
9259 #ifdef WM_DEBUG
9260 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i));
9261 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i);
9262 #endif
9263
9264 if (!wm_rxdesc_dd(rxq, i, status)) {
9265 break;
9266 }
9267
9268 count++;
9269 if (__predict_false(rxq->rxq_discard)) {
9270 DPRINTF(sc, WM_DEBUG_RX,
9271 ("%s: RX: discarding contents of descriptor %d\n",
9272 device_xname(sc->sc_dev), i));
9273 wm_init_rxdesc(rxq, i);
9274 if (wm_rxdesc_is_eop(rxq, status)) {
9275 /* Reset our state. */
9276 DPRINTF(sc, WM_DEBUG_RX,
9277 ("%s: RX: resetting rxdiscard -> 0\n",
9278 device_xname(sc->sc_dev)));
9279 rxq->rxq_discard = 0;
9280 }
9281 continue;
9282 }
9283
9284 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
9285 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
9286
9287 m = rxs->rxs_mbuf;
9288
9289 /*
9290 * Add a new receive buffer to the ring, unless of
9291 * course the length is zero. Treat the latter as a
9292 * failed mapping.
9293 */
9294 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) {
9295 /*
9296 * Failed, throw away what we've done so
9297 * far, and discard the rest of the packet.
9298 */
9299 if_statinc(ifp, if_ierrors);
9300 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
9301 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
9302 wm_init_rxdesc(rxq, i);
9303 if (!wm_rxdesc_is_eop(rxq, status))
9304 rxq->rxq_discard = 1;
9305 if (rxq->rxq_head != NULL)
9306 m_freem(rxq->rxq_head);
9307 WM_RXCHAIN_RESET(rxq);
9308 DPRINTF(sc, WM_DEBUG_RX,
9309 ("%s: RX: Rx buffer allocation failed, "
9310 "dropping packet%s\n", device_xname(sc->sc_dev),
9311 rxq->rxq_discard ? " (discard)" : ""));
9312 continue;
9313 }
9314
9315 m->m_len = len;
9316 rxq->rxq_len += len;
9317 DPRINTF(sc, WM_DEBUG_RX,
9318 ("%s: RX: buffer at %p len %d\n",
9319 device_xname(sc->sc_dev), m->m_data, len));
9320
9321 /* If this is not the end of the packet, keep looking. */
9322 if (!wm_rxdesc_is_eop(rxq, status)) {
9323 WM_RXCHAIN_LINK(rxq, m);
9324 DPRINTF(sc, WM_DEBUG_RX,
9325 ("%s: RX: not yet EOP, rxlen -> %d\n",
9326 device_xname(sc->sc_dev), rxq->rxq_len));
9327 continue;
9328 }
9329
9330 /*
9331 * Okay, we have the entire packet now. The chip is
9332 * configured to include the FCS except I35[04], I21[01].
9333 * (not all chips can be configured to strip it), so we need
9334 * to trim it. Those chips have an eratta, the RCTL_SECRC bit
9335 * in RCTL register is always set, so we don't trim it.
9336 * PCH2 and newer chip also not include FCS when jumbo
9337 * frame is used to do workaround an errata.
9338 * May need to adjust length of previous mbuf in the
9339 * chain if the current mbuf is too short.
9340 */
9341 if ((sc->sc_flags & WM_F_CRC_STRIP) == 0) {
9342 if (m->m_len < ETHER_CRC_LEN) {
9343 rxq->rxq_tail->m_len
9344 -= (ETHER_CRC_LEN - m->m_len);
9345 m->m_len = 0;
9346 } else
9347 m->m_len -= ETHER_CRC_LEN;
9348 len = rxq->rxq_len - ETHER_CRC_LEN;
9349 } else
9350 len = rxq->rxq_len;
9351
9352 WM_RXCHAIN_LINK(rxq, m);
9353
9354 *rxq->rxq_tailp = NULL;
9355 m = rxq->rxq_head;
9356
9357 WM_RXCHAIN_RESET(rxq);
9358
9359 DPRINTF(sc, WM_DEBUG_RX,
9360 ("%s: RX: have entire packet, len -> %d\n",
9361 device_xname(sc->sc_dev), len));
9362
9363 /* If an error occurred, update stats and drop the packet. */
9364 if (wm_rxdesc_has_errors(rxq, errors)) {
9365 m_freem(m);
9366 continue;
9367 }
9368
9369 /* No errors. Receive the packet. */
9370 m_set_rcvif(m, ifp);
9371 m->m_pkthdr.len = len;
9372 /*
9373 * TODO
9374 * should be save rsshash and rsstype to this mbuf.
9375 */
9376 DPRINTF(sc, WM_DEBUG_RX,
9377 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n",
9378 device_xname(sc->sc_dev), rsstype, rsshash));
9379
9380 /*
9381 * If VLANs are enabled, VLAN packets have been unwrapped
9382 * for us. Associate the tag with the packet.
9383 */
9384 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m))
9385 continue;
9386
9387 /* Set up checksum info for this packet. */
9388 wm_rxdesc_ensure_checksum(rxq, status, errors, m);
9389
9390 rxq->rxq_packets++;
9391 rxq->rxq_bytes += len;
9392 /* Pass it on. */
9393 if_percpuq_enqueue(sc->sc_ipq, m);
9394
9395 if (rxq->rxq_stopping)
9396 break;
9397 }
9398 rxq->rxq_ptr = i;
9399
9400 if (count != 0)
9401 rnd_add_uint32(&sc->rnd_source, count);
9402
9403 DPRINTF(sc, WM_DEBUG_RX,
9404 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i));
9405
9406 return more;
9407 }
9408
9409 /*
9410 * wm_linkintr_gmii:
9411 *
9412 * Helper; handle link interrupts for GMII.
9413 */
9414 static void
9415 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr)
9416 {
9417 device_t dev = sc->sc_dev;
9418 uint32_t status, reg;
9419 bool link;
9420 int rv;
9421
9422 KASSERT(WM_CORE_LOCKED(sc));
9423
9424 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(dev),
9425 __func__));
9426
9427 if ((icr & ICR_LSC) == 0) {
9428 if (icr & ICR_RXSEQ)
9429 DPRINTF(sc, WM_DEBUG_LINK,
9430 ("%s: LINK Receive sequence error\n",
9431 device_xname(dev)));
9432 return;
9433 }
9434
9435 /* Link status changed */
9436 status = CSR_READ(sc, WMREG_STATUS);
9437 link = status & STATUS_LU;
9438 if (link) {
9439 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
9440 device_xname(dev),
9441 (status & STATUS_FD) ? "FDX" : "HDX"));
9442 if (wm_phy_need_linkdown_discard(sc))
9443 wm_clear_linkdown_discard(sc);
9444 } else {
9445 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
9446 device_xname(dev)));
9447 if (wm_phy_need_linkdown_discard(sc))
9448 wm_set_linkdown_discard(sc);
9449 }
9450 if ((sc->sc_type == WM_T_ICH8) && (link == false))
9451 wm_gig_downshift_workaround_ich8lan(sc);
9452
9453 if ((sc->sc_type == WM_T_ICH8)
9454 && (sc->sc_phytype == WMPHY_IGP_3)) {
9455 wm_kmrn_lock_loss_workaround_ich8lan(sc);
9456 }
9457 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n",
9458 device_xname(dev)));
9459 mii_pollstat(&sc->sc_mii);
9460 if (sc->sc_type == WM_T_82543) {
9461 int miistatus, active;
9462
9463 /*
9464 * With 82543, we need to force speed and
9465 * duplex on the MAC equal to what the PHY
9466 * speed and duplex configuration is.
9467 */
9468 miistatus = sc->sc_mii.mii_media_status;
9469
9470 if (miistatus & IFM_ACTIVE) {
9471 active = sc->sc_mii.mii_media_active;
9472 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
9473 switch (IFM_SUBTYPE(active)) {
9474 case IFM_10_T:
9475 sc->sc_ctrl |= CTRL_SPEED_10;
9476 break;
9477 case IFM_100_TX:
9478 sc->sc_ctrl |= CTRL_SPEED_100;
9479 break;
9480 case IFM_1000_T:
9481 sc->sc_ctrl |= CTRL_SPEED_1000;
9482 break;
9483 default:
9484 /*
9485 * Fiber?
9486 * Shoud not enter here.
9487 */
9488 device_printf(dev, "unknown media (%x)\n",
9489 active);
9490 break;
9491 }
9492 if (active & IFM_FDX)
9493 sc->sc_ctrl |= CTRL_FD;
9494 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9495 }
9496 } else if (sc->sc_type == WM_T_PCH) {
9497 wm_k1_gig_workaround_hv(sc,
9498 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
9499 }
9500
9501 /*
9502 * When connected at 10Mbps half-duplex, some parts are excessively
9503 * aggressive resulting in many collisions. To avoid this, increase
9504 * the IPG and reduce Rx latency in the PHY.
9505 */
9506 if ((sc->sc_type >= WM_T_PCH2) && (sc->sc_type <= WM_T_PCH_CNP)
9507 && link) {
9508 uint32_t tipg_reg;
9509 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED);
9510 bool fdx;
9511 uint16_t emi_addr, emi_val;
9512
9513 tipg_reg = CSR_READ(sc, WMREG_TIPG);
9514 tipg_reg &= ~TIPG_IPGT_MASK;
9515 fdx = status & STATUS_FD;
9516
9517 if (!fdx && (speed == STATUS_SPEED_10)) {
9518 tipg_reg |= 0xff;
9519 /* Reduce Rx latency in analog PHY */
9520 emi_val = 0;
9521 } else if ((sc->sc_type >= WM_T_PCH_SPT) &&
9522 fdx && speed != STATUS_SPEED_1000) {
9523 tipg_reg |= 0xc;
9524 emi_val = 1;
9525 } else {
9526 /* Roll back the default values */
9527 tipg_reg |= 0x08;
9528 emi_val = 1;
9529 }
9530
9531 CSR_WRITE(sc, WMREG_TIPG, tipg_reg);
9532
9533 rv = sc->phy.acquire(sc);
9534 if (rv)
9535 return;
9536
9537 if (sc->sc_type == WM_T_PCH2)
9538 emi_addr = I82579_RX_CONFIG;
9539 else
9540 emi_addr = I217_RX_CONFIG;
9541 rv = wm_write_emi_reg_locked(dev, emi_addr, emi_val);
9542
9543 if (sc->sc_type >= WM_T_PCH_LPT) {
9544 uint16_t phy_reg;
9545
9546 sc->phy.readreg_locked(dev, 2,
9547 I217_PLL_CLOCK_GATE_REG, &phy_reg);
9548 phy_reg &= ~I217_PLL_CLOCK_GATE_MASK;
9549 if (speed == STATUS_SPEED_100
9550 || speed == STATUS_SPEED_10)
9551 phy_reg |= 0x3e8;
9552 else
9553 phy_reg |= 0xfa;
9554 sc->phy.writereg_locked(dev, 2,
9555 I217_PLL_CLOCK_GATE_REG, phy_reg);
9556
9557 if (speed == STATUS_SPEED_1000) {
9558 sc->phy.readreg_locked(dev, 2,
9559 HV_PM_CTRL, &phy_reg);
9560
9561 phy_reg |= HV_PM_CTRL_K1_CLK_REQ;
9562
9563 sc->phy.writereg_locked(dev, 2,
9564 HV_PM_CTRL, phy_reg);
9565 }
9566 }
9567 sc->phy.release(sc);
9568
9569 if (rv)
9570 return;
9571
9572 if (sc->sc_type >= WM_T_PCH_SPT) {
9573 uint16_t data, ptr_gap;
9574
9575 if (speed == STATUS_SPEED_1000) {
9576 rv = sc->phy.acquire(sc);
9577 if (rv)
9578 return;
9579
9580 rv = sc->phy.readreg_locked(dev, 2,
9581 I82579_UNKNOWN1, &data);
9582 if (rv) {
9583 sc->phy.release(sc);
9584 return;
9585 }
9586
9587 ptr_gap = (data & (0x3ff << 2)) >> 2;
9588 if (ptr_gap < 0x18) {
9589 data &= ~(0x3ff << 2);
9590 data |= (0x18 << 2);
9591 rv = sc->phy.writereg_locked(dev,
9592 2, I82579_UNKNOWN1, data);
9593 }
9594 sc->phy.release(sc);
9595 if (rv)
9596 return;
9597 } else {
9598 rv = sc->phy.acquire(sc);
9599 if (rv)
9600 return;
9601
9602 rv = sc->phy.writereg_locked(dev, 2,
9603 I82579_UNKNOWN1, 0xc023);
9604 sc->phy.release(sc);
9605 if (rv)
9606 return;
9607
9608 }
9609 }
9610 }
9611
9612 /*
9613 * I217 Packet Loss issue:
9614 * ensure that FEXTNVM4 Beacon Duration is set correctly
9615 * on power up.
9616 * Set the Beacon Duration for I217 to 8 usec
9617 */
9618 if (sc->sc_type >= WM_T_PCH_LPT) {
9619 reg = CSR_READ(sc, WMREG_FEXTNVM4);
9620 reg &= ~FEXTNVM4_BEACON_DURATION;
9621 reg |= FEXTNVM4_BEACON_DURATION_8US;
9622 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
9623 }
9624
9625 /* Work-around I218 hang issue */
9626 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM) ||
9627 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V) ||
9628 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM3) ||
9629 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V3))
9630 wm_k1_workaround_lpt_lp(sc, link);
9631
9632 if (sc->sc_type >= WM_T_PCH_LPT) {
9633 /*
9634 * Set platform power management values for Latency
9635 * Tolerance Reporting (LTR)
9636 */
9637 wm_platform_pm_pch_lpt(sc,
9638 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
9639 }
9640
9641 /* Clear link partner's EEE ability */
9642 sc->eee_lp_ability = 0;
9643
9644 /* FEXTNVM6 K1-off workaround */
9645 if (sc->sc_type == WM_T_PCH_SPT) {
9646 reg = CSR_READ(sc, WMREG_FEXTNVM6);
9647 if (CSR_READ(sc, WMREG_PCIEANACFG) & FEXTNVM6_K1_OFF_ENABLE)
9648 reg |= FEXTNVM6_K1_OFF_ENABLE;
9649 else
9650 reg &= ~FEXTNVM6_K1_OFF_ENABLE;
9651 CSR_WRITE(sc, WMREG_FEXTNVM6, reg);
9652 }
9653
9654 if (!link)
9655 return;
9656
9657 switch (sc->sc_type) {
9658 case WM_T_PCH2:
9659 wm_k1_workaround_lv(sc);
9660 /* FALLTHROUGH */
9661 case WM_T_PCH:
9662 if (sc->sc_phytype == WMPHY_82578)
9663 wm_link_stall_workaround_hv(sc);
9664 break;
9665 default:
9666 break;
9667 }
9668
9669 /* Enable/Disable EEE after link up */
9670 if (sc->sc_phytype > WMPHY_82579)
9671 wm_set_eee_pchlan(sc);
9672 }
9673
9674 /*
9675 * wm_linkintr_tbi:
9676 *
9677 * Helper; handle link interrupts for TBI mode.
9678 */
9679 static void
9680 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr)
9681 {
9682 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9683 uint32_t status;
9684
9685 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
9686 __func__));
9687
9688 status = CSR_READ(sc, WMREG_STATUS);
9689 if (icr & ICR_LSC) {
9690 wm_check_for_link(sc);
9691 if (status & STATUS_LU) {
9692 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
9693 device_xname(sc->sc_dev),
9694 (status & STATUS_FD) ? "FDX" : "HDX"));
9695 /*
9696 * NOTE: CTRL will update TFCE and RFCE automatically,
9697 * so we should update sc->sc_ctrl
9698 */
9699
9700 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
9701 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
9702 sc->sc_fcrtl &= ~FCRTL_XONE;
9703 if (status & STATUS_FD)
9704 sc->sc_tctl |=
9705 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
9706 else
9707 sc->sc_tctl |=
9708 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
9709 if (sc->sc_ctrl & CTRL_TFCE)
9710 sc->sc_fcrtl |= FCRTL_XONE;
9711 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
9712 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
9713 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl);
9714 sc->sc_tbi_linkup = 1;
9715 if_link_state_change(ifp, LINK_STATE_UP);
9716 } else {
9717 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
9718 device_xname(sc->sc_dev)));
9719 sc->sc_tbi_linkup = 0;
9720 if_link_state_change(ifp, LINK_STATE_DOWN);
9721 }
9722 /* Update LED */
9723 wm_tbi_serdes_set_linkled(sc);
9724 } else if (icr & ICR_RXSEQ)
9725 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: Receive sequence error\n",
9726 device_xname(sc->sc_dev)));
9727 }
9728
9729 /*
9730 * wm_linkintr_serdes:
9731 *
9732 * Helper; handle link interrupts for TBI mode.
9733 */
9734 static void
9735 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr)
9736 {
9737 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9738 struct mii_data *mii = &sc->sc_mii;
9739 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
9740 uint32_t pcs_adv, pcs_lpab, reg;
9741
9742 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
9743 __func__));
9744
9745 if (icr & ICR_LSC) {
9746 /* Check PCS */
9747 reg = CSR_READ(sc, WMREG_PCS_LSTS);
9748 if ((reg & PCS_LSTS_LINKOK) != 0) {
9749 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up\n",
9750 device_xname(sc->sc_dev)));
9751 mii->mii_media_status |= IFM_ACTIVE;
9752 sc->sc_tbi_linkup = 1;
9753 if_link_state_change(ifp, LINK_STATE_UP);
9754 } else {
9755 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
9756 device_xname(sc->sc_dev)));
9757 mii->mii_media_status |= IFM_NONE;
9758 sc->sc_tbi_linkup = 0;
9759 if_link_state_change(ifp, LINK_STATE_DOWN);
9760 wm_tbi_serdes_set_linkled(sc);
9761 return;
9762 }
9763 mii->mii_media_active |= IFM_1000_SX;
9764 if ((reg & PCS_LSTS_FDX) != 0)
9765 mii->mii_media_active |= IFM_FDX;
9766 else
9767 mii->mii_media_active |= IFM_HDX;
9768 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
9769 /* Check flow */
9770 reg = CSR_READ(sc, WMREG_PCS_LSTS);
9771 if ((reg & PCS_LSTS_AN_COMP) == 0) {
9772 DPRINTF(sc, WM_DEBUG_LINK,
9773 ("XXX LINKOK but not ACOMP\n"));
9774 return;
9775 }
9776 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
9777 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
9778 DPRINTF(sc, WM_DEBUG_LINK,
9779 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab));
9780 if ((pcs_adv & TXCW_SYM_PAUSE)
9781 && (pcs_lpab & TXCW_SYM_PAUSE)) {
9782 mii->mii_media_active |= IFM_FLOW
9783 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
9784 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
9785 && (pcs_adv & TXCW_ASYM_PAUSE)
9786 && (pcs_lpab & TXCW_SYM_PAUSE)
9787 && (pcs_lpab & TXCW_ASYM_PAUSE))
9788 mii->mii_media_active |= IFM_FLOW
9789 | IFM_ETH_TXPAUSE;
9790 else if ((pcs_adv & TXCW_SYM_PAUSE)
9791 && (pcs_adv & TXCW_ASYM_PAUSE)
9792 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
9793 && (pcs_lpab & TXCW_ASYM_PAUSE))
9794 mii->mii_media_active |= IFM_FLOW
9795 | IFM_ETH_RXPAUSE;
9796 }
9797 /* Update LED */
9798 wm_tbi_serdes_set_linkled(sc);
9799 } else
9800 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: Receive sequence error\n",
9801 device_xname(sc->sc_dev)));
9802 }
9803
9804 /*
9805 * wm_linkintr:
9806 *
9807 * Helper; handle link interrupts.
9808 */
9809 static void
9810 wm_linkintr(struct wm_softc *sc, uint32_t icr)
9811 {
9812
9813 KASSERT(WM_CORE_LOCKED(sc));
9814
9815 if (sc->sc_flags & WM_F_HAS_MII)
9816 wm_linkintr_gmii(sc, icr);
9817 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES)
9818 && ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)))
9819 wm_linkintr_serdes(sc, icr);
9820 else
9821 wm_linkintr_tbi(sc, icr);
9822 }
9823
9824
9825 static inline void
9826 wm_sched_handle_queue(struct wm_softc *sc, struct wm_queue *wmq)
9827 {
9828
9829 if (wmq->wmq_txrx_use_workqueue)
9830 workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie, curcpu());
9831 else
9832 softint_schedule(wmq->wmq_si);
9833 }
9834
9835 static inline void
9836 wm_legacy_intr_disable(struct wm_softc *sc)
9837 {
9838
9839 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
9840 }
9841
9842 static inline void
9843 wm_legacy_intr_enable(struct wm_softc *sc)
9844 {
9845
9846 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
9847 }
9848
9849 /*
9850 * wm_intr_legacy:
9851 *
9852 * Interrupt service routine for INTx and MSI.
9853 */
9854 static int
9855 wm_intr_legacy(void *arg)
9856 {
9857 struct wm_softc *sc = arg;
9858 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9859 struct wm_queue *wmq = &sc->sc_queue[0];
9860 struct wm_txqueue *txq = &wmq->wmq_txq;
9861 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9862 u_int txlimit = sc->sc_tx_intr_process_limit;
9863 u_int rxlimit = sc->sc_rx_intr_process_limit;
9864 uint32_t icr, rndval = 0;
9865 bool more = false;
9866
9867 icr = CSR_READ(sc, WMREG_ICR);
9868 if ((icr & sc->sc_icr) == 0)
9869 return 0;
9870
9871 DPRINTF(sc, WM_DEBUG_TX,
9872 ("%s: INTx: got intr\n",device_xname(sc->sc_dev)));
9873 if (rndval == 0)
9874 rndval = icr;
9875
9876 mutex_enter(rxq->rxq_lock);
9877
9878 if (rxq->rxq_stopping) {
9879 mutex_exit(rxq->rxq_lock);
9880 return 1;
9881 }
9882
9883 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
9884 if (icr & (ICR_RXDMT0 | ICR_RXT0)) {
9885 DPRINTF(sc, WM_DEBUG_RX,
9886 ("%s: RX: got Rx intr 0x%08x\n",
9887 device_xname(sc->sc_dev),
9888 icr & (ICR_RXDMT0 | ICR_RXT0)));
9889 WM_Q_EVCNT_INCR(rxq, intr);
9890 }
9891 #endif
9892 /*
9893 * wm_rxeof() does *not* call upper layer functions directly,
9894 * as if_percpuq_enqueue() just call softint_schedule().
9895 * So, we can call wm_rxeof() in interrupt context.
9896 */
9897 more = wm_rxeof(rxq, rxlimit);
9898
9899 mutex_exit(rxq->rxq_lock);
9900 mutex_enter(txq->txq_lock);
9901
9902 if (txq->txq_stopping) {
9903 mutex_exit(txq->txq_lock);
9904 return 1;
9905 }
9906
9907 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
9908 if (icr & ICR_TXDW) {
9909 DPRINTF(sc, WM_DEBUG_TX,
9910 ("%s: TX: got TXDW interrupt\n",
9911 device_xname(sc->sc_dev)));
9912 WM_Q_EVCNT_INCR(txq, txdw);
9913 }
9914 #endif
9915 more |= wm_txeof(txq, txlimit);
9916 if (!IF_IS_EMPTY(&ifp->if_snd))
9917 more = true;
9918
9919 mutex_exit(txq->txq_lock);
9920 WM_CORE_LOCK(sc);
9921
9922 if (sc->sc_core_stopping) {
9923 WM_CORE_UNLOCK(sc);
9924 return 1;
9925 }
9926
9927 if (icr & (ICR_LSC | ICR_RXSEQ)) {
9928 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
9929 wm_linkintr(sc, icr);
9930 }
9931 if ((icr & ICR_GPI(0)) != 0)
9932 device_printf(sc->sc_dev, "got module interrupt\n");
9933
9934 WM_CORE_UNLOCK(sc);
9935
9936 if (icr & ICR_RXO) {
9937 #if defined(WM_DEBUG)
9938 log(LOG_WARNING, "%s: Receive overrun\n",
9939 device_xname(sc->sc_dev));
9940 #endif /* defined(WM_DEBUG) */
9941 }
9942
9943 rnd_add_uint32(&sc->rnd_source, rndval);
9944
9945 if (more) {
9946 /* Try to get more packets going. */
9947 wm_legacy_intr_disable(sc);
9948 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue;
9949 wm_sched_handle_queue(sc, wmq);
9950 }
9951
9952 return 1;
9953 }
9954
9955 static inline void
9956 wm_txrxintr_disable(struct wm_queue *wmq)
9957 {
9958 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
9959
9960 if (__predict_false(!wm_is_using_msix(sc))) {
9961 return wm_legacy_intr_disable(sc);
9962 }
9963
9964 if (sc->sc_type == WM_T_82574)
9965 CSR_WRITE(sc, WMREG_IMC,
9966 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id));
9967 else if (sc->sc_type == WM_T_82575)
9968 CSR_WRITE(sc, WMREG_EIMC,
9969 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
9970 else
9971 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx);
9972 }
9973
9974 static inline void
9975 wm_txrxintr_enable(struct wm_queue *wmq)
9976 {
9977 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
9978
9979 wm_itrs_calculate(sc, wmq);
9980
9981 if (__predict_false(!wm_is_using_msix(sc))) {
9982 return wm_legacy_intr_enable(sc);
9983 }
9984
9985 /*
9986 * ICR_OTHER which is disabled in wm_linkintr_msix() is enabled here.
9987 * There is no need to care about which of RXQ(0) and RXQ(1) enable
9988 * ICR_OTHER in first, because each RXQ/TXQ interrupt is disabled
9989 * while each wm_handle_queue(wmq) is runnig.
9990 */
9991 if (sc->sc_type == WM_T_82574)
9992 CSR_WRITE(sc, WMREG_IMS,
9993 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id) | ICR_OTHER);
9994 else if (sc->sc_type == WM_T_82575)
9995 CSR_WRITE(sc, WMREG_EIMS,
9996 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
9997 else
9998 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx);
9999 }
10000
10001 static int
10002 wm_txrxintr_msix(void *arg)
10003 {
10004 struct wm_queue *wmq = arg;
10005 struct wm_txqueue *txq = &wmq->wmq_txq;
10006 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
10007 struct wm_softc *sc = txq->txq_sc;
10008 u_int txlimit = sc->sc_tx_intr_process_limit;
10009 u_int rxlimit = sc->sc_rx_intr_process_limit;
10010 bool txmore;
10011 bool rxmore;
10012
10013 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id);
10014
10015 DPRINTF(sc, WM_DEBUG_TX,
10016 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev)));
10017
10018 wm_txrxintr_disable(wmq);
10019
10020 mutex_enter(txq->txq_lock);
10021
10022 if (txq->txq_stopping) {
10023 mutex_exit(txq->txq_lock);
10024 return 1;
10025 }
10026
10027 WM_Q_EVCNT_INCR(txq, txdw);
10028 txmore = wm_txeof(txq, txlimit);
10029 /* wm_deferred start() is done in wm_handle_queue(). */
10030 mutex_exit(txq->txq_lock);
10031
10032 DPRINTF(sc, WM_DEBUG_RX,
10033 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev)));
10034 mutex_enter(rxq->rxq_lock);
10035
10036 if (rxq->rxq_stopping) {
10037 mutex_exit(rxq->rxq_lock);
10038 return 1;
10039 }
10040
10041 WM_Q_EVCNT_INCR(rxq, intr);
10042 rxmore = wm_rxeof(rxq, rxlimit);
10043 mutex_exit(rxq->rxq_lock);
10044
10045 wm_itrs_writereg(sc, wmq);
10046
10047 if (txmore || rxmore) {
10048 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue;
10049 wm_sched_handle_queue(sc, wmq);
10050 } else
10051 wm_txrxintr_enable(wmq);
10052
10053 return 1;
10054 }
10055
10056 static void
10057 wm_handle_queue(void *arg)
10058 {
10059 struct wm_queue *wmq = arg;
10060 struct wm_txqueue *txq = &wmq->wmq_txq;
10061 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
10062 struct wm_softc *sc = txq->txq_sc;
10063 u_int txlimit = sc->sc_tx_process_limit;
10064 u_int rxlimit = sc->sc_rx_process_limit;
10065 bool txmore;
10066 bool rxmore;
10067
10068 mutex_enter(txq->txq_lock);
10069 if (txq->txq_stopping) {
10070 mutex_exit(txq->txq_lock);
10071 return;
10072 }
10073 txmore = wm_txeof(txq, txlimit);
10074 wm_deferred_start_locked(txq);
10075 mutex_exit(txq->txq_lock);
10076
10077 mutex_enter(rxq->rxq_lock);
10078 if (rxq->rxq_stopping) {
10079 mutex_exit(rxq->rxq_lock);
10080 return;
10081 }
10082 WM_Q_EVCNT_INCR(rxq, defer);
10083 rxmore = wm_rxeof(rxq, rxlimit);
10084 mutex_exit(rxq->rxq_lock);
10085
10086 if (txmore || rxmore) {
10087 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue;
10088 wm_sched_handle_queue(sc, wmq);
10089 } else
10090 wm_txrxintr_enable(wmq);
10091 }
10092
10093 static void
10094 wm_handle_queue_work(struct work *wk, void *context)
10095 {
10096 struct wm_queue *wmq = container_of(wk, struct wm_queue, wmq_cookie);
10097
10098 /*
10099 * "enqueued flag" is not required here.
10100 */
10101 wm_handle_queue(wmq);
10102 }
10103
10104 /*
10105 * wm_linkintr_msix:
10106 *
10107 * Interrupt service routine for link status change for MSI-X.
10108 */
10109 static int
10110 wm_linkintr_msix(void *arg)
10111 {
10112 struct wm_softc *sc = arg;
10113 uint32_t reg;
10114 bool has_rxo;
10115
10116 reg = CSR_READ(sc, WMREG_ICR);
10117 WM_CORE_LOCK(sc);
10118 DPRINTF(sc, WM_DEBUG_LINK,
10119 ("%s: LINK: got link intr. ICR = %08x\n",
10120 device_xname(sc->sc_dev), reg));
10121
10122 if (sc->sc_core_stopping)
10123 goto out;
10124
10125 if ((reg & ICR_LSC) != 0) {
10126 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
10127 wm_linkintr(sc, ICR_LSC);
10128 }
10129 if ((reg & ICR_GPI(0)) != 0)
10130 device_printf(sc->sc_dev, "got module interrupt\n");
10131
10132 /*
10133 * XXX 82574 MSI-X mode workaround
10134 *
10135 * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER
10136 * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor
10137 * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1)
10138 * interrupts by writing WMREG_ICS to process receive packets.
10139 */
10140 if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) {
10141 #if defined(WM_DEBUG)
10142 log(LOG_WARNING, "%s: Receive overrun\n",
10143 device_xname(sc->sc_dev));
10144 #endif /* defined(WM_DEBUG) */
10145
10146 has_rxo = true;
10147 /*
10148 * The RXO interrupt is very high rate when receive traffic is
10149 * high rate. We use polling mode for ICR_OTHER like Tx/Rx
10150 * interrupts. ICR_OTHER will be enabled at the end of
10151 * wm_txrxintr_msix() which is kicked by both ICR_RXQ(0) and
10152 * ICR_RXQ(1) interrupts.
10153 */
10154 CSR_WRITE(sc, WMREG_IMC, ICR_OTHER);
10155
10156 CSR_WRITE(sc, WMREG_ICS, ICR_RXQ(0) | ICR_RXQ(1));
10157 }
10158
10159
10160
10161 out:
10162 WM_CORE_UNLOCK(sc);
10163
10164 if (sc->sc_type == WM_T_82574) {
10165 if (!has_rxo)
10166 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC);
10167 else
10168 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
10169 } else if (sc->sc_type == WM_T_82575)
10170 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER);
10171 else
10172 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx);
10173
10174 return 1;
10175 }
10176
10177 /*
10178 * Media related.
10179 * GMII, SGMII, TBI (and SERDES)
10180 */
10181
10182 /* Common */
10183
10184 /*
10185 * wm_tbi_serdes_set_linkled:
10186 *
10187 * Update the link LED on TBI and SERDES devices.
10188 */
10189 static void
10190 wm_tbi_serdes_set_linkled(struct wm_softc *sc)
10191 {
10192
10193 if (sc->sc_tbi_linkup)
10194 sc->sc_ctrl |= CTRL_SWDPIN(0);
10195 else
10196 sc->sc_ctrl &= ~CTRL_SWDPIN(0);
10197
10198 /* 82540 or newer devices are active low */
10199 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0;
10200
10201 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10202 }
10203
10204 /* GMII related */
10205
10206 /*
10207 * wm_gmii_reset:
10208 *
10209 * Reset the PHY.
10210 */
10211 static void
10212 wm_gmii_reset(struct wm_softc *sc)
10213 {
10214 uint32_t reg;
10215 int rv;
10216
10217 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
10218 device_xname(sc->sc_dev), __func__));
10219
10220 rv = sc->phy.acquire(sc);
10221 if (rv != 0) {
10222 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
10223 __func__);
10224 return;
10225 }
10226
10227 switch (sc->sc_type) {
10228 case WM_T_82542_2_0:
10229 case WM_T_82542_2_1:
10230 /* null */
10231 break;
10232 case WM_T_82543:
10233 /*
10234 * With 82543, we need to force speed and duplex on the MAC
10235 * equal to what the PHY speed and duplex configuration is.
10236 * In addition, we need to perform a hardware reset on the PHY
10237 * to take it out of reset.
10238 */
10239 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
10240 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10241
10242 /* The PHY reset pin is active-low. */
10243 reg = CSR_READ(sc, WMREG_CTRL_EXT);
10244 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
10245 CTRL_EXT_SWDPIN(4));
10246 reg |= CTRL_EXT_SWDPIO(4);
10247
10248 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
10249 CSR_WRITE_FLUSH(sc);
10250 delay(10*1000);
10251
10252 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
10253 CSR_WRITE_FLUSH(sc);
10254 delay(150);
10255 #if 0
10256 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
10257 #endif
10258 delay(20*1000); /* XXX extra delay to get PHY ID? */
10259 break;
10260 case WM_T_82544: /* Reset 10000us */
10261 case WM_T_82540:
10262 case WM_T_82545:
10263 case WM_T_82545_3:
10264 case WM_T_82546:
10265 case WM_T_82546_3:
10266 case WM_T_82541:
10267 case WM_T_82541_2:
10268 case WM_T_82547:
10269 case WM_T_82547_2:
10270 case WM_T_82571: /* Reset 100us */
10271 case WM_T_82572:
10272 case WM_T_82573:
10273 case WM_T_82574:
10274 case WM_T_82575:
10275 case WM_T_82576:
10276 case WM_T_82580:
10277 case WM_T_I350:
10278 case WM_T_I354:
10279 case WM_T_I210:
10280 case WM_T_I211:
10281 case WM_T_82583:
10282 case WM_T_80003:
10283 /* Generic reset */
10284 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
10285 CSR_WRITE_FLUSH(sc);
10286 delay(20000);
10287 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10288 CSR_WRITE_FLUSH(sc);
10289 delay(20000);
10290
10291 if ((sc->sc_type == WM_T_82541)
10292 || (sc->sc_type == WM_T_82541_2)
10293 || (sc->sc_type == WM_T_82547)
10294 || (sc->sc_type == WM_T_82547_2)) {
10295 /* Workaround for igp are done in igp_reset() */
10296 /* XXX add code to set LED after phy reset */
10297 }
10298 break;
10299 case WM_T_ICH8:
10300 case WM_T_ICH9:
10301 case WM_T_ICH10:
10302 case WM_T_PCH:
10303 case WM_T_PCH2:
10304 case WM_T_PCH_LPT:
10305 case WM_T_PCH_SPT:
10306 case WM_T_PCH_CNP:
10307 /* Generic reset */
10308 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
10309 CSR_WRITE_FLUSH(sc);
10310 delay(100);
10311 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10312 CSR_WRITE_FLUSH(sc);
10313 delay(150);
10314 break;
10315 default:
10316 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
10317 __func__);
10318 break;
10319 }
10320
10321 sc->phy.release(sc);
10322
10323 /* get_cfg_done */
10324 wm_get_cfg_done(sc);
10325
10326 /* Extra setup */
10327 switch (sc->sc_type) {
10328 case WM_T_82542_2_0:
10329 case WM_T_82542_2_1:
10330 case WM_T_82543:
10331 case WM_T_82544:
10332 case WM_T_82540:
10333 case WM_T_82545:
10334 case WM_T_82545_3:
10335 case WM_T_82546:
10336 case WM_T_82546_3:
10337 case WM_T_82541_2:
10338 case WM_T_82547_2:
10339 case WM_T_82571:
10340 case WM_T_82572:
10341 case WM_T_82573:
10342 case WM_T_82574:
10343 case WM_T_82583:
10344 case WM_T_82575:
10345 case WM_T_82576:
10346 case WM_T_82580:
10347 case WM_T_I350:
10348 case WM_T_I354:
10349 case WM_T_I210:
10350 case WM_T_I211:
10351 case WM_T_80003:
10352 /* Null */
10353 break;
10354 case WM_T_82541:
10355 case WM_T_82547:
10356 /* XXX Configure actively LED after PHY reset */
10357 break;
10358 case WM_T_ICH8:
10359 case WM_T_ICH9:
10360 case WM_T_ICH10:
10361 case WM_T_PCH:
10362 case WM_T_PCH2:
10363 case WM_T_PCH_LPT:
10364 case WM_T_PCH_SPT:
10365 case WM_T_PCH_CNP:
10366 wm_phy_post_reset(sc);
10367 break;
10368 default:
10369 panic("%s: unknown type\n", __func__);
10370 break;
10371 }
10372 }
10373
10374 /*
10375 * Setup sc_phytype and mii_{read|write}reg.
10376 *
10377 * To identify PHY type, correct read/write function should be selected.
10378 * To select correct read/write function, PCI ID or MAC type are required
10379 * without accessing PHY registers.
10380 *
10381 * On the first call of this function, PHY ID is not known yet. Check
10382 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the
10383 * result might be incorrect.
10384 *
10385 * In the second call, PHY OUI and model is used to identify PHY type.
10386 * It might not be perfect because of the lack of compared entry, but it
10387 * would be better than the first call.
10388 *
10389 * If the detected new result and previous assumption is different,
10390 * diagnous message will be printed.
10391 */
10392 static void
10393 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui,
10394 uint16_t phy_model)
10395 {
10396 device_t dev = sc->sc_dev;
10397 struct mii_data *mii = &sc->sc_mii;
10398 uint16_t new_phytype = WMPHY_UNKNOWN;
10399 uint16_t doubt_phytype = WMPHY_UNKNOWN;
10400 mii_readreg_t new_readreg;
10401 mii_writereg_t new_writereg;
10402 bool dodiag = true;
10403
10404 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
10405 device_xname(sc->sc_dev), __func__));
10406
10407 /*
10408 * 1000BASE-T SFP uses SGMII and the first asumed PHY type is always
10409 * incorrect. So don't print diag output when it's 2nd call.
10410 */
10411 if ((sc->sc_sfptype != 0) && (phy_oui == 0) && (phy_model == 0))
10412 dodiag = false;
10413
10414 if (mii->mii_readreg == NULL) {
10415 /*
10416 * This is the first call of this function. For ICH and PCH
10417 * variants, it's difficult to determine the PHY access method
10418 * by sc_type, so use the PCI product ID for some devices.
10419 */
10420
10421 switch (sc->sc_pcidevid) {
10422 case PCI_PRODUCT_INTEL_PCH_M_LM:
10423 case PCI_PRODUCT_INTEL_PCH_M_LC:
10424 /* 82577 */
10425 new_phytype = WMPHY_82577;
10426 break;
10427 case PCI_PRODUCT_INTEL_PCH_D_DM:
10428 case PCI_PRODUCT_INTEL_PCH_D_DC:
10429 /* 82578 */
10430 new_phytype = WMPHY_82578;
10431 break;
10432 case PCI_PRODUCT_INTEL_PCH2_LV_LM:
10433 case PCI_PRODUCT_INTEL_PCH2_LV_V:
10434 /* 82579 */
10435 new_phytype = WMPHY_82579;
10436 break;
10437 case PCI_PRODUCT_INTEL_82801H_82567V_3:
10438 case PCI_PRODUCT_INTEL_82801I_BM:
10439 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */
10440 case PCI_PRODUCT_INTEL_82801J_R_BM_LM:
10441 case PCI_PRODUCT_INTEL_82801J_R_BM_LF:
10442 case PCI_PRODUCT_INTEL_82801J_D_BM_LM:
10443 case PCI_PRODUCT_INTEL_82801J_D_BM_LF:
10444 case PCI_PRODUCT_INTEL_82801J_R_BM_V:
10445 /* ICH8, 9, 10 with 82567 */
10446 new_phytype = WMPHY_BM;
10447 break;
10448 default:
10449 break;
10450 }
10451 } else {
10452 /* It's not the first call. Use PHY OUI and model */
10453 switch (phy_oui) {
10454 case MII_OUI_ATTANSIC: /* XXX ??? */
10455 switch (phy_model) {
10456 case 0x0004: /* XXX */
10457 new_phytype = WMPHY_82578;
10458 break;
10459 default:
10460 break;
10461 }
10462 break;
10463 case MII_OUI_xxMARVELL:
10464 switch (phy_model) {
10465 case MII_MODEL_xxMARVELL_I210:
10466 new_phytype = WMPHY_I210;
10467 break;
10468 case MII_MODEL_xxMARVELL_E1011:
10469 case MII_MODEL_xxMARVELL_E1000_3:
10470 case MII_MODEL_xxMARVELL_E1000_5:
10471 case MII_MODEL_xxMARVELL_E1112:
10472 new_phytype = WMPHY_M88;
10473 break;
10474 case MII_MODEL_xxMARVELL_E1149:
10475 new_phytype = WMPHY_BM;
10476 break;
10477 case MII_MODEL_xxMARVELL_E1111:
10478 case MII_MODEL_xxMARVELL_I347:
10479 case MII_MODEL_xxMARVELL_E1512:
10480 case MII_MODEL_xxMARVELL_E1340M:
10481 case MII_MODEL_xxMARVELL_E1543:
10482 new_phytype = WMPHY_M88;
10483 break;
10484 case MII_MODEL_xxMARVELL_I82563:
10485 new_phytype = WMPHY_GG82563;
10486 break;
10487 default:
10488 break;
10489 }
10490 break;
10491 case MII_OUI_INTEL:
10492 switch (phy_model) {
10493 case MII_MODEL_INTEL_I82577:
10494 new_phytype = WMPHY_82577;
10495 break;
10496 case MII_MODEL_INTEL_I82579:
10497 new_phytype = WMPHY_82579;
10498 break;
10499 case MII_MODEL_INTEL_I217:
10500 new_phytype = WMPHY_I217;
10501 break;
10502 case MII_MODEL_INTEL_I82580:
10503 new_phytype = WMPHY_82580;
10504 break;
10505 case MII_MODEL_INTEL_I350:
10506 new_phytype = WMPHY_I350;
10507 break;
10508 break;
10509 default:
10510 break;
10511 }
10512 break;
10513 case MII_OUI_yyINTEL:
10514 switch (phy_model) {
10515 case MII_MODEL_yyINTEL_I82562G:
10516 case MII_MODEL_yyINTEL_I82562EM:
10517 case MII_MODEL_yyINTEL_I82562ET:
10518 new_phytype = WMPHY_IFE;
10519 break;
10520 case MII_MODEL_yyINTEL_IGP01E1000:
10521 new_phytype = WMPHY_IGP;
10522 break;
10523 case MII_MODEL_yyINTEL_I82566:
10524 new_phytype = WMPHY_IGP_3;
10525 break;
10526 default:
10527 break;
10528 }
10529 break;
10530 default:
10531 break;
10532 }
10533
10534 if (dodiag) {
10535 if (new_phytype == WMPHY_UNKNOWN)
10536 aprint_verbose_dev(dev,
10537 "%s: Unknown PHY model. OUI=%06x, "
10538 "model=%04x\n", __func__, phy_oui,
10539 phy_model);
10540
10541 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10542 && (sc->sc_phytype != new_phytype)) {
10543 aprint_error_dev(dev, "Previously assumed PHY "
10544 "type(%u) was incorrect. PHY type from PHY"
10545 "ID = %u\n", sc->sc_phytype, new_phytype);
10546 }
10547 }
10548 }
10549
10550 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */
10551 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) {
10552 /* SGMII */
10553 new_readreg = wm_sgmii_readreg;
10554 new_writereg = wm_sgmii_writereg;
10555 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
10556 /* BM2 (phyaddr == 1) */
10557 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10558 && (new_phytype != WMPHY_BM)
10559 && (new_phytype != WMPHY_UNKNOWN))
10560 doubt_phytype = new_phytype;
10561 new_phytype = WMPHY_BM;
10562 new_readreg = wm_gmii_bm_readreg;
10563 new_writereg = wm_gmii_bm_writereg;
10564 } else if (sc->sc_type >= WM_T_PCH) {
10565 /* All PCH* use _hv_ */
10566 new_readreg = wm_gmii_hv_readreg;
10567 new_writereg = wm_gmii_hv_writereg;
10568 } else if (sc->sc_type >= WM_T_ICH8) {
10569 /* non-82567 ICH8, 9 and 10 */
10570 new_readreg = wm_gmii_i82544_readreg;
10571 new_writereg = wm_gmii_i82544_writereg;
10572 } else if (sc->sc_type >= WM_T_80003) {
10573 /* 80003 */
10574 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10575 && (new_phytype != WMPHY_GG82563)
10576 && (new_phytype != WMPHY_UNKNOWN))
10577 doubt_phytype = new_phytype;
10578 new_phytype = WMPHY_GG82563;
10579 new_readreg = wm_gmii_i80003_readreg;
10580 new_writereg = wm_gmii_i80003_writereg;
10581 } else if (sc->sc_type >= WM_T_I210) {
10582 /* I210 and I211 */
10583 if ((sc->sc_phytype != WMPHY_UNKNOWN)
10584 && (new_phytype != WMPHY_I210)
10585 && (new_phytype != WMPHY_UNKNOWN))
10586 doubt_phytype = new_phytype;
10587 new_phytype = WMPHY_I210;
10588 new_readreg = wm_gmii_gs40g_readreg;
10589 new_writereg = wm_gmii_gs40g_writereg;
10590 } else if (sc->sc_type >= WM_T_82580) {
10591 /* 82580, I350 and I354 */
10592 new_readreg = wm_gmii_82580_readreg;
10593 new_writereg = wm_gmii_82580_writereg;
10594 } else if (sc->sc_type >= WM_T_82544) {
10595 /* 82544, 0, [56], [17], 8257[1234] and 82583 */
10596 new_readreg = wm_gmii_i82544_readreg;
10597 new_writereg = wm_gmii_i82544_writereg;
10598 } else {
10599 new_readreg = wm_gmii_i82543_readreg;
10600 new_writereg = wm_gmii_i82543_writereg;
10601 }
10602
10603 if (new_phytype == WMPHY_BM) {
10604 /* All BM use _bm_ */
10605 new_readreg = wm_gmii_bm_readreg;
10606 new_writereg = wm_gmii_bm_writereg;
10607 }
10608 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_CNP)) {
10609 /* All PCH* use _hv_ */
10610 new_readreg = wm_gmii_hv_readreg;
10611 new_writereg = wm_gmii_hv_writereg;
10612 }
10613
10614 /* Diag output */
10615 if (dodiag) {
10616 if (doubt_phytype != WMPHY_UNKNOWN)
10617 aprint_error_dev(dev, "Assumed new PHY type was "
10618 "incorrect. old = %u, new = %u\n", sc->sc_phytype,
10619 new_phytype);
10620 else if ((sc->sc_phytype != WMPHY_UNKNOWN)
10621 && (sc->sc_phytype != new_phytype))
10622 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
10623 "was incorrect. New PHY type = %u\n",
10624 sc->sc_phytype, new_phytype);
10625
10626 if ((mii->mii_readreg != NULL) &&
10627 (new_phytype == WMPHY_UNKNOWN))
10628 aprint_error_dev(dev, "PHY type is still unknown.\n");
10629
10630 if ((mii->mii_readreg != NULL) &&
10631 (mii->mii_readreg != new_readreg))
10632 aprint_error_dev(dev, "Previously assumed PHY "
10633 "read/write function was incorrect.\n");
10634 }
10635
10636 /* Update now */
10637 sc->sc_phytype = new_phytype;
10638 mii->mii_readreg = new_readreg;
10639 mii->mii_writereg = new_writereg;
10640 if (new_readreg == wm_gmii_hv_readreg) {
10641 sc->phy.readreg_locked = wm_gmii_hv_readreg_locked;
10642 sc->phy.writereg_locked = wm_gmii_hv_writereg_locked;
10643 } else if (new_readreg == wm_sgmii_readreg) {
10644 sc->phy.readreg_locked = wm_sgmii_readreg_locked;
10645 sc->phy.writereg_locked = wm_sgmii_writereg_locked;
10646 } else if (new_readreg == wm_gmii_i82544_readreg) {
10647 sc->phy.readreg_locked = wm_gmii_i82544_readreg_locked;
10648 sc->phy.writereg_locked = wm_gmii_i82544_writereg_locked;
10649 }
10650 }
10651
10652 /*
10653 * wm_get_phy_id_82575:
10654 *
10655 * Return PHY ID. Return -1 if it failed.
10656 */
10657 static int
10658 wm_get_phy_id_82575(struct wm_softc *sc)
10659 {
10660 uint32_t reg;
10661 int phyid = -1;
10662
10663 /* XXX */
10664 if ((sc->sc_flags & WM_F_SGMII) == 0)
10665 return -1;
10666
10667 if (wm_sgmii_uses_mdio(sc)) {
10668 switch (sc->sc_type) {
10669 case WM_T_82575:
10670 case WM_T_82576:
10671 reg = CSR_READ(sc, WMREG_MDIC);
10672 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT;
10673 break;
10674 case WM_T_82580:
10675 case WM_T_I350:
10676 case WM_T_I354:
10677 case WM_T_I210:
10678 case WM_T_I211:
10679 reg = CSR_READ(sc, WMREG_MDICNFG);
10680 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT;
10681 break;
10682 default:
10683 return -1;
10684 }
10685 }
10686
10687 return phyid;
10688 }
10689
10690 /*
10691 * wm_gmii_mediainit:
10692 *
10693 * Initialize media for use on 1000BASE-T devices.
10694 */
10695 static void
10696 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid)
10697 {
10698 device_t dev = sc->sc_dev;
10699 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
10700 struct mii_data *mii = &sc->sc_mii;
10701
10702 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n",
10703 device_xname(sc->sc_dev), __func__));
10704
10705 /* We have GMII. */
10706 sc->sc_flags |= WM_F_HAS_MII;
10707
10708 if (sc->sc_type == WM_T_80003)
10709 sc->sc_tipg = TIPG_1000T_80003_DFLT;
10710 else
10711 sc->sc_tipg = TIPG_1000T_DFLT;
10712
10713 /*
10714 * Let the chip set speed/duplex on its own based on
10715 * signals from the PHY.
10716 * XXXbouyer - I'm not sure this is right for the 80003,
10717 * the em driver only sets CTRL_SLU here - but it seems to work.
10718 */
10719 sc->sc_ctrl |= CTRL_SLU;
10720 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10721
10722 /* Initialize our media structures and probe the GMII. */
10723 mii->mii_ifp = ifp;
10724
10725 mii->mii_statchg = wm_gmii_statchg;
10726
10727 /* get PHY control from SMBus to PCIe */
10728 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
10729 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
10730 || (sc->sc_type == WM_T_PCH_CNP))
10731 wm_init_phy_workarounds_pchlan(sc);
10732
10733 wm_gmii_reset(sc);
10734
10735 sc->sc_ethercom.ec_mii = &sc->sc_mii;
10736 ifmedia_init_with_lock(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange,
10737 wm_gmii_mediastatus, sc->sc_core_lock);
10738
10739 /* Setup internal SGMII PHY for SFP */
10740 wm_sgmii_sfp_preconfig(sc);
10741
10742 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
10743 || (sc->sc_type == WM_T_82580)
10744 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
10745 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) {
10746 if ((sc->sc_flags & WM_F_SGMII) == 0) {
10747 /* Attach only one port */
10748 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1,
10749 MII_OFFSET_ANY, MIIF_DOPAUSE);
10750 } else {
10751 int i, id;
10752 uint32_t ctrl_ext;
10753
10754 id = wm_get_phy_id_82575(sc);
10755 if (id != -1) {
10756 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff,
10757 id, MII_OFFSET_ANY, MIIF_DOPAUSE);
10758 }
10759 if ((id == -1)
10760 || (LIST_FIRST(&mii->mii_phys) == NULL)) {
10761 /* Power on sgmii phy if it is disabled */
10762 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
10763 CSR_WRITE(sc, WMREG_CTRL_EXT,
10764 ctrl_ext &~ CTRL_EXT_SWDPIN(3));
10765 CSR_WRITE_FLUSH(sc);
10766 delay(300*1000); /* XXX too long */
10767
10768 /*
10769 * From 1 to 8.
10770 *
10771 * I2C access fails with I2C register's ERROR
10772 * bit set, so prevent error message while
10773 * scanning.
10774 */
10775 sc->phy.no_errprint = true;
10776 for (i = 1; i < 8; i++)
10777 mii_attach(sc->sc_dev, &sc->sc_mii,
10778 0xffffffff, i, MII_OFFSET_ANY,
10779 MIIF_DOPAUSE);
10780 sc->phy.no_errprint = false;
10781
10782 /* Restore previous sfp cage power state */
10783 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
10784 }
10785 }
10786 } else
10787 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
10788 MII_OFFSET_ANY, MIIF_DOPAUSE);
10789
10790 /*
10791 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call
10792 * wm_set_mdio_slow_mode_hv() for a workaround and retry.
10793 */
10794 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
10795 || (sc->sc_type == WM_T_PCH_SPT)
10796 || (sc->sc_type == WM_T_PCH_CNP))
10797 && (LIST_FIRST(&mii->mii_phys) == NULL)) {
10798 wm_set_mdio_slow_mode_hv(sc);
10799 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
10800 MII_OFFSET_ANY, MIIF_DOPAUSE);
10801 }
10802
10803 /*
10804 * (For ICH8 variants)
10805 * If PHY detection failed, use BM's r/w function and retry.
10806 */
10807 if (LIST_FIRST(&mii->mii_phys) == NULL) {
10808 /* if failed, retry with *_bm_* */
10809 aprint_verbose_dev(dev, "Assumed PHY access function "
10810 "(type = %d) might be incorrect. Use BM and retry.\n",
10811 sc->sc_phytype);
10812 sc->sc_phytype = WMPHY_BM;
10813 mii->mii_readreg = wm_gmii_bm_readreg;
10814 mii->mii_writereg = wm_gmii_bm_writereg;
10815
10816 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
10817 MII_OFFSET_ANY, MIIF_DOPAUSE);
10818 }
10819
10820 if (LIST_FIRST(&mii->mii_phys) == NULL) {
10821 /* Any PHY wasn't find */
10822 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
10823 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
10824 sc->sc_phytype = WMPHY_NONE;
10825 } else {
10826 struct mii_softc *child = LIST_FIRST(&mii->mii_phys);
10827
10828 /*
10829 * PHY Found! Check PHY type again by the second call of
10830 * wm_gmii_setup_phytype.
10831 */
10832 wm_gmii_setup_phytype(sc, child->mii_mpd_oui,
10833 child->mii_mpd_model);
10834
10835 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
10836 }
10837 }
10838
10839 /*
10840 * wm_gmii_mediachange: [ifmedia interface function]
10841 *
10842 * Set hardware to newly-selected media on a 1000BASE-T device.
10843 */
10844 static int
10845 wm_gmii_mediachange(struct ifnet *ifp)
10846 {
10847 struct wm_softc *sc = ifp->if_softc;
10848 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
10849 uint32_t reg;
10850 int rc;
10851
10852 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n",
10853 device_xname(sc->sc_dev), __func__));
10854 if ((ifp->if_flags & IFF_UP) == 0)
10855 return 0;
10856
10857 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */
10858 if ((sc->sc_type == WM_T_82580)
10859 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210)
10860 || (sc->sc_type == WM_T_I211)) {
10861 reg = CSR_READ(sc, WMREG_PHPM);
10862 reg &= ~PHPM_GO_LINK_D;
10863 CSR_WRITE(sc, WMREG_PHPM, reg);
10864 }
10865
10866 /* Disable D0 LPLU. */
10867 wm_lplu_d0_disable(sc);
10868
10869 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
10870 sc->sc_ctrl |= CTRL_SLU;
10871 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
10872 || (sc->sc_type > WM_T_82543)) {
10873 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
10874 } else {
10875 sc->sc_ctrl &= ~CTRL_ASDE;
10876 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
10877 if (ife->ifm_media & IFM_FDX)
10878 sc->sc_ctrl |= CTRL_FD;
10879 switch (IFM_SUBTYPE(ife->ifm_media)) {
10880 case IFM_10_T:
10881 sc->sc_ctrl |= CTRL_SPEED_10;
10882 break;
10883 case IFM_100_TX:
10884 sc->sc_ctrl |= CTRL_SPEED_100;
10885 break;
10886 case IFM_1000_T:
10887 sc->sc_ctrl |= CTRL_SPEED_1000;
10888 break;
10889 case IFM_NONE:
10890 /* There is no specific setting for IFM_NONE */
10891 break;
10892 default:
10893 panic("wm_gmii_mediachange: bad media 0x%x",
10894 ife->ifm_media);
10895 }
10896 }
10897 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10898 CSR_WRITE_FLUSH(sc);
10899
10900 if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211))
10901 wm_serdes_mediachange(ifp);
10902
10903 if (sc->sc_type <= WM_T_82543)
10904 wm_gmii_reset(sc);
10905 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)
10906 && ((sc->sc_flags & WM_F_SGMII) != 0)) {
10907 /* allow time for SFP cage time to power up phy */
10908 delay(300 * 1000);
10909 wm_gmii_reset(sc);
10910 }
10911
10912 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
10913 return 0;
10914 return rc;
10915 }
10916
10917 /*
10918 * wm_gmii_mediastatus: [ifmedia interface function]
10919 *
10920 * Get the current interface media status on a 1000BASE-T device.
10921 */
10922 static void
10923 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
10924 {
10925 struct wm_softc *sc = ifp->if_softc;
10926
10927 ether_mediastatus(ifp, ifmr);
10928 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
10929 | sc->sc_flowflags;
10930 }
10931
10932 #define MDI_IO CTRL_SWDPIN(2)
10933 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */
10934 #define MDI_CLK CTRL_SWDPIN(3)
10935
10936 static void
10937 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
10938 {
10939 uint32_t i, v;
10940
10941 v = CSR_READ(sc, WMREG_CTRL);
10942 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
10943 v |= MDI_DIR | CTRL_SWDPIO(3);
10944
10945 for (i = __BIT(nbits - 1); i != 0; i >>= 1) {
10946 if (data & i)
10947 v |= MDI_IO;
10948 else
10949 v &= ~MDI_IO;
10950 CSR_WRITE(sc, WMREG_CTRL, v);
10951 CSR_WRITE_FLUSH(sc);
10952 delay(10);
10953 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10954 CSR_WRITE_FLUSH(sc);
10955 delay(10);
10956 CSR_WRITE(sc, WMREG_CTRL, v);
10957 CSR_WRITE_FLUSH(sc);
10958 delay(10);
10959 }
10960 }
10961
10962 static uint16_t
10963 wm_i82543_mii_recvbits(struct wm_softc *sc)
10964 {
10965 uint32_t v, i;
10966 uint16_t data = 0;
10967
10968 v = CSR_READ(sc, WMREG_CTRL);
10969 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
10970 v |= CTRL_SWDPIO(3);
10971
10972 CSR_WRITE(sc, WMREG_CTRL, v);
10973 CSR_WRITE_FLUSH(sc);
10974 delay(10);
10975 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10976 CSR_WRITE_FLUSH(sc);
10977 delay(10);
10978 CSR_WRITE(sc, WMREG_CTRL, v);
10979 CSR_WRITE_FLUSH(sc);
10980 delay(10);
10981
10982 for (i = 0; i < 16; i++) {
10983 data <<= 1;
10984 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10985 CSR_WRITE_FLUSH(sc);
10986 delay(10);
10987 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
10988 data |= 1;
10989 CSR_WRITE(sc, WMREG_CTRL, v);
10990 CSR_WRITE_FLUSH(sc);
10991 delay(10);
10992 }
10993
10994 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
10995 CSR_WRITE_FLUSH(sc);
10996 delay(10);
10997 CSR_WRITE(sc, WMREG_CTRL, v);
10998 CSR_WRITE_FLUSH(sc);
10999 delay(10);
11000
11001 return data;
11002 }
11003
11004 #undef MDI_IO
11005 #undef MDI_DIR
11006 #undef MDI_CLK
11007
11008 /*
11009 * wm_gmii_i82543_readreg: [mii interface function]
11010 *
11011 * Read a PHY register on the GMII (i82543 version).
11012 */
11013 static int
11014 wm_gmii_i82543_readreg(device_t dev, int phy, int reg, uint16_t *val)
11015 {
11016 struct wm_softc *sc = device_private(dev);
11017
11018 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
11019 wm_i82543_mii_sendbits(sc, reg | (phy << 5) |
11020 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
11021 *val = wm_i82543_mii_recvbits(sc) & 0xffff;
11022
11023 DPRINTF(sc, WM_DEBUG_GMII, ("%s: GMII: read phy %d reg %d -> 0x%04hx\n",
11024 device_xname(dev), phy, reg, *val));
11025
11026 return 0;
11027 }
11028
11029 /*
11030 * wm_gmii_i82543_writereg: [mii interface function]
11031 *
11032 * Write a PHY register on the GMII (i82543 version).
11033 */
11034 static int
11035 wm_gmii_i82543_writereg(device_t dev, int phy, int reg, uint16_t val)
11036 {
11037 struct wm_softc *sc = device_private(dev);
11038
11039 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
11040 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
11041 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
11042 (MII_COMMAND_START << 30), 32);
11043
11044 return 0;
11045 }
11046
11047 /*
11048 * wm_gmii_mdic_readreg: [mii interface function]
11049 *
11050 * Read a PHY register on the GMII.
11051 */
11052 static int
11053 wm_gmii_mdic_readreg(device_t dev, int phy, int reg, uint16_t *val)
11054 {
11055 struct wm_softc *sc = device_private(dev);
11056 uint32_t mdic = 0;
11057 int i;
11058
11059 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217)
11060 && (reg > MII_ADDRMASK)) {
11061 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
11062 __func__, sc->sc_phytype, reg);
11063 reg &= MII_ADDRMASK;
11064 }
11065
11066 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
11067 MDIC_REGADD(reg));
11068
11069 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
11070 delay(50);
11071 mdic = CSR_READ(sc, WMREG_MDIC);
11072 if (mdic & MDIC_READY)
11073 break;
11074 }
11075
11076 if ((mdic & MDIC_READY) == 0) {
11077 DPRINTF(sc, WM_DEBUG_GMII,
11078 ("%s: MDIC read timed out: phy %d reg %d\n",
11079 device_xname(dev), phy, reg));
11080 return ETIMEDOUT;
11081 } else if (mdic & MDIC_E) {
11082 /* This is normal if no PHY is present. */
11083 DPRINTF(sc, WM_DEBUG_GMII, ("%s: MDIC read error: phy %d reg %d\n",
11084 device_xname(sc->sc_dev), phy, reg));
11085 return -1;
11086 } else
11087 *val = MDIC_DATA(mdic);
11088
11089 /*
11090 * Allow some time after each MDIC transaction to avoid
11091 * reading duplicate data in the next MDIC transaction.
11092 */
11093 if (sc->sc_type == WM_T_PCH2)
11094 delay(100);
11095
11096 return 0;
11097 }
11098
11099 /*
11100 * wm_gmii_mdic_writereg: [mii interface function]
11101 *
11102 * Write a PHY register on the GMII.
11103 */
11104 static int
11105 wm_gmii_mdic_writereg(device_t dev, int phy, int reg, uint16_t val)
11106 {
11107 struct wm_softc *sc = device_private(dev);
11108 uint32_t mdic = 0;
11109 int i;
11110
11111 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217)
11112 && (reg > MII_ADDRMASK)) {
11113 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
11114 __func__, sc->sc_phytype, reg);
11115 reg &= MII_ADDRMASK;
11116 }
11117
11118 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
11119 MDIC_REGADD(reg) | MDIC_DATA(val));
11120
11121 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
11122 delay(50);
11123 mdic = CSR_READ(sc, WMREG_MDIC);
11124 if (mdic & MDIC_READY)
11125 break;
11126 }
11127
11128 if ((mdic & MDIC_READY) == 0) {
11129 DPRINTF(sc, WM_DEBUG_GMII,
11130 ("%s: MDIC write timed out: phy %d reg %d\n",
11131 device_xname(dev), phy, reg));
11132 return ETIMEDOUT;
11133 } else if (mdic & MDIC_E) {
11134 DPRINTF(sc, WM_DEBUG_GMII,
11135 ("%s: MDIC write error: phy %d reg %d\n",
11136 device_xname(dev), phy, reg));
11137 return -1;
11138 }
11139
11140 /*
11141 * Allow some time after each MDIC transaction to avoid
11142 * reading duplicate data in the next MDIC transaction.
11143 */
11144 if (sc->sc_type == WM_T_PCH2)
11145 delay(100);
11146
11147 return 0;
11148 }
11149
11150 /*
11151 * wm_gmii_i82544_readreg: [mii interface function]
11152 *
11153 * Read a PHY register on the GMII.
11154 */
11155 static int
11156 wm_gmii_i82544_readreg(device_t dev, int phy, int reg, uint16_t *val)
11157 {
11158 struct wm_softc *sc = device_private(dev);
11159 int rv;
11160
11161 if (sc->phy.acquire(sc)) {
11162 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11163 return -1;
11164 }
11165
11166 rv = wm_gmii_i82544_readreg_locked(dev, phy, reg, val);
11167
11168 sc->phy.release(sc);
11169
11170 return rv;
11171 }
11172
11173 static int
11174 wm_gmii_i82544_readreg_locked(device_t dev, int phy, int reg, uint16_t *val)
11175 {
11176 struct wm_softc *sc = device_private(dev);
11177 int rv;
11178
11179 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
11180 switch (sc->sc_phytype) {
11181 case WMPHY_IGP:
11182 case WMPHY_IGP_2:
11183 case WMPHY_IGP_3:
11184 rv = wm_gmii_mdic_writereg(dev, phy,
11185 IGPHY_PAGE_SELECT, reg);
11186 if (rv != 0)
11187 return rv;
11188 break;
11189 default:
11190 #ifdef WM_DEBUG
11191 device_printf(dev, "%s: PHYTYPE = 0x%x, addr = %02x\n",
11192 __func__, sc->sc_phytype, reg);
11193 #endif
11194 break;
11195 }
11196 }
11197
11198 return wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11199 }
11200
11201 /*
11202 * wm_gmii_i82544_writereg: [mii interface function]
11203 *
11204 * Write a PHY register on the GMII.
11205 */
11206 static int
11207 wm_gmii_i82544_writereg(device_t dev, int phy, int reg, uint16_t val)
11208 {
11209 struct wm_softc *sc = device_private(dev);
11210 int rv;
11211
11212 if (sc->phy.acquire(sc)) {
11213 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11214 return -1;
11215 }
11216
11217 rv = wm_gmii_i82544_writereg_locked(dev, phy, reg & MII_ADDRMASK, val);
11218 sc->phy.release(sc);
11219
11220 return rv;
11221 }
11222
11223 static int
11224 wm_gmii_i82544_writereg_locked(device_t dev, int phy, int reg, uint16_t val)
11225 {
11226 struct wm_softc *sc = device_private(dev);
11227 int rv;
11228
11229 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
11230 switch (sc->sc_phytype) {
11231 case WMPHY_IGP:
11232 case WMPHY_IGP_2:
11233 case WMPHY_IGP_3:
11234 rv = wm_gmii_mdic_writereg(dev, phy,
11235 IGPHY_PAGE_SELECT, reg);
11236 if (rv != 0)
11237 return rv;
11238 break;
11239 default:
11240 #ifdef WM_DEBUG
11241 device_printf(dev, "%s: PHYTYPE == 0x%x, addr = %02x",
11242 __func__, sc->sc_phytype, reg);
11243 #endif
11244 break;
11245 }
11246 }
11247
11248 return wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11249 }
11250
11251 /*
11252 * wm_gmii_i80003_readreg: [mii interface function]
11253 *
11254 * Read a PHY register on the kumeran
11255 * This could be handled by the PHY layer if we didn't have to lock the
11256 * resource ...
11257 */
11258 static int
11259 wm_gmii_i80003_readreg(device_t dev, int phy, int reg, uint16_t *val)
11260 {
11261 struct wm_softc *sc = device_private(dev);
11262 int page_select;
11263 uint16_t temp, temp2;
11264 int rv = 0;
11265
11266 if (phy != 1) /* Only one PHY on kumeran bus */
11267 return -1;
11268
11269 if (sc->phy.acquire(sc)) {
11270 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11271 return -1;
11272 }
11273
11274 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
11275 page_select = GG82563_PHY_PAGE_SELECT;
11276 else {
11277 /*
11278 * Use Alternative Page Select register to access registers
11279 * 30 and 31.
11280 */
11281 page_select = GG82563_PHY_PAGE_SELECT_ALT;
11282 }
11283 temp = reg >> GG82563_PAGE_SHIFT;
11284 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0)
11285 goto out;
11286
11287 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
11288 /*
11289 * Wait more 200us for a bug of the ready bit in the MDIC
11290 * register.
11291 */
11292 delay(200);
11293 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2);
11294 if ((rv != 0) || (temp2 != temp)) {
11295 device_printf(dev, "%s failed\n", __func__);
11296 rv = -1;
11297 goto out;
11298 }
11299 delay(200);
11300 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11301 delay(200);
11302 } else
11303 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11304
11305 out:
11306 sc->phy.release(sc);
11307 return rv;
11308 }
11309
11310 /*
11311 * wm_gmii_i80003_writereg: [mii interface function]
11312 *
11313 * Write a PHY register on the kumeran.
11314 * This could be handled by the PHY layer if we didn't have to lock the
11315 * resource ...
11316 */
11317 static int
11318 wm_gmii_i80003_writereg(device_t dev, int phy, int reg, uint16_t val)
11319 {
11320 struct wm_softc *sc = device_private(dev);
11321 int page_select, rv;
11322 uint16_t temp, temp2;
11323
11324 if (phy != 1) /* Only one PHY on kumeran bus */
11325 return -1;
11326
11327 if (sc->phy.acquire(sc)) {
11328 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11329 return -1;
11330 }
11331
11332 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
11333 page_select = GG82563_PHY_PAGE_SELECT;
11334 else {
11335 /*
11336 * Use Alternative Page Select register to access registers
11337 * 30 and 31.
11338 */
11339 page_select = GG82563_PHY_PAGE_SELECT_ALT;
11340 }
11341 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT;
11342 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0)
11343 goto out;
11344
11345 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
11346 /*
11347 * Wait more 200us for a bug of the ready bit in the MDIC
11348 * register.
11349 */
11350 delay(200);
11351 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2);
11352 if ((rv != 0) || (temp2 != temp)) {
11353 device_printf(dev, "%s failed\n", __func__);
11354 rv = -1;
11355 goto out;
11356 }
11357 delay(200);
11358 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11359 delay(200);
11360 } else
11361 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11362
11363 out:
11364 sc->phy.release(sc);
11365 return rv;
11366 }
11367
11368 /*
11369 * wm_gmii_bm_readreg: [mii interface function]
11370 *
11371 * Read a PHY register on the kumeran
11372 * This could be handled by the PHY layer if we didn't have to lock the
11373 * resource ...
11374 */
11375 static int
11376 wm_gmii_bm_readreg(device_t dev, int phy, int reg, uint16_t *val)
11377 {
11378 struct wm_softc *sc = device_private(dev);
11379 uint16_t page = reg >> BME1000_PAGE_SHIFT;
11380 int rv;
11381
11382 if (sc->phy.acquire(sc)) {
11383 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11384 return -1;
11385 }
11386
11387 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
11388 phy = ((page >= 768) || ((page == 0) && (reg == 25))
11389 || (reg == 31)) ? 1 : phy;
11390 /* Page 800 works differently than the rest so it has its own func */
11391 if (page == BM_WUC_PAGE) {
11392 rv = wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false);
11393 goto release;
11394 }
11395
11396 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
11397 if ((phy == 1) && (sc->sc_type != WM_T_82574)
11398 && (sc->sc_type != WM_T_82583))
11399 rv = wm_gmii_mdic_writereg(dev, phy,
11400 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
11401 else
11402 rv = wm_gmii_mdic_writereg(dev, phy,
11403 BME1000_PHY_PAGE_SELECT, page);
11404 if (rv != 0)
11405 goto release;
11406 }
11407
11408 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val);
11409
11410 release:
11411 sc->phy.release(sc);
11412 return rv;
11413 }
11414
11415 /*
11416 * wm_gmii_bm_writereg: [mii interface function]
11417 *
11418 * Write a PHY register on the kumeran.
11419 * This could be handled by the PHY layer if we didn't have to lock the
11420 * resource ...
11421 */
11422 static int
11423 wm_gmii_bm_writereg(device_t dev, int phy, int reg, uint16_t val)
11424 {
11425 struct wm_softc *sc = device_private(dev);
11426 uint16_t page = reg >> BME1000_PAGE_SHIFT;
11427 int rv;
11428
11429 if (sc->phy.acquire(sc)) {
11430 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11431 return -1;
11432 }
11433
11434 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
11435 phy = ((page >= 768) || ((page == 0) && (reg == 25))
11436 || (reg == 31)) ? 1 : phy;
11437 /* Page 800 works differently than the rest so it has its own func */
11438 if (page == BM_WUC_PAGE) {
11439 rv = wm_access_phy_wakeup_reg_bm(dev, reg, &val, false, false);
11440 goto release;
11441 }
11442
11443 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
11444 if ((phy == 1) && (sc->sc_type != WM_T_82574)
11445 && (sc->sc_type != WM_T_82583))
11446 rv = wm_gmii_mdic_writereg(dev, phy,
11447 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
11448 else
11449 rv = wm_gmii_mdic_writereg(dev, phy,
11450 BME1000_PHY_PAGE_SELECT, page);
11451 if (rv != 0)
11452 goto release;
11453 }
11454
11455 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
11456
11457 release:
11458 sc->phy.release(sc);
11459 return rv;
11460 }
11461
11462 /*
11463 * wm_enable_phy_wakeup_reg_access_bm - enable access to BM wakeup registers
11464 * @dev: pointer to the HW structure
11465 * @phy_reg: pointer to store original contents of BM_WUC_ENABLE_REG
11466 *
11467 * Assumes semaphore already acquired and phy_reg points to a valid memory
11468 * address to store contents of the BM_WUC_ENABLE_REG register.
11469 */
11470 static int
11471 wm_enable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp)
11472 {
11473 #ifdef WM_DEBUG
11474 struct wm_softc *sc = device_private(dev);
11475 #endif
11476 uint16_t temp;
11477 int rv;
11478
11479 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
11480 device_xname(dev), __func__));
11481
11482 if (!phy_regp)
11483 return -1;
11484
11485 /* All page select, port ctrl and wakeup registers use phy address 1 */
11486
11487 /* Select Port Control Registers page */
11488 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT,
11489 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT);
11490 if (rv != 0)
11491 return rv;
11492
11493 /* Read WUCE and save it */
11494 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_ENABLE_REG, phy_regp);
11495 if (rv != 0)
11496 return rv;
11497
11498 /* Enable both PHY wakeup mode and Wakeup register page writes.
11499 * Prevent a power state change by disabling ME and Host PHY wakeup.
11500 */
11501 temp = *phy_regp;
11502 temp |= BM_WUC_ENABLE_BIT;
11503 temp &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT);
11504
11505 if ((rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, temp)) != 0)
11506 return rv;
11507
11508 /* Select Host Wakeup Registers page - caller now able to write
11509 * registers on the Wakeup registers page
11510 */
11511 return wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT,
11512 BM_WUC_PAGE << IGP3_PAGE_SHIFT);
11513 }
11514
11515 /*
11516 * wm_disable_phy_wakeup_reg_access_bm - disable access to BM wakeup regs
11517 * @dev: pointer to the HW structure
11518 * @phy_reg: pointer to original contents of BM_WUC_ENABLE_REG
11519 *
11520 * Restore BM_WUC_ENABLE_REG to its original value.
11521 *
11522 * Assumes semaphore already acquired and *phy_reg is the contents of the
11523 * BM_WUC_ENABLE_REG before register(s) on BM_WUC_PAGE were accessed by
11524 * caller.
11525 */
11526 static int
11527 wm_disable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp)
11528 {
11529 #ifdef WM_DEBUG
11530 struct wm_softc *sc = device_private(dev);
11531 #endif
11532
11533 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
11534 device_xname(dev), __func__));
11535
11536 if (!phy_regp)
11537 return -1;
11538
11539 /* Select Port Control Registers page */
11540 wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT,
11541 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT);
11542
11543 /* Restore 769.17 to its original value */
11544 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, *phy_regp);
11545
11546 return 0;
11547 }
11548
11549 /*
11550 * wm_access_phy_wakeup_reg_bm - Read/write BM PHY wakeup register
11551 * @sc: pointer to the HW structure
11552 * @offset: register offset to be read or written
11553 * @val: pointer to the data to read or write
11554 * @rd: determines if operation is read or write
11555 * @page_set: BM_WUC_PAGE already set and access enabled
11556 *
11557 * Read the PHY register at offset and store the retrieved information in
11558 * data, or write data to PHY register at offset. Note the procedure to
11559 * access the PHY wakeup registers is different than reading the other PHY
11560 * registers. It works as such:
11561 * 1) Set 769.17.2 (page 769, register 17, bit 2) = 1
11562 * 2) Set page to 800 for host (801 if we were manageability)
11563 * 3) Write the address using the address opcode (0x11)
11564 * 4) Read or write the data using the data opcode (0x12)
11565 * 5) Restore 769.17.2 to its original value
11566 *
11567 * Steps 1 and 2 are done by wm_enable_phy_wakeup_reg_access_bm() and
11568 * step 5 is done by wm_disable_phy_wakeup_reg_access_bm().
11569 *
11570 * Assumes semaphore is already acquired. When page_set==TRUE, assumes
11571 * the PHY page is set to BM_WUC_PAGE (i.e. a function in the call stack
11572 * is responsible for calls to wm_[enable|disable]_phy_wakeup_reg_bm()).
11573 */
11574 static int
11575 wm_access_phy_wakeup_reg_bm(device_t dev, int offset, int16_t *val, int rd,
11576 bool page_set)
11577 {
11578 struct wm_softc *sc = device_private(dev);
11579 uint16_t regnum = BM_PHY_REG_NUM(offset);
11580 uint16_t page = BM_PHY_REG_PAGE(offset);
11581 uint16_t wuce;
11582 int rv = 0;
11583
11584 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n",
11585 device_xname(dev), __func__));
11586 /* XXX Gig must be disabled for MDIO accesses to page 800 */
11587 if ((sc->sc_type == WM_T_PCH)
11588 && ((CSR_READ(sc, WMREG_PHY_CTRL) & PHY_CTRL_GBE_DIS) == 0)) {
11589 device_printf(dev,
11590 "Attempting to access page %d while gig enabled.\n", page);
11591 }
11592
11593 if (!page_set) {
11594 /* Enable access to PHY wakeup registers */
11595 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce);
11596 if (rv != 0) {
11597 device_printf(dev,
11598 "%s: Could not enable PHY wakeup reg access\n",
11599 __func__);
11600 return rv;
11601 }
11602 }
11603 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s: Accessing PHY page %d reg 0x%x\n",
11604 device_xname(sc->sc_dev), __func__, page, regnum));
11605
11606 /*
11607 * 2) Access PHY wakeup register.
11608 * See wm_access_phy_wakeup_reg_bm.
11609 */
11610
11611 /* Write the Wakeup register page offset value using opcode 0x11 */
11612 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ADDRESS_OPCODE, regnum);
11613 if (rv != 0)
11614 return rv;
11615
11616 if (rd) {
11617 /* Read the Wakeup register page value using opcode 0x12 */
11618 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_DATA_OPCODE, val);
11619 } else {
11620 /* Write the Wakeup register page value using opcode 0x12 */
11621 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_DATA_OPCODE, *val);
11622 }
11623 if (rv != 0)
11624 return rv;
11625
11626 if (!page_set)
11627 rv = wm_disable_phy_wakeup_reg_access_bm(dev, &wuce);
11628
11629 return rv;
11630 }
11631
11632 /*
11633 * wm_gmii_hv_readreg: [mii interface function]
11634 *
11635 * Read a PHY register on the kumeran
11636 * This could be handled by the PHY layer if we didn't have to lock the
11637 * resource ...
11638 */
11639 static int
11640 wm_gmii_hv_readreg(device_t dev, int phy, int reg, uint16_t *val)
11641 {
11642 struct wm_softc *sc = device_private(dev);
11643 int rv;
11644
11645 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n",
11646 device_xname(dev), __func__));
11647 if (sc->phy.acquire(sc)) {
11648 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11649 return -1;
11650 }
11651
11652 rv = wm_gmii_hv_readreg_locked(dev, phy, reg, val);
11653 sc->phy.release(sc);
11654 return rv;
11655 }
11656
11657 static int
11658 wm_gmii_hv_readreg_locked(device_t dev, int phy, int reg, uint16_t *val)
11659 {
11660 uint16_t page = BM_PHY_REG_PAGE(reg);
11661 uint16_t regnum = BM_PHY_REG_NUM(reg);
11662 int rv;
11663
11664 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
11665
11666 /* Page 800 works differently than the rest so it has its own func */
11667 if (page == BM_WUC_PAGE)
11668 return wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false);
11669
11670 /*
11671 * Lower than page 768 works differently than the rest so it has its
11672 * own func
11673 */
11674 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
11675 device_printf(dev, "gmii_hv_readreg!!!\n");
11676 return -1;
11677 }
11678
11679 /*
11680 * XXX I21[789] documents say that the SMBus Address register is at
11681 * PHY address 01, Page 0 (not 768), Register 26.
11682 */
11683 if (page == HV_INTC_FC_PAGE_START)
11684 page = 0;
11685
11686 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
11687 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT,
11688 page << BME1000_PAGE_SHIFT);
11689 if (rv != 0)
11690 return rv;
11691 }
11692
11693 return wm_gmii_mdic_readreg(dev, phy, regnum & MII_ADDRMASK, val);
11694 }
11695
11696 /*
11697 * wm_gmii_hv_writereg: [mii interface function]
11698 *
11699 * Write a PHY register on the kumeran.
11700 * This could be handled by the PHY layer if we didn't have to lock the
11701 * resource ...
11702 */
11703 static int
11704 wm_gmii_hv_writereg(device_t dev, int phy, int reg, uint16_t val)
11705 {
11706 struct wm_softc *sc = device_private(dev);
11707 int rv;
11708
11709 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n",
11710 device_xname(dev), __func__));
11711
11712 if (sc->phy.acquire(sc)) {
11713 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11714 return -1;
11715 }
11716
11717 rv = wm_gmii_hv_writereg_locked(dev, phy, reg, val);
11718 sc->phy.release(sc);
11719
11720 return rv;
11721 }
11722
11723 static int
11724 wm_gmii_hv_writereg_locked(device_t dev, int phy, int reg, uint16_t val)
11725 {
11726 struct wm_softc *sc = device_private(dev);
11727 uint16_t page = BM_PHY_REG_PAGE(reg);
11728 uint16_t regnum = BM_PHY_REG_NUM(reg);
11729 int rv;
11730
11731 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
11732
11733 /* Page 800 works differently than the rest so it has its own func */
11734 if (page == BM_WUC_PAGE)
11735 return wm_access_phy_wakeup_reg_bm(dev, reg, &val, false,
11736 false);
11737
11738 /*
11739 * Lower than page 768 works differently than the rest so it has its
11740 * own func
11741 */
11742 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
11743 device_printf(dev, "gmii_hv_writereg!!!\n");
11744 return -1;
11745 }
11746
11747 {
11748 /*
11749 * XXX I21[789] documents say that the SMBus Address register
11750 * is at PHY address 01, Page 0 (not 768), Register 26.
11751 */
11752 if (page == HV_INTC_FC_PAGE_START)
11753 page = 0;
11754
11755 /*
11756 * XXX Workaround MDIO accesses being disabled after entering
11757 * IEEE Power Down (whenever bit 11 of the PHY control
11758 * register is set)
11759 */
11760 if (sc->sc_phytype == WMPHY_82578) {
11761 struct mii_softc *child;
11762
11763 child = LIST_FIRST(&sc->sc_mii.mii_phys);
11764 if ((child != NULL) && (child->mii_mpd_rev >= 1)
11765 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0)
11766 && ((val & (1 << 11)) != 0)) {
11767 device_printf(dev, "XXX need workaround\n");
11768 }
11769 }
11770
11771 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
11772 rv = wm_gmii_mdic_writereg(dev, 1,
11773 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
11774 if (rv != 0)
11775 return rv;
11776 }
11777 }
11778
11779 return wm_gmii_mdic_writereg(dev, phy, regnum & MII_ADDRMASK, val);
11780 }
11781
11782 /*
11783 * wm_gmii_82580_readreg: [mii interface function]
11784 *
11785 * Read a PHY register on the 82580 and I350.
11786 * This could be handled by the PHY layer if we didn't have to lock the
11787 * resource ...
11788 */
11789 static int
11790 wm_gmii_82580_readreg(device_t dev, int phy, int reg, uint16_t *val)
11791 {
11792 struct wm_softc *sc = device_private(dev);
11793 int rv;
11794
11795 if (sc->phy.acquire(sc) != 0) {
11796 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11797 return -1;
11798 }
11799
11800 #ifdef DIAGNOSTIC
11801 if (reg > MII_ADDRMASK) {
11802 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
11803 __func__, sc->sc_phytype, reg);
11804 reg &= MII_ADDRMASK;
11805 }
11806 #endif
11807 rv = wm_gmii_mdic_readreg(dev, phy, reg, val);
11808
11809 sc->phy.release(sc);
11810 return rv;
11811 }
11812
11813 /*
11814 * wm_gmii_82580_writereg: [mii interface function]
11815 *
11816 * Write a PHY register on the 82580 and I350.
11817 * This could be handled by the PHY layer if we didn't have to lock the
11818 * resource ...
11819 */
11820 static int
11821 wm_gmii_82580_writereg(device_t dev, int phy, int reg, uint16_t val)
11822 {
11823 struct wm_softc *sc = device_private(dev);
11824 int rv;
11825
11826 if (sc->phy.acquire(sc) != 0) {
11827 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11828 return -1;
11829 }
11830
11831 #ifdef DIAGNOSTIC
11832 if (reg > MII_ADDRMASK) {
11833 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
11834 __func__, sc->sc_phytype, reg);
11835 reg &= MII_ADDRMASK;
11836 }
11837 #endif
11838 rv = wm_gmii_mdic_writereg(dev, phy, reg, val);
11839
11840 sc->phy.release(sc);
11841 return rv;
11842 }
11843
11844 /*
11845 * wm_gmii_gs40g_readreg: [mii interface function]
11846 *
11847 * Read a PHY register on the I2100 and I211.
11848 * This could be handled by the PHY layer if we didn't have to lock the
11849 * resource ...
11850 */
11851 static int
11852 wm_gmii_gs40g_readreg(device_t dev, int phy, int reg, uint16_t *val)
11853 {
11854 struct wm_softc *sc = device_private(dev);
11855 int page, offset;
11856 int rv;
11857
11858 /* Acquire semaphore */
11859 if (sc->phy.acquire(sc)) {
11860 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11861 return -1;
11862 }
11863
11864 /* Page select */
11865 page = reg >> GS40G_PAGE_SHIFT;
11866 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
11867 if (rv != 0)
11868 goto release;
11869
11870 /* Read reg */
11871 offset = reg & GS40G_OFFSET_MASK;
11872 rv = wm_gmii_mdic_readreg(dev, phy, offset, val);
11873
11874 release:
11875 sc->phy.release(sc);
11876 return rv;
11877 }
11878
11879 /*
11880 * wm_gmii_gs40g_writereg: [mii interface function]
11881 *
11882 * Write a PHY register on the I210 and I211.
11883 * This could be handled by the PHY layer if we didn't have to lock the
11884 * resource ...
11885 */
11886 static int
11887 wm_gmii_gs40g_writereg(device_t dev, int phy, int reg, uint16_t val)
11888 {
11889 struct wm_softc *sc = device_private(dev);
11890 uint16_t page;
11891 int offset, rv;
11892
11893 /* Acquire semaphore */
11894 if (sc->phy.acquire(sc)) {
11895 device_printf(dev, "%s: failed to get semaphore\n", __func__);
11896 return -1;
11897 }
11898
11899 /* Page select */
11900 page = reg >> GS40G_PAGE_SHIFT;
11901 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
11902 if (rv != 0)
11903 goto release;
11904
11905 /* Write reg */
11906 offset = reg & GS40G_OFFSET_MASK;
11907 rv = wm_gmii_mdic_writereg(dev, phy, offset, val);
11908
11909 release:
11910 /* Release semaphore */
11911 sc->phy.release(sc);
11912 return rv;
11913 }
11914
11915 /*
11916 * wm_gmii_statchg: [mii interface function]
11917 *
11918 * Callback from MII layer when media changes.
11919 */
11920 static void
11921 wm_gmii_statchg(struct ifnet *ifp)
11922 {
11923 struct wm_softc *sc = ifp->if_softc;
11924 struct mii_data *mii = &sc->sc_mii;
11925
11926 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE);
11927 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
11928 sc->sc_fcrtl &= ~FCRTL_XONE;
11929
11930 /* Get flow control negotiation result. */
11931 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
11932 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) {
11933 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
11934 mii->mii_media_active &= ~IFM_ETH_FMASK;
11935 }
11936
11937 if (sc->sc_flowflags & IFM_FLOW) {
11938 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) {
11939 sc->sc_ctrl |= CTRL_TFCE;
11940 sc->sc_fcrtl |= FCRTL_XONE;
11941 }
11942 if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
11943 sc->sc_ctrl |= CTRL_RFCE;
11944 }
11945
11946 if (mii->mii_media_active & IFM_FDX) {
11947 DPRINTF(sc, WM_DEBUG_LINK,
11948 ("%s: LINK: statchg: FDX\n", ifp->if_xname));
11949 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
11950 } else {
11951 DPRINTF(sc, WM_DEBUG_LINK,
11952 ("%s: LINK: statchg: HDX\n", ifp->if_xname));
11953 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
11954 }
11955
11956 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11957 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
11958 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
11959 : WMREG_FCRTL, sc->sc_fcrtl);
11960 if (sc->sc_type == WM_T_80003) {
11961 switch (IFM_SUBTYPE(mii->mii_media_active)) {
11962 case IFM_1000_T:
11963 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
11964 KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
11965 sc->sc_tipg = TIPG_1000T_80003_DFLT;
11966 break;
11967 default:
11968 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
11969 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
11970 sc->sc_tipg = TIPG_10_100_80003_DFLT;
11971 break;
11972 }
11973 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
11974 }
11975 }
11976
11977 /* kumeran related (80003, ICH* and PCH*) */
11978
11979 /*
11980 * wm_kmrn_readreg:
11981 *
11982 * Read a kumeran register
11983 */
11984 static int
11985 wm_kmrn_readreg(struct wm_softc *sc, int reg, uint16_t *val)
11986 {
11987 int rv;
11988
11989 if (sc->sc_type == WM_T_80003)
11990 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
11991 else
11992 rv = sc->phy.acquire(sc);
11993 if (rv != 0) {
11994 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
11995 __func__);
11996 return rv;
11997 }
11998
11999 rv = wm_kmrn_readreg_locked(sc, reg, val);
12000
12001 if (sc->sc_type == WM_T_80003)
12002 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
12003 else
12004 sc->phy.release(sc);
12005
12006 return rv;
12007 }
12008
12009 static int
12010 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg, uint16_t *val)
12011 {
12012
12013 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
12014 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
12015 KUMCTRLSTA_REN);
12016 CSR_WRITE_FLUSH(sc);
12017 delay(2);
12018
12019 *val = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
12020
12021 return 0;
12022 }
12023
12024 /*
12025 * wm_kmrn_writereg:
12026 *
12027 * Write a kumeran register
12028 */
12029 static int
12030 wm_kmrn_writereg(struct wm_softc *sc, int reg, uint16_t val)
12031 {
12032 int rv;
12033
12034 if (sc->sc_type == WM_T_80003)
12035 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
12036 else
12037 rv = sc->phy.acquire(sc);
12038 if (rv != 0) {
12039 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
12040 __func__);
12041 return rv;
12042 }
12043
12044 rv = wm_kmrn_writereg_locked(sc, reg, val);
12045
12046 if (sc->sc_type == WM_T_80003)
12047 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
12048 else
12049 sc->phy.release(sc);
12050
12051 return rv;
12052 }
12053
12054 static int
12055 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, uint16_t val)
12056 {
12057
12058 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
12059 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | val);
12060
12061 return 0;
12062 }
12063
12064 /*
12065 * EMI register related (82579, WMPHY_I217(PCH2 and newer))
12066 * This access method is different from IEEE MMD.
12067 */
12068 static int
12069 wm_access_emi_reg_locked(device_t dev, int reg, uint16_t *val, bool rd)
12070 {
12071 struct wm_softc *sc = device_private(dev);
12072 int rv;
12073
12074 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_ADDR, reg);
12075 if (rv != 0)
12076 return rv;
12077
12078 if (rd)
12079 rv = sc->phy.readreg_locked(dev, 2, I82579_EMI_DATA, val);
12080 else
12081 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_DATA, *val);
12082 return rv;
12083 }
12084
12085 static int
12086 wm_read_emi_reg_locked(device_t dev, int reg, uint16_t *val)
12087 {
12088
12089 return wm_access_emi_reg_locked(dev, reg, val, true);
12090 }
12091
12092 static int
12093 wm_write_emi_reg_locked(device_t dev, int reg, uint16_t val)
12094 {
12095
12096 return wm_access_emi_reg_locked(dev, reg, &val, false);
12097 }
12098
12099 /* SGMII related */
12100
12101 /*
12102 * wm_sgmii_uses_mdio
12103 *
12104 * Check whether the transaction is to the internal PHY or the external
12105 * MDIO interface. Return true if it's MDIO.
12106 */
12107 static bool
12108 wm_sgmii_uses_mdio(struct wm_softc *sc)
12109 {
12110 uint32_t reg;
12111 bool ismdio = false;
12112
12113 switch (sc->sc_type) {
12114 case WM_T_82575:
12115 case WM_T_82576:
12116 reg = CSR_READ(sc, WMREG_MDIC);
12117 ismdio = ((reg & MDIC_DEST) != 0);
12118 break;
12119 case WM_T_82580:
12120 case WM_T_I350:
12121 case WM_T_I354:
12122 case WM_T_I210:
12123 case WM_T_I211:
12124 reg = CSR_READ(sc, WMREG_MDICNFG);
12125 ismdio = ((reg & MDICNFG_DEST) != 0);
12126 break;
12127 default:
12128 break;
12129 }
12130
12131 return ismdio;
12132 }
12133
12134 /* Setup internal SGMII PHY for SFP */
12135 static void
12136 wm_sgmii_sfp_preconfig(struct wm_softc *sc)
12137 {
12138 uint16_t id1, id2, phyreg;
12139 int i, rv;
12140
12141 if (((sc->sc_flags & WM_F_SGMII) == 0)
12142 || ((sc->sc_flags & WM_F_SFP) == 0))
12143 return;
12144
12145 for (i = 0; i < MII_NPHY; i++) {
12146 sc->phy.no_errprint = true;
12147 rv = sc->phy.readreg_locked(sc->sc_dev, i, MII_PHYIDR1, &id1);
12148 if (rv != 0)
12149 continue;
12150 rv = sc->phy.readreg_locked(sc->sc_dev, i, MII_PHYIDR2, &id2);
12151 if (rv != 0)
12152 continue;
12153 if (MII_OUI(id1, id2) != MII_OUI_xxMARVELL)
12154 continue;
12155 sc->phy.no_errprint = false;
12156
12157 sc->phy.readreg_locked(sc->sc_dev, i, MAKPHY_ESSR, &phyreg);
12158 phyreg &= ~(ESSR_SER_ANEG_BYPASS | ESSR_HWCFG_MODE);
12159 phyreg |= ESSR_SGMII_WOC_COPPER;
12160 sc->phy.writereg_locked(sc->sc_dev, i, MAKPHY_ESSR, phyreg);
12161 break;
12162 }
12163
12164 }
12165
12166 /*
12167 * wm_sgmii_readreg: [mii interface function]
12168 *
12169 * Read a PHY register on the SGMII
12170 * This could be handled by the PHY layer if we didn't have to lock the
12171 * resource ...
12172 */
12173 static int
12174 wm_sgmii_readreg(device_t dev, int phy, int reg, uint16_t *val)
12175 {
12176 struct wm_softc *sc = device_private(dev);
12177 int rv;
12178
12179 if (sc->phy.acquire(sc)) {
12180 device_printf(dev, "%s: failed to get semaphore\n", __func__);
12181 return -1;
12182 }
12183
12184 rv = wm_sgmii_readreg_locked(dev, phy, reg, val);
12185
12186 sc->phy.release(sc);
12187 return rv;
12188 }
12189
12190 static int
12191 wm_sgmii_readreg_locked(device_t dev, int phy, int reg, uint16_t *val)
12192 {
12193 struct wm_softc *sc = device_private(dev);
12194 uint32_t i2ccmd;
12195 int i, rv = 0;
12196
12197 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
12198 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
12199 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
12200
12201 /* Poll the ready bit */
12202 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
12203 delay(50);
12204 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
12205 if (i2ccmd & I2CCMD_READY)
12206 break;
12207 }
12208 if ((i2ccmd & I2CCMD_READY) == 0) {
12209 device_printf(dev, "I2CCMD Read did not complete\n");
12210 rv = ETIMEDOUT;
12211 }
12212 if ((i2ccmd & I2CCMD_ERROR) != 0) {
12213 if (!sc->phy.no_errprint)
12214 device_printf(dev, "I2CCMD Error bit set\n");
12215 rv = EIO;
12216 }
12217
12218 *val = (uint16_t)((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00);
12219
12220 return rv;
12221 }
12222
12223 /*
12224 * wm_sgmii_writereg: [mii interface function]
12225 *
12226 * Write a PHY register on the SGMII.
12227 * This could be handled by the PHY layer if we didn't have to lock the
12228 * resource ...
12229 */
12230 static int
12231 wm_sgmii_writereg(device_t dev, int phy, int reg, uint16_t val)
12232 {
12233 struct wm_softc *sc = device_private(dev);
12234 int rv;
12235
12236 if (sc->phy.acquire(sc) != 0) {
12237 device_printf(dev, "%s: failed to get semaphore\n", __func__);
12238 return -1;
12239 }
12240
12241 rv = wm_sgmii_writereg_locked(dev, phy, reg, val);
12242
12243 sc->phy.release(sc);
12244
12245 return rv;
12246 }
12247
12248 static int
12249 wm_sgmii_writereg_locked(device_t dev, int phy, int reg, uint16_t val)
12250 {
12251 struct wm_softc *sc = device_private(dev);
12252 uint32_t i2ccmd;
12253 uint16_t swapdata;
12254 int rv = 0;
12255 int i;
12256
12257 /* Swap the data bytes for the I2C interface */
12258 swapdata = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00);
12259 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
12260 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_WRITE | swapdata;
12261 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
12262
12263 /* Poll the ready bit */
12264 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
12265 delay(50);
12266 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
12267 if (i2ccmd & I2CCMD_READY)
12268 break;
12269 }
12270 if ((i2ccmd & I2CCMD_READY) == 0) {
12271 device_printf(dev, "I2CCMD Write did not complete\n");
12272 rv = ETIMEDOUT;
12273 }
12274 if ((i2ccmd & I2CCMD_ERROR) != 0) {
12275 device_printf(dev, "I2CCMD Error bit set\n");
12276 rv = EIO;
12277 }
12278
12279 return rv;
12280 }
12281
12282 /* TBI related */
12283
12284 static bool
12285 wm_tbi_havesignal(struct wm_softc *sc, uint32_t ctrl)
12286 {
12287 bool sig;
12288
12289 sig = ctrl & CTRL_SWDPIN(1);
12290
12291 /*
12292 * On 82543 and 82544, the CTRL_SWDPIN(1) bit will be 0 if the optics
12293 * detect a signal, 1 if they don't.
12294 */
12295 if ((sc->sc_type == WM_T_82543) || (sc->sc_type == WM_T_82544))
12296 sig = !sig;
12297
12298 return sig;
12299 }
12300
12301 /*
12302 * wm_tbi_mediainit:
12303 *
12304 * Initialize media for use on 1000BASE-X devices.
12305 */
12306 static void
12307 wm_tbi_mediainit(struct wm_softc *sc)
12308 {
12309 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
12310 const char *sep = "";
12311
12312 if (sc->sc_type < WM_T_82543)
12313 sc->sc_tipg = TIPG_WM_DFLT;
12314 else
12315 sc->sc_tipg = TIPG_LG_DFLT;
12316
12317 sc->sc_tbi_serdes_anegticks = 5;
12318
12319 /* Initialize our media structures */
12320 sc->sc_mii.mii_ifp = ifp;
12321 sc->sc_ethercom.ec_mii = &sc->sc_mii;
12322
12323 ifp->if_baudrate = IF_Gbps(1);
12324 if (((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211))
12325 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
12326 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK,
12327 wm_serdes_mediachange, wm_serdes_mediastatus,
12328 sc->sc_core_lock);
12329 } else {
12330 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK,
12331 wm_tbi_mediachange, wm_tbi_mediastatus, sc->sc_core_lock);
12332 }
12333
12334 /*
12335 * SWD Pins:
12336 *
12337 * 0 = Link LED (output)
12338 * 1 = Loss Of Signal (input)
12339 */
12340 sc->sc_ctrl |= CTRL_SWDPIO(0);
12341
12342 /* XXX Perhaps this is only for TBI */
12343 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES)
12344 sc->sc_ctrl &= ~CTRL_SWDPIO(1);
12345
12346 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
12347 sc->sc_ctrl &= ~CTRL_LRST;
12348
12349 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12350
12351 #define ADD(ss, mm, dd) \
12352 do { \
12353 aprint_normal("%s%s", sep, ss); \
12354 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \
12355 sep = ", "; \
12356 } while (/*CONSTCOND*/0)
12357
12358 aprint_normal_dev(sc->sc_dev, "");
12359
12360 if (sc->sc_type == WM_T_I354) {
12361 uint32_t status;
12362
12363 status = CSR_READ(sc, WMREG_STATUS);
12364 if (((status & STATUS_2P5_SKU) != 0)
12365 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
12366 ADD("2500baseKX-FDX", IFM_2500_KX | IFM_FDX,ANAR_X_FD);
12367 } else
12368 ADD("1000baseKX-FDX", IFM_1000_KX | IFM_FDX,ANAR_X_FD);
12369 } else if (sc->sc_type == WM_T_82545) {
12370 /* Only 82545 is LX (XXX except SFP) */
12371 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
12372 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
12373 } else if (sc->sc_sfptype != 0) {
12374 /* XXX wm(4) fiber/serdes don't use ifm_data */
12375 switch (sc->sc_sfptype) {
12376 default:
12377 case SFF_SFP_ETH_FLAGS_1000SX:
12378 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
12379 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
12380 break;
12381 case SFF_SFP_ETH_FLAGS_1000LX:
12382 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
12383 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
12384 break;
12385 case SFF_SFP_ETH_FLAGS_1000CX:
12386 ADD("1000baseCX", IFM_1000_CX, ANAR_X_HD);
12387 ADD("1000baseCX-FDX", IFM_1000_CX | IFM_FDX, ANAR_X_FD);
12388 break;
12389 case SFF_SFP_ETH_FLAGS_1000T:
12390 ADD("1000baseT", IFM_1000_T, 0);
12391 ADD("1000baseT-FDX", IFM_1000_T | IFM_FDX, 0);
12392 break;
12393 case SFF_SFP_ETH_FLAGS_100FX:
12394 ADD("100baseFX", IFM_100_FX, ANAR_TX);
12395 ADD("100baseFX-FDX", IFM_100_FX | IFM_FDX, ANAR_TX_FD);
12396 break;
12397 }
12398 } else {
12399 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
12400 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
12401 }
12402 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD);
12403 aprint_normal("\n");
12404
12405 #undef ADD
12406
12407 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
12408 }
12409
12410 /*
12411 * wm_tbi_mediachange: [ifmedia interface function]
12412 *
12413 * Set hardware to newly-selected media on a 1000BASE-X device.
12414 */
12415 static int
12416 wm_tbi_mediachange(struct ifnet *ifp)
12417 {
12418 struct wm_softc *sc = ifp->if_softc;
12419 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
12420 uint32_t status, ctrl;
12421 bool signal;
12422 int i;
12423
12424 KASSERT(sc->sc_mediatype != WM_MEDIATYPE_COPPER);
12425 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
12426 /* XXX need some work for >= 82571 and < 82575 */
12427 if (sc->sc_type < WM_T_82575)
12428 return 0;
12429 }
12430
12431 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
12432 || (sc->sc_type >= WM_T_82575))
12433 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
12434
12435 sc->sc_ctrl &= ~CTRL_LRST;
12436 sc->sc_txcw = TXCW_ANE;
12437 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
12438 sc->sc_txcw |= TXCW_FD | TXCW_HD;
12439 else if (ife->ifm_media & IFM_FDX)
12440 sc->sc_txcw |= TXCW_FD;
12441 else
12442 sc->sc_txcw |= TXCW_HD;
12443
12444 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0)
12445 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE;
12446
12447 DPRINTF(sc, WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n",
12448 device_xname(sc->sc_dev), sc->sc_txcw));
12449 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
12450 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12451 CSR_WRITE_FLUSH(sc);
12452 delay(1000);
12453
12454 ctrl = CSR_READ(sc, WMREG_CTRL);
12455 signal = wm_tbi_havesignal(sc, ctrl);
12456
12457 DPRINTF(sc, WM_DEBUG_LINK, ("%s: signal = %d\n", device_xname(sc->sc_dev),
12458 signal));
12459
12460 if (signal) {
12461 /* Have signal; wait for the link to come up. */
12462 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
12463 delay(10000);
12464 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
12465 break;
12466 }
12467
12468 DPRINTF(sc, WM_DEBUG_LINK,("%s: i = %d after waiting for link\n",
12469 device_xname(sc->sc_dev), i));
12470
12471 status = CSR_READ(sc, WMREG_STATUS);
12472 DPRINTF(sc, WM_DEBUG_LINK,
12473 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n",
12474 device_xname(sc->sc_dev), status, STATUS_LU));
12475 if (status & STATUS_LU) {
12476 /* Link is up. */
12477 DPRINTF(sc, WM_DEBUG_LINK,
12478 ("%s: LINK: set media -> link up %s\n",
12479 device_xname(sc->sc_dev),
12480 (status & STATUS_FD) ? "FDX" : "HDX"));
12481
12482 /*
12483 * NOTE: CTRL will update TFCE and RFCE automatically,
12484 * so we should update sc->sc_ctrl
12485 */
12486 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
12487 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
12488 sc->sc_fcrtl &= ~FCRTL_XONE;
12489 if (status & STATUS_FD)
12490 sc->sc_tctl |=
12491 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
12492 else
12493 sc->sc_tctl |=
12494 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
12495 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE)
12496 sc->sc_fcrtl |= FCRTL_XONE;
12497 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
12498 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
12499 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl);
12500 sc->sc_tbi_linkup = 1;
12501 } else {
12502 if (i == WM_LINKUP_TIMEOUT)
12503 wm_check_for_link(sc);
12504 /* Link is down. */
12505 DPRINTF(sc, WM_DEBUG_LINK,
12506 ("%s: LINK: set media -> link down\n",
12507 device_xname(sc->sc_dev)));
12508 sc->sc_tbi_linkup = 0;
12509 }
12510 } else {
12511 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
12512 device_xname(sc->sc_dev)));
12513 sc->sc_tbi_linkup = 0;
12514 }
12515
12516 wm_tbi_serdes_set_linkled(sc);
12517
12518 return 0;
12519 }
12520
12521 /*
12522 * wm_tbi_mediastatus: [ifmedia interface function]
12523 *
12524 * Get the current interface media status on a 1000BASE-X device.
12525 */
12526 static void
12527 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
12528 {
12529 struct wm_softc *sc = ifp->if_softc;
12530 uint32_t ctrl, status;
12531
12532 ifmr->ifm_status = IFM_AVALID;
12533 ifmr->ifm_active = IFM_ETHER;
12534
12535 status = CSR_READ(sc, WMREG_STATUS);
12536 if ((status & STATUS_LU) == 0) {
12537 ifmr->ifm_active |= IFM_NONE;
12538 return;
12539 }
12540
12541 ifmr->ifm_status |= IFM_ACTIVE;
12542 /* Only 82545 is LX */
12543 if (sc->sc_type == WM_T_82545)
12544 ifmr->ifm_active |= IFM_1000_LX;
12545 else
12546 ifmr->ifm_active |= IFM_1000_SX;
12547 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
12548 ifmr->ifm_active |= IFM_FDX;
12549 else
12550 ifmr->ifm_active |= IFM_HDX;
12551 ctrl = CSR_READ(sc, WMREG_CTRL);
12552 if (ctrl & CTRL_RFCE)
12553 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
12554 if (ctrl & CTRL_TFCE)
12555 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
12556 }
12557
12558 /* XXX TBI only */
12559 static int
12560 wm_check_for_link(struct wm_softc *sc)
12561 {
12562 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
12563 uint32_t rxcw;
12564 uint32_t ctrl;
12565 uint32_t status;
12566 bool signal;
12567
12568 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s called\n",
12569 device_xname(sc->sc_dev), __func__));
12570
12571 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
12572 /* XXX need some work for >= 82571 */
12573 if (sc->sc_type >= WM_T_82571) {
12574 sc->sc_tbi_linkup = 1;
12575 return 0;
12576 }
12577 }
12578
12579 rxcw = CSR_READ(sc, WMREG_RXCW);
12580 ctrl = CSR_READ(sc, WMREG_CTRL);
12581 status = CSR_READ(sc, WMREG_STATUS);
12582 signal = wm_tbi_havesignal(sc, ctrl);
12583
12584 DPRINTF(sc, WM_DEBUG_LINK,
12585 ("%s: %s: signal = %d, status_lu = %d, rxcw_c = %d\n",
12586 device_xname(sc->sc_dev), __func__, signal,
12587 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0)));
12588
12589 /*
12590 * SWDPIN LU RXCW
12591 * 0 0 0
12592 * 0 0 1 (should not happen)
12593 * 0 1 0 (should not happen)
12594 * 0 1 1 (should not happen)
12595 * 1 0 0 Disable autonego and force linkup
12596 * 1 0 1 got /C/ but not linkup yet
12597 * 1 1 0 (linkup)
12598 * 1 1 1 If IFM_AUTO, back to autonego
12599 *
12600 */
12601 if (signal && ((status & STATUS_LU) == 0) && ((rxcw & RXCW_C) == 0)) {
12602 DPRINTF(sc, WM_DEBUG_LINK,
12603 ("%s: %s: force linkup and fullduplex\n",
12604 device_xname(sc->sc_dev), __func__));
12605 sc->sc_tbi_linkup = 0;
12606 /* Disable auto-negotiation in the TXCW register */
12607 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
12608
12609 /*
12610 * Force link-up and also force full-duplex.
12611 *
12612 * NOTE: CTRL was updated TFCE and RFCE automatically,
12613 * so we should update sc->sc_ctrl
12614 */
12615 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD;
12616 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12617 } else if (((status & STATUS_LU) != 0)
12618 && ((rxcw & RXCW_C) != 0)
12619 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
12620 sc->sc_tbi_linkup = 1;
12621 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: go back to autonego\n",
12622 device_xname(sc->sc_dev),
12623 __func__));
12624 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
12625 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
12626 } else if (signal && ((rxcw & RXCW_C) != 0)) {
12627 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: /C/",
12628 device_xname(sc->sc_dev), __func__));
12629 } else {
12630 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: linkup %08x,%08x,%08x\n",
12631 device_xname(sc->sc_dev), __func__, rxcw, ctrl,
12632 status));
12633 }
12634
12635 return 0;
12636 }
12637
12638 /*
12639 * wm_tbi_tick:
12640 *
12641 * Check the link on TBI devices.
12642 * This function acts as mii_tick().
12643 */
12644 static void
12645 wm_tbi_tick(struct wm_softc *sc)
12646 {
12647 struct mii_data *mii = &sc->sc_mii;
12648 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
12649 uint32_t status;
12650
12651 KASSERT(WM_CORE_LOCKED(sc));
12652
12653 status = CSR_READ(sc, WMREG_STATUS);
12654
12655 /* XXX is this needed? */
12656 (void)CSR_READ(sc, WMREG_RXCW);
12657 (void)CSR_READ(sc, WMREG_CTRL);
12658
12659 /* set link status */
12660 if ((status & STATUS_LU) == 0) {
12661 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: checklink -> down\n",
12662 device_xname(sc->sc_dev)));
12663 sc->sc_tbi_linkup = 0;
12664 } else if (sc->sc_tbi_linkup == 0) {
12665 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: checklink -> up %s\n",
12666 device_xname(sc->sc_dev),
12667 (status & STATUS_FD) ? "FDX" : "HDX"));
12668 sc->sc_tbi_linkup = 1;
12669 sc->sc_tbi_serdes_ticks = 0;
12670 }
12671
12672 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0)
12673 goto setled;
12674
12675 if ((status & STATUS_LU) == 0) {
12676 sc->sc_tbi_linkup = 0;
12677 /* If the timer expired, retry autonegotiation */
12678 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
12679 && (++sc->sc_tbi_serdes_ticks
12680 >= sc->sc_tbi_serdes_anegticks)) {
12681 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: EXPIRE\n",
12682 device_xname(sc->sc_dev), __func__));
12683 sc->sc_tbi_serdes_ticks = 0;
12684 /*
12685 * Reset the link, and let autonegotiation do
12686 * its thing
12687 */
12688 sc->sc_ctrl |= CTRL_LRST;
12689 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12690 CSR_WRITE_FLUSH(sc);
12691 delay(1000);
12692 sc->sc_ctrl &= ~CTRL_LRST;
12693 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12694 CSR_WRITE_FLUSH(sc);
12695 delay(1000);
12696 CSR_WRITE(sc, WMREG_TXCW,
12697 sc->sc_txcw & ~TXCW_ANE);
12698 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
12699 }
12700 }
12701
12702 setled:
12703 wm_tbi_serdes_set_linkled(sc);
12704 }
12705
12706 /* SERDES related */
12707 static void
12708 wm_serdes_power_up_link_82575(struct wm_softc *sc)
12709 {
12710 uint32_t reg;
12711
12712 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
12713 && ((sc->sc_flags & WM_F_SGMII) == 0))
12714 return;
12715
12716 /* Enable PCS to turn on link */
12717 reg = CSR_READ(sc, WMREG_PCS_CFG);
12718 reg |= PCS_CFG_PCS_EN;
12719 CSR_WRITE(sc, WMREG_PCS_CFG, reg);
12720
12721 /* Power up the laser */
12722 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12723 reg &= ~CTRL_EXT_SWDPIN(3);
12724 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
12725
12726 /* Flush the write to verify completion */
12727 CSR_WRITE_FLUSH(sc);
12728 delay(1000);
12729 }
12730
12731 static int
12732 wm_serdes_mediachange(struct ifnet *ifp)
12733 {
12734 struct wm_softc *sc = ifp->if_softc;
12735 bool pcs_autoneg = true; /* XXX */
12736 uint32_t ctrl_ext, pcs_lctl, reg;
12737
12738 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
12739 && ((sc->sc_flags & WM_F_SGMII) == 0))
12740 return 0;
12741
12742 /* XXX Currently, this function is not called on 8257[12] */
12743 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
12744 || (sc->sc_type >= WM_T_82575))
12745 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
12746
12747 /* Power on the sfp cage if present */
12748 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
12749 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
12750 ctrl_ext |= CTRL_EXT_I2C_ENA;
12751 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
12752
12753 sc->sc_ctrl |= CTRL_SLU;
12754
12755 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) {
12756 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1);
12757
12758 reg = CSR_READ(sc, WMREG_CONNSW);
12759 reg |= CONNSW_ENRGSRC;
12760 CSR_WRITE(sc, WMREG_CONNSW, reg);
12761 }
12762
12763 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL);
12764 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) {
12765 case CTRL_EXT_LINK_MODE_SGMII:
12766 /* SGMII mode lets the phy handle forcing speed/duplex */
12767 pcs_autoneg = true;
12768 /* Autoneg time out should be disabled for SGMII mode */
12769 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT;
12770 break;
12771 case CTRL_EXT_LINK_MODE_1000KX:
12772 pcs_autoneg = false;
12773 /* FALLTHROUGH */
12774 default:
12775 if ((sc->sc_type == WM_T_82575)
12776 || (sc->sc_type == WM_T_82576)) {
12777 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0)
12778 pcs_autoneg = false;
12779 }
12780 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD
12781 | CTRL_FRCFDX;
12782
12783 /* Set speed of 1000/Full if speed/duplex is forced */
12784 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL;
12785 }
12786 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
12787
12788 pcs_lctl &= ~(PCS_LCTL_AN_ENABLE | PCS_LCTL_FLV_LINK_UP |
12789 PCS_LCTL_FSD | PCS_LCTL_FORCE_LINK);
12790
12791 if (pcs_autoneg) {
12792 /* Set PCS register for autoneg */
12793 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART;
12794
12795 /* Disable force flow control for autoneg */
12796 pcs_lctl &= ~PCS_LCTL_FORCE_FC;
12797
12798 /* Configure flow control advertisement for autoneg */
12799 reg = CSR_READ(sc, WMREG_PCS_ANADV);
12800 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE);
12801 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE;
12802 CSR_WRITE(sc, WMREG_PCS_ANADV, reg);
12803 } else
12804 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC;
12805
12806 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl);
12807
12808 return 0;
12809 }
12810
12811 static void
12812 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
12813 {
12814 struct wm_softc *sc = ifp->if_softc;
12815 struct mii_data *mii = &sc->sc_mii;
12816 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
12817 uint32_t pcs_adv, pcs_lpab, reg;
12818
12819 ifmr->ifm_status = IFM_AVALID;
12820 ifmr->ifm_active = IFM_ETHER;
12821
12822 /* Check PCS */
12823 reg = CSR_READ(sc, WMREG_PCS_LSTS);
12824 if ((reg & PCS_LSTS_LINKOK) == 0) {
12825 ifmr->ifm_active |= IFM_NONE;
12826 sc->sc_tbi_linkup = 0;
12827 goto setled;
12828 }
12829
12830 sc->sc_tbi_linkup = 1;
12831 ifmr->ifm_status |= IFM_ACTIVE;
12832 if (sc->sc_type == WM_T_I354) {
12833 uint32_t status;
12834
12835 status = CSR_READ(sc, WMREG_STATUS);
12836 if (((status & STATUS_2P5_SKU) != 0)
12837 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
12838 ifmr->ifm_active |= IFM_2500_KX;
12839 } else
12840 ifmr->ifm_active |= IFM_1000_KX;
12841 } else {
12842 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) {
12843 case PCS_LSTS_SPEED_10:
12844 ifmr->ifm_active |= IFM_10_T; /* XXX */
12845 break;
12846 case PCS_LSTS_SPEED_100:
12847 ifmr->ifm_active |= IFM_100_FX; /* XXX */
12848 break;
12849 case PCS_LSTS_SPEED_1000:
12850 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
12851 break;
12852 default:
12853 device_printf(sc->sc_dev, "Unknown speed\n");
12854 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
12855 break;
12856 }
12857 }
12858 ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
12859 if ((reg & PCS_LSTS_FDX) != 0)
12860 ifmr->ifm_active |= IFM_FDX;
12861 else
12862 ifmr->ifm_active |= IFM_HDX;
12863 mii->mii_media_active &= ~IFM_ETH_FMASK;
12864 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
12865 /* Check flow */
12866 reg = CSR_READ(sc, WMREG_PCS_LSTS);
12867 if ((reg & PCS_LSTS_AN_COMP) == 0) {
12868 DPRINTF(sc, WM_DEBUG_LINK, ("XXX LINKOK but not ACOMP\n"));
12869 goto setled;
12870 }
12871 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
12872 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
12873 DPRINTF(sc, WM_DEBUG_LINK,
12874 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab));
12875 if ((pcs_adv & TXCW_SYM_PAUSE)
12876 && (pcs_lpab & TXCW_SYM_PAUSE)) {
12877 mii->mii_media_active |= IFM_FLOW
12878 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
12879 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
12880 && (pcs_adv & TXCW_ASYM_PAUSE)
12881 && (pcs_lpab & TXCW_SYM_PAUSE)
12882 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
12883 mii->mii_media_active |= IFM_FLOW
12884 | IFM_ETH_TXPAUSE;
12885 } else if ((pcs_adv & TXCW_SYM_PAUSE)
12886 && (pcs_adv & TXCW_ASYM_PAUSE)
12887 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
12888 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
12889 mii->mii_media_active |= IFM_FLOW
12890 | IFM_ETH_RXPAUSE;
12891 }
12892 }
12893 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
12894 | (mii->mii_media_active & IFM_ETH_FMASK);
12895 setled:
12896 wm_tbi_serdes_set_linkled(sc);
12897 }
12898
12899 /*
12900 * wm_serdes_tick:
12901 *
12902 * Check the link on serdes devices.
12903 */
12904 static void
12905 wm_serdes_tick(struct wm_softc *sc)
12906 {
12907 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
12908 struct mii_data *mii = &sc->sc_mii;
12909 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
12910 uint32_t reg;
12911
12912 KASSERT(WM_CORE_LOCKED(sc));
12913
12914 mii->mii_media_status = IFM_AVALID;
12915 mii->mii_media_active = IFM_ETHER;
12916
12917 /* Check PCS */
12918 reg = CSR_READ(sc, WMREG_PCS_LSTS);
12919 if ((reg & PCS_LSTS_LINKOK) != 0) {
12920 mii->mii_media_status |= IFM_ACTIVE;
12921 sc->sc_tbi_linkup = 1;
12922 sc->sc_tbi_serdes_ticks = 0;
12923 mii->mii_media_active |= IFM_1000_SX; /* XXX */
12924 if ((reg & PCS_LSTS_FDX) != 0)
12925 mii->mii_media_active |= IFM_FDX;
12926 else
12927 mii->mii_media_active |= IFM_HDX;
12928 } else {
12929 mii->mii_media_status |= IFM_NONE;
12930 sc->sc_tbi_linkup = 0;
12931 /* If the timer expired, retry autonegotiation */
12932 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
12933 && (++sc->sc_tbi_serdes_ticks
12934 >= sc->sc_tbi_serdes_anegticks)) {
12935 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: EXPIRE\n",
12936 device_xname(sc->sc_dev), __func__));
12937 sc->sc_tbi_serdes_ticks = 0;
12938 /* XXX */
12939 wm_serdes_mediachange(ifp);
12940 }
12941 }
12942
12943 wm_tbi_serdes_set_linkled(sc);
12944 }
12945
12946 /* SFP related */
12947
12948 static int
12949 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data)
12950 {
12951 uint32_t i2ccmd;
12952 int i;
12953
12954 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
12955 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
12956
12957 /* Poll the ready bit */
12958 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
12959 delay(50);
12960 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
12961 if (i2ccmd & I2CCMD_READY)
12962 break;
12963 }
12964 if ((i2ccmd & I2CCMD_READY) == 0)
12965 return -1;
12966 if ((i2ccmd & I2CCMD_ERROR) != 0)
12967 return -1;
12968
12969 *data = i2ccmd & 0x00ff;
12970
12971 return 0;
12972 }
12973
12974 static uint32_t
12975 wm_sfp_get_media_type(struct wm_softc *sc)
12976 {
12977 uint32_t ctrl_ext;
12978 uint8_t val = 0;
12979 int timeout = 3;
12980 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN;
12981 int rv = -1;
12982
12983 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
12984 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
12985 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA);
12986 CSR_WRITE_FLUSH(sc);
12987
12988 /* Read SFP module data */
12989 while (timeout) {
12990 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val);
12991 if (rv == 0)
12992 break;
12993 delay(100*1000); /* XXX too big */
12994 timeout--;
12995 }
12996 if (rv != 0)
12997 goto out;
12998
12999 switch (val) {
13000 case SFF_SFP_ID_SFF:
13001 aprint_normal_dev(sc->sc_dev,
13002 "Module/Connector soldered to board\n");
13003 break;
13004 case SFF_SFP_ID_SFP:
13005 sc->sc_flags |= WM_F_SFP;
13006 break;
13007 case SFF_SFP_ID_UNKNOWN:
13008 goto out;
13009 default:
13010 break;
13011 }
13012
13013 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val);
13014 if (rv != 0)
13015 goto out;
13016
13017 sc->sc_sfptype = val;
13018 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0)
13019 mediatype = WM_MEDIATYPE_SERDES;
13020 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0) {
13021 sc->sc_flags |= WM_F_SGMII;
13022 mediatype = WM_MEDIATYPE_COPPER;
13023 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0) {
13024 sc->sc_flags |= WM_F_SGMII;
13025 mediatype = WM_MEDIATYPE_SERDES;
13026 } else {
13027 device_printf(sc->sc_dev, "%s: unknown media type? (0x%hhx)\n",
13028 __func__, sc->sc_sfptype);
13029 sc->sc_sfptype = 0; /* XXX unknown */
13030 }
13031
13032 out:
13033 /* Restore I2C interface setting */
13034 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
13035
13036 return mediatype;
13037 }
13038
13039 /*
13040 * NVM related.
13041 * Microwire, SPI (w/wo EERD) and Flash.
13042 */
13043
13044 /* Both spi and uwire */
13045
13046 /*
13047 * wm_eeprom_sendbits:
13048 *
13049 * Send a series of bits to the EEPROM.
13050 */
13051 static void
13052 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits)
13053 {
13054 uint32_t reg;
13055 int x;
13056
13057 reg = CSR_READ(sc, WMREG_EECD);
13058
13059 for (x = nbits; x > 0; x--) {
13060 if (bits & (1U << (x - 1)))
13061 reg |= EECD_DI;
13062 else
13063 reg &= ~EECD_DI;
13064 CSR_WRITE(sc, WMREG_EECD, reg);
13065 CSR_WRITE_FLUSH(sc);
13066 delay(2);
13067 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
13068 CSR_WRITE_FLUSH(sc);
13069 delay(2);
13070 CSR_WRITE(sc, WMREG_EECD, reg);
13071 CSR_WRITE_FLUSH(sc);
13072 delay(2);
13073 }
13074 }
13075
13076 /*
13077 * wm_eeprom_recvbits:
13078 *
13079 * Receive a series of bits from the EEPROM.
13080 */
13081 static void
13082 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits)
13083 {
13084 uint32_t reg, val;
13085 int x;
13086
13087 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI;
13088
13089 val = 0;
13090 for (x = nbits; x > 0; x--) {
13091 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
13092 CSR_WRITE_FLUSH(sc);
13093 delay(2);
13094 if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
13095 val |= (1U << (x - 1));
13096 CSR_WRITE(sc, WMREG_EECD, reg);
13097 CSR_WRITE_FLUSH(sc);
13098 delay(2);
13099 }
13100 *valp = val;
13101 }
13102
13103 /* Microwire */
13104
13105 /*
13106 * wm_nvm_read_uwire:
13107 *
13108 * Read a word from the EEPROM using the MicroWire protocol.
13109 */
13110 static int
13111 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
13112 {
13113 uint32_t reg, val;
13114 int i;
13115
13116 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13117 device_xname(sc->sc_dev), __func__));
13118
13119 if (sc->nvm.acquire(sc) != 0)
13120 return -1;
13121
13122 for (i = 0; i < wordcnt; i++) {
13123 /* Clear SK and DI. */
13124 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI);
13125 CSR_WRITE(sc, WMREG_EECD, reg);
13126
13127 /*
13128 * XXX: workaround for a bug in qemu-0.12.x and prior
13129 * and Xen.
13130 *
13131 * We use this workaround only for 82540 because qemu's
13132 * e1000 act as 82540.
13133 */
13134 if (sc->sc_type == WM_T_82540) {
13135 reg |= EECD_SK;
13136 CSR_WRITE(sc, WMREG_EECD, reg);
13137 reg &= ~EECD_SK;
13138 CSR_WRITE(sc, WMREG_EECD, reg);
13139 CSR_WRITE_FLUSH(sc);
13140 delay(2);
13141 }
13142 /* XXX: end of workaround */
13143
13144 /* Set CHIP SELECT. */
13145 reg |= EECD_CS;
13146 CSR_WRITE(sc, WMREG_EECD, reg);
13147 CSR_WRITE_FLUSH(sc);
13148 delay(2);
13149
13150 /* Shift in the READ command. */
13151 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3);
13152
13153 /* Shift in address. */
13154 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits);
13155
13156 /* Shift out the data. */
13157 wm_eeprom_recvbits(sc, &val, 16);
13158 data[i] = val & 0xffff;
13159
13160 /* Clear CHIP SELECT. */
13161 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS;
13162 CSR_WRITE(sc, WMREG_EECD, reg);
13163 CSR_WRITE_FLUSH(sc);
13164 delay(2);
13165 }
13166
13167 sc->nvm.release(sc);
13168 return 0;
13169 }
13170
13171 /* SPI */
13172
13173 /*
13174 * Set SPI and FLASH related information from the EECD register.
13175 * For 82541 and 82547, the word size is taken from EEPROM.
13176 */
13177 static int
13178 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc)
13179 {
13180 int size;
13181 uint32_t reg;
13182 uint16_t data;
13183
13184 reg = CSR_READ(sc, WMREG_EECD);
13185 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8;
13186
13187 /* Read the size of NVM from EECD by default */
13188 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
13189 switch (sc->sc_type) {
13190 case WM_T_82541:
13191 case WM_T_82541_2:
13192 case WM_T_82547:
13193 case WM_T_82547_2:
13194 /* Set dummy value to access EEPROM */
13195 sc->sc_nvm_wordsize = 64;
13196 if (wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data) != 0) {
13197 aprint_error_dev(sc->sc_dev,
13198 "%s: failed to read EEPROM size\n", __func__);
13199 }
13200 reg = data;
13201 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
13202 if (size == 0)
13203 size = 6; /* 64 word size */
13204 else
13205 size += NVM_WORD_SIZE_BASE_SHIFT + 1;
13206 break;
13207 case WM_T_80003:
13208 case WM_T_82571:
13209 case WM_T_82572:
13210 case WM_T_82573: /* SPI case */
13211 case WM_T_82574: /* SPI case */
13212 case WM_T_82583: /* SPI case */
13213 size += NVM_WORD_SIZE_BASE_SHIFT;
13214 if (size > 14)
13215 size = 14;
13216 break;
13217 case WM_T_82575:
13218 case WM_T_82576:
13219 case WM_T_82580:
13220 case WM_T_I350:
13221 case WM_T_I354:
13222 case WM_T_I210:
13223 case WM_T_I211:
13224 size += NVM_WORD_SIZE_BASE_SHIFT;
13225 if (size > 15)
13226 size = 15;
13227 break;
13228 default:
13229 aprint_error_dev(sc->sc_dev,
13230 "%s: unknown device(%d)?\n", __func__, sc->sc_type);
13231 return -1;
13232 break;
13233 }
13234
13235 sc->sc_nvm_wordsize = 1 << size;
13236
13237 return 0;
13238 }
13239
13240 /*
13241 * wm_nvm_ready_spi:
13242 *
13243 * Wait for a SPI EEPROM to be ready for commands.
13244 */
13245 static int
13246 wm_nvm_ready_spi(struct wm_softc *sc)
13247 {
13248 uint32_t val;
13249 int usec;
13250
13251 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13252 device_xname(sc->sc_dev), __func__));
13253
13254 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) {
13255 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8);
13256 wm_eeprom_recvbits(sc, &val, 8);
13257 if ((val & SPI_SR_RDY) == 0)
13258 break;
13259 }
13260 if (usec >= SPI_MAX_RETRIES) {
13261 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n");
13262 return -1;
13263 }
13264 return 0;
13265 }
13266
13267 /*
13268 * wm_nvm_read_spi:
13269 *
13270 * Read a work from the EEPROM using the SPI protocol.
13271 */
13272 static int
13273 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
13274 {
13275 uint32_t reg, val;
13276 int i;
13277 uint8_t opc;
13278 int rv = 0;
13279
13280 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13281 device_xname(sc->sc_dev), __func__));
13282
13283 if (sc->nvm.acquire(sc) != 0)
13284 return -1;
13285
13286 /* Clear SK and CS. */
13287 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS);
13288 CSR_WRITE(sc, WMREG_EECD, reg);
13289 CSR_WRITE_FLUSH(sc);
13290 delay(2);
13291
13292 if ((rv = wm_nvm_ready_spi(sc)) != 0)
13293 goto out;
13294
13295 /* Toggle CS to flush commands. */
13296 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS);
13297 CSR_WRITE_FLUSH(sc);
13298 delay(2);
13299 CSR_WRITE(sc, WMREG_EECD, reg);
13300 CSR_WRITE_FLUSH(sc);
13301 delay(2);
13302
13303 opc = SPI_OPC_READ;
13304 if (sc->sc_nvm_addrbits == 8 && word >= 128)
13305 opc |= SPI_OPC_A8;
13306
13307 wm_eeprom_sendbits(sc, opc, 8);
13308 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits);
13309
13310 for (i = 0; i < wordcnt; i++) {
13311 wm_eeprom_recvbits(sc, &val, 16);
13312 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8);
13313 }
13314
13315 /* Raise CS and clear SK. */
13316 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS;
13317 CSR_WRITE(sc, WMREG_EECD, reg);
13318 CSR_WRITE_FLUSH(sc);
13319 delay(2);
13320
13321 out:
13322 sc->nvm.release(sc);
13323 return rv;
13324 }
13325
13326 /* Using with EERD */
13327
13328 static int
13329 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw)
13330 {
13331 uint32_t attempts = 100000;
13332 uint32_t i, reg = 0;
13333 int32_t done = -1;
13334
13335 for (i = 0; i < attempts; i++) {
13336 reg = CSR_READ(sc, rw);
13337
13338 if (reg & EERD_DONE) {
13339 done = 0;
13340 break;
13341 }
13342 delay(5);
13343 }
13344
13345 return done;
13346 }
13347
13348 static int
13349 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt, uint16_t *data)
13350 {
13351 int i, eerd = 0;
13352 int rv = 0;
13353
13354 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13355 device_xname(sc->sc_dev), __func__));
13356
13357 if (sc->nvm.acquire(sc) != 0)
13358 return -1;
13359
13360 for (i = 0; i < wordcnt; i++) {
13361 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START;
13362 CSR_WRITE(sc, WMREG_EERD, eerd);
13363 rv = wm_poll_eerd_eewr_done(sc, WMREG_EERD);
13364 if (rv != 0) {
13365 aprint_error_dev(sc->sc_dev, "EERD polling failed: "
13366 "offset=%d. wordcnt=%d\n", offset, wordcnt);
13367 break;
13368 }
13369 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT);
13370 }
13371
13372 sc->nvm.release(sc);
13373 return rv;
13374 }
13375
13376 /* Flash */
13377
13378 static int
13379 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank)
13380 {
13381 uint32_t eecd;
13382 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1;
13383 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t);
13384 uint32_t nvm_dword = 0;
13385 uint8_t sig_byte = 0;
13386 int rv;
13387
13388 switch (sc->sc_type) {
13389 case WM_T_PCH_SPT:
13390 case WM_T_PCH_CNP:
13391 bank1_offset = sc->sc_ich8_flash_bank_size * 2;
13392 act_offset = ICH_NVM_SIG_WORD * 2;
13393
13394 /* Set bank to 0 in case flash read fails. */
13395 *bank = 0;
13396
13397 /* Check bank 0 */
13398 rv = wm_read_ich8_dword(sc, act_offset, &nvm_dword);
13399 if (rv != 0)
13400 return rv;
13401 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8);
13402 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13403 *bank = 0;
13404 return 0;
13405 }
13406
13407 /* Check bank 1 */
13408 rv = wm_read_ich8_dword(sc, act_offset + bank1_offset,
13409 &nvm_dword);
13410 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8);
13411 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13412 *bank = 1;
13413 return 0;
13414 }
13415 aprint_error_dev(sc->sc_dev,
13416 "%s: no valid NVM bank present (%u)\n", __func__, *bank);
13417 return -1;
13418 case WM_T_ICH8:
13419 case WM_T_ICH9:
13420 eecd = CSR_READ(sc, WMREG_EECD);
13421 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) {
13422 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0;
13423 return 0;
13424 }
13425 /* FALLTHROUGH */
13426 default:
13427 /* Default to 0 */
13428 *bank = 0;
13429
13430 /* Check bank 0 */
13431 wm_read_ich8_byte(sc, act_offset, &sig_byte);
13432 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13433 *bank = 0;
13434 return 0;
13435 }
13436
13437 /* Check bank 1 */
13438 wm_read_ich8_byte(sc, act_offset + bank1_offset,
13439 &sig_byte);
13440 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
13441 *bank = 1;
13442 return 0;
13443 }
13444 }
13445
13446 DPRINTF(sc, WM_DEBUG_NVM, ("%s: No valid NVM bank present\n",
13447 device_xname(sc->sc_dev)));
13448 return -1;
13449 }
13450
13451 /******************************************************************************
13452 * This function does initial flash setup so that a new read/write/erase cycle
13453 * can be started.
13454 *
13455 * sc - The pointer to the hw structure
13456 ****************************************************************************/
13457 static int32_t
13458 wm_ich8_cycle_init(struct wm_softc *sc)
13459 {
13460 uint16_t hsfsts;
13461 int32_t error = 1;
13462 int32_t i = 0;
13463
13464 if (sc->sc_type >= WM_T_PCH_SPT)
13465 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) & 0xffffUL;
13466 else
13467 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
13468
13469 /* May be check the Flash Des Valid bit in Hw status */
13470 if ((hsfsts & HSFSTS_FLDVAL) == 0)
13471 return error;
13472
13473 /* Clear FCERR in Hw status by writing 1 */
13474 /* Clear DAEL in Hw status by writing a 1 */
13475 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL;
13476
13477 if (sc->sc_type >= WM_T_PCH_SPT)
13478 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, hsfsts & 0xffffUL);
13479 else
13480 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
13481
13482 /*
13483 * Either we should have a hardware SPI cycle in progress bit to check
13484 * against, in order to start a new cycle or FDONE bit should be
13485 * changed in the hardware so that it is 1 after hardware reset, which
13486 * can then be used as an indication whether a cycle is in progress or
13487 * has been completed .. we should also have some software semaphore
13488 * mechanism to guard FDONE or the cycle in progress bit so that two
13489 * threads access to those bits can be sequentiallized or a way so that
13490 * 2 threads don't start the cycle at the same time
13491 */
13492
13493 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
13494 /*
13495 * There is no cycle running at present, so we can start a
13496 * cycle
13497 */
13498
13499 /* Begin by setting Flash Cycle Done. */
13500 hsfsts |= HSFSTS_DONE;
13501 if (sc->sc_type >= WM_T_PCH_SPT)
13502 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13503 hsfsts & 0xffffUL);
13504 else
13505 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
13506 error = 0;
13507 } else {
13508 /*
13509 * Otherwise poll for sometime so the current cycle has a
13510 * chance to end before giving up.
13511 */
13512 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
13513 if (sc->sc_type >= WM_T_PCH_SPT)
13514 hsfsts = ICH8_FLASH_READ32(sc,
13515 ICH_FLASH_HSFSTS) & 0xffffUL;
13516 else
13517 hsfsts = ICH8_FLASH_READ16(sc,
13518 ICH_FLASH_HSFSTS);
13519 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
13520 error = 0;
13521 break;
13522 }
13523 delay(1);
13524 }
13525 if (error == 0) {
13526 /*
13527 * Successful in waiting for previous cycle to timeout,
13528 * now set the Flash Cycle Done.
13529 */
13530 hsfsts |= HSFSTS_DONE;
13531 if (sc->sc_type >= WM_T_PCH_SPT)
13532 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13533 hsfsts & 0xffffUL);
13534 else
13535 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS,
13536 hsfsts);
13537 }
13538 }
13539 return error;
13540 }
13541
13542 /******************************************************************************
13543 * This function starts a flash cycle and waits for its completion
13544 *
13545 * sc - The pointer to the hw structure
13546 ****************************************************************************/
13547 static int32_t
13548 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout)
13549 {
13550 uint16_t hsflctl;
13551 uint16_t hsfsts;
13552 int32_t error = 1;
13553 uint32_t i = 0;
13554
13555 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
13556 if (sc->sc_type >= WM_T_PCH_SPT)
13557 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) >> 16;
13558 else
13559 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
13560 hsflctl |= HSFCTL_GO;
13561 if (sc->sc_type >= WM_T_PCH_SPT)
13562 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13563 (uint32_t)hsflctl << 16);
13564 else
13565 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
13566
13567 /* Wait till FDONE bit is set to 1 */
13568 do {
13569 if (sc->sc_type >= WM_T_PCH_SPT)
13570 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS)
13571 & 0xffffUL;
13572 else
13573 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
13574 if (hsfsts & HSFSTS_DONE)
13575 break;
13576 delay(1);
13577 i++;
13578 } while (i < timeout);
13579 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0)
13580 error = 0;
13581
13582 return error;
13583 }
13584
13585 /******************************************************************************
13586 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers.
13587 *
13588 * sc - The pointer to the hw structure
13589 * index - The index of the byte or word to read.
13590 * size - Size of data to read, 1=byte 2=word, 4=dword
13591 * data - Pointer to the word to store the value read.
13592 *****************************************************************************/
13593 static int32_t
13594 wm_read_ich8_data(struct wm_softc *sc, uint32_t index,
13595 uint32_t size, uint32_t *data)
13596 {
13597 uint16_t hsfsts;
13598 uint16_t hsflctl;
13599 uint32_t flash_linear_address;
13600 uint32_t flash_data = 0;
13601 int32_t error = 1;
13602 int32_t count = 0;
13603
13604 if (size < 1 || size > 4 || data == 0x0 ||
13605 index > ICH_FLASH_LINEAR_ADDR_MASK)
13606 return error;
13607
13608 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
13609 sc->sc_ich8_flash_base;
13610
13611 do {
13612 delay(1);
13613 /* Steps */
13614 error = wm_ich8_cycle_init(sc);
13615 if (error)
13616 break;
13617
13618 if (sc->sc_type >= WM_T_PCH_SPT)
13619 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS)
13620 >> 16;
13621 else
13622 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
13623 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
13624 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT)
13625 & HSFCTL_BCOUNT_MASK;
13626 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT;
13627 if (sc->sc_type >= WM_T_PCH_SPT) {
13628 /*
13629 * In SPT, This register is in Lan memory space, not
13630 * flash. Therefore, only 32 bit access is supported.
13631 */
13632 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
13633 (uint32_t)hsflctl << 16);
13634 } else
13635 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
13636
13637 /*
13638 * Write the last 24 bits of index into Flash Linear address
13639 * field in Flash Address
13640 */
13641 /* TODO: TBD maybe check the index against the size of flash */
13642
13643 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address);
13644
13645 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT);
13646
13647 /*
13648 * Check if FCERR is set to 1, if set to 1, clear it and try
13649 * the whole sequence a few more times, else read in (shift in)
13650 * the Flash Data0, the order is least significant byte first
13651 * msb to lsb
13652 */
13653 if (error == 0) {
13654 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0);
13655 if (size == 1)
13656 *data = (uint8_t)(flash_data & 0x000000FF);
13657 else if (size == 2)
13658 *data = (uint16_t)(flash_data & 0x0000FFFF);
13659 else if (size == 4)
13660 *data = (uint32_t)flash_data;
13661 break;
13662 } else {
13663 /*
13664 * If we've gotten here, then things are probably
13665 * completely hosed, but if the error condition is
13666 * detected, it won't hurt to give it another try...
13667 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
13668 */
13669 if (sc->sc_type >= WM_T_PCH_SPT)
13670 hsfsts = ICH8_FLASH_READ32(sc,
13671 ICH_FLASH_HSFSTS) & 0xffffUL;
13672 else
13673 hsfsts = ICH8_FLASH_READ16(sc,
13674 ICH_FLASH_HSFSTS);
13675
13676 if (hsfsts & HSFSTS_ERR) {
13677 /* Repeat for some time before giving up. */
13678 continue;
13679 } else if ((hsfsts & HSFSTS_DONE) == 0)
13680 break;
13681 }
13682 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
13683
13684 return error;
13685 }
13686
13687 /******************************************************************************
13688 * Reads a single byte from the NVM using the ICH8 flash access registers.
13689 *
13690 * sc - pointer to wm_hw structure
13691 * index - The index of the byte to read.
13692 * data - Pointer to a byte to store the value read.
13693 *****************************************************************************/
13694 static int32_t
13695 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data)
13696 {
13697 int32_t status;
13698 uint32_t word = 0;
13699
13700 status = wm_read_ich8_data(sc, index, 1, &word);
13701 if (status == 0)
13702 *data = (uint8_t)word;
13703 else
13704 *data = 0;
13705
13706 return status;
13707 }
13708
13709 /******************************************************************************
13710 * Reads a word from the NVM using the ICH8 flash access registers.
13711 *
13712 * sc - pointer to wm_hw structure
13713 * index - The starting byte index of the word to read.
13714 * data - Pointer to a word to store the value read.
13715 *****************************************************************************/
13716 static int32_t
13717 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data)
13718 {
13719 int32_t status;
13720 uint32_t word = 0;
13721
13722 status = wm_read_ich8_data(sc, index, 2, &word);
13723 if (status == 0)
13724 *data = (uint16_t)word;
13725 else
13726 *data = 0;
13727
13728 return status;
13729 }
13730
13731 /******************************************************************************
13732 * Reads a dword from the NVM using the ICH8 flash access registers.
13733 *
13734 * sc - pointer to wm_hw structure
13735 * index - The starting byte index of the word to read.
13736 * data - Pointer to a word to store the value read.
13737 *****************************************************************************/
13738 static int32_t
13739 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data)
13740 {
13741 int32_t status;
13742
13743 status = wm_read_ich8_data(sc, index, 4, data);
13744 return status;
13745 }
13746
13747 /******************************************************************************
13748 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
13749 * register.
13750 *
13751 * sc - Struct containing variables accessed by shared code
13752 * offset - offset of word in the EEPROM to read
13753 * data - word read from the EEPROM
13754 * words - number of words to read
13755 *****************************************************************************/
13756 static int
13757 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data)
13758 {
13759 int32_t rv = 0;
13760 uint32_t flash_bank = 0;
13761 uint32_t act_offset = 0;
13762 uint32_t bank_offset = 0;
13763 uint16_t word = 0;
13764 uint16_t i = 0;
13765
13766 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13767 device_xname(sc->sc_dev), __func__));
13768
13769 if (sc->nvm.acquire(sc) != 0)
13770 return -1;
13771
13772 /*
13773 * We need to know which is the valid flash bank. In the event
13774 * that we didn't allocate eeprom_shadow_ram, we may not be
13775 * managing flash_bank. So it cannot be trusted and needs
13776 * to be updated with each read.
13777 */
13778 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
13779 if (rv) {
13780 DPRINTF(sc, WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
13781 device_xname(sc->sc_dev)));
13782 flash_bank = 0;
13783 }
13784
13785 /*
13786 * Adjust offset appropriately if we're on bank 1 - adjust for word
13787 * size
13788 */
13789 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
13790
13791 for (i = 0; i < words; i++) {
13792 /* The NVM part needs a byte offset, hence * 2 */
13793 act_offset = bank_offset + ((offset + i) * 2);
13794 rv = wm_read_ich8_word(sc, act_offset, &word);
13795 if (rv) {
13796 aprint_error_dev(sc->sc_dev,
13797 "%s: failed to read NVM\n", __func__);
13798 break;
13799 }
13800 data[i] = word;
13801 }
13802
13803 sc->nvm.release(sc);
13804 return rv;
13805 }
13806
13807 /******************************************************************************
13808 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access
13809 * register.
13810 *
13811 * sc - Struct containing variables accessed by shared code
13812 * offset - offset of word in the EEPROM to read
13813 * data - word read from the EEPROM
13814 * words - number of words to read
13815 *****************************************************************************/
13816 static int
13817 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data)
13818 {
13819 int32_t rv = 0;
13820 uint32_t flash_bank = 0;
13821 uint32_t act_offset = 0;
13822 uint32_t bank_offset = 0;
13823 uint32_t dword = 0;
13824 uint16_t i = 0;
13825
13826 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13827 device_xname(sc->sc_dev), __func__));
13828
13829 if (sc->nvm.acquire(sc) != 0)
13830 return -1;
13831
13832 /*
13833 * We need to know which is the valid flash bank. In the event
13834 * that we didn't allocate eeprom_shadow_ram, we may not be
13835 * managing flash_bank. So it cannot be trusted and needs
13836 * to be updated with each read.
13837 */
13838 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
13839 if (rv) {
13840 DPRINTF(sc, WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
13841 device_xname(sc->sc_dev)));
13842 flash_bank = 0;
13843 }
13844
13845 /*
13846 * Adjust offset appropriately if we're on bank 1 - adjust for word
13847 * size
13848 */
13849 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
13850
13851 for (i = 0; i < words; i++) {
13852 /* The NVM part needs a byte offset, hence * 2 */
13853 act_offset = bank_offset + ((offset + i) * 2);
13854 /* but we must read dword aligned, so mask ... */
13855 rv = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword);
13856 if (rv) {
13857 aprint_error_dev(sc->sc_dev,
13858 "%s: failed to read NVM\n", __func__);
13859 break;
13860 }
13861 /* ... and pick out low or high word */
13862 if ((act_offset & 0x2) == 0)
13863 data[i] = (uint16_t)(dword & 0xFFFF);
13864 else
13865 data[i] = (uint16_t)((dword >> 16) & 0xFFFF);
13866 }
13867
13868 sc->nvm.release(sc);
13869 return rv;
13870 }
13871
13872 /* iNVM */
13873
13874 static int
13875 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data)
13876 {
13877 int32_t rv = 0;
13878 uint32_t invm_dword;
13879 uint16_t i;
13880 uint8_t record_type, word_address;
13881
13882 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13883 device_xname(sc->sc_dev), __func__));
13884
13885 for (i = 0; i < INVM_SIZE; i++) {
13886 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i));
13887 /* Get record type */
13888 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
13889 if (record_type == INVM_UNINITIALIZED_STRUCTURE)
13890 break;
13891 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE)
13892 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
13893 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE)
13894 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
13895 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) {
13896 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
13897 if (word_address == address) {
13898 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
13899 rv = 0;
13900 break;
13901 }
13902 }
13903 }
13904
13905 return rv;
13906 }
13907
13908 static int
13909 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data)
13910 {
13911 int rv = 0;
13912 int i;
13913
13914 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
13915 device_xname(sc->sc_dev), __func__));
13916
13917 if (sc->nvm.acquire(sc) != 0)
13918 return -1;
13919
13920 for (i = 0; i < words; i++) {
13921 switch (offset + i) {
13922 case NVM_OFF_MACADDR:
13923 case NVM_OFF_MACADDR1:
13924 case NVM_OFF_MACADDR2:
13925 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]);
13926 if (rv != 0) {
13927 data[i] = 0xffff;
13928 rv = -1;
13929 }
13930 break;
13931 case NVM_OFF_CFG1: /* == INVM_AUTOLOAD */
13932 rv = wm_nvm_read_word_invm(sc, offset, data);
13933 if (rv != 0) {
13934 *data = INVM_DEFAULT_AL;
13935 rv = 0;
13936 }
13937 break;
13938 case NVM_OFF_CFG2:
13939 rv = wm_nvm_read_word_invm(sc, offset, data);
13940 if (rv != 0) {
13941 *data = NVM_INIT_CTRL_2_DEFAULT_I211;
13942 rv = 0;
13943 }
13944 break;
13945 case NVM_OFF_CFG4:
13946 rv = wm_nvm_read_word_invm(sc, offset, data);
13947 if (rv != 0) {
13948 *data = NVM_INIT_CTRL_4_DEFAULT_I211;
13949 rv = 0;
13950 }
13951 break;
13952 case NVM_OFF_LED_1_CFG:
13953 rv = wm_nvm_read_word_invm(sc, offset, data);
13954 if (rv != 0) {
13955 *data = NVM_LED_1_CFG_DEFAULT_I211;
13956 rv = 0;
13957 }
13958 break;
13959 case NVM_OFF_LED_0_2_CFG:
13960 rv = wm_nvm_read_word_invm(sc, offset, data);
13961 if (rv != 0) {
13962 *data = NVM_LED_0_2_CFG_DEFAULT_I211;
13963 rv = 0;
13964 }
13965 break;
13966 case NVM_OFF_ID_LED_SETTINGS:
13967 rv = wm_nvm_read_word_invm(sc, offset, data);
13968 if (rv != 0) {
13969 *data = ID_LED_RESERVED_FFFF;
13970 rv = 0;
13971 }
13972 break;
13973 default:
13974 DPRINTF(sc, WM_DEBUG_NVM,
13975 ("NVM word 0x%02x is not mapped.\n", offset));
13976 *data = NVM_RESERVED_WORD;
13977 break;
13978 }
13979 }
13980
13981 sc->nvm.release(sc);
13982 return rv;
13983 }
13984
13985 /* Lock, detecting NVM type, validate checksum, version and read */
13986
13987 static int
13988 wm_nvm_is_onboard_eeprom(struct wm_softc *sc)
13989 {
13990 uint32_t eecd = 0;
13991
13992 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574
13993 || sc->sc_type == WM_T_82583) {
13994 eecd = CSR_READ(sc, WMREG_EECD);
13995
13996 /* Isolate bits 15 & 16 */
13997 eecd = ((eecd >> 15) & 0x03);
13998
13999 /* If both bits are set, device is Flash type */
14000 if (eecd == 0x03)
14001 return 0;
14002 }
14003 return 1;
14004 }
14005
14006 static int
14007 wm_nvm_flash_presence_i210(struct wm_softc *sc)
14008 {
14009 uint32_t eec;
14010
14011 eec = CSR_READ(sc, WMREG_EEC);
14012 if ((eec & EEC_FLASH_DETECTED) != 0)
14013 return 1;
14014
14015 return 0;
14016 }
14017
14018 /*
14019 * wm_nvm_validate_checksum
14020 *
14021 * The checksum is defined as the sum of the first 64 (16 bit) words.
14022 */
14023 static int
14024 wm_nvm_validate_checksum(struct wm_softc *sc)
14025 {
14026 uint16_t checksum;
14027 uint16_t eeprom_data;
14028 #ifdef WM_DEBUG
14029 uint16_t csum_wordaddr, valid_checksum;
14030 #endif
14031 int i;
14032
14033 checksum = 0;
14034
14035 /* Don't check for I211 */
14036 if (sc->sc_type == WM_T_I211)
14037 return 0;
14038
14039 #ifdef WM_DEBUG
14040 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
14041 || (sc->sc_type == WM_T_PCH_CNP)) {
14042 csum_wordaddr = NVM_OFF_COMPAT;
14043 valid_checksum = NVM_COMPAT_VALID_CHECKSUM;
14044 } else {
14045 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1;
14046 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM;
14047 }
14048
14049 /* Dump EEPROM image for debug */
14050 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
14051 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
14052 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
14053 /* XXX PCH_SPT? */
14054 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data);
14055 if ((eeprom_data & valid_checksum) == 0)
14056 DPRINTF(sc, WM_DEBUG_NVM,
14057 ("%s: NVM need to be updated (%04x != %04x)\n",
14058 device_xname(sc->sc_dev), eeprom_data,
14059 valid_checksum));
14060 }
14061
14062 if ((sc->sc_debug & WM_DEBUG_NVM) != 0) {
14063 printf("%s: NVM dump:\n", device_xname(sc->sc_dev));
14064 for (i = 0; i < NVM_SIZE; i++) {
14065 if (wm_nvm_read(sc, i, 1, &eeprom_data))
14066 printf("XXXX ");
14067 else
14068 printf("%04hx ", eeprom_data);
14069 if (i % 8 == 7)
14070 printf("\n");
14071 }
14072 }
14073
14074 #endif /* WM_DEBUG */
14075
14076 for (i = 0; i < NVM_SIZE; i++) {
14077 if (wm_nvm_read(sc, i, 1, &eeprom_data))
14078 return 1;
14079 checksum += eeprom_data;
14080 }
14081
14082 if (checksum != (uint16_t) NVM_CHECKSUM) {
14083 #ifdef WM_DEBUG
14084 printf("%s: NVM checksum mismatch (%04x != %04x)\n",
14085 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM);
14086 #endif
14087 }
14088
14089 return 0;
14090 }
14091
14092 static void
14093 wm_nvm_version_invm(struct wm_softc *sc)
14094 {
14095 uint32_t dword;
14096
14097 /*
14098 * Linux's code to decode version is very strange, so we don't
14099 * obey that algorithm and just use word 61 as the document.
14100 * Perhaps it's not perfect though...
14101 *
14102 * Example:
14103 *
14104 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6)
14105 */
14106 dword = CSR_READ(sc, WM_INVM_DATA_REG(61));
14107 dword = __SHIFTOUT(dword, INVM_VER_1);
14108 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR);
14109 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR);
14110 }
14111
14112 static void
14113 wm_nvm_version(struct wm_softc *sc)
14114 {
14115 uint16_t major, minor, build, patch;
14116 uint16_t uid0, uid1;
14117 uint16_t nvm_data;
14118 uint16_t off;
14119 bool check_version = false;
14120 bool check_optionrom = false;
14121 bool have_build = false;
14122 bool have_uid = true;
14123
14124 /*
14125 * Version format:
14126 *
14127 * XYYZ
14128 * X0YZ
14129 * X0YY
14130 *
14131 * Example:
14132 *
14133 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10)
14134 * 82571 0x50a6 5.10.6?
14135 * 82572 0x506a 5.6.10?
14136 * 82572EI 0x5069 5.6.9?
14137 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4)
14138 * 0x2013 2.1.3?
14139 * 82583 0x10a0 1.10.0? (document says it's default value)
14140 * ICH8+82567 0x0040 0.4.0?
14141 * ICH9+82566 0x1040 1.4.0?
14142 *ICH10+82567 0x0043 0.4.3?
14143 * PCH+82577 0x00c1 0.12.1?
14144 * PCH2+82579 0x00d3 0.13.3?
14145 * 0x00d4 0.13.4?
14146 * LPT+I218 0x0023 0.2.3?
14147 * SPT+I219 0x0084 0.8.4?
14148 * CNP+I219 0x0054 0.5.4?
14149 */
14150
14151 /*
14152 * XXX
14153 * Qemu's e1000e emulation (82574L)'s SPI has only 64 words.
14154 * I've never seen on real 82574 hardware with such small SPI ROM.
14155 */
14156 if ((sc->sc_nvm_wordsize < NVM_OFF_IMAGE_UID1)
14157 || (wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1) != 0))
14158 have_uid = false;
14159
14160 switch (sc->sc_type) {
14161 case WM_T_82571:
14162 case WM_T_82572:
14163 case WM_T_82574:
14164 case WM_T_82583:
14165 check_version = true;
14166 check_optionrom = true;
14167 have_build = true;
14168 break;
14169 case WM_T_ICH8:
14170 case WM_T_ICH9:
14171 case WM_T_ICH10:
14172 case WM_T_PCH:
14173 case WM_T_PCH2:
14174 case WM_T_PCH_LPT:
14175 case WM_T_PCH_SPT:
14176 case WM_T_PCH_CNP:
14177 check_version = true;
14178 have_build = true;
14179 have_uid = false;
14180 break;
14181 case WM_T_82575:
14182 case WM_T_82576:
14183 case WM_T_82580:
14184 if (have_uid && (uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID)
14185 check_version = true;
14186 break;
14187 case WM_T_I211:
14188 wm_nvm_version_invm(sc);
14189 have_uid = false;
14190 goto printver;
14191 case WM_T_I210:
14192 if (!wm_nvm_flash_presence_i210(sc)) {
14193 wm_nvm_version_invm(sc);
14194 have_uid = false;
14195 goto printver;
14196 }
14197 /* FALLTHROUGH */
14198 case WM_T_I350:
14199 case WM_T_I354:
14200 check_version = true;
14201 check_optionrom = true;
14202 break;
14203 default:
14204 return;
14205 }
14206 if (check_version
14207 && (wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data) == 0)) {
14208 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
14209 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) {
14210 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT;
14211 build = nvm_data & NVM_BUILD_MASK;
14212 have_build = true;
14213 } else
14214 minor = nvm_data & 0x00ff;
14215
14216 /* Decimal */
14217 minor = (minor / 16) * 10 + (minor % 16);
14218 sc->sc_nvm_ver_major = major;
14219 sc->sc_nvm_ver_minor = minor;
14220
14221 printver:
14222 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major,
14223 sc->sc_nvm_ver_minor);
14224 if (have_build) {
14225 sc->sc_nvm_ver_build = build;
14226 aprint_verbose(".%d", build);
14227 }
14228 }
14229
14230 /* Assume the Option ROM area is at avove NVM_SIZE */
14231 if ((sc->sc_nvm_wordsize > NVM_SIZE) && check_optionrom
14232 && (wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off) == 0)) {
14233 /* Option ROM Version */
14234 if ((off != 0x0000) && (off != 0xffff)) {
14235 int rv;
14236
14237 off += NVM_COMBO_VER_OFF;
14238 rv = wm_nvm_read(sc, off + 1, 1, &uid1);
14239 rv |= wm_nvm_read(sc, off, 1, &uid0);
14240 if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff)
14241 && (uid1 != 0) && (uid1 != 0xffff)) {
14242 /* 16bits */
14243 major = uid0 >> 8;
14244 build = (uid0 << 8) | (uid1 >> 8);
14245 patch = uid1 & 0x00ff;
14246 aprint_verbose(", option ROM Version %d.%d.%d",
14247 major, build, patch);
14248 }
14249 }
14250 }
14251
14252 if (have_uid && (wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0) == 0))
14253 aprint_verbose(", Image Unique ID %08x",
14254 ((uint32_t)uid1 << 16) | uid0);
14255 }
14256
14257 /*
14258 * wm_nvm_read:
14259 *
14260 * Read data from the serial EEPROM.
14261 */
14262 static int
14263 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
14264 {
14265 int rv;
14266
14267 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n",
14268 device_xname(sc->sc_dev), __func__));
14269
14270 if (sc->sc_flags & WM_F_EEPROM_INVALID)
14271 return -1;
14272
14273 rv = sc->nvm.read(sc, word, wordcnt, data);
14274
14275 return rv;
14276 }
14277
14278 /*
14279 * Hardware semaphores.
14280 * Very complexed...
14281 */
14282
14283 static int
14284 wm_get_null(struct wm_softc *sc)
14285 {
14286
14287 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14288 device_xname(sc->sc_dev), __func__));
14289 return 0;
14290 }
14291
14292 static void
14293 wm_put_null(struct wm_softc *sc)
14294 {
14295
14296 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14297 device_xname(sc->sc_dev), __func__));
14298 return;
14299 }
14300
14301 static int
14302 wm_get_eecd(struct wm_softc *sc)
14303 {
14304 uint32_t reg;
14305 int x;
14306
14307 DPRINTF(sc, WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
14308 device_xname(sc->sc_dev), __func__));
14309
14310 reg = CSR_READ(sc, WMREG_EECD);
14311
14312 /* Request EEPROM access. */
14313 reg |= EECD_EE_REQ;
14314 CSR_WRITE(sc, WMREG_EECD, reg);
14315
14316 /* ..and wait for it to be granted. */
14317 for (x = 0; x < 1000; x++) {
14318 reg = CSR_READ(sc, WMREG_EECD);
14319 if (reg & EECD_EE_GNT)
14320 break;
14321 delay(5);
14322 }
14323 if ((reg & EECD_EE_GNT) == 0) {
14324 aprint_error_dev(sc->sc_dev,
14325 "could not acquire EEPROM GNT\n");
14326 reg &= ~EECD_EE_REQ;
14327 CSR_WRITE(sc, WMREG_EECD, reg);
14328 return -1;
14329 }
14330
14331 return 0;
14332 }
14333
14334 static void
14335 wm_nvm_eec_clock_raise(struct wm_softc *sc, uint32_t *eecd)
14336 {
14337
14338 *eecd |= EECD_SK;
14339 CSR_WRITE(sc, WMREG_EECD, *eecd);
14340 CSR_WRITE_FLUSH(sc);
14341 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
14342 delay(1);
14343 else
14344 delay(50);
14345 }
14346
14347 static void
14348 wm_nvm_eec_clock_lower(struct wm_softc *sc, uint32_t *eecd)
14349 {
14350
14351 *eecd &= ~EECD_SK;
14352 CSR_WRITE(sc, WMREG_EECD, *eecd);
14353 CSR_WRITE_FLUSH(sc);
14354 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
14355 delay(1);
14356 else
14357 delay(50);
14358 }
14359
14360 static void
14361 wm_put_eecd(struct wm_softc *sc)
14362 {
14363 uint32_t reg;
14364
14365 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14366 device_xname(sc->sc_dev), __func__));
14367
14368 /* Stop nvm */
14369 reg = CSR_READ(sc, WMREG_EECD);
14370 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) {
14371 /* Pull CS high */
14372 reg |= EECD_CS;
14373 wm_nvm_eec_clock_lower(sc, ®);
14374 } else {
14375 /* CS on Microwire is active-high */
14376 reg &= ~(EECD_CS | EECD_DI);
14377 CSR_WRITE(sc, WMREG_EECD, reg);
14378 wm_nvm_eec_clock_raise(sc, ®);
14379 wm_nvm_eec_clock_lower(sc, ®);
14380 }
14381
14382 reg = CSR_READ(sc, WMREG_EECD);
14383 reg &= ~EECD_EE_REQ;
14384 CSR_WRITE(sc, WMREG_EECD, reg);
14385
14386 return;
14387 }
14388
14389 /*
14390 * Get hardware semaphore.
14391 * Same as e1000_get_hw_semaphore_generic()
14392 */
14393 static int
14394 wm_get_swsm_semaphore(struct wm_softc *sc)
14395 {
14396 int32_t timeout;
14397 uint32_t swsm;
14398
14399 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14400 device_xname(sc->sc_dev), __func__));
14401 KASSERT(sc->sc_nvm_wordsize > 0);
14402
14403 retry:
14404 /* Get the SW semaphore. */
14405 timeout = sc->sc_nvm_wordsize + 1;
14406 while (timeout) {
14407 swsm = CSR_READ(sc, WMREG_SWSM);
14408
14409 if ((swsm & SWSM_SMBI) == 0)
14410 break;
14411
14412 delay(50);
14413 timeout--;
14414 }
14415
14416 if (timeout == 0) {
14417 if ((sc->sc_flags & WM_F_WA_I210_CLSEM) != 0) {
14418 /*
14419 * In rare circumstances, the SW semaphore may already
14420 * be held unintentionally. Clear the semaphore once
14421 * before giving up.
14422 */
14423 sc->sc_flags &= ~WM_F_WA_I210_CLSEM;
14424 wm_put_swsm_semaphore(sc);
14425 goto retry;
14426 }
14427 aprint_error_dev(sc->sc_dev,
14428 "could not acquire SWSM SMBI\n");
14429 return 1;
14430 }
14431
14432 /* Get the FW semaphore. */
14433 timeout = sc->sc_nvm_wordsize + 1;
14434 while (timeout) {
14435 swsm = CSR_READ(sc, WMREG_SWSM);
14436 swsm |= SWSM_SWESMBI;
14437 CSR_WRITE(sc, WMREG_SWSM, swsm);
14438 /* If we managed to set the bit we got the semaphore. */
14439 swsm = CSR_READ(sc, WMREG_SWSM);
14440 if (swsm & SWSM_SWESMBI)
14441 break;
14442
14443 delay(50);
14444 timeout--;
14445 }
14446
14447 if (timeout == 0) {
14448 aprint_error_dev(sc->sc_dev,
14449 "could not acquire SWSM SWESMBI\n");
14450 /* Release semaphores */
14451 wm_put_swsm_semaphore(sc);
14452 return 1;
14453 }
14454 return 0;
14455 }
14456
14457 /*
14458 * Put hardware semaphore.
14459 * Same as e1000_put_hw_semaphore_generic()
14460 */
14461 static void
14462 wm_put_swsm_semaphore(struct wm_softc *sc)
14463 {
14464 uint32_t swsm;
14465
14466 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14467 device_xname(sc->sc_dev), __func__));
14468
14469 swsm = CSR_READ(sc, WMREG_SWSM);
14470 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI);
14471 CSR_WRITE(sc, WMREG_SWSM, swsm);
14472 }
14473
14474 /*
14475 * Get SW/FW semaphore.
14476 * Same as e1000_acquire_swfw_sync_{80003es2lan,82575}().
14477 */
14478 static int
14479 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
14480 {
14481 uint32_t swfw_sync;
14482 uint32_t swmask = mask << SWFW_SOFT_SHIFT;
14483 uint32_t fwmask = mask << SWFW_FIRM_SHIFT;
14484 int timeout;
14485
14486 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14487 device_xname(sc->sc_dev), __func__));
14488
14489 if (sc->sc_type == WM_T_80003)
14490 timeout = 50;
14491 else
14492 timeout = 200;
14493
14494 while (timeout) {
14495 if (wm_get_swsm_semaphore(sc)) {
14496 aprint_error_dev(sc->sc_dev,
14497 "%s: failed to get semaphore\n",
14498 __func__);
14499 return 1;
14500 }
14501 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
14502 if ((swfw_sync & (swmask | fwmask)) == 0) {
14503 swfw_sync |= swmask;
14504 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
14505 wm_put_swsm_semaphore(sc);
14506 return 0;
14507 }
14508 wm_put_swsm_semaphore(sc);
14509 delay(5000);
14510 timeout--;
14511 }
14512 device_printf(sc->sc_dev,
14513 "failed to get swfw semaphore mask 0x%x swfw 0x%x\n",
14514 mask, swfw_sync);
14515 return 1;
14516 }
14517
14518 static void
14519 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
14520 {
14521 uint32_t swfw_sync;
14522
14523 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14524 device_xname(sc->sc_dev), __func__));
14525
14526 while (wm_get_swsm_semaphore(sc) != 0)
14527 continue;
14528
14529 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
14530 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT);
14531 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
14532
14533 wm_put_swsm_semaphore(sc);
14534 }
14535
14536 static int
14537 wm_get_nvm_80003(struct wm_softc *sc)
14538 {
14539 int rv;
14540
14541 DPRINTF(sc, WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
14542 device_xname(sc->sc_dev), __func__));
14543
14544 if ((rv = wm_get_swfw_semaphore(sc, SWFW_EEP_SM)) != 0) {
14545 aprint_error_dev(sc->sc_dev,
14546 "%s: failed to get semaphore(SWFW)\n", __func__);
14547 return rv;
14548 }
14549
14550 if (((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14551 && (rv = wm_get_eecd(sc)) != 0) {
14552 aprint_error_dev(sc->sc_dev,
14553 "%s: failed to get semaphore(EECD)\n", __func__);
14554 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
14555 return rv;
14556 }
14557
14558 return 0;
14559 }
14560
14561 static void
14562 wm_put_nvm_80003(struct wm_softc *sc)
14563 {
14564
14565 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14566 device_xname(sc->sc_dev), __func__));
14567
14568 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14569 wm_put_eecd(sc);
14570 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
14571 }
14572
14573 static int
14574 wm_get_nvm_82571(struct wm_softc *sc)
14575 {
14576 int rv;
14577
14578 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14579 device_xname(sc->sc_dev), __func__));
14580
14581 if ((rv = wm_get_swsm_semaphore(sc)) != 0)
14582 return rv;
14583
14584 switch (sc->sc_type) {
14585 case WM_T_82573:
14586 break;
14587 default:
14588 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14589 rv = wm_get_eecd(sc);
14590 break;
14591 }
14592
14593 if (rv != 0) {
14594 aprint_error_dev(sc->sc_dev,
14595 "%s: failed to get semaphore\n",
14596 __func__);
14597 wm_put_swsm_semaphore(sc);
14598 }
14599
14600 return rv;
14601 }
14602
14603 static void
14604 wm_put_nvm_82571(struct wm_softc *sc)
14605 {
14606
14607 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14608 device_xname(sc->sc_dev), __func__));
14609
14610 switch (sc->sc_type) {
14611 case WM_T_82573:
14612 break;
14613 default:
14614 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
14615 wm_put_eecd(sc);
14616 break;
14617 }
14618
14619 wm_put_swsm_semaphore(sc);
14620 }
14621
14622 static int
14623 wm_get_phy_82575(struct wm_softc *sc)
14624 {
14625
14626 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14627 device_xname(sc->sc_dev), __func__));
14628 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
14629 }
14630
14631 static void
14632 wm_put_phy_82575(struct wm_softc *sc)
14633 {
14634
14635 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14636 device_xname(sc->sc_dev), __func__));
14637 wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
14638 }
14639
14640 static int
14641 wm_get_swfwhw_semaphore(struct wm_softc *sc)
14642 {
14643 uint32_t ext_ctrl;
14644 int timeout = 200;
14645
14646 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14647 device_xname(sc->sc_dev), __func__));
14648
14649 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
14650 for (timeout = 0; timeout < 200; timeout++) {
14651 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14652 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
14653 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14654
14655 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14656 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
14657 return 0;
14658 delay(5000);
14659 }
14660 device_printf(sc->sc_dev,
14661 "failed to get swfwhw semaphore ext_ctrl 0x%x\n", ext_ctrl);
14662 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
14663 return 1;
14664 }
14665
14666 static void
14667 wm_put_swfwhw_semaphore(struct wm_softc *sc)
14668 {
14669 uint32_t ext_ctrl;
14670
14671 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14672 device_xname(sc->sc_dev), __func__));
14673
14674 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14675 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14676 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14677
14678 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
14679 }
14680
14681 static int
14682 wm_get_swflag_ich8lan(struct wm_softc *sc)
14683 {
14684 uint32_t ext_ctrl;
14685 int timeout;
14686
14687 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14688 device_xname(sc->sc_dev), __func__));
14689 mutex_enter(sc->sc_ich_phymtx);
14690 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) {
14691 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14692 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0)
14693 break;
14694 delay(1000);
14695 }
14696 if (timeout >= WM_PHY_CFG_TIMEOUT) {
14697 device_printf(sc->sc_dev,
14698 "SW has already locked the resource\n");
14699 goto out;
14700 }
14701
14702 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
14703 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14704 for (timeout = 0; timeout < 1000; timeout++) {
14705 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14706 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
14707 break;
14708 delay(1000);
14709 }
14710 if (timeout >= 1000) {
14711 device_printf(sc->sc_dev, "failed to acquire semaphore\n");
14712 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14713 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14714 goto out;
14715 }
14716 return 0;
14717
14718 out:
14719 mutex_exit(sc->sc_ich_phymtx);
14720 return 1;
14721 }
14722
14723 static void
14724 wm_put_swflag_ich8lan(struct wm_softc *sc)
14725 {
14726 uint32_t ext_ctrl;
14727
14728 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14729 device_xname(sc->sc_dev), __func__));
14730 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
14731 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) {
14732 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14733 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
14734 } else {
14735 device_printf(sc->sc_dev, "Semaphore unexpectedly released\n");
14736 }
14737
14738 mutex_exit(sc->sc_ich_phymtx);
14739 }
14740
14741 static int
14742 wm_get_nvm_ich8lan(struct wm_softc *sc)
14743 {
14744
14745 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14746 device_xname(sc->sc_dev), __func__));
14747 mutex_enter(sc->sc_ich_nvmmtx);
14748
14749 return 0;
14750 }
14751
14752 static void
14753 wm_put_nvm_ich8lan(struct wm_softc *sc)
14754 {
14755
14756 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14757 device_xname(sc->sc_dev), __func__));
14758 mutex_exit(sc->sc_ich_nvmmtx);
14759 }
14760
14761 static int
14762 wm_get_hw_semaphore_82573(struct wm_softc *sc)
14763 {
14764 int i = 0;
14765 uint32_t reg;
14766
14767 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14768 device_xname(sc->sc_dev), __func__));
14769
14770 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14771 do {
14772 CSR_WRITE(sc, WMREG_EXTCNFCTR,
14773 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP);
14774 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14775 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0)
14776 break;
14777 delay(2*1000);
14778 i++;
14779 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT);
14780
14781 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) {
14782 wm_put_hw_semaphore_82573(sc);
14783 log(LOG_ERR, "%s: Driver can't access the PHY\n",
14784 device_xname(sc->sc_dev));
14785 return -1;
14786 }
14787
14788 return 0;
14789 }
14790
14791 static void
14792 wm_put_hw_semaphore_82573(struct wm_softc *sc)
14793 {
14794 uint32_t reg;
14795
14796 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14797 device_xname(sc->sc_dev), __func__));
14798
14799 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
14800 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
14801 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
14802 }
14803
14804 /*
14805 * Management mode and power management related subroutines.
14806 * BMC, AMT, suspend/resume and EEE.
14807 */
14808
14809 #ifdef WM_WOL
14810 static int
14811 wm_check_mng_mode(struct wm_softc *sc)
14812 {
14813 int rv;
14814
14815 switch (sc->sc_type) {
14816 case WM_T_ICH8:
14817 case WM_T_ICH9:
14818 case WM_T_ICH10:
14819 case WM_T_PCH:
14820 case WM_T_PCH2:
14821 case WM_T_PCH_LPT:
14822 case WM_T_PCH_SPT:
14823 case WM_T_PCH_CNP:
14824 rv = wm_check_mng_mode_ich8lan(sc);
14825 break;
14826 case WM_T_82574:
14827 case WM_T_82583:
14828 rv = wm_check_mng_mode_82574(sc);
14829 break;
14830 case WM_T_82571:
14831 case WM_T_82572:
14832 case WM_T_82573:
14833 case WM_T_80003:
14834 rv = wm_check_mng_mode_generic(sc);
14835 break;
14836 default:
14837 /* Noting to do */
14838 rv = 0;
14839 break;
14840 }
14841
14842 return rv;
14843 }
14844
14845 static int
14846 wm_check_mng_mode_ich8lan(struct wm_softc *sc)
14847 {
14848 uint32_t fwsm;
14849
14850 fwsm = CSR_READ(sc, WMREG_FWSM);
14851
14852 if (((fwsm & FWSM_FW_VALID) != 0)
14853 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
14854 return 1;
14855
14856 return 0;
14857 }
14858
14859 static int
14860 wm_check_mng_mode_82574(struct wm_softc *sc)
14861 {
14862 uint16_t data;
14863
14864 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
14865
14866 if ((data & NVM_CFG2_MNGM_MASK) != 0)
14867 return 1;
14868
14869 return 0;
14870 }
14871
14872 static int
14873 wm_check_mng_mode_generic(struct wm_softc *sc)
14874 {
14875 uint32_t fwsm;
14876
14877 fwsm = CSR_READ(sc, WMREG_FWSM);
14878
14879 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE)
14880 return 1;
14881
14882 return 0;
14883 }
14884 #endif /* WM_WOL */
14885
14886 static int
14887 wm_enable_mng_pass_thru(struct wm_softc *sc)
14888 {
14889 uint32_t manc, fwsm, factps;
14890
14891 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0)
14892 return 0;
14893
14894 manc = CSR_READ(sc, WMREG_MANC);
14895
14896 DPRINTF(sc, WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n",
14897 device_xname(sc->sc_dev), manc));
14898 if ((manc & MANC_RECV_TCO_EN) == 0)
14899 return 0;
14900
14901 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) {
14902 fwsm = CSR_READ(sc, WMREG_FWSM);
14903 factps = CSR_READ(sc, WMREG_FACTPS);
14904 if (((factps & FACTPS_MNGCG) == 0)
14905 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
14906 return 1;
14907 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
14908 uint16_t data;
14909
14910 factps = CSR_READ(sc, WMREG_FACTPS);
14911 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
14912 DPRINTF(sc, WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n",
14913 device_xname(sc->sc_dev), factps, data));
14914 if (((factps & FACTPS_MNGCG) == 0)
14915 && ((data & NVM_CFG2_MNGM_MASK)
14916 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT)))
14917 return 1;
14918 } else if (((manc & MANC_SMBUS_EN) != 0)
14919 && ((manc & MANC_ASF_EN) == 0))
14920 return 1;
14921
14922 return 0;
14923 }
14924
14925 static bool
14926 wm_phy_resetisblocked(struct wm_softc *sc)
14927 {
14928 bool blocked = false;
14929 uint32_t reg;
14930 int i = 0;
14931
14932 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
14933 device_xname(sc->sc_dev), __func__));
14934
14935 switch (sc->sc_type) {
14936 case WM_T_ICH8:
14937 case WM_T_ICH9:
14938 case WM_T_ICH10:
14939 case WM_T_PCH:
14940 case WM_T_PCH2:
14941 case WM_T_PCH_LPT:
14942 case WM_T_PCH_SPT:
14943 case WM_T_PCH_CNP:
14944 do {
14945 reg = CSR_READ(sc, WMREG_FWSM);
14946 if ((reg & FWSM_RSPCIPHY) == 0) {
14947 blocked = true;
14948 delay(10*1000);
14949 continue;
14950 }
14951 blocked = false;
14952 } while (blocked && (i++ < 30));
14953 return blocked;
14954 break;
14955 case WM_T_82571:
14956 case WM_T_82572:
14957 case WM_T_82573:
14958 case WM_T_82574:
14959 case WM_T_82583:
14960 case WM_T_80003:
14961 reg = CSR_READ(sc, WMREG_MANC);
14962 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0)
14963 return true;
14964 else
14965 return false;
14966 break;
14967 default:
14968 /* No problem */
14969 break;
14970 }
14971
14972 return false;
14973 }
14974
14975 static void
14976 wm_get_hw_control(struct wm_softc *sc)
14977 {
14978 uint32_t reg;
14979
14980 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14981 device_xname(sc->sc_dev), __func__));
14982
14983 if (sc->sc_type == WM_T_82573) {
14984 reg = CSR_READ(sc, WMREG_SWSM);
14985 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD);
14986 } else if (sc->sc_type >= WM_T_82571) {
14987 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14988 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
14989 }
14990 }
14991
14992 static void
14993 wm_release_hw_control(struct wm_softc *sc)
14994 {
14995 uint32_t reg;
14996
14997 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n",
14998 device_xname(sc->sc_dev), __func__));
14999
15000 if (sc->sc_type == WM_T_82573) {
15001 reg = CSR_READ(sc, WMREG_SWSM);
15002 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD);
15003 } else if (sc->sc_type >= WM_T_82571) {
15004 reg = CSR_READ(sc, WMREG_CTRL_EXT);
15005 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD);
15006 }
15007 }
15008
15009 static void
15010 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate)
15011 {
15012 uint32_t reg;
15013
15014 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
15015 device_xname(sc->sc_dev), __func__));
15016
15017 if (sc->sc_type < WM_T_PCH2)
15018 return;
15019
15020 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
15021
15022 if (gate)
15023 reg |= EXTCNFCTR_GATE_PHY_CFG;
15024 else
15025 reg &= ~EXTCNFCTR_GATE_PHY_CFG;
15026
15027 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
15028 }
15029
15030 static int
15031 wm_init_phy_workarounds_pchlan(struct wm_softc *sc)
15032 {
15033 uint32_t fwsm, reg;
15034 int rv = 0;
15035
15036 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
15037 device_xname(sc->sc_dev), __func__));
15038
15039 /* Gate automatic PHY configuration by hardware on non-managed 82579 */
15040 wm_gate_hw_phy_config_ich8lan(sc, true);
15041
15042 /* Disable ULP */
15043 wm_ulp_disable(sc);
15044
15045 /* Acquire PHY semaphore */
15046 rv = sc->phy.acquire(sc);
15047 if (rv != 0) {
15048 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: failed\n",
15049 device_xname(sc->sc_dev), __func__));
15050 return -1;
15051 }
15052
15053 /* The MAC-PHY interconnect may be in SMBus mode. If the PHY is
15054 * inaccessible and resetting the PHY is not blocked, toggle the
15055 * LANPHYPC Value bit to force the interconnect to PCIe mode.
15056 */
15057 fwsm = CSR_READ(sc, WMREG_FWSM);
15058 switch (sc->sc_type) {
15059 case WM_T_PCH_LPT:
15060 case WM_T_PCH_SPT:
15061 case WM_T_PCH_CNP:
15062 if (wm_phy_is_accessible_pchlan(sc))
15063 break;
15064
15065 /* Before toggling LANPHYPC, see if PHY is accessible by
15066 * forcing MAC to SMBus mode first.
15067 */
15068 reg = CSR_READ(sc, WMREG_CTRL_EXT);
15069 reg |= CTRL_EXT_FORCE_SMBUS;
15070 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
15071 #if 0
15072 /* XXX Isn't this required??? */
15073 CSR_WRITE_FLUSH(sc);
15074 #endif
15075 /* Wait 50 milliseconds for MAC to finish any retries
15076 * that it might be trying to perform from previous
15077 * attempts to acknowledge any phy read requests.
15078 */
15079 delay(50 * 1000);
15080 /* FALLTHROUGH */
15081 case WM_T_PCH2:
15082 if (wm_phy_is_accessible_pchlan(sc) == true)
15083 break;
15084 /* FALLTHROUGH */
15085 case WM_T_PCH:
15086 if (sc->sc_type == WM_T_PCH)
15087 if ((fwsm & FWSM_FW_VALID) != 0)
15088 break;
15089
15090 if (wm_phy_resetisblocked(sc) == true) {
15091 device_printf(sc->sc_dev, "XXX reset is blocked(3)\n");
15092 break;
15093 }
15094
15095 /* Toggle LANPHYPC Value bit */
15096 wm_toggle_lanphypc_pch_lpt(sc);
15097
15098 if (sc->sc_type >= WM_T_PCH_LPT) {
15099 if (wm_phy_is_accessible_pchlan(sc) == true)
15100 break;
15101
15102 /* Toggling LANPHYPC brings the PHY out of SMBus mode
15103 * so ensure that the MAC is also out of SMBus mode
15104 */
15105 reg = CSR_READ(sc, WMREG_CTRL_EXT);
15106 reg &= ~CTRL_EXT_FORCE_SMBUS;
15107 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
15108
15109 if (wm_phy_is_accessible_pchlan(sc) == true)
15110 break;
15111 rv = -1;
15112 }
15113 break;
15114 default:
15115 break;
15116 }
15117
15118 /* Release semaphore */
15119 sc->phy.release(sc);
15120
15121 if (rv == 0) {
15122 /* Check to see if able to reset PHY. Print error if not */
15123 if (wm_phy_resetisblocked(sc)) {
15124 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n");
15125 goto out;
15126 }
15127
15128 /* Reset the PHY before any access to it. Doing so, ensures
15129 * that the PHY is in a known good state before we read/write
15130 * PHY registers. The generic reset is sufficient here,
15131 * because we haven't determined the PHY type yet.
15132 */
15133 if (wm_reset_phy(sc) != 0)
15134 goto out;
15135
15136 /* On a successful reset, possibly need to wait for the PHY
15137 * to quiesce to an accessible state before returning control
15138 * to the calling function. If the PHY does not quiesce, then
15139 * return E1000E_BLK_PHY_RESET, as this is the condition that
15140 * the PHY is in.
15141 */
15142 if (wm_phy_resetisblocked(sc))
15143 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n");
15144 }
15145
15146 out:
15147 /* Ungate automatic PHY configuration on non-managed 82579 */
15148 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) {
15149 delay(10*1000);
15150 wm_gate_hw_phy_config_ich8lan(sc, false);
15151 }
15152
15153 return 0;
15154 }
15155
15156 static void
15157 wm_init_manageability(struct wm_softc *sc)
15158 {
15159
15160 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
15161 device_xname(sc->sc_dev), __func__));
15162 if (sc->sc_flags & WM_F_HAS_MANAGE) {
15163 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H);
15164 uint32_t manc = CSR_READ(sc, WMREG_MANC);
15165
15166 /* Disable hardware interception of ARP */
15167 manc &= ~MANC_ARP_EN;
15168
15169 /* Enable receiving management packets to the host */
15170 if (sc->sc_type >= WM_T_82571) {
15171 manc |= MANC_EN_MNG2HOST;
15172 manc2h |= MANC2H_PORT_623 | MANC2H_PORT_624;
15173 CSR_WRITE(sc, WMREG_MANC2H, manc2h);
15174 }
15175
15176 CSR_WRITE(sc, WMREG_MANC, manc);
15177 }
15178 }
15179
15180 static void
15181 wm_release_manageability(struct wm_softc *sc)
15182 {
15183
15184 if (sc->sc_flags & WM_F_HAS_MANAGE) {
15185 uint32_t manc = CSR_READ(sc, WMREG_MANC);
15186
15187 manc |= MANC_ARP_EN;
15188 if (sc->sc_type >= WM_T_82571)
15189 manc &= ~MANC_EN_MNG2HOST;
15190
15191 CSR_WRITE(sc, WMREG_MANC, manc);
15192 }
15193 }
15194
15195 static void
15196 wm_get_wakeup(struct wm_softc *sc)
15197 {
15198
15199 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */
15200 switch (sc->sc_type) {
15201 case WM_T_82573:
15202 case WM_T_82583:
15203 sc->sc_flags |= WM_F_HAS_AMT;
15204 /* FALLTHROUGH */
15205 case WM_T_80003:
15206 case WM_T_82575:
15207 case WM_T_82576:
15208 case WM_T_82580:
15209 case WM_T_I350:
15210 case WM_T_I354:
15211 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0)
15212 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID;
15213 /* FALLTHROUGH */
15214 case WM_T_82541:
15215 case WM_T_82541_2:
15216 case WM_T_82547:
15217 case WM_T_82547_2:
15218 case WM_T_82571:
15219 case WM_T_82572:
15220 case WM_T_82574:
15221 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
15222 break;
15223 case WM_T_ICH8:
15224 case WM_T_ICH9:
15225 case WM_T_ICH10:
15226 case WM_T_PCH:
15227 case WM_T_PCH2:
15228 case WM_T_PCH_LPT:
15229 case WM_T_PCH_SPT:
15230 case WM_T_PCH_CNP:
15231 sc->sc_flags |= WM_F_HAS_AMT;
15232 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
15233 break;
15234 default:
15235 break;
15236 }
15237
15238 /* 1: HAS_MANAGE */
15239 if (wm_enable_mng_pass_thru(sc) != 0)
15240 sc->sc_flags |= WM_F_HAS_MANAGE;
15241
15242 /*
15243 * Note that the WOL flags is set after the resetting of the eeprom
15244 * stuff
15245 */
15246 }
15247
15248 /*
15249 * Unconfigure Ultra Low Power mode.
15250 * Only for I217 and newer (see below).
15251 */
15252 static int
15253 wm_ulp_disable(struct wm_softc *sc)
15254 {
15255 uint32_t reg;
15256 uint16_t phyreg;
15257 int i = 0, rv = 0;
15258
15259 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
15260 device_xname(sc->sc_dev), __func__));
15261 /* Exclude old devices */
15262 if ((sc->sc_type < WM_T_PCH_LPT)
15263 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM)
15264 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V)
15265 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2)
15266 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2))
15267 return 0;
15268
15269 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) {
15270 /* Request ME un-configure ULP mode in the PHY */
15271 reg = CSR_READ(sc, WMREG_H2ME);
15272 reg &= ~H2ME_ULP;
15273 reg |= H2ME_ENFORCE_SETTINGS;
15274 CSR_WRITE(sc, WMREG_H2ME, reg);
15275
15276 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */
15277 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) {
15278 if (i++ == 30) {
15279 device_printf(sc->sc_dev, "%s timed out\n",
15280 __func__);
15281 return -1;
15282 }
15283 delay(10 * 1000);
15284 }
15285 reg = CSR_READ(sc, WMREG_H2ME);
15286 reg &= ~H2ME_ENFORCE_SETTINGS;
15287 CSR_WRITE(sc, WMREG_H2ME, reg);
15288
15289 return 0;
15290 }
15291
15292 /* Acquire semaphore */
15293 rv = sc->phy.acquire(sc);
15294 if (rv != 0) {
15295 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: failed\n",
15296 device_xname(sc->sc_dev), __func__));
15297 return -1;
15298 }
15299
15300 /* Toggle LANPHYPC */
15301 wm_toggle_lanphypc_pch_lpt(sc);
15302
15303 /* Unforce SMBus mode in PHY */
15304 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL, &phyreg);
15305 if (rv != 0) {
15306 uint32_t reg2;
15307
15308 aprint_debug_dev(sc->sc_dev, "%s: Force SMBus first.\n",
15309 __func__);
15310 reg2 = CSR_READ(sc, WMREG_CTRL_EXT);
15311 reg2 |= CTRL_EXT_FORCE_SMBUS;
15312 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2);
15313 delay(50 * 1000);
15314
15315 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL,
15316 &phyreg);
15317 if (rv != 0)
15318 goto release;
15319 }
15320 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS;
15321 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, phyreg);
15322
15323 /* Unforce SMBus mode in MAC */
15324 reg = CSR_READ(sc, WMREG_CTRL_EXT);
15325 reg &= ~CTRL_EXT_FORCE_SMBUS;
15326 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
15327
15328 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL, &phyreg);
15329 if (rv != 0)
15330 goto release;
15331 phyreg |= HV_PM_CTRL_K1_ENA;
15332 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, phyreg);
15333
15334 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1,
15335 &phyreg);
15336 if (rv != 0)
15337 goto release;
15338 phyreg &= ~(I218_ULP_CONFIG1_IND
15339 | I218_ULP_CONFIG1_STICKY_ULP
15340 | I218_ULP_CONFIG1_RESET_TO_SMBUS
15341 | I218_ULP_CONFIG1_WOL_HOST
15342 | I218_ULP_CONFIG1_INBAND_EXIT
15343 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC
15344 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST
15345 | I218_ULP_CONFIG1_DIS_SMB_PERST);
15346 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg);
15347 phyreg |= I218_ULP_CONFIG1_START;
15348 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg);
15349
15350 reg = CSR_READ(sc, WMREG_FEXTNVM7);
15351 reg &= ~FEXTNVM7_DIS_SMB_PERST;
15352 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
15353
15354 release:
15355 /* Release semaphore */
15356 sc->phy.release(sc);
15357 wm_gmii_reset(sc);
15358 delay(50 * 1000);
15359
15360 return rv;
15361 }
15362
15363 /* WOL in the newer chipset interfaces (pchlan) */
15364 static int
15365 wm_enable_phy_wakeup(struct wm_softc *sc)
15366 {
15367 device_t dev = sc->sc_dev;
15368 uint32_t mreg, moff;
15369 uint16_t wuce, wuc, wufc, preg;
15370 int i, rv;
15371
15372 KASSERT(sc->sc_type >= WM_T_PCH);
15373
15374 /* Copy MAC RARs to PHY RARs */
15375 wm_copy_rx_addrs_to_phy_ich8lan(sc);
15376
15377 /* Activate PHY wakeup */
15378 rv = sc->phy.acquire(sc);
15379 if (rv != 0) {
15380 device_printf(dev, "%s: failed to acquire semaphore\n",
15381 __func__);
15382 return rv;
15383 }
15384
15385 /*
15386 * Enable access to PHY wakeup registers.
15387 * BM_MTA, BM_RCTL, BM_WUFC and BM_WUC are in BM_WUC_PAGE.
15388 */
15389 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce);
15390 if (rv != 0) {
15391 device_printf(dev,
15392 "%s: Could not enable PHY wakeup reg access\n", __func__);
15393 goto release;
15394 }
15395
15396 /* Copy MAC MTA to PHY MTA */
15397 for (i = 0; i < WM_ICH8_MC_TABSIZE; i++) {
15398 uint16_t lo, hi;
15399
15400 mreg = CSR_READ(sc, WMREG_CORDOVA_MTA + (i * 4));
15401 lo = (uint16_t)(mreg & 0xffff);
15402 hi = (uint16_t)((mreg >> 16) & 0xffff);
15403 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i), &lo, 0, true);
15404 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i) + 1, &hi, 0, true);
15405 }
15406
15407 /* Configure PHY Rx Control register */
15408 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 1, true);
15409 mreg = CSR_READ(sc, WMREG_RCTL);
15410 if (mreg & RCTL_UPE)
15411 preg |= BM_RCTL_UPE;
15412 if (mreg & RCTL_MPE)
15413 preg |= BM_RCTL_MPE;
15414 preg &= ~(BM_RCTL_MO_MASK);
15415 moff = __SHIFTOUT(mreg, RCTL_MO);
15416 if (moff != 0)
15417 preg |= moff << BM_RCTL_MO_SHIFT;
15418 if (mreg & RCTL_BAM)
15419 preg |= BM_RCTL_BAM;
15420 if (mreg & RCTL_PMCF)
15421 preg |= BM_RCTL_PMCF;
15422 mreg = CSR_READ(sc, WMREG_CTRL);
15423 if (mreg & CTRL_RFCE)
15424 preg |= BM_RCTL_RFCE;
15425 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 0, true);
15426
15427 wuc = WUC_APME | WUC_PME_EN;
15428 wufc = WUFC_MAG;
15429 /* Enable PHY wakeup in MAC register */
15430 CSR_WRITE(sc, WMREG_WUC,
15431 WUC_PHY_WAKE | WUC_PME_STATUS | WUC_APMPME | wuc);
15432 CSR_WRITE(sc, WMREG_WUFC, wufc);
15433
15434 /* Configure and enable PHY wakeup in PHY registers */
15435 wm_access_phy_wakeup_reg_bm(dev, BM_WUC, &wuc, 0, true);
15436 wm_access_phy_wakeup_reg_bm(dev, BM_WUFC, &wufc, 0, true);
15437
15438 wuce |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
15439 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce);
15440
15441 release:
15442 sc->phy.release(sc);
15443
15444 return 0;
15445 }
15446
15447 /* Power down workaround on D3 */
15448 static void
15449 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc)
15450 {
15451 uint32_t reg;
15452 uint16_t phyreg;
15453 int i;
15454
15455 for (i = 0; i < 2; i++) {
15456 /* Disable link */
15457 reg = CSR_READ(sc, WMREG_PHY_CTRL);
15458 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
15459 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
15460
15461 /*
15462 * Call gig speed drop workaround on Gig disable before
15463 * accessing any PHY registers
15464 */
15465 if (sc->sc_type == WM_T_ICH8)
15466 wm_gig_downshift_workaround_ich8lan(sc);
15467
15468 /* Write VR power-down enable */
15469 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg);
15470 phyreg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
15471 phyreg |= IGP3_VR_CTRL_MODE_SHUTDOWN;
15472 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, phyreg);
15473
15474 /* Read it back and test */
15475 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg);
15476 phyreg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
15477 if ((phyreg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0))
15478 break;
15479
15480 /* Issue PHY reset and repeat at most one more time */
15481 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
15482 }
15483 }
15484
15485 /*
15486 * wm_suspend_workarounds_ich8lan - workarounds needed during S0->Sx
15487 * @sc: pointer to the HW structure
15488 *
15489 * During S0 to Sx transition, it is possible the link remains at gig
15490 * instead of negotiating to a lower speed. Before going to Sx, set
15491 * 'Gig Disable' to force link speed negotiation to a lower speed based on
15492 * the LPLU setting in the NVM or custom setting. For PCH and newer parts,
15493 * the OEM bits PHY register (LED, GbE disable and LPLU configurations) also
15494 * needs to be written.
15495 * Parts that support (and are linked to a partner which support) EEE in
15496 * 100Mbps should disable LPLU since 100Mbps w/ EEE requires less power
15497 * than 10Mbps w/o EEE.
15498 */
15499 static void
15500 wm_suspend_workarounds_ich8lan(struct wm_softc *sc)
15501 {
15502 device_t dev = sc->sc_dev;
15503 struct ethercom *ec = &sc->sc_ethercom;
15504 uint32_t phy_ctrl;
15505 int rv;
15506
15507 phy_ctrl = CSR_READ(sc, WMREG_PHY_CTRL);
15508 phy_ctrl |= PHY_CTRL_GBE_DIS;
15509
15510 KASSERT((sc->sc_type >= WM_T_ICH8) && (sc->sc_type <= WM_T_PCH_CNP));
15511
15512 if (sc->sc_phytype == WMPHY_I217) {
15513 uint16_t devid = sc->sc_pcidevid;
15514
15515 if ((devid == PCI_PRODUCT_INTEL_I218_LM) ||
15516 (devid == PCI_PRODUCT_INTEL_I218_V) ||
15517 (devid == PCI_PRODUCT_INTEL_I218_LM3) ||
15518 (devid == PCI_PRODUCT_INTEL_I218_V3) ||
15519 (sc->sc_type >= WM_T_PCH_SPT))
15520 CSR_WRITE(sc, WMREG_FEXTNVM6,
15521 CSR_READ(sc, WMREG_FEXTNVM6)
15522 & ~FEXTNVM6_REQ_PLL_CLK);
15523
15524 if (sc->phy.acquire(sc) != 0)
15525 goto out;
15526
15527 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) {
15528 uint16_t eee_advert;
15529
15530 rv = wm_read_emi_reg_locked(dev,
15531 I217_EEE_ADVERTISEMENT, &eee_advert);
15532 if (rv)
15533 goto release;
15534
15535 /*
15536 * Disable LPLU if both link partners support 100BaseT
15537 * EEE and 100Full is advertised on both ends of the
15538 * link, and enable Auto Enable LPI since there will
15539 * be no driver to enable LPI while in Sx.
15540 */
15541 if ((eee_advert & AN_EEEADVERT_100_TX) &&
15542 (sc->eee_lp_ability & AN_EEEADVERT_100_TX)) {
15543 uint16_t anar, phy_reg;
15544
15545 sc->phy.readreg_locked(dev, 2, MII_ANAR,
15546 &anar);
15547 if (anar & ANAR_TX_FD) {
15548 phy_ctrl &= ~(PHY_CTRL_D0A_LPLU |
15549 PHY_CTRL_NOND0A_LPLU);
15550
15551 /* Set Auto Enable LPI after link up */
15552 sc->phy.readreg_locked(dev, 2,
15553 I217_LPI_GPIO_CTRL, &phy_reg);
15554 phy_reg |= I217_LPI_GPIO_CTRL_AUTO_EN_LPI;
15555 sc->phy.writereg_locked(dev, 2,
15556 I217_LPI_GPIO_CTRL, phy_reg);
15557 }
15558 }
15559 }
15560
15561 /*
15562 * For i217 Intel Rapid Start Technology support,
15563 * when the system is going into Sx and no manageability engine
15564 * is present, the driver must configure proxy to reset only on
15565 * power good. LPI (Low Power Idle) state must also reset only
15566 * on power good, as well as the MTA (Multicast table array).
15567 * The SMBus release must also be disabled on LCD reset.
15568 */
15569
15570 /*
15571 * Enable MTA to reset for Intel Rapid Start Technology
15572 * Support
15573 */
15574
15575 release:
15576 sc->phy.release(sc);
15577 }
15578 out:
15579 CSR_WRITE(sc, WMREG_PHY_CTRL, phy_ctrl);
15580
15581 if (sc->sc_type == WM_T_ICH8)
15582 wm_gig_downshift_workaround_ich8lan(sc);
15583
15584 if (sc->sc_type >= WM_T_PCH) {
15585 wm_oem_bits_config_ich8lan(sc, false);
15586
15587 /* Reset PHY to activate OEM bits on 82577/8 */
15588 if (sc->sc_type == WM_T_PCH)
15589 wm_reset_phy(sc);
15590
15591 if (sc->phy.acquire(sc) != 0)
15592 return;
15593 wm_write_smbus_addr(sc);
15594 sc->phy.release(sc);
15595 }
15596 }
15597
15598 /*
15599 * wm_resume_workarounds_pchlan - workarounds needed during Sx->S0
15600 * @sc: pointer to the HW structure
15601 *
15602 * During Sx to S0 transitions on non-managed devices or managed devices
15603 * on which PHY resets are not blocked, if the PHY registers cannot be
15604 * accessed properly by the s/w toggle the LANPHYPC value to power cycle
15605 * the PHY.
15606 * On i217, setup Intel Rapid Start Technology.
15607 */
15608 static int
15609 wm_resume_workarounds_pchlan(struct wm_softc *sc)
15610 {
15611 device_t dev = sc->sc_dev;
15612 int rv;
15613
15614 if (sc->sc_type < WM_T_PCH2)
15615 return 0;
15616
15617 rv = wm_init_phy_workarounds_pchlan(sc);
15618 if (rv != 0)
15619 return -1;
15620
15621 /* For i217 Intel Rapid Start Technology support when the system
15622 * is transitioning from Sx and no manageability engine is present
15623 * configure SMBus to restore on reset, disable proxy, and enable
15624 * the reset on MTA (Multicast table array).
15625 */
15626 if (sc->sc_phytype == WMPHY_I217) {
15627 uint16_t phy_reg;
15628
15629 if (sc->phy.acquire(sc) != 0)
15630 return -1;
15631
15632 /* Clear Auto Enable LPI after link up */
15633 sc->phy.readreg_locked(dev, 1, I217_LPI_GPIO_CTRL, &phy_reg);
15634 phy_reg &= ~I217_LPI_GPIO_CTRL_AUTO_EN_LPI;
15635 sc->phy.writereg_locked(dev, 1, I217_LPI_GPIO_CTRL, phy_reg);
15636
15637 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
15638 /* Restore clear on SMB if no manageability engine
15639 * is present
15640 */
15641 rv = sc->phy.readreg_locked(dev, 1, I217_MEMPWR,
15642 &phy_reg);
15643 if (rv != 0)
15644 goto release;
15645 phy_reg |= I217_MEMPWR_DISABLE_SMB_RELEASE;
15646 sc->phy.writereg_locked(dev, 1, I217_MEMPWR, phy_reg);
15647
15648 /* Disable Proxy */
15649 sc->phy.writereg_locked(dev, 1, I217_PROXY_CTRL, 0);
15650 }
15651 /* Enable reset on MTA */
15652 sc->phy.readreg_locked(dev, 1, I217_CFGREG, &phy_reg);
15653 if (rv != 0)
15654 goto release;
15655 phy_reg &= ~I217_CGFREG_ENABLE_MTA_RESET;
15656 sc->phy.writereg_locked(dev, 1, I217_CFGREG, phy_reg);
15657
15658 release:
15659 sc->phy.release(sc);
15660 return rv;
15661 }
15662
15663 return 0;
15664 }
15665
15666 static void
15667 wm_enable_wakeup(struct wm_softc *sc)
15668 {
15669 uint32_t reg, pmreg;
15670 pcireg_t pmode;
15671 int rv = 0;
15672
15673 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
15674 device_xname(sc->sc_dev), __func__));
15675
15676 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
15677 &pmreg, NULL) == 0)
15678 return;
15679
15680 if ((sc->sc_flags & WM_F_WOL) == 0)
15681 goto pme;
15682
15683 /* Advertise the wakeup capability */
15684 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2)
15685 | CTRL_SWDPIN(3));
15686
15687 /* Keep the laser running on fiber adapters */
15688 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
15689 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
15690 reg = CSR_READ(sc, WMREG_CTRL_EXT);
15691 reg |= CTRL_EXT_SWDPIN(3);
15692 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
15693 }
15694
15695 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) ||
15696 (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) ||
15697 (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) ||
15698 (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP))
15699 wm_suspend_workarounds_ich8lan(sc);
15700
15701 #if 0 /* For the multicast packet */
15702 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG;
15703 reg |= WUFC_MC;
15704 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE);
15705 #endif
15706
15707 if (sc->sc_type >= WM_T_PCH) {
15708 rv = wm_enable_phy_wakeup(sc);
15709 if (rv != 0)
15710 goto pme;
15711 } else {
15712 /* Enable wakeup by the MAC */
15713 CSR_WRITE(sc, WMREG_WUC, WUC_APME | WUC_PME_EN);
15714 CSR_WRITE(sc, WMREG_WUFC, WUFC_MAG);
15715 }
15716
15717 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
15718 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
15719 || (sc->sc_type == WM_T_PCH2))
15720 && (sc->sc_phytype == WMPHY_IGP_3))
15721 wm_igp3_phy_powerdown_workaround_ich8lan(sc);
15722
15723 pme:
15724 /* Request PME */
15725 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR);
15726 pmode |= PCI_PMCSR_PME_STS; /* in case it's already set (W1C) */
15727 if ((rv == 0) && (sc->sc_flags & WM_F_WOL) != 0) {
15728 /* For WOL */
15729 pmode |= PCI_PMCSR_PME_EN;
15730 } else {
15731 /* Disable WOL */
15732 pmode &= ~PCI_PMCSR_PME_EN;
15733 }
15734 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode);
15735 }
15736
15737 /* Disable ASPM L0s and/or L1 for workaround */
15738 static void
15739 wm_disable_aspm(struct wm_softc *sc)
15740 {
15741 pcireg_t reg, mask = 0;
15742 unsigned const char *str = "";
15743
15744 /*
15745 * Only for PCIe device which has PCIe capability in the PCI config
15746 * space.
15747 */
15748 if (((sc->sc_flags & WM_F_PCIE) == 0) || (sc->sc_pcixe_capoff == 0))
15749 return;
15750
15751 switch (sc->sc_type) {
15752 case WM_T_82571:
15753 case WM_T_82572:
15754 /*
15755 * 8257[12] Errata 13: Device Does Not Support PCIe Active
15756 * State Power management L1 State (ASPM L1).
15757 */
15758 mask = PCIE_LCSR_ASPM_L1;
15759 str = "L1 is";
15760 break;
15761 case WM_T_82573:
15762 case WM_T_82574:
15763 case WM_T_82583:
15764 /*
15765 * The 82573 disappears when PCIe ASPM L0s is enabled.
15766 *
15767 * The 82574 and 82583 does not support PCIe ASPM L0s with
15768 * some chipset. The document of 82574 and 82583 says that
15769 * disabling L0s with some specific chipset is sufficient,
15770 * but we follow as of the Intel em driver does.
15771 *
15772 * References:
15773 * Errata 8 of the Specification Update of i82573.
15774 * Errata 20 of the Specification Update of i82574.
15775 * Errata 9 of the Specification Update of i82583.
15776 */
15777 mask = PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S;
15778 str = "L0s and L1 are";
15779 break;
15780 default:
15781 return;
15782 }
15783
15784 reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
15785 sc->sc_pcixe_capoff + PCIE_LCSR);
15786 reg &= ~mask;
15787 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
15788 sc->sc_pcixe_capoff + PCIE_LCSR, reg);
15789
15790 /* Print only in wm_attach() */
15791 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
15792 aprint_verbose_dev(sc->sc_dev,
15793 "ASPM %s disabled to workaround the errata.\n", str);
15794 }
15795
15796 /* LPLU */
15797
15798 static void
15799 wm_lplu_d0_disable(struct wm_softc *sc)
15800 {
15801 struct mii_data *mii = &sc->sc_mii;
15802 uint32_t reg;
15803 uint16_t phyval;
15804
15805 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
15806 device_xname(sc->sc_dev), __func__));
15807
15808 if (sc->sc_phytype == WMPHY_IFE)
15809 return;
15810
15811 switch (sc->sc_type) {
15812 case WM_T_82571:
15813 case WM_T_82572:
15814 case WM_T_82573:
15815 case WM_T_82575:
15816 case WM_T_82576:
15817 mii->mii_readreg(sc->sc_dev, 1, IGPHY_POWER_MGMT, &phyval);
15818 phyval &= ~PMR_D0_LPLU;
15819 mii->mii_writereg(sc->sc_dev, 1, IGPHY_POWER_MGMT, phyval);
15820 break;
15821 case WM_T_82580:
15822 case WM_T_I350:
15823 case WM_T_I210:
15824 case WM_T_I211:
15825 reg = CSR_READ(sc, WMREG_PHPM);
15826 reg &= ~PHPM_D0A_LPLU;
15827 CSR_WRITE(sc, WMREG_PHPM, reg);
15828 break;
15829 case WM_T_82574:
15830 case WM_T_82583:
15831 case WM_T_ICH8:
15832 case WM_T_ICH9:
15833 case WM_T_ICH10:
15834 reg = CSR_READ(sc, WMREG_PHY_CTRL);
15835 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU);
15836 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
15837 CSR_WRITE_FLUSH(sc);
15838 break;
15839 case WM_T_PCH:
15840 case WM_T_PCH2:
15841 case WM_T_PCH_LPT:
15842 case WM_T_PCH_SPT:
15843 case WM_T_PCH_CNP:
15844 wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS, &phyval);
15845 phyval &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
15846 if (wm_phy_resetisblocked(sc) == false)
15847 phyval |= HV_OEM_BITS_ANEGNOW;
15848 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, phyval);
15849 break;
15850 default:
15851 break;
15852 }
15853 }
15854
15855 /* EEE */
15856
15857 static int
15858 wm_set_eee_i350(struct wm_softc *sc)
15859 {
15860 struct ethercom *ec = &sc->sc_ethercom;
15861 uint32_t ipcnfg, eeer;
15862 uint32_t ipcnfg_mask
15863 = IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN | IPCNFG_10BASE_TE;
15864 uint32_t eeer_mask = EEER_TX_LPI_EN | EEER_RX_LPI_EN | EEER_LPI_FC;
15865
15866 KASSERT(sc->sc_mediatype == WM_MEDIATYPE_COPPER);
15867
15868 ipcnfg = CSR_READ(sc, WMREG_IPCNFG);
15869 eeer = CSR_READ(sc, WMREG_EEER);
15870
15871 /* Enable or disable per user setting */
15872 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) {
15873 ipcnfg |= ipcnfg_mask;
15874 eeer |= eeer_mask;
15875 } else {
15876 ipcnfg &= ~ipcnfg_mask;
15877 eeer &= ~eeer_mask;
15878 }
15879
15880 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg);
15881 CSR_WRITE(sc, WMREG_EEER, eeer);
15882 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */
15883 CSR_READ(sc, WMREG_EEER); /* XXX flush? */
15884
15885 return 0;
15886 }
15887
15888 static int
15889 wm_set_eee_pchlan(struct wm_softc *sc)
15890 {
15891 device_t dev = sc->sc_dev;
15892 struct ethercom *ec = &sc->sc_ethercom;
15893 uint16_t lpa, pcs_status, adv_addr, adv, lpi_ctrl, data;
15894 int rv = 0;
15895
15896 switch (sc->sc_phytype) {
15897 case WMPHY_82579:
15898 lpa = I82579_EEE_LP_ABILITY;
15899 pcs_status = I82579_EEE_PCS_STATUS;
15900 adv_addr = I82579_EEE_ADVERTISEMENT;
15901 break;
15902 case WMPHY_I217:
15903 lpa = I217_EEE_LP_ABILITY;
15904 pcs_status = I217_EEE_PCS_STATUS;
15905 adv_addr = I217_EEE_ADVERTISEMENT;
15906 break;
15907 default:
15908 return 0;
15909 }
15910
15911 if (sc->phy.acquire(sc)) {
15912 device_printf(dev, "%s: failed to get semaphore\n", __func__);
15913 return 0;
15914 }
15915
15916 rv = sc->phy.readreg_locked(dev, 1, I82579_LPI_CTRL, &lpi_ctrl);
15917 if (rv != 0)
15918 goto release;
15919
15920 /* Clear bits that enable EEE in various speeds */
15921 lpi_ctrl &= ~I82579_LPI_CTRL_ENABLE;
15922
15923 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) {
15924 /* Save off link partner's EEE ability */
15925 rv = wm_read_emi_reg_locked(dev, lpa, &sc->eee_lp_ability);
15926 if (rv != 0)
15927 goto release;
15928
15929 /* Read EEE advertisement */
15930 if ((rv = wm_read_emi_reg_locked(dev, adv_addr, &adv)) != 0)
15931 goto release;
15932
15933 /*
15934 * Enable EEE only for speeds in which the link partner is
15935 * EEE capable and for which we advertise EEE.
15936 */
15937 if (adv & sc->eee_lp_ability & AN_EEEADVERT_1000_T)
15938 lpi_ctrl |= I82579_LPI_CTRL_EN_1000;
15939 if (adv & sc->eee_lp_ability & AN_EEEADVERT_100_TX) {
15940 sc->phy.readreg_locked(dev, 2, MII_ANLPAR, &data);
15941 if ((data & ANLPAR_TX_FD) != 0)
15942 lpi_ctrl |= I82579_LPI_CTRL_EN_100;
15943 else {
15944 /*
15945 * EEE is not supported in 100Half, so ignore
15946 * partner's EEE in 100 ability if full-duplex
15947 * is not advertised.
15948 */
15949 sc->eee_lp_ability
15950 &= ~AN_EEEADVERT_100_TX;
15951 }
15952 }
15953 }
15954
15955 if (sc->sc_phytype == WMPHY_82579) {
15956 rv = wm_read_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, &data);
15957 if (rv != 0)
15958 goto release;
15959
15960 data &= ~I82579_LPI_PLL_SHUT_100;
15961 rv = wm_write_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, data);
15962 }
15963
15964 /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */
15965 if ((rv = wm_read_emi_reg_locked(dev, pcs_status, &data)) != 0)
15966 goto release;
15967
15968 rv = sc->phy.writereg_locked(dev, 1, I82579_LPI_CTRL, lpi_ctrl);
15969 release:
15970 sc->phy.release(sc);
15971
15972 return rv;
15973 }
15974
15975 static int
15976 wm_set_eee(struct wm_softc *sc)
15977 {
15978 struct ethercom *ec = &sc->sc_ethercom;
15979
15980 if ((ec->ec_capabilities & ETHERCAP_EEE) == 0)
15981 return 0;
15982
15983 if (sc->sc_type == WM_T_I354) {
15984 /* I354 uses an external PHY */
15985 return 0; /* not yet */
15986 } else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211))
15987 return wm_set_eee_i350(sc);
15988 else if (sc->sc_type >= WM_T_PCH2)
15989 return wm_set_eee_pchlan(sc);
15990
15991 return 0;
15992 }
15993
15994 /*
15995 * Workarounds (mainly PHY related).
15996 * Basically, PHY's workarounds are in the PHY drivers.
15997 */
15998
15999 /* Work-around for 82566 Kumeran PCS lock loss */
16000 static int
16001 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc)
16002 {
16003 struct mii_data *mii = &sc->sc_mii;
16004 uint32_t status = CSR_READ(sc, WMREG_STATUS);
16005 int i, reg, rv;
16006 uint16_t phyreg;
16007
16008 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16009 device_xname(sc->sc_dev), __func__));
16010
16011 /* If the link is not up, do nothing */
16012 if ((status & STATUS_LU) == 0)
16013 return 0;
16014
16015 /* Nothing to do if the link is other than 1Gbps */
16016 if (__SHIFTOUT(status, STATUS_SPEED) != STATUS_SPEED_1000)
16017 return 0;
16018
16019 for (i = 0; i < 10; i++) {
16020 /* read twice */
16021 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg);
16022 if (rv != 0)
16023 return rv;
16024 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg);
16025 if (rv != 0)
16026 return rv;
16027
16028 if ((phyreg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0)
16029 goto out; /* GOOD! */
16030
16031 /* Reset the PHY */
16032 wm_reset_phy(sc);
16033 delay(5*1000);
16034 }
16035
16036 /* Disable GigE link negotiation */
16037 reg = CSR_READ(sc, WMREG_PHY_CTRL);
16038 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
16039 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
16040
16041 /*
16042 * Call gig speed drop workaround on Gig disable before accessing
16043 * any PHY registers.
16044 */
16045 wm_gig_downshift_workaround_ich8lan(sc);
16046
16047 out:
16048 return 0;
16049 }
16050
16051 /*
16052 * wm_gig_downshift_workaround_ich8lan - WoL from S5 stops working
16053 * @sc: pointer to the HW structure
16054 *
16055 * Steps to take when dropping from 1Gb/s (eg. link cable removal (LSC),
16056 * LPLU, Gig disable, MDIC PHY reset):
16057 * 1) Set Kumeran Near-end loopback
16058 * 2) Clear Kumeran Near-end loopback
16059 * Should only be called for ICH8[m] devices with any 1G Phy.
16060 */
16061 static void
16062 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc)
16063 {
16064 uint16_t kmreg;
16065
16066 /* Only for igp3 */
16067 if (sc->sc_phytype == WMPHY_IGP_3) {
16068 if (wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG, &kmreg) != 0)
16069 return;
16070 kmreg |= KUMCTRLSTA_DIAG_NELPBK;
16071 if (wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg) != 0)
16072 return;
16073 kmreg &= ~KUMCTRLSTA_DIAG_NELPBK;
16074 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg);
16075 }
16076 }
16077
16078 /*
16079 * Workaround for pch's PHYs
16080 * XXX should be moved to new PHY driver?
16081 */
16082 static int
16083 wm_hv_phy_workarounds_ich8lan(struct wm_softc *sc)
16084 {
16085 device_t dev = sc->sc_dev;
16086 struct mii_data *mii = &sc->sc_mii;
16087 struct mii_softc *child;
16088 uint16_t phy_data, phyrev = 0;
16089 int phytype = sc->sc_phytype;
16090 int rv;
16091
16092 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16093 device_xname(dev), __func__));
16094 KASSERT(sc->sc_type == WM_T_PCH);
16095
16096 /* Set MDIO slow mode before any other MDIO access */
16097 if (phytype == WMPHY_82577)
16098 if ((rv = wm_set_mdio_slow_mode_hv(sc)) != 0)
16099 return rv;
16100
16101 child = LIST_FIRST(&mii->mii_phys);
16102 if (child != NULL)
16103 phyrev = child->mii_mpd_rev;
16104
16105 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/
16106 if ((child != NULL) &&
16107 (((phytype == WMPHY_82577) && ((phyrev == 1) || (phyrev == 2))) ||
16108 ((phytype == WMPHY_82578) && (phyrev == 1)))) {
16109 /* Disable generation of early preamble (0x4431) */
16110 rv = mii->mii_readreg(dev, 2, BM_RATE_ADAPTATION_CTRL,
16111 &phy_data);
16112 if (rv != 0)
16113 return rv;
16114 phy_data &= ~(BM_RATE_ADAPTATION_CTRL_RX_RXDV_PRE |
16115 BM_RATE_ADAPTATION_CTRL_RX_CRS_PRE);
16116 rv = mii->mii_writereg(dev, 2, BM_RATE_ADAPTATION_CTRL,
16117 phy_data);
16118 if (rv != 0)
16119 return rv;
16120
16121 /* Preamble tuning for SSC */
16122 rv = mii->mii_writereg(dev, 2, HV_KMRN_FIFO_CTRLSTA, 0xa204);
16123 if (rv != 0)
16124 return rv;
16125 }
16126
16127 /* 82578 */
16128 if (phytype == WMPHY_82578) {
16129 /*
16130 * Return registers to default by doing a soft reset then
16131 * writing 0x3140 to the control register
16132 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1
16133 */
16134 if ((child != NULL) && (phyrev < 2)) {
16135 PHY_RESET(child);
16136 rv = mii->mii_writereg(dev, 2, MII_BMCR, 0x3140);
16137 if (rv != 0)
16138 return rv;
16139 }
16140 }
16141
16142 /* Select page 0 */
16143 if ((rv = sc->phy.acquire(sc)) != 0)
16144 return rv;
16145 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 0);
16146 sc->phy.release(sc);
16147 if (rv != 0)
16148 return rv;
16149
16150 /*
16151 * Configure the K1 Si workaround during phy reset assuming there is
16152 * link so that it disables K1 if link is in 1Gbps.
16153 */
16154 if ((rv = wm_k1_gig_workaround_hv(sc, 1)) != 0)
16155 return rv;
16156
16157 /* Workaround for link disconnects on a busy hub in half duplex */
16158 rv = sc->phy.acquire(sc);
16159 if (rv)
16160 return rv;
16161 rv = sc->phy.readreg_locked(dev, 2, BM_PORT_GEN_CFG, &phy_data);
16162 if (rv)
16163 goto release;
16164 rv = sc->phy.writereg_locked(dev, 2, BM_PORT_GEN_CFG,
16165 phy_data & 0x00ff);
16166 if (rv)
16167 goto release;
16168
16169 /* Set MSE higher to enable link to stay up when noise is high */
16170 rv = wm_write_emi_reg_locked(dev, I82577_MSE_THRESHOLD, 0x0034);
16171 release:
16172 sc->phy.release(sc);
16173
16174 return rv;
16175 }
16176
16177 /*
16178 * wm_copy_rx_addrs_to_phy_ich8lan - Copy Rx addresses from MAC to PHY
16179 * @sc: pointer to the HW structure
16180 */
16181 static void
16182 wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *sc)
16183 {
16184
16185 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16186 device_xname(sc->sc_dev), __func__));
16187
16188 if (sc->phy.acquire(sc) != 0)
16189 return;
16190
16191 wm_copy_rx_addrs_to_phy_ich8lan_locked(sc);
16192
16193 sc->phy.release(sc);
16194 }
16195
16196 static void
16197 wm_copy_rx_addrs_to_phy_ich8lan_locked(struct wm_softc *sc)
16198 {
16199 device_t dev = sc->sc_dev;
16200 uint32_t mac_reg;
16201 uint16_t i, wuce;
16202 int count;
16203
16204 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16205 device_xname(dev), __func__));
16206
16207 if (wm_enable_phy_wakeup_reg_access_bm(dev, &wuce) != 0)
16208 return;
16209
16210 /* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */
16211 count = wm_rar_count(sc);
16212 for (i = 0; i < count; i++) {
16213 uint16_t lo, hi;
16214 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAL(i));
16215 lo = (uint16_t)(mac_reg & 0xffff);
16216 hi = (uint16_t)((mac_reg >> 16) & 0xffff);
16217 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_L(i), &lo, 0, true);
16218 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_M(i), &hi, 0, true);
16219
16220 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAH(i));
16221 lo = (uint16_t)(mac_reg & 0xffff);
16222 hi = (uint16_t)((mac_reg & RAL_AV) >> 16);
16223 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_H(i), &lo, 0, true);
16224 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_CTRL(i), &hi, 0, true);
16225 }
16226
16227 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce);
16228 }
16229
16230 /*
16231 * wm_lv_jumbo_workaround_ich8lan - required for jumbo frame operation
16232 * with 82579 PHY
16233 * @enable: flag to enable/disable workaround when enabling/disabling jumbos
16234 */
16235 static int
16236 wm_lv_jumbo_workaround_ich8lan(struct wm_softc *sc, bool enable)
16237 {
16238 device_t dev = sc->sc_dev;
16239 int rar_count;
16240 int rv;
16241 uint32_t mac_reg;
16242 uint16_t dft_ctrl, data;
16243 uint16_t i;
16244
16245 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16246 device_xname(dev), __func__));
16247
16248 if (sc->sc_type < WM_T_PCH2)
16249 return 0;
16250
16251 /* Acquire PHY semaphore */
16252 rv = sc->phy.acquire(sc);
16253 if (rv != 0)
16254 return rv;
16255
16256 /* Disable Rx path while enabling/disabling workaround */
16257 rv = sc->phy.readreg_locked(dev, 2, I82579_DFT_CTRL, &dft_ctrl);
16258 if (rv != 0)
16259 goto out;
16260 rv = sc->phy.writereg_locked(dev, 2, I82579_DFT_CTRL,
16261 dft_ctrl | (1 << 14));
16262 if (rv != 0)
16263 goto out;
16264
16265 if (enable) {
16266 /* Write Rx addresses (rar_entry_count for RAL/H, and
16267 * SHRAL/H) and initial CRC values to the MAC
16268 */
16269 rar_count = wm_rar_count(sc);
16270 for (i = 0; i < rar_count; i++) {
16271 uint8_t mac_addr[ETHER_ADDR_LEN] = {0};
16272 uint32_t addr_high, addr_low;
16273
16274 addr_high = CSR_READ(sc, WMREG_CORDOVA_RAH(i));
16275 if (!(addr_high & RAL_AV))
16276 continue;
16277 addr_low = CSR_READ(sc, WMREG_CORDOVA_RAL(i));
16278 mac_addr[0] = (addr_low & 0xFF);
16279 mac_addr[1] = ((addr_low >> 8) & 0xFF);
16280 mac_addr[2] = ((addr_low >> 16) & 0xFF);
16281 mac_addr[3] = ((addr_low >> 24) & 0xFF);
16282 mac_addr[4] = (addr_high & 0xFF);
16283 mac_addr[5] = ((addr_high >> 8) & 0xFF);
16284
16285 CSR_WRITE(sc, WMREG_PCH_RAICC(i),
16286 ~ether_crc32_le(mac_addr, ETHER_ADDR_LEN));
16287 }
16288
16289 /* Write Rx addresses to the PHY */
16290 wm_copy_rx_addrs_to_phy_ich8lan_locked(sc);
16291 }
16292
16293 /*
16294 * If enable ==
16295 * true: Enable jumbo frame workaround in the MAC.
16296 * false: Write MAC register values back to h/w defaults.
16297 */
16298 mac_reg = CSR_READ(sc, WMREG_FFLT_DBG);
16299 if (enable) {
16300 mac_reg &= ~(1 << 14);
16301 mac_reg |= (7 << 15);
16302 } else
16303 mac_reg &= ~(0xf << 14);
16304 CSR_WRITE(sc, WMREG_FFLT_DBG, mac_reg);
16305
16306 mac_reg = CSR_READ(sc, WMREG_RCTL);
16307 if (enable) {
16308 mac_reg |= RCTL_SECRC;
16309 sc->sc_rctl |= RCTL_SECRC;
16310 sc->sc_flags |= WM_F_CRC_STRIP;
16311 } else {
16312 mac_reg &= ~RCTL_SECRC;
16313 sc->sc_rctl &= ~RCTL_SECRC;
16314 sc->sc_flags &= ~WM_F_CRC_STRIP;
16315 }
16316 CSR_WRITE(sc, WMREG_RCTL, mac_reg);
16317
16318 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_CTRL, &data);
16319 if (rv != 0)
16320 goto out;
16321 if (enable)
16322 data |= 1 << 0;
16323 else
16324 data &= ~(1 << 0);
16325 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_CTRL, data);
16326 if (rv != 0)
16327 goto out;
16328
16329 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_HD_CTRL, &data);
16330 if (rv != 0)
16331 goto out;
16332 /*
16333 * XXX FreeBSD and Linux do the same thing that they set the same value
16334 * on both the enable case and the disable case. Is it correct?
16335 */
16336 data &= ~(0xf << 8);
16337 data |= (0xb << 8);
16338 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_HD_CTRL, data);
16339 if (rv != 0)
16340 goto out;
16341
16342 /*
16343 * If enable ==
16344 * true: Enable jumbo frame workaround in the PHY.
16345 * false: Write PHY register values back to h/w defaults.
16346 */
16347 rv = sc->phy.readreg_locked(dev, 2, BME1000_REG(769, 23), &data);
16348 if (rv != 0)
16349 goto out;
16350 data &= ~(0x7F << 5);
16351 if (enable)
16352 data |= (0x37 << 5);
16353 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(769, 23), data);
16354 if (rv != 0)
16355 goto out;
16356
16357 rv = sc->phy.readreg_locked(dev, 2, BME1000_REG(769, 16), &data);
16358 if (rv != 0)
16359 goto out;
16360 if (enable)
16361 data &= ~(1 << 13);
16362 else
16363 data |= (1 << 13);
16364 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(769, 16), data);
16365 if (rv != 0)
16366 goto out;
16367
16368 rv = sc->phy.readreg_locked(dev, 2, I82579_UNKNOWN1, &data);
16369 if (rv != 0)
16370 goto out;
16371 data &= ~(0x3FF << 2);
16372 if (enable)
16373 data |= (I82579_TX_PTR_GAP << 2);
16374 else
16375 data |= (0x8 << 2);
16376 rv = sc->phy.writereg_locked(dev, 2, I82579_UNKNOWN1, data);
16377 if (rv != 0)
16378 goto out;
16379
16380 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(776, 23),
16381 enable ? 0xf100 : 0x7e00);
16382 if (rv != 0)
16383 goto out;
16384
16385 rv = sc->phy.readreg_locked(dev, 2, HV_PM_CTRL, &data);
16386 if (rv != 0)
16387 goto out;
16388 if (enable)
16389 data |= 1 << 10;
16390 else
16391 data &= ~(1 << 10);
16392 rv = sc->phy.writereg_locked(dev, 2, HV_PM_CTRL, data);
16393 if (rv != 0)
16394 goto out;
16395
16396 /* Re-enable Rx path after enabling/disabling workaround */
16397 rv = sc->phy.writereg_locked(dev, 2, I82579_DFT_CTRL,
16398 dft_ctrl & ~(1 << 14));
16399
16400 out:
16401 sc->phy.release(sc);
16402
16403 return rv;
16404 }
16405
16406 /*
16407 * wm_lv_phy_workarounds_ich8lan - A series of Phy workarounds to be
16408 * done after every PHY reset.
16409 */
16410 static int
16411 wm_lv_phy_workarounds_ich8lan(struct wm_softc *sc)
16412 {
16413 device_t dev = sc->sc_dev;
16414 int rv;
16415
16416 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16417 device_xname(dev), __func__));
16418 KASSERT(sc->sc_type == WM_T_PCH2);
16419
16420 /* Set MDIO slow mode before any other MDIO access */
16421 rv = wm_set_mdio_slow_mode_hv(sc);
16422 if (rv != 0)
16423 return rv;
16424
16425 rv = sc->phy.acquire(sc);
16426 if (rv != 0)
16427 return rv;
16428 /* Set MSE higher to enable link to stay up when noise is high */
16429 rv = wm_write_emi_reg_locked(dev, I82579_MSE_THRESHOLD, 0x0034);
16430 if (rv != 0)
16431 goto release;
16432 /* Drop link after 5 times MSE threshold was reached */
16433 rv = wm_write_emi_reg_locked(dev, I82579_MSE_LINK_DOWN, 0x0005);
16434 release:
16435 sc->phy.release(sc);
16436
16437 return rv;
16438 }
16439
16440 /**
16441 * wm_k1_workaround_lpt_lp - K1 workaround on Lynxpoint-LP
16442 * @link: link up bool flag
16443 *
16444 * When K1 is enabled for 1Gbps, the MAC can miss 2 DMA completion indications
16445 * preventing further DMA write requests. Workaround the issue by disabling
16446 * the de-assertion of the clock request when in 1Gpbs mode.
16447 * Also, set appropriate Tx re-transmission timeouts for 10 and 100Half link
16448 * speeds in order to avoid Tx hangs.
16449 **/
16450 static int
16451 wm_k1_workaround_lpt_lp(struct wm_softc *sc, bool link)
16452 {
16453 uint32_t fextnvm6 = CSR_READ(sc, WMREG_FEXTNVM6);
16454 uint32_t status = CSR_READ(sc, WMREG_STATUS);
16455 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED);
16456 uint16_t phyreg;
16457
16458 if (link && (speed == STATUS_SPEED_1000)) {
16459 sc->phy.acquire(sc);
16460 int rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG,
16461 &phyreg);
16462 if (rv != 0)
16463 goto release;
16464 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG,
16465 phyreg & ~KUMCTRLSTA_K1_ENABLE);
16466 if (rv != 0)
16467 goto release;
16468 delay(20);
16469 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6 | FEXTNVM6_REQ_PLL_CLK);
16470
16471 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG,
16472 &phyreg);
16473 release:
16474 sc->phy.release(sc);
16475 return rv;
16476 }
16477
16478 fextnvm6 &= ~FEXTNVM6_REQ_PLL_CLK;
16479
16480 struct mii_softc *child = LIST_FIRST(&sc->sc_mii.mii_phys);
16481 if (((child != NULL) && (child->mii_mpd_rev > 5))
16482 || !link
16483 || ((speed == STATUS_SPEED_100) && (status & STATUS_FD)))
16484 goto update_fextnvm6;
16485
16486 wm_gmii_hv_readreg(sc->sc_dev, 2, I217_INBAND_CTRL, &phyreg);
16487
16488 /* Clear link status transmit timeout */
16489 phyreg &= ~I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_MASK;
16490 if (speed == STATUS_SPEED_100) {
16491 /* Set inband Tx timeout to 5x10us for 100Half */
16492 phyreg |= 5 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT;
16493
16494 /* Do not extend the K1 entry latency for 100Half */
16495 fextnvm6 &= ~FEXTNVM6_ENABLE_K1_ENTRY_CONDITION;
16496 } else {
16497 /* Set inband Tx timeout to 50x10us for 10Full/Half */
16498 phyreg |= 50 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT;
16499
16500 /* Extend the K1 entry latency for 10 Mbps */
16501 fextnvm6 |= FEXTNVM6_ENABLE_K1_ENTRY_CONDITION;
16502 }
16503
16504 wm_gmii_hv_writereg(sc->sc_dev, 2, I217_INBAND_CTRL, phyreg);
16505
16506 update_fextnvm6:
16507 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6);
16508 return 0;
16509 }
16510
16511 /*
16512 * wm_k1_gig_workaround_hv - K1 Si workaround
16513 * @sc: pointer to the HW structure
16514 * @link: link up bool flag
16515 *
16516 * If K1 is enabled for 1Gbps, the MAC might stall when transitioning
16517 * from a lower speed. This workaround disables K1 whenever link is at 1Gig
16518 * If link is down, the function will restore the default K1 setting located
16519 * in the NVM.
16520 */
16521 static int
16522 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link)
16523 {
16524 int k1_enable = sc->sc_nvm_k1_enabled;
16525
16526 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16527 device_xname(sc->sc_dev), __func__));
16528
16529 if (sc->phy.acquire(sc) != 0)
16530 return -1;
16531
16532 if (link) {
16533 k1_enable = 0;
16534
16535 /* Link stall fix for link up */
16536 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG,
16537 0x0100);
16538 } else {
16539 /* Link stall fix for link down */
16540 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG,
16541 0x4100);
16542 }
16543
16544 wm_configure_k1_ich8lan(sc, k1_enable);
16545 sc->phy.release(sc);
16546
16547 return 0;
16548 }
16549
16550 /*
16551 * wm_k1_workaround_lv - K1 Si workaround
16552 * @sc: pointer to the HW structure
16553 *
16554 * Workaround to set the K1 beacon duration for 82579 parts in 10Mbps
16555 * Disable K1 for 1000 and 100 speeds
16556 */
16557 static int
16558 wm_k1_workaround_lv(struct wm_softc *sc)
16559 {
16560 uint32_t reg;
16561 uint16_t phyreg;
16562 int rv;
16563
16564 if (sc->sc_type != WM_T_PCH2)
16565 return 0;
16566
16567 /* Set K1 beacon duration based on 10Mbps speed */
16568 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, HV_M_STATUS, &phyreg);
16569 if (rv != 0)
16570 return rv;
16571
16572 if ((phyreg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE))
16573 == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) {
16574 if (phyreg &
16575 (HV_M_STATUS_SPEED_1000 | HV_M_STATUS_SPEED_100)) {
16576 /* LV 1G/100 Packet drop issue wa */
16577 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_PM_CTRL,
16578 &phyreg);
16579 if (rv != 0)
16580 return rv;
16581 phyreg &= ~HV_PM_CTRL_K1_ENA;
16582 rv = wm_gmii_hv_writereg(sc->sc_dev, 1, HV_PM_CTRL,
16583 phyreg);
16584 if (rv != 0)
16585 return rv;
16586 } else {
16587 /* For 10Mbps */
16588 reg = CSR_READ(sc, WMREG_FEXTNVM4);
16589 reg &= ~FEXTNVM4_BEACON_DURATION;
16590 reg |= FEXTNVM4_BEACON_DURATION_16US;
16591 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
16592 }
16593 }
16594
16595 return 0;
16596 }
16597
16598 /*
16599 * wm_link_stall_workaround_hv - Si workaround
16600 * @sc: pointer to the HW structure
16601 *
16602 * This function works around a Si bug where the link partner can get
16603 * a link up indication before the PHY does. If small packets are sent
16604 * by the link partner they can be placed in the packet buffer without
16605 * being properly accounted for by the PHY and will stall preventing
16606 * further packets from being received. The workaround is to clear the
16607 * packet buffer after the PHY detects link up.
16608 */
16609 static int
16610 wm_link_stall_workaround_hv(struct wm_softc *sc)
16611 {
16612 uint16_t phyreg;
16613
16614 if (sc->sc_phytype != WMPHY_82578)
16615 return 0;
16616
16617 /* Do not apply workaround if in PHY loopback bit 14 set */
16618 wm_gmii_hv_readreg(sc->sc_dev, 2, MII_BMCR, &phyreg);
16619 if ((phyreg & BMCR_LOOP) != 0)
16620 return 0;
16621
16622 /* Check if link is up and at 1Gbps */
16623 wm_gmii_hv_readreg(sc->sc_dev, 2, BM_CS_STATUS, &phyreg);
16624 phyreg &= BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED
16625 | BM_CS_STATUS_SPEED_MASK;
16626 if (phyreg != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED
16627 | BM_CS_STATUS_SPEED_1000))
16628 return 0;
16629
16630 delay(200 * 1000); /* XXX too big */
16631
16632 /* Flush the packets in the fifo buffer */
16633 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL,
16634 HV_MUX_DATA_CTRL_GEN_TO_MAC | HV_MUX_DATA_CTRL_FORCE_SPEED);
16635 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL,
16636 HV_MUX_DATA_CTRL_GEN_TO_MAC);
16637
16638 return 0;
16639 }
16640
16641 static int
16642 wm_set_mdio_slow_mode_hv(struct wm_softc *sc)
16643 {
16644 int rv;
16645 uint16_t reg;
16646
16647 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, ®);
16648 if (rv != 0)
16649 return rv;
16650
16651 return wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL,
16652 reg | HV_KMRN_MDIO_SLOW);
16653 }
16654
16655 /*
16656 * wm_configure_k1_ich8lan - Configure K1 power state
16657 * @sc: pointer to the HW structure
16658 * @enable: K1 state to configure
16659 *
16660 * Configure the K1 power state based on the provided parameter.
16661 * Assumes semaphore already acquired.
16662 */
16663 static void
16664 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable)
16665 {
16666 uint32_t ctrl, ctrl_ext, tmp;
16667 uint16_t kmreg;
16668 int rv;
16669
16670 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP);
16671
16672 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, &kmreg);
16673 if (rv != 0)
16674 return;
16675
16676 if (k1_enable)
16677 kmreg |= KUMCTRLSTA_K1_ENABLE;
16678 else
16679 kmreg &= ~KUMCTRLSTA_K1_ENABLE;
16680
16681 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmreg);
16682 if (rv != 0)
16683 return;
16684
16685 delay(20);
16686
16687 ctrl = CSR_READ(sc, WMREG_CTRL);
16688 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
16689
16690 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100);
16691 tmp |= CTRL_FRCSPD;
16692
16693 CSR_WRITE(sc, WMREG_CTRL, tmp);
16694 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS);
16695 CSR_WRITE_FLUSH(sc);
16696 delay(20);
16697
16698 CSR_WRITE(sc, WMREG_CTRL, ctrl);
16699 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
16700 CSR_WRITE_FLUSH(sc);
16701 delay(20);
16702
16703 return;
16704 }
16705
16706 /* special case - for 82575 - need to do manual init ... */
16707 static void
16708 wm_reset_init_script_82575(struct wm_softc *sc)
16709 {
16710 /*
16711 * Remark: this is untested code - we have no board without EEPROM
16712 * same setup as mentioned int the FreeBSD driver for the i82575
16713 */
16714
16715 /* SerDes configuration via SERDESCTRL */
16716 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c);
16717 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
16718 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23);
16719 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
16720
16721 /* CCM configuration via CCMCTL register */
16722 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
16723 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
16724
16725 /* PCIe lanes configuration */
16726 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec);
16727 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf);
16728 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
16729 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81);
16730
16731 /* PCIe PLL Configuration */
16732 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
16733 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
16734 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
16735 }
16736
16737 static void
16738 wm_reset_mdicnfg_82580(struct wm_softc *sc)
16739 {
16740 uint32_t reg;
16741 uint16_t nvmword;
16742 int rv;
16743
16744 if (sc->sc_type != WM_T_82580)
16745 return;
16746 if ((sc->sc_flags & WM_F_SGMII) == 0)
16747 return;
16748
16749 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid)
16750 + NVM_OFF_CFG3_PORTA, 1, &nvmword);
16751 if (rv != 0) {
16752 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n",
16753 __func__);
16754 return;
16755 }
16756
16757 reg = CSR_READ(sc, WMREG_MDICNFG);
16758 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO)
16759 reg |= MDICNFG_DEST;
16760 if (nvmword & NVM_CFG3_PORTA_COM_MDIO)
16761 reg |= MDICNFG_COM_MDIO;
16762 CSR_WRITE(sc, WMREG_MDICNFG, reg);
16763 }
16764
16765 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff))
16766
16767 static bool
16768 wm_phy_is_accessible_pchlan(struct wm_softc *sc)
16769 {
16770 uint32_t reg;
16771 uint16_t id1, id2;
16772 int i, rv;
16773
16774 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16775 device_xname(sc->sc_dev), __func__));
16776 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP);
16777
16778 id1 = id2 = 0xffff;
16779 for (i = 0; i < 2; i++) {
16780 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1,
16781 &id1);
16782 if ((rv != 0) || MII_INVALIDID(id1))
16783 continue;
16784 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2,
16785 &id2);
16786 if ((rv != 0) || MII_INVALIDID(id2))
16787 continue;
16788 break;
16789 }
16790 if ((rv == 0) && !MII_INVALIDID(id1) && !MII_INVALIDID(id2))
16791 goto out;
16792
16793 /*
16794 * In case the PHY needs to be in mdio slow mode,
16795 * set slow mode and try to get the PHY id again.
16796 */
16797 rv = 0;
16798 if (sc->sc_type < WM_T_PCH_LPT) {
16799 sc->phy.release(sc);
16800 wm_set_mdio_slow_mode_hv(sc);
16801 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR1, &id1);
16802 rv |= wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR2, &id2);
16803 sc->phy.acquire(sc);
16804 }
16805 if ((rv != 0) || MII_INVALIDID(id1) || MII_INVALIDID(id2)) {
16806 device_printf(sc->sc_dev, "XXX return with false\n");
16807 return false;
16808 }
16809 out:
16810 if (sc->sc_type >= WM_T_PCH_LPT) {
16811 /* Only unforce SMBus if ME is not active */
16812 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
16813 uint16_t phyreg;
16814
16815 /* Unforce SMBus mode in PHY */
16816 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2,
16817 CV_SMB_CTRL, &phyreg);
16818 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS;
16819 wm_gmii_hv_writereg_locked(sc->sc_dev, 2,
16820 CV_SMB_CTRL, phyreg);
16821
16822 /* Unforce SMBus mode in MAC */
16823 reg = CSR_READ(sc, WMREG_CTRL_EXT);
16824 reg &= ~CTRL_EXT_FORCE_SMBUS;
16825 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
16826 }
16827 }
16828 return true;
16829 }
16830
16831 static void
16832 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc)
16833 {
16834 uint32_t reg;
16835 int i;
16836
16837 /* Set PHY Config Counter to 50msec */
16838 reg = CSR_READ(sc, WMREG_FEXTNVM3);
16839 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
16840 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
16841 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
16842
16843 /* Toggle LANPHYPC */
16844 reg = CSR_READ(sc, WMREG_CTRL);
16845 reg |= CTRL_LANPHYPC_OVERRIDE;
16846 reg &= ~CTRL_LANPHYPC_VALUE;
16847 CSR_WRITE(sc, WMREG_CTRL, reg);
16848 CSR_WRITE_FLUSH(sc);
16849 delay(1000);
16850 reg &= ~CTRL_LANPHYPC_OVERRIDE;
16851 CSR_WRITE(sc, WMREG_CTRL, reg);
16852 CSR_WRITE_FLUSH(sc);
16853
16854 if (sc->sc_type < WM_T_PCH_LPT)
16855 delay(50 * 1000);
16856 else {
16857 i = 20;
16858
16859 do {
16860 delay(5 * 1000);
16861 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0)
16862 && i--);
16863
16864 delay(30 * 1000);
16865 }
16866 }
16867
16868 static int
16869 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link)
16870 {
16871 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ)
16872 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND;
16873 uint32_t rxa;
16874 uint16_t scale = 0, lat_enc = 0;
16875 int32_t obff_hwm = 0;
16876 int64_t lat_ns, value;
16877
16878 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
16879 device_xname(sc->sc_dev), __func__));
16880
16881 if (link) {
16882 uint16_t max_snoop, max_nosnoop, max_ltr_enc;
16883 uint32_t status;
16884 uint16_t speed;
16885 pcireg_t preg;
16886
16887 status = CSR_READ(sc, WMREG_STATUS);
16888 switch (__SHIFTOUT(status, STATUS_SPEED)) {
16889 case STATUS_SPEED_10:
16890 speed = 10;
16891 break;
16892 case STATUS_SPEED_100:
16893 speed = 100;
16894 break;
16895 case STATUS_SPEED_1000:
16896 speed = 1000;
16897 break;
16898 default:
16899 device_printf(sc->sc_dev, "Unknown speed "
16900 "(status = %08x)\n", status);
16901 return -1;
16902 }
16903
16904 /* Rx Packet Buffer Allocation size (KB) */
16905 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK;
16906
16907 /*
16908 * Determine the maximum latency tolerated by the device.
16909 *
16910 * Per the PCIe spec, the tolerated latencies are encoded as
16911 * a 3-bit encoded scale (only 0-5 are valid) multiplied by
16912 * a 10-bit value (0-1023) to provide a range from 1 ns to
16913 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns,
16914 * 1=2^5ns, 2=2^10ns,...5=2^25ns.
16915 */
16916 lat_ns = ((int64_t)rxa * 1024 -
16917 (2 * ((int64_t)sc->sc_ethercom.ec_if.if_mtu
16918 + ETHER_HDR_LEN))) * 8 * 1000;
16919 if (lat_ns < 0)
16920 lat_ns = 0;
16921 else
16922 lat_ns /= speed;
16923 value = lat_ns;
16924
16925 while (value > LTRV_VALUE) {
16926 scale ++;
16927 value = howmany(value, __BIT(5));
16928 }
16929 if (scale > LTRV_SCALE_MAX) {
16930 device_printf(sc->sc_dev,
16931 "Invalid LTR latency scale %d\n", scale);
16932 return -1;
16933 }
16934 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value);
16935
16936 /* Determine the maximum latency tolerated by the platform */
16937 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
16938 WM_PCI_LTR_CAP_LPT);
16939 max_snoop = preg & 0xffff;
16940 max_nosnoop = preg >> 16;
16941
16942 max_ltr_enc = MAX(max_snoop, max_nosnoop);
16943
16944 if (lat_enc > max_ltr_enc) {
16945 lat_enc = max_ltr_enc;
16946 lat_ns = __SHIFTOUT(lat_enc, PCI_LTR_MAXSNOOPLAT_VAL)
16947 * PCI_LTR_SCALETONS(
16948 __SHIFTOUT(lat_enc,
16949 PCI_LTR_MAXSNOOPLAT_SCALE));
16950 }
16951
16952 if (lat_ns) {
16953 lat_ns *= speed * 1000;
16954 lat_ns /= 8;
16955 lat_ns /= 1000000000;
16956 obff_hwm = (int32_t)(rxa - lat_ns);
16957 }
16958 if ((obff_hwm < 0) || (obff_hwm > SVT_OFF_HWM)) {
16959 device_printf(sc->sc_dev, "Invalid high water mark %d"
16960 "(rxa = %d, lat_ns = %d)\n",
16961 obff_hwm, (int32_t)rxa, (int32_t)lat_ns);
16962 return -1;
16963 }
16964 }
16965 /* Snoop and No-Snoop latencies the same */
16966 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP);
16967 CSR_WRITE(sc, WMREG_LTRV, reg);
16968
16969 /* Set OBFF high water mark */
16970 reg = CSR_READ(sc, WMREG_SVT) & ~SVT_OFF_HWM;
16971 reg |= obff_hwm;
16972 CSR_WRITE(sc, WMREG_SVT, reg);
16973
16974 /* Enable OBFF */
16975 reg = CSR_READ(sc, WMREG_SVCR);
16976 reg |= SVCR_OFF_EN | SVCR_OFF_MASKINT;
16977 CSR_WRITE(sc, WMREG_SVCR, reg);
16978
16979 return 0;
16980 }
16981
16982 /*
16983 * I210 Errata 25 and I211 Errata 10
16984 * Slow System Clock.
16985 *
16986 * Note that this function is called on both FLASH and iNVM case on NetBSD.
16987 */
16988 static int
16989 wm_pll_workaround_i210(struct wm_softc *sc)
16990 {
16991 uint32_t mdicnfg, wuc;
16992 uint32_t reg;
16993 pcireg_t pcireg;
16994 uint32_t pmreg;
16995 uint16_t nvmword, tmp_nvmword;
16996 uint16_t phyval;
16997 bool wa_done = false;
16998 int i, rv = 0;
16999
17000 /* Get Power Management cap offset */
17001 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
17002 &pmreg, NULL) == 0)
17003 return -1;
17004
17005 /* Save WUC and MDICNFG registers */
17006 wuc = CSR_READ(sc, WMREG_WUC);
17007 mdicnfg = CSR_READ(sc, WMREG_MDICNFG);
17008
17009 reg = mdicnfg & ~MDICNFG_DEST;
17010 CSR_WRITE(sc, WMREG_MDICNFG, reg);
17011
17012 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0) {
17013 /*
17014 * The default value of the Initialization Control Word 1
17015 * is the same on both I210's FLASH_HW and I21[01]'s iNVM.
17016 */
17017 nvmword = INVM_DEFAULT_AL;
17018 }
17019 tmp_nvmword = nvmword | INVM_PLL_WO_VAL;
17020
17021 for (i = 0; i < WM_MAX_PLL_TRIES; i++) {
17022 wm_gmii_gs40g_readreg(sc->sc_dev, 1,
17023 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG, &phyval);
17024
17025 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) {
17026 rv = 0;
17027 break; /* OK */
17028 } else
17029 rv = -1;
17030
17031 wa_done = true;
17032 /* Directly reset the internal PHY */
17033 reg = CSR_READ(sc, WMREG_CTRL);
17034 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
17035
17036 reg = CSR_READ(sc, WMREG_CTRL_EXT);
17037 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE;
17038 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
17039
17040 CSR_WRITE(sc, WMREG_WUC, 0);
17041 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16);
17042 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
17043
17044 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
17045 pmreg + PCI_PMCSR);
17046 pcireg |= PCI_PMCSR_STATE_D3;
17047 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
17048 pmreg + PCI_PMCSR, pcireg);
17049 delay(1000);
17050 pcireg &= ~PCI_PMCSR_STATE_D3;
17051 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
17052 pmreg + PCI_PMCSR, pcireg);
17053
17054 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16);
17055 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
17056
17057 /* Restore WUC register */
17058 CSR_WRITE(sc, WMREG_WUC, wuc);
17059 }
17060
17061 /* Restore MDICNFG setting */
17062 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg);
17063 if (wa_done)
17064 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n");
17065 return rv;
17066 }
17067
17068 static void
17069 wm_legacy_irq_quirk_spt(struct wm_softc *sc)
17070 {
17071 uint32_t reg;
17072
17073 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n",
17074 device_xname(sc->sc_dev), __func__));
17075 KASSERT((sc->sc_type == WM_T_PCH_SPT)
17076 || (sc->sc_type == WM_T_PCH_CNP));
17077
17078 reg = CSR_READ(sc, WMREG_FEXTNVM7);
17079 reg |= FEXTNVM7_SIDE_CLK_UNGATE;
17080 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
17081
17082 reg = CSR_READ(sc, WMREG_FEXTNVM9);
17083 reg |= FEXTNVM9_IOSFSB_CLKGATE_DIS | FEXTNVM9_IOSFSB_CLKREQ_DIS;
17084 CSR_WRITE(sc, WMREG_FEXTNVM9, reg);
17085 }
17086
17087 /* Sysctl function */
17088 #ifdef WM_DEBUG
17089 static int
17090 wm_sysctl_debug(SYSCTLFN_ARGS)
17091 {
17092 struct sysctlnode node = *rnode;
17093 struct wm_softc *sc = (struct wm_softc *)node.sysctl_data;
17094 uint32_t dflags;
17095 int error;
17096
17097 dflags = sc->sc_debug;
17098 node.sysctl_data = &dflags;
17099 error = sysctl_lookup(SYSCTLFN_CALL(&node));
17100
17101 if (error || newp == NULL)
17102 return error;
17103
17104 sc->sc_debug = dflags;
17105
17106 return 0;
17107 }
17108 #endif
17109