if_wm.c revision 1.566 1 /* $NetBSD: if_wm.c,v 1.566 2018/03/01 03:32:33 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)
79 * - Virtual Function
80 * - Set LED correctly (based on contents in EEPROM)
81 * - Rework how parameters are loaded from the EEPROM.
82 * - Image Unique ID
83 */
84
85 #include <sys/cdefs.h>
86 __KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.566 2018/03/01 03:32:33 msaitoh Exp $");
87
88 #ifdef _KERNEL_OPT
89 #include "opt_net_mpsafe.h"
90 #include "opt_if_wm.h"
91 #endif
92
93 #include <sys/param.h>
94 #include <sys/systm.h>
95 #include <sys/callout.h>
96 #include <sys/mbuf.h>
97 #include <sys/malloc.h>
98 #include <sys/kmem.h>
99 #include <sys/kernel.h>
100 #include <sys/socket.h>
101 #include <sys/ioctl.h>
102 #include <sys/errno.h>
103 #include <sys/device.h>
104 #include <sys/queue.h>
105 #include <sys/syslog.h>
106 #include <sys/interrupt.h>
107 #include <sys/cpu.h>
108 #include <sys/pcq.h>
109
110 #include <sys/rndsource.h>
111
112 #include <net/if.h>
113 #include <net/if_dl.h>
114 #include <net/if_media.h>
115 #include <net/if_ether.h>
116
117 #include <net/bpf.h>
118
119 #include <net/rss_config.h>
120
121 #include <netinet/in.h> /* XXX for struct ip */
122 #include <netinet/in_systm.h> /* XXX for struct ip */
123 #include <netinet/ip.h> /* XXX for struct ip */
124 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */
125 #include <netinet/tcp.h> /* XXX for struct tcphdr */
126
127 #include <sys/bus.h>
128 #include <sys/intr.h>
129 #include <machine/endian.h>
130
131 #include <dev/mii/mii.h>
132 #include <dev/mii/miivar.h>
133 #include <dev/mii/miidevs.h>
134 #include <dev/mii/mii_bitbang.h>
135 #include <dev/mii/ikphyreg.h>
136 #include <dev/mii/igphyreg.h>
137 #include <dev/mii/igphyvar.h>
138 #include <dev/mii/inbmphyreg.h>
139 #include <dev/mii/ihphyreg.h>
140
141 #include <dev/pci/pcireg.h>
142 #include <dev/pci/pcivar.h>
143 #include <dev/pci/pcidevs.h>
144
145 #include <dev/pci/if_wmreg.h>
146 #include <dev/pci/if_wmvar.h>
147
148 #ifdef WM_DEBUG
149 #define WM_DEBUG_LINK __BIT(0)
150 #define WM_DEBUG_TX __BIT(1)
151 #define WM_DEBUG_RX __BIT(2)
152 #define WM_DEBUG_GMII __BIT(3)
153 #define WM_DEBUG_MANAGE __BIT(4)
154 #define WM_DEBUG_NVM __BIT(5)
155 #define WM_DEBUG_INIT __BIT(6)
156 #define WM_DEBUG_LOCK __BIT(7)
157 int wm_debug = WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | WM_DEBUG_GMII
158 | WM_DEBUG_MANAGE | WM_DEBUG_NVM | WM_DEBUG_INIT | WM_DEBUG_LOCK;
159
160 #define DPRINTF(x, y) if (wm_debug & (x)) printf y
161 #else
162 #define DPRINTF(x, y) /* nothing */
163 #endif /* WM_DEBUG */
164
165 #ifdef NET_MPSAFE
166 #define WM_MPSAFE 1
167 #define CALLOUT_FLAGS CALLOUT_MPSAFE
168 #else
169 #define CALLOUT_FLAGS 0
170 #endif
171
172 /*
173 * This device driver's max interrupt numbers.
174 */
175 #define WM_MAX_NQUEUEINTR 16
176 #define WM_MAX_NINTR (WM_MAX_NQUEUEINTR + 1)
177
178 #ifndef WM_DISABLE_MSI
179 #define WM_DISABLE_MSI 0
180 #endif
181 #ifndef WM_DISABLE_MSIX
182 #define WM_DISABLE_MSIX 0
183 #endif
184
185 int wm_disable_msi = WM_DISABLE_MSI;
186 int wm_disable_msix = WM_DISABLE_MSIX;
187
188 #ifndef WM_WATCHDOG_TIMEOUT
189 #define WM_WATCHDOG_TIMEOUT 5
190 #endif
191 static int wm_watchdog_timeout = WM_WATCHDOG_TIMEOUT;
192
193 /*
194 * Transmit descriptor list size. Due to errata, we can only have
195 * 256 hardware descriptors in the ring on < 82544, but we use 4096
196 * on >= 82544. We tell the upper layers that they can queue a lot
197 * of packets, and we go ahead and manage up to 64 (16 for the i82547)
198 * of them at a time.
199 *
200 * We allow up to 256 (!) DMA segments per packet. Pathological packet
201 * chains containing many small mbufs have been observed in zero-copy
202 * situations with jumbo frames.
203 */
204 #define WM_NTXSEGS 256
205 #define WM_IFQUEUELEN 256
206 #define WM_TXQUEUELEN_MAX 64
207 #define WM_TXQUEUELEN_MAX_82547 16
208 #define WM_TXQUEUELEN(txq) ((txq)->txq_num)
209 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1)
210 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8)
211 #define WM_NTXDESC_82542 256
212 #define WM_NTXDESC_82544 4096
213 #define WM_NTXDESC(txq) ((txq)->txq_ndesc)
214 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1)
215 #define WM_TXDESCS_SIZE(txq) (WM_NTXDESC(txq) * (txq)->txq_descsize)
216 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq))
217 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq))
218
219 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */
220
221 #define WM_TXINTERQSIZE 256
222
223 #ifndef WM_TX_PROCESS_LIMIT_DEFAULT
224 #define WM_TX_PROCESS_LIMIT_DEFAULT 100U
225 #endif
226 #ifndef WM_TX_INTR_PROCESS_LIMIT_DEFAULT
227 #define WM_TX_INTR_PROCESS_LIMIT_DEFAULT 0U
228 #endif
229
230 /*
231 * Receive descriptor list size. We have one Rx buffer for normal
232 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized
233 * packet. We allocate 256 receive descriptors, each with a 2k
234 * buffer (MCLBYTES), which gives us room for 50 jumbo packets.
235 */
236 #define WM_NRXDESC 256
237 #define WM_NRXDESC_MASK (WM_NRXDESC - 1)
238 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK)
239 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK)
240
241 #ifndef WM_RX_PROCESS_LIMIT_DEFAULT
242 #define WM_RX_PROCESS_LIMIT_DEFAULT 100U
243 #endif
244 #ifndef WM_RX_INTR_PROCESS_LIMIT_DEFAULT
245 #define WM_RX_INTR_PROCESS_LIMIT_DEFAULT 0U
246 #endif
247
248 typedef union txdescs {
249 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544];
250 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544];
251 } txdescs_t;
252
253 typedef union rxdescs {
254 wiseman_rxdesc_t sctxu_rxdescs[WM_NRXDESC];
255 ext_rxdesc_t sctxu_ext_rxdescs[WM_NRXDESC]; /* 82574 only */
256 nq_rxdesc_t sctxu_nq_rxdescs[WM_NRXDESC]; /* 82575 and newer */
257 } rxdescs_t;
258
259 #define WM_CDTXOFF(txq, x) ((txq)->txq_descsize * (x))
260 #define WM_CDRXOFF(rxq, x) ((rxq)->rxq_descsize * (x))
261
262 /*
263 * Software state for transmit jobs.
264 */
265 struct wm_txsoft {
266 struct mbuf *txs_mbuf; /* head of our mbuf chain */
267 bus_dmamap_t txs_dmamap; /* our DMA map */
268 int txs_firstdesc; /* first descriptor in packet */
269 int txs_lastdesc; /* last descriptor in packet */
270 int txs_ndesc; /* # of descriptors used */
271 };
272
273 /*
274 * Software state for receive buffers. Each descriptor gets a
275 * 2k (MCLBYTES) buffer and a DMA map. For packets which fill
276 * more than one buffer, we chain them together.
277 */
278 struct wm_rxsoft {
279 struct mbuf *rxs_mbuf; /* head of our mbuf chain */
280 bus_dmamap_t rxs_dmamap; /* our DMA map */
281 };
282
283 #define WM_LINKUP_TIMEOUT 50
284
285 static uint16_t swfwphysem[] = {
286 SWFW_PHY0_SM,
287 SWFW_PHY1_SM,
288 SWFW_PHY2_SM,
289 SWFW_PHY3_SM
290 };
291
292 static const uint32_t wm_82580_rxpbs_table[] = {
293 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140
294 };
295
296 struct wm_softc;
297
298 #ifdef WM_EVENT_COUNTERS
299 #define WM_Q_EVCNT_DEFINE(qname, evname) \
300 char qname##_##evname##_evcnt_name[sizeof("qname##XX##evname")]; \
301 struct evcnt qname##_ev_##evname;
302
303 #define WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, evtype) \
304 do{ \
305 snprintf((q)->qname##_##evname##_evcnt_name, \
306 sizeof((q)->qname##_##evname##_evcnt_name), \
307 "%s%02d%s", #qname, (qnum), #evname); \
308 evcnt_attach_dynamic(&(q)->qname##_ev_##evname, \
309 (evtype), NULL, (xname), \
310 (q)->qname##_##evname##_evcnt_name); \
311 }while(0)
312
313 #define WM_Q_MISC_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
314 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_MISC)
315
316 #define WM_Q_INTR_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
317 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_INTR)
318
319 #define WM_Q_EVCNT_DETACH(qname, evname, q, qnum) \
320 evcnt_detach(&(q)->qname##_ev_##evname);
321 #endif /* WM_EVENT_COUNTERS */
322
323 struct wm_txqueue {
324 kmutex_t *txq_lock; /* lock for tx operations */
325
326 struct wm_softc *txq_sc; /* shortcut (skip struct wm_queue) */
327
328 /* Software state for the transmit descriptors. */
329 int txq_num; /* must be a power of two */
330 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX];
331
332 /* TX control data structures. */
333 int txq_ndesc; /* must be a power of two */
334 size_t txq_descsize; /* a tx descriptor size */
335 txdescs_t *txq_descs_u;
336 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */
337 bus_dma_segment_t txq_desc_seg; /* control data segment */
338 int txq_desc_rseg; /* real number of control segment */
339 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr
340 #define txq_descs txq_descs_u->sctxu_txdescs
341 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs
342
343 bus_addr_t txq_tdt_reg; /* offset of TDT register */
344
345 int txq_free; /* number of free Tx descriptors */
346 int txq_next; /* next ready Tx descriptor */
347
348 int txq_sfree; /* number of free Tx jobs */
349 int txq_snext; /* next free Tx job */
350 int txq_sdirty; /* dirty Tx jobs */
351
352 /* These 4 variables are used only on the 82547. */
353 int txq_fifo_size; /* Tx FIFO size */
354 int txq_fifo_head; /* current head of FIFO */
355 uint32_t txq_fifo_addr; /* internal address of start of FIFO */
356 int txq_fifo_stall; /* Tx FIFO is stalled */
357
358 /*
359 * When ncpu > number of Tx queues, a Tx queue is shared by multiple
360 * CPUs. This queue intermediate them without block.
361 */
362 pcq_t *txq_interq;
363
364 /*
365 * NEWQUEUE devices must use not ifp->if_flags but txq->txq_flags
366 * to manage Tx H/W queue's busy flag.
367 */
368 int txq_flags; /* flags for H/W queue, see below */
369 #define WM_TXQ_NO_SPACE 0x1
370
371 bool txq_stopping;
372
373 bool txq_watchdog;
374 time_t txq_lastsent;
375
376 uint32_t txq_packets; /* for AIM */
377 uint32_t txq_bytes; /* for AIM */
378 #ifdef WM_EVENT_COUNTERS
379 WM_Q_EVCNT_DEFINE(txq, txsstall) /* Tx stalled due to no txs */
380 WM_Q_EVCNT_DEFINE(txq, txdstall) /* Tx stalled due to no txd */
381 WM_Q_EVCNT_DEFINE(txq, txfifo_stall) /* Tx FIFO stalls (82547) */
382 WM_Q_EVCNT_DEFINE(txq, txdw) /* Tx descriptor interrupts */
383 WM_Q_EVCNT_DEFINE(txq, txqe) /* Tx queue empty interrupts */
384 /* XXX not used? */
385
386 WM_Q_EVCNT_DEFINE(txq, txipsum) /* IP checksums comp. out-bound */
387 WM_Q_EVCNT_DEFINE(txq,txtusum) /* TCP/UDP cksums comp. out-bound */
388 WM_Q_EVCNT_DEFINE(txq, txtusum6) /* TCP/UDP v6 cksums comp. out-bound */
389 WM_Q_EVCNT_DEFINE(txq, txtso) /* TCP seg offload out-bound (IPv4) */
390 WM_Q_EVCNT_DEFINE(txq, txtso6) /* TCP seg offload out-bound (IPv6) */
391 WM_Q_EVCNT_DEFINE(txq, txtsopain) /* painful header manip. for TSO */
392
393 WM_Q_EVCNT_DEFINE(txq, txdrop) /* Tx packets dropped(too many segs) */
394
395 WM_Q_EVCNT_DEFINE(txq, tu) /* Tx underrun */
396
397 char txq_txseg_evcnt_names[WM_NTXSEGS][sizeof("txqXXtxsegXXX")];
398 struct evcnt txq_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */
399 #endif /* WM_EVENT_COUNTERS */
400 };
401
402 struct wm_rxqueue {
403 kmutex_t *rxq_lock; /* lock for rx operations */
404
405 struct wm_softc *rxq_sc; /* shortcut (skip struct wm_queue) */
406
407 /* Software state for the receive descriptors. */
408 struct wm_rxsoft rxq_soft[WM_NRXDESC];
409
410 /* RX control data structures. */
411 int rxq_ndesc; /* must be a power of two */
412 size_t rxq_descsize; /* a rx descriptor size */
413 rxdescs_t *rxq_descs_u;
414 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */
415 bus_dma_segment_t rxq_desc_seg; /* control data segment */
416 int rxq_desc_rseg; /* real number of control segment */
417 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr
418 #define rxq_descs rxq_descs_u->sctxu_rxdescs
419 #define rxq_ext_descs rxq_descs_u->sctxu_ext_rxdescs
420 #define rxq_nq_descs rxq_descs_u->sctxu_nq_rxdescs
421
422 bus_addr_t rxq_rdt_reg; /* offset of RDT register */
423
424 int rxq_ptr; /* next ready Rx desc/queue ent */
425 int rxq_discard;
426 int rxq_len;
427 struct mbuf *rxq_head;
428 struct mbuf *rxq_tail;
429 struct mbuf **rxq_tailp;
430
431 bool rxq_stopping;
432
433 uint32_t rxq_packets; /* for AIM */
434 uint32_t rxq_bytes; /* for AIM */
435 #ifdef WM_EVENT_COUNTERS
436 WM_Q_EVCNT_DEFINE(rxq, rxintr); /* Rx interrupts */
437 WM_Q_EVCNT_DEFINE(rxq, rxdefer); /* Rx deferred processing */
438
439 WM_Q_EVCNT_DEFINE(rxq, rxipsum); /* IP checksums checked in-bound */
440 WM_Q_EVCNT_DEFINE(rxq, rxtusum); /* TCP/UDP cksums checked in-bound */
441 #endif
442 };
443
444 struct wm_queue {
445 int wmq_id; /* index of transmit and receive queues */
446 int wmq_intr_idx; /* index of MSI-X tables */
447
448 uint32_t wmq_itr; /* interrupt interval per queue. */
449 bool wmq_set_itr;
450
451 struct wm_txqueue wmq_txq;
452 struct wm_rxqueue wmq_rxq;
453
454 void *wmq_si;
455 };
456
457 struct wm_phyop {
458 int (*acquire)(struct wm_softc *);
459 void (*release)(struct wm_softc *);
460 int reset_delay_us;
461 };
462
463 struct wm_nvmop {
464 int (*acquire)(struct wm_softc *);
465 void (*release)(struct wm_softc *);
466 int (*read)(struct wm_softc *, int, int, uint16_t *);
467 };
468
469 /*
470 * Software state per device.
471 */
472 struct wm_softc {
473 device_t sc_dev; /* generic device information */
474 bus_space_tag_t sc_st; /* bus space tag */
475 bus_space_handle_t sc_sh; /* bus space handle */
476 bus_size_t sc_ss; /* bus space size */
477 bus_space_tag_t sc_iot; /* I/O space tag */
478 bus_space_handle_t sc_ioh; /* I/O space handle */
479 bus_size_t sc_ios; /* I/O space size */
480 bus_space_tag_t sc_flasht; /* flash registers space tag */
481 bus_space_handle_t sc_flashh; /* flash registers space handle */
482 bus_size_t sc_flashs; /* flash registers space size */
483 off_t sc_flashreg_offset; /*
484 * offset to flash registers from
485 * start of BAR
486 */
487 bus_dma_tag_t sc_dmat; /* bus DMA tag */
488
489 struct ethercom sc_ethercom; /* ethernet common data */
490 struct mii_data sc_mii; /* MII/media information */
491
492 pci_chipset_tag_t sc_pc;
493 pcitag_t sc_pcitag;
494 int sc_bus_speed; /* PCI/PCIX bus speed */
495 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */
496
497 uint16_t sc_pcidevid; /* PCI device ID */
498 wm_chip_type sc_type; /* MAC type */
499 int sc_rev; /* MAC revision */
500 wm_phy_type sc_phytype; /* PHY type */
501 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/
502 #define WM_MEDIATYPE_UNKNOWN 0x00
503 #define WM_MEDIATYPE_FIBER 0x01
504 #define WM_MEDIATYPE_COPPER 0x02
505 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */
506 int sc_funcid; /* unit number of the chip (0 to 3) */
507 int sc_flags; /* flags; see below */
508 int sc_if_flags; /* last if_flags */
509 int sc_flowflags; /* 802.3x flow control flags */
510 int sc_align_tweak;
511
512 void *sc_ihs[WM_MAX_NINTR]; /*
513 * interrupt cookie.
514 * - legacy and msi use sc_ihs[0] only
515 * - msix use sc_ihs[0] to sc_ihs[nintrs-1]
516 */
517 pci_intr_handle_t *sc_intrs; /*
518 * legacy and msi use sc_intrs[0] only
519 * msix use sc_intrs[0] to sc_ihs[nintrs-1]
520 */
521 int sc_nintrs; /* number of interrupts */
522
523 int sc_link_intr_idx; /* index of MSI-X tables */
524
525 callout_t sc_tick_ch; /* tick callout */
526 bool sc_core_stopping;
527
528 int sc_nvm_ver_major;
529 int sc_nvm_ver_minor;
530 int sc_nvm_ver_build;
531 int sc_nvm_addrbits; /* NVM address bits */
532 unsigned int sc_nvm_wordsize; /* NVM word size */
533 int sc_ich8_flash_base;
534 int sc_ich8_flash_bank_size;
535 int sc_nvm_k1_enabled;
536
537 int sc_nqueues;
538 struct wm_queue *sc_queue;
539 u_int sc_tx_process_limit; /* Tx processing repeat limit in softint */
540 u_int sc_tx_intr_process_limit; /* Tx processing repeat limit in H/W intr */
541 u_int sc_rx_process_limit; /* Rx processing repeat limit in softint */
542 u_int sc_rx_intr_process_limit; /* Rx processing repeat limit in H/W intr */
543
544 int sc_affinity_offset;
545
546 #ifdef WM_EVENT_COUNTERS
547 /* Event counters. */
548 struct evcnt sc_ev_linkintr; /* Link interrupts */
549
550 /* WM_T_82542_2_1 only */
551 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */
552 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */
553 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */
554 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */
555 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */
556 #endif /* WM_EVENT_COUNTERS */
557
558 /* This variable are used only on the 82547. */
559 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */
560
561 uint32_t sc_ctrl; /* prototype CTRL register */
562 #if 0
563 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */
564 #endif
565 uint32_t sc_icr; /* prototype interrupt bits */
566 uint32_t sc_itr_init; /* prototype intr throttling reg */
567 uint32_t sc_tctl; /* prototype TCTL register */
568 uint32_t sc_rctl; /* prototype RCTL register */
569 uint32_t sc_txcw; /* prototype TXCW register */
570 uint32_t sc_tipg; /* prototype TIPG register */
571 uint32_t sc_fcrtl; /* prototype FCRTL register */
572 uint32_t sc_pba; /* prototype PBA register */
573
574 int sc_tbi_linkup; /* TBI link status */
575 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */
576 int sc_tbi_serdes_ticks; /* tbi ticks */
577
578 int sc_mchash_type; /* multicast filter offset */
579
580 krndsource_t rnd_source; /* random source */
581
582 struct if_percpuq *sc_ipq; /* softint-based input queues */
583
584 kmutex_t *sc_core_lock; /* lock for softc operations */
585 kmutex_t *sc_ich_phymtx; /*
586 * 82574/82583/ICH/PCH specific PHY
587 * mutex. For 82574/82583, the mutex
588 * is used for both PHY and NVM.
589 */
590 kmutex_t *sc_ich_nvmmtx; /* ICH/PCH specific NVM mutex */
591
592 struct wm_phyop phy;
593 struct wm_nvmop nvm;
594 };
595
596 #define WM_CORE_LOCK(_sc) if ((_sc)->sc_core_lock) mutex_enter((_sc)->sc_core_lock)
597 #define WM_CORE_UNLOCK(_sc) if ((_sc)->sc_core_lock) mutex_exit((_sc)->sc_core_lock)
598 #define WM_CORE_LOCKED(_sc) (!(_sc)->sc_core_lock || mutex_owned((_sc)->sc_core_lock))
599
600 #define WM_RXCHAIN_RESET(rxq) \
601 do { \
602 (rxq)->rxq_tailp = &(rxq)->rxq_head; \
603 *(rxq)->rxq_tailp = NULL; \
604 (rxq)->rxq_len = 0; \
605 } while (/*CONSTCOND*/0)
606
607 #define WM_RXCHAIN_LINK(rxq, m) \
608 do { \
609 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \
610 (rxq)->rxq_tailp = &(m)->m_next; \
611 } while (/*CONSTCOND*/0)
612
613 #ifdef WM_EVENT_COUNTERS
614 #define WM_EVCNT_INCR(ev) (ev)->ev_count++
615 #define WM_EVCNT_ADD(ev, val) (ev)->ev_count += (val)
616
617 #define WM_Q_EVCNT_INCR(qname, evname) \
618 WM_EVCNT_INCR(&(qname)->qname##_ev_##evname)
619 #define WM_Q_EVCNT_ADD(qname, evname, val) \
620 WM_EVCNT_ADD(&(qname)->qname##_ev_##evname, (val))
621 #else /* !WM_EVENT_COUNTERS */
622 #define WM_EVCNT_INCR(ev) /* nothing */
623 #define WM_EVCNT_ADD(ev, val) /* nothing */
624
625 #define WM_Q_EVCNT_INCR(qname, evname) /* nothing */
626 #define WM_Q_EVCNT_ADD(qname, evname, val) /* nothing */
627 #endif /* !WM_EVENT_COUNTERS */
628
629 #define CSR_READ(sc, reg) \
630 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
631 #define CSR_WRITE(sc, reg, val) \
632 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
633 #define CSR_WRITE_FLUSH(sc) \
634 (void) CSR_READ((sc), WMREG_STATUS)
635
636 #define ICH8_FLASH_READ32(sc, reg) \
637 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, \
638 (reg) + sc->sc_flashreg_offset)
639 #define ICH8_FLASH_WRITE32(sc, reg, data) \
640 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, \
641 (reg) + sc->sc_flashreg_offset, (data))
642
643 #define ICH8_FLASH_READ16(sc, reg) \
644 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, \
645 (reg) + sc->sc_flashreg_offset)
646 #define ICH8_FLASH_WRITE16(sc, reg, data) \
647 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, \
648 (reg) + sc->sc_flashreg_offset, (data))
649
650 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((txq), (x)))
651 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((rxq), (x)))
652
653 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU)
654 #define WM_CDTXADDR_HI(txq, x) \
655 (sizeof(bus_addr_t) == 8 ? \
656 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0)
657
658 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU)
659 #define WM_CDRXADDR_HI(rxq, x) \
660 (sizeof(bus_addr_t) == 8 ? \
661 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0)
662
663 /*
664 * Register read/write functions.
665 * Other than CSR_{READ|WRITE}().
666 */
667 #if 0
668 static inline uint32_t wm_io_read(struct wm_softc *, int);
669 #endif
670 static inline void wm_io_write(struct wm_softc *, int, uint32_t);
671 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t,
672 uint32_t, uint32_t);
673 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t);
674
675 /*
676 * Descriptor sync/init functions.
677 */
678 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int);
679 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int);
680 static inline void wm_init_rxdesc(struct wm_rxqueue *, int);
681
682 /*
683 * Device driver interface functions and commonly used functions.
684 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
685 */
686 static const struct wm_product *wm_lookup(const struct pci_attach_args *);
687 static int wm_match(device_t, cfdata_t, void *);
688 static void wm_attach(device_t, device_t, void *);
689 static int wm_detach(device_t, int);
690 static bool wm_suspend(device_t, const pmf_qual_t *);
691 static bool wm_resume(device_t, const pmf_qual_t *);
692 static void wm_watchdog(struct ifnet *);
693 static void wm_watchdog_txq(struct ifnet *, struct wm_txqueue *, uint16_t *);
694 static void wm_watchdog_txq_locked(struct ifnet *, struct wm_txqueue *, uint16_t *);
695 static void wm_tick(void *);
696 static int wm_ifflags_cb(struct ethercom *);
697 static int wm_ioctl(struct ifnet *, u_long, void *);
698 /* MAC address related */
699 static uint16_t wm_check_alt_mac_addr(struct wm_softc *);
700 static int wm_read_mac_addr(struct wm_softc *, uint8_t *);
701 static void wm_set_ral(struct wm_softc *, const uint8_t *, int);
702 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *);
703 static void wm_set_filter(struct wm_softc *);
704 /* Reset and init related */
705 static void wm_set_vlan(struct wm_softc *);
706 static void wm_set_pcie_completion_timeout(struct wm_softc *);
707 static void wm_get_auto_rd_done(struct wm_softc *);
708 static void wm_lan_init_done(struct wm_softc *);
709 static void wm_get_cfg_done(struct wm_softc *);
710 static void wm_phy_post_reset(struct wm_softc *);
711 static void wm_write_smbus_addr(struct wm_softc *);
712 static void wm_init_lcd_from_nvm(struct wm_softc *);
713 static void wm_initialize_hardware_bits(struct wm_softc *);
714 static uint32_t wm_rxpbs_adjust_82580(uint32_t);
715 static void wm_reset_phy(struct wm_softc *);
716 static void wm_flush_desc_rings(struct wm_softc *);
717 static void wm_reset(struct wm_softc *);
718 static int wm_add_rxbuf(struct wm_rxqueue *, int);
719 static void wm_rxdrain(struct wm_rxqueue *);
720 static void wm_init_rss(struct wm_softc *);
721 static void wm_adjust_qnum(struct wm_softc *, int);
722 static inline bool wm_is_using_msix(struct wm_softc *);
723 static inline bool wm_is_using_multiqueue(struct wm_softc *);
724 static int wm_softint_establish(struct wm_softc *, int, int);
725 static int wm_setup_legacy(struct wm_softc *);
726 static int wm_setup_msix(struct wm_softc *);
727 static int wm_init(struct ifnet *);
728 static int wm_init_locked(struct ifnet *);
729 static void wm_unset_stopping_flags(struct wm_softc *);
730 static void wm_set_stopping_flags(struct wm_softc *);
731 static void wm_stop(struct ifnet *, int);
732 static void wm_stop_locked(struct ifnet *, int);
733 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *);
734 static void wm_82547_txfifo_stall(void *);
735 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *);
736 static void wm_itrs_writereg(struct wm_softc *, struct wm_queue *);
737 /* DMA related */
738 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *);
739 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *);
740 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *);
741 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *,
742 struct wm_txqueue *);
743 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *);
744 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *);
745 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *,
746 struct wm_rxqueue *);
747 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *);
748 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *);
749 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *);
750 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
751 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
752 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
753 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *,
754 struct wm_txqueue *);
755 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *,
756 struct wm_rxqueue *);
757 static int wm_alloc_txrx_queues(struct wm_softc *);
758 static void wm_free_txrx_queues(struct wm_softc *);
759 static int wm_init_txrx_queues(struct wm_softc *);
760 /* Start */
761 static int wm_tx_offload(struct wm_softc *, struct wm_txqueue *,
762 struct wm_txsoft *, uint32_t *, uint8_t *);
763 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *);
764 static void wm_start(struct ifnet *);
765 static void wm_start_locked(struct ifnet *);
766 static int wm_transmit(struct ifnet *, struct mbuf *);
767 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *);
768 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *, bool);
769 static int wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *,
770 struct wm_txsoft *, uint32_t *, uint32_t *, bool *);
771 static void wm_nq_start(struct ifnet *);
772 static void wm_nq_start_locked(struct ifnet *);
773 static int wm_nq_transmit(struct ifnet *, struct mbuf *);
774 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *);
775 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *, bool);
776 static void wm_deferred_start_locked(struct wm_txqueue *);
777 static void wm_handle_queue(void *);
778 /* Interrupt */
779 static bool wm_txeof(struct wm_txqueue *, u_int);
780 static bool wm_rxeof(struct wm_rxqueue *, u_int);
781 static void wm_linkintr_gmii(struct wm_softc *, uint32_t);
782 static void wm_linkintr_tbi(struct wm_softc *, uint32_t);
783 static void wm_linkintr_serdes(struct wm_softc *, uint32_t);
784 static void wm_linkintr(struct wm_softc *, uint32_t);
785 static int wm_intr_legacy(void *);
786 static inline void wm_txrxintr_disable(struct wm_queue *);
787 static inline void wm_txrxintr_enable(struct wm_queue *);
788 static void wm_itrs_calculate(struct wm_softc *, struct wm_queue *);
789 static int wm_txrxintr_msix(void *);
790 static int wm_linkintr_msix(void *);
791
792 /*
793 * Media related.
794 * GMII, SGMII, TBI, SERDES and SFP.
795 */
796 /* Common */
797 static void wm_tbi_serdes_set_linkled(struct wm_softc *);
798 /* GMII related */
799 static void wm_gmii_reset(struct wm_softc *);
800 static void wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t, uint16_t);
801 static int wm_get_phy_id_82575(struct wm_softc *);
802 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t);
803 static int wm_gmii_mediachange(struct ifnet *);
804 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
805 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int);
806 static uint32_t wm_i82543_mii_recvbits(struct wm_softc *);
807 static int wm_gmii_i82543_readreg(device_t, int, int);
808 static void wm_gmii_i82543_writereg(device_t, int, int, int);
809 static int wm_gmii_mdic_readreg(device_t, int, int);
810 static void wm_gmii_mdic_writereg(device_t, int, int, int);
811 static int wm_gmii_i82544_readreg(device_t, int, int);
812 static void wm_gmii_i82544_writereg(device_t, int, int, int);
813 static int wm_gmii_i80003_readreg(device_t, int, int);
814 static void wm_gmii_i80003_writereg(device_t, int, int, int);
815 static int wm_gmii_bm_readreg(device_t, int, int);
816 static void wm_gmii_bm_writereg(device_t, int, int, int);
817 static void wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int);
818 static int wm_gmii_hv_readreg(device_t, int, int);
819 static int wm_gmii_hv_readreg_locked(device_t, int, int);
820 static void wm_gmii_hv_writereg(device_t, int, int, int);
821 static void wm_gmii_hv_writereg_locked(device_t, int, int, int);
822 static int wm_gmii_82580_readreg(device_t, int, int);
823 static void wm_gmii_82580_writereg(device_t, int, int, int);
824 static int wm_gmii_gs40g_readreg(device_t, int, int);
825 static void wm_gmii_gs40g_writereg(device_t, int, int, int);
826 static void wm_gmii_statchg(struct ifnet *);
827 /*
828 * kumeran related (80003, ICH* and PCH*).
829 * These functions are not for accessing MII registers but for accessing
830 * kumeran specific registers.
831 */
832 static int wm_kmrn_readreg(struct wm_softc *, int, uint16_t *);
833 static int wm_kmrn_readreg_locked(struct wm_softc *, int, uint16_t *);
834 static int wm_kmrn_writereg(struct wm_softc *, int, uint16_t);
835 static int wm_kmrn_writereg_locked(struct wm_softc *, int, uint16_t);
836 /* SGMII */
837 static bool wm_sgmii_uses_mdio(struct wm_softc *);
838 static int wm_sgmii_readreg(device_t, int, int);
839 static void wm_sgmii_writereg(device_t, int, int, int);
840 /* TBI related */
841 static void wm_tbi_mediainit(struct wm_softc *);
842 static int wm_tbi_mediachange(struct ifnet *);
843 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
844 static int wm_check_for_link(struct wm_softc *);
845 static void wm_tbi_tick(struct wm_softc *);
846 /* SERDES related */
847 static void wm_serdes_power_up_link_82575(struct wm_softc *);
848 static int wm_serdes_mediachange(struct ifnet *);
849 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *);
850 static void wm_serdes_tick(struct wm_softc *);
851 /* SFP related */
852 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *);
853 static uint32_t wm_sfp_get_media_type(struct wm_softc *);
854
855 /*
856 * NVM related.
857 * Microwire, SPI (w/wo EERD) and Flash.
858 */
859 /* Misc functions */
860 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int);
861 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int);
862 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *);
863 /* Microwire */
864 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *);
865 /* SPI */
866 static int wm_nvm_ready_spi(struct wm_softc *);
867 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *);
868 /* Using with EERD */
869 static int wm_poll_eerd_eewr_done(struct wm_softc *, int);
870 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *);
871 /* Flash */
872 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *,
873 unsigned int *);
874 static int32_t wm_ich8_cycle_init(struct wm_softc *);
875 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t);
876 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t,
877 uint32_t *);
878 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *);
879 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *);
880 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *);
881 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *);
882 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *);
883 /* iNVM */
884 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *);
885 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *);
886 /* Lock, detecting NVM type, validate checksum and read */
887 static int wm_nvm_is_onboard_eeprom(struct wm_softc *);
888 static int wm_nvm_flash_presence_i210(struct wm_softc *);
889 static int wm_nvm_validate_checksum(struct wm_softc *);
890 static void wm_nvm_version_invm(struct wm_softc *);
891 static void wm_nvm_version(struct wm_softc *);
892 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *);
893
894 /*
895 * Hardware semaphores.
896 * Very complexed...
897 */
898 static int wm_get_null(struct wm_softc *);
899 static void wm_put_null(struct wm_softc *);
900 static int wm_get_eecd(struct wm_softc *);
901 static void wm_put_eecd(struct wm_softc *);
902 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */
903 static void wm_put_swsm_semaphore(struct wm_softc *);
904 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t);
905 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t);
906 static int wm_get_nvm_80003(struct wm_softc *);
907 static void wm_put_nvm_80003(struct wm_softc *);
908 static int wm_get_nvm_82571(struct wm_softc *);
909 static void wm_put_nvm_82571(struct wm_softc *);
910 static int wm_get_phy_82575(struct wm_softc *);
911 static void wm_put_phy_82575(struct wm_softc *);
912 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */
913 static void wm_put_swfwhw_semaphore(struct wm_softc *);
914 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */
915 static void wm_put_swflag_ich8lan(struct wm_softc *);
916 static int wm_get_nvm_ich8lan(struct wm_softc *);
917 static void wm_put_nvm_ich8lan(struct wm_softc *);
918 static int wm_get_hw_semaphore_82573(struct wm_softc *);
919 static void wm_put_hw_semaphore_82573(struct wm_softc *);
920
921 /*
922 * Management mode and power management related subroutines.
923 * BMC, AMT, suspend/resume and EEE.
924 */
925 #if 0
926 static int wm_check_mng_mode(struct wm_softc *);
927 static int wm_check_mng_mode_ich8lan(struct wm_softc *);
928 static int wm_check_mng_mode_82574(struct wm_softc *);
929 static int wm_check_mng_mode_generic(struct wm_softc *);
930 #endif
931 static int wm_enable_mng_pass_thru(struct wm_softc *);
932 static bool wm_phy_resetisblocked(struct wm_softc *);
933 static void wm_get_hw_control(struct wm_softc *);
934 static void wm_release_hw_control(struct wm_softc *);
935 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool);
936 static void wm_smbustopci(struct wm_softc *);
937 static void wm_init_manageability(struct wm_softc *);
938 static void wm_release_manageability(struct wm_softc *);
939 static void wm_get_wakeup(struct wm_softc *);
940 static void wm_ulp_disable(struct wm_softc *);
941 static void wm_enable_phy_wakeup(struct wm_softc *);
942 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *);
943 static void wm_enable_wakeup(struct wm_softc *);
944 static void wm_disable_aspm(struct wm_softc *);
945 /* LPLU (Low Power Link Up) */
946 static void wm_lplu_d0_disable(struct wm_softc *);
947 /* EEE */
948 static void wm_set_eee_i350(struct wm_softc *);
949
950 /*
951 * Workarounds (mainly PHY related).
952 * Basically, PHY's workarounds are in the PHY drivers.
953 */
954 static void wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *);
955 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *);
956 static void wm_hv_phy_workaround_ich8lan(struct wm_softc *);
957 static void wm_lv_phy_workaround_ich8lan(struct wm_softc *);
958 static int wm_k1_gig_workaround_hv(struct wm_softc *, int);
959 static void wm_set_mdio_slow_mode_hv(struct wm_softc *);
960 static void wm_configure_k1_ich8lan(struct wm_softc *, int);
961 static void wm_reset_init_script_82575(struct wm_softc *);
962 static void wm_reset_mdicnfg_82580(struct wm_softc *);
963 static bool wm_phy_is_accessible_pchlan(struct wm_softc *);
964 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *);
965 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool);
966 static void wm_pll_workaround_i210(struct wm_softc *);
967 static void wm_legacy_irq_quirk_spt(struct wm_softc *);
968
969 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc),
970 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
971
972 /*
973 * Devices supported by this driver.
974 */
975 static const struct wm_product {
976 pci_vendor_id_t wmp_vendor;
977 pci_product_id_t wmp_product;
978 const char *wmp_name;
979 wm_chip_type wmp_type;
980 uint32_t wmp_flags;
981 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN
982 #define WMP_F_FIBER WM_MEDIATYPE_FIBER
983 #define WMP_F_COPPER WM_MEDIATYPE_COPPER
984 #define WMP_F_SERDES WM_MEDIATYPE_SERDES
985 #define WMP_MEDIATYPE(x) ((x) & 0x03)
986 } wm_products[] = {
987 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542,
988 "Intel i82542 1000BASE-X Ethernet",
989 WM_T_82542_2_1, WMP_F_FIBER },
990
991 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER,
992 "Intel i82543GC 1000BASE-X Ethernet",
993 WM_T_82543, WMP_F_FIBER },
994
995 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER,
996 "Intel i82543GC 1000BASE-T Ethernet",
997 WM_T_82543, WMP_F_COPPER },
998
999 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER,
1000 "Intel i82544EI 1000BASE-T Ethernet",
1001 WM_T_82544, WMP_F_COPPER },
1002
1003 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER,
1004 "Intel i82544EI 1000BASE-X Ethernet",
1005 WM_T_82544, WMP_F_FIBER },
1006
1007 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER,
1008 "Intel i82544GC 1000BASE-T Ethernet",
1009 WM_T_82544, WMP_F_COPPER },
1010
1011 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM,
1012 "Intel i82544GC (LOM) 1000BASE-T Ethernet",
1013 WM_T_82544, WMP_F_COPPER },
1014
1015 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM,
1016 "Intel i82540EM 1000BASE-T Ethernet",
1017 WM_T_82540, WMP_F_COPPER },
1018
1019 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM,
1020 "Intel i82540EM (LOM) 1000BASE-T Ethernet",
1021 WM_T_82540, WMP_F_COPPER },
1022
1023 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM,
1024 "Intel i82540EP 1000BASE-T Ethernet",
1025 WM_T_82540, WMP_F_COPPER },
1026
1027 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP,
1028 "Intel i82540EP 1000BASE-T Ethernet",
1029 WM_T_82540, WMP_F_COPPER },
1030
1031 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP,
1032 "Intel i82540EP 1000BASE-T Ethernet",
1033 WM_T_82540, WMP_F_COPPER },
1034
1035 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER,
1036 "Intel i82545EM 1000BASE-T Ethernet",
1037 WM_T_82545, WMP_F_COPPER },
1038
1039 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER,
1040 "Intel i82545GM 1000BASE-T Ethernet",
1041 WM_T_82545_3, WMP_F_COPPER },
1042
1043 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER,
1044 "Intel i82545GM 1000BASE-X Ethernet",
1045 WM_T_82545_3, WMP_F_FIBER },
1046
1047 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES,
1048 "Intel i82545GM Gigabit Ethernet (SERDES)",
1049 WM_T_82545_3, WMP_F_SERDES },
1050
1051 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER,
1052 "Intel i82546EB 1000BASE-T Ethernet",
1053 WM_T_82546, WMP_F_COPPER },
1054
1055 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD,
1056 "Intel i82546EB 1000BASE-T Ethernet",
1057 WM_T_82546, WMP_F_COPPER },
1058
1059 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER,
1060 "Intel i82545EM 1000BASE-X Ethernet",
1061 WM_T_82545, WMP_F_FIBER },
1062
1063 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER,
1064 "Intel i82546EB 1000BASE-X Ethernet",
1065 WM_T_82546, WMP_F_FIBER },
1066
1067 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER,
1068 "Intel i82546GB 1000BASE-T Ethernet",
1069 WM_T_82546_3, WMP_F_COPPER },
1070
1071 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER,
1072 "Intel i82546GB 1000BASE-X Ethernet",
1073 WM_T_82546_3, WMP_F_FIBER },
1074
1075 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES,
1076 "Intel i82546GB Gigabit Ethernet (SERDES)",
1077 WM_T_82546_3, WMP_F_SERDES },
1078
1079 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER,
1080 "i82546GB quad-port Gigabit Ethernet",
1081 WM_T_82546_3, WMP_F_COPPER },
1082
1083 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
1084 "i82546GB quad-port Gigabit Ethernet (KSP3)",
1085 WM_T_82546_3, WMP_F_COPPER },
1086
1087 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE,
1088 "Intel PRO/1000MT (82546GB)",
1089 WM_T_82546_3, WMP_F_COPPER },
1090
1091 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI,
1092 "Intel i82541EI 1000BASE-T Ethernet",
1093 WM_T_82541, WMP_F_COPPER },
1094
1095 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM,
1096 "Intel i82541ER (LOM) 1000BASE-T Ethernet",
1097 WM_T_82541, WMP_F_COPPER },
1098
1099 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE,
1100 "Intel i82541EI Mobile 1000BASE-T Ethernet",
1101 WM_T_82541, WMP_F_COPPER },
1102
1103 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER,
1104 "Intel i82541ER 1000BASE-T Ethernet",
1105 WM_T_82541_2, WMP_F_COPPER },
1106
1107 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI,
1108 "Intel i82541GI 1000BASE-T Ethernet",
1109 WM_T_82541_2, WMP_F_COPPER },
1110
1111 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE,
1112 "Intel i82541GI Mobile 1000BASE-T Ethernet",
1113 WM_T_82541_2, WMP_F_COPPER },
1114
1115 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI,
1116 "Intel i82541PI 1000BASE-T Ethernet",
1117 WM_T_82541_2, WMP_F_COPPER },
1118
1119 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI,
1120 "Intel i82547EI 1000BASE-T Ethernet",
1121 WM_T_82547, WMP_F_COPPER },
1122
1123 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE,
1124 "Intel i82547EI Mobile 1000BASE-T Ethernet",
1125 WM_T_82547, WMP_F_COPPER },
1126
1127 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI,
1128 "Intel i82547GI 1000BASE-T Ethernet",
1129 WM_T_82547_2, WMP_F_COPPER },
1130
1131 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER,
1132 "Intel PRO/1000 PT (82571EB)",
1133 WM_T_82571, WMP_F_COPPER },
1134
1135 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER,
1136 "Intel PRO/1000 PF (82571EB)",
1137 WM_T_82571, WMP_F_FIBER },
1138
1139 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES,
1140 "Intel PRO/1000 PB (82571EB)",
1141 WM_T_82571, WMP_F_SERDES },
1142
1143 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER,
1144 "Intel PRO/1000 QT (82571EB)",
1145 WM_T_82571, WMP_F_COPPER },
1146
1147 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER,
1148 "Intel PRO/1000 PT Quad Port Server Adapter",
1149 WM_T_82571, WMP_F_COPPER, },
1150
1151 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER,
1152 "Intel Gigabit PT Quad Port Server ExpressModule",
1153 WM_T_82571, WMP_F_COPPER, },
1154
1155 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES,
1156 "Intel 82571EB Dual Gigabit Ethernet (SERDES)",
1157 WM_T_82571, WMP_F_SERDES, },
1158
1159 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES,
1160 "Intel 82571EB Quad Gigabit Ethernet (SERDES)",
1161 WM_T_82571, WMP_F_SERDES, },
1162
1163 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER,
1164 "Intel 82571EB Quad 1000baseX Ethernet",
1165 WM_T_82571, WMP_F_FIBER, },
1166
1167 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER,
1168 "Intel i82572EI 1000baseT Ethernet",
1169 WM_T_82572, WMP_F_COPPER },
1170
1171 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER,
1172 "Intel i82572EI 1000baseX Ethernet",
1173 WM_T_82572, WMP_F_FIBER },
1174
1175 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES,
1176 "Intel i82572EI Gigabit Ethernet (SERDES)",
1177 WM_T_82572, WMP_F_SERDES },
1178
1179 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI,
1180 "Intel i82572EI 1000baseT Ethernet",
1181 WM_T_82572, WMP_F_COPPER },
1182
1183 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E,
1184 "Intel i82573E",
1185 WM_T_82573, WMP_F_COPPER },
1186
1187 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT,
1188 "Intel i82573E IAMT",
1189 WM_T_82573, WMP_F_COPPER },
1190
1191 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L,
1192 "Intel i82573L Gigabit Ethernet",
1193 WM_T_82573, WMP_F_COPPER },
1194
1195 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L,
1196 "Intel i82574L",
1197 WM_T_82574, WMP_F_COPPER },
1198
1199 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA,
1200 "Intel i82574L",
1201 WM_T_82574, WMP_F_COPPER },
1202
1203 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V,
1204 "Intel i82583V",
1205 WM_T_82583, WMP_F_COPPER },
1206
1207 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT,
1208 "i80003 dual 1000baseT Ethernet",
1209 WM_T_80003, WMP_F_COPPER },
1210
1211 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT,
1212 "i80003 dual 1000baseX Ethernet",
1213 WM_T_80003, WMP_F_COPPER },
1214
1215 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT,
1216 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)",
1217 WM_T_80003, WMP_F_SERDES },
1218
1219 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT,
1220 "Intel i80003 1000baseT Ethernet",
1221 WM_T_80003, WMP_F_COPPER },
1222
1223 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT,
1224 "Intel i80003 Gigabit Ethernet (SERDES)",
1225 WM_T_80003, WMP_F_SERDES },
1226
1227 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT,
1228 "Intel i82801H (M_AMT) LAN Controller",
1229 WM_T_ICH8, WMP_F_COPPER },
1230 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT,
1231 "Intel i82801H (AMT) LAN Controller",
1232 WM_T_ICH8, WMP_F_COPPER },
1233 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN,
1234 "Intel i82801H LAN Controller",
1235 WM_T_ICH8, WMP_F_COPPER },
1236 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN,
1237 "Intel i82801H (IFE) 10/100 LAN Controller",
1238 WM_T_ICH8, WMP_F_COPPER },
1239 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN,
1240 "Intel i82801H (M) LAN Controller",
1241 WM_T_ICH8, WMP_F_COPPER },
1242 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT,
1243 "Intel i82801H IFE (GT) 10/100 LAN Controller",
1244 WM_T_ICH8, WMP_F_COPPER },
1245 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G,
1246 "Intel i82801H IFE (G) 10/100 LAN Controller",
1247 WM_T_ICH8, WMP_F_COPPER },
1248 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3,
1249 "82567V-3 LAN Controller",
1250 WM_T_ICH8, WMP_F_COPPER },
1251 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT,
1252 "82801I (AMT) LAN Controller",
1253 WM_T_ICH9, WMP_F_COPPER },
1254 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE,
1255 "82801I 10/100 LAN Controller",
1256 WM_T_ICH9, WMP_F_COPPER },
1257 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G,
1258 "82801I (G) 10/100 LAN Controller",
1259 WM_T_ICH9, WMP_F_COPPER },
1260 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT,
1261 "82801I (GT) 10/100 LAN Controller",
1262 WM_T_ICH9, WMP_F_COPPER },
1263 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C,
1264 "82801I (C) LAN Controller",
1265 WM_T_ICH9, WMP_F_COPPER },
1266 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M,
1267 "82801I mobile LAN Controller",
1268 WM_T_ICH9, WMP_F_COPPER },
1269 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V,
1270 "82801I mobile (V) LAN Controller",
1271 WM_T_ICH9, WMP_F_COPPER },
1272 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
1273 "82801I mobile (AMT) LAN Controller",
1274 WM_T_ICH9, WMP_F_COPPER },
1275 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM,
1276 "82567LM-4 LAN Controller",
1277 WM_T_ICH9, WMP_F_COPPER },
1278 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM,
1279 "82567LM-2 LAN Controller",
1280 WM_T_ICH10, WMP_F_COPPER },
1281 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF,
1282 "82567LF-2 LAN Controller",
1283 WM_T_ICH10, WMP_F_COPPER },
1284 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM,
1285 "82567LM-3 LAN Controller",
1286 WM_T_ICH10, WMP_F_COPPER },
1287 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF,
1288 "82567LF-3 LAN Controller",
1289 WM_T_ICH10, WMP_F_COPPER },
1290 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V,
1291 "82567V-2 LAN Controller",
1292 WM_T_ICH10, WMP_F_COPPER },
1293 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V,
1294 "82567V-3? LAN Controller",
1295 WM_T_ICH10, WMP_F_COPPER },
1296 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE,
1297 "HANKSVILLE LAN Controller",
1298 WM_T_ICH10, WMP_F_COPPER },
1299 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM,
1300 "PCH LAN (82577LM) Controller",
1301 WM_T_PCH, WMP_F_COPPER },
1302 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC,
1303 "PCH LAN (82577LC) Controller",
1304 WM_T_PCH, WMP_F_COPPER },
1305 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM,
1306 "PCH LAN (82578DM) Controller",
1307 WM_T_PCH, WMP_F_COPPER },
1308 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC,
1309 "PCH LAN (82578DC) Controller",
1310 WM_T_PCH, WMP_F_COPPER },
1311 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM,
1312 "PCH2 LAN (82579LM) Controller",
1313 WM_T_PCH2, WMP_F_COPPER },
1314 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V,
1315 "PCH2 LAN (82579V) Controller",
1316 WM_T_PCH2, WMP_F_COPPER },
1317 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER,
1318 "82575EB dual-1000baseT Ethernet",
1319 WM_T_82575, WMP_F_COPPER },
1320 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
1321 "82575EB dual-1000baseX Ethernet (SERDES)",
1322 WM_T_82575, WMP_F_SERDES },
1323 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
1324 "82575GB quad-1000baseT Ethernet",
1325 WM_T_82575, WMP_F_COPPER },
1326 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
1327 "82575GB quad-1000baseT Ethernet (PM)",
1328 WM_T_82575, WMP_F_COPPER },
1329 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER,
1330 "82576 1000BaseT Ethernet",
1331 WM_T_82576, WMP_F_COPPER },
1332 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER,
1333 "82576 1000BaseX Ethernet",
1334 WM_T_82576, WMP_F_FIBER },
1335
1336 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES,
1337 "82576 gigabit Ethernet (SERDES)",
1338 WM_T_82576, WMP_F_SERDES },
1339
1340 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER,
1341 "82576 quad-1000BaseT Ethernet",
1342 WM_T_82576, WMP_F_COPPER },
1343
1344 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2,
1345 "82576 Gigabit ET2 Quad Port Server Adapter",
1346 WM_T_82576, WMP_F_COPPER },
1347
1348 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS,
1349 "82576 gigabit Ethernet",
1350 WM_T_82576, WMP_F_COPPER },
1351
1352 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES,
1353 "82576 gigabit Ethernet (SERDES)",
1354 WM_T_82576, WMP_F_SERDES },
1355 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD,
1356 "82576 quad-gigabit Ethernet (SERDES)",
1357 WM_T_82576, WMP_F_SERDES },
1358
1359 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER,
1360 "82580 1000BaseT Ethernet",
1361 WM_T_82580, WMP_F_COPPER },
1362 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER,
1363 "82580 1000BaseX Ethernet",
1364 WM_T_82580, WMP_F_FIBER },
1365
1366 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES,
1367 "82580 1000BaseT Ethernet (SERDES)",
1368 WM_T_82580, WMP_F_SERDES },
1369
1370 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII,
1371 "82580 gigabit Ethernet (SGMII)",
1372 WM_T_82580, WMP_F_COPPER },
1373 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL,
1374 "82580 dual-1000BaseT Ethernet",
1375 WM_T_82580, WMP_F_COPPER },
1376
1377 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER,
1378 "82580 quad-1000BaseX Ethernet",
1379 WM_T_82580, WMP_F_FIBER },
1380
1381 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII,
1382 "DH89XXCC Gigabit Ethernet (SGMII)",
1383 WM_T_82580, WMP_F_COPPER },
1384
1385 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES,
1386 "DH89XXCC Gigabit Ethernet (SERDES)",
1387 WM_T_82580, WMP_F_SERDES },
1388
1389 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE,
1390 "DH89XXCC 1000BASE-KX Ethernet",
1391 WM_T_82580, WMP_F_SERDES },
1392
1393 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP,
1394 "DH89XXCC Gigabit Ethernet (SFP)",
1395 WM_T_82580, WMP_F_SERDES },
1396
1397 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER,
1398 "I350 Gigabit Network Connection",
1399 WM_T_I350, WMP_F_COPPER },
1400
1401 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER,
1402 "I350 Gigabit Fiber Network Connection",
1403 WM_T_I350, WMP_F_FIBER },
1404
1405 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES,
1406 "I350 Gigabit Backplane Connection",
1407 WM_T_I350, WMP_F_SERDES },
1408
1409 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4,
1410 "I350 Quad Port Gigabit Ethernet",
1411 WM_T_I350, WMP_F_SERDES },
1412
1413 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII,
1414 "I350 Gigabit Connection",
1415 WM_T_I350, WMP_F_COPPER },
1416
1417 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX,
1418 "I354 Gigabit Ethernet (KX)",
1419 WM_T_I354, WMP_F_SERDES },
1420
1421 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII,
1422 "I354 Gigabit Ethernet (SGMII)",
1423 WM_T_I354, WMP_F_COPPER },
1424
1425 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE,
1426 "I354 Gigabit Ethernet (2.5G)",
1427 WM_T_I354, WMP_F_COPPER },
1428
1429 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1,
1430 "I210-T1 Ethernet Server Adapter",
1431 WM_T_I210, WMP_F_COPPER },
1432
1433 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1,
1434 "I210 Ethernet (Copper OEM)",
1435 WM_T_I210, WMP_F_COPPER },
1436
1437 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT,
1438 "I210 Ethernet (Copper IT)",
1439 WM_T_I210, WMP_F_COPPER },
1440
1441 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF,
1442 "I210 Ethernet (FLASH less)",
1443 WM_T_I210, WMP_F_COPPER },
1444
1445 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER,
1446 "I210 Gigabit Ethernet (Fiber)",
1447 WM_T_I210, WMP_F_FIBER },
1448
1449 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES,
1450 "I210 Gigabit Ethernet (SERDES)",
1451 WM_T_I210, WMP_F_SERDES },
1452
1453 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF,
1454 "I210 Gigabit Ethernet (FLASH less)",
1455 WM_T_I210, WMP_F_SERDES },
1456
1457 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII,
1458 "I210 Gigabit Ethernet (SGMII)",
1459 WM_T_I210, WMP_F_COPPER },
1460
1461 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER,
1462 "I211 Ethernet (COPPER)",
1463 WM_T_I211, WMP_F_COPPER },
1464 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V,
1465 "I217 V Ethernet Connection",
1466 WM_T_PCH_LPT, WMP_F_COPPER },
1467 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM,
1468 "I217 LM Ethernet Connection",
1469 WM_T_PCH_LPT, WMP_F_COPPER },
1470 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V,
1471 "I218 V Ethernet Connection",
1472 WM_T_PCH_LPT, WMP_F_COPPER },
1473 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2,
1474 "I218 V Ethernet Connection",
1475 WM_T_PCH_LPT, WMP_F_COPPER },
1476 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3,
1477 "I218 V Ethernet Connection",
1478 WM_T_PCH_LPT, WMP_F_COPPER },
1479 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM,
1480 "I218 LM Ethernet Connection",
1481 WM_T_PCH_LPT, WMP_F_COPPER },
1482 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2,
1483 "I218 LM Ethernet Connection",
1484 WM_T_PCH_LPT, WMP_F_COPPER },
1485 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3,
1486 "I218 LM Ethernet Connection",
1487 WM_T_PCH_LPT, WMP_F_COPPER },
1488 #if 0
1489 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V,
1490 "I219 V Ethernet Connection",
1491 WM_T_PCH_SPT, WMP_F_COPPER },
1492 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2,
1493 "I219 V Ethernet Connection",
1494 WM_T_PCH_SPT, WMP_F_COPPER },
1495 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4,
1496 "I219 V Ethernet Connection",
1497 WM_T_PCH_SPT, WMP_F_COPPER },
1498 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5,
1499 "I219 V Ethernet Connection",
1500 WM_T_PCH_SPT, WMP_F_COPPER },
1501 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM,
1502 "I219 LM Ethernet Connection",
1503 WM_T_PCH_SPT, WMP_F_COPPER },
1504 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2,
1505 "I219 LM Ethernet Connection",
1506 WM_T_PCH_SPT, WMP_F_COPPER },
1507 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3,
1508 "I219 LM Ethernet Connection",
1509 WM_T_PCH_SPT, WMP_F_COPPER },
1510 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4,
1511 "I219 LM Ethernet Connection",
1512 WM_T_PCH_SPT, WMP_F_COPPER },
1513 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5,
1514 "I219 LM Ethernet Connection",
1515 WM_T_PCH_SPT, WMP_F_COPPER },
1516 #endif
1517 { 0, 0,
1518 NULL,
1519 0, 0 },
1520 };
1521
1522 /*
1523 * Register read/write functions.
1524 * Other than CSR_{READ|WRITE}().
1525 */
1526
1527 #if 0 /* Not currently used */
1528 static inline uint32_t
1529 wm_io_read(struct wm_softc *sc, int reg)
1530 {
1531
1532 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1533 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4));
1534 }
1535 #endif
1536
1537 static inline void
1538 wm_io_write(struct wm_softc *sc, int reg, uint32_t val)
1539 {
1540
1541 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1542 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val);
1543 }
1544
1545 static inline void
1546 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off,
1547 uint32_t data)
1548 {
1549 uint32_t regval;
1550 int i;
1551
1552 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
1553
1554 CSR_WRITE(sc, reg, regval);
1555
1556 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) {
1557 delay(5);
1558 if (CSR_READ(sc, reg) & SCTL_CTL_READY)
1559 break;
1560 }
1561 if (i == SCTL_CTL_POLL_TIMEOUT) {
1562 aprint_error("%s: WARNING:"
1563 " i82575 reg 0x%08x setup did not indicate ready\n",
1564 device_xname(sc->sc_dev), reg);
1565 }
1566 }
1567
1568 static inline void
1569 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v)
1570 {
1571 wa->wa_low = htole32(v & 0xffffffffU);
1572 if (sizeof(bus_addr_t) == 8)
1573 wa->wa_high = htole32((uint64_t) v >> 32);
1574 else
1575 wa->wa_high = 0;
1576 }
1577
1578 /*
1579 * Descriptor sync/init functions.
1580 */
1581 static inline void
1582 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops)
1583 {
1584 struct wm_softc *sc = txq->txq_sc;
1585
1586 /* If it will wrap around, sync to the end of the ring. */
1587 if ((start + num) > WM_NTXDESC(txq)) {
1588 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1589 WM_CDTXOFF(txq, start), txq->txq_descsize *
1590 (WM_NTXDESC(txq) - start), ops);
1591 num -= (WM_NTXDESC(txq) - start);
1592 start = 0;
1593 }
1594
1595 /* Now sync whatever is left. */
1596 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1597 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops);
1598 }
1599
1600 static inline void
1601 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops)
1602 {
1603 struct wm_softc *sc = rxq->rxq_sc;
1604
1605 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap,
1606 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops);
1607 }
1608
1609 static inline void
1610 wm_init_rxdesc(struct wm_rxqueue *rxq, int start)
1611 {
1612 struct wm_softc *sc = rxq->rxq_sc;
1613 struct wm_rxsoft *rxs = &rxq->rxq_soft[start];
1614 struct mbuf *m = rxs->rxs_mbuf;
1615
1616 /*
1617 * Note: We scoot the packet forward 2 bytes in the buffer
1618 * so that the payload after the Ethernet header is aligned
1619 * to a 4-byte boundary.
1620
1621 * XXX BRAINDAMAGE ALERT!
1622 * The stupid chip uses the same size for every buffer, which
1623 * is set in the Receive Control register. We are using the 2K
1624 * size option, but what we REALLY want is (2K - 2)! For this
1625 * reason, we can't "scoot" packets longer than the standard
1626 * Ethernet MTU. On strict-alignment platforms, if the total
1627 * size exceeds (2K - 2) we set align_tweak to 0 and let
1628 * the upper layer copy the headers.
1629 */
1630 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak;
1631
1632 if (sc->sc_type == WM_T_82574) {
1633 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start];
1634 rxd->erx_data.erxd_addr =
1635 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1636 rxd->erx_data.erxd_dd = 0;
1637 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
1638 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start];
1639
1640 rxd->nqrx_data.nrxd_paddr =
1641 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1642 /* Currently, split header is not supported. */
1643 rxd->nqrx_data.nrxd_haddr = 0;
1644 } else {
1645 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start];
1646
1647 wm_set_dma_addr(&rxd->wrx_addr,
1648 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1649 rxd->wrx_len = 0;
1650 rxd->wrx_cksum = 0;
1651 rxd->wrx_status = 0;
1652 rxd->wrx_errors = 0;
1653 rxd->wrx_special = 0;
1654 }
1655 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1656
1657 CSR_WRITE(sc, rxq->rxq_rdt_reg, start);
1658 }
1659
1660 /*
1661 * Device driver interface functions and commonly used functions.
1662 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
1663 */
1664
1665 /* Lookup supported device table */
1666 static const struct wm_product *
1667 wm_lookup(const struct pci_attach_args *pa)
1668 {
1669 const struct wm_product *wmp;
1670
1671 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
1672 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
1673 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
1674 return wmp;
1675 }
1676 return NULL;
1677 }
1678
1679 /* The match function (ca_match) */
1680 static int
1681 wm_match(device_t parent, cfdata_t cf, void *aux)
1682 {
1683 struct pci_attach_args *pa = aux;
1684
1685 if (wm_lookup(pa) != NULL)
1686 return 1;
1687
1688 return 0;
1689 }
1690
1691 /* The attach function (ca_attach) */
1692 static void
1693 wm_attach(device_t parent, device_t self, void *aux)
1694 {
1695 struct wm_softc *sc = device_private(self);
1696 struct pci_attach_args *pa = aux;
1697 prop_dictionary_t dict;
1698 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1699 pci_chipset_tag_t pc = pa->pa_pc;
1700 int counts[PCI_INTR_TYPE_SIZE];
1701 pci_intr_type_t max_type;
1702 const char *eetype, *xname;
1703 bus_space_tag_t memt;
1704 bus_space_handle_t memh;
1705 bus_size_t memsize;
1706 int memh_valid;
1707 int i, error;
1708 const struct wm_product *wmp;
1709 prop_data_t ea;
1710 prop_number_t pn;
1711 uint8_t enaddr[ETHER_ADDR_LEN];
1712 char buf[256];
1713 uint16_t cfg1, cfg2, swdpin, nvmword;
1714 pcireg_t preg, memtype;
1715 uint16_t eeprom_data, apme_mask;
1716 bool force_clear_smbi;
1717 uint32_t link_mode;
1718 uint32_t reg;
1719
1720 sc->sc_dev = self;
1721 callout_init(&sc->sc_tick_ch, CALLOUT_FLAGS);
1722 sc->sc_core_stopping = false;
1723
1724 wmp = wm_lookup(pa);
1725 #ifdef DIAGNOSTIC
1726 if (wmp == NULL) {
1727 printf("\n");
1728 panic("wm_attach: impossible");
1729 }
1730 #endif
1731 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags);
1732
1733 sc->sc_pc = pa->pa_pc;
1734 sc->sc_pcitag = pa->pa_tag;
1735
1736 if (pci_dma64_available(pa))
1737 sc->sc_dmat = pa->pa_dmat64;
1738 else
1739 sc->sc_dmat = pa->pa_dmat;
1740
1741 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id);
1742 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG));
1743 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1);
1744
1745 sc->sc_type = wmp->wmp_type;
1746
1747 /* Set default function pointers */
1748 sc->phy.acquire = sc->nvm.acquire = wm_get_null;
1749 sc->phy.release = sc->nvm.release = wm_put_null;
1750 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000;
1751
1752 if (sc->sc_type < WM_T_82543) {
1753 if (sc->sc_rev < 2) {
1754 aprint_error_dev(sc->sc_dev,
1755 "i82542 must be at least rev. 2\n");
1756 return;
1757 }
1758 if (sc->sc_rev < 3)
1759 sc->sc_type = WM_T_82542_2_0;
1760 }
1761
1762 /*
1763 * Disable MSI for Errata:
1764 * "Message Signaled Interrupt Feature May Corrupt Write Transactions"
1765 *
1766 * 82544: Errata 25
1767 * 82540: Errata 6 (easy to reproduce device timeout)
1768 * 82545: Errata 4 (easy to reproduce device timeout)
1769 * 82546: Errata 26 (easy to reproduce device timeout)
1770 * 82541: Errata 7 (easy to reproduce device timeout)
1771 *
1772 * "Byte Enables 2 and 3 are not set on MSI writes"
1773 *
1774 * 82571 & 82572: Errata 63
1775 */
1776 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571)
1777 || (sc->sc_type == WM_T_82572))
1778 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY;
1779
1780 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1781 || (sc->sc_type == WM_T_82580)
1782 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
1783 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
1784 sc->sc_flags |= WM_F_NEWQUEUE;
1785
1786 /* Set device properties (mactype) */
1787 dict = device_properties(sc->sc_dev);
1788 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type);
1789
1790 /*
1791 * Map the device. All devices support memory-mapped acccess,
1792 * and it is really required for normal operation.
1793 */
1794 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
1795 switch (memtype) {
1796 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1797 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1798 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
1799 memtype, 0, &memt, &memh, NULL, &memsize) == 0);
1800 break;
1801 default:
1802 memh_valid = 0;
1803 break;
1804 }
1805
1806 if (memh_valid) {
1807 sc->sc_st = memt;
1808 sc->sc_sh = memh;
1809 sc->sc_ss = memsize;
1810 } else {
1811 aprint_error_dev(sc->sc_dev,
1812 "unable to map device registers\n");
1813 return;
1814 }
1815
1816 /*
1817 * In addition, i82544 and later support I/O mapped indirect
1818 * register access. It is not desirable (nor supported in
1819 * this driver) to use it for normal operation, though it is
1820 * required to work around bugs in some chip versions.
1821 */
1822 if (sc->sc_type >= WM_T_82544) {
1823 /* First we have to find the I/O BAR. */
1824 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) {
1825 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
1826 if (memtype == PCI_MAPREG_TYPE_IO)
1827 break;
1828 if (PCI_MAPREG_MEM_TYPE(memtype) ==
1829 PCI_MAPREG_MEM_TYPE_64BIT)
1830 i += 4; /* skip high bits, too */
1831 }
1832 if (i < PCI_MAPREG_END) {
1833 /*
1834 * We found PCI_MAPREG_TYPE_IO. Note that 82580
1835 * (and newer?) chip has no PCI_MAPREG_TYPE_IO.
1836 * It's no problem because newer chips has no this
1837 * bug.
1838 *
1839 * The i8254x doesn't apparently respond when the
1840 * I/O BAR is 0, which looks somewhat like it's not
1841 * been configured.
1842 */
1843 preg = pci_conf_read(pc, pa->pa_tag, i);
1844 if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
1845 aprint_error_dev(sc->sc_dev,
1846 "WARNING: I/O BAR at zero.\n");
1847 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
1848 0, &sc->sc_iot, &sc->sc_ioh,
1849 NULL, &sc->sc_ios) == 0) {
1850 sc->sc_flags |= WM_F_IOH_VALID;
1851 } else {
1852 aprint_error_dev(sc->sc_dev,
1853 "WARNING: unable to map I/O space\n");
1854 }
1855 }
1856
1857 }
1858
1859 /* Enable bus mastering. Disable MWI on the i82542 2.0. */
1860 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
1861 preg |= PCI_COMMAND_MASTER_ENABLE;
1862 if (sc->sc_type < WM_T_82542_2_1)
1863 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
1864 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
1865
1866 /* power up chip */
1867 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self,
1868 NULL)) && error != EOPNOTSUPP) {
1869 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error);
1870 return;
1871 }
1872
1873 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag));
1874 /*
1875 * Don't use MSI-X if we can use only one queue to save interrupt
1876 * resource.
1877 */
1878 if (sc->sc_nqueues > 1) {
1879 max_type = PCI_INTR_TYPE_MSIX;
1880 /*
1881 * 82583 has a MSI-X capability in the PCI configuration space
1882 * but it doesn't support it. At least the document doesn't
1883 * say anything about MSI-X.
1884 */
1885 counts[PCI_INTR_TYPE_MSIX]
1886 = (sc->sc_type == WM_T_82583) ? 0 : sc->sc_nqueues + 1;
1887 } else {
1888 max_type = PCI_INTR_TYPE_MSI;
1889 counts[PCI_INTR_TYPE_MSIX] = 0;
1890 }
1891
1892 /* Allocation settings */
1893 counts[PCI_INTR_TYPE_MSI] = 1;
1894 counts[PCI_INTR_TYPE_INTX] = 1;
1895 /* overridden by disable flags */
1896 if (wm_disable_msi != 0) {
1897 counts[PCI_INTR_TYPE_MSI] = 0;
1898 if (wm_disable_msix != 0) {
1899 max_type = PCI_INTR_TYPE_INTX;
1900 counts[PCI_INTR_TYPE_MSIX] = 0;
1901 }
1902 } else if (wm_disable_msix != 0) {
1903 max_type = PCI_INTR_TYPE_MSI;
1904 counts[PCI_INTR_TYPE_MSIX] = 0;
1905 }
1906
1907 alloc_retry:
1908 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) {
1909 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n");
1910 return;
1911 }
1912
1913 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) {
1914 error = wm_setup_msix(sc);
1915 if (error) {
1916 pci_intr_release(pc, sc->sc_intrs,
1917 counts[PCI_INTR_TYPE_MSIX]);
1918
1919 /* Setup for MSI: Disable MSI-X */
1920 max_type = PCI_INTR_TYPE_MSI;
1921 counts[PCI_INTR_TYPE_MSI] = 1;
1922 counts[PCI_INTR_TYPE_INTX] = 1;
1923 goto alloc_retry;
1924 }
1925 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) {
1926 wm_adjust_qnum(sc, 0); /* must not use multiqueue */
1927 error = wm_setup_legacy(sc);
1928 if (error) {
1929 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1930 counts[PCI_INTR_TYPE_MSI]);
1931
1932 /* The next try is for INTx: Disable MSI */
1933 max_type = PCI_INTR_TYPE_INTX;
1934 counts[PCI_INTR_TYPE_INTX] = 1;
1935 goto alloc_retry;
1936 }
1937 } else {
1938 wm_adjust_qnum(sc, 0); /* must not use multiqueue */
1939 error = wm_setup_legacy(sc);
1940 if (error) {
1941 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1942 counts[PCI_INTR_TYPE_INTX]);
1943 return;
1944 }
1945 }
1946
1947 /*
1948 * Check the function ID (unit number of the chip).
1949 */
1950 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3)
1951 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003)
1952 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1953 || (sc->sc_type == WM_T_82580)
1954 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
1955 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS)
1956 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK;
1957 else
1958 sc->sc_funcid = 0;
1959
1960 /*
1961 * Determine a few things about the bus we're connected to.
1962 */
1963 if (sc->sc_type < WM_T_82543) {
1964 /* We don't really know the bus characteristics here. */
1965 sc->sc_bus_speed = 33;
1966 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) {
1967 /*
1968 * CSA (Communication Streaming Architecture) is about as fast
1969 * a 32-bit 66MHz PCI Bus.
1970 */
1971 sc->sc_flags |= WM_F_CSA;
1972 sc->sc_bus_speed = 66;
1973 aprint_verbose_dev(sc->sc_dev,
1974 "Communication Streaming Architecture\n");
1975 if (sc->sc_type == WM_T_82547) {
1976 callout_init(&sc->sc_txfifo_ch, CALLOUT_FLAGS);
1977 callout_setfunc(&sc->sc_txfifo_ch,
1978 wm_82547_txfifo_stall, sc);
1979 aprint_verbose_dev(sc->sc_dev,
1980 "using 82547 Tx FIFO stall work-around\n");
1981 }
1982 } else if (sc->sc_type >= WM_T_82571) {
1983 sc->sc_flags |= WM_F_PCIE;
1984 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
1985 && (sc->sc_type != WM_T_ICH10)
1986 && (sc->sc_type != WM_T_PCH)
1987 && (sc->sc_type != WM_T_PCH2)
1988 && (sc->sc_type != WM_T_PCH_LPT)
1989 && (sc->sc_type != WM_T_PCH_SPT)) {
1990 /* ICH* and PCH* have no PCIe capability registers */
1991 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
1992 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff,
1993 NULL) == 0)
1994 aprint_error_dev(sc->sc_dev,
1995 "unable to find PCIe capability\n");
1996 }
1997 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n");
1998 } else {
1999 reg = CSR_READ(sc, WMREG_STATUS);
2000 if (reg & STATUS_BUS64)
2001 sc->sc_flags |= WM_F_BUS64;
2002 if ((reg & STATUS_PCIX_MODE) != 0) {
2003 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb;
2004
2005 sc->sc_flags |= WM_F_PCIX;
2006 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2007 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0)
2008 aprint_error_dev(sc->sc_dev,
2009 "unable to find PCIX capability\n");
2010 else if (sc->sc_type != WM_T_82545_3 &&
2011 sc->sc_type != WM_T_82546_3) {
2012 /*
2013 * Work around a problem caused by the BIOS
2014 * setting the max memory read byte count
2015 * incorrectly.
2016 */
2017 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag,
2018 sc->sc_pcixe_capoff + PCIX_CMD);
2019 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag,
2020 sc->sc_pcixe_capoff + PCIX_STATUS);
2021
2022 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >>
2023 PCIX_CMD_BYTECNT_SHIFT;
2024 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >>
2025 PCIX_STATUS_MAXB_SHIFT;
2026 if (bytecnt > maxb) {
2027 aprint_verbose_dev(sc->sc_dev,
2028 "resetting PCI-X MMRBC: %d -> %d\n",
2029 512 << bytecnt, 512 << maxb);
2030 pcix_cmd = (pcix_cmd &
2031 ~PCIX_CMD_BYTECNT_MASK) |
2032 (maxb << PCIX_CMD_BYTECNT_SHIFT);
2033 pci_conf_write(pa->pa_pc, pa->pa_tag,
2034 sc->sc_pcixe_capoff + PCIX_CMD,
2035 pcix_cmd);
2036 }
2037 }
2038 }
2039 /*
2040 * The quad port adapter is special; it has a PCIX-PCIX
2041 * bridge on the board, and can run the secondary bus at
2042 * a higher speed.
2043 */
2044 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) {
2045 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120
2046 : 66;
2047 } else if (sc->sc_flags & WM_F_PCIX) {
2048 switch (reg & STATUS_PCIXSPD_MASK) {
2049 case STATUS_PCIXSPD_50_66:
2050 sc->sc_bus_speed = 66;
2051 break;
2052 case STATUS_PCIXSPD_66_100:
2053 sc->sc_bus_speed = 100;
2054 break;
2055 case STATUS_PCIXSPD_100_133:
2056 sc->sc_bus_speed = 133;
2057 break;
2058 default:
2059 aprint_error_dev(sc->sc_dev,
2060 "unknown PCIXSPD %d; assuming 66MHz\n",
2061 reg & STATUS_PCIXSPD_MASK);
2062 sc->sc_bus_speed = 66;
2063 break;
2064 }
2065 } else
2066 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33;
2067 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n",
2068 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
2069 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI");
2070 }
2071
2072 /* Disable ASPM L0s and/or L1 for workaround */
2073 wm_disable_aspm(sc);
2074
2075 /* clear interesting stat counters */
2076 CSR_READ(sc, WMREG_COLC);
2077 CSR_READ(sc, WMREG_RXERRC);
2078
2079 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)
2080 || (sc->sc_type >= WM_T_ICH8))
2081 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2082 if (sc->sc_type >= WM_T_ICH8)
2083 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2084
2085 /* Set PHY, NVM mutex related stuff */
2086 switch (sc->sc_type) {
2087 case WM_T_82542_2_0:
2088 case WM_T_82542_2_1:
2089 case WM_T_82543:
2090 case WM_T_82544:
2091 /* Microwire */
2092 sc->nvm.read = wm_nvm_read_uwire;
2093 sc->sc_nvm_wordsize = 64;
2094 sc->sc_nvm_addrbits = 6;
2095 break;
2096 case WM_T_82540:
2097 case WM_T_82545:
2098 case WM_T_82545_3:
2099 case WM_T_82546:
2100 case WM_T_82546_3:
2101 /* Microwire */
2102 sc->nvm.read = wm_nvm_read_uwire;
2103 reg = CSR_READ(sc, WMREG_EECD);
2104 if (reg & EECD_EE_SIZE) {
2105 sc->sc_nvm_wordsize = 256;
2106 sc->sc_nvm_addrbits = 8;
2107 } else {
2108 sc->sc_nvm_wordsize = 64;
2109 sc->sc_nvm_addrbits = 6;
2110 }
2111 sc->sc_flags |= WM_F_LOCK_EECD;
2112 sc->nvm.acquire = wm_get_eecd;
2113 sc->nvm.release = wm_put_eecd;
2114 break;
2115 case WM_T_82541:
2116 case WM_T_82541_2:
2117 case WM_T_82547:
2118 case WM_T_82547_2:
2119 reg = CSR_READ(sc, WMREG_EECD);
2120 /*
2121 * wm_nvm_set_addrbits_size_eecd() accesses SPI in it only
2122 * on 8254[17], so set flags and functios before calling it.
2123 */
2124 sc->sc_flags |= WM_F_LOCK_EECD;
2125 sc->nvm.acquire = wm_get_eecd;
2126 sc->nvm.release = wm_put_eecd;
2127 if (reg & EECD_EE_TYPE) {
2128 /* SPI */
2129 sc->nvm.read = wm_nvm_read_spi;
2130 sc->sc_flags |= WM_F_EEPROM_SPI;
2131 wm_nvm_set_addrbits_size_eecd(sc);
2132 } else {
2133 /* Microwire */
2134 sc->nvm.read = wm_nvm_read_uwire;
2135 if ((reg & EECD_EE_ABITS) != 0) {
2136 sc->sc_nvm_wordsize = 256;
2137 sc->sc_nvm_addrbits = 8;
2138 } else {
2139 sc->sc_nvm_wordsize = 64;
2140 sc->sc_nvm_addrbits = 6;
2141 }
2142 }
2143 break;
2144 case WM_T_82571:
2145 case WM_T_82572:
2146 /* SPI */
2147 sc->nvm.read = wm_nvm_read_eerd;
2148 /* Not use WM_F_LOCK_EECD because we use EERD */
2149 sc->sc_flags |= WM_F_EEPROM_SPI;
2150 wm_nvm_set_addrbits_size_eecd(sc);
2151 sc->phy.acquire = wm_get_swsm_semaphore;
2152 sc->phy.release = wm_put_swsm_semaphore;
2153 sc->nvm.acquire = wm_get_nvm_82571;
2154 sc->nvm.release = wm_put_nvm_82571;
2155 break;
2156 case WM_T_82573:
2157 case WM_T_82574:
2158 case WM_T_82583:
2159 sc->nvm.read = wm_nvm_read_eerd;
2160 /* Not use WM_F_LOCK_EECD because we use EERD */
2161 if (sc->sc_type == WM_T_82573) {
2162 sc->phy.acquire = wm_get_swsm_semaphore;
2163 sc->phy.release = wm_put_swsm_semaphore;
2164 sc->nvm.acquire = wm_get_nvm_82571;
2165 sc->nvm.release = wm_put_nvm_82571;
2166 } else {
2167 /* Both PHY and NVM use the same semaphore. */
2168 sc->phy.acquire = sc->nvm.acquire
2169 = wm_get_swfwhw_semaphore;
2170 sc->phy.release = sc->nvm.release
2171 = wm_put_swfwhw_semaphore;
2172 }
2173 if (wm_nvm_is_onboard_eeprom(sc) == 0) {
2174 sc->sc_flags |= WM_F_EEPROM_FLASH;
2175 sc->sc_nvm_wordsize = 2048;
2176 } else {
2177 /* SPI */
2178 sc->sc_flags |= WM_F_EEPROM_SPI;
2179 wm_nvm_set_addrbits_size_eecd(sc);
2180 }
2181 break;
2182 case WM_T_82575:
2183 case WM_T_82576:
2184 case WM_T_82580:
2185 case WM_T_I350:
2186 case WM_T_I354:
2187 case WM_T_80003:
2188 /* SPI */
2189 sc->sc_flags |= WM_F_EEPROM_SPI;
2190 wm_nvm_set_addrbits_size_eecd(sc);
2191 if((sc->sc_type == WM_T_80003)
2192 || (sc->sc_nvm_wordsize < (1 << 15))) {
2193 sc->nvm.read = wm_nvm_read_eerd;
2194 /* Don't use WM_F_LOCK_EECD because we use EERD */
2195 } else {
2196 sc->nvm.read = wm_nvm_read_spi;
2197 sc->sc_flags |= WM_F_LOCK_EECD;
2198 }
2199 sc->phy.acquire = wm_get_phy_82575;
2200 sc->phy.release = wm_put_phy_82575;
2201 sc->nvm.acquire = wm_get_nvm_80003;
2202 sc->nvm.release = wm_put_nvm_80003;
2203 break;
2204 case WM_T_ICH8:
2205 case WM_T_ICH9:
2206 case WM_T_ICH10:
2207 case WM_T_PCH:
2208 case WM_T_PCH2:
2209 case WM_T_PCH_LPT:
2210 sc->nvm.read = wm_nvm_read_ich8;
2211 /* FLASH */
2212 sc->sc_flags |= WM_F_EEPROM_FLASH;
2213 sc->sc_nvm_wordsize = 2048;
2214 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH);
2215 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0,
2216 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) {
2217 aprint_error_dev(sc->sc_dev,
2218 "can't map FLASH registers\n");
2219 goto out;
2220 }
2221 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG);
2222 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) *
2223 ICH_FLASH_SECTOR_SIZE;
2224 sc->sc_ich8_flash_bank_size =
2225 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1;
2226 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK);
2227 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
2228 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t);
2229 sc->sc_flashreg_offset = 0;
2230 sc->phy.acquire = wm_get_swflag_ich8lan;
2231 sc->phy.release = wm_put_swflag_ich8lan;
2232 sc->nvm.acquire = wm_get_nvm_ich8lan;
2233 sc->nvm.release = wm_put_nvm_ich8lan;
2234 break;
2235 case WM_T_PCH_SPT:
2236 sc->nvm.read = wm_nvm_read_spt;
2237 /* SPT has no GFPREG; flash registers mapped through BAR0 */
2238 sc->sc_flags |= WM_F_EEPROM_FLASH;
2239 sc->sc_flasht = sc->sc_st;
2240 sc->sc_flashh = sc->sc_sh;
2241 sc->sc_ich8_flash_base = 0;
2242 sc->sc_nvm_wordsize =
2243 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1)
2244 * NVM_SIZE_MULTIPLIER;
2245 /* It is size in bytes, we want words */
2246 sc->sc_nvm_wordsize /= 2;
2247 /* assume 2 banks */
2248 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2;
2249 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET;
2250 sc->phy.acquire = wm_get_swflag_ich8lan;
2251 sc->phy.release = wm_put_swflag_ich8lan;
2252 sc->nvm.acquire = wm_get_nvm_ich8lan;
2253 sc->nvm.release = wm_put_nvm_ich8lan;
2254 break;
2255 case WM_T_I210:
2256 case WM_T_I211:
2257 /* Allow a single clear of the SW semaphore on I210 and newer*/
2258 sc->sc_flags |= WM_F_WA_I210_CLSEM;
2259 if (wm_nvm_flash_presence_i210(sc)) {
2260 sc->nvm.read = wm_nvm_read_eerd;
2261 /* Don't use WM_F_LOCK_EECD because we use EERD */
2262 sc->sc_flags |= WM_F_EEPROM_FLASH_HW;
2263 wm_nvm_set_addrbits_size_eecd(sc);
2264 } else {
2265 sc->nvm.read = wm_nvm_read_invm;
2266 sc->sc_flags |= WM_F_EEPROM_INVM;
2267 sc->sc_nvm_wordsize = INVM_SIZE;
2268 }
2269 sc->phy.acquire = wm_get_phy_82575;
2270 sc->phy.release = wm_put_phy_82575;
2271 sc->nvm.acquire = wm_get_nvm_80003;
2272 sc->nvm.release = wm_put_nvm_80003;
2273 break;
2274 default:
2275 break;
2276 }
2277
2278 /* Ensure the SMBI bit is clear before first NVM or PHY access */
2279 switch (sc->sc_type) {
2280 case WM_T_82571:
2281 case WM_T_82572:
2282 reg = CSR_READ(sc, WMREG_SWSM2);
2283 if ((reg & SWSM2_LOCK) == 0) {
2284 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK);
2285 force_clear_smbi = true;
2286 } else
2287 force_clear_smbi = false;
2288 break;
2289 case WM_T_82573:
2290 case WM_T_82574:
2291 case WM_T_82583:
2292 force_clear_smbi = true;
2293 break;
2294 default:
2295 force_clear_smbi = false;
2296 break;
2297 }
2298 if (force_clear_smbi) {
2299 reg = CSR_READ(sc, WMREG_SWSM);
2300 if ((reg & SWSM_SMBI) != 0)
2301 aprint_error_dev(sc->sc_dev,
2302 "Please update the Bootagent\n");
2303 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI);
2304 }
2305
2306 /*
2307 * Defer printing the EEPROM type until after verifying the checksum
2308 * This allows the EEPROM type to be printed correctly in the case
2309 * that no EEPROM is attached.
2310 */
2311 /*
2312 * Validate the EEPROM checksum. If the checksum fails, flag
2313 * this for later, so we can fail future reads from the EEPROM.
2314 */
2315 if (wm_nvm_validate_checksum(sc)) {
2316 /*
2317 * Read twice again because some PCI-e parts fail the
2318 * first check due to the link being in sleep state.
2319 */
2320 if (wm_nvm_validate_checksum(sc))
2321 sc->sc_flags |= WM_F_EEPROM_INVALID;
2322 }
2323
2324 if (sc->sc_flags & WM_F_EEPROM_INVALID)
2325 aprint_verbose_dev(sc->sc_dev, "No EEPROM");
2326 else {
2327 aprint_verbose_dev(sc->sc_dev, "%u words ",
2328 sc->sc_nvm_wordsize);
2329 if (sc->sc_flags & WM_F_EEPROM_INVM)
2330 aprint_verbose("iNVM");
2331 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW)
2332 aprint_verbose("FLASH(HW)");
2333 else if (sc->sc_flags & WM_F_EEPROM_FLASH)
2334 aprint_verbose("FLASH");
2335 else {
2336 if (sc->sc_flags & WM_F_EEPROM_SPI)
2337 eetype = "SPI";
2338 else
2339 eetype = "MicroWire";
2340 aprint_verbose("(%d address bits) %s EEPROM",
2341 sc->sc_nvm_addrbits, eetype);
2342 }
2343 }
2344 wm_nvm_version(sc);
2345 aprint_verbose("\n");
2346
2347 /*
2348 * XXX The first call of wm_gmii_setup_phytype. The result might be
2349 * incorrect.
2350 */
2351 wm_gmii_setup_phytype(sc, 0, 0);
2352
2353 /* Reset the chip to a known state. */
2354 wm_reset(sc);
2355
2356 /*
2357 * Check for I21[01] PLL workaround.
2358 *
2359 * Three cases:
2360 * a) Chip is I211.
2361 * b) Chip is I210 and it uses INVM (not FLASH).
2362 * c) Chip is I210 (and it uses FLASH) and the NVM image version < 3.25
2363 */
2364 if (sc->sc_type == WM_T_I211)
2365 sc->sc_flags |= WM_F_PLL_WA_I210;
2366 if (sc->sc_type == WM_T_I210) {
2367 if (!wm_nvm_flash_presence_i210(sc))
2368 sc->sc_flags |= WM_F_PLL_WA_I210;
2369 else if ((sc->sc_nvm_ver_major < 3)
2370 || ((sc->sc_nvm_ver_major == 3)
2371 && (sc->sc_nvm_ver_minor < 25))) {
2372 aprint_verbose_dev(sc->sc_dev,
2373 "ROM image version %d.%d is older than 3.25\n",
2374 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor);
2375 sc->sc_flags |= WM_F_PLL_WA_I210;
2376 }
2377 }
2378 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
2379 wm_pll_workaround_i210(sc);
2380
2381 wm_get_wakeup(sc);
2382
2383 /* Non-AMT based hardware can now take control from firmware */
2384 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
2385 wm_get_hw_control(sc);
2386
2387 /*
2388 * Read the Ethernet address from the EEPROM, if not first found
2389 * in device properties.
2390 */
2391 ea = prop_dictionary_get(dict, "mac-address");
2392 if (ea != NULL) {
2393 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA);
2394 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN);
2395 memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN);
2396 } else {
2397 if (wm_read_mac_addr(sc, enaddr) != 0) {
2398 aprint_error_dev(sc->sc_dev,
2399 "unable to read Ethernet address\n");
2400 goto out;
2401 }
2402 }
2403
2404 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
2405 ether_sprintf(enaddr));
2406
2407 /*
2408 * Read the config info from the EEPROM, and set up various
2409 * bits in the control registers based on their contents.
2410 */
2411 pn = prop_dictionary_get(dict, "i82543-cfg1");
2412 if (pn != NULL) {
2413 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2414 cfg1 = (uint16_t) prop_number_integer_value(pn);
2415 } else {
2416 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) {
2417 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n");
2418 goto out;
2419 }
2420 }
2421
2422 pn = prop_dictionary_get(dict, "i82543-cfg2");
2423 if (pn != NULL) {
2424 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2425 cfg2 = (uint16_t) prop_number_integer_value(pn);
2426 } else {
2427 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) {
2428 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n");
2429 goto out;
2430 }
2431 }
2432
2433 /* check for WM_F_WOL */
2434 switch (sc->sc_type) {
2435 case WM_T_82542_2_0:
2436 case WM_T_82542_2_1:
2437 case WM_T_82543:
2438 /* dummy? */
2439 eeprom_data = 0;
2440 apme_mask = NVM_CFG3_APME;
2441 break;
2442 case WM_T_82544:
2443 apme_mask = NVM_CFG2_82544_APM_EN;
2444 eeprom_data = cfg2;
2445 break;
2446 case WM_T_82546:
2447 case WM_T_82546_3:
2448 case WM_T_82571:
2449 case WM_T_82572:
2450 case WM_T_82573:
2451 case WM_T_82574:
2452 case WM_T_82583:
2453 case WM_T_80003:
2454 default:
2455 apme_mask = NVM_CFG3_APME;
2456 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB
2457 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2458 break;
2459 case WM_T_82575:
2460 case WM_T_82576:
2461 case WM_T_82580:
2462 case WM_T_I350:
2463 case WM_T_I354: /* XXX ok? */
2464 case WM_T_ICH8:
2465 case WM_T_ICH9:
2466 case WM_T_ICH10:
2467 case WM_T_PCH:
2468 case WM_T_PCH2:
2469 case WM_T_PCH_LPT:
2470 case WM_T_PCH_SPT:
2471 /* XXX The funcid should be checked on some devices */
2472 apme_mask = WUC_APME;
2473 eeprom_data = CSR_READ(sc, WMREG_WUC);
2474 break;
2475 }
2476
2477 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */
2478 if ((eeprom_data & apme_mask) != 0)
2479 sc->sc_flags |= WM_F_WOL;
2480
2481 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) {
2482 /* Check NVM for autonegotiation */
2483 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) {
2484 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) != 0)
2485 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO;
2486 }
2487 }
2488
2489 /*
2490 * XXX need special handling for some multiple port cards
2491 * to disable a paticular port.
2492 */
2493
2494 if (sc->sc_type >= WM_T_82544) {
2495 pn = prop_dictionary_get(dict, "i82543-swdpin");
2496 if (pn != NULL) {
2497 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2498 swdpin = (uint16_t) prop_number_integer_value(pn);
2499 } else {
2500 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) {
2501 aprint_error_dev(sc->sc_dev,
2502 "unable to read SWDPIN\n");
2503 goto out;
2504 }
2505 }
2506 }
2507
2508 if (cfg1 & NVM_CFG1_ILOS)
2509 sc->sc_ctrl |= CTRL_ILOS;
2510
2511 /*
2512 * XXX
2513 * This code isn't correct because pin 2 and 3 are located
2514 * in different position on newer chips. Check all datasheet.
2515 *
2516 * Until resolve this problem, check if a chip < 82580
2517 */
2518 if (sc->sc_type <= WM_T_82580) {
2519 if (sc->sc_type >= WM_T_82544) {
2520 sc->sc_ctrl |=
2521 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
2522 CTRL_SWDPIO_SHIFT;
2523 sc->sc_ctrl |=
2524 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
2525 CTRL_SWDPINS_SHIFT;
2526 } else {
2527 sc->sc_ctrl |=
2528 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) <<
2529 CTRL_SWDPIO_SHIFT;
2530 }
2531 }
2532
2533 /* XXX For other than 82580? */
2534 if (sc->sc_type == WM_T_82580) {
2535 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &nvmword);
2536 if (nvmword & __BIT(13))
2537 sc->sc_ctrl |= CTRL_ILOS;
2538 }
2539
2540 #if 0
2541 if (sc->sc_type >= WM_T_82544) {
2542 if (cfg1 & NVM_CFG1_IPS0)
2543 sc->sc_ctrl_ext |= CTRL_EXT_IPS;
2544 if (cfg1 & NVM_CFG1_IPS1)
2545 sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
2546 sc->sc_ctrl_ext |=
2547 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
2548 CTRL_EXT_SWDPIO_SHIFT;
2549 sc->sc_ctrl_ext |=
2550 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
2551 CTRL_EXT_SWDPINS_SHIFT;
2552 } else {
2553 sc->sc_ctrl_ext |=
2554 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) <<
2555 CTRL_EXT_SWDPIO_SHIFT;
2556 }
2557 #endif
2558
2559 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2560 #if 0
2561 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
2562 #endif
2563
2564 if (sc->sc_type == WM_T_PCH) {
2565 uint16_t val;
2566
2567 /* Save the NVM K1 bit setting */
2568 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val);
2569
2570 if ((val & NVM_K1_CONFIG_ENABLE) != 0)
2571 sc->sc_nvm_k1_enabled = 1;
2572 else
2573 sc->sc_nvm_k1_enabled = 0;
2574 }
2575
2576 /* Determine if we're GMII, TBI, SERDES or SGMII mode */
2577 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9
2578 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH
2579 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT
2580 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_82573
2581 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) {
2582 /* Copper only */
2583 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2584 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350)
2585 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210)
2586 || (sc->sc_type ==WM_T_I211)) {
2587 reg = CSR_READ(sc, WMREG_CTRL_EXT);
2588 link_mode = reg & CTRL_EXT_LINK_MODE_MASK;
2589 switch (link_mode) {
2590 case CTRL_EXT_LINK_MODE_1000KX:
2591 aprint_verbose_dev(sc->sc_dev, "1000KX\n");
2592 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2593 break;
2594 case CTRL_EXT_LINK_MODE_SGMII:
2595 if (wm_sgmii_uses_mdio(sc)) {
2596 aprint_verbose_dev(sc->sc_dev,
2597 "SGMII(MDIO)\n");
2598 sc->sc_flags |= WM_F_SGMII;
2599 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2600 break;
2601 }
2602 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n");
2603 /*FALLTHROUGH*/
2604 case CTRL_EXT_LINK_MODE_PCIE_SERDES:
2605 sc->sc_mediatype = wm_sfp_get_media_type(sc);
2606 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) {
2607 if (link_mode
2608 == CTRL_EXT_LINK_MODE_SGMII) {
2609 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2610 sc->sc_flags |= WM_F_SGMII;
2611 } else {
2612 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2613 aprint_verbose_dev(sc->sc_dev,
2614 "SERDES\n");
2615 }
2616 break;
2617 }
2618 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
2619 aprint_verbose_dev(sc->sc_dev, "SERDES\n");
2620
2621 /* Change current link mode setting */
2622 reg &= ~CTRL_EXT_LINK_MODE_MASK;
2623 switch (sc->sc_mediatype) {
2624 case WM_MEDIATYPE_COPPER:
2625 reg |= CTRL_EXT_LINK_MODE_SGMII;
2626 break;
2627 case WM_MEDIATYPE_SERDES:
2628 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES;
2629 break;
2630 default:
2631 break;
2632 }
2633 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2634 break;
2635 case CTRL_EXT_LINK_MODE_GMII:
2636 default:
2637 aprint_verbose_dev(sc->sc_dev, "Copper\n");
2638 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2639 break;
2640 }
2641
2642 reg &= ~CTRL_EXT_I2C_ENA;
2643 if ((sc->sc_flags & WM_F_SGMII) != 0)
2644 reg |= CTRL_EXT_I2C_ENA;
2645 else
2646 reg &= ~CTRL_EXT_I2C_ENA;
2647 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2648 } else if (sc->sc_type < WM_T_82543 ||
2649 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
2650 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2651 aprint_error_dev(sc->sc_dev,
2652 "WARNING: TBIMODE set on 1000BASE-T product!\n");
2653 sc->sc_mediatype = WM_MEDIATYPE_FIBER;
2654 }
2655 } else {
2656 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) {
2657 aprint_error_dev(sc->sc_dev,
2658 "WARNING: TBIMODE clear on 1000BASE-X product!\n");
2659 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2660 }
2661 }
2662 snprintb(buf, sizeof(buf), WM_FLAGS, sc->sc_flags);
2663 aprint_verbose_dev(sc->sc_dev, "%s\n", buf);
2664
2665 /* Set device properties (macflags) */
2666 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags);
2667
2668 /* Initialize the media structures accordingly. */
2669 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2670 wm_gmii_mediainit(sc, wmp->wmp_product);
2671 else
2672 wm_tbi_mediainit(sc); /* All others */
2673
2674 ifp = &sc->sc_ethercom.ec_if;
2675 xname = device_xname(sc->sc_dev);
2676 strlcpy(ifp->if_xname, xname, IFNAMSIZ);
2677 ifp->if_softc = sc;
2678 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2679 #ifdef WM_MPSAFE
2680 ifp->if_extflags = IFEF_MPSAFE;
2681 #endif
2682 ifp->if_ioctl = wm_ioctl;
2683 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
2684 ifp->if_start = wm_nq_start;
2685 /*
2686 * When the number of CPUs is one and the controller can use
2687 * MSI-X, wm(4) use MSI-X but *does not* use multiqueue.
2688 * That is, wm(4) use two interrupts, one is used for Tx/Rx
2689 * and the other is used for link status changing.
2690 * In this situation, wm_nq_transmit() is disadvantageous
2691 * because of wm_select_txqueue() and pcq(9) overhead.
2692 */
2693 if (wm_is_using_multiqueue(sc))
2694 ifp->if_transmit = wm_nq_transmit;
2695 } else {
2696 ifp->if_start = wm_start;
2697 /*
2698 * wm_transmit() has the same disadvantage as wm_transmit().
2699 */
2700 if (wm_is_using_multiqueue(sc))
2701 ifp->if_transmit = wm_transmit;
2702 }
2703 /* wm(4) doest not use ifp->if_watchdog, use wm_tick as watchdog. */
2704 ifp->if_init = wm_init;
2705 ifp->if_stop = wm_stop;
2706 IFQ_SET_MAXLEN(&ifp->if_snd, max(WM_IFQUEUELEN, IFQ_MAXLEN));
2707 IFQ_SET_READY(&ifp->if_snd);
2708
2709 /* Check for jumbo frame */
2710 switch (sc->sc_type) {
2711 case WM_T_82573:
2712 /* XXX limited to 9234 if ASPM is disabled */
2713 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword);
2714 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0)
2715 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2716 break;
2717 case WM_T_82571:
2718 case WM_T_82572:
2719 case WM_T_82574:
2720 case WM_T_82583:
2721 case WM_T_82575:
2722 case WM_T_82576:
2723 case WM_T_82580:
2724 case WM_T_I350:
2725 case WM_T_I354:
2726 case WM_T_I210:
2727 case WM_T_I211:
2728 case WM_T_80003:
2729 case WM_T_ICH9:
2730 case WM_T_ICH10:
2731 case WM_T_PCH2: /* PCH2 supports 9K frame size */
2732 case WM_T_PCH_LPT:
2733 case WM_T_PCH_SPT:
2734 /* XXX limited to 9234 */
2735 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2736 break;
2737 case WM_T_PCH:
2738 /* XXX limited to 4096 */
2739 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2740 break;
2741 case WM_T_82542_2_0:
2742 case WM_T_82542_2_1:
2743 case WM_T_ICH8:
2744 /* No support for jumbo frame */
2745 break;
2746 default:
2747 /* ETHER_MAX_LEN_JUMBO */
2748 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2749 break;
2750 }
2751
2752 /* If we're a i82543 or greater, we can support VLANs. */
2753 if (sc->sc_type >= WM_T_82543)
2754 sc->sc_ethercom.ec_capabilities |=
2755 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING;
2756
2757 /*
2758 * We can perform TCPv4 and UDPv4 checkums in-bound. Only
2759 * on i82543 and later.
2760 */
2761 if (sc->sc_type >= WM_T_82543) {
2762 ifp->if_capabilities |=
2763 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
2764 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
2765 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
2766 IFCAP_CSUM_TCPv6_Tx |
2767 IFCAP_CSUM_UDPv6_Tx;
2768 }
2769
2770 /*
2771 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL.
2772 *
2773 * 82541GI (8086:1076) ... no
2774 * 82572EI (8086:10b9) ... yes
2775 */
2776 if (sc->sc_type >= WM_T_82571) {
2777 ifp->if_capabilities |=
2778 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
2779 }
2780
2781 /*
2782 * If we're a i82544 or greater (except i82547), we can do
2783 * TCP segmentation offload.
2784 */
2785 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) {
2786 ifp->if_capabilities |= IFCAP_TSOv4;
2787 }
2788
2789 if (sc->sc_type >= WM_T_82571) {
2790 ifp->if_capabilities |= IFCAP_TSOv6;
2791 }
2792
2793 sc->sc_tx_process_limit = WM_TX_PROCESS_LIMIT_DEFAULT;
2794 sc->sc_tx_intr_process_limit = WM_TX_INTR_PROCESS_LIMIT_DEFAULT;
2795 sc->sc_rx_process_limit = WM_RX_PROCESS_LIMIT_DEFAULT;
2796 sc->sc_rx_intr_process_limit = WM_RX_INTR_PROCESS_LIMIT_DEFAULT;
2797
2798 #ifdef WM_MPSAFE
2799 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2800 #else
2801 sc->sc_core_lock = NULL;
2802 #endif
2803
2804 /* Attach the interface. */
2805 error = if_initialize(ifp);
2806 if (error != 0) {
2807 aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
2808 error);
2809 return; /* Error */
2810 }
2811 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if);
2812 ether_ifattach(ifp, enaddr);
2813 if_register(ifp);
2814 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb);
2815 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET,
2816 RND_FLAG_DEFAULT);
2817
2818 #ifdef WM_EVENT_COUNTERS
2819 /* Attach event counters. */
2820 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
2821 NULL, xname, "linkintr");
2822
2823 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC,
2824 NULL, xname, "tx_xoff");
2825 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC,
2826 NULL, xname, "tx_xon");
2827 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC,
2828 NULL, xname, "rx_xoff");
2829 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC,
2830 NULL, xname, "rx_xon");
2831 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC,
2832 NULL, xname, "rx_macctl");
2833 #endif /* WM_EVENT_COUNTERS */
2834
2835 if (pmf_device_register(self, wm_suspend, wm_resume))
2836 pmf_class_network_register(self, ifp);
2837 else
2838 aprint_error_dev(self, "couldn't establish power handler\n");
2839
2840 sc->sc_flags |= WM_F_ATTACHED;
2841 out:
2842 return;
2843 }
2844
2845 /* The detach function (ca_detach) */
2846 static int
2847 wm_detach(device_t self, int flags __unused)
2848 {
2849 struct wm_softc *sc = device_private(self);
2850 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2851 int i;
2852
2853 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
2854 return 0;
2855
2856 /* Stop the interface. Callouts are stopped in it. */
2857 wm_stop(ifp, 1);
2858
2859 pmf_device_deregister(self);
2860
2861 #ifdef WM_EVENT_COUNTERS
2862 evcnt_detach(&sc->sc_ev_linkintr);
2863
2864 evcnt_detach(&sc->sc_ev_tx_xoff);
2865 evcnt_detach(&sc->sc_ev_tx_xon);
2866 evcnt_detach(&sc->sc_ev_rx_xoff);
2867 evcnt_detach(&sc->sc_ev_rx_xon);
2868 evcnt_detach(&sc->sc_ev_rx_macctl);
2869 #endif /* WM_EVENT_COUNTERS */
2870
2871 /* Tell the firmware about the release */
2872 WM_CORE_LOCK(sc);
2873 wm_release_manageability(sc);
2874 wm_release_hw_control(sc);
2875 wm_enable_wakeup(sc);
2876 WM_CORE_UNLOCK(sc);
2877
2878 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
2879
2880 /* Delete all remaining media. */
2881 ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
2882
2883 ether_ifdetach(ifp);
2884 if_detach(ifp);
2885 if_percpuq_destroy(sc->sc_ipq);
2886
2887 /* Unload RX dmamaps and free mbufs */
2888 for (i = 0; i < sc->sc_nqueues; i++) {
2889 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
2890 mutex_enter(rxq->rxq_lock);
2891 wm_rxdrain(rxq);
2892 mutex_exit(rxq->rxq_lock);
2893 }
2894 /* Must unlock here */
2895
2896 /* Disestablish the interrupt handler */
2897 for (i = 0; i < sc->sc_nintrs; i++) {
2898 if (sc->sc_ihs[i] != NULL) {
2899 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
2900 sc->sc_ihs[i] = NULL;
2901 }
2902 }
2903 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs);
2904
2905 wm_free_txrx_queues(sc);
2906
2907 /* Unmap the registers */
2908 if (sc->sc_ss) {
2909 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss);
2910 sc->sc_ss = 0;
2911 }
2912 if (sc->sc_ios) {
2913 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
2914 sc->sc_ios = 0;
2915 }
2916 if (sc->sc_flashs) {
2917 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs);
2918 sc->sc_flashs = 0;
2919 }
2920
2921 if (sc->sc_core_lock)
2922 mutex_obj_free(sc->sc_core_lock);
2923 if (sc->sc_ich_phymtx)
2924 mutex_obj_free(sc->sc_ich_phymtx);
2925 if (sc->sc_ich_nvmmtx)
2926 mutex_obj_free(sc->sc_ich_nvmmtx);
2927
2928 return 0;
2929 }
2930
2931 static bool
2932 wm_suspend(device_t self, const pmf_qual_t *qual)
2933 {
2934 struct wm_softc *sc = device_private(self);
2935
2936 wm_release_manageability(sc);
2937 wm_release_hw_control(sc);
2938 wm_enable_wakeup(sc);
2939
2940 return true;
2941 }
2942
2943 static bool
2944 wm_resume(device_t self, const pmf_qual_t *qual)
2945 {
2946 struct wm_softc *sc = device_private(self);
2947
2948 /* Disable ASPM L0s and/or L1 for workaround */
2949 wm_disable_aspm(sc);
2950 wm_init_manageability(sc);
2951
2952 return true;
2953 }
2954
2955 /*
2956 * wm_watchdog: [ifnet interface function]
2957 *
2958 * Watchdog timer handler.
2959 */
2960 static void
2961 wm_watchdog(struct ifnet *ifp)
2962 {
2963 int qid;
2964 struct wm_softc *sc = ifp->if_softc;
2965 uint16_t hang_queue = 0; /* Max queue number of wm(4) is 82576's 16. */
2966
2967 for (qid = 0; qid < sc->sc_nqueues; qid++) {
2968 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq;
2969
2970 wm_watchdog_txq(ifp, txq, &hang_queue);
2971 }
2972
2973 /*
2974 * IF any of queues hanged up, reset the interface.
2975 */
2976 if (hang_queue != 0) {
2977 (void) wm_init(ifp);
2978
2979 /*
2980 * There are still some upper layer processing which call
2981 * ifp->if_start(). e.g. ALTQ or one CPU system
2982 */
2983 /* Try to get more packets going. */
2984 ifp->if_start(ifp);
2985 }
2986 }
2987
2988
2989 static void
2990 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang)
2991 {
2992
2993 mutex_enter(txq->txq_lock);
2994 if (txq->txq_watchdog &&
2995 time_uptime - txq->txq_lastsent > wm_watchdog_timeout) {
2996 wm_watchdog_txq_locked(ifp, txq, hang);
2997 }
2998 mutex_exit(txq->txq_lock);
2999 }
3000
3001 static void
3002 wm_watchdog_txq_locked(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang)
3003 {
3004 struct wm_softc *sc = ifp->if_softc;
3005 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
3006
3007 KASSERT(mutex_owned(txq->txq_lock));
3008
3009 /*
3010 * Since we're using delayed interrupts, sweep up
3011 * before we report an error.
3012 */
3013 wm_txeof(txq, UINT_MAX);
3014 if (txq->txq_watchdog)
3015 *hang |= __BIT(wmq->wmq_id);
3016
3017 if (txq->txq_free != WM_NTXDESC(txq)) {
3018 #ifdef WM_DEBUG
3019 int i, j;
3020 struct wm_txsoft *txs;
3021 #endif
3022 log(LOG_ERR,
3023 "%s: device timeout (txfree %d txsfree %d txnext %d)\n",
3024 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree,
3025 txq->txq_next);
3026 ifp->if_oerrors++;
3027 #ifdef WM_DEBUG
3028 for (i = txq->txq_sdirty; i != txq->txq_snext ;
3029 i = WM_NEXTTXS(txq, i)) {
3030 txs = &txq->txq_soft[i];
3031 printf("txs %d tx %d -> %d\n",
3032 i, txs->txs_firstdesc, txs->txs_lastdesc);
3033 for (j = txs->txs_firstdesc; ;
3034 j = WM_NEXTTX(txq, j)) {
3035 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
3036 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3037 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr);
3038 printf("\t %#08x%08x\n",
3039 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields,
3040 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen);
3041 } else {
3042 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3043 (uint64_t)txq->txq_descs[j].wtx_addr.wa_high << 32 |
3044 txq->txq_descs[j].wtx_addr.wa_low);
3045 printf("\t %#04x%02x%02x%08x\n",
3046 txq->txq_descs[j].wtx_fields.wtxu_vlan,
3047 txq->txq_descs[j].wtx_fields.wtxu_options,
3048 txq->txq_descs[j].wtx_fields.wtxu_status,
3049 txq->txq_descs[j].wtx_cmdlen);
3050 }
3051 if (j == txs->txs_lastdesc)
3052 break;
3053 }
3054 }
3055 #endif
3056 }
3057 }
3058
3059 /*
3060 * wm_tick:
3061 *
3062 * One second timer, used to check link status, sweep up
3063 * completed transmit jobs, etc.
3064 */
3065 static void
3066 wm_tick(void *arg)
3067 {
3068 struct wm_softc *sc = arg;
3069 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3070 #ifndef WM_MPSAFE
3071 int s = splnet();
3072 #endif
3073
3074 WM_CORE_LOCK(sc);
3075
3076 if (sc->sc_core_stopping) {
3077 WM_CORE_UNLOCK(sc);
3078 #ifndef WM_MPSAFE
3079 splx(s);
3080 #endif
3081 return;
3082 }
3083
3084 if (sc->sc_type >= WM_T_82542_2_1) {
3085 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
3086 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
3087 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
3088 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
3089 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
3090 }
3091
3092 ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
3093 ifp->if_ierrors += 0ULL /* ensure quad_t */
3094 + CSR_READ(sc, WMREG_CRCERRS)
3095 + CSR_READ(sc, WMREG_ALGNERRC)
3096 + CSR_READ(sc, WMREG_SYMERRC)
3097 + CSR_READ(sc, WMREG_RXERRC)
3098 + CSR_READ(sc, WMREG_SEC)
3099 + CSR_READ(sc, WMREG_CEXTERR)
3100 + CSR_READ(sc, WMREG_RLEC);
3101 /*
3102 * WMREG_RNBC is incremented when there is no available buffers in host
3103 * memory. It does not mean the number of dropped packet. Because
3104 * ethernet controller can receive packets in such case if there is
3105 * space in phy's FIFO.
3106 *
3107 * If you want to know the nubmer of WMREG_RMBC, you should use such as
3108 * own EVCNT instead of if_iqdrops.
3109 */
3110 ifp->if_iqdrops += CSR_READ(sc, WMREG_MPC);
3111
3112 if (sc->sc_flags & WM_F_HAS_MII)
3113 mii_tick(&sc->sc_mii);
3114 else if ((sc->sc_type >= WM_T_82575)
3115 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
3116 wm_serdes_tick(sc);
3117 else
3118 wm_tbi_tick(sc);
3119
3120 WM_CORE_UNLOCK(sc);
3121
3122 wm_watchdog(ifp);
3123
3124 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
3125 }
3126
3127 static int
3128 wm_ifflags_cb(struct ethercom *ec)
3129 {
3130 struct ifnet *ifp = &ec->ec_if;
3131 struct wm_softc *sc = ifp->if_softc;
3132 int rc = 0;
3133
3134 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3135 device_xname(sc->sc_dev), __func__));
3136
3137 WM_CORE_LOCK(sc);
3138
3139 int change = ifp->if_flags ^ sc->sc_if_flags;
3140 sc->sc_if_flags = ifp->if_flags;
3141
3142 if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
3143 rc = ENETRESET;
3144 goto out;
3145 }
3146
3147 if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
3148 wm_set_filter(sc);
3149
3150 wm_set_vlan(sc);
3151
3152 out:
3153 WM_CORE_UNLOCK(sc);
3154
3155 return rc;
3156 }
3157
3158 /*
3159 * wm_ioctl: [ifnet interface function]
3160 *
3161 * Handle control requests from the operator.
3162 */
3163 static int
3164 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
3165 {
3166 struct wm_softc *sc = ifp->if_softc;
3167 struct ifreq *ifr = (struct ifreq *) data;
3168 struct ifaddr *ifa = (struct ifaddr *)data;
3169 struct sockaddr_dl *sdl;
3170 int s, error;
3171
3172 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3173 device_xname(sc->sc_dev), __func__));
3174
3175 #ifndef WM_MPSAFE
3176 s = splnet();
3177 #endif
3178 switch (cmd) {
3179 case SIOCSIFMEDIA:
3180 case SIOCGIFMEDIA:
3181 WM_CORE_LOCK(sc);
3182 /* Flow control requires full-duplex mode. */
3183 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
3184 (ifr->ifr_media & IFM_FDX) == 0)
3185 ifr->ifr_media &= ~IFM_ETH_FMASK;
3186 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
3187 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
3188 /* We can do both TXPAUSE and RXPAUSE. */
3189 ifr->ifr_media |=
3190 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
3191 }
3192 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
3193 }
3194 WM_CORE_UNLOCK(sc);
3195 #ifdef WM_MPSAFE
3196 s = splnet();
3197 #endif
3198 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
3199 #ifdef WM_MPSAFE
3200 splx(s);
3201 #endif
3202 break;
3203 case SIOCINITIFADDR:
3204 WM_CORE_LOCK(sc);
3205 if (ifa->ifa_addr->sa_family == AF_LINK) {
3206 sdl = satosdl(ifp->if_dl->ifa_addr);
3207 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len,
3208 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen);
3209 /* unicast address is first multicast entry */
3210 wm_set_filter(sc);
3211 error = 0;
3212 WM_CORE_UNLOCK(sc);
3213 break;
3214 }
3215 WM_CORE_UNLOCK(sc);
3216 /*FALLTHROUGH*/
3217 default:
3218 #ifdef WM_MPSAFE
3219 s = splnet();
3220 #endif
3221 /* It may call wm_start, so unlock here */
3222 error = ether_ioctl(ifp, cmd, data);
3223 #ifdef WM_MPSAFE
3224 splx(s);
3225 #endif
3226 if (error != ENETRESET)
3227 break;
3228
3229 error = 0;
3230
3231 if (cmd == SIOCSIFCAP) {
3232 error = (*ifp->if_init)(ifp);
3233 } else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
3234 ;
3235 else if (ifp->if_flags & IFF_RUNNING) {
3236 /*
3237 * Multicast list has changed; set the hardware filter
3238 * accordingly.
3239 */
3240 WM_CORE_LOCK(sc);
3241 wm_set_filter(sc);
3242 WM_CORE_UNLOCK(sc);
3243 }
3244 break;
3245 }
3246
3247 #ifndef WM_MPSAFE
3248 splx(s);
3249 #endif
3250 return error;
3251 }
3252
3253 /* MAC address related */
3254
3255 /*
3256 * Get the offset of MAC address and return it.
3257 * If error occured, use offset 0.
3258 */
3259 static uint16_t
3260 wm_check_alt_mac_addr(struct wm_softc *sc)
3261 {
3262 uint16_t myea[ETHER_ADDR_LEN / 2];
3263 uint16_t offset = NVM_OFF_MACADDR;
3264
3265 /* Try to read alternative MAC address pointer */
3266 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0)
3267 return 0;
3268
3269 /* Check pointer if it's valid or not. */
3270 if ((offset == 0x0000) || (offset == 0xffff))
3271 return 0;
3272
3273 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid);
3274 /*
3275 * Check whether alternative MAC address is valid or not.
3276 * Some cards have non 0xffff pointer but those don't use
3277 * alternative MAC address in reality.
3278 *
3279 * Check whether the broadcast bit is set or not.
3280 */
3281 if (wm_nvm_read(sc, offset, 1, myea) == 0)
3282 if (((myea[0] & 0xff) & 0x01) == 0)
3283 return offset; /* Found */
3284
3285 /* Not found */
3286 return 0;
3287 }
3288
3289 static int
3290 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr)
3291 {
3292 uint16_t myea[ETHER_ADDR_LEN / 2];
3293 uint16_t offset = NVM_OFF_MACADDR;
3294 int do_invert = 0;
3295
3296 switch (sc->sc_type) {
3297 case WM_T_82580:
3298 case WM_T_I350:
3299 case WM_T_I354:
3300 /* EEPROM Top Level Partitioning */
3301 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0;
3302 break;
3303 case WM_T_82571:
3304 case WM_T_82575:
3305 case WM_T_82576:
3306 case WM_T_80003:
3307 case WM_T_I210:
3308 case WM_T_I211:
3309 offset = wm_check_alt_mac_addr(sc);
3310 if (offset == 0)
3311 if ((sc->sc_funcid & 0x01) == 1)
3312 do_invert = 1;
3313 break;
3314 default:
3315 if ((sc->sc_funcid & 0x01) == 1)
3316 do_invert = 1;
3317 break;
3318 }
3319
3320 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0)
3321 goto bad;
3322
3323 enaddr[0] = myea[0] & 0xff;
3324 enaddr[1] = myea[0] >> 8;
3325 enaddr[2] = myea[1] & 0xff;
3326 enaddr[3] = myea[1] >> 8;
3327 enaddr[4] = myea[2] & 0xff;
3328 enaddr[5] = myea[2] >> 8;
3329
3330 /*
3331 * Toggle the LSB of the MAC address on the second port
3332 * of some dual port cards.
3333 */
3334 if (do_invert != 0)
3335 enaddr[5] ^= 1;
3336
3337 return 0;
3338
3339 bad:
3340 return -1;
3341 }
3342
3343 /*
3344 * wm_set_ral:
3345 *
3346 * Set an entery in the receive address list.
3347 */
3348 static void
3349 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
3350 {
3351 uint32_t ral_lo, ral_hi, addrl, addrh;
3352 uint32_t wlock_mac;
3353 int rv;
3354
3355 if (enaddr != NULL) {
3356 ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) |
3357 (enaddr[3] << 24);
3358 ral_hi = enaddr[4] | (enaddr[5] << 8);
3359 ral_hi |= RAL_AV;
3360 } else {
3361 ral_lo = 0;
3362 ral_hi = 0;
3363 }
3364
3365 switch (sc->sc_type) {
3366 case WM_T_82542_2_0:
3367 case WM_T_82542_2_1:
3368 case WM_T_82543:
3369 CSR_WRITE(sc, WMREG_RAL(idx), ral_lo);
3370 CSR_WRITE_FLUSH(sc);
3371 CSR_WRITE(sc, WMREG_RAH(idx), ral_hi);
3372 CSR_WRITE_FLUSH(sc);
3373 break;
3374 case WM_T_PCH2:
3375 case WM_T_PCH_LPT:
3376 case WM_T_PCH_SPT:
3377 if (idx == 0) {
3378 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3379 CSR_WRITE_FLUSH(sc);
3380 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3381 CSR_WRITE_FLUSH(sc);
3382 return;
3383 }
3384 if (sc->sc_type != WM_T_PCH2) {
3385 wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM),
3386 FWSM_WLOCK_MAC);
3387 addrl = WMREG_SHRAL(idx - 1);
3388 addrh = WMREG_SHRAH(idx - 1);
3389 } else {
3390 wlock_mac = 0;
3391 addrl = WMREG_PCH_LPT_SHRAL(idx - 1);
3392 addrh = WMREG_PCH_LPT_SHRAH(idx - 1);
3393 }
3394
3395 if ((wlock_mac == 0) || (idx <= wlock_mac)) {
3396 rv = wm_get_swflag_ich8lan(sc);
3397 if (rv != 0)
3398 return;
3399 CSR_WRITE(sc, addrl, ral_lo);
3400 CSR_WRITE_FLUSH(sc);
3401 CSR_WRITE(sc, addrh, ral_hi);
3402 CSR_WRITE_FLUSH(sc);
3403 wm_put_swflag_ich8lan(sc);
3404 }
3405
3406 break;
3407 default:
3408 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3409 CSR_WRITE_FLUSH(sc);
3410 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3411 CSR_WRITE_FLUSH(sc);
3412 break;
3413 }
3414 }
3415
3416 /*
3417 * wm_mchash:
3418 *
3419 * Compute the hash of the multicast address for the 4096-bit
3420 * multicast filter.
3421 */
3422 static uint32_t
3423 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
3424 {
3425 static const int lo_shift[4] = { 4, 3, 2, 0 };
3426 static const int hi_shift[4] = { 4, 5, 6, 8 };
3427 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 };
3428 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 };
3429 uint32_t hash;
3430
3431 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3432 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3433 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3434 || (sc->sc_type == WM_T_PCH_SPT)) {
3435 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) |
3436 (((uint16_t) enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]);
3437 return (hash & 0x3ff);
3438 }
3439 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
3440 (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]);
3441
3442 return (hash & 0xfff);
3443 }
3444
3445 /*
3446 * wm_set_filter:
3447 *
3448 * Set up the receive filter.
3449 */
3450 static void
3451 wm_set_filter(struct wm_softc *sc)
3452 {
3453 struct ethercom *ec = &sc->sc_ethercom;
3454 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3455 struct ether_multi *enm;
3456 struct ether_multistep step;
3457 bus_addr_t mta_reg;
3458 uint32_t hash, reg, bit;
3459 int i, size, ralmax;
3460
3461 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3462 device_xname(sc->sc_dev), __func__));
3463
3464 if (sc->sc_type >= WM_T_82544)
3465 mta_reg = WMREG_CORDOVA_MTA;
3466 else
3467 mta_reg = WMREG_MTA;
3468
3469 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
3470
3471 if (ifp->if_flags & IFF_BROADCAST)
3472 sc->sc_rctl |= RCTL_BAM;
3473 if (ifp->if_flags & IFF_PROMISC) {
3474 sc->sc_rctl |= RCTL_UPE;
3475 goto allmulti;
3476 }
3477
3478 /*
3479 * Set the station address in the first RAL slot, and
3480 * clear the remaining slots.
3481 */
3482 if (sc->sc_type == WM_T_ICH8)
3483 size = WM_RAL_TABSIZE_ICH8 -1;
3484 else if ((sc->sc_type == WM_T_ICH9) || (sc->sc_type == WM_T_ICH10)
3485 || (sc->sc_type == WM_T_PCH))
3486 size = WM_RAL_TABSIZE_ICH8;
3487 else if (sc->sc_type == WM_T_PCH2)
3488 size = WM_RAL_TABSIZE_PCH2;
3489 else if ((sc->sc_type == WM_T_PCH_LPT) ||(sc->sc_type == WM_T_PCH_SPT))
3490 size = WM_RAL_TABSIZE_PCH_LPT;
3491 else if (sc->sc_type == WM_T_82575)
3492 size = WM_RAL_TABSIZE_82575;
3493 else if ((sc->sc_type == WM_T_82576) || (sc->sc_type == WM_T_82580))
3494 size = WM_RAL_TABSIZE_82576;
3495 else if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
3496 size = WM_RAL_TABSIZE_I350;
3497 else
3498 size = WM_RAL_TABSIZE;
3499 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0);
3500
3501 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)) {
3502 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC);
3503 switch (i) {
3504 case 0:
3505 /* We can use all entries */
3506 ralmax = size;
3507 break;
3508 case 1:
3509 /* Only RAR[0] */
3510 ralmax = 1;
3511 break;
3512 default:
3513 /* available SHRA + RAR[0] */
3514 ralmax = i + 1;
3515 }
3516 } else
3517 ralmax = size;
3518 for (i = 1; i < size; i++) {
3519 if (i < ralmax)
3520 wm_set_ral(sc, NULL, i);
3521 }
3522
3523 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3524 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3525 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3526 || (sc->sc_type == WM_T_PCH_SPT))
3527 size = WM_ICH8_MC_TABSIZE;
3528 else
3529 size = WM_MC_TABSIZE;
3530 /* Clear out the multicast table. */
3531 for (i = 0; i < size; i++) {
3532 CSR_WRITE(sc, mta_reg + (i << 2), 0);
3533 CSR_WRITE_FLUSH(sc);
3534 }
3535
3536 ETHER_LOCK(ec);
3537 ETHER_FIRST_MULTI(step, ec, enm);
3538 while (enm != NULL) {
3539 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
3540 ETHER_UNLOCK(ec);
3541 /*
3542 * We must listen to a range of multicast addresses.
3543 * For now, just accept all multicasts, rather than
3544 * trying to set only those filter bits needed to match
3545 * the range. (At this time, the only use of address
3546 * ranges is for IP multicast routing, for which the
3547 * range is big enough to require all bits set.)
3548 */
3549 goto allmulti;
3550 }
3551
3552 hash = wm_mchash(sc, enm->enm_addrlo);
3553
3554 reg = (hash >> 5);
3555 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3556 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3557 || (sc->sc_type == WM_T_PCH2)
3558 || (sc->sc_type == WM_T_PCH_LPT)
3559 || (sc->sc_type == WM_T_PCH_SPT))
3560 reg &= 0x1f;
3561 else
3562 reg &= 0x7f;
3563 bit = hash & 0x1f;
3564
3565 hash = CSR_READ(sc, mta_reg + (reg << 2));
3566 hash |= 1U << bit;
3567
3568 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) {
3569 /*
3570 * 82544 Errata 9: Certain register cannot be written
3571 * with particular alignments in PCI-X bus operation
3572 * (FCAH, MTA and VFTA).
3573 */
3574 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
3575 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3576 CSR_WRITE_FLUSH(sc);
3577 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
3578 CSR_WRITE_FLUSH(sc);
3579 } else {
3580 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3581 CSR_WRITE_FLUSH(sc);
3582 }
3583
3584 ETHER_NEXT_MULTI(step, enm);
3585 }
3586 ETHER_UNLOCK(ec);
3587
3588 ifp->if_flags &= ~IFF_ALLMULTI;
3589 goto setit;
3590
3591 allmulti:
3592 ifp->if_flags |= IFF_ALLMULTI;
3593 sc->sc_rctl |= RCTL_MPE;
3594
3595 setit:
3596 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
3597 }
3598
3599 /* Reset and init related */
3600
3601 static void
3602 wm_set_vlan(struct wm_softc *sc)
3603 {
3604
3605 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3606 device_xname(sc->sc_dev), __func__));
3607
3608 /* Deal with VLAN enables. */
3609 if (VLAN_ATTACHED(&sc->sc_ethercom))
3610 sc->sc_ctrl |= CTRL_VME;
3611 else
3612 sc->sc_ctrl &= ~CTRL_VME;
3613
3614 /* Write the control registers. */
3615 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
3616 }
3617
3618 static void
3619 wm_set_pcie_completion_timeout(struct wm_softc *sc)
3620 {
3621 uint32_t gcr;
3622 pcireg_t ctrl2;
3623
3624 gcr = CSR_READ(sc, WMREG_GCR);
3625
3626 /* Only take action if timeout value is defaulted to 0 */
3627 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0)
3628 goto out;
3629
3630 if ((gcr & GCR_CAP_VER2) == 0) {
3631 gcr |= GCR_CMPL_TMOUT_10MS;
3632 goto out;
3633 }
3634
3635 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
3636 sc->sc_pcixe_capoff + PCIE_DCSR2);
3637 ctrl2 |= WM_PCIE_DCSR2_16MS;
3638 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
3639 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2);
3640
3641 out:
3642 /* Disable completion timeout resend */
3643 gcr &= ~GCR_CMPL_TMOUT_RESEND;
3644
3645 CSR_WRITE(sc, WMREG_GCR, gcr);
3646 }
3647
3648 void
3649 wm_get_auto_rd_done(struct wm_softc *sc)
3650 {
3651 int i;
3652
3653 /* wait for eeprom to reload */
3654 switch (sc->sc_type) {
3655 case WM_T_82571:
3656 case WM_T_82572:
3657 case WM_T_82573:
3658 case WM_T_82574:
3659 case WM_T_82583:
3660 case WM_T_82575:
3661 case WM_T_82576:
3662 case WM_T_82580:
3663 case WM_T_I350:
3664 case WM_T_I354:
3665 case WM_T_I210:
3666 case WM_T_I211:
3667 case WM_T_80003:
3668 case WM_T_ICH8:
3669 case WM_T_ICH9:
3670 for (i = 0; i < 10; i++) {
3671 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
3672 break;
3673 delay(1000);
3674 }
3675 if (i == 10) {
3676 log(LOG_ERR, "%s: auto read from eeprom failed to "
3677 "complete\n", device_xname(sc->sc_dev));
3678 }
3679 break;
3680 default:
3681 break;
3682 }
3683 }
3684
3685 void
3686 wm_lan_init_done(struct wm_softc *sc)
3687 {
3688 uint32_t reg = 0;
3689 int i;
3690
3691 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3692 device_xname(sc->sc_dev), __func__));
3693
3694 /* Wait for eeprom to reload */
3695 switch (sc->sc_type) {
3696 case WM_T_ICH10:
3697 case WM_T_PCH:
3698 case WM_T_PCH2:
3699 case WM_T_PCH_LPT:
3700 case WM_T_PCH_SPT:
3701 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) {
3702 reg = CSR_READ(sc, WMREG_STATUS);
3703 if ((reg & STATUS_LAN_INIT_DONE) != 0)
3704 break;
3705 delay(100);
3706 }
3707 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) {
3708 log(LOG_ERR, "%s: %s: lan_init_done failed to "
3709 "complete\n", device_xname(sc->sc_dev), __func__);
3710 }
3711 break;
3712 default:
3713 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
3714 __func__);
3715 break;
3716 }
3717
3718 reg &= ~STATUS_LAN_INIT_DONE;
3719 CSR_WRITE(sc, WMREG_STATUS, reg);
3720 }
3721
3722 void
3723 wm_get_cfg_done(struct wm_softc *sc)
3724 {
3725 int mask;
3726 uint32_t reg;
3727 int i;
3728
3729 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3730 device_xname(sc->sc_dev), __func__));
3731
3732 /* Wait for eeprom to reload */
3733 switch (sc->sc_type) {
3734 case WM_T_82542_2_0:
3735 case WM_T_82542_2_1:
3736 /* null */
3737 break;
3738 case WM_T_82543:
3739 case WM_T_82544:
3740 case WM_T_82540:
3741 case WM_T_82545:
3742 case WM_T_82545_3:
3743 case WM_T_82546:
3744 case WM_T_82546_3:
3745 case WM_T_82541:
3746 case WM_T_82541_2:
3747 case WM_T_82547:
3748 case WM_T_82547_2:
3749 case WM_T_82573:
3750 case WM_T_82574:
3751 case WM_T_82583:
3752 /* generic */
3753 delay(10*1000);
3754 break;
3755 case WM_T_80003:
3756 case WM_T_82571:
3757 case WM_T_82572:
3758 case WM_T_82575:
3759 case WM_T_82576:
3760 case WM_T_82580:
3761 case WM_T_I350:
3762 case WM_T_I354:
3763 case WM_T_I210:
3764 case WM_T_I211:
3765 if (sc->sc_type == WM_T_82571) {
3766 /* Only 82571 shares port 0 */
3767 mask = EEMNGCTL_CFGDONE_0;
3768 } else
3769 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid;
3770 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) {
3771 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask)
3772 break;
3773 delay(1000);
3774 }
3775 if (i >= WM_PHY_CFG_TIMEOUT) {
3776 DPRINTF(WM_DEBUG_GMII, ("%s: %s failed\n",
3777 device_xname(sc->sc_dev), __func__));
3778 }
3779 break;
3780 case WM_T_ICH8:
3781 case WM_T_ICH9:
3782 case WM_T_ICH10:
3783 case WM_T_PCH:
3784 case WM_T_PCH2:
3785 case WM_T_PCH_LPT:
3786 case WM_T_PCH_SPT:
3787 delay(10*1000);
3788 if (sc->sc_type >= WM_T_ICH10)
3789 wm_lan_init_done(sc);
3790 else
3791 wm_get_auto_rd_done(sc);
3792
3793 reg = CSR_READ(sc, WMREG_STATUS);
3794 if ((reg & STATUS_PHYRA) != 0)
3795 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA);
3796 break;
3797 default:
3798 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
3799 __func__);
3800 break;
3801 }
3802 }
3803
3804 void
3805 wm_phy_post_reset(struct wm_softc *sc)
3806 {
3807 uint32_t reg;
3808
3809 /* This function is only for ICH8 and newer. */
3810 if (sc->sc_type < WM_T_ICH8)
3811 return;
3812
3813 if (wm_phy_resetisblocked(sc)) {
3814 /* XXX */
3815 device_printf(sc->sc_dev, "PHY is blocked\n");
3816 return;
3817 }
3818
3819 /* Allow time for h/w to get to quiescent state after reset */
3820 delay(10*1000);
3821
3822 /* Perform any necessary post-reset workarounds */
3823 if (sc->sc_type == WM_T_PCH)
3824 wm_hv_phy_workaround_ich8lan(sc);
3825 if (sc->sc_type == WM_T_PCH2)
3826 wm_lv_phy_workaround_ich8lan(sc);
3827
3828 /* Clear the host wakeup bit after lcd reset */
3829 if (sc->sc_type >= WM_T_PCH) {
3830 reg = wm_gmii_hv_readreg(sc->sc_dev, 2,
3831 BM_PORT_GEN_CFG);
3832 reg &= ~BM_WUC_HOST_WU_BIT;
3833 wm_gmii_hv_writereg(sc->sc_dev, 2,
3834 BM_PORT_GEN_CFG, reg);
3835 }
3836
3837 /* Configure the LCD with the extended configuration region in NVM */
3838 wm_init_lcd_from_nvm(sc);
3839
3840 /* Configure the LCD with the OEM bits in NVM */
3841 }
3842
3843 /* Only for PCH and newer */
3844 static void
3845 wm_write_smbus_addr(struct wm_softc *sc)
3846 {
3847 uint32_t strap, freq;
3848 uint32_t phy_data;
3849
3850 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3851 device_xname(sc->sc_dev), __func__));
3852
3853 strap = CSR_READ(sc, WMREG_STRAP);
3854 freq = __SHIFTOUT(strap, STRAP_FREQ);
3855
3856 phy_data = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_SMB_ADDR);
3857
3858 phy_data &= ~HV_SMB_ADDR_ADDR;
3859 phy_data |= __SHIFTOUT(strap, STRAP_SMBUSADDR);
3860 phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
3861
3862 if (sc->sc_phytype == WMPHY_I217) {
3863 /* Restore SMBus frequency */
3864 if (freq --) {
3865 phy_data &= ~(HV_SMB_ADDR_FREQ_LOW
3866 | HV_SMB_ADDR_FREQ_HIGH);
3867 phy_data |= __SHIFTIN((freq & 0x01) != 0,
3868 HV_SMB_ADDR_FREQ_LOW);
3869 phy_data |= __SHIFTIN((freq & 0x02) != 0,
3870 HV_SMB_ADDR_FREQ_HIGH);
3871 } else {
3872 DPRINTF(WM_DEBUG_INIT,
3873 ("%s: %s Unsupported SMB frequency in PHY\n",
3874 device_xname(sc->sc_dev), __func__));
3875 }
3876 }
3877
3878 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_SMB_ADDR, phy_data);
3879 }
3880
3881 void
3882 wm_init_lcd_from_nvm(struct wm_softc *sc)
3883 {
3884 uint32_t extcnfctr, sw_cfg_mask, cnf_size, word_addr, i, reg;
3885 uint16_t phy_page = 0;
3886
3887 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3888 device_xname(sc->sc_dev), __func__));
3889
3890 switch (sc->sc_type) {
3891 case WM_T_ICH8:
3892 if ((sc->sc_phytype == WMPHY_UNKNOWN)
3893 || (sc->sc_phytype != WMPHY_IGP_3))
3894 return;
3895
3896 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_AMT)
3897 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_LAN)) {
3898 sw_cfg_mask = FEXTNVM_SW_CONFIG;
3899 break;
3900 }
3901 /* FALLTHROUGH */
3902 case WM_T_PCH:
3903 case WM_T_PCH2:
3904 case WM_T_PCH_LPT:
3905 case WM_T_PCH_SPT:
3906 sw_cfg_mask = FEXTNVM_SW_CONFIG_ICH8M;
3907 break;
3908 default:
3909 return;
3910 }
3911
3912 sc->phy.acquire(sc);
3913
3914 reg = CSR_READ(sc, WMREG_FEXTNVM);
3915 if ((reg & sw_cfg_mask) == 0)
3916 goto release;
3917
3918 /*
3919 * Make sure HW does not configure LCD from PHY extended configuration
3920 * before SW configuration
3921 */
3922 extcnfctr = CSR_READ(sc, WMREG_EXTCNFCTR);
3923 if ((sc->sc_type < WM_T_PCH2)
3924 && ((extcnfctr & EXTCNFCTR_PCIE_WRITE_ENABLE) != 0))
3925 goto release;
3926
3927 DPRINTF(WM_DEBUG_INIT, ("%s: %s: Configure LCD by software\n",
3928 device_xname(sc->sc_dev), __func__));
3929 /* word_addr is in DWORD */
3930 word_addr = __SHIFTOUT(extcnfctr, EXTCNFCTR_EXT_CNF_POINTER) << 1;
3931
3932 reg = CSR_READ(sc, WMREG_EXTCNFSIZE);
3933 cnf_size = __SHIFTOUT(reg, EXTCNFSIZE_LENGTH);
3934
3935 if (((sc->sc_type == WM_T_PCH)
3936 && ((extcnfctr & EXTCNFCTR_OEM_WRITE_ENABLE) == 0))
3937 || (sc->sc_type > WM_T_PCH)) {
3938 /*
3939 * HW configures the SMBus address and LEDs when the OEM and
3940 * LCD Write Enable bits are set in the NVM. When both NVM bits
3941 * are cleared, SW will configure them instead.
3942 */
3943 DPRINTF(WM_DEBUG_INIT, ("%s: %s: Configure SMBus and LED\n",
3944 device_xname(sc->sc_dev), __func__));
3945 wm_write_smbus_addr(sc);
3946
3947 reg = CSR_READ(sc, WMREG_LEDCTL);
3948 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_LED_CONFIG, reg);
3949 }
3950
3951 /* Configure LCD from extended configuration region. */
3952 for (i = 0; i < cnf_size; i++) {
3953 uint16_t reg_data, reg_addr;
3954
3955 if (wm_nvm_read(sc, (word_addr + i * 2), 1, ®_data) != 0)
3956 goto release;
3957
3958 if (wm_nvm_read(sc, (word_addr + i * 2 + 1), 1, ®_addr) !=0)
3959 goto release;
3960
3961 if (reg_addr == MII_IGPHY_PAGE_SELECT)
3962 phy_page = reg_data;
3963
3964 reg_addr &= IGPHY_MAXREGADDR;
3965 reg_addr |= phy_page;
3966
3967 sc->phy.release(sc); /* XXX */
3968 sc->sc_mii.mii_writereg(sc->sc_dev, 1, reg_addr, reg_data);
3969 sc->phy.acquire(sc); /* XXX */
3970 }
3971
3972 release:
3973 sc->phy.release(sc);
3974 return;
3975 }
3976
3977
3978 /* Init hardware bits */
3979 void
3980 wm_initialize_hardware_bits(struct wm_softc *sc)
3981 {
3982 uint32_t tarc0, tarc1, reg;
3983
3984 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3985 device_xname(sc->sc_dev), __func__));
3986
3987 /* For 82571 variant, 80003 and ICHs */
3988 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
3989 || (sc->sc_type >= WM_T_80003)) {
3990
3991 /* Transmit Descriptor Control 0 */
3992 reg = CSR_READ(sc, WMREG_TXDCTL(0));
3993 reg |= TXDCTL_COUNT_DESC;
3994 CSR_WRITE(sc, WMREG_TXDCTL(0), reg);
3995
3996 /* Transmit Descriptor Control 1 */
3997 reg = CSR_READ(sc, WMREG_TXDCTL(1));
3998 reg |= TXDCTL_COUNT_DESC;
3999 CSR_WRITE(sc, WMREG_TXDCTL(1), reg);
4000
4001 /* TARC0 */
4002 tarc0 = CSR_READ(sc, WMREG_TARC0);
4003 switch (sc->sc_type) {
4004 case WM_T_82571:
4005 case WM_T_82572:
4006 case WM_T_82573:
4007 case WM_T_82574:
4008 case WM_T_82583:
4009 case WM_T_80003:
4010 /* Clear bits 30..27 */
4011 tarc0 &= ~__BITS(30, 27);
4012 break;
4013 default:
4014 break;
4015 }
4016
4017 switch (sc->sc_type) {
4018 case WM_T_82571:
4019 case WM_T_82572:
4020 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */
4021
4022 tarc1 = CSR_READ(sc, WMREG_TARC1);
4023 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */
4024 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */
4025 /* 8257[12] Errata No.7 */
4026 tarc1 |= __BIT(22); /* TARC1 bits 22 */
4027
4028 /* TARC1 bit 28 */
4029 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4030 tarc1 &= ~__BIT(28);
4031 else
4032 tarc1 |= __BIT(28);
4033 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4034
4035 /*
4036 * 8257[12] Errata No.13
4037 * Disable Dyamic Clock Gating.
4038 */
4039 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4040 reg &= ~CTRL_EXT_DMA_DYN_CLK;
4041 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4042 break;
4043 case WM_T_82573:
4044 case WM_T_82574:
4045 case WM_T_82583:
4046 if ((sc->sc_type == WM_T_82574)
4047 || (sc->sc_type == WM_T_82583))
4048 tarc0 |= __BIT(26); /* TARC0 bit 26 */
4049
4050 /* Extended Device Control */
4051 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4052 reg &= ~__BIT(23); /* Clear bit 23 */
4053 reg |= __BIT(22); /* Set bit 22 */
4054 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4055
4056 /* Device Control */
4057 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */
4058 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4059
4060 /* PCIe Control Register */
4061 /*
4062 * 82573 Errata (unknown).
4063 *
4064 * 82574 Errata 25 and 82583 Errata 12
4065 * "Dropped Rx Packets":
4066 * NVM Image Version 2.1.4 and newer has no this bug.
4067 */
4068 reg = CSR_READ(sc, WMREG_GCR);
4069 reg |= GCR_L1_ACT_WITHOUT_L0S_RX;
4070 CSR_WRITE(sc, WMREG_GCR, reg);
4071
4072 if ((sc->sc_type == WM_T_82574)
4073 || (sc->sc_type == WM_T_82583)) {
4074 /*
4075 * Document says this bit must be set for
4076 * proper operation.
4077 */
4078 reg = CSR_READ(sc, WMREG_GCR);
4079 reg |= __BIT(22);
4080 CSR_WRITE(sc, WMREG_GCR, reg);
4081
4082 /*
4083 * Apply workaround for hardware errata
4084 * documented in errata docs Fixes issue where
4085 * some error prone or unreliable PCIe
4086 * completions are occurring, particularly
4087 * with ASPM enabled. Without fix, issue can
4088 * cause Tx timeouts.
4089 */
4090 reg = CSR_READ(sc, WMREG_GCR2);
4091 reg |= __BIT(0);
4092 CSR_WRITE(sc, WMREG_GCR2, reg);
4093 }
4094 break;
4095 case WM_T_80003:
4096 /* TARC0 */
4097 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
4098 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
4099 tarc0 &= ~__BIT(20); /* Clear bits 20 */
4100
4101 /* TARC1 bit 28 */
4102 tarc1 = CSR_READ(sc, WMREG_TARC1);
4103 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4104 tarc1 &= ~__BIT(28);
4105 else
4106 tarc1 |= __BIT(28);
4107 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4108 break;
4109 case WM_T_ICH8:
4110 case WM_T_ICH9:
4111 case WM_T_ICH10:
4112 case WM_T_PCH:
4113 case WM_T_PCH2:
4114 case WM_T_PCH_LPT:
4115 case WM_T_PCH_SPT:
4116 /* TARC0 */
4117 if (sc->sc_type == WM_T_ICH8) {
4118 /* Set TARC0 bits 29 and 28 */
4119 tarc0 |= __BITS(29, 28);
4120 } else if (sc->sc_type == WM_T_PCH_SPT) {
4121 tarc0 |= __BIT(29);
4122 /*
4123 * Drop bit 28. From Linux.
4124 * See I218/I219 spec update
4125 * "5. Buffer Overrun While the I219 is
4126 * Processing DMA Transactions"
4127 */
4128 tarc0 &= ~__BIT(28);
4129 }
4130 /* Set TARC0 bits 23,24,26,27 */
4131 tarc0 |= __BITS(27, 26) | __BITS(24, 23);
4132
4133 /* CTRL_EXT */
4134 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4135 reg |= __BIT(22); /* Set bit 22 */
4136 /*
4137 * Enable PHY low-power state when MAC is at D3
4138 * w/o WoL
4139 */
4140 if (sc->sc_type >= WM_T_PCH)
4141 reg |= CTRL_EXT_PHYPDEN;
4142 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4143
4144 /* TARC1 */
4145 tarc1 = CSR_READ(sc, WMREG_TARC1);
4146 /* bit 28 */
4147 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4148 tarc1 &= ~__BIT(28);
4149 else
4150 tarc1 |= __BIT(28);
4151 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30);
4152 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4153
4154 /* Device Status */
4155 if (sc->sc_type == WM_T_ICH8) {
4156 reg = CSR_READ(sc, WMREG_STATUS);
4157 reg &= ~__BIT(31);
4158 CSR_WRITE(sc, WMREG_STATUS, reg);
4159
4160 }
4161
4162 /* IOSFPC */
4163 if (sc->sc_type == WM_T_PCH_SPT) {
4164 reg = CSR_READ(sc, WMREG_IOSFPC);
4165 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */
4166 CSR_WRITE(sc, WMREG_IOSFPC, reg);
4167 }
4168 /*
4169 * Work-around descriptor data corruption issue during
4170 * NFS v2 UDP traffic, just disable the NFS filtering
4171 * capability.
4172 */
4173 reg = CSR_READ(sc, WMREG_RFCTL);
4174 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS;
4175 CSR_WRITE(sc, WMREG_RFCTL, reg);
4176 break;
4177 default:
4178 break;
4179 }
4180 CSR_WRITE(sc, WMREG_TARC0, tarc0);
4181
4182 switch (sc->sc_type) {
4183 /*
4184 * 8257[12] Errata No.52, 82573 Errata No.43 and some others.
4185 * Avoid RSS Hash Value bug.
4186 */
4187 case WM_T_82571:
4188 case WM_T_82572:
4189 case WM_T_82573:
4190 case WM_T_80003:
4191 case WM_T_ICH8:
4192 reg = CSR_READ(sc, WMREG_RFCTL);
4193 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
4194 CSR_WRITE(sc, WMREG_RFCTL, reg);
4195 break;
4196 case WM_T_82574:
4197 /* use extened Rx descriptor. */
4198 reg = CSR_READ(sc, WMREG_RFCTL);
4199 reg |= WMREG_RFCTL_EXSTEN;
4200 CSR_WRITE(sc, WMREG_RFCTL, reg);
4201 break;
4202 default:
4203 break;
4204 }
4205 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) {
4206 /*
4207 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24,
4208 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11:
4209 * "Certain Malformed IPv6 Extension Headers are Not Processed
4210 * Correctly by the Device"
4211 *
4212 * I354(C2000) Errata AVR53:
4213 * "Malformed IPv6 Extension Headers May Result in LAN Device
4214 * Hang"
4215 */
4216 reg = CSR_READ(sc, WMREG_RFCTL);
4217 reg |= WMREG_RFCTL_IPV6EXDIS;
4218 CSR_WRITE(sc, WMREG_RFCTL, reg);
4219 }
4220 }
4221
4222 static uint32_t
4223 wm_rxpbs_adjust_82580(uint32_t val)
4224 {
4225 uint32_t rv = 0;
4226
4227 if (val < __arraycount(wm_82580_rxpbs_table))
4228 rv = wm_82580_rxpbs_table[val];
4229
4230 return rv;
4231 }
4232
4233 /*
4234 * wm_reset_phy:
4235 *
4236 * generic PHY reset function.
4237 * Same as e1000_phy_hw_reset_generic()
4238 */
4239 static void
4240 wm_reset_phy(struct wm_softc *sc)
4241 {
4242 uint32_t reg;
4243
4244 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4245 device_xname(sc->sc_dev), __func__));
4246 if (wm_phy_resetisblocked(sc))
4247 return;
4248
4249 sc->phy.acquire(sc);
4250
4251 reg = CSR_READ(sc, WMREG_CTRL);
4252 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
4253 CSR_WRITE_FLUSH(sc);
4254
4255 delay(sc->phy.reset_delay_us);
4256
4257 CSR_WRITE(sc, WMREG_CTRL, reg);
4258 CSR_WRITE_FLUSH(sc);
4259
4260 delay(150);
4261
4262 sc->phy.release(sc);
4263
4264 wm_get_cfg_done(sc);
4265 wm_phy_post_reset(sc);
4266 }
4267
4268 /*
4269 * Only used by WM_T_PCH_SPT which does not use multiqueue,
4270 * so it is enough to check sc->sc_queue[0] only.
4271 */
4272 static void
4273 wm_flush_desc_rings(struct wm_softc *sc)
4274 {
4275 pcireg_t preg;
4276 uint32_t reg;
4277 struct wm_txqueue *txq;
4278 wiseman_txdesc_t *txd;
4279 int nexttx;
4280 uint32_t rctl;
4281
4282 /* First, disable MULR fix in FEXTNVM11 */
4283 reg = CSR_READ(sc, WMREG_FEXTNVM11);
4284 reg |= FEXTNVM11_DIS_MULRFIX;
4285 CSR_WRITE(sc, WMREG_FEXTNVM11, reg);
4286
4287 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4288 reg = CSR_READ(sc, WMREG_TDLEN(0));
4289 if (((preg & DESCRING_STATUS_FLUSH_REQ) == 0) || (reg == 0))
4290 return;
4291
4292 /* TX */
4293 printf("%s: Need TX flush (reg = %08x, len = %u)\n",
4294 device_xname(sc->sc_dev), preg, reg);
4295 reg = CSR_READ(sc, WMREG_TCTL);
4296 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN);
4297
4298 txq = &sc->sc_queue[0].wmq_txq;
4299 nexttx = txq->txq_next;
4300 txd = &txq->txq_descs[nexttx];
4301 wm_set_dma_addr(&txd->wtx_addr, WM_CDTXADDR(txq, nexttx));
4302 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS| 512);
4303 txd->wtx_fields.wtxu_status = 0;
4304 txd->wtx_fields.wtxu_options = 0;
4305 txd->wtx_fields.wtxu_vlan = 0;
4306
4307 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4308 BUS_SPACE_BARRIER_WRITE);
4309
4310 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
4311 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next);
4312 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4313 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
4314 delay(250);
4315
4316 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4317 if ((preg & DESCRING_STATUS_FLUSH_REQ) == 0)
4318 return;
4319
4320 /* RX */
4321 printf("%s: Need RX flush (reg = %08x)\n",
4322 device_xname(sc->sc_dev), preg);
4323 rctl = CSR_READ(sc, WMREG_RCTL);
4324 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4325 CSR_WRITE_FLUSH(sc);
4326 delay(150);
4327
4328 reg = CSR_READ(sc, WMREG_RXDCTL(0));
4329 /* zero the lower 14 bits (prefetch and host thresholds) */
4330 reg &= 0xffffc000;
4331 /*
4332 * update thresholds: prefetch threshold to 31, host threshold
4333 * to 1 and make sure the granularity is "descriptors" and not
4334 * "cache lines"
4335 */
4336 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN);
4337 CSR_WRITE(sc, WMREG_RXDCTL(0), reg);
4338
4339 /*
4340 * momentarily enable the RX ring for the changes to take
4341 * effect
4342 */
4343 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN);
4344 CSR_WRITE_FLUSH(sc);
4345 delay(150);
4346 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4347 }
4348
4349 /*
4350 * wm_reset:
4351 *
4352 * Reset the i82542 chip.
4353 */
4354 static void
4355 wm_reset(struct wm_softc *sc)
4356 {
4357 int phy_reset = 0;
4358 int i, error = 0;
4359 uint32_t reg;
4360 uint16_t kmreg;
4361 int rv;
4362
4363 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4364 device_xname(sc->sc_dev), __func__));
4365 KASSERT(sc->sc_type != 0);
4366
4367 /*
4368 * Allocate on-chip memory according to the MTU size.
4369 * The Packet Buffer Allocation register must be written
4370 * before the chip is reset.
4371 */
4372 switch (sc->sc_type) {
4373 case WM_T_82547:
4374 case WM_T_82547_2:
4375 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4376 PBA_22K : PBA_30K;
4377 for (i = 0; i < sc->sc_nqueues; i++) {
4378 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
4379 txq->txq_fifo_head = 0;
4380 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT;
4381 txq->txq_fifo_size =
4382 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT;
4383 txq->txq_fifo_stall = 0;
4384 }
4385 break;
4386 case WM_T_82571:
4387 case WM_T_82572:
4388 case WM_T_82575: /* XXX need special handing for jumbo frames */
4389 case WM_T_80003:
4390 sc->sc_pba = PBA_32K;
4391 break;
4392 case WM_T_82573:
4393 sc->sc_pba = PBA_12K;
4394 break;
4395 case WM_T_82574:
4396 case WM_T_82583:
4397 sc->sc_pba = PBA_20K;
4398 break;
4399 case WM_T_82576:
4400 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS);
4401 sc->sc_pba &= RXPBS_SIZE_MASK_82576;
4402 break;
4403 case WM_T_82580:
4404 case WM_T_I350:
4405 case WM_T_I354:
4406 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS));
4407 break;
4408 case WM_T_I210:
4409 case WM_T_I211:
4410 sc->sc_pba = PBA_34K;
4411 break;
4412 case WM_T_ICH8:
4413 /* Workaround for a bit corruption issue in FIFO memory */
4414 sc->sc_pba = PBA_8K;
4415 CSR_WRITE(sc, WMREG_PBS, PBA_16K);
4416 break;
4417 case WM_T_ICH9:
4418 case WM_T_ICH10:
4419 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ?
4420 PBA_14K : PBA_10K;
4421 break;
4422 case WM_T_PCH:
4423 case WM_T_PCH2:
4424 case WM_T_PCH_LPT:
4425 case WM_T_PCH_SPT:
4426 sc->sc_pba = PBA_26K;
4427 break;
4428 default:
4429 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4430 PBA_40K : PBA_48K;
4431 break;
4432 }
4433 /*
4434 * Only old or non-multiqueue devices have the PBA register
4435 * XXX Need special handling for 82575.
4436 */
4437 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0)
4438 || (sc->sc_type == WM_T_82575))
4439 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba);
4440
4441 /* Prevent the PCI-E bus from sticking */
4442 if (sc->sc_flags & WM_F_PCIE) {
4443 int timeout = 800;
4444
4445 sc->sc_ctrl |= CTRL_GIO_M_DIS;
4446 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4447
4448 while (timeout--) {
4449 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA)
4450 == 0)
4451 break;
4452 delay(100);
4453 }
4454 if (timeout == 0)
4455 device_printf(sc->sc_dev,
4456 "failed to disable busmastering\n");
4457 }
4458
4459 /* Set the completion timeout for interface */
4460 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
4461 || (sc->sc_type == WM_T_82580)
4462 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
4463 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
4464 wm_set_pcie_completion_timeout(sc);
4465
4466 /* Clear interrupt */
4467 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4468 if (wm_is_using_msix(sc)) {
4469 if (sc->sc_type != WM_T_82574) {
4470 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4471 CSR_WRITE(sc, WMREG_EIAC, 0);
4472 } else {
4473 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4474 }
4475 }
4476
4477 /* Stop the transmit and receive processes. */
4478 CSR_WRITE(sc, WMREG_RCTL, 0);
4479 sc->sc_rctl &= ~RCTL_EN;
4480 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP);
4481 CSR_WRITE_FLUSH(sc);
4482
4483 /* XXX set_tbi_sbp_82543() */
4484
4485 delay(10*1000);
4486
4487 /* Must acquire the MDIO ownership before MAC reset */
4488 switch (sc->sc_type) {
4489 case WM_T_82573:
4490 case WM_T_82574:
4491 case WM_T_82583:
4492 error = wm_get_hw_semaphore_82573(sc);
4493 break;
4494 default:
4495 break;
4496 }
4497
4498 /*
4499 * 82541 Errata 29? & 82547 Errata 28?
4500 * See also the description about PHY_RST bit in CTRL register
4501 * in 8254x_GBe_SDM.pdf.
4502 */
4503 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) {
4504 CSR_WRITE(sc, WMREG_CTRL,
4505 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET);
4506 CSR_WRITE_FLUSH(sc);
4507 delay(5000);
4508 }
4509
4510 switch (sc->sc_type) {
4511 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */
4512 case WM_T_82541:
4513 case WM_T_82541_2:
4514 case WM_T_82547:
4515 case WM_T_82547_2:
4516 /*
4517 * On some chipsets, a reset through a memory-mapped write
4518 * cycle can cause the chip to reset before completing the
4519 * write cycle. This causes major headache that can be
4520 * avoided by issuing the reset via indirect register writes
4521 * through I/O space.
4522 *
4523 * So, if we successfully mapped the I/O BAR at attach time,
4524 * use that. Otherwise, try our luck with a memory-mapped
4525 * reset.
4526 */
4527 if (sc->sc_flags & WM_F_IOH_VALID)
4528 wm_io_write(sc, WMREG_CTRL, CTRL_RST);
4529 else
4530 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
4531 break;
4532 case WM_T_82545_3:
4533 case WM_T_82546_3:
4534 /* Use the shadow control register on these chips. */
4535 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST);
4536 break;
4537 case WM_T_80003:
4538 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4539 sc->phy.acquire(sc);
4540 CSR_WRITE(sc, WMREG_CTRL, reg);
4541 sc->phy.release(sc);
4542 break;
4543 case WM_T_ICH8:
4544 case WM_T_ICH9:
4545 case WM_T_ICH10:
4546 case WM_T_PCH:
4547 case WM_T_PCH2:
4548 case WM_T_PCH_LPT:
4549 case WM_T_PCH_SPT:
4550 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4551 if (wm_phy_resetisblocked(sc) == false) {
4552 /*
4553 * Gate automatic PHY configuration by hardware on
4554 * non-managed 82579
4555 */
4556 if ((sc->sc_type == WM_T_PCH2)
4557 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID)
4558 == 0))
4559 wm_gate_hw_phy_config_ich8lan(sc, true);
4560
4561 reg |= CTRL_PHY_RESET;
4562 phy_reset = 1;
4563 } else
4564 printf("XXX reset is blocked!!!\n");
4565 sc->phy.acquire(sc);
4566 CSR_WRITE(sc, WMREG_CTRL, reg);
4567 /* Don't insert a completion barrier when reset */
4568 delay(20*1000);
4569 mutex_exit(sc->sc_ich_phymtx);
4570 break;
4571 case WM_T_82580:
4572 case WM_T_I350:
4573 case WM_T_I354:
4574 case WM_T_I210:
4575 case WM_T_I211:
4576 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
4577 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII)
4578 CSR_WRITE_FLUSH(sc);
4579 delay(5000);
4580 break;
4581 case WM_T_82542_2_0:
4582 case WM_T_82542_2_1:
4583 case WM_T_82543:
4584 case WM_T_82540:
4585 case WM_T_82545:
4586 case WM_T_82546:
4587 case WM_T_82571:
4588 case WM_T_82572:
4589 case WM_T_82573:
4590 case WM_T_82574:
4591 case WM_T_82575:
4592 case WM_T_82576:
4593 case WM_T_82583:
4594 default:
4595 /* Everything else can safely use the documented method. */
4596 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
4597 break;
4598 }
4599
4600 /* Must release the MDIO ownership after MAC reset */
4601 switch (sc->sc_type) {
4602 case WM_T_82573:
4603 case WM_T_82574:
4604 case WM_T_82583:
4605 if (error == 0)
4606 wm_put_hw_semaphore_82573(sc);
4607 break;
4608 default:
4609 break;
4610 }
4611
4612 if (phy_reset != 0)
4613 wm_get_cfg_done(sc);
4614
4615 /* reload EEPROM */
4616 switch (sc->sc_type) {
4617 case WM_T_82542_2_0:
4618 case WM_T_82542_2_1:
4619 case WM_T_82543:
4620 case WM_T_82544:
4621 delay(10);
4622 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
4623 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4624 CSR_WRITE_FLUSH(sc);
4625 delay(2000);
4626 break;
4627 case WM_T_82540:
4628 case WM_T_82545:
4629 case WM_T_82545_3:
4630 case WM_T_82546:
4631 case WM_T_82546_3:
4632 delay(5*1000);
4633 /* XXX Disable HW ARPs on ASF enabled adapters */
4634 break;
4635 case WM_T_82541:
4636 case WM_T_82541_2:
4637 case WM_T_82547:
4638 case WM_T_82547_2:
4639 delay(20000);
4640 /* XXX Disable HW ARPs on ASF enabled adapters */
4641 break;
4642 case WM_T_82571:
4643 case WM_T_82572:
4644 case WM_T_82573:
4645 case WM_T_82574:
4646 case WM_T_82583:
4647 if (sc->sc_flags & WM_F_EEPROM_FLASH) {
4648 delay(10);
4649 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
4650 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4651 CSR_WRITE_FLUSH(sc);
4652 }
4653 /* check EECD_EE_AUTORD */
4654 wm_get_auto_rd_done(sc);
4655 /*
4656 * Phy configuration from NVM just starts after EECD_AUTO_RD
4657 * is set.
4658 */
4659 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574)
4660 || (sc->sc_type == WM_T_82583))
4661 delay(25*1000);
4662 break;
4663 case WM_T_82575:
4664 case WM_T_82576:
4665 case WM_T_82580:
4666 case WM_T_I350:
4667 case WM_T_I354:
4668 case WM_T_I210:
4669 case WM_T_I211:
4670 case WM_T_80003:
4671 /* check EECD_EE_AUTORD */
4672 wm_get_auto_rd_done(sc);
4673 break;
4674 case WM_T_ICH8:
4675 case WM_T_ICH9:
4676 case WM_T_ICH10:
4677 case WM_T_PCH:
4678 case WM_T_PCH2:
4679 case WM_T_PCH_LPT:
4680 case WM_T_PCH_SPT:
4681 break;
4682 default:
4683 panic("%s: unknown type\n", __func__);
4684 }
4685
4686 /* Check whether EEPROM is present or not */
4687 switch (sc->sc_type) {
4688 case WM_T_82575:
4689 case WM_T_82576:
4690 case WM_T_82580:
4691 case WM_T_I350:
4692 case WM_T_I354:
4693 case WM_T_ICH8:
4694 case WM_T_ICH9:
4695 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) {
4696 /* Not found */
4697 sc->sc_flags |= WM_F_EEPROM_INVALID;
4698 if (sc->sc_type == WM_T_82575)
4699 wm_reset_init_script_82575(sc);
4700 }
4701 break;
4702 default:
4703 break;
4704 }
4705
4706 if (phy_reset != 0)
4707 wm_phy_post_reset(sc);
4708
4709 if ((sc->sc_type == WM_T_82580)
4710 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) {
4711 /* clear global device reset status bit */
4712 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET);
4713 }
4714
4715 /* Clear any pending interrupt events. */
4716 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4717 reg = CSR_READ(sc, WMREG_ICR);
4718 if (wm_is_using_msix(sc)) {
4719 if (sc->sc_type != WM_T_82574) {
4720 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4721 CSR_WRITE(sc, WMREG_EIAC, 0);
4722 } else
4723 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4724 }
4725
4726 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
4727 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
4728 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
4729 || (sc->sc_type == WM_T_PCH_SPT)) {
4730 reg = CSR_READ(sc, WMREG_KABGTXD);
4731 reg |= KABGTXD_BGSQLBIAS;
4732 CSR_WRITE(sc, WMREG_KABGTXD, reg);
4733 }
4734
4735 /* reload sc_ctrl */
4736 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
4737
4738 if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211))
4739 wm_set_eee_i350(sc);
4740
4741 /*
4742 * For PCH, this write will make sure that any noise will be detected
4743 * as a CRC error and be dropped rather than show up as a bad packet
4744 * to the DMA engine
4745 */
4746 if (sc->sc_type == WM_T_PCH)
4747 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565);
4748
4749 if (sc->sc_type >= WM_T_82544)
4750 CSR_WRITE(sc, WMREG_WUC, 0);
4751
4752 wm_reset_mdicnfg_82580(sc);
4753
4754 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
4755 wm_pll_workaround_i210(sc);
4756
4757 if (sc->sc_type == WM_T_80003) {
4758 /* default to TRUE to enable the MDIC W/A */
4759 sc->sc_flags |= WM_F_80003_MDIC_WA;
4760
4761 rv = wm_kmrn_readreg(sc,
4762 KUMCTRLSTA_OFFSET >> KUMCTRLSTA_OFFSET_SHIFT, &kmreg);
4763 if (rv == 0) {
4764 if ((kmreg & KUMCTRLSTA_OPMODE_MASK)
4765 == KUMCTRLSTA_OPMODE_INBAND_MDIO)
4766 sc->sc_flags &= ~WM_F_80003_MDIC_WA;
4767 else
4768 sc->sc_flags |= WM_F_80003_MDIC_WA;
4769 }
4770 }
4771 }
4772
4773 /*
4774 * wm_add_rxbuf:
4775 *
4776 * Add a receive buffer to the indiciated descriptor.
4777 */
4778 static int
4779 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx)
4780 {
4781 struct wm_softc *sc = rxq->rxq_sc;
4782 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx];
4783 struct mbuf *m;
4784 int error;
4785
4786 KASSERT(mutex_owned(rxq->rxq_lock));
4787
4788 MGETHDR(m, M_DONTWAIT, MT_DATA);
4789 if (m == NULL)
4790 return ENOBUFS;
4791
4792 MCLGET(m, M_DONTWAIT);
4793 if ((m->m_flags & M_EXT) == 0) {
4794 m_freem(m);
4795 return ENOBUFS;
4796 }
4797
4798 if (rxs->rxs_mbuf != NULL)
4799 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
4800
4801 rxs->rxs_mbuf = m;
4802
4803 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
4804 error = bus_dmamap_load_mbuf(sc->sc_dmat, rxs->rxs_dmamap, m,
4805 BUS_DMA_READ | BUS_DMA_NOWAIT);
4806 if (error) {
4807 /* XXX XXX XXX */
4808 aprint_error_dev(sc->sc_dev,
4809 "unable to load rx DMA map %d, error = %d\n",
4810 idx, error);
4811 panic("wm_add_rxbuf");
4812 }
4813
4814 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
4815 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
4816
4817 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
4818 if ((sc->sc_rctl & RCTL_EN) != 0)
4819 wm_init_rxdesc(rxq, idx);
4820 } else
4821 wm_init_rxdesc(rxq, idx);
4822
4823 return 0;
4824 }
4825
4826 /*
4827 * wm_rxdrain:
4828 *
4829 * Drain the receive queue.
4830 */
4831 static void
4832 wm_rxdrain(struct wm_rxqueue *rxq)
4833 {
4834 struct wm_softc *sc = rxq->rxq_sc;
4835 struct wm_rxsoft *rxs;
4836 int i;
4837
4838 KASSERT(mutex_owned(rxq->rxq_lock));
4839
4840 for (i = 0; i < WM_NRXDESC; i++) {
4841 rxs = &rxq->rxq_soft[i];
4842 if (rxs->rxs_mbuf != NULL) {
4843 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
4844 m_freem(rxs->rxs_mbuf);
4845 rxs->rxs_mbuf = NULL;
4846 }
4847 }
4848 }
4849
4850 /*
4851 * Setup registers for RSS.
4852 *
4853 * XXX not yet VMDq support
4854 */
4855 static void
4856 wm_init_rss(struct wm_softc *sc)
4857 {
4858 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS];
4859 int i;
4860
4861 CTASSERT(sizeof(rss_key) == RSS_KEYSIZE);
4862
4863 for (i = 0; i < RETA_NUM_ENTRIES; i++) {
4864 int qid, reta_ent;
4865
4866 qid = i % sc->sc_nqueues;
4867 switch(sc->sc_type) {
4868 case WM_T_82574:
4869 reta_ent = __SHIFTIN(qid,
4870 RETA_ENT_QINDEX_MASK_82574);
4871 break;
4872 case WM_T_82575:
4873 reta_ent = __SHIFTIN(qid,
4874 RETA_ENT_QINDEX1_MASK_82575);
4875 break;
4876 default:
4877 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK);
4878 break;
4879 }
4880
4881 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i));
4882 reta_reg &= ~RETA_ENTRY_MASK_Q(i);
4883 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i));
4884 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg);
4885 }
4886
4887 rss_getkey((uint8_t *)rss_key);
4888 for (i = 0; i < RSSRK_NUM_REGS; i++)
4889 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]);
4890
4891 if (sc->sc_type == WM_T_82574)
4892 mrqc = MRQC_ENABLE_RSS_MQ_82574;
4893 else
4894 mrqc = MRQC_ENABLE_RSS_MQ;
4895
4896 /*
4897 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata.
4898 * See IPV6EXDIS bit in wm_initialize_hardware_bits().
4899 */
4900 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP);
4901 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP);
4902 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP);
4903 mrqc |= (MRQC_RSS_FIELD_IPV6_UDP_EX | MRQC_RSS_FIELD_IPV6_TCP_EX);
4904
4905 CSR_WRITE(sc, WMREG_MRQC, mrqc);
4906 }
4907
4908 /*
4909 * Adjust TX and RX queue numbers which the system actulally uses.
4910 *
4911 * The numbers are affected by below parameters.
4912 * - The nubmer of hardware queues
4913 * - The number of MSI-X vectors (= "nvectors" argument)
4914 * - ncpu
4915 */
4916 static void
4917 wm_adjust_qnum(struct wm_softc *sc, int nvectors)
4918 {
4919 int hw_ntxqueues, hw_nrxqueues, hw_nqueues;
4920
4921 if (nvectors < 2) {
4922 sc->sc_nqueues = 1;
4923 return;
4924 }
4925
4926 switch(sc->sc_type) {
4927 case WM_T_82572:
4928 hw_ntxqueues = 2;
4929 hw_nrxqueues = 2;
4930 break;
4931 case WM_T_82574:
4932 hw_ntxqueues = 2;
4933 hw_nrxqueues = 2;
4934 break;
4935 case WM_T_82575:
4936 hw_ntxqueues = 4;
4937 hw_nrxqueues = 4;
4938 break;
4939 case WM_T_82576:
4940 hw_ntxqueues = 16;
4941 hw_nrxqueues = 16;
4942 break;
4943 case WM_T_82580:
4944 case WM_T_I350:
4945 case WM_T_I354:
4946 hw_ntxqueues = 8;
4947 hw_nrxqueues = 8;
4948 break;
4949 case WM_T_I210:
4950 hw_ntxqueues = 4;
4951 hw_nrxqueues = 4;
4952 break;
4953 case WM_T_I211:
4954 hw_ntxqueues = 2;
4955 hw_nrxqueues = 2;
4956 break;
4957 /*
4958 * As below ethernet controllers does not support MSI-X,
4959 * this driver let them not use multiqueue.
4960 * - WM_T_80003
4961 * - WM_T_ICH8
4962 * - WM_T_ICH9
4963 * - WM_T_ICH10
4964 * - WM_T_PCH
4965 * - WM_T_PCH2
4966 * - WM_T_PCH_LPT
4967 */
4968 default:
4969 hw_ntxqueues = 1;
4970 hw_nrxqueues = 1;
4971 break;
4972 }
4973
4974 hw_nqueues = min(hw_ntxqueues, hw_nrxqueues);
4975
4976 /*
4977 * As queues more than MSI-X vectors cannot improve scaling, we limit
4978 * the number of queues used actually.
4979 */
4980 if (nvectors < hw_nqueues + 1) {
4981 sc->sc_nqueues = nvectors - 1;
4982 } else {
4983 sc->sc_nqueues = hw_nqueues;
4984 }
4985
4986 /*
4987 * As queues more then cpus cannot improve scaling, we limit
4988 * the number of queues used actually.
4989 */
4990 if (ncpu < sc->sc_nqueues)
4991 sc->sc_nqueues = ncpu;
4992 }
4993
4994 static inline bool
4995 wm_is_using_msix(struct wm_softc *sc)
4996 {
4997
4998 return (sc->sc_nintrs > 1);
4999 }
5000
5001 static inline bool
5002 wm_is_using_multiqueue(struct wm_softc *sc)
5003 {
5004
5005 return (sc->sc_nqueues > 1);
5006 }
5007
5008 static int
5009 wm_softint_establish(struct wm_softc *sc, int qidx, int intr_idx)
5010 {
5011 struct wm_queue *wmq = &sc->sc_queue[qidx];
5012 wmq->wmq_id = qidx;
5013 wmq->wmq_intr_idx = intr_idx;
5014 wmq->wmq_si = softint_establish(SOFTINT_NET
5015 #ifdef WM_MPSAFE
5016 | SOFTINT_MPSAFE
5017 #endif
5018 , wm_handle_queue, wmq);
5019 if (wmq->wmq_si != NULL)
5020 return 0;
5021
5022 aprint_error_dev(sc->sc_dev, "unable to establish queue[%d] handler\n",
5023 wmq->wmq_id);
5024
5025 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[wmq->wmq_intr_idx]);
5026 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5027 return ENOMEM;
5028 }
5029
5030 /*
5031 * Both single interrupt MSI and INTx can use this function.
5032 */
5033 static int
5034 wm_setup_legacy(struct wm_softc *sc)
5035 {
5036 pci_chipset_tag_t pc = sc->sc_pc;
5037 const char *intrstr = NULL;
5038 char intrbuf[PCI_INTRSTR_LEN];
5039 int error;
5040
5041 error = wm_alloc_txrx_queues(sc);
5042 if (error) {
5043 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5044 error);
5045 return ENOMEM;
5046 }
5047 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf,
5048 sizeof(intrbuf));
5049 #ifdef WM_MPSAFE
5050 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true);
5051 #endif
5052 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
5053 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev));
5054 if (sc->sc_ihs[0] == NULL) {
5055 aprint_error_dev(sc->sc_dev,"unable to establish %s\n",
5056 (pci_intr_type(pc, sc->sc_intrs[0])
5057 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
5058 return ENOMEM;
5059 }
5060
5061 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
5062 sc->sc_nintrs = 1;
5063
5064 return wm_softint_establish(sc, 0, 0);
5065 }
5066
5067 static int
5068 wm_setup_msix(struct wm_softc *sc)
5069 {
5070 void *vih;
5071 kcpuset_t *affinity;
5072 int qidx, error, intr_idx, txrx_established;
5073 pci_chipset_tag_t pc = sc->sc_pc;
5074 const char *intrstr = NULL;
5075 char intrbuf[PCI_INTRSTR_LEN];
5076 char intr_xname[INTRDEVNAMEBUF];
5077
5078 if (sc->sc_nqueues < ncpu) {
5079 /*
5080 * To avoid other devices' interrupts, the affinity of Tx/Rx
5081 * interrupts start from CPU#1.
5082 */
5083 sc->sc_affinity_offset = 1;
5084 } else {
5085 /*
5086 * In this case, this device use all CPUs. So, we unify
5087 * affinitied cpu_index to msix vector number for readability.
5088 */
5089 sc->sc_affinity_offset = 0;
5090 }
5091
5092 error = wm_alloc_txrx_queues(sc);
5093 if (error) {
5094 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5095 error);
5096 return ENOMEM;
5097 }
5098
5099 kcpuset_create(&affinity, false);
5100 intr_idx = 0;
5101
5102 /*
5103 * TX and RX
5104 */
5105 txrx_established = 0;
5106 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5107 struct wm_queue *wmq = &sc->sc_queue[qidx];
5108 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu;
5109
5110 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5111 sizeof(intrbuf));
5112 #ifdef WM_MPSAFE
5113 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx],
5114 PCI_INTR_MPSAFE, true);
5115 #endif
5116 memset(intr_xname, 0, sizeof(intr_xname));
5117 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d",
5118 device_xname(sc->sc_dev), qidx);
5119 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5120 IPL_NET, wm_txrxintr_msix, wmq, intr_xname);
5121 if (vih == NULL) {
5122 aprint_error_dev(sc->sc_dev,
5123 "unable to establish MSI-X(for TX and RX)%s%s\n",
5124 intrstr ? " at " : "",
5125 intrstr ? intrstr : "");
5126
5127 goto fail;
5128 }
5129 kcpuset_zero(affinity);
5130 /* Round-robin affinity */
5131 kcpuset_set(affinity, affinity_to);
5132 error = interrupt_distribute(vih, affinity, NULL);
5133 if (error == 0) {
5134 aprint_normal_dev(sc->sc_dev,
5135 "for TX and RX interrupting at %s affinity to %u\n",
5136 intrstr, affinity_to);
5137 } else {
5138 aprint_normal_dev(sc->sc_dev,
5139 "for TX and RX interrupting at %s\n", intrstr);
5140 }
5141 sc->sc_ihs[intr_idx] = vih;
5142 if (wm_softint_establish(sc, qidx, intr_idx) != 0)
5143 goto fail;
5144 txrx_established++;
5145 intr_idx++;
5146 }
5147
5148 /*
5149 * LINK
5150 */
5151 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5152 sizeof(intrbuf));
5153 #ifdef WM_MPSAFE
5154 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true);
5155 #endif
5156 memset(intr_xname, 0, sizeof(intr_xname));
5157 snprintf(intr_xname, sizeof(intr_xname), "%sLINK",
5158 device_xname(sc->sc_dev));
5159 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5160 IPL_NET, wm_linkintr_msix, sc, intr_xname);
5161 if (vih == NULL) {
5162 aprint_error_dev(sc->sc_dev,
5163 "unable to establish MSI-X(for LINK)%s%s\n",
5164 intrstr ? " at " : "",
5165 intrstr ? intrstr : "");
5166
5167 goto fail;
5168 }
5169 /* keep default affinity to LINK interrupt */
5170 aprint_normal_dev(sc->sc_dev,
5171 "for LINK interrupting at %s\n", intrstr);
5172 sc->sc_ihs[intr_idx] = vih;
5173 sc->sc_link_intr_idx = intr_idx;
5174
5175 sc->sc_nintrs = sc->sc_nqueues + 1;
5176 kcpuset_destroy(affinity);
5177 return 0;
5178
5179 fail:
5180 for (qidx = 0; qidx < txrx_established; qidx++) {
5181 struct wm_queue *wmq = &sc->sc_queue[qidx];
5182 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]);
5183 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5184 }
5185
5186 kcpuset_destroy(affinity);
5187 return ENOMEM;
5188 }
5189
5190 static void
5191 wm_unset_stopping_flags(struct wm_softc *sc)
5192 {
5193 int i;
5194
5195 KASSERT(WM_CORE_LOCKED(sc));
5196
5197 /*
5198 * must unset stopping flags in ascending order.
5199 */
5200 for(i = 0; i < sc->sc_nqueues; i++) {
5201 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5202 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5203
5204 mutex_enter(txq->txq_lock);
5205 txq->txq_stopping = false;
5206 mutex_exit(txq->txq_lock);
5207
5208 mutex_enter(rxq->rxq_lock);
5209 rxq->rxq_stopping = false;
5210 mutex_exit(rxq->rxq_lock);
5211 }
5212
5213 sc->sc_core_stopping = false;
5214 }
5215
5216 static void
5217 wm_set_stopping_flags(struct wm_softc *sc)
5218 {
5219 int i;
5220
5221 KASSERT(WM_CORE_LOCKED(sc));
5222
5223 sc->sc_core_stopping = true;
5224
5225 /*
5226 * must set stopping flags in ascending order.
5227 */
5228 for(i = 0; i < sc->sc_nqueues; i++) {
5229 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5230 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5231
5232 mutex_enter(rxq->rxq_lock);
5233 rxq->rxq_stopping = true;
5234 mutex_exit(rxq->rxq_lock);
5235
5236 mutex_enter(txq->txq_lock);
5237 txq->txq_stopping = true;
5238 mutex_exit(txq->txq_lock);
5239 }
5240 }
5241
5242 /*
5243 * write interrupt interval value to ITR or EITR
5244 */
5245 static void
5246 wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq)
5247 {
5248
5249 if (!wmq->wmq_set_itr)
5250 return;
5251
5252 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5253 uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK);
5254
5255 /*
5256 * 82575 doesn't have CNT_INGR field.
5257 * So, overwrite counter field by software.
5258 */
5259 if (sc->sc_type == WM_T_82575)
5260 eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575);
5261 else
5262 eitr |= EITR_CNT_INGR;
5263
5264 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx), eitr);
5265 } else if (sc->sc_type == WM_T_82574 && wm_is_using_msix(sc)) {
5266 /*
5267 * 82574 has both ITR and EITR. SET EITR when we use
5268 * the multi queue function with MSI-X.
5269 */
5270 CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx),
5271 wmq->wmq_itr & EITR_ITR_INT_MASK_82574);
5272 } else {
5273 KASSERT(wmq->wmq_id == 0);
5274 CSR_WRITE(sc, WMREG_ITR, wmq->wmq_itr);
5275 }
5276
5277 wmq->wmq_set_itr = false;
5278 }
5279
5280 /*
5281 * TODO
5282 * Below dynamic calculation of itr is almost the same as linux igb,
5283 * however it does not fit to wm(4). So, we will have been disable AIM
5284 * until we will find appropriate calculation of itr.
5285 */
5286 /*
5287 * calculate interrupt interval value to be going to write register in
5288 * wm_itrs_writereg(). This function does not write ITR/EITR register.
5289 */
5290 static void
5291 wm_itrs_calculate(struct wm_softc *sc, struct wm_queue *wmq)
5292 {
5293 #ifdef NOTYET
5294 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
5295 struct wm_txqueue *txq = &wmq->wmq_txq;
5296 uint32_t avg_size = 0;
5297 uint32_t new_itr;
5298
5299 if (rxq->rxq_packets)
5300 avg_size = rxq->rxq_bytes / rxq->rxq_packets;
5301 if (txq->txq_packets)
5302 avg_size = max(avg_size, txq->txq_bytes / txq->txq_packets);
5303
5304 if (avg_size == 0) {
5305 new_itr = 450; /* restore default value */
5306 goto out;
5307 }
5308
5309 /* Add 24 bytes to size to account for CRC, preamble, and gap */
5310 avg_size += 24;
5311
5312 /* Don't starve jumbo frames */
5313 avg_size = min(avg_size, 3000);
5314
5315 /* Give a little boost to mid-size frames */
5316 if ((avg_size > 300) && (avg_size < 1200))
5317 new_itr = avg_size / 3;
5318 else
5319 new_itr = avg_size / 2;
5320
5321 out:
5322 /*
5323 * The usage of 82574 and 82575 EITR is different from otther NEWQUEUE
5324 * controllers. See sc->sc_itr_init setting in wm_init_locked().
5325 */
5326 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0 || sc->sc_type != WM_T_82575)
5327 new_itr *= 4;
5328
5329 if (new_itr != wmq->wmq_itr) {
5330 wmq->wmq_itr = new_itr;
5331 wmq->wmq_set_itr = true;
5332 } else
5333 wmq->wmq_set_itr = false;
5334
5335 rxq->rxq_packets = 0;
5336 rxq->rxq_bytes = 0;
5337 txq->txq_packets = 0;
5338 txq->txq_bytes = 0;
5339 #endif
5340 }
5341
5342 /*
5343 * wm_init: [ifnet interface function]
5344 *
5345 * Initialize the interface.
5346 */
5347 static int
5348 wm_init(struct ifnet *ifp)
5349 {
5350 struct wm_softc *sc = ifp->if_softc;
5351 int ret;
5352
5353 WM_CORE_LOCK(sc);
5354 ret = wm_init_locked(ifp);
5355 WM_CORE_UNLOCK(sc);
5356
5357 return ret;
5358 }
5359
5360 static int
5361 wm_init_locked(struct ifnet *ifp)
5362 {
5363 struct wm_softc *sc = ifp->if_softc;
5364 int i, j, trynum, error = 0;
5365 uint32_t reg;
5366
5367 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5368 device_xname(sc->sc_dev), __func__));
5369 KASSERT(WM_CORE_LOCKED(sc));
5370
5371 /*
5372 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
5373 * There is a small but measurable benefit to avoiding the adjusment
5374 * of the descriptor so that the headers are aligned, for normal mtu,
5375 * on such platforms. One possibility is that the DMA itself is
5376 * slightly more efficient if the front of the entire packet (instead
5377 * of the front of the headers) is aligned.
5378 *
5379 * Note we must always set align_tweak to 0 if we are using
5380 * jumbo frames.
5381 */
5382 #ifdef __NO_STRICT_ALIGNMENT
5383 sc->sc_align_tweak = 0;
5384 #else
5385 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
5386 sc->sc_align_tweak = 0;
5387 else
5388 sc->sc_align_tweak = 2;
5389 #endif /* __NO_STRICT_ALIGNMENT */
5390
5391 /* Cancel any pending I/O. */
5392 wm_stop_locked(ifp, 0);
5393
5394 /* update statistics before reset */
5395 ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
5396 ifp->if_ierrors += CSR_READ(sc, WMREG_RXERRC);
5397
5398 /* PCH_SPT hardware workaround */
5399 if (sc->sc_type == WM_T_PCH_SPT)
5400 wm_flush_desc_rings(sc);
5401
5402 /* Reset the chip to a known state. */
5403 wm_reset(sc);
5404
5405 /*
5406 * AMT based hardware can now take control from firmware
5407 * Do this after reset.
5408 */
5409 if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
5410 wm_get_hw_control(sc);
5411
5412 if ((sc->sc_type == WM_T_PCH_SPT) &&
5413 pci_intr_type(sc->sc_pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_INTX)
5414 wm_legacy_irq_quirk_spt(sc);
5415
5416 /* Init hardware bits */
5417 wm_initialize_hardware_bits(sc);
5418
5419 /* Reset the PHY. */
5420 if (sc->sc_flags & WM_F_HAS_MII)
5421 wm_gmii_reset(sc);
5422
5423 /* Calculate (E)ITR value */
5424 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0 && sc->sc_type != WM_T_82575) {
5425 /*
5426 * For NEWQUEUE's EITR (except for 82575).
5427 * 82575's EITR should be set same throttling value as other
5428 * old controllers' ITR because the interrupt/sec calculation
5429 * is the same, that is, 1,000,000,000 / (N * 256).
5430 *
5431 * 82574's EITR should be set same throttling value as ITR.
5432 *
5433 * For N interrupts/sec, set this value to:
5434 * 1,000,000 / N in contrast to ITR throttoling value.
5435 */
5436 sc->sc_itr_init = 450;
5437 } else if (sc->sc_type >= WM_T_82543) {
5438 /*
5439 * Set up the interrupt throttling register (units of 256ns)
5440 * Note that a footnote in Intel's documentation says this
5441 * ticker runs at 1/4 the rate when the chip is in 100Mbit
5442 * or 10Mbit mode. Empirically, it appears to be the case
5443 * that that is also true for the 1024ns units of the other
5444 * interrupt-related timer registers -- so, really, we ought
5445 * to divide this value by 4 when the link speed is low.
5446 *
5447 * XXX implement this division at link speed change!
5448 */
5449
5450 /*
5451 * For N interrupts/sec, set this value to:
5452 * 1,000,000,000 / (N * 256). Note that we set the
5453 * absolute and packet timer values to this value
5454 * divided by 4 to get "simple timer" behavior.
5455 */
5456 sc->sc_itr_init = 1500; /* 2604 ints/sec */
5457 }
5458
5459 error = wm_init_txrx_queues(sc);
5460 if (error)
5461 goto out;
5462
5463 /*
5464 * Clear out the VLAN table -- we don't use it (yet).
5465 */
5466 CSR_WRITE(sc, WMREG_VET, 0);
5467 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
5468 trynum = 10; /* Due to hw errata */
5469 else
5470 trynum = 1;
5471 for (i = 0; i < WM_VLAN_TABSIZE; i++)
5472 for (j = 0; j < trynum; j++)
5473 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
5474
5475 /*
5476 * Set up flow-control parameters.
5477 *
5478 * XXX Values could probably stand some tuning.
5479 */
5480 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
5481 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH)
5482 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)
5483 && (sc->sc_type != WM_T_PCH_SPT)) {
5484 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
5485 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
5486 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
5487 }
5488
5489 sc->sc_fcrtl = FCRTL_DFLT;
5490 if (sc->sc_type < WM_T_82543) {
5491 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
5492 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl);
5493 } else {
5494 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
5495 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
5496 }
5497
5498 if (sc->sc_type == WM_T_80003)
5499 CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
5500 else
5501 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
5502
5503 /* Writes the control register. */
5504 wm_set_vlan(sc);
5505
5506 if (sc->sc_flags & WM_F_HAS_MII) {
5507 uint16_t kmreg;
5508
5509 switch (sc->sc_type) {
5510 case WM_T_80003:
5511 case WM_T_ICH8:
5512 case WM_T_ICH9:
5513 case WM_T_ICH10:
5514 case WM_T_PCH:
5515 case WM_T_PCH2:
5516 case WM_T_PCH_LPT:
5517 case WM_T_PCH_SPT:
5518 /*
5519 * Set the mac to wait the maximum time between each
5520 * iteration and increase the max iterations when
5521 * polling the phy; this fixes erroneous timeouts at
5522 * 10Mbps.
5523 */
5524 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
5525 0xFFFF);
5526 wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
5527 &kmreg);
5528 kmreg |= 0x3F;
5529 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
5530 kmreg);
5531 break;
5532 default:
5533 break;
5534 }
5535
5536 if (sc->sc_type == WM_T_80003) {
5537 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5538 reg &= ~CTRL_EXT_LINK_MODE_MASK;
5539 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5540
5541 /* Bypass RX and TX FIFO's */
5542 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
5543 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS
5544 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
5545 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
5546 KUMCTRLSTA_INB_CTRL_DIS_PADDING |
5547 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
5548 }
5549 }
5550 #if 0
5551 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
5552 #endif
5553
5554 /* Set up checksum offload parameters. */
5555 reg = CSR_READ(sc, WMREG_RXCSUM);
5556 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL);
5557 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
5558 reg |= RXCSUM_IPOFL;
5559 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx))
5560 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
5561 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
5562 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL;
5563 CSR_WRITE(sc, WMREG_RXCSUM, reg);
5564
5565 /* Set registers about MSI-X */
5566 if (wm_is_using_msix(sc)) {
5567 uint32_t ivar;
5568 struct wm_queue *wmq;
5569 int qid, qintr_idx;
5570
5571 if (sc->sc_type == WM_T_82575) {
5572 /* Interrupt control */
5573 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5574 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR;
5575 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5576
5577 /* TX and RX */
5578 for (i = 0; i < sc->sc_nqueues; i++) {
5579 wmq = &sc->sc_queue[i];
5580 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx),
5581 EITR_TX_QUEUE(wmq->wmq_id)
5582 | EITR_RX_QUEUE(wmq->wmq_id));
5583 }
5584 /* Link status */
5585 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx),
5586 EITR_OTHER);
5587 } else if (sc->sc_type == WM_T_82574) {
5588 /* Interrupt control */
5589 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5590 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME;
5591 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5592
5593 /*
5594 * workaround issue with spurious interrupts
5595 * in MSI-X mode.
5596 * At wm_initialize_hardware_bits(), sc_nintrs has not
5597 * initialized yet. So re-initialize WMREG_RFCTL here.
5598 */
5599 reg = CSR_READ(sc, WMREG_RFCTL);
5600 reg |= WMREG_RFCTL_ACKDIS;
5601 CSR_WRITE(sc, WMREG_RFCTL, reg);
5602
5603 ivar = 0;
5604 /* TX and RX */
5605 for (i = 0; i < sc->sc_nqueues; i++) {
5606 wmq = &sc->sc_queue[i];
5607 qid = wmq->wmq_id;
5608 qintr_idx = wmq->wmq_intr_idx;
5609
5610 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
5611 IVAR_TX_MASK_Q_82574(qid));
5612 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
5613 IVAR_RX_MASK_Q_82574(qid));
5614 }
5615 /* Link status */
5616 ivar |= __SHIFTIN((IVAR_VALID_82574
5617 | sc->sc_link_intr_idx), IVAR_OTHER_MASK);
5618 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB);
5619 } else {
5620 /* Interrupt control */
5621 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX
5622 | GPIE_EIAME | GPIE_PBA);
5623
5624 switch (sc->sc_type) {
5625 case WM_T_82580:
5626 case WM_T_I350:
5627 case WM_T_I354:
5628 case WM_T_I210:
5629 case WM_T_I211:
5630 /* TX and RX */
5631 for (i = 0; i < sc->sc_nqueues; i++) {
5632 wmq = &sc->sc_queue[i];
5633 qid = wmq->wmq_id;
5634 qintr_idx = wmq->wmq_intr_idx;
5635
5636 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid));
5637 ivar &= ~IVAR_TX_MASK_Q(qid);
5638 ivar |= __SHIFTIN((qintr_idx
5639 | IVAR_VALID),
5640 IVAR_TX_MASK_Q(qid));
5641 ivar &= ~IVAR_RX_MASK_Q(qid);
5642 ivar |= __SHIFTIN((qintr_idx
5643 | IVAR_VALID),
5644 IVAR_RX_MASK_Q(qid));
5645 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar);
5646 }
5647 break;
5648 case WM_T_82576:
5649 /* TX and RX */
5650 for (i = 0; i < sc->sc_nqueues; i++) {
5651 wmq = &sc->sc_queue[i];
5652 qid = wmq->wmq_id;
5653 qintr_idx = wmq->wmq_intr_idx;
5654
5655 ivar = CSR_READ(sc,
5656 WMREG_IVAR_Q_82576(qid));
5657 ivar &= ~IVAR_TX_MASK_Q_82576(qid);
5658 ivar |= __SHIFTIN((qintr_idx
5659 | IVAR_VALID),
5660 IVAR_TX_MASK_Q_82576(qid));
5661 ivar &= ~IVAR_RX_MASK_Q_82576(qid);
5662 ivar |= __SHIFTIN((qintr_idx
5663 | IVAR_VALID),
5664 IVAR_RX_MASK_Q_82576(qid));
5665 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid),
5666 ivar);
5667 }
5668 break;
5669 default:
5670 break;
5671 }
5672
5673 /* Link status */
5674 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID),
5675 IVAR_MISC_OTHER);
5676 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar);
5677 }
5678
5679 if (wm_is_using_multiqueue(sc)) {
5680 wm_init_rss(sc);
5681
5682 /*
5683 ** NOTE: Receive Full-Packet Checksum Offload
5684 ** is mutually exclusive with Multiqueue. However
5685 ** this is not the same as TCP/IP checksums which
5686 ** still work.
5687 */
5688 reg = CSR_READ(sc, WMREG_RXCSUM);
5689 reg |= RXCSUM_PCSD;
5690 CSR_WRITE(sc, WMREG_RXCSUM, reg);
5691 }
5692 }
5693
5694 /* Set up the interrupt registers. */
5695 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5696 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
5697 ICR_RXO | ICR_RXT0;
5698 if (wm_is_using_msix(sc)) {
5699 uint32_t mask;
5700 struct wm_queue *wmq;
5701
5702 switch (sc->sc_type) {
5703 case WM_T_82574:
5704 mask = 0;
5705 for (i = 0; i < sc->sc_nqueues; i++) {
5706 wmq = &sc->sc_queue[i];
5707 mask |= ICR_TXQ(wmq->wmq_id);
5708 mask |= ICR_RXQ(wmq->wmq_id);
5709 }
5710 mask |= ICR_OTHER;
5711 CSR_WRITE(sc, WMREG_EIAC_82574, mask);
5712 CSR_WRITE(sc, WMREG_IMS, mask | ICR_LSC);
5713 break;
5714 default:
5715 if (sc->sc_type == WM_T_82575) {
5716 mask = 0;
5717 for (i = 0; i < sc->sc_nqueues; i++) {
5718 wmq = &sc->sc_queue[i];
5719 mask |= EITR_TX_QUEUE(wmq->wmq_id);
5720 mask |= EITR_RX_QUEUE(wmq->wmq_id);
5721 }
5722 mask |= EITR_OTHER;
5723 } else {
5724 mask = 0;
5725 for (i = 0; i < sc->sc_nqueues; i++) {
5726 wmq = &sc->sc_queue[i];
5727 mask |= 1 << wmq->wmq_intr_idx;
5728 }
5729 mask |= 1 << sc->sc_link_intr_idx;
5730 }
5731 CSR_WRITE(sc, WMREG_EIAC, mask);
5732 CSR_WRITE(sc, WMREG_EIAM, mask);
5733 CSR_WRITE(sc, WMREG_EIMS, mask);
5734 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
5735 break;
5736 }
5737 } else
5738 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
5739
5740 /* Set up the inter-packet gap. */
5741 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
5742
5743 if (sc->sc_type >= WM_T_82543) {
5744 for (int qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5745 struct wm_queue *wmq = &sc->sc_queue[qidx];
5746 wm_itrs_writereg(sc, wmq);
5747 }
5748 /*
5749 * Link interrupts occur much less than TX
5750 * interrupts and RX interrupts. So, we don't
5751 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like
5752 * FreeBSD's if_igb.
5753 */
5754 }
5755
5756 /* Set the VLAN ethernetype. */
5757 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
5758
5759 /*
5760 * Set up the transmit control register; we start out with
5761 * a collision distance suitable for FDX, but update it whe
5762 * we resolve the media type.
5763 */
5764 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
5765 | TCTL_CT(TX_COLLISION_THRESHOLD)
5766 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
5767 if (sc->sc_type >= WM_T_82571)
5768 sc->sc_tctl |= TCTL_MULR;
5769 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
5770
5771 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5772 /* Write TDT after TCTL.EN is set. See the document. */
5773 CSR_WRITE(sc, WMREG_TDT(0), 0);
5774 }
5775
5776 if (sc->sc_type == WM_T_80003) {
5777 reg = CSR_READ(sc, WMREG_TCTL_EXT);
5778 reg &= ~TCTL_EXT_GCEX_MASK;
5779 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
5780 CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
5781 }
5782
5783 /* Set the media. */
5784 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
5785 goto out;
5786
5787 /* Configure for OS presence */
5788 wm_init_manageability(sc);
5789
5790 /*
5791 * Set up the receive control register; we actually program
5792 * the register when we set the receive filter. Use multicast
5793 * address offset type 0.
5794 *
5795 * Only the i82544 has the ability to strip the incoming
5796 * CRC, so we don't enable that feature.
5797 */
5798 sc->sc_mchash_type = 0;
5799 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
5800 | RCTL_MO(sc->sc_mchash_type);
5801
5802 /*
5803 * 82574 use one buffer extended Rx descriptor.
5804 */
5805 if (sc->sc_type == WM_T_82574)
5806 sc->sc_rctl |= RCTL_DTYP_ONEBUF;
5807
5808 /*
5809 * The I350 has a bug where it always strips the CRC whether
5810 * asked to or not. So ask for stripped CRC here and cope in rxeof
5811 */
5812 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
5813 || (sc->sc_type == WM_T_I210))
5814 sc->sc_rctl |= RCTL_SECRC;
5815
5816 if (((sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
5817 && (ifp->if_mtu > ETHERMTU)) {
5818 sc->sc_rctl |= RCTL_LPE;
5819 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
5820 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
5821 }
5822
5823 if (MCLBYTES == 2048) {
5824 sc->sc_rctl |= RCTL_2k;
5825 } else {
5826 if (sc->sc_type >= WM_T_82543) {
5827 switch (MCLBYTES) {
5828 case 4096:
5829 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k;
5830 break;
5831 case 8192:
5832 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k;
5833 break;
5834 case 16384:
5835 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k;
5836 break;
5837 default:
5838 panic("wm_init: MCLBYTES %d unsupported",
5839 MCLBYTES);
5840 break;
5841 }
5842 } else panic("wm_init: i82542 requires MCLBYTES = 2048");
5843 }
5844
5845 /* Enable ECC */
5846 switch (sc->sc_type) {
5847 case WM_T_82571:
5848 reg = CSR_READ(sc, WMREG_PBA_ECC);
5849 reg |= PBA_ECC_CORR_EN;
5850 CSR_WRITE(sc, WMREG_PBA_ECC, reg);
5851 break;
5852 case WM_T_PCH_LPT:
5853 case WM_T_PCH_SPT:
5854 reg = CSR_READ(sc, WMREG_PBECCSTS);
5855 reg |= PBECCSTS_UNCORR_ECC_ENABLE;
5856 CSR_WRITE(sc, WMREG_PBECCSTS, reg);
5857
5858 sc->sc_ctrl |= CTRL_MEHE;
5859 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
5860 break;
5861 default:
5862 break;
5863 }
5864
5865 /*
5866 * Set the receive filter.
5867 *
5868 * For 82575 and 82576, the RX descriptors must be initialized after
5869 * the setting of RCTL.EN in wm_set_filter()
5870 */
5871 wm_set_filter(sc);
5872
5873 /* On 575 and later set RDT only if RX enabled */
5874 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5875 int qidx;
5876 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5877 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq;
5878 for (i = 0; i < WM_NRXDESC; i++) {
5879 mutex_enter(rxq->rxq_lock);
5880 wm_init_rxdesc(rxq, i);
5881 mutex_exit(rxq->rxq_lock);
5882
5883 }
5884 }
5885 }
5886
5887 wm_unset_stopping_flags(sc);
5888
5889 /* Start the one second link check clock. */
5890 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
5891
5892 /* ...all done! */
5893 ifp->if_flags |= IFF_RUNNING;
5894 ifp->if_flags &= ~IFF_OACTIVE;
5895
5896 out:
5897 sc->sc_if_flags = ifp->if_flags;
5898 if (error)
5899 log(LOG_ERR, "%s: interface not running\n",
5900 device_xname(sc->sc_dev));
5901 return error;
5902 }
5903
5904 /*
5905 * wm_stop: [ifnet interface function]
5906 *
5907 * Stop transmission on the interface.
5908 */
5909 static void
5910 wm_stop(struct ifnet *ifp, int disable)
5911 {
5912 struct wm_softc *sc = ifp->if_softc;
5913
5914 WM_CORE_LOCK(sc);
5915 wm_stop_locked(ifp, disable);
5916 WM_CORE_UNLOCK(sc);
5917 }
5918
5919 static void
5920 wm_stop_locked(struct ifnet *ifp, int disable)
5921 {
5922 struct wm_softc *sc = ifp->if_softc;
5923 struct wm_txsoft *txs;
5924 int i, qidx;
5925
5926 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5927 device_xname(sc->sc_dev), __func__));
5928 KASSERT(WM_CORE_LOCKED(sc));
5929
5930 wm_set_stopping_flags(sc);
5931
5932 /* Stop the one second clock. */
5933 callout_stop(&sc->sc_tick_ch);
5934
5935 /* Stop the 82547 Tx FIFO stall check timer. */
5936 if (sc->sc_type == WM_T_82547)
5937 callout_stop(&sc->sc_txfifo_ch);
5938
5939 if (sc->sc_flags & WM_F_HAS_MII) {
5940 /* Down the MII. */
5941 mii_down(&sc->sc_mii);
5942 } else {
5943 #if 0
5944 /* Should we clear PHY's status properly? */
5945 wm_reset(sc);
5946 #endif
5947 }
5948
5949 /* Stop the transmit and receive processes. */
5950 CSR_WRITE(sc, WMREG_TCTL, 0);
5951 CSR_WRITE(sc, WMREG_RCTL, 0);
5952 sc->sc_rctl &= ~RCTL_EN;
5953
5954 /*
5955 * Clear the interrupt mask to ensure the device cannot assert its
5956 * interrupt line.
5957 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to
5958 * service any currently pending or shared interrupt.
5959 */
5960 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5961 sc->sc_icr = 0;
5962 if (wm_is_using_msix(sc)) {
5963 if (sc->sc_type != WM_T_82574) {
5964 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
5965 CSR_WRITE(sc, WMREG_EIAC, 0);
5966 } else
5967 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
5968 }
5969
5970 /* Release any queued transmit buffers. */
5971 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5972 struct wm_queue *wmq = &sc->sc_queue[qidx];
5973 struct wm_txqueue *txq = &wmq->wmq_txq;
5974 mutex_enter(txq->txq_lock);
5975 txq->txq_watchdog = false; /* ensure watchdog disabled */
5976 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
5977 txs = &txq->txq_soft[i];
5978 if (txs->txs_mbuf != NULL) {
5979 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap);
5980 m_freem(txs->txs_mbuf);
5981 txs->txs_mbuf = NULL;
5982 }
5983 }
5984 mutex_exit(txq->txq_lock);
5985 }
5986
5987 /* Mark the interface as down and cancel the watchdog timer. */
5988 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
5989
5990 if (disable) {
5991 for (i = 0; i < sc->sc_nqueues; i++) {
5992 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5993 mutex_enter(rxq->rxq_lock);
5994 wm_rxdrain(rxq);
5995 mutex_exit(rxq->rxq_lock);
5996 }
5997 }
5998
5999 #if 0 /* notyet */
6000 if (sc->sc_type >= WM_T_82544)
6001 CSR_WRITE(sc, WMREG_WUC, 0);
6002 #endif
6003 }
6004
6005 static void
6006 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0)
6007 {
6008 struct mbuf *m;
6009 int i;
6010
6011 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev));
6012 for (m = m0, i = 0; m != NULL; m = m->m_next, i++)
6013 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, "
6014 "m_flags = 0x%08x\n", device_xname(sc->sc_dev),
6015 m->m_data, m->m_len, m->m_flags);
6016 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev),
6017 i, i == 1 ? "" : "s");
6018 }
6019
6020 /*
6021 * wm_82547_txfifo_stall:
6022 *
6023 * Callout used to wait for the 82547 Tx FIFO to drain,
6024 * reset the FIFO pointers, and restart packet transmission.
6025 */
6026 static void
6027 wm_82547_txfifo_stall(void *arg)
6028 {
6029 struct wm_softc *sc = arg;
6030 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6031
6032 mutex_enter(txq->txq_lock);
6033
6034 if (txq->txq_stopping)
6035 goto out;
6036
6037 if (txq->txq_fifo_stall) {
6038 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) &&
6039 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) &&
6040 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) {
6041 /*
6042 * Packets have drained. Stop transmitter, reset
6043 * FIFO pointers, restart transmitter, and kick
6044 * the packet queue.
6045 */
6046 uint32_t tctl = CSR_READ(sc, WMREG_TCTL);
6047 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN);
6048 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr);
6049 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr);
6050 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr);
6051 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr);
6052 CSR_WRITE(sc, WMREG_TCTL, tctl);
6053 CSR_WRITE_FLUSH(sc);
6054
6055 txq->txq_fifo_head = 0;
6056 txq->txq_fifo_stall = 0;
6057 wm_start_locked(&sc->sc_ethercom.ec_if);
6058 } else {
6059 /*
6060 * Still waiting for packets to drain; try again in
6061 * another tick.
6062 */
6063 callout_schedule(&sc->sc_txfifo_ch, 1);
6064 }
6065 }
6066
6067 out:
6068 mutex_exit(txq->txq_lock);
6069 }
6070
6071 /*
6072 * wm_82547_txfifo_bugchk:
6073 *
6074 * Check for bug condition in the 82547 Tx FIFO. We need to
6075 * prevent enqueueing a packet that would wrap around the end
6076 * if the Tx FIFO ring buffer, otherwise the chip will croak.
6077 *
6078 * We do this by checking the amount of space before the end
6079 * of the Tx FIFO buffer. If the packet will not fit, we "stall"
6080 * the Tx FIFO, wait for all remaining packets to drain, reset
6081 * the internal FIFO pointers to the beginning, and restart
6082 * transmission on the interface.
6083 */
6084 #define WM_FIFO_HDR 0x10
6085 #define WM_82547_PAD_LEN 0x3e0
6086 static int
6087 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0)
6088 {
6089 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6090 int space = txq->txq_fifo_size - txq->txq_fifo_head;
6091 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR);
6092
6093 /* Just return if already stalled. */
6094 if (txq->txq_fifo_stall)
6095 return 1;
6096
6097 if (sc->sc_mii.mii_media_active & IFM_FDX) {
6098 /* Stall only occurs in half-duplex mode. */
6099 goto send_packet;
6100 }
6101
6102 if (len >= WM_82547_PAD_LEN + space) {
6103 txq->txq_fifo_stall = 1;
6104 callout_schedule(&sc->sc_txfifo_ch, 1);
6105 return 1;
6106 }
6107
6108 send_packet:
6109 txq->txq_fifo_head += len;
6110 if (txq->txq_fifo_head >= txq->txq_fifo_size)
6111 txq->txq_fifo_head -= txq->txq_fifo_size;
6112
6113 return 0;
6114 }
6115
6116 static int
6117 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6118 {
6119 int error;
6120
6121 /*
6122 * Allocate the control data structures, and create and load the
6123 * DMA map for it.
6124 *
6125 * NOTE: All Tx descriptors must be in the same 4G segment of
6126 * memory. So must Rx descriptors. We simplify by allocating
6127 * both sets within the same 4G segment.
6128 */
6129 if (sc->sc_type < WM_T_82544)
6130 WM_NTXDESC(txq) = WM_NTXDESC_82542;
6131 else
6132 WM_NTXDESC(txq) = WM_NTXDESC_82544;
6133 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6134 txq->txq_descsize = sizeof(nq_txdesc_t);
6135 else
6136 txq->txq_descsize = sizeof(wiseman_txdesc_t);
6137
6138 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq),
6139 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg,
6140 1, &txq->txq_desc_rseg, 0)) != 0) {
6141 aprint_error_dev(sc->sc_dev,
6142 "unable to allocate TX control data, error = %d\n",
6143 error);
6144 goto fail_0;
6145 }
6146
6147 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg,
6148 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq),
6149 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) {
6150 aprint_error_dev(sc->sc_dev,
6151 "unable to map TX control data, error = %d\n", error);
6152 goto fail_1;
6153 }
6154
6155 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1,
6156 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) {
6157 aprint_error_dev(sc->sc_dev,
6158 "unable to create TX control data DMA map, error = %d\n",
6159 error);
6160 goto fail_2;
6161 }
6162
6163 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap,
6164 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) {
6165 aprint_error_dev(sc->sc_dev,
6166 "unable to load TX control data DMA map, error = %d\n",
6167 error);
6168 goto fail_3;
6169 }
6170
6171 return 0;
6172
6173 fail_3:
6174 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6175 fail_2:
6176 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6177 WM_TXDESCS_SIZE(txq));
6178 fail_1:
6179 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6180 fail_0:
6181 return error;
6182 }
6183
6184 static void
6185 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6186 {
6187
6188 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap);
6189 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6190 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6191 WM_TXDESCS_SIZE(txq));
6192 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6193 }
6194
6195 static int
6196 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6197 {
6198 int error;
6199 size_t rxq_descs_size;
6200
6201 /*
6202 * Allocate the control data structures, and create and load the
6203 * DMA map for it.
6204 *
6205 * NOTE: All Tx descriptors must be in the same 4G segment of
6206 * memory. So must Rx descriptors. We simplify by allocating
6207 * both sets within the same 4G segment.
6208 */
6209 rxq->rxq_ndesc = WM_NRXDESC;
6210 if (sc->sc_type == WM_T_82574)
6211 rxq->rxq_descsize = sizeof(ext_rxdesc_t);
6212 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6213 rxq->rxq_descsize = sizeof(nq_rxdesc_t);
6214 else
6215 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t);
6216 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc;
6217
6218 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size,
6219 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg,
6220 1, &rxq->rxq_desc_rseg, 0)) != 0) {
6221 aprint_error_dev(sc->sc_dev,
6222 "unable to allocate RX control data, error = %d\n",
6223 error);
6224 goto fail_0;
6225 }
6226
6227 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg,
6228 rxq->rxq_desc_rseg, rxq_descs_size,
6229 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) {
6230 aprint_error_dev(sc->sc_dev,
6231 "unable to map RX control data, error = %d\n", error);
6232 goto fail_1;
6233 }
6234
6235 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1,
6236 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) {
6237 aprint_error_dev(sc->sc_dev,
6238 "unable to create RX control data DMA map, error = %d\n",
6239 error);
6240 goto fail_2;
6241 }
6242
6243 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap,
6244 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) {
6245 aprint_error_dev(sc->sc_dev,
6246 "unable to load RX control data DMA map, error = %d\n",
6247 error);
6248 goto fail_3;
6249 }
6250
6251 return 0;
6252
6253 fail_3:
6254 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
6255 fail_2:
6256 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
6257 rxq_descs_size);
6258 fail_1:
6259 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
6260 fail_0:
6261 return error;
6262 }
6263
6264 static void
6265 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6266 {
6267
6268 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap);
6269 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
6270 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
6271 rxq->rxq_descsize * rxq->rxq_ndesc);
6272 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
6273 }
6274
6275
6276 static int
6277 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
6278 {
6279 int i, error;
6280
6281 /* Create the transmit buffer DMA maps. */
6282 WM_TXQUEUELEN(txq) =
6283 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ?
6284 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX;
6285 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6286 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA,
6287 WM_NTXSEGS, WTX_MAX_LEN, 0, 0,
6288 &txq->txq_soft[i].txs_dmamap)) != 0) {
6289 aprint_error_dev(sc->sc_dev,
6290 "unable to create Tx DMA map %d, error = %d\n",
6291 i, error);
6292 goto fail;
6293 }
6294 }
6295
6296 return 0;
6297
6298 fail:
6299 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6300 if (txq->txq_soft[i].txs_dmamap != NULL)
6301 bus_dmamap_destroy(sc->sc_dmat,
6302 txq->txq_soft[i].txs_dmamap);
6303 }
6304 return error;
6305 }
6306
6307 static void
6308 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
6309 {
6310 int i;
6311
6312 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6313 if (txq->txq_soft[i].txs_dmamap != NULL)
6314 bus_dmamap_destroy(sc->sc_dmat,
6315 txq->txq_soft[i].txs_dmamap);
6316 }
6317 }
6318
6319 static int
6320 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6321 {
6322 int i, error;
6323
6324 /* Create the receive buffer DMA maps. */
6325 for (i = 0; i < rxq->rxq_ndesc; i++) {
6326 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
6327 MCLBYTES, 0, 0,
6328 &rxq->rxq_soft[i].rxs_dmamap)) != 0) {
6329 aprint_error_dev(sc->sc_dev,
6330 "unable to create Rx DMA map %d error = %d\n",
6331 i, error);
6332 goto fail;
6333 }
6334 rxq->rxq_soft[i].rxs_mbuf = NULL;
6335 }
6336
6337 return 0;
6338
6339 fail:
6340 for (i = 0; i < rxq->rxq_ndesc; i++) {
6341 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
6342 bus_dmamap_destroy(sc->sc_dmat,
6343 rxq->rxq_soft[i].rxs_dmamap);
6344 }
6345 return error;
6346 }
6347
6348 static void
6349 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6350 {
6351 int i;
6352
6353 for (i = 0; i < rxq->rxq_ndesc; i++) {
6354 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
6355 bus_dmamap_destroy(sc->sc_dmat,
6356 rxq->rxq_soft[i].rxs_dmamap);
6357 }
6358 }
6359
6360 /*
6361 * wm_alloc_quques:
6362 * Allocate {tx,rx}descs and {tx,rx} buffers
6363 */
6364 static int
6365 wm_alloc_txrx_queues(struct wm_softc *sc)
6366 {
6367 int i, error, tx_done, rx_done;
6368
6369 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues,
6370 KM_SLEEP);
6371 if (sc->sc_queue == NULL) {
6372 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n");
6373 error = ENOMEM;
6374 goto fail_0;
6375 }
6376
6377 /*
6378 * For transmission
6379 */
6380 error = 0;
6381 tx_done = 0;
6382 for (i = 0; i < sc->sc_nqueues; i++) {
6383 #ifdef WM_EVENT_COUNTERS
6384 int j;
6385 const char *xname;
6386 #endif
6387 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6388 txq->txq_sc = sc;
6389 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
6390
6391 error = wm_alloc_tx_descs(sc, txq);
6392 if (error)
6393 break;
6394 error = wm_alloc_tx_buffer(sc, txq);
6395 if (error) {
6396 wm_free_tx_descs(sc, txq);
6397 break;
6398 }
6399 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP);
6400 if (txq->txq_interq == NULL) {
6401 wm_free_tx_descs(sc, txq);
6402 wm_free_tx_buffer(sc, txq);
6403 error = ENOMEM;
6404 break;
6405 }
6406
6407 #ifdef WM_EVENT_COUNTERS
6408 xname = device_xname(sc->sc_dev);
6409
6410 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname);
6411 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname);
6412 WM_Q_MISC_EVCNT_ATTACH(txq, txfifo_stall, txq, i, xname);
6413 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname);
6414 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname);
6415
6416 WM_Q_MISC_EVCNT_ATTACH(txq, txipsum, txq, i, xname);
6417 WM_Q_MISC_EVCNT_ATTACH(txq, txtusum, txq, i, xname);
6418 WM_Q_MISC_EVCNT_ATTACH(txq, txtusum6, txq, i, xname);
6419 WM_Q_MISC_EVCNT_ATTACH(txq, txtso, txq, i, xname);
6420 WM_Q_MISC_EVCNT_ATTACH(txq, txtso6, txq, i, xname);
6421 WM_Q_MISC_EVCNT_ATTACH(txq, txtsopain, txq, i, xname);
6422
6423 for (j = 0; j < WM_NTXSEGS; j++) {
6424 snprintf(txq->txq_txseg_evcnt_names[j],
6425 sizeof(txq->txq_txseg_evcnt_names[j]), "txq%02dtxseg%d", i, j);
6426 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], EVCNT_TYPE_MISC,
6427 NULL, xname, txq->txq_txseg_evcnt_names[j]);
6428 }
6429
6430 WM_Q_MISC_EVCNT_ATTACH(txq, txdrop, txq, i, xname);
6431
6432 WM_Q_MISC_EVCNT_ATTACH(txq, tu, txq, i, xname);
6433 #endif /* WM_EVENT_COUNTERS */
6434
6435 tx_done++;
6436 }
6437 if (error)
6438 goto fail_1;
6439
6440 /*
6441 * For recieve
6442 */
6443 error = 0;
6444 rx_done = 0;
6445 for (i = 0; i < sc->sc_nqueues; i++) {
6446 #ifdef WM_EVENT_COUNTERS
6447 const char *xname;
6448 #endif
6449 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6450 rxq->rxq_sc = sc;
6451 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
6452
6453 error = wm_alloc_rx_descs(sc, rxq);
6454 if (error)
6455 break;
6456
6457 error = wm_alloc_rx_buffer(sc, rxq);
6458 if (error) {
6459 wm_free_rx_descs(sc, rxq);
6460 break;
6461 }
6462
6463 #ifdef WM_EVENT_COUNTERS
6464 xname = device_xname(sc->sc_dev);
6465
6466 WM_Q_INTR_EVCNT_ATTACH(rxq, rxintr, rxq, i, xname);
6467 WM_Q_INTR_EVCNT_ATTACH(rxq, rxdefer, rxq, i, xname);
6468
6469 WM_Q_INTR_EVCNT_ATTACH(rxq, rxipsum, rxq, i, xname);
6470 WM_Q_INTR_EVCNT_ATTACH(rxq, rxtusum, rxq, i, xname);
6471 #endif /* WM_EVENT_COUNTERS */
6472
6473 rx_done++;
6474 }
6475 if (error)
6476 goto fail_2;
6477
6478 return 0;
6479
6480 fail_2:
6481 for (i = 0; i < rx_done; i++) {
6482 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6483 wm_free_rx_buffer(sc, rxq);
6484 wm_free_rx_descs(sc, rxq);
6485 if (rxq->rxq_lock)
6486 mutex_obj_free(rxq->rxq_lock);
6487 }
6488 fail_1:
6489 for (i = 0; i < tx_done; i++) {
6490 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6491 pcq_destroy(txq->txq_interq);
6492 wm_free_tx_buffer(sc, txq);
6493 wm_free_tx_descs(sc, txq);
6494 if (txq->txq_lock)
6495 mutex_obj_free(txq->txq_lock);
6496 }
6497
6498 kmem_free(sc->sc_queue,
6499 sizeof(struct wm_queue) * sc->sc_nqueues);
6500 fail_0:
6501 return error;
6502 }
6503
6504 /*
6505 * wm_free_quques:
6506 * Free {tx,rx}descs and {tx,rx} buffers
6507 */
6508 static void
6509 wm_free_txrx_queues(struct wm_softc *sc)
6510 {
6511 int i;
6512
6513 for (i = 0; i < sc->sc_nqueues; i++) {
6514 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6515
6516 #ifdef WM_EVENT_COUNTERS
6517 WM_Q_EVCNT_DETACH(rxq, rxintr, rxq, i);
6518 WM_Q_EVCNT_DETACH(rxq, rxdefer, rxq, i);
6519 WM_Q_EVCNT_DETACH(rxq, rxipsum, rxq, i);
6520 WM_Q_EVCNT_DETACH(rxq, rxtusum, rxq, i);
6521 #endif /* WM_EVENT_COUNTERS */
6522
6523 wm_free_rx_buffer(sc, rxq);
6524 wm_free_rx_descs(sc, rxq);
6525 if (rxq->rxq_lock)
6526 mutex_obj_free(rxq->rxq_lock);
6527 }
6528
6529 for (i = 0; i < sc->sc_nqueues; i++) {
6530 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6531 struct mbuf *m;
6532 #ifdef WM_EVENT_COUNTERS
6533 int j;
6534
6535 WM_Q_EVCNT_DETACH(txq, txsstall, txq, i);
6536 WM_Q_EVCNT_DETACH(txq, txdstall, txq, i);
6537 WM_Q_EVCNT_DETACH(txq, txfifo_stall, txq, i);
6538 WM_Q_EVCNT_DETACH(txq, txdw, txq, i);
6539 WM_Q_EVCNT_DETACH(txq, txqe, txq, i);
6540 WM_Q_EVCNT_DETACH(txq, txipsum, txq, i);
6541 WM_Q_EVCNT_DETACH(txq, txtusum, txq, i);
6542 WM_Q_EVCNT_DETACH(txq, txtusum6, txq, i);
6543 WM_Q_EVCNT_DETACH(txq, txtso, txq, i);
6544 WM_Q_EVCNT_DETACH(txq, txtso6, txq, i);
6545 WM_Q_EVCNT_DETACH(txq, txtsopain, txq, i);
6546
6547 for (j = 0; j < WM_NTXSEGS; j++)
6548 evcnt_detach(&txq->txq_ev_txseg[j]);
6549
6550 WM_Q_EVCNT_DETACH(txq, txdrop, txq, i);
6551 WM_Q_EVCNT_DETACH(txq, tu, txq, i);
6552 #endif /* WM_EVENT_COUNTERS */
6553
6554 /* drain txq_interq */
6555 while ((m = pcq_get(txq->txq_interq)) != NULL)
6556 m_freem(m);
6557 pcq_destroy(txq->txq_interq);
6558
6559 wm_free_tx_buffer(sc, txq);
6560 wm_free_tx_descs(sc, txq);
6561 if (txq->txq_lock)
6562 mutex_obj_free(txq->txq_lock);
6563 }
6564
6565 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues);
6566 }
6567
6568 static void
6569 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq)
6570 {
6571
6572 KASSERT(mutex_owned(txq->txq_lock));
6573
6574 /* Initialize the transmit descriptor ring. */
6575 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq));
6576 wm_cdtxsync(txq, 0, WM_NTXDESC(txq),
6577 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
6578 txq->txq_free = WM_NTXDESC(txq);
6579 txq->txq_next = 0;
6580 }
6581
6582 static void
6583 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq,
6584 struct wm_txqueue *txq)
6585 {
6586
6587 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
6588 device_xname(sc->sc_dev), __func__));
6589 KASSERT(mutex_owned(txq->txq_lock));
6590
6591 if (sc->sc_type < WM_T_82543) {
6592 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0));
6593 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0));
6594 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq));
6595 CSR_WRITE(sc, WMREG_OLD_TDH, 0);
6596 CSR_WRITE(sc, WMREG_OLD_TDT, 0);
6597 CSR_WRITE(sc, WMREG_OLD_TIDV, 128);
6598 } else {
6599 int qid = wmq->wmq_id;
6600
6601 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0));
6602 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0));
6603 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq));
6604 CSR_WRITE(sc, WMREG_TDH(qid), 0);
6605
6606 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6607 /*
6608 * Don't write TDT before TCTL.EN is set.
6609 * See the document.
6610 */
6611 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE
6612 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0)
6613 | TXDCTL_WTHRESH(0));
6614 else {
6615 /* XXX should update with AIM? */
6616 CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4);
6617 if (sc->sc_type >= WM_T_82540) {
6618 /* should be same */
6619 CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4);
6620 }
6621
6622 CSR_WRITE(sc, WMREG_TDT(qid), 0);
6623 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) |
6624 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
6625 }
6626 }
6627 }
6628
6629 static void
6630 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq)
6631 {
6632 int i;
6633
6634 KASSERT(mutex_owned(txq->txq_lock));
6635
6636 /* Initialize the transmit job descriptors. */
6637 for (i = 0; i < WM_TXQUEUELEN(txq); i++)
6638 txq->txq_soft[i].txs_mbuf = NULL;
6639 txq->txq_sfree = WM_TXQUEUELEN(txq);
6640 txq->txq_snext = 0;
6641 txq->txq_sdirty = 0;
6642 }
6643
6644 static void
6645 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq,
6646 struct wm_txqueue *txq)
6647 {
6648
6649 KASSERT(mutex_owned(txq->txq_lock));
6650
6651 /*
6652 * Set up some register offsets that are different between
6653 * the i82542 and the i82543 and later chips.
6654 */
6655 if (sc->sc_type < WM_T_82543)
6656 txq->txq_tdt_reg = WMREG_OLD_TDT;
6657 else
6658 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id);
6659
6660 wm_init_tx_descs(sc, txq);
6661 wm_init_tx_regs(sc, wmq, txq);
6662 wm_init_tx_buffer(sc, txq);
6663
6664 txq->txq_watchdog = false;
6665 }
6666
6667 static void
6668 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq,
6669 struct wm_rxqueue *rxq)
6670 {
6671
6672 KASSERT(mutex_owned(rxq->rxq_lock));
6673
6674 /*
6675 * Initialize the receive descriptor and receive job
6676 * descriptor rings.
6677 */
6678 if (sc->sc_type < WM_T_82543) {
6679 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0));
6680 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0));
6681 CSR_WRITE(sc, WMREG_OLD_RDLEN0,
6682 rxq->rxq_descsize * rxq->rxq_ndesc);
6683 CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
6684 CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
6685 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD);
6686
6687 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
6688 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
6689 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
6690 CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
6691 CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
6692 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
6693 } else {
6694 int qid = wmq->wmq_id;
6695
6696 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0));
6697 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0));
6698 CSR_WRITE(sc, WMREG_RDLEN(qid), rxq->rxq_descsize * rxq->rxq_ndesc);
6699
6700 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6701 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
6702 panic("%s: MCLBYTES %d unsupported for 82575 or higher\n", __func__, MCLBYTES);
6703
6704 /* Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF only. */
6705 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_ADV_ONEBUF
6706 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
6707 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE
6708 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8)
6709 | RXDCTL_WTHRESH(1));
6710 CSR_WRITE(sc, WMREG_RDH(qid), 0);
6711 CSR_WRITE(sc, WMREG_RDT(qid), 0);
6712 } else {
6713 CSR_WRITE(sc, WMREG_RDH(qid), 0);
6714 CSR_WRITE(sc, WMREG_RDT(qid), 0);
6715 /* XXX should update with AIM? */
6716 CSR_WRITE(sc, WMREG_RDTR, (wmq->wmq_itr / 4) | RDTR_FPD);
6717 /* MUST be same */
6718 CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4);
6719 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) |
6720 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
6721 }
6722 }
6723 }
6724
6725 static int
6726 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6727 {
6728 struct wm_rxsoft *rxs;
6729 int error, i;
6730
6731 KASSERT(mutex_owned(rxq->rxq_lock));
6732
6733 for (i = 0; i < rxq->rxq_ndesc; i++) {
6734 rxs = &rxq->rxq_soft[i];
6735 if (rxs->rxs_mbuf == NULL) {
6736 if ((error = wm_add_rxbuf(rxq, i)) != 0) {
6737 log(LOG_ERR, "%s: unable to allocate or map "
6738 "rx buffer %d, error = %d\n",
6739 device_xname(sc->sc_dev), i, error);
6740 /*
6741 * XXX Should attempt to run with fewer receive
6742 * XXX buffers instead of just failing.
6743 */
6744 wm_rxdrain(rxq);
6745 return ENOMEM;
6746 }
6747 } else {
6748 /*
6749 * For 82575 and 82576, the RX descriptors must be
6750 * initialized after the setting of RCTL.EN in
6751 * wm_set_filter()
6752 */
6753 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0)
6754 wm_init_rxdesc(rxq, i);
6755 }
6756 }
6757 rxq->rxq_ptr = 0;
6758 rxq->rxq_discard = 0;
6759 WM_RXCHAIN_RESET(rxq);
6760
6761 return 0;
6762 }
6763
6764 static int
6765 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq,
6766 struct wm_rxqueue *rxq)
6767 {
6768
6769 KASSERT(mutex_owned(rxq->rxq_lock));
6770
6771 /*
6772 * Set up some register offsets that are different between
6773 * the i82542 and the i82543 and later chips.
6774 */
6775 if (sc->sc_type < WM_T_82543)
6776 rxq->rxq_rdt_reg = WMREG_OLD_RDT0;
6777 else
6778 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id);
6779
6780 wm_init_rx_regs(sc, wmq, rxq);
6781 return wm_init_rx_buffer(sc, rxq);
6782 }
6783
6784 /*
6785 * wm_init_quques:
6786 * Initialize {tx,rx}descs and {tx,rx} buffers
6787 */
6788 static int
6789 wm_init_txrx_queues(struct wm_softc *sc)
6790 {
6791 int i, error = 0;
6792
6793 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
6794 device_xname(sc->sc_dev), __func__));
6795
6796 for (i = 0; i < sc->sc_nqueues; i++) {
6797 struct wm_queue *wmq = &sc->sc_queue[i];
6798 struct wm_txqueue *txq = &wmq->wmq_txq;
6799 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
6800
6801 /*
6802 * TODO
6803 * Currently, use constant variable instead of AIM.
6804 * Furthermore, the interrupt interval of multiqueue which use
6805 * polling mode is less than default value.
6806 * More tuning and AIM are required.
6807 */
6808 if (wm_is_using_multiqueue(sc))
6809 wmq->wmq_itr = 50;
6810 else
6811 wmq->wmq_itr = sc->sc_itr_init;
6812 wmq->wmq_set_itr = true;
6813
6814 mutex_enter(txq->txq_lock);
6815 wm_init_tx_queue(sc, wmq, txq);
6816 mutex_exit(txq->txq_lock);
6817
6818 mutex_enter(rxq->rxq_lock);
6819 error = wm_init_rx_queue(sc, wmq, rxq);
6820 mutex_exit(rxq->rxq_lock);
6821 if (error)
6822 break;
6823 }
6824
6825 return error;
6826 }
6827
6828 /*
6829 * wm_tx_offload:
6830 *
6831 * Set up TCP/IP checksumming parameters for the
6832 * specified packet.
6833 */
6834 static int
6835 wm_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
6836 struct wm_txsoft *txs, uint32_t *cmdp, uint8_t *fieldsp)
6837 {
6838 struct mbuf *m0 = txs->txs_mbuf;
6839 struct livengood_tcpip_ctxdesc *t;
6840 uint32_t ipcs, tucs, cmd, cmdlen, seg;
6841 uint32_t ipcse;
6842 struct ether_header *eh;
6843 int offset, iphl;
6844 uint8_t fields;
6845
6846 /*
6847 * XXX It would be nice if the mbuf pkthdr had offset
6848 * fields for the protocol headers.
6849 */
6850
6851 eh = mtod(m0, struct ether_header *);
6852 switch (htons(eh->ether_type)) {
6853 case ETHERTYPE_IP:
6854 case ETHERTYPE_IPV6:
6855 offset = ETHER_HDR_LEN;
6856 break;
6857
6858 case ETHERTYPE_VLAN:
6859 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
6860 break;
6861
6862 default:
6863 /*
6864 * Don't support this protocol or encapsulation.
6865 */
6866 *fieldsp = 0;
6867 *cmdp = 0;
6868 return 0;
6869 }
6870
6871 if ((m0->m_pkthdr.csum_flags &
6872 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
6873 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
6874 } else {
6875 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
6876 }
6877 ipcse = offset + iphl - 1;
6878
6879 cmd = WTX_CMD_DEXT | WTX_DTYP_D;
6880 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE;
6881 seg = 0;
6882 fields = 0;
6883
6884 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
6885 int hlen = offset + iphl;
6886 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
6887
6888 if (__predict_false(m0->m_len <
6889 (hlen + sizeof(struct tcphdr)))) {
6890 /*
6891 * TCP/IP headers are not in the first mbuf; we need
6892 * to do this the slow and painful way. Let's just
6893 * hope this doesn't happen very often.
6894 */
6895 struct tcphdr th;
6896
6897 WM_Q_EVCNT_INCR(txq, txtsopain);
6898
6899 m_copydata(m0, hlen, sizeof(th), &th);
6900 if (v4) {
6901 struct ip ip;
6902
6903 m_copydata(m0, offset, sizeof(ip), &ip);
6904 ip.ip_len = 0;
6905 m_copyback(m0,
6906 offset + offsetof(struct ip, ip_len),
6907 sizeof(ip.ip_len), &ip.ip_len);
6908 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
6909 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
6910 } else {
6911 struct ip6_hdr ip6;
6912
6913 m_copydata(m0, offset, sizeof(ip6), &ip6);
6914 ip6.ip6_plen = 0;
6915 m_copyback(m0,
6916 offset + offsetof(struct ip6_hdr, ip6_plen),
6917 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
6918 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
6919 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
6920 }
6921 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
6922 sizeof(th.th_sum), &th.th_sum);
6923
6924 hlen += th.th_off << 2;
6925 } else {
6926 /*
6927 * TCP/IP headers are in the first mbuf; we can do
6928 * this the easy way.
6929 */
6930 struct tcphdr *th;
6931
6932 if (v4) {
6933 struct ip *ip =
6934 (void *)(mtod(m0, char *) + offset);
6935 th = (void *)(mtod(m0, char *) + hlen);
6936
6937 ip->ip_len = 0;
6938 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
6939 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
6940 } else {
6941 struct ip6_hdr *ip6 =
6942 (void *)(mtod(m0, char *) + offset);
6943 th = (void *)(mtod(m0, char *) + hlen);
6944
6945 ip6->ip6_plen = 0;
6946 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
6947 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
6948 }
6949 hlen += th->th_off << 2;
6950 }
6951
6952 if (v4) {
6953 WM_Q_EVCNT_INCR(txq, txtso);
6954 cmdlen |= WTX_TCPIP_CMD_IP;
6955 } else {
6956 WM_Q_EVCNT_INCR(txq, txtso6);
6957 ipcse = 0;
6958 }
6959 cmd |= WTX_TCPIP_CMD_TSE;
6960 cmdlen |= WTX_TCPIP_CMD_TSE |
6961 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen);
6962 seg = WTX_TCPIP_SEG_HDRLEN(hlen) |
6963 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz);
6964 }
6965
6966 /*
6967 * NOTE: Even if we're not using the IP or TCP/UDP checksum
6968 * offload feature, if we load the context descriptor, we
6969 * MUST provide valid values for IPCSS and TUCSS fields.
6970 */
6971
6972 ipcs = WTX_TCPIP_IPCSS(offset) |
6973 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
6974 WTX_TCPIP_IPCSE(ipcse);
6975 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) {
6976 WM_Q_EVCNT_INCR(txq, txipsum);
6977 fields |= WTX_IXSM;
6978 }
6979
6980 offset += iphl;
6981
6982 if (m0->m_pkthdr.csum_flags &
6983 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) {
6984 WM_Q_EVCNT_INCR(txq, txtusum);
6985 fields |= WTX_TXSM;
6986 tucs = WTX_TCPIP_TUCSS(offset) |
6987 WTX_TCPIP_TUCSO(offset +
6988 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) |
6989 WTX_TCPIP_TUCSE(0) /* rest of packet */;
6990 } else if ((m0->m_pkthdr.csum_flags &
6991 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) {
6992 WM_Q_EVCNT_INCR(txq, txtusum6);
6993 fields |= WTX_TXSM;
6994 tucs = WTX_TCPIP_TUCSS(offset) |
6995 WTX_TCPIP_TUCSO(offset +
6996 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) |
6997 WTX_TCPIP_TUCSE(0) /* rest of packet */;
6998 } else {
6999 /* Just initialize it to a valid TCP context. */
7000 tucs = WTX_TCPIP_TUCSS(offset) |
7001 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
7002 WTX_TCPIP_TUCSE(0) /* rest of packet */;
7003 }
7004
7005 /*
7006 * We don't have to write context descriptor for every packet
7007 * except for 82574. For 82574, we must write context descriptor
7008 * for every packet when we use two descriptor queues.
7009 * It would be overhead to write context descriptor for every packet,
7010 * however it does not cause problems.
7011 */
7012 /* Fill in the context descriptor. */
7013 t = (struct livengood_tcpip_ctxdesc *)
7014 &txq->txq_descs[txq->txq_next];
7015 t->tcpip_ipcs = htole32(ipcs);
7016 t->tcpip_tucs = htole32(tucs);
7017 t->tcpip_cmdlen = htole32(cmdlen);
7018 t->tcpip_seg = htole32(seg);
7019 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
7020
7021 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
7022 txs->txs_ndesc++;
7023
7024 *cmdp = cmd;
7025 *fieldsp = fields;
7026
7027 return 0;
7028 }
7029
7030 static inline int
7031 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m)
7032 {
7033 struct wm_softc *sc = ifp->if_softc;
7034 u_int cpuid = cpu_index(curcpu());
7035
7036 /*
7037 * Currently, simple distribute strategy.
7038 * TODO:
7039 * distribute by flowid(RSS has value).
7040 */
7041 return (cpuid + ncpu - sc->sc_affinity_offset) % sc->sc_nqueues;
7042 }
7043
7044 /*
7045 * wm_start: [ifnet interface function]
7046 *
7047 * Start packet transmission on the interface.
7048 */
7049 static void
7050 wm_start(struct ifnet *ifp)
7051 {
7052 struct wm_softc *sc = ifp->if_softc;
7053 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7054
7055 #ifdef WM_MPSAFE
7056 KASSERT(if_is_mpsafe(ifp));
7057 #endif
7058 /*
7059 * ifp->if_obytes and ifp->if_omcasts are added in if_transmit()@if.c.
7060 */
7061
7062 mutex_enter(txq->txq_lock);
7063 if (!txq->txq_stopping)
7064 wm_start_locked(ifp);
7065 mutex_exit(txq->txq_lock);
7066 }
7067
7068 static void
7069 wm_start_locked(struct ifnet *ifp)
7070 {
7071 struct wm_softc *sc = ifp->if_softc;
7072 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7073
7074 wm_send_common_locked(ifp, txq, false);
7075 }
7076
7077 static int
7078 wm_transmit(struct ifnet *ifp, struct mbuf *m)
7079 {
7080 int qid;
7081 struct wm_softc *sc = ifp->if_softc;
7082 struct wm_txqueue *txq;
7083
7084 qid = wm_select_txqueue(ifp, m);
7085 txq = &sc->sc_queue[qid].wmq_txq;
7086
7087 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7088 m_freem(m);
7089 WM_Q_EVCNT_INCR(txq, txdrop);
7090 return ENOBUFS;
7091 }
7092
7093 /*
7094 * XXXX NOMPSAFE: ifp->if_data should be percpu.
7095 */
7096 ifp->if_obytes += m->m_pkthdr.len;
7097 if (m->m_flags & M_MCAST)
7098 ifp->if_omcasts++;
7099
7100 if (mutex_tryenter(txq->txq_lock)) {
7101 if (!txq->txq_stopping)
7102 wm_transmit_locked(ifp, txq);
7103 mutex_exit(txq->txq_lock);
7104 }
7105
7106 return 0;
7107 }
7108
7109 static void
7110 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7111 {
7112
7113 wm_send_common_locked(ifp, txq, true);
7114 }
7115
7116 static void
7117 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7118 bool is_transmit)
7119 {
7120 struct wm_softc *sc = ifp->if_softc;
7121 struct mbuf *m0;
7122 struct wm_txsoft *txs;
7123 bus_dmamap_t dmamap;
7124 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso;
7125 bus_addr_t curaddr;
7126 bus_size_t seglen, curlen;
7127 uint32_t cksumcmd;
7128 uint8_t cksumfields;
7129
7130 KASSERT(mutex_owned(txq->txq_lock));
7131
7132 if ((ifp->if_flags & IFF_RUNNING) == 0)
7133 return;
7134 if ((ifp->if_flags & IFF_OACTIVE) != 0 && !is_transmit)
7135 return;
7136 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7137 return;
7138
7139 /* Remember the previous number of free descriptors. */
7140 ofree = txq->txq_free;
7141
7142 /*
7143 * Loop through the send queue, setting up transmit descriptors
7144 * until we drain the queue, or use up all available transmit
7145 * descriptors.
7146 */
7147 for (;;) {
7148 m0 = NULL;
7149
7150 /* Get a work queue entry. */
7151 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7152 wm_txeof(txq, UINT_MAX);
7153 if (txq->txq_sfree == 0) {
7154 DPRINTF(WM_DEBUG_TX,
7155 ("%s: TX: no free job descriptors\n",
7156 device_xname(sc->sc_dev)));
7157 WM_Q_EVCNT_INCR(txq, txsstall);
7158 break;
7159 }
7160 }
7161
7162 /* Grab a packet off the queue. */
7163 if (is_transmit)
7164 m0 = pcq_get(txq->txq_interq);
7165 else
7166 IFQ_DEQUEUE(&ifp->if_snd, m0);
7167 if (m0 == NULL)
7168 break;
7169
7170 DPRINTF(WM_DEBUG_TX,
7171 ("%s: TX: have packet to transmit: %p\n",
7172 device_xname(sc->sc_dev), m0));
7173
7174 txs = &txq->txq_soft[txq->txq_snext];
7175 dmamap = txs->txs_dmamap;
7176
7177 use_tso = (m0->m_pkthdr.csum_flags &
7178 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0;
7179
7180 /*
7181 * So says the Linux driver:
7182 * The controller does a simple calculation to make sure
7183 * there is enough room in the FIFO before initiating the
7184 * DMA for each buffer. The calc is:
7185 * 4 = ceil(buffer len / MSS)
7186 * To make sure we don't overrun the FIFO, adjust the max
7187 * buffer len if the MSS drops.
7188 */
7189 dmamap->dm_maxsegsz =
7190 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN)
7191 ? m0->m_pkthdr.segsz << 2
7192 : WTX_MAX_LEN;
7193
7194 /*
7195 * Load the DMA map. If this fails, the packet either
7196 * didn't fit in the allotted number of segments, or we
7197 * were short on resources. For the too-many-segments
7198 * case, we simply report an error and drop the packet,
7199 * since we can't sanely copy a jumbo packet to a single
7200 * buffer.
7201 */
7202 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
7203 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
7204 if (error) {
7205 if (error == EFBIG) {
7206 WM_Q_EVCNT_INCR(txq, txdrop);
7207 log(LOG_ERR, "%s: Tx packet consumes too many "
7208 "DMA segments, dropping...\n",
7209 device_xname(sc->sc_dev));
7210 wm_dump_mbuf_chain(sc, m0);
7211 m_freem(m0);
7212 continue;
7213 }
7214 /* Short on resources, just stop for now. */
7215 DPRINTF(WM_DEBUG_TX,
7216 ("%s: TX: dmamap load failed: %d\n",
7217 device_xname(sc->sc_dev), error));
7218 break;
7219 }
7220
7221 segs_needed = dmamap->dm_nsegs;
7222 if (use_tso) {
7223 /* For sentinel descriptor; see below. */
7224 segs_needed++;
7225 }
7226
7227 /*
7228 * Ensure we have enough descriptors free to describe
7229 * the packet. Note, we always reserve one descriptor
7230 * at the end of the ring due to the semantics of the
7231 * TDT register, plus one more in the event we need
7232 * to load offload context.
7233 */
7234 if (segs_needed > txq->txq_free - 2) {
7235 /*
7236 * Not enough free descriptors to transmit this
7237 * packet. We haven't committed anything yet,
7238 * so just unload the DMA map, put the packet
7239 * pack on the queue, and punt. Notify the upper
7240 * layer that there are no more slots left.
7241 */
7242 DPRINTF(WM_DEBUG_TX,
7243 ("%s: TX: need %d (%d) descriptors, have %d\n",
7244 device_xname(sc->sc_dev), dmamap->dm_nsegs,
7245 segs_needed, txq->txq_free - 1));
7246 if (!is_transmit)
7247 ifp->if_flags |= IFF_OACTIVE;
7248 txq->txq_flags |= WM_TXQ_NO_SPACE;
7249 bus_dmamap_unload(sc->sc_dmat, dmamap);
7250 WM_Q_EVCNT_INCR(txq, txdstall);
7251 break;
7252 }
7253
7254 /*
7255 * Check for 82547 Tx FIFO bug. We need to do this
7256 * once we know we can transmit the packet, since we
7257 * do some internal FIFO space accounting here.
7258 */
7259 if (sc->sc_type == WM_T_82547 &&
7260 wm_82547_txfifo_bugchk(sc, m0)) {
7261 DPRINTF(WM_DEBUG_TX,
7262 ("%s: TX: 82547 Tx FIFO bug detected\n",
7263 device_xname(sc->sc_dev)));
7264 if (!is_transmit)
7265 ifp->if_flags |= IFF_OACTIVE;
7266 txq->txq_flags |= WM_TXQ_NO_SPACE;
7267 bus_dmamap_unload(sc->sc_dmat, dmamap);
7268 WM_Q_EVCNT_INCR(txq, txfifo_stall);
7269 break;
7270 }
7271
7272 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
7273
7274 DPRINTF(WM_DEBUG_TX,
7275 ("%s: TX: packet has %d (%d) DMA segments\n",
7276 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
7277
7278 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
7279
7280 /*
7281 * Store a pointer to the packet so that we can free it
7282 * later.
7283 *
7284 * Initially, we consider the number of descriptors the
7285 * packet uses the number of DMA segments. This may be
7286 * incremented by 1 if we do checksum offload (a descriptor
7287 * is used to set the checksum context).
7288 */
7289 txs->txs_mbuf = m0;
7290 txs->txs_firstdesc = txq->txq_next;
7291 txs->txs_ndesc = segs_needed;
7292
7293 /* Set up offload parameters for this packet. */
7294 if (m0->m_pkthdr.csum_flags &
7295 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
7296 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7297 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
7298 if (wm_tx_offload(sc, txq, txs, &cksumcmd,
7299 &cksumfields) != 0) {
7300 /* Error message already displayed. */
7301 bus_dmamap_unload(sc->sc_dmat, dmamap);
7302 continue;
7303 }
7304 } else {
7305 cksumcmd = 0;
7306 cksumfields = 0;
7307 }
7308
7309 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS;
7310
7311 /* Sync the DMA map. */
7312 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
7313 BUS_DMASYNC_PREWRITE);
7314
7315 /* Initialize the transmit descriptor. */
7316 for (nexttx = txq->txq_next, seg = 0;
7317 seg < dmamap->dm_nsegs; seg++) {
7318 for (seglen = dmamap->dm_segs[seg].ds_len,
7319 curaddr = dmamap->dm_segs[seg].ds_addr;
7320 seglen != 0;
7321 curaddr += curlen, seglen -= curlen,
7322 nexttx = WM_NEXTTX(txq, nexttx)) {
7323 curlen = seglen;
7324
7325 /*
7326 * So says the Linux driver:
7327 * Work around for premature descriptor
7328 * write-backs in TSO mode. Append a
7329 * 4-byte sentinel descriptor.
7330 */
7331 if (use_tso && seg == dmamap->dm_nsegs - 1 &&
7332 curlen > 8)
7333 curlen -= 4;
7334
7335 wm_set_dma_addr(
7336 &txq->txq_descs[nexttx].wtx_addr, curaddr);
7337 txq->txq_descs[nexttx].wtx_cmdlen
7338 = htole32(cksumcmd | curlen);
7339 txq->txq_descs[nexttx].wtx_fields.wtxu_status
7340 = 0;
7341 txq->txq_descs[nexttx].wtx_fields.wtxu_options
7342 = cksumfields;
7343 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
7344 lasttx = nexttx;
7345
7346 DPRINTF(WM_DEBUG_TX,
7347 ("%s: TX: desc %d: low %#" PRIx64 ", "
7348 "len %#04zx\n",
7349 device_xname(sc->sc_dev), nexttx,
7350 (uint64_t)curaddr, curlen));
7351 }
7352 }
7353
7354 KASSERT(lasttx != -1);
7355
7356 /*
7357 * Set up the command byte on the last descriptor of
7358 * the packet. If we're in the interrupt delay window,
7359 * delay the interrupt.
7360 */
7361 txq->txq_descs[lasttx].wtx_cmdlen |=
7362 htole32(WTX_CMD_EOP | WTX_CMD_RS);
7363
7364 /*
7365 * If VLANs are enabled and the packet has a VLAN tag, set
7366 * up the descriptor to encapsulate the packet for us.
7367 *
7368 * This is only valid on the last descriptor of the packet.
7369 */
7370 if (vlan_has_tag(m0)) {
7371 txq->txq_descs[lasttx].wtx_cmdlen |=
7372 htole32(WTX_CMD_VLE);
7373 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan
7374 = htole16(vlan_get_tag(m0));
7375 }
7376
7377 txs->txs_lastdesc = lasttx;
7378
7379 DPRINTF(WM_DEBUG_TX,
7380 ("%s: TX: desc %d: cmdlen 0x%08x\n",
7381 device_xname(sc->sc_dev),
7382 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
7383
7384 /* Sync the descriptors we're using. */
7385 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
7386 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7387
7388 /* Give the packet to the chip. */
7389 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
7390
7391 DPRINTF(WM_DEBUG_TX,
7392 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
7393
7394 DPRINTF(WM_DEBUG_TX,
7395 ("%s: TX: finished transmitting packet, job %d\n",
7396 device_xname(sc->sc_dev), txq->txq_snext));
7397
7398 /* Advance the tx pointer. */
7399 txq->txq_free -= txs->txs_ndesc;
7400 txq->txq_next = nexttx;
7401
7402 txq->txq_sfree--;
7403 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
7404
7405 /* Pass the packet to any BPF listeners. */
7406 bpf_mtap(ifp, m0);
7407 }
7408
7409 if (m0 != NULL) {
7410 if (!is_transmit)
7411 ifp->if_flags |= IFF_OACTIVE;
7412 txq->txq_flags |= WM_TXQ_NO_SPACE;
7413 WM_Q_EVCNT_INCR(txq, txdrop);
7414 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
7415 __func__));
7416 m_freem(m0);
7417 }
7418
7419 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
7420 /* No more slots; notify upper layer. */
7421 if (!is_transmit)
7422 ifp->if_flags |= IFF_OACTIVE;
7423 txq->txq_flags |= WM_TXQ_NO_SPACE;
7424 }
7425
7426 if (txq->txq_free != ofree) {
7427 /* Set a watchdog timer in case the chip flakes out. */
7428 txq->txq_lastsent = time_uptime;
7429 txq->txq_watchdog = true;
7430 }
7431 }
7432
7433 /*
7434 * wm_nq_tx_offload:
7435 *
7436 * Set up TCP/IP checksumming parameters for the
7437 * specified packet, for NEWQUEUE devices
7438 */
7439 static int
7440 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
7441 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum)
7442 {
7443 struct mbuf *m0 = txs->txs_mbuf;
7444 uint32_t vl_len, mssidx, cmdc;
7445 struct ether_header *eh;
7446 int offset, iphl;
7447
7448 /*
7449 * XXX It would be nice if the mbuf pkthdr had offset
7450 * fields for the protocol headers.
7451 */
7452 *cmdlenp = 0;
7453 *fieldsp = 0;
7454
7455 eh = mtod(m0, struct ether_header *);
7456 switch (htons(eh->ether_type)) {
7457 case ETHERTYPE_IP:
7458 case ETHERTYPE_IPV6:
7459 offset = ETHER_HDR_LEN;
7460 break;
7461
7462 case ETHERTYPE_VLAN:
7463 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
7464 break;
7465
7466 default:
7467 /* Don't support this protocol or encapsulation. */
7468 *do_csum = false;
7469 return 0;
7470 }
7471 *do_csum = true;
7472 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS;
7473 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT;
7474
7475 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT);
7476 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0);
7477
7478 if ((m0->m_pkthdr.csum_flags &
7479 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
7480 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
7481 } else {
7482 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
7483 }
7484 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT);
7485 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0);
7486
7487 if (vlan_has_tag(m0)) {
7488 vl_len |= ((vlan_get_tag(m0) & NQTXC_VLLEN_VLAN_MASK)
7489 << NQTXC_VLLEN_VLAN_SHIFT);
7490 *cmdlenp |= NQTX_CMD_VLE;
7491 }
7492
7493 mssidx = 0;
7494
7495 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
7496 int hlen = offset + iphl;
7497 int tcp_hlen;
7498 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
7499
7500 if (__predict_false(m0->m_len <
7501 (hlen + sizeof(struct tcphdr)))) {
7502 /*
7503 * TCP/IP headers are not in the first mbuf; we need
7504 * to do this the slow and painful way. Let's just
7505 * hope this doesn't happen very often.
7506 */
7507 struct tcphdr th;
7508
7509 WM_Q_EVCNT_INCR(txq, txtsopain);
7510
7511 m_copydata(m0, hlen, sizeof(th), &th);
7512 if (v4) {
7513 struct ip ip;
7514
7515 m_copydata(m0, offset, sizeof(ip), &ip);
7516 ip.ip_len = 0;
7517 m_copyback(m0,
7518 offset + offsetof(struct ip, ip_len),
7519 sizeof(ip.ip_len), &ip.ip_len);
7520 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
7521 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
7522 } else {
7523 struct ip6_hdr ip6;
7524
7525 m_copydata(m0, offset, sizeof(ip6), &ip6);
7526 ip6.ip6_plen = 0;
7527 m_copyback(m0,
7528 offset + offsetof(struct ip6_hdr, ip6_plen),
7529 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
7530 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
7531 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
7532 }
7533 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
7534 sizeof(th.th_sum), &th.th_sum);
7535
7536 tcp_hlen = th.th_off << 2;
7537 } else {
7538 /*
7539 * TCP/IP headers are in the first mbuf; we can do
7540 * this the easy way.
7541 */
7542 struct tcphdr *th;
7543
7544 if (v4) {
7545 struct ip *ip =
7546 (void *)(mtod(m0, char *) + offset);
7547 th = (void *)(mtod(m0, char *) + hlen);
7548
7549 ip->ip_len = 0;
7550 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
7551 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
7552 } else {
7553 struct ip6_hdr *ip6 =
7554 (void *)(mtod(m0, char *) + offset);
7555 th = (void *)(mtod(m0, char *) + hlen);
7556
7557 ip6->ip6_plen = 0;
7558 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
7559 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
7560 }
7561 tcp_hlen = th->th_off << 2;
7562 }
7563 hlen += tcp_hlen;
7564 *cmdlenp |= NQTX_CMD_TSE;
7565
7566 if (v4) {
7567 WM_Q_EVCNT_INCR(txq, txtso);
7568 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM;
7569 } else {
7570 WM_Q_EVCNT_INCR(txq, txtso6);
7571 *fieldsp |= NQTXD_FIELDS_TUXSM;
7572 }
7573 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT);
7574 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
7575 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT);
7576 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0);
7577 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT);
7578 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0);
7579 } else {
7580 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT);
7581 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
7582 }
7583
7584 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
7585 *fieldsp |= NQTXD_FIELDS_IXSM;
7586 cmdc |= NQTXC_CMD_IP4;
7587 }
7588
7589 if (m0->m_pkthdr.csum_flags &
7590 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
7591 WM_Q_EVCNT_INCR(txq, txtusum);
7592 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
7593 cmdc |= NQTXC_CMD_TCP;
7594 } else {
7595 cmdc |= NQTXC_CMD_UDP;
7596 }
7597 cmdc |= NQTXC_CMD_IP4;
7598 *fieldsp |= NQTXD_FIELDS_TUXSM;
7599 }
7600 if (m0->m_pkthdr.csum_flags &
7601 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
7602 WM_Q_EVCNT_INCR(txq, txtusum6);
7603 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
7604 cmdc |= NQTXC_CMD_TCP;
7605 } else {
7606 cmdc |= NQTXC_CMD_UDP;
7607 }
7608 cmdc |= NQTXC_CMD_IP6;
7609 *fieldsp |= NQTXD_FIELDS_TUXSM;
7610 }
7611
7612 /*
7613 * We don't have to write context descriptor for every packet to
7614 * NEWQUEUE controllers, that is 82575, 82576, 82580, I350, I354,
7615 * I210 and I211. It is enough to write once per a Tx queue for these
7616 * controllers.
7617 * It would be overhead to write context descriptor for every packet,
7618 * however it does not cause problems.
7619 */
7620 /* Fill in the context descriptor. */
7621 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len =
7622 htole32(vl_len);
7623 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0;
7624 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd =
7625 htole32(cmdc);
7626 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx =
7627 htole32(mssidx);
7628 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
7629 DPRINTF(WM_DEBUG_TX,
7630 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev),
7631 txq->txq_next, 0, vl_len));
7632 DPRINTF(WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc));
7633 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
7634 txs->txs_ndesc++;
7635 return 0;
7636 }
7637
7638 /*
7639 * wm_nq_start: [ifnet interface function]
7640 *
7641 * Start packet transmission on the interface for NEWQUEUE devices
7642 */
7643 static void
7644 wm_nq_start(struct ifnet *ifp)
7645 {
7646 struct wm_softc *sc = ifp->if_softc;
7647 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7648
7649 #ifdef WM_MPSAFE
7650 KASSERT(if_is_mpsafe(ifp));
7651 #endif
7652 /*
7653 * ifp->if_obytes and ifp->if_omcasts are added in if_transmit()@if.c.
7654 */
7655
7656 mutex_enter(txq->txq_lock);
7657 if (!txq->txq_stopping)
7658 wm_nq_start_locked(ifp);
7659 mutex_exit(txq->txq_lock);
7660 }
7661
7662 static void
7663 wm_nq_start_locked(struct ifnet *ifp)
7664 {
7665 struct wm_softc *sc = ifp->if_softc;
7666 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7667
7668 wm_nq_send_common_locked(ifp, txq, false);
7669 }
7670
7671 static int
7672 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m)
7673 {
7674 int qid;
7675 struct wm_softc *sc = ifp->if_softc;
7676 struct wm_txqueue *txq;
7677
7678 qid = wm_select_txqueue(ifp, m);
7679 txq = &sc->sc_queue[qid].wmq_txq;
7680
7681 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7682 m_freem(m);
7683 WM_Q_EVCNT_INCR(txq, txdrop);
7684 return ENOBUFS;
7685 }
7686
7687 /*
7688 * XXXX NOMPSAFE: ifp->if_data should be percpu.
7689 */
7690 ifp->if_obytes += m->m_pkthdr.len;
7691 if (m->m_flags & M_MCAST)
7692 ifp->if_omcasts++;
7693
7694 /*
7695 * The situations which this mutex_tryenter() fails at running time
7696 * are below two patterns.
7697 * (1) contention with interrupt handler(wm_txrxintr_msix())
7698 * (2) contention with deferred if_start softint(wm_handle_queue())
7699 * In the case of (1), the last packet enqueued to txq->txq_interq is
7700 * dequeued by wm_deferred_start_locked(). So, it does not get stuck.
7701 * In the case of (2), the last packet enqueued to txq->txq_interq is also
7702 * dequeued by wm_deferred_start_locked(). So, it does not get stuck, either.
7703 */
7704 if (mutex_tryenter(txq->txq_lock)) {
7705 if (!txq->txq_stopping)
7706 wm_nq_transmit_locked(ifp, txq);
7707 mutex_exit(txq->txq_lock);
7708 }
7709
7710 return 0;
7711 }
7712
7713 static void
7714 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7715 {
7716
7717 wm_nq_send_common_locked(ifp, txq, true);
7718 }
7719
7720 static void
7721 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7722 bool is_transmit)
7723 {
7724 struct wm_softc *sc = ifp->if_softc;
7725 struct mbuf *m0;
7726 struct wm_txsoft *txs;
7727 bus_dmamap_t dmamap;
7728 int error, nexttx, lasttx = -1, seg, segs_needed;
7729 bool do_csum, sent;
7730
7731 KASSERT(mutex_owned(txq->txq_lock));
7732
7733 if ((ifp->if_flags & IFF_RUNNING) == 0)
7734 return;
7735 if ((ifp->if_flags & IFF_OACTIVE) != 0 && !is_transmit)
7736 return;
7737 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7738 return;
7739
7740 sent = false;
7741
7742 /*
7743 * Loop through the send queue, setting up transmit descriptors
7744 * until we drain the queue, or use up all available transmit
7745 * descriptors.
7746 */
7747 for (;;) {
7748 m0 = NULL;
7749
7750 /* Get a work queue entry. */
7751 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7752 wm_txeof(txq, UINT_MAX);
7753 if (txq->txq_sfree == 0) {
7754 DPRINTF(WM_DEBUG_TX,
7755 ("%s: TX: no free job descriptors\n",
7756 device_xname(sc->sc_dev)));
7757 WM_Q_EVCNT_INCR(txq, txsstall);
7758 break;
7759 }
7760 }
7761
7762 /* Grab a packet off the queue. */
7763 if (is_transmit)
7764 m0 = pcq_get(txq->txq_interq);
7765 else
7766 IFQ_DEQUEUE(&ifp->if_snd, m0);
7767 if (m0 == NULL)
7768 break;
7769
7770 DPRINTF(WM_DEBUG_TX,
7771 ("%s: TX: have packet to transmit: %p\n",
7772 device_xname(sc->sc_dev), m0));
7773
7774 txs = &txq->txq_soft[txq->txq_snext];
7775 dmamap = txs->txs_dmamap;
7776
7777 /*
7778 * Load the DMA map. If this fails, the packet either
7779 * didn't fit in the allotted number of segments, or we
7780 * were short on resources. For the too-many-segments
7781 * case, we simply report an error and drop the packet,
7782 * since we can't sanely copy a jumbo packet to a single
7783 * buffer.
7784 */
7785 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
7786 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
7787 if (error) {
7788 if (error == EFBIG) {
7789 WM_Q_EVCNT_INCR(txq, txdrop);
7790 log(LOG_ERR, "%s: Tx packet consumes too many "
7791 "DMA segments, dropping...\n",
7792 device_xname(sc->sc_dev));
7793 wm_dump_mbuf_chain(sc, m0);
7794 m_freem(m0);
7795 continue;
7796 }
7797 /* Short on resources, just stop for now. */
7798 DPRINTF(WM_DEBUG_TX,
7799 ("%s: TX: dmamap load failed: %d\n",
7800 device_xname(sc->sc_dev), error));
7801 break;
7802 }
7803
7804 segs_needed = dmamap->dm_nsegs;
7805
7806 /*
7807 * Ensure we have enough descriptors free to describe
7808 * the packet. Note, we always reserve one descriptor
7809 * at the end of the ring due to the semantics of the
7810 * TDT register, plus one more in the event we need
7811 * to load offload context.
7812 */
7813 if (segs_needed > txq->txq_free - 2) {
7814 /*
7815 * Not enough free descriptors to transmit this
7816 * packet. We haven't committed anything yet,
7817 * so just unload the DMA map, put the packet
7818 * pack on the queue, and punt. Notify the upper
7819 * layer that there are no more slots left.
7820 */
7821 DPRINTF(WM_DEBUG_TX,
7822 ("%s: TX: need %d (%d) descriptors, have %d\n",
7823 device_xname(sc->sc_dev), dmamap->dm_nsegs,
7824 segs_needed, txq->txq_free - 1));
7825 if (!is_transmit)
7826 ifp->if_flags |= IFF_OACTIVE;
7827 txq->txq_flags |= WM_TXQ_NO_SPACE;
7828 bus_dmamap_unload(sc->sc_dmat, dmamap);
7829 WM_Q_EVCNT_INCR(txq, txdstall);
7830 break;
7831 }
7832
7833 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
7834
7835 DPRINTF(WM_DEBUG_TX,
7836 ("%s: TX: packet has %d (%d) DMA segments\n",
7837 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
7838
7839 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
7840
7841 /*
7842 * Store a pointer to the packet so that we can free it
7843 * later.
7844 *
7845 * Initially, we consider the number of descriptors the
7846 * packet uses the number of DMA segments. This may be
7847 * incremented by 1 if we do checksum offload (a descriptor
7848 * is used to set the checksum context).
7849 */
7850 txs->txs_mbuf = m0;
7851 txs->txs_firstdesc = txq->txq_next;
7852 txs->txs_ndesc = segs_needed;
7853
7854 /* Set up offload parameters for this packet. */
7855 uint32_t cmdlen, fields, dcmdlen;
7856 if (m0->m_pkthdr.csum_flags &
7857 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
7858 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7859 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
7860 if (wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields,
7861 &do_csum) != 0) {
7862 /* Error message already displayed. */
7863 bus_dmamap_unload(sc->sc_dmat, dmamap);
7864 continue;
7865 }
7866 } else {
7867 do_csum = false;
7868 cmdlen = 0;
7869 fields = 0;
7870 }
7871
7872 /* Sync the DMA map. */
7873 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
7874 BUS_DMASYNC_PREWRITE);
7875
7876 /* Initialize the first transmit descriptor. */
7877 nexttx = txq->txq_next;
7878 if (!do_csum) {
7879 /* setup a legacy descriptor */
7880 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr,
7881 dmamap->dm_segs[0].ds_addr);
7882 txq->txq_descs[nexttx].wtx_cmdlen =
7883 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len);
7884 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0;
7885 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0;
7886 if (vlan_has_tag(m0)) {
7887 txq->txq_descs[nexttx].wtx_cmdlen |=
7888 htole32(WTX_CMD_VLE);
7889 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =
7890 htole16(vlan_get_tag(m0));
7891 } else {
7892 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
7893 }
7894 dcmdlen = 0;
7895 } else {
7896 /* setup an advanced data descriptor */
7897 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
7898 htole64(dmamap->dm_segs[0].ds_addr);
7899 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0);
7900 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
7901 htole32(dmamap->dm_segs[0].ds_len | cmdlen );
7902 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields =
7903 htole32(fields);
7904 DPRINTF(WM_DEBUG_TX,
7905 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n",
7906 device_xname(sc->sc_dev), nexttx,
7907 (uint64_t)dmamap->dm_segs[0].ds_addr));
7908 DPRINTF(WM_DEBUG_TX,
7909 ("\t 0x%08x%08x\n", fields,
7910 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen));
7911 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT;
7912 }
7913
7914 lasttx = nexttx;
7915 nexttx = WM_NEXTTX(txq, nexttx);
7916 /*
7917 * fill in the next descriptors. legacy or advanced format
7918 * is the same here
7919 */
7920 for (seg = 1; seg < dmamap->dm_nsegs;
7921 seg++, nexttx = WM_NEXTTX(txq, nexttx)) {
7922 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
7923 htole64(dmamap->dm_segs[seg].ds_addr);
7924 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
7925 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len);
7926 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0);
7927 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0;
7928 lasttx = nexttx;
7929
7930 DPRINTF(WM_DEBUG_TX,
7931 ("%s: TX: desc %d: %#" PRIx64 ", "
7932 "len %#04zx\n",
7933 device_xname(sc->sc_dev), nexttx,
7934 (uint64_t)dmamap->dm_segs[seg].ds_addr,
7935 dmamap->dm_segs[seg].ds_len));
7936 }
7937
7938 KASSERT(lasttx != -1);
7939
7940 /*
7941 * Set up the command byte on the last descriptor of
7942 * the packet. If we're in the interrupt delay window,
7943 * delay the interrupt.
7944 */
7945 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) ==
7946 (NQTX_CMD_EOP | NQTX_CMD_RS));
7947 txq->txq_descs[lasttx].wtx_cmdlen |=
7948 htole32(WTX_CMD_EOP | WTX_CMD_RS);
7949
7950 txs->txs_lastdesc = lasttx;
7951
7952 DPRINTF(WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n",
7953 device_xname(sc->sc_dev),
7954 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
7955
7956 /* Sync the descriptors we're using. */
7957 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
7958 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7959
7960 /* Give the packet to the chip. */
7961 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
7962 sent = true;
7963
7964 DPRINTF(WM_DEBUG_TX,
7965 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
7966
7967 DPRINTF(WM_DEBUG_TX,
7968 ("%s: TX: finished transmitting packet, job %d\n",
7969 device_xname(sc->sc_dev), txq->txq_snext));
7970
7971 /* Advance the tx pointer. */
7972 txq->txq_free -= txs->txs_ndesc;
7973 txq->txq_next = nexttx;
7974
7975 txq->txq_sfree--;
7976 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
7977
7978 /* Pass the packet to any BPF listeners. */
7979 bpf_mtap(ifp, m0);
7980 }
7981
7982 if (m0 != NULL) {
7983 if (!is_transmit)
7984 ifp->if_flags |= IFF_OACTIVE;
7985 txq->txq_flags |= WM_TXQ_NO_SPACE;
7986 WM_Q_EVCNT_INCR(txq, txdrop);
7987 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
7988 __func__));
7989 m_freem(m0);
7990 }
7991
7992 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
7993 /* No more slots; notify upper layer. */
7994 if (!is_transmit)
7995 ifp->if_flags |= IFF_OACTIVE;
7996 txq->txq_flags |= WM_TXQ_NO_SPACE;
7997 }
7998
7999 if (sent) {
8000 /* Set a watchdog timer in case the chip flakes out. */
8001 txq->txq_lastsent = time_uptime;
8002 txq->txq_watchdog = true;
8003 }
8004 }
8005
8006 static void
8007 wm_deferred_start_locked(struct wm_txqueue *txq)
8008 {
8009 struct wm_softc *sc = txq->txq_sc;
8010 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8011 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
8012 int qid = wmq->wmq_id;
8013
8014 KASSERT(mutex_owned(txq->txq_lock));
8015
8016 if (txq->txq_stopping) {
8017 mutex_exit(txq->txq_lock);
8018 return;
8019 }
8020
8021 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
8022 /* XXX need for ALTQ or one CPU system */
8023 if (qid == 0)
8024 wm_nq_start_locked(ifp);
8025 wm_nq_transmit_locked(ifp, txq);
8026 } else {
8027 /* XXX need for ALTQ or one CPU system */
8028 if (qid == 0)
8029 wm_start_locked(ifp);
8030 wm_transmit_locked(ifp, txq);
8031 }
8032 }
8033
8034 /* Interrupt */
8035
8036 /*
8037 * wm_txeof:
8038 *
8039 * Helper; handle transmit interrupts.
8040 */
8041 static bool
8042 wm_txeof(struct wm_txqueue *txq, u_int limit)
8043 {
8044 struct wm_softc *sc = txq->txq_sc;
8045 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8046 struct wm_txsoft *txs;
8047 int count = 0;
8048 int i;
8049 uint8_t status;
8050 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
8051 bool more = false;
8052
8053 KASSERT(mutex_owned(txq->txq_lock));
8054
8055 if (txq->txq_stopping)
8056 return false;
8057
8058 txq->txq_flags &= ~WM_TXQ_NO_SPACE;
8059 /* for ALTQ and legacy(not use multiqueue) ethernet controller */
8060 if (wmq->wmq_id == 0)
8061 ifp->if_flags &= ~IFF_OACTIVE;
8062
8063 /*
8064 * Go through the Tx list and free mbufs for those
8065 * frames which have been transmitted.
8066 */
8067 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq);
8068 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) {
8069 if (limit-- == 0) {
8070 more = true;
8071 DPRINTF(WM_DEBUG_TX,
8072 ("%s: TX: loop limited, job %d is not processed\n",
8073 device_xname(sc->sc_dev), i));
8074 break;
8075 }
8076
8077 txs = &txq->txq_soft[i];
8078
8079 DPRINTF(WM_DEBUG_TX, ("%s: TX: checking job %d\n",
8080 device_xname(sc->sc_dev), i));
8081
8082 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc,
8083 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
8084
8085 status =
8086 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status;
8087 if ((status & WTX_ST_DD) == 0) {
8088 wm_cdtxsync(txq, txs->txs_lastdesc, 1,
8089 BUS_DMASYNC_PREREAD);
8090 break;
8091 }
8092
8093 count++;
8094 DPRINTF(WM_DEBUG_TX,
8095 ("%s: TX: job %d done: descs %d..%d\n",
8096 device_xname(sc->sc_dev), i, txs->txs_firstdesc,
8097 txs->txs_lastdesc));
8098
8099 /*
8100 * XXX We should probably be using the statistics
8101 * XXX registers, but I don't know if they exist
8102 * XXX on chips before the i82544.
8103 */
8104
8105 #ifdef WM_EVENT_COUNTERS
8106 if (status & WTX_ST_TU)
8107 WM_Q_EVCNT_INCR(txq, tu);
8108 #endif /* WM_EVENT_COUNTERS */
8109
8110 if (status & (WTX_ST_EC | WTX_ST_LC)) {
8111 ifp->if_oerrors++;
8112 if (status & WTX_ST_LC)
8113 log(LOG_WARNING, "%s: late collision\n",
8114 device_xname(sc->sc_dev));
8115 else if (status & WTX_ST_EC) {
8116 ifp->if_collisions += 16;
8117 log(LOG_WARNING, "%s: excessive collisions\n",
8118 device_xname(sc->sc_dev));
8119 }
8120 } else
8121 ifp->if_opackets++;
8122
8123 txq->txq_packets++;
8124 txq->txq_bytes += txs->txs_mbuf->m_pkthdr.len;
8125
8126 txq->txq_free += txs->txs_ndesc;
8127 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
8128 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
8129 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
8130 m_freem(txs->txs_mbuf);
8131 txs->txs_mbuf = NULL;
8132 }
8133
8134 /* Update the dirty transmit buffer pointer. */
8135 txq->txq_sdirty = i;
8136 DPRINTF(WM_DEBUG_TX,
8137 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i));
8138
8139 if (count != 0)
8140 rnd_add_uint32(&sc->rnd_source, count);
8141
8142 /*
8143 * If there are no more pending transmissions, cancel the watchdog
8144 * timer.
8145 */
8146 if (txq->txq_sfree == WM_TXQUEUELEN(txq))
8147 txq->txq_watchdog = false;
8148
8149 return more;
8150 }
8151
8152 static inline uint32_t
8153 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx)
8154 {
8155 struct wm_softc *sc = rxq->rxq_sc;
8156
8157 if (sc->sc_type == WM_T_82574)
8158 return EXTRXC_STATUS(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
8159 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8160 return NQRXC_STATUS(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
8161 else
8162 return rxq->rxq_descs[idx].wrx_status;
8163 }
8164
8165 static inline uint32_t
8166 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx)
8167 {
8168 struct wm_softc *sc = rxq->rxq_sc;
8169
8170 if (sc->sc_type == WM_T_82574)
8171 return EXTRXC_ERROR(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
8172 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8173 return NQRXC_ERROR(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
8174 else
8175 return rxq->rxq_descs[idx].wrx_errors;
8176 }
8177
8178 static inline uint16_t
8179 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx)
8180 {
8181 struct wm_softc *sc = rxq->rxq_sc;
8182
8183 if (sc->sc_type == WM_T_82574)
8184 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan;
8185 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8186 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan;
8187 else
8188 return rxq->rxq_descs[idx].wrx_special;
8189 }
8190
8191 static inline int
8192 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx)
8193 {
8194 struct wm_softc *sc = rxq->rxq_sc;
8195
8196 if (sc->sc_type == WM_T_82574)
8197 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen;
8198 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8199 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen;
8200 else
8201 return rxq->rxq_descs[idx].wrx_len;
8202 }
8203
8204 #ifdef WM_DEBUG
8205 static inline uint32_t
8206 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx)
8207 {
8208 struct wm_softc *sc = rxq->rxq_sc;
8209
8210 if (sc->sc_type == WM_T_82574)
8211 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash;
8212 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8213 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash;
8214 else
8215 return 0;
8216 }
8217
8218 static inline uint8_t
8219 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx)
8220 {
8221 struct wm_softc *sc = rxq->rxq_sc;
8222
8223 if (sc->sc_type == WM_T_82574)
8224 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq);
8225 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8226 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc);
8227 else
8228 return 0;
8229 }
8230 #endif /* WM_DEBUG */
8231
8232 static inline bool
8233 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status,
8234 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
8235 {
8236
8237 if (sc->sc_type == WM_T_82574)
8238 return (status & ext_bit) != 0;
8239 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8240 return (status & nq_bit) != 0;
8241 else
8242 return (status & legacy_bit) != 0;
8243 }
8244
8245 static inline bool
8246 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error,
8247 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
8248 {
8249
8250 if (sc->sc_type == WM_T_82574)
8251 return (error & ext_bit) != 0;
8252 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8253 return (error & nq_bit) != 0;
8254 else
8255 return (error & legacy_bit) != 0;
8256 }
8257
8258 static inline bool
8259 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status)
8260 {
8261
8262 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
8263 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP))
8264 return true;
8265 else
8266 return false;
8267 }
8268
8269 static inline bool
8270 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors)
8271 {
8272 struct wm_softc *sc = rxq->rxq_sc;
8273
8274 /* XXXX missing error bit for newqueue? */
8275 if (wm_rxdesc_is_set_error(sc, errors,
8276 WRX_ER_CE|WRX_ER_SE|WRX_ER_SEQ|WRX_ER_CXE|WRX_ER_RXE,
8277 EXTRXC_ERROR_CE|EXTRXC_ERROR_SE|EXTRXC_ERROR_SEQ|EXTRXC_ERROR_CXE|EXTRXC_ERROR_RXE,
8278 NQRXC_ERROR_RXE)) {
8279 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE, EXTRXC_ERROR_SE, 0))
8280 log(LOG_WARNING, "%s: symbol error\n",
8281 device_xname(sc->sc_dev));
8282 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ, EXTRXC_ERROR_SEQ, 0))
8283 log(LOG_WARNING, "%s: receive sequence error\n",
8284 device_xname(sc->sc_dev));
8285 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE, EXTRXC_ERROR_CE, 0))
8286 log(LOG_WARNING, "%s: CRC error\n",
8287 device_xname(sc->sc_dev));
8288 return true;
8289 }
8290
8291 return false;
8292 }
8293
8294 static inline bool
8295 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status)
8296 {
8297 struct wm_softc *sc = rxq->rxq_sc;
8298
8299 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD,
8300 NQRXC_STATUS_DD)) {
8301 /* We have processed all of the receive descriptors. */
8302 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD);
8303 return false;
8304 }
8305
8306 return true;
8307 }
8308
8309 static inline bool
8310 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status, uint16_t vlantag,
8311 struct mbuf *m)
8312 {
8313
8314 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
8315 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) {
8316 vlan_set_tag(m, le16toh(vlantag));
8317 }
8318
8319 return true;
8320 }
8321
8322 static inline void
8323 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status,
8324 uint32_t errors, struct mbuf *m)
8325 {
8326 struct wm_softc *sc = rxq->rxq_sc;
8327
8328 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) {
8329 if (wm_rxdesc_is_set_status(sc, status,
8330 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) {
8331 WM_Q_EVCNT_INCR(rxq, rxipsum);
8332 m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
8333 if (wm_rxdesc_is_set_error(sc, errors,
8334 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE))
8335 m->m_pkthdr.csum_flags |=
8336 M_CSUM_IPv4_BAD;
8337 }
8338 if (wm_rxdesc_is_set_status(sc, status,
8339 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) {
8340 /*
8341 * Note: we don't know if this was TCP or UDP,
8342 * so we just set both bits, and expect the
8343 * upper layers to deal.
8344 */
8345 WM_Q_EVCNT_INCR(rxq, rxtusum);
8346 m->m_pkthdr.csum_flags |=
8347 M_CSUM_TCPv4 | M_CSUM_UDPv4 |
8348 M_CSUM_TCPv6 | M_CSUM_UDPv6;
8349 if (wm_rxdesc_is_set_error(sc, errors,
8350 WRX_ER_TCPE, EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E))
8351 m->m_pkthdr.csum_flags |=
8352 M_CSUM_TCP_UDP_BAD;
8353 }
8354 }
8355 }
8356
8357 /*
8358 * wm_rxeof:
8359 *
8360 * Helper; handle receive interrupts.
8361 */
8362 static bool
8363 wm_rxeof(struct wm_rxqueue *rxq, u_int limit)
8364 {
8365 struct wm_softc *sc = rxq->rxq_sc;
8366 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8367 struct wm_rxsoft *rxs;
8368 struct mbuf *m;
8369 int i, len;
8370 int count = 0;
8371 uint32_t status, errors;
8372 uint16_t vlantag;
8373 bool more = false;
8374
8375 KASSERT(mutex_owned(rxq->rxq_lock));
8376
8377 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) {
8378 if (limit-- == 0) {
8379 rxq->rxq_ptr = i;
8380 more = true;
8381 DPRINTF(WM_DEBUG_RX,
8382 ("%s: RX: loop limited, descriptor %d is not processed\n",
8383 device_xname(sc->sc_dev), i));
8384 break;
8385 }
8386
8387 rxs = &rxq->rxq_soft[i];
8388
8389 DPRINTF(WM_DEBUG_RX,
8390 ("%s: RX: checking descriptor %d\n",
8391 device_xname(sc->sc_dev), i));
8392 wm_cdrxsync(rxq, i,BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
8393
8394 status = wm_rxdesc_get_status(rxq, i);
8395 errors = wm_rxdesc_get_errors(rxq, i);
8396 len = le16toh(wm_rxdesc_get_pktlen(rxq, i));
8397 vlantag = wm_rxdesc_get_vlantag(rxq, i);
8398 #ifdef WM_DEBUG
8399 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i));
8400 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i);
8401 #endif
8402
8403 if (!wm_rxdesc_dd(rxq, i, status)) {
8404 /*
8405 * Update the receive pointer holding rxq_lock
8406 * consistent with increment counter.
8407 */
8408 rxq->rxq_ptr = i;
8409 break;
8410 }
8411
8412 count++;
8413 if (__predict_false(rxq->rxq_discard)) {
8414 DPRINTF(WM_DEBUG_RX,
8415 ("%s: RX: discarding contents of descriptor %d\n",
8416 device_xname(sc->sc_dev), i));
8417 wm_init_rxdesc(rxq, i);
8418 if (wm_rxdesc_is_eop(rxq, status)) {
8419 /* Reset our state. */
8420 DPRINTF(WM_DEBUG_RX,
8421 ("%s: RX: resetting rxdiscard -> 0\n",
8422 device_xname(sc->sc_dev)));
8423 rxq->rxq_discard = 0;
8424 }
8425 continue;
8426 }
8427
8428 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
8429 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
8430
8431 m = rxs->rxs_mbuf;
8432
8433 /*
8434 * Add a new receive buffer to the ring, unless of
8435 * course the length is zero. Treat the latter as a
8436 * failed mapping.
8437 */
8438 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) {
8439 /*
8440 * Failed, throw away what we've done so
8441 * far, and discard the rest of the packet.
8442 */
8443 ifp->if_ierrors++;
8444 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
8445 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
8446 wm_init_rxdesc(rxq, i);
8447 if (!wm_rxdesc_is_eop(rxq, status))
8448 rxq->rxq_discard = 1;
8449 if (rxq->rxq_head != NULL)
8450 m_freem(rxq->rxq_head);
8451 WM_RXCHAIN_RESET(rxq);
8452 DPRINTF(WM_DEBUG_RX,
8453 ("%s: RX: Rx buffer allocation failed, "
8454 "dropping packet%s\n", device_xname(sc->sc_dev),
8455 rxq->rxq_discard ? " (discard)" : ""));
8456 continue;
8457 }
8458
8459 m->m_len = len;
8460 rxq->rxq_len += len;
8461 DPRINTF(WM_DEBUG_RX,
8462 ("%s: RX: buffer at %p len %d\n",
8463 device_xname(sc->sc_dev), m->m_data, len));
8464
8465 /* If this is not the end of the packet, keep looking. */
8466 if (!wm_rxdesc_is_eop(rxq, status)) {
8467 WM_RXCHAIN_LINK(rxq, m);
8468 DPRINTF(WM_DEBUG_RX,
8469 ("%s: RX: not yet EOP, rxlen -> %d\n",
8470 device_xname(sc->sc_dev), rxq->rxq_len));
8471 continue;
8472 }
8473
8474 /*
8475 * Okay, we have the entire packet now. The chip is
8476 * configured to include the FCS except I350 and I21[01]
8477 * (not all chips can be configured to strip it),
8478 * so we need to trim it.
8479 * May need to adjust length of previous mbuf in the
8480 * chain if the current mbuf is too short.
8481 * For an eratta, the RCTL_SECRC bit in RCTL register
8482 * is always set in I350, so we don't trim it.
8483 */
8484 if ((sc->sc_type != WM_T_I350) && (sc->sc_type != WM_T_I354)
8485 && (sc->sc_type != WM_T_I210)
8486 && (sc->sc_type != WM_T_I211)) {
8487 if (m->m_len < ETHER_CRC_LEN) {
8488 rxq->rxq_tail->m_len
8489 -= (ETHER_CRC_LEN - m->m_len);
8490 m->m_len = 0;
8491 } else
8492 m->m_len -= ETHER_CRC_LEN;
8493 len = rxq->rxq_len - ETHER_CRC_LEN;
8494 } else
8495 len = rxq->rxq_len;
8496
8497 WM_RXCHAIN_LINK(rxq, m);
8498
8499 *rxq->rxq_tailp = NULL;
8500 m = rxq->rxq_head;
8501
8502 WM_RXCHAIN_RESET(rxq);
8503
8504 DPRINTF(WM_DEBUG_RX,
8505 ("%s: RX: have entire packet, len -> %d\n",
8506 device_xname(sc->sc_dev), len));
8507
8508 /* If an error occurred, update stats and drop the packet. */
8509 if (wm_rxdesc_has_errors(rxq, errors)) {
8510 m_freem(m);
8511 continue;
8512 }
8513
8514 /* No errors. Receive the packet. */
8515 m_set_rcvif(m, ifp);
8516 m->m_pkthdr.len = len;
8517 /*
8518 * TODO
8519 * should be save rsshash and rsstype to this mbuf.
8520 */
8521 DPRINTF(WM_DEBUG_RX,
8522 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n",
8523 device_xname(sc->sc_dev), rsstype, rsshash));
8524
8525 /*
8526 * If VLANs are enabled, VLAN packets have been unwrapped
8527 * for us. Associate the tag with the packet.
8528 */
8529 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m))
8530 continue;
8531
8532 /* Set up checksum info for this packet. */
8533 wm_rxdesc_ensure_checksum(rxq, status, errors, m);
8534 /*
8535 * Update the receive pointer holding rxq_lock consistent with
8536 * increment counter.
8537 */
8538 rxq->rxq_ptr = i;
8539 rxq->rxq_packets++;
8540 rxq->rxq_bytes += len;
8541 mutex_exit(rxq->rxq_lock);
8542
8543 /* Pass it on. */
8544 if_percpuq_enqueue(sc->sc_ipq, m);
8545
8546 mutex_enter(rxq->rxq_lock);
8547
8548 if (rxq->rxq_stopping)
8549 break;
8550 }
8551
8552 if (count != 0)
8553 rnd_add_uint32(&sc->rnd_source, count);
8554
8555 DPRINTF(WM_DEBUG_RX,
8556 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i));
8557
8558 return more;
8559 }
8560
8561 /*
8562 * wm_linkintr_gmii:
8563 *
8564 * Helper; handle link interrupts for GMII.
8565 */
8566 static void
8567 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr)
8568 {
8569
8570 KASSERT(WM_CORE_LOCKED(sc));
8571
8572 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8573 __func__));
8574
8575 if (icr & ICR_LSC) {
8576 uint32_t reg;
8577 uint32_t status = CSR_READ(sc, WMREG_STATUS);
8578
8579 if ((status & STATUS_LU) != 0) {
8580 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
8581 device_xname(sc->sc_dev),
8582 (status & STATUS_FD) ? "FDX" : "HDX"));
8583 } else {
8584 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8585 device_xname(sc->sc_dev)));
8586 }
8587 if ((sc->sc_type == WM_T_ICH8) && ((status & STATUS_LU) == 0))
8588 wm_gig_downshift_workaround_ich8lan(sc);
8589
8590 if ((sc->sc_type == WM_T_ICH8)
8591 && (sc->sc_phytype == WMPHY_IGP_3)) {
8592 wm_kmrn_lock_loss_workaround_ich8lan(sc);
8593 }
8594 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n",
8595 device_xname(sc->sc_dev)));
8596 mii_pollstat(&sc->sc_mii);
8597 if (sc->sc_type == WM_T_82543) {
8598 int miistatus, active;
8599
8600 /*
8601 * With 82543, we need to force speed and
8602 * duplex on the MAC equal to what the PHY
8603 * speed and duplex configuration is.
8604 */
8605 miistatus = sc->sc_mii.mii_media_status;
8606
8607 if (miistatus & IFM_ACTIVE) {
8608 active = sc->sc_mii.mii_media_active;
8609 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
8610 switch (IFM_SUBTYPE(active)) {
8611 case IFM_10_T:
8612 sc->sc_ctrl |= CTRL_SPEED_10;
8613 break;
8614 case IFM_100_TX:
8615 sc->sc_ctrl |= CTRL_SPEED_100;
8616 break;
8617 case IFM_1000_T:
8618 sc->sc_ctrl |= CTRL_SPEED_1000;
8619 break;
8620 default:
8621 /*
8622 * fiber?
8623 * Shoud not enter here.
8624 */
8625 printf("unknown media (%x)\n", active);
8626 break;
8627 }
8628 if (active & IFM_FDX)
8629 sc->sc_ctrl |= CTRL_FD;
8630 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8631 }
8632 } else if (sc->sc_type == WM_T_PCH) {
8633 wm_k1_gig_workaround_hv(sc,
8634 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
8635 }
8636
8637 if ((sc->sc_phytype == WMPHY_82578)
8638 && (IFM_SUBTYPE(sc->sc_mii.mii_media_active)
8639 == IFM_1000_T)) {
8640
8641 if ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0) {
8642 delay(200*1000); /* XXX too big */
8643
8644 /* Link stall fix for link up */
8645 wm_gmii_hv_writereg(sc->sc_dev, 1,
8646 HV_MUX_DATA_CTRL,
8647 HV_MUX_DATA_CTRL_GEN_TO_MAC
8648 | HV_MUX_DATA_CTRL_FORCE_SPEED);
8649 wm_gmii_hv_writereg(sc->sc_dev, 1,
8650 HV_MUX_DATA_CTRL,
8651 HV_MUX_DATA_CTRL_GEN_TO_MAC);
8652 }
8653 }
8654 /*
8655 * I217 Packet Loss issue:
8656 * ensure that FEXTNVM4 Beacon Duration is set correctly
8657 * on power up.
8658 * Set the Beacon Duration for I217 to 8 usec
8659 */
8660 if ((sc->sc_type == WM_T_PCH_LPT)
8661 || (sc->sc_type == WM_T_PCH_SPT)) {
8662 reg = CSR_READ(sc, WMREG_FEXTNVM4);
8663 reg &= ~FEXTNVM4_BEACON_DURATION;
8664 reg |= FEXTNVM4_BEACON_DURATION_8US;
8665 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
8666 }
8667
8668 /* XXX Work-around I218 hang issue */
8669 /* e1000_k1_workaround_lpt_lp() */
8670
8671 if ((sc->sc_type == WM_T_PCH_LPT)
8672 || (sc->sc_type == WM_T_PCH_SPT)) {
8673 /*
8674 * Set platform power management values for Latency
8675 * Tolerance Reporting (LTR)
8676 */
8677 wm_platform_pm_pch_lpt(sc,
8678 ((sc->sc_mii.mii_media_status & IFM_ACTIVE)
8679 != 0));
8680 }
8681
8682 /* FEXTNVM6 K1-off workaround */
8683 if (sc->sc_type == WM_T_PCH_SPT) {
8684 reg = CSR_READ(sc, WMREG_FEXTNVM6);
8685 if (CSR_READ(sc, WMREG_PCIEANACFG)
8686 & FEXTNVM6_K1_OFF_ENABLE)
8687 reg |= FEXTNVM6_K1_OFF_ENABLE;
8688 else
8689 reg &= ~FEXTNVM6_K1_OFF_ENABLE;
8690 CSR_WRITE(sc, WMREG_FEXTNVM6, reg);
8691 }
8692 } else if (icr & ICR_RXSEQ) {
8693 DPRINTF(WM_DEBUG_LINK, ("%s: LINK Receive sequence error\n",
8694 device_xname(sc->sc_dev)));
8695 }
8696 }
8697
8698 /*
8699 * wm_linkintr_tbi:
8700 *
8701 * Helper; handle link interrupts for TBI mode.
8702 */
8703 static void
8704 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr)
8705 {
8706 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8707 uint32_t status;
8708
8709 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8710 __func__));
8711
8712 status = CSR_READ(sc, WMREG_STATUS);
8713 if (icr & ICR_LSC) {
8714 if (status & STATUS_LU) {
8715 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
8716 device_xname(sc->sc_dev),
8717 (status & STATUS_FD) ? "FDX" : "HDX"));
8718 /*
8719 * NOTE: CTRL will update TFCE and RFCE automatically,
8720 * so we should update sc->sc_ctrl
8721 */
8722
8723 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
8724 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
8725 sc->sc_fcrtl &= ~FCRTL_XONE;
8726 if (status & STATUS_FD)
8727 sc->sc_tctl |=
8728 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
8729 else
8730 sc->sc_tctl |=
8731 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
8732 if (sc->sc_ctrl & CTRL_TFCE)
8733 sc->sc_fcrtl |= FCRTL_XONE;
8734 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
8735 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
8736 WMREG_OLD_FCRTL : WMREG_FCRTL,
8737 sc->sc_fcrtl);
8738 sc->sc_tbi_linkup = 1;
8739 if_link_state_change(ifp, LINK_STATE_UP);
8740 } else {
8741 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8742 device_xname(sc->sc_dev)));
8743 sc->sc_tbi_linkup = 0;
8744 if_link_state_change(ifp, LINK_STATE_DOWN);
8745 }
8746 /* Update LED */
8747 wm_tbi_serdes_set_linkled(sc);
8748 } else if (icr & ICR_RXSEQ) {
8749 DPRINTF(WM_DEBUG_LINK,
8750 ("%s: LINK: Receive sequence error\n",
8751 device_xname(sc->sc_dev)));
8752 }
8753 }
8754
8755 /*
8756 * wm_linkintr_serdes:
8757 *
8758 * Helper; handle link interrupts for TBI mode.
8759 */
8760 static void
8761 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr)
8762 {
8763 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8764 struct mii_data *mii = &sc->sc_mii;
8765 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
8766 uint32_t pcs_adv, pcs_lpab, reg;
8767
8768 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8769 __func__));
8770
8771 if (icr & ICR_LSC) {
8772 /* Check PCS */
8773 reg = CSR_READ(sc, WMREG_PCS_LSTS);
8774 if ((reg & PCS_LSTS_LINKOK) != 0) {
8775 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up\n",
8776 device_xname(sc->sc_dev)));
8777 mii->mii_media_status |= IFM_ACTIVE;
8778 sc->sc_tbi_linkup = 1;
8779 if_link_state_change(ifp, LINK_STATE_UP);
8780 } else {
8781 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8782 device_xname(sc->sc_dev)));
8783 mii->mii_media_status |= IFM_NONE;
8784 sc->sc_tbi_linkup = 0;
8785 if_link_state_change(ifp, LINK_STATE_DOWN);
8786 wm_tbi_serdes_set_linkled(sc);
8787 return;
8788 }
8789 mii->mii_media_active |= IFM_1000_SX;
8790 if ((reg & PCS_LSTS_FDX) != 0)
8791 mii->mii_media_active |= IFM_FDX;
8792 else
8793 mii->mii_media_active |= IFM_HDX;
8794 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
8795 /* Check flow */
8796 reg = CSR_READ(sc, WMREG_PCS_LSTS);
8797 if ((reg & PCS_LSTS_AN_COMP) == 0) {
8798 DPRINTF(WM_DEBUG_LINK,
8799 ("XXX LINKOK but not ACOMP\n"));
8800 return;
8801 }
8802 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
8803 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
8804 DPRINTF(WM_DEBUG_LINK,
8805 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab));
8806 if ((pcs_adv & TXCW_SYM_PAUSE)
8807 && (pcs_lpab & TXCW_SYM_PAUSE)) {
8808 mii->mii_media_active |= IFM_FLOW
8809 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
8810 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
8811 && (pcs_adv & TXCW_ASYM_PAUSE)
8812 && (pcs_lpab & TXCW_SYM_PAUSE)
8813 && (pcs_lpab & TXCW_ASYM_PAUSE))
8814 mii->mii_media_active |= IFM_FLOW
8815 | IFM_ETH_TXPAUSE;
8816 else if ((pcs_adv & TXCW_SYM_PAUSE)
8817 && (pcs_adv & TXCW_ASYM_PAUSE)
8818 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
8819 && (pcs_lpab & TXCW_ASYM_PAUSE))
8820 mii->mii_media_active |= IFM_FLOW
8821 | IFM_ETH_RXPAUSE;
8822 }
8823 /* Update LED */
8824 wm_tbi_serdes_set_linkled(sc);
8825 } else {
8826 DPRINTF(WM_DEBUG_LINK,
8827 ("%s: LINK: Receive sequence error\n",
8828 device_xname(sc->sc_dev)));
8829 }
8830 }
8831
8832 /*
8833 * wm_linkintr:
8834 *
8835 * Helper; handle link interrupts.
8836 */
8837 static void
8838 wm_linkintr(struct wm_softc *sc, uint32_t icr)
8839 {
8840
8841 KASSERT(WM_CORE_LOCKED(sc));
8842
8843 if (sc->sc_flags & WM_F_HAS_MII)
8844 wm_linkintr_gmii(sc, icr);
8845 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES)
8846 && (sc->sc_type >= WM_T_82575))
8847 wm_linkintr_serdes(sc, icr);
8848 else
8849 wm_linkintr_tbi(sc, icr);
8850 }
8851
8852 /*
8853 * wm_intr_legacy:
8854 *
8855 * Interrupt service routine for INTx and MSI.
8856 */
8857 static int
8858 wm_intr_legacy(void *arg)
8859 {
8860 struct wm_softc *sc = arg;
8861 struct wm_queue *wmq = &sc->sc_queue[0];
8862 struct wm_txqueue *txq = &wmq->wmq_txq;
8863 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
8864 uint32_t icr, rndval = 0;
8865 int handled = 0;
8866
8867 while (1 /* CONSTCOND */) {
8868 icr = CSR_READ(sc, WMREG_ICR);
8869 if ((icr & sc->sc_icr) == 0)
8870 break;
8871 if (handled == 0) {
8872 DPRINTF(WM_DEBUG_TX,
8873 ("%s: INTx: got intr\n",device_xname(sc->sc_dev)));
8874 }
8875 if (rndval == 0)
8876 rndval = icr;
8877
8878 mutex_enter(rxq->rxq_lock);
8879
8880 if (rxq->rxq_stopping) {
8881 mutex_exit(rxq->rxq_lock);
8882 break;
8883 }
8884
8885 handled = 1;
8886
8887 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
8888 if (icr & (ICR_RXDMT0 | ICR_RXT0)) {
8889 DPRINTF(WM_DEBUG_RX,
8890 ("%s: RX: got Rx intr 0x%08x\n",
8891 device_xname(sc->sc_dev),
8892 icr & (ICR_RXDMT0 | ICR_RXT0)));
8893 WM_Q_EVCNT_INCR(rxq, rxintr);
8894 }
8895 #endif
8896 /*
8897 * wm_rxeof() does *not* call upper layer functions directly,
8898 * as if_percpuq_enqueue() just call softint_schedule().
8899 * So, we can call wm_rxeof() in interrupt context.
8900 */
8901 wm_rxeof(rxq, UINT_MAX);
8902
8903 mutex_exit(rxq->rxq_lock);
8904 mutex_enter(txq->txq_lock);
8905
8906 if (txq->txq_stopping) {
8907 mutex_exit(txq->txq_lock);
8908 break;
8909 }
8910
8911 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
8912 if (icr & ICR_TXDW) {
8913 DPRINTF(WM_DEBUG_TX,
8914 ("%s: TX: got TXDW interrupt\n",
8915 device_xname(sc->sc_dev)));
8916 WM_Q_EVCNT_INCR(txq, txdw);
8917 }
8918 #endif
8919 wm_txeof(txq, UINT_MAX);
8920
8921 mutex_exit(txq->txq_lock);
8922 WM_CORE_LOCK(sc);
8923
8924 if (sc->sc_core_stopping) {
8925 WM_CORE_UNLOCK(sc);
8926 break;
8927 }
8928
8929 if (icr & (ICR_LSC | ICR_RXSEQ)) {
8930 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
8931 wm_linkintr(sc, icr);
8932 }
8933
8934 WM_CORE_UNLOCK(sc);
8935
8936 if (icr & ICR_RXO) {
8937 #if defined(WM_DEBUG)
8938 log(LOG_WARNING, "%s: Receive overrun\n",
8939 device_xname(sc->sc_dev));
8940 #endif /* defined(WM_DEBUG) */
8941 }
8942 }
8943
8944 rnd_add_uint32(&sc->rnd_source, rndval);
8945
8946 if (handled) {
8947 /* Try to get more packets going. */
8948 softint_schedule(wmq->wmq_si);
8949 }
8950
8951 return handled;
8952 }
8953
8954 static inline void
8955 wm_txrxintr_disable(struct wm_queue *wmq)
8956 {
8957 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
8958
8959 if (sc->sc_type == WM_T_82574)
8960 CSR_WRITE(sc, WMREG_IMC, ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id));
8961 else if (sc->sc_type == WM_T_82575)
8962 CSR_WRITE(sc, WMREG_EIMC, EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
8963 else
8964 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx);
8965 }
8966
8967 static inline void
8968 wm_txrxintr_enable(struct wm_queue *wmq)
8969 {
8970 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
8971
8972 wm_itrs_calculate(sc, wmq);
8973
8974 /*
8975 * ICR_OTHER which is disabled in wm_linkintr_msix() is enabled here.
8976 * There is no need to care about which of RXQ(0) and RXQ(1) enable
8977 * ICR_OTHER in first, because each RXQ/TXQ interrupt is disabled
8978 * while each wm_handle_queue(wmq) is runnig.
8979 */
8980 if (sc->sc_type == WM_T_82574)
8981 CSR_WRITE(sc, WMREG_IMS, ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id) | ICR_OTHER);
8982 else if (sc->sc_type == WM_T_82575)
8983 CSR_WRITE(sc, WMREG_EIMS, EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
8984 else
8985 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx);
8986 }
8987
8988 static int
8989 wm_txrxintr_msix(void *arg)
8990 {
8991 struct wm_queue *wmq = arg;
8992 struct wm_txqueue *txq = &wmq->wmq_txq;
8993 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
8994 struct wm_softc *sc = txq->txq_sc;
8995 u_int txlimit = sc->sc_tx_intr_process_limit;
8996 u_int rxlimit = sc->sc_rx_intr_process_limit;
8997 bool txmore;
8998 bool rxmore;
8999
9000 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id);
9001
9002 DPRINTF(WM_DEBUG_TX,
9003 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev)));
9004
9005 wm_txrxintr_disable(wmq);
9006
9007 mutex_enter(txq->txq_lock);
9008
9009 if (txq->txq_stopping) {
9010 mutex_exit(txq->txq_lock);
9011 return 0;
9012 }
9013
9014 WM_Q_EVCNT_INCR(txq, txdw);
9015 txmore = wm_txeof(txq, txlimit);
9016 /* wm_deferred start() is done in wm_handle_queue(). */
9017 mutex_exit(txq->txq_lock);
9018
9019 DPRINTF(WM_DEBUG_RX,
9020 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev)));
9021 mutex_enter(rxq->rxq_lock);
9022
9023 if (rxq->rxq_stopping) {
9024 mutex_exit(rxq->rxq_lock);
9025 return 0;
9026 }
9027
9028 WM_Q_EVCNT_INCR(rxq, rxintr);
9029 rxmore = wm_rxeof(rxq, rxlimit);
9030 mutex_exit(rxq->rxq_lock);
9031
9032 wm_itrs_writereg(sc, wmq);
9033
9034 if (txmore || rxmore)
9035 softint_schedule(wmq->wmq_si);
9036 else
9037 wm_txrxintr_enable(wmq);
9038
9039 return 1;
9040 }
9041
9042 static void
9043 wm_handle_queue(void *arg)
9044 {
9045 struct wm_queue *wmq = arg;
9046 struct wm_txqueue *txq = &wmq->wmq_txq;
9047 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9048 struct wm_softc *sc = txq->txq_sc;
9049 u_int txlimit = sc->sc_tx_process_limit;
9050 u_int rxlimit = sc->sc_rx_process_limit;
9051 bool txmore;
9052 bool rxmore;
9053
9054 mutex_enter(txq->txq_lock);
9055 if (txq->txq_stopping) {
9056 mutex_exit(txq->txq_lock);
9057 return;
9058 }
9059 txmore = wm_txeof(txq, txlimit);
9060 wm_deferred_start_locked(txq);
9061 mutex_exit(txq->txq_lock);
9062
9063 mutex_enter(rxq->rxq_lock);
9064 if (rxq->rxq_stopping) {
9065 mutex_exit(rxq->rxq_lock);
9066 return;
9067 }
9068 WM_Q_EVCNT_INCR(rxq, rxdefer);
9069 rxmore = wm_rxeof(rxq, rxlimit);
9070 mutex_exit(rxq->rxq_lock);
9071
9072 if (txmore || rxmore)
9073 softint_schedule(wmq->wmq_si);
9074 else
9075 wm_txrxintr_enable(wmq);
9076 }
9077
9078 /*
9079 * wm_linkintr_msix:
9080 *
9081 * Interrupt service routine for link status change for MSI-X.
9082 */
9083 static int
9084 wm_linkintr_msix(void *arg)
9085 {
9086 struct wm_softc *sc = arg;
9087 uint32_t reg;
9088 bool has_rxo;
9089
9090 DPRINTF(WM_DEBUG_LINK,
9091 ("%s: LINK: got link intr\n", device_xname(sc->sc_dev)));
9092
9093 reg = CSR_READ(sc, WMREG_ICR);
9094 WM_CORE_LOCK(sc);
9095 if (sc->sc_core_stopping)
9096 goto out;
9097
9098 if((reg & ICR_LSC) != 0) {
9099 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
9100 wm_linkintr(sc, ICR_LSC);
9101 }
9102
9103 /*
9104 * XXX 82574 MSI-X mode workaround
9105 *
9106 * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER
9107 * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor
9108 * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1)
9109 * interrupts by writing WMREG_ICS to process receive packets.
9110 */
9111 if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) {
9112 #if defined(WM_DEBUG)
9113 log(LOG_WARNING, "%s: Receive overrun\n",
9114 device_xname(sc->sc_dev));
9115 #endif /* defined(WM_DEBUG) */
9116
9117 has_rxo = true;
9118 /*
9119 * The RXO interrupt is very high rate when receive traffic is
9120 * high rate. We use polling mode for ICR_OTHER like Tx/Rx
9121 * interrupts. ICR_OTHER will be enabled at the end of
9122 * wm_txrxintr_msix() which is kicked by both ICR_RXQ(0) and
9123 * ICR_RXQ(1) interrupts.
9124 */
9125 CSR_WRITE(sc, WMREG_IMC, ICR_OTHER);
9126
9127 CSR_WRITE(sc, WMREG_ICS, ICR_RXQ(0) | ICR_RXQ(1));
9128 }
9129
9130
9131
9132 out:
9133 WM_CORE_UNLOCK(sc);
9134
9135 if (sc->sc_type == WM_T_82574) {
9136 if (!has_rxo)
9137 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC);
9138 else
9139 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
9140 } else if (sc->sc_type == WM_T_82575)
9141 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER);
9142 else
9143 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx);
9144
9145 return 1;
9146 }
9147
9148 /*
9149 * Media related.
9150 * GMII, SGMII, TBI (and SERDES)
9151 */
9152
9153 /* Common */
9154
9155 /*
9156 * wm_tbi_serdes_set_linkled:
9157 *
9158 * Update the link LED on TBI and SERDES devices.
9159 */
9160 static void
9161 wm_tbi_serdes_set_linkled(struct wm_softc *sc)
9162 {
9163
9164 if (sc->sc_tbi_linkup)
9165 sc->sc_ctrl |= CTRL_SWDPIN(0);
9166 else
9167 sc->sc_ctrl &= ~CTRL_SWDPIN(0);
9168
9169 /* 82540 or newer devices are active low */
9170 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0;
9171
9172 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9173 }
9174
9175 /* GMII related */
9176
9177 /*
9178 * wm_gmii_reset:
9179 *
9180 * Reset the PHY.
9181 */
9182 static void
9183 wm_gmii_reset(struct wm_softc *sc)
9184 {
9185 uint32_t reg;
9186 int rv;
9187
9188 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
9189 device_xname(sc->sc_dev), __func__));
9190
9191 rv = sc->phy.acquire(sc);
9192 if (rv != 0) {
9193 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9194 __func__);
9195 return;
9196 }
9197
9198 switch (sc->sc_type) {
9199 case WM_T_82542_2_0:
9200 case WM_T_82542_2_1:
9201 /* null */
9202 break;
9203 case WM_T_82543:
9204 /*
9205 * With 82543, we need to force speed and duplex on the MAC
9206 * equal to what the PHY speed and duplex configuration is.
9207 * In addition, we need to perform a hardware reset on the PHY
9208 * to take it out of reset.
9209 */
9210 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
9211 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9212
9213 /* The PHY reset pin is active-low. */
9214 reg = CSR_READ(sc, WMREG_CTRL_EXT);
9215 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
9216 CTRL_EXT_SWDPIN(4));
9217 reg |= CTRL_EXT_SWDPIO(4);
9218
9219 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
9220 CSR_WRITE_FLUSH(sc);
9221 delay(10*1000);
9222
9223 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
9224 CSR_WRITE_FLUSH(sc);
9225 delay(150);
9226 #if 0
9227 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
9228 #endif
9229 delay(20*1000); /* XXX extra delay to get PHY ID? */
9230 break;
9231 case WM_T_82544: /* reset 10000us */
9232 case WM_T_82540:
9233 case WM_T_82545:
9234 case WM_T_82545_3:
9235 case WM_T_82546:
9236 case WM_T_82546_3:
9237 case WM_T_82541:
9238 case WM_T_82541_2:
9239 case WM_T_82547:
9240 case WM_T_82547_2:
9241 case WM_T_82571: /* reset 100us */
9242 case WM_T_82572:
9243 case WM_T_82573:
9244 case WM_T_82574:
9245 case WM_T_82575:
9246 case WM_T_82576:
9247 case WM_T_82580:
9248 case WM_T_I350:
9249 case WM_T_I354:
9250 case WM_T_I210:
9251 case WM_T_I211:
9252 case WM_T_82583:
9253 case WM_T_80003:
9254 /* generic reset */
9255 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
9256 CSR_WRITE_FLUSH(sc);
9257 delay(20000);
9258 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9259 CSR_WRITE_FLUSH(sc);
9260 delay(20000);
9261
9262 if ((sc->sc_type == WM_T_82541)
9263 || (sc->sc_type == WM_T_82541_2)
9264 || (sc->sc_type == WM_T_82547)
9265 || (sc->sc_type == WM_T_82547_2)) {
9266 /* workaround for igp are done in igp_reset() */
9267 /* XXX add code to set LED after phy reset */
9268 }
9269 break;
9270 case WM_T_ICH8:
9271 case WM_T_ICH9:
9272 case WM_T_ICH10:
9273 case WM_T_PCH:
9274 case WM_T_PCH2:
9275 case WM_T_PCH_LPT:
9276 case WM_T_PCH_SPT:
9277 /* generic reset */
9278 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
9279 CSR_WRITE_FLUSH(sc);
9280 delay(100);
9281 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9282 CSR_WRITE_FLUSH(sc);
9283 delay(150);
9284 break;
9285 default:
9286 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
9287 __func__);
9288 break;
9289 }
9290
9291 sc->phy.release(sc);
9292
9293 /* get_cfg_done */
9294 wm_get_cfg_done(sc);
9295
9296 /* extra setup */
9297 switch (sc->sc_type) {
9298 case WM_T_82542_2_0:
9299 case WM_T_82542_2_1:
9300 case WM_T_82543:
9301 case WM_T_82544:
9302 case WM_T_82540:
9303 case WM_T_82545:
9304 case WM_T_82545_3:
9305 case WM_T_82546:
9306 case WM_T_82546_3:
9307 case WM_T_82541_2:
9308 case WM_T_82547_2:
9309 case WM_T_82571:
9310 case WM_T_82572:
9311 case WM_T_82573:
9312 case WM_T_82574:
9313 case WM_T_82583:
9314 case WM_T_82575:
9315 case WM_T_82576:
9316 case WM_T_82580:
9317 case WM_T_I350:
9318 case WM_T_I354:
9319 case WM_T_I210:
9320 case WM_T_I211:
9321 case WM_T_80003:
9322 /* null */
9323 break;
9324 case WM_T_82541:
9325 case WM_T_82547:
9326 /* XXX Configure actively LED after PHY reset */
9327 break;
9328 case WM_T_ICH8:
9329 case WM_T_ICH9:
9330 case WM_T_ICH10:
9331 case WM_T_PCH:
9332 case WM_T_PCH2:
9333 case WM_T_PCH_LPT:
9334 case WM_T_PCH_SPT:
9335 wm_phy_post_reset(sc);
9336 break;
9337 default:
9338 panic("%s: unknown type\n", __func__);
9339 break;
9340 }
9341 }
9342
9343 /*
9344 * Setup sc_phytype and mii_{read|write}reg.
9345 *
9346 * To identify PHY type, correct read/write function should be selected.
9347 * To select correct read/write function, PCI ID or MAC type are required
9348 * without accessing PHY registers.
9349 *
9350 * On the first call of this function, PHY ID is not known yet. Check
9351 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the
9352 * result might be incorrect.
9353 *
9354 * In the second call, PHY OUI and model is used to identify PHY type.
9355 * It might not be perfpect because of the lack of compared entry, but it
9356 * would be better than the first call.
9357 *
9358 * If the detected new result and previous assumption is different,
9359 * diagnous message will be printed.
9360 */
9361 static void
9362 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui,
9363 uint16_t phy_model)
9364 {
9365 device_t dev = sc->sc_dev;
9366 struct mii_data *mii = &sc->sc_mii;
9367 uint16_t new_phytype = WMPHY_UNKNOWN;
9368 uint16_t doubt_phytype = WMPHY_UNKNOWN;
9369 mii_readreg_t new_readreg;
9370 mii_writereg_t new_writereg;
9371
9372 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
9373 device_xname(sc->sc_dev), __func__));
9374
9375 if (mii->mii_readreg == NULL) {
9376 /*
9377 * This is the first call of this function. For ICH and PCH
9378 * variants, it's difficult to determine the PHY access method
9379 * by sc_type, so use the PCI product ID for some devices.
9380 */
9381
9382 switch (sc->sc_pcidevid) {
9383 case PCI_PRODUCT_INTEL_PCH_M_LM:
9384 case PCI_PRODUCT_INTEL_PCH_M_LC:
9385 /* 82577 */
9386 new_phytype = WMPHY_82577;
9387 break;
9388 case PCI_PRODUCT_INTEL_PCH_D_DM:
9389 case PCI_PRODUCT_INTEL_PCH_D_DC:
9390 /* 82578 */
9391 new_phytype = WMPHY_82578;
9392 break;
9393 case PCI_PRODUCT_INTEL_PCH2_LV_LM:
9394 case PCI_PRODUCT_INTEL_PCH2_LV_V:
9395 /* 82579 */
9396 new_phytype = WMPHY_82579;
9397 break;
9398 case PCI_PRODUCT_INTEL_82801H_82567V_3:
9399 case PCI_PRODUCT_INTEL_82801I_BM:
9400 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */
9401 case PCI_PRODUCT_INTEL_82801J_R_BM_LM:
9402 case PCI_PRODUCT_INTEL_82801J_R_BM_LF:
9403 case PCI_PRODUCT_INTEL_82801J_D_BM_LM:
9404 case PCI_PRODUCT_INTEL_82801J_D_BM_LF:
9405 case PCI_PRODUCT_INTEL_82801J_R_BM_V:
9406 /* ICH8, 9, 10 with 82567 */
9407 new_phytype = WMPHY_BM;
9408 break;
9409 default:
9410 break;
9411 }
9412 } else {
9413 /* It's not the first call. Use PHY OUI and model */
9414 switch (phy_oui) {
9415 case MII_OUI_ATHEROS: /* XXX ??? */
9416 switch (phy_model) {
9417 case 0x0004: /* XXX */
9418 new_phytype = WMPHY_82578;
9419 break;
9420 default:
9421 break;
9422 }
9423 break;
9424 case MII_OUI_xxMARVELL:
9425 switch (phy_model) {
9426 case MII_MODEL_xxMARVELL_I210:
9427 new_phytype = WMPHY_I210;
9428 break;
9429 case MII_MODEL_xxMARVELL_E1011:
9430 case MII_MODEL_xxMARVELL_E1000_3:
9431 case MII_MODEL_xxMARVELL_E1000_5:
9432 case MII_MODEL_xxMARVELL_E1112:
9433 new_phytype = WMPHY_M88;
9434 break;
9435 case MII_MODEL_xxMARVELL_E1149:
9436 new_phytype = WMPHY_BM;
9437 break;
9438 case MII_MODEL_xxMARVELL_E1111:
9439 case MII_MODEL_xxMARVELL_I347:
9440 case MII_MODEL_xxMARVELL_E1512:
9441 case MII_MODEL_xxMARVELL_E1340M:
9442 case MII_MODEL_xxMARVELL_E1543:
9443 new_phytype = WMPHY_M88;
9444 break;
9445 case MII_MODEL_xxMARVELL_I82563:
9446 new_phytype = WMPHY_GG82563;
9447 break;
9448 default:
9449 break;
9450 }
9451 break;
9452 case MII_OUI_INTEL:
9453 switch (phy_model) {
9454 case MII_MODEL_INTEL_I82577:
9455 new_phytype = WMPHY_82577;
9456 break;
9457 case MII_MODEL_INTEL_I82579:
9458 new_phytype = WMPHY_82579;
9459 break;
9460 case MII_MODEL_INTEL_I217:
9461 new_phytype = WMPHY_I217;
9462 break;
9463 case MII_MODEL_INTEL_I82580:
9464 case MII_MODEL_INTEL_I350:
9465 new_phytype = WMPHY_82580;
9466 break;
9467 default:
9468 break;
9469 }
9470 break;
9471 case MII_OUI_yyINTEL:
9472 switch (phy_model) {
9473 case MII_MODEL_yyINTEL_I82562G:
9474 case MII_MODEL_yyINTEL_I82562EM:
9475 case MII_MODEL_yyINTEL_I82562ET:
9476 new_phytype = WMPHY_IFE;
9477 break;
9478 case MII_MODEL_yyINTEL_IGP01E1000:
9479 new_phytype = WMPHY_IGP;
9480 break;
9481 case MII_MODEL_yyINTEL_I82566:
9482 new_phytype = WMPHY_IGP_3;
9483 break;
9484 default:
9485 break;
9486 }
9487 break;
9488 default:
9489 break;
9490 }
9491 if (new_phytype == WMPHY_UNKNOWN)
9492 aprint_verbose_dev(dev, "%s: unknown PHY model\n",
9493 __func__);
9494
9495 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9496 && (sc->sc_phytype != new_phytype )) {
9497 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
9498 "was incorrect. PHY type from PHY ID = %u\n",
9499 sc->sc_phytype, new_phytype);
9500 }
9501 }
9502
9503 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */
9504 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) {
9505 /* SGMII */
9506 new_readreg = wm_sgmii_readreg;
9507 new_writereg = wm_sgmii_writereg;
9508 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
9509 /* BM2 (phyaddr == 1) */
9510 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9511 && (new_phytype != WMPHY_BM)
9512 && (new_phytype != WMPHY_UNKNOWN))
9513 doubt_phytype = new_phytype;
9514 new_phytype = WMPHY_BM;
9515 new_readreg = wm_gmii_bm_readreg;
9516 new_writereg = wm_gmii_bm_writereg;
9517 } else if (sc->sc_type >= WM_T_PCH) {
9518 /* All PCH* use _hv_ */
9519 new_readreg = wm_gmii_hv_readreg;
9520 new_writereg = wm_gmii_hv_writereg;
9521 } else if (sc->sc_type >= WM_T_ICH8) {
9522 /* non-82567 ICH8, 9 and 10 */
9523 new_readreg = wm_gmii_i82544_readreg;
9524 new_writereg = wm_gmii_i82544_writereg;
9525 } else if (sc->sc_type >= WM_T_80003) {
9526 /* 80003 */
9527 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9528 && (new_phytype != WMPHY_GG82563)
9529 && (new_phytype != WMPHY_UNKNOWN))
9530 doubt_phytype = new_phytype;
9531 new_phytype = WMPHY_GG82563;
9532 new_readreg = wm_gmii_i80003_readreg;
9533 new_writereg = wm_gmii_i80003_writereg;
9534 } else if (sc->sc_type >= WM_T_I210) {
9535 /* I210 and I211 */
9536 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9537 && (new_phytype != WMPHY_I210)
9538 && (new_phytype != WMPHY_UNKNOWN))
9539 doubt_phytype = new_phytype;
9540 new_phytype = WMPHY_I210;
9541 new_readreg = wm_gmii_gs40g_readreg;
9542 new_writereg = wm_gmii_gs40g_writereg;
9543 } else if (sc->sc_type >= WM_T_82580) {
9544 /* 82580, I350 and I354 */
9545 new_readreg = wm_gmii_82580_readreg;
9546 new_writereg = wm_gmii_82580_writereg;
9547 } else if (sc->sc_type >= WM_T_82544) {
9548 /* 82544, 0, [56], [17], 8257[1234] and 82583 */
9549 new_readreg = wm_gmii_i82544_readreg;
9550 new_writereg = wm_gmii_i82544_writereg;
9551 } else {
9552 new_readreg = wm_gmii_i82543_readreg;
9553 new_writereg = wm_gmii_i82543_writereg;
9554 }
9555
9556 if (new_phytype == WMPHY_BM) {
9557 /* All BM use _bm_ */
9558 new_readreg = wm_gmii_bm_readreg;
9559 new_writereg = wm_gmii_bm_writereg;
9560 }
9561 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_SPT)) {
9562 /* All PCH* use _hv_ */
9563 new_readreg = wm_gmii_hv_readreg;
9564 new_writereg = wm_gmii_hv_writereg;
9565 }
9566
9567 /* Diag output */
9568 if (doubt_phytype != WMPHY_UNKNOWN)
9569 aprint_error_dev(dev, "Assumed new PHY type was "
9570 "incorrect. old = %u, new = %u\n", sc->sc_phytype,
9571 new_phytype);
9572 else if ((sc->sc_phytype != WMPHY_UNKNOWN)
9573 && (sc->sc_phytype != new_phytype ))
9574 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
9575 "was incorrect. New PHY type = %u\n",
9576 sc->sc_phytype, new_phytype);
9577
9578 if ((mii->mii_readreg != NULL) && (new_phytype == WMPHY_UNKNOWN))
9579 aprint_error_dev(dev, "PHY type is still unknown.\n");
9580
9581 if ((mii->mii_readreg != NULL) && (mii->mii_readreg != new_readreg))
9582 aprint_error_dev(dev, "Previously assumed PHY read/write "
9583 "function was incorrect.\n");
9584
9585 /* Update now */
9586 sc->sc_phytype = new_phytype;
9587 mii->mii_readreg = new_readreg;
9588 mii->mii_writereg = new_writereg;
9589 }
9590
9591 /*
9592 * wm_get_phy_id_82575:
9593 *
9594 * Return PHY ID. Return -1 if it failed.
9595 */
9596 static int
9597 wm_get_phy_id_82575(struct wm_softc *sc)
9598 {
9599 uint32_t reg;
9600 int phyid = -1;
9601
9602 /* XXX */
9603 if ((sc->sc_flags & WM_F_SGMII) == 0)
9604 return -1;
9605
9606 if (wm_sgmii_uses_mdio(sc)) {
9607 switch (sc->sc_type) {
9608 case WM_T_82575:
9609 case WM_T_82576:
9610 reg = CSR_READ(sc, WMREG_MDIC);
9611 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT;
9612 break;
9613 case WM_T_82580:
9614 case WM_T_I350:
9615 case WM_T_I354:
9616 case WM_T_I210:
9617 case WM_T_I211:
9618 reg = CSR_READ(sc, WMREG_MDICNFG);
9619 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT;
9620 break;
9621 default:
9622 return -1;
9623 }
9624 }
9625
9626 return phyid;
9627 }
9628
9629
9630 /*
9631 * wm_gmii_mediainit:
9632 *
9633 * Initialize media for use on 1000BASE-T devices.
9634 */
9635 static void
9636 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid)
9637 {
9638 device_t dev = sc->sc_dev;
9639 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9640 struct mii_data *mii = &sc->sc_mii;
9641 uint32_t reg;
9642
9643 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9644 device_xname(sc->sc_dev), __func__));
9645
9646 /* We have GMII. */
9647 sc->sc_flags |= WM_F_HAS_MII;
9648
9649 if (sc->sc_type == WM_T_80003)
9650 sc->sc_tipg = TIPG_1000T_80003_DFLT;
9651 else
9652 sc->sc_tipg = TIPG_1000T_DFLT;
9653
9654 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */
9655 if ((sc->sc_type == WM_T_82580)
9656 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210)
9657 || (sc->sc_type == WM_T_I211)) {
9658 reg = CSR_READ(sc, WMREG_PHPM);
9659 reg &= ~PHPM_GO_LINK_D;
9660 CSR_WRITE(sc, WMREG_PHPM, reg);
9661 }
9662
9663 /*
9664 * Let the chip set speed/duplex on its own based on
9665 * signals from the PHY.
9666 * XXXbouyer - I'm not sure this is right for the 80003,
9667 * the em driver only sets CTRL_SLU here - but it seems to work.
9668 */
9669 sc->sc_ctrl |= CTRL_SLU;
9670 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9671
9672 /* Initialize our media structures and probe the GMII. */
9673 mii->mii_ifp = ifp;
9674
9675 mii->mii_statchg = wm_gmii_statchg;
9676
9677 /* get PHY control from SMBus to PCIe */
9678 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
9679 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT))
9680 wm_smbustopci(sc);
9681
9682 wm_gmii_reset(sc);
9683
9684 sc->sc_ethercom.ec_mii = &sc->sc_mii;
9685 ifmedia_init(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange,
9686 wm_gmii_mediastatus);
9687
9688 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
9689 || (sc->sc_type == WM_T_82580)
9690 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
9691 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) {
9692 if ((sc->sc_flags & WM_F_SGMII) == 0) {
9693 /* Attach only one port */
9694 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1,
9695 MII_OFFSET_ANY, MIIF_DOPAUSE);
9696 } else {
9697 int i, id;
9698 uint32_t ctrl_ext;
9699
9700 id = wm_get_phy_id_82575(sc);
9701 if (id != -1) {
9702 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff,
9703 id, MII_OFFSET_ANY, MIIF_DOPAUSE);
9704 }
9705 if ((id == -1)
9706 || (LIST_FIRST(&mii->mii_phys) == NULL)) {
9707 /* Power on sgmii phy if it is disabled */
9708 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
9709 CSR_WRITE(sc, WMREG_CTRL_EXT,
9710 ctrl_ext &~ CTRL_EXT_SWDPIN(3));
9711 CSR_WRITE_FLUSH(sc);
9712 delay(300*1000); /* XXX too long */
9713
9714 /* from 1 to 8 */
9715 for (i = 1; i < 8; i++)
9716 mii_attach(sc->sc_dev, &sc->sc_mii,
9717 0xffffffff, i, MII_OFFSET_ANY,
9718 MIIF_DOPAUSE);
9719
9720 /* restore previous sfp cage power state */
9721 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
9722 }
9723 }
9724 } else {
9725 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
9726 MII_OFFSET_ANY, MIIF_DOPAUSE);
9727 }
9728
9729 /*
9730 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call
9731 * wm_set_mdio_slow_mode_hv() for a workaround and retry.
9732 */
9733 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) &&
9734 (LIST_FIRST(&mii->mii_phys) == NULL)) {
9735 wm_set_mdio_slow_mode_hv(sc);
9736 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
9737 MII_OFFSET_ANY, MIIF_DOPAUSE);
9738 }
9739
9740 /*
9741 * (For ICH8 variants)
9742 * If PHY detection failed, use BM's r/w function and retry.
9743 */
9744 if (LIST_FIRST(&mii->mii_phys) == NULL) {
9745 /* if failed, retry with *_bm_* */
9746 aprint_verbose_dev(dev, "Assumed PHY access function "
9747 "(type = %d) might be incorrect. Use BM and retry.\n",
9748 sc->sc_phytype);
9749 sc->sc_phytype = WMPHY_BM;
9750 mii->mii_readreg = wm_gmii_bm_readreg;
9751 mii->mii_writereg = wm_gmii_bm_writereg;
9752
9753 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
9754 MII_OFFSET_ANY, MIIF_DOPAUSE);
9755 }
9756
9757 if (LIST_FIRST(&mii->mii_phys) == NULL) {
9758 /* Any PHY wasn't find */
9759 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
9760 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
9761 sc->sc_phytype = WMPHY_NONE;
9762 } else {
9763 struct mii_softc *child = LIST_FIRST(&mii->mii_phys);
9764
9765 /*
9766 * PHY Found! Check PHY type again by the second call of
9767 * wm_gmii_setup_phytype.
9768 */
9769 wm_gmii_setup_phytype(sc, child->mii_mpd_oui,
9770 child->mii_mpd_model);
9771
9772 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
9773 }
9774 }
9775
9776 /*
9777 * wm_gmii_mediachange: [ifmedia interface function]
9778 *
9779 * Set hardware to newly-selected media on a 1000BASE-T device.
9780 */
9781 static int
9782 wm_gmii_mediachange(struct ifnet *ifp)
9783 {
9784 struct wm_softc *sc = ifp->if_softc;
9785 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
9786 int rc;
9787
9788 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9789 device_xname(sc->sc_dev), __func__));
9790 if ((ifp->if_flags & IFF_UP) == 0)
9791 return 0;
9792
9793 /* Disable D0 LPLU. */
9794 wm_lplu_d0_disable(sc);
9795
9796 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
9797 sc->sc_ctrl |= CTRL_SLU;
9798 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
9799 || (sc->sc_type > WM_T_82543)) {
9800 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
9801 } else {
9802 sc->sc_ctrl &= ~CTRL_ASDE;
9803 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
9804 if (ife->ifm_media & IFM_FDX)
9805 sc->sc_ctrl |= CTRL_FD;
9806 switch (IFM_SUBTYPE(ife->ifm_media)) {
9807 case IFM_10_T:
9808 sc->sc_ctrl |= CTRL_SPEED_10;
9809 break;
9810 case IFM_100_TX:
9811 sc->sc_ctrl |= CTRL_SPEED_100;
9812 break;
9813 case IFM_1000_T:
9814 sc->sc_ctrl |= CTRL_SPEED_1000;
9815 break;
9816 default:
9817 panic("wm_gmii_mediachange: bad media 0x%x",
9818 ife->ifm_media);
9819 }
9820 }
9821 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9822 CSR_WRITE_FLUSH(sc);
9823 if (sc->sc_type <= WM_T_82543)
9824 wm_gmii_reset(sc);
9825
9826 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
9827 return 0;
9828 return rc;
9829 }
9830
9831 /*
9832 * wm_gmii_mediastatus: [ifmedia interface function]
9833 *
9834 * Get the current interface media status on a 1000BASE-T device.
9835 */
9836 static void
9837 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
9838 {
9839 struct wm_softc *sc = ifp->if_softc;
9840
9841 ether_mediastatus(ifp, ifmr);
9842 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
9843 | sc->sc_flowflags;
9844 }
9845
9846 #define MDI_IO CTRL_SWDPIN(2)
9847 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */
9848 #define MDI_CLK CTRL_SWDPIN(3)
9849
9850 static void
9851 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
9852 {
9853 uint32_t i, v;
9854
9855 v = CSR_READ(sc, WMREG_CTRL);
9856 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
9857 v |= MDI_DIR | CTRL_SWDPIO(3);
9858
9859 for (i = 1 << (nbits - 1); i != 0; i >>= 1) {
9860 if (data & i)
9861 v |= MDI_IO;
9862 else
9863 v &= ~MDI_IO;
9864 CSR_WRITE(sc, WMREG_CTRL, v);
9865 CSR_WRITE_FLUSH(sc);
9866 delay(10);
9867 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9868 CSR_WRITE_FLUSH(sc);
9869 delay(10);
9870 CSR_WRITE(sc, WMREG_CTRL, v);
9871 CSR_WRITE_FLUSH(sc);
9872 delay(10);
9873 }
9874 }
9875
9876 static uint32_t
9877 wm_i82543_mii_recvbits(struct wm_softc *sc)
9878 {
9879 uint32_t v, i, data = 0;
9880
9881 v = CSR_READ(sc, WMREG_CTRL);
9882 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
9883 v |= CTRL_SWDPIO(3);
9884
9885 CSR_WRITE(sc, WMREG_CTRL, v);
9886 CSR_WRITE_FLUSH(sc);
9887 delay(10);
9888 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9889 CSR_WRITE_FLUSH(sc);
9890 delay(10);
9891 CSR_WRITE(sc, WMREG_CTRL, v);
9892 CSR_WRITE_FLUSH(sc);
9893 delay(10);
9894
9895 for (i = 0; i < 16; i++) {
9896 data <<= 1;
9897 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9898 CSR_WRITE_FLUSH(sc);
9899 delay(10);
9900 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
9901 data |= 1;
9902 CSR_WRITE(sc, WMREG_CTRL, v);
9903 CSR_WRITE_FLUSH(sc);
9904 delay(10);
9905 }
9906
9907 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9908 CSR_WRITE_FLUSH(sc);
9909 delay(10);
9910 CSR_WRITE(sc, WMREG_CTRL, v);
9911 CSR_WRITE_FLUSH(sc);
9912 delay(10);
9913
9914 return data;
9915 }
9916
9917 #undef MDI_IO
9918 #undef MDI_DIR
9919 #undef MDI_CLK
9920
9921 /*
9922 * wm_gmii_i82543_readreg: [mii interface function]
9923 *
9924 * Read a PHY register on the GMII (i82543 version).
9925 */
9926 static int
9927 wm_gmii_i82543_readreg(device_t dev, int phy, int reg)
9928 {
9929 struct wm_softc *sc = device_private(dev);
9930 int rv;
9931
9932 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
9933 wm_i82543_mii_sendbits(sc, reg | (phy << 5) |
9934 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
9935 rv = wm_i82543_mii_recvbits(sc) & 0xffff;
9936
9937 DPRINTF(WM_DEBUG_GMII, ("%s: GMII: read phy %d reg %d -> 0x%04x\n",
9938 device_xname(dev), phy, reg, rv));
9939
9940 return rv;
9941 }
9942
9943 /*
9944 * wm_gmii_i82543_writereg: [mii interface function]
9945 *
9946 * Write a PHY register on the GMII (i82543 version).
9947 */
9948 static void
9949 wm_gmii_i82543_writereg(device_t dev, int phy, int reg, int val)
9950 {
9951 struct wm_softc *sc = device_private(dev);
9952
9953 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
9954 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
9955 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
9956 (MII_COMMAND_START << 30), 32);
9957 }
9958
9959 /*
9960 * wm_gmii_mdic_readreg: [mii interface function]
9961 *
9962 * Read a PHY register on the GMII.
9963 */
9964 static int
9965 wm_gmii_mdic_readreg(device_t dev, int phy, int reg)
9966 {
9967 struct wm_softc *sc = device_private(dev);
9968 uint32_t mdic = 0;
9969 int i, rv;
9970
9971 if (reg > MII_ADDRMASK) {
9972 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
9973 __func__, sc->sc_phytype, reg);
9974 reg &= MII_ADDRMASK;
9975 }
9976
9977 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
9978 MDIC_REGADD(reg));
9979
9980 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
9981 mdic = CSR_READ(sc, WMREG_MDIC);
9982 if (mdic & MDIC_READY)
9983 break;
9984 delay(50);
9985 }
9986
9987 if ((mdic & MDIC_READY) == 0) {
9988 log(LOG_WARNING, "%s: MDIC read timed out: phy %d reg %d\n",
9989 device_xname(dev), phy, reg);
9990 rv = 0;
9991 } else if (mdic & MDIC_E) {
9992 #if 0 /* This is normal if no PHY is present. */
9993 log(LOG_WARNING, "%s: MDIC read error: phy %d reg %d\n",
9994 device_xname(dev), phy, reg);
9995 #endif
9996 rv = 0;
9997 } else {
9998 rv = MDIC_DATA(mdic);
9999 if (rv == 0xffff)
10000 rv = 0;
10001 }
10002
10003 return rv;
10004 }
10005
10006 /*
10007 * wm_gmii_mdic_writereg: [mii interface function]
10008 *
10009 * Write a PHY register on the GMII.
10010 */
10011 static void
10012 wm_gmii_mdic_writereg(device_t dev, int phy, int reg, int val)
10013 {
10014 struct wm_softc *sc = device_private(dev);
10015 uint32_t mdic = 0;
10016 int i;
10017
10018 if (reg > MII_ADDRMASK) {
10019 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10020 __func__, sc->sc_phytype, reg);
10021 reg &= MII_ADDRMASK;
10022 }
10023
10024 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
10025 MDIC_REGADD(reg) | MDIC_DATA(val));
10026
10027 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
10028 mdic = CSR_READ(sc, WMREG_MDIC);
10029 if (mdic & MDIC_READY)
10030 break;
10031 delay(50);
10032 }
10033
10034 if ((mdic & MDIC_READY) == 0)
10035 log(LOG_WARNING, "%s: MDIC write timed out: phy %d reg %d\n",
10036 device_xname(dev), phy, reg);
10037 else if (mdic & MDIC_E)
10038 log(LOG_WARNING, "%s: MDIC write error: phy %d reg %d\n",
10039 device_xname(dev), phy, reg);
10040 }
10041
10042 /*
10043 * wm_gmii_i82544_readreg: [mii interface function]
10044 *
10045 * Read a PHY register on the GMII.
10046 */
10047 static int
10048 wm_gmii_i82544_readreg(device_t dev, int phy, int reg)
10049 {
10050 struct wm_softc *sc = device_private(dev);
10051 int rv;
10052
10053 if (sc->phy.acquire(sc)) {
10054 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10055 return 0;
10056 }
10057
10058 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10059 switch (sc->sc_phytype) {
10060 case WMPHY_IGP:
10061 case WMPHY_IGP_2:
10062 case WMPHY_IGP_3:
10063 wm_gmii_mdic_writereg(dev, phy, MII_IGPHY_PAGE_SELECT, reg);
10064 break;
10065 default:
10066 #ifdef WM_DEBUG
10067 device_printf(dev, "%s: PHYTYPE = 0x%x, addr = %02x\n",
10068 __func__, sc->sc_phytype, reg);
10069 #endif
10070 break;
10071 }
10072 }
10073
10074 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10075 sc->phy.release(sc);
10076
10077 return rv;
10078 }
10079
10080 /*
10081 * wm_gmii_i82544_writereg: [mii interface function]
10082 *
10083 * Write a PHY register on the GMII.
10084 */
10085 static void
10086 wm_gmii_i82544_writereg(device_t dev, int phy, int reg, int val)
10087 {
10088 struct wm_softc *sc = device_private(dev);
10089
10090 if (sc->phy.acquire(sc)) {
10091 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10092 return;
10093 }
10094
10095 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10096 switch (sc->sc_phytype) {
10097 case WMPHY_IGP:
10098 case WMPHY_IGP_2:
10099 case WMPHY_IGP_3:
10100 wm_gmii_mdic_writereg(dev, phy, MII_IGPHY_PAGE_SELECT, reg);
10101 break;
10102 default:
10103 #ifdef WM_DEBUG
10104 device_printf(dev, "%s: PHYTYPE == 0x%x, addr = %02x",
10105 __func__, sc->sc_phytype, reg);
10106 #endif
10107 break;
10108 }
10109 }
10110
10111 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10112 sc->phy.release(sc);
10113 }
10114
10115 /*
10116 * wm_gmii_i80003_readreg: [mii interface function]
10117 *
10118 * Read a PHY register on the kumeran
10119 * This could be handled by the PHY layer if we didn't have to lock the
10120 * ressource ...
10121 */
10122 static int
10123 wm_gmii_i80003_readreg(device_t dev, int phy, int reg)
10124 {
10125 struct wm_softc *sc = device_private(dev);
10126 int page_select, temp;
10127 int rv;
10128
10129 if (phy != 1) /* only one PHY on kumeran bus */
10130 return 0;
10131
10132 if (sc->phy.acquire(sc)) {
10133 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10134 return 0;
10135 }
10136
10137 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
10138 page_select = GG82563_PHY_PAGE_SELECT;
10139 else {
10140 /*
10141 * Use Alternative Page Select register to access registers
10142 * 30 and 31.
10143 */
10144 page_select = GG82563_PHY_PAGE_SELECT_ALT;
10145 }
10146 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT;
10147 wm_gmii_mdic_writereg(dev, phy, page_select, temp);
10148 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
10149 /*
10150 * Wait more 200us for a bug of the ready bit in the MDIC
10151 * register.
10152 */
10153 delay(200);
10154 if (wm_gmii_mdic_readreg(dev, phy, page_select) != temp) {
10155 device_printf(dev, "%s failed\n", __func__);
10156 rv = 0; /* XXX */
10157 goto out;
10158 }
10159 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10160 delay(200);
10161 } else
10162 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10163
10164 out:
10165 sc->phy.release(sc);
10166 return rv;
10167 }
10168
10169 /*
10170 * wm_gmii_i80003_writereg: [mii interface function]
10171 *
10172 * Write a PHY register on the kumeran.
10173 * This could be handled by the PHY layer if we didn't have to lock the
10174 * ressource ...
10175 */
10176 static void
10177 wm_gmii_i80003_writereg(device_t dev, int phy, int reg, int val)
10178 {
10179 struct wm_softc *sc = device_private(dev);
10180 int page_select, temp;
10181
10182 if (phy != 1) /* only one PHY on kumeran bus */
10183 return;
10184
10185 if (sc->phy.acquire(sc)) {
10186 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10187 return;
10188 }
10189
10190 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
10191 page_select = GG82563_PHY_PAGE_SELECT;
10192 else {
10193 /*
10194 * Use Alternative Page Select register to access registers
10195 * 30 and 31.
10196 */
10197 page_select = GG82563_PHY_PAGE_SELECT_ALT;
10198 }
10199 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT;
10200 wm_gmii_mdic_writereg(dev, phy, page_select, temp);
10201 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
10202 /*
10203 * Wait more 200us for a bug of the ready bit in the MDIC
10204 * register.
10205 */
10206 delay(200);
10207 if (wm_gmii_mdic_readreg(dev, phy, page_select) != temp) {
10208 device_printf(dev, "%s failed\n", __func__);
10209 goto out;
10210 }
10211 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10212 delay(200);
10213 } else
10214 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10215
10216 out:
10217 sc->phy.release(sc);
10218 }
10219
10220 /*
10221 * wm_gmii_bm_readreg: [mii interface function]
10222 *
10223 * Read a PHY register on the kumeran
10224 * This could be handled by the PHY layer if we didn't have to lock the
10225 * ressource ...
10226 */
10227 static int
10228 wm_gmii_bm_readreg(device_t dev, int phy, int reg)
10229 {
10230 struct wm_softc *sc = device_private(dev);
10231 uint16_t page = reg >> BME1000_PAGE_SHIFT;
10232 uint16_t val;
10233 int rv;
10234
10235 if (sc->phy.acquire(sc)) {
10236 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10237 return 0;
10238 }
10239
10240 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
10241 phy = ((page >= 768) || ((page == 0) && (reg == 25))
10242 || (reg == 31)) ? 1 : phy;
10243 /* Page 800 works differently than the rest so it has its own func */
10244 if (page == BM_WUC_PAGE) {
10245 wm_access_phy_wakeup_reg_bm(dev, reg, &val, 1);
10246 rv = val;
10247 goto release;
10248 }
10249
10250 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10251 if ((phy == 1) && (sc->sc_type != WM_T_82574)
10252 && (sc->sc_type != WM_T_82583))
10253 wm_gmii_mdic_writereg(dev, phy,
10254 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
10255 else
10256 wm_gmii_mdic_writereg(dev, phy,
10257 BME1000_PHY_PAGE_SELECT, page);
10258 }
10259
10260 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10261
10262 release:
10263 sc->phy.release(sc);
10264 return rv;
10265 }
10266
10267 /*
10268 * wm_gmii_bm_writereg: [mii interface function]
10269 *
10270 * Write a PHY register on the kumeran.
10271 * This could be handled by the PHY layer if we didn't have to lock the
10272 * ressource ...
10273 */
10274 static void
10275 wm_gmii_bm_writereg(device_t dev, int phy, int reg, int val)
10276 {
10277 struct wm_softc *sc = device_private(dev);
10278 uint16_t page = reg >> BME1000_PAGE_SHIFT;
10279
10280 if (sc->phy.acquire(sc)) {
10281 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10282 return;
10283 }
10284
10285 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
10286 phy = ((page >= 768) || ((page == 0) && (reg == 25))
10287 || (reg == 31)) ? 1 : phy;
10288 /* Page 800 works differently than the rest so it has its own func */
10289 if (page == BM_WUC_PAGE) {
10290 uint16_t tmp;
10291
10292 tmp = val;
10293 wm_access_phy_wakeup_reg_bm(dev, reg, &tmp, 0);
10294 goto release;
10295 }
10296
10297 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10298 if ((phy == 1) && (sc->sc_type != WM_T_82574)
10299 && (sc->sc_type != WM_T_82583))
10300 wm_gmii_mdic_writereg(dev, phy,
10301 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
10302 else
10303 wm_gmii_mdic_writereg(dev, phy,
10304 BME1000_PHY_PAGE_SELECT, page);
10305 }
10306
10307 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10308
10309 release:
10310 sc->phy.release(sc);
10311 }
10312
10313 static void
10314 wm_access_phy_wakeup_reg_bm(device_t dev, int offset, int16_t *val, int rd)
10315 {
10316 struct wm_softc *sc = device_private(dev);
10317 uint16_t regnum = BM_PHY_REG_NUM(offset);
10318 uint16_t wuce, reg;
10319
10320 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10321 device_xname(dev), __func__));
10322 /* XXX Gig must be disabled for MDIO accesses to page 800 */
10323 if (sc->sc_type == WM_T_PCH) {
10324 /* XXX e1000 driver do nothing... why? */
10325 }
10326
10327 /*
10328 * 1) Enable PHY wakeup register first.
10329 * See e1000_enable_phy_wakeup_reg_access_bm().
10330 */
10331
10332 /* Set page 769 */
10333 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10334 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
10335
10336 /* Read WUCE and save it */
10337 wuce = wm_gmii_mdic_readreg(dev, 1, BM_WUC_ENABLE_REG);
10338
10339 reg = wuce | BM_WUC_ENABLE_BIT;
10340 reg &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT);
10341 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, reg);
10342
10343 /* Select page 800 */
10344 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10345 BM_WUC_PAGE << BME1000_PAGE_SHIFT);
10346
10347 /*
10348 * 2) Access PHY wakeup register.
10349 * See e1000_access_phy_wakeup_reg_bm.
10350 */
10351
10352 /* Write page 800 */
10353 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ADDRESS_OPCODE, regnum);
10354
10355 if (rd)
10356 *val = wm_gmii_mdic_readreg(dev, 1, BM_WUC_DATA_OPCODE);
10357 else
10358 wm_gmii_mdic_writereg(dev, 1, BM_WUC_DATA_OPCODE, *val);
10359
10360 /*
10361 * 3) Disable PHY wakeup register.
10362 * See e1000_disable_phy_wakeup_reg_access_bm().
10363 */
10364 /* Set page 769 */
10365 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10366 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
10367
10368 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, wuce);
10369 }
10370
10371 /*
10372 * wm_gmii_hv_readreg: [mii interface function]
10373 *
10374 * Read a PHY register on the kumeran
10375 * This could be handled by the PHY layer if we didn't have to lock the
10376 * ressource ...
10377 */
10378 static int
10379 wm_gmii_hv_readreg(device_t dev, int phy, int reg)
10380 {
10381 struct wm_softc *sc = device_private(dev);
10382 int rv;
10383
10384 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10385 device_xname(dev), __func__));
10386 if (sc->phy.acquire(sc)) {
10387 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10388 return 0;
10389 }
10390
10391 rv = wm_gmii_hv_readreg_locked(dev, phy, reg);
10392 sc->phy.release(sc);
10393 return rv;
10394 }
10395
10396 static int
10397 wm_gmii_hv_readreg_locked(device_t dev, int phy, int reg)
10398 {
10399 uint16_t page = BM_PHY_REG_PAGE(reg);
10400 uint16_t regnum = BM_PHY_REG_NUM(reg);
10401 uint16_t val;
10402 int rv;
10403
10404 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
10405
10406 /* Page 800 works differently than the rest so it has its own func */
10407 if (page == BM_WUC_PAGE) {
10408 wm_access_phy_wakeup_reg_bm(dev, reg, &val, 1);
10409 return val;
10410 }
10411
10412 /*
10413 * Lower than page 768 works differently than the rest so it has its
10414 * own func
10415 */
10416 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
10417 printf("gmii_hv_readreg!!!\n");
10418 return 0;
10419 }
10420
10421 /*
10422 * XXX I21[789] documents say that the SMBus Address register is at
10423 * PHY address 01, Page 0 (not 768), Register 26.
10424 */
10425 if (page == HV_INTC_FC_PAGE_START)
10426 page = 0;
10427
10428 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
10429 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10430 page << BME1000_PAGE_SHIFT);
10431 }
10432
10433 rv = wm_gmii_mdic_readreg(dev, phy, regnum & MII_ADDRMASK);
10434 return rv;
10435 }
10436
10437 /*
10438 * wm_gmii_hv_writereg: [mii interface function]
10439 *
10440 * Write a PHY register on the kumeran.
10441 * This could be handled by the PHY layer if we didn't have to lock the
10442 * ressource ...
10443 */
10444 static void
10445 wm_gmii_hv_writereg(device_t dev, int phy, int reg, int val)
10446 {
10447 struct wm_softc *sc = device_private(dev);
10448
10449 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10450 device_xname(dev), __func__));
10451
10452 if (sc->phy.acquire(sc)) {
10453 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10454 return;
10455 }
10456
10457 wm_gmii_hv_writereg_locked(dev, phy, reg, val);
10458 sc->phy.release(sc);
10459 }
10460
10461 static void
10462 wm_gmii_hv_writereg_locked(device_t dev, int phy, int reg, int val)
10463 {
10464 struct wm_softc *sc = device_private(dev);
10465 uint16_t page = BM_PHY_REG_PAGE(reg);
10466 uint16_t regnum = BM_PHY_REG_NUM(reg);
10467
10468 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
10469
10470 /* Page 800 works differently than the rest so it has its own func */
10471 if (page == BM_WUC_PAGE) {
10472 uint16_t tmp;
10473
10474 tmp = val;
10475 wm_access_phy_wakeup_reg_bm(dev, reg, &tmp, 0);
10476 return;
10477 }
10478
10479 /*
10480 * Lower than page 768 works differently than the rest so it has its
10481 * own func
10482 */
10483 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
10484 printf("gmii_hv_writereg!!!\n");
10485 return;
10486 }
10487
10488 {
10489 /*
10490 * XXX I21[789] documents say that the SMBus Address register
10491 * is at PHY address 01, Page 0 (not 768), Register 26.
10492 */
10493 if (page == HV_INTC_FC_PAGE_START)
10494 page = 0;
10495
10496 /*
10497 * XXX Workaround MDIO accesses being disabled after entering
10498 * IEEE Power Down (whenever bit 11 of the PHY control
10499 * register is set)
10500 */
10501 if (sc->sc_phytype == WMPHY_82578) {
10502 struct mii_softc *child;
10503
10504 child = LIST_FIRST(&sc->sc_mii.mii_phys);
10505 if ((child != NULL) && (child->mii_mpd_rev >= 1)
10506 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0)
10507 && ((val & (1 << 11)) != 0)) {
10508 printf("XXX need workaround\n");
10509 }
10510 }
10511
10512 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
10513 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10514 page << BME1000_PAGE_SHIFT);
10515 }
10516 }
10517
10518 wm_gmii_mdic_writereg(dev, phy, regnum & MII_ADDRMASK, val);
10519 }
10520
10521 /*
10522 * wm_gmii_82580_readreg: [mii interface function]
10523 *
10524 * Read a PHY register on the 82580 and I350.
10525 * This could be handled by the PHY layer if we didn't have to lock the
10526 * ressource ...
10527 */
10528 static int
10529 wm_gmii_82580_readreg(device_t dev, int phy, int reg)
10530 {
10531 struct wm_softc *sc = device_private(dev);
10532 int rv;
10533
10534 if (sc->phy.acquire(sc) != 0) {
10535 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10536 return 0;
10537 }
10538
10539 #ifdef DIAGNOSTIC
10540 if (reg > MII_ADDRMASK) {
10541 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10542 __func__, sc->sc_phytype, reg);
10543 reg &= MII_ADDRMASK;
10544 }
10545 #endif
10546 rv = wm_gmii_mdic_readreg(dev, phy, reg);
10547
10548 sc->phy.release(sc);
10549 return rv;
10550 }
10551
10552 /*
10553 * wm_gmii_82580_writereg: [mii interface function]
10554 *
10555 * Write a PHY register on the 82580 and I350.
10556 * This could be handled by the PHY layer if we didn't have to lock the
10557 * ressource ...
10558 */
10559 static void
10560 wm_gmii_82580_writereg(device_t dev, int phy, int reg, int val)
10561 {
10562 struct wm_softc *sc = device_private(dev);
10563
10564 if (sc->phy.acquire(sc) != 0) {
10565 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10566 return;
10567 }
10568
10569 #ifdef DIAGNOSTIC
10570 if (reg > MII_ADDRMASK) {
10571 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10572 __func__, sc->sc_phytype, reg);
10573 reg &= MII_ADDRMASK;
10574 }
10575 #endif
10576 wm_gmii_mdic_writereg(dev, phy, reg, val);
10577
10578 sc->phy.release(sc);
10579 }
10580
10581 /*
10582 * wm_gmii_gs40g_readreg: [mii interface function]
10583 *
10584 * Read a PHY register on the I2100 and I211.
10585 * This could be handled by the PHY layer if we didn't have to lock the
10586 * ressource ...
10587 */
10588 static int
10589 wm_gmii_gs40g_readreg(device_t dev, int phy, int reg)
10590 {
10591 struct wm_softc *sc = device_private(dev);
10592 int page, offset;
10593 int rv;
10594
10595 /* Acquire semaphore */
10596 if (sc->phy.acquire(sc)) {
10597 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10598 return 0;
10599 }
10600
10601 /* Page select */
10602 page = reg >> GS40G_PAGE_SHIFT;
10603 wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
10604
10605 /* Read reg */
10606 offset = reg & GS40G_OFFSET_MASK;
10607 rv = wm_gmii_mdic_readreg(dev, phy, offset);
10608
10609 sc->phy.release(sc);
10610 return rv;
10611 }
10612
10613 /*
10614 * wm_gmii_gs40g_writereg: [mii interface function]
10615 *
10616 * Write a PHY register on the I210 and I211.
10617 * This could be handled by the PHY layer if we didn't have to lock the
10618 * ressource ...
10619 */
10620 static void
10621 wm_gmii_gs40g_writereg(device_t dev, int phy, int reg, int val)
10622 {
10623 struct wm_softc *sc = device_private(dev);
10624 int page, offset;
10625
10626 /* Acquire semaphore */
10627 if (sc->phy.acquire(sc)) {
10628 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10629 return;
10630 }
10631
10632 /* Page select */
10633 page = reg >> GS40G_PAGE_SHIFT;
10634 wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
10635
10636 /* Write reg */
10637 offset = reg & GS40G_OFFSET_MASK;
10638 wm_gmii_mdic_writereg(dev, phy, offset, val);
10639
10640 /* Release semaphore */
10641 sc->phy.release(sc);
10642 }
10643
10644 /*
10645 * wm_gmii_statchg: [mii interface function]
10646 *
10647 * Callback from MII layer when media changes.
10648 */
10649 static void
10650 wm_gmii_statchg(struct ifnet *ifp)
10651 {
10652 struct wm_softc *sc = ifp->if_softc;
10653 struct mii_data *mii = &sc->sc_mii;
10654
10655 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE);
10656 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
10657 sc->sc_fcrtl &= ~FCRTL_XONE;
10658
10659 /*
10660 * Get flow control negotiation result.
10661 */
10662 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
10663 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) {
10664 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
10665 mii->mii_media_active &= ~IFM_ETH_FMASK;
10666 }
10667
10668 if (sc->sc_flowflags & IFM_FLOW) {
10669 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) {
10670 sc->sc_ctrl |= CTRL_TFCE;
10671 sc->sc_fcrtl |= FCRTL_XONE;
10672 }
10673 if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
10674 sc->sc_ctrl |= CTRL_RFCE;
10675 }
10676
10677 if (sc->sc_mii.mii_media_active & IFM_FDX) {
10678 DPRINTF(WM_DEBUG_LINK,
10679 ("%s: LINK: statchg: FDX\n", ifp->if_xname));
10680 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
10681 } else {
10682 DPRINTF(WM_DEBUG_LINK,
10683 ("%s: LINK: statchg: HDX\n", ifp->if_xname));
10684 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
10685 }
10686
10687 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10688 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
10689 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
10690 : WMREG_FCRTL, sc->sc_fcrtl);
10691 if (sc->sc_type == WM_T_80003) {
10692 switch (IFM_SUBTYPE(sc->sc_mii.mii_media_active)) {
10693 case IFM_1000_T:
10694 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
10695 KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
10696 sc->sc_tipg = TIPG_1000T_80003_DFLT;
10697 break;
10698 default:
10699 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
10700 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
10701 sc->sc_tipg = TIPG_10_100_80003_DFLT;
10702 break;
10703 }
10704 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
10705 }
10706 }
10707
10708 /* kumeran related (80003, ICH* and PCH*) */
10709
10710 /*
10711 * wm_kmrn_readreg:
10712 *
10713 * Read a kumeran register
10714 */
10715 static int
10716 wm_kmrn_readreg(struct wm_softc *sc, int reg, uint16_t *val)
10717 {
10718 int rv;
10719
10720 if (sc->sc_type == WM_T_80003)
10721 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10722 else
10723 rv = sc->phy.acquire(sc);
10724 if (rv != 0) {
10725 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
10726 __func__);
10727 return rv;
10728 }
10729
10730 rv = wm_kmrn_readreg_locked(sc, reg, val);
10731
10732 if (sc->sc_type == WM_T_80003)
10733 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10734 else
10735 sc->phy.release(sc);
10736
10737 return rv;
10738 }
10739
10740 static int
10741 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg, uint16_t *val)
10742 {
10743
10744 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
10745 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
10746 KUMCTRLSTA_REN);
10747 CSR_WRITE_FLUSH(sc);
10748 delay(2);
10749
10750 *val = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
10751
10752 return 0;
10753 }
10754
10755 /*
10756 * wm_kmrn_writereg:
10757 *
10758 * Write a kumeran register
10759 */
10760 static int
10761 wm_kmrn_writereg(struct wm_softc *sc, int reg, uint16_t val)
10762 {
10763 int rv;
10764
10765 if (sc->sc_type == WM_T_80003)
10766 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10767 else
10768 rv = sc->phy.acquire(sc);
10769 if (rv != 0) {
10770 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
10771 __func__);
10772 return rv;
10773 }
10774
10775 rv = wm_kmrn_writereg_locked(sc, reg, val);
10776
10777 if (sc->sc_type == WM_T_80003)
10778 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10779 else
10780 sc->phy.release(sc);
10781
10782 return rv;
10783 }
10784
10785 static int
10786 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, uint16_t val)
10787 {
10788
10789 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
10790 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | val);
10791
10792 return 0;
10793 }
10794
10795 /* SGMII related */
10796
10797 /*
10798 * wm_sgmii_uses_mdio
10799 *
10800 * Check whether the transaction is to the internal PHY or the external
10801 * MDIO interface. Return true if it's MDIO.
10802 */
10803 static bool
10804 wm_sgmii_uses_mdio(struct wm_softc *sc)
10805 {
10806 uint32_t reg;
10807 bool ismdio = false;
10808
10809 switch (sc->sc_type) {
10810 case WM_T_82575:
10811 case WM_T_82576:
10812 reg = CSR_READ(sc, WMREG_MDIC);
10813 ismdio = ((reg & MDIC_DEST) != 0);
10814 break;
10815 case WM_T_82580:
10816 case WM_T_I350:
10817 case WM_T_I354:
10818 case WM_T_I210:
10819 case WM_T_I211:
10820 reg = CSR_READ(sc, WMREG_MDICNFG);
10821 ismdio = ((reg & MDICNFG_DEST) != 0);
10822 break;
10823 default:
10824 break;
10825 }
10826
10827 return ismdio;
10828 }
10829
10830 /*
10831 * wm_sgmii_readreg: [mii interface function]
10832 *
10833 * Read a PHY register on the SGMII
10834 * This could be handled by the PHY layer if we didn't have to lock the
10835 * ressource ...
10836 */
10837 static int
10838 wm_sgmii_readreg(device_t dev, int phy, int reg)
10839 {
10840 struct wm_softc *sc = device_private(dev);
10841 uint32_t i2ccmd;
10842 int i, rv;
10843
10844 if (sc->phy.acquire(sc)) {
10845 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10846 return 0;
10847 }
10848
10849 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
10850 | (phy << I2CCMD_PHY_ADDR_SHIFT)
10851 | I2CCMD_OPCODE_READ;
10852 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
10853
10854 /* Poll the ready bit */
10855 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
10856 delay(50);
10857 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
10858 if (i2ccmd & I2CCMD_READY)
10859 break;
10860 }
10861 if ((i2ccmd & I2CCMD_READY) == 0)
10862 device_printf(dev, "I2CCMD Read did not complete\n");
10863 if ((i2ccmd & I2CCMD_ERROR) != 0)
10864 device_printf(dev, "I2CCMD Error bit set\n");
10865
10866 rv = ((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00);
10867
10868 sc->phy.release(sc);
10869 return rv;
10870 }
10871
10872 /*
10873 * wm_sgmii_writereg: [mii interface function]
10874 *
10875 * Write a PHY register on the SGMII.
10876 * This could be handled by the PHY layer if we didn't have to lock the
10877 * ressource ...
10878 */
10879 static void
10880 wm_sgmii_writereg(device_t dev, int phy, int reg, int val)
10881 {
10882 struct wm_softc *sc = device_private(dev);
10883 uint32_t i2ccmd;
10884 int i;
10885 int val_swapped;
10886
10887 if (sc->phy.acquire(sc) != 0) {
10888 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10889 return;
10890 }
10891 /* Swap the data bytes for the I2C interface */
10892 val_swapped = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00);
10893 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
10894 | (phy << I2CCMD_PHY_ADDR_SHIFT)
10895 | I2CCMD_OPCODE_WRITE | val_swapped;
10896 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
10897
10898 /* Poll the ready bit */
10899 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
10900 delay(50);
10901 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
10902 if (i2ccmd & I2CCMD_READY)
10903 break;
10904 }
10905 if ((i2ccmd & I2CCMD_READY) == 0)
10906 device_printf(dev, "I2CCMD Write did not complete\n");
10907 if ((i2ccmd & I2CCMD_ERROR) != 0)
10908 device_printf(dev, "I2CCMD Error bit set\n");
10909
10910 sc->phy.release(sc);
10911 }
10912
10913 /* TBI related */
10914
10915 /*
10916 * wm_tbi_mediainit:
10917 *
10918 * Initialize media for use on 1000BASE-X devices.
10919 */
10920 static void
10921 wm_tbi_mediainit(struct wm_softc *sc)
10922 {
10923 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
10924 const char *sep = "";
10925
10926 if (sc->sc_type < WM_T_82543)
10927 sc->sc_tipg = TIPG_WM_DFLT;
10928 else
10929 sc->sc_tipg = TIPG_LG_DFLT;
10930
10931 sc->sc_tbi_serdes_anegticks = 5;
10932
10933 /* Initialize our media structures */
10934 sc->sc_mii.mii_ifp = ifp;
10935 sc->sc_ethercom.ec_mii = &sc->sc_mii;
10936
10937 if ((sc->sc_type >= WM_T_82575)
10938 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
10939 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
10940 wm_serdes_mediachange, wm_serdes_mediastatus);
10941 else
10942 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
10943 wm_tbi_mediachange, wm_tbi_mediastatus);
10944
10945 /*
10946 * SWD Pins:
10947 *
10948 * 0 = Link LED (output)
10949 * 1 = Loss Of Signal (input)
10950 */
10951 sc->sc_ctrl |= CTRL_SWDPIO(0);
10952
10953 /* XXX Perhaps this is only for TBI */
10954 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES)
10955 sc->sc_ctrl &= ~CTRL_SWDPIO(1);
10956
10957 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
10958 sc->sc_ctrl &= ~CTRL_LRST;
10959
10960 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10961
10962 #define ADD(ss, mm, dd) \
10963 do { \
10964 aprint_normal("%s%s", sep, ss); \
10965 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \
10966 sep = ", "; \
10967 } while (/*CONSTCOND*/0)
10968
10969 aprint_normal_dev(sc->sc_dev, "");
10970
10971 if (sc->sc_type == WM_T_I354) {
10972 uint32_t status;
10973
10974 status = CSR_READ(sc, WMREG_STATUS);
10975 if (((status & STATUS_2P5_SKU) != 0)
10976 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
10977 ADD("2500baseKX-FDX", IFM_2500_KX | IFM_FDX,ANAR_X_FD);
10978 } else
10979 ADD("1000baseKX-FDX", IFM_1000_KX | IFM_FDX,ANAR_X_FD);
10980 } else if (sc->sc_type == WM_T_82545) {
10981 /* Only 82545 is LX (XXX except SFP) */
10982 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
10983 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
10984 } else {
10985 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
10986 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
10987 }
10988 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD);
10989 aprint_normal("\n");
10990
10991 #undef ADD
10992
10993 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
10994 }
10995
10996 /*
10997 * wm_tbi_mediachange: [ifmedia interface function]
10998 *
10999 * Set hardware to newly-selected media on a 1000BASE-X device.
11000 */
11001 static int
11002 wm_tbi_mediachange(struct ifnet *ifp)
11003 {
11004 struct wm_softc *sc = ifp->if_softc;
11005 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
11006 uint32_t status;
11007 int i;
11008
11009 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
11010 /* XXX need some work for >= 82571 and < 82575 */
11011 if (sc->sc_type < WM_T_82575)
11012 return 0;
11013 }
11014
11015 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
11016 || (sc->sc_type >= WM_T_82575))
11017 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
11018
11019 sc->sc_ctrl &= ~CTRL_LRST;
11020 sc->sc_txcw = TXCW_ANE;
11021 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
11022 sc->sc_txcw |= TXCW_FD | TXCW_HD;
11023 else if (ife->ifm_media & IFM_FDX)
11024 sc->sc_txcw |= TXCW_FD;
11025 else
11026 sc->sc_txcw |= TXCW_HD;
11027
11028 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0)
11029 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE;
11030
11031 DPRINTF(WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n",
11032 device_xname(sc->sc_dev), sc->sc_txcw));
11033 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
11034 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11035 CSR_WRITE_FLUSH(sc);
11036 delay(1000);
11037
11038 i = CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1);
11039 DPRINTF(WM_DEBUG_LINK,("%s: i = 0x%x\n", device_xname(sc->sc_dev),i));
11040
11041 /*
11042 * On 82544 chips and later, the CTRL_SWDPIN(1) bit will be set if the
11043 * optics detect a signal, 0 if they don't.
11044 */
11045 if (((i != 0) && (sc->sc_type > WM_T_82544)) || (i == 0)) {
11046 /* Have signal; wait for the link to come up. */
11047 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
11048 delay(10000);
11049 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
11050 break;
11051 }
11052
11053 DPRINTF(WM_DEBUG_LINK,("%s: i = %d after waiting for link\n",
11054 device_xname(sc->sc_dev),i));
11055
11056 status = CSR_READ(sc, WMREG_STATUS);
11057 DPRINTF(WM_DEBUG_LINK,
11058 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n",
11059 device_xname(sc->sc_dev),status, STATUS_LU));
11060 if (status & STATUS_LU) {
11061 /* Link is up. */
11062 DPRINTF(WM_DEBUG_LINK,
11063 ("%s: LINK: set media -> link up %s\n",
11064 device_xname(sc->sc_dev),
11065 (status & STATUS_FD) ? "FDX" : "HDX"));
11066
11067 /*
11068 * NOTE: CTRL will update TFCE and RFCE automatically,
11069 * so we should update sc->sc_ctrl
11070 */
11071 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
11072 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
11073 sc->sc_fcrtl &= ~FCRTL_XONE;
11074 if (status & STATUS_FD)
11075 sc->sc_tctl |=
11076 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
11077 else
11078 sc->sc_tctl |=
11079 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
11080 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE)
11081 sc->sc_fcrtl |= FCRTL_XONE;
11082 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
11083 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
11084 WMREG_OLD_FCRTL : WMREG_FCRTL,
11085 sc->sc_fcrtl);
11086 sc->sc_tbi_linkup = 1;
11087 } else {
11088 if (i == WM_LINKUP_TIMEOUT)
11089 wm_check_for_link(sc);
11090 /* Link is down. */
11091 DPRINTF(WM_DEBUG_LINK,
11092 ("%s: LINK: set media -> link down\n",
11093 device_xname(sc->sc_dev)));
11094 sc->sc_tbi_linkup = 0;
11095 }
11096 } else {
11097 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
11098 device_xname(sc->sc_dev)));
11099 sc->sc_tbi_linkup = 0;
11100 }
11101
11102 wm_tbi_serdes_set_linkled(sc);
11103
11104 return 0;
11105 }
11106
11107 /*
11108 * wm_tbi_mediastatus: [ifmedia interface function]
11109 *
11110 * Get the current interface media status on a 1000BASE-X device.
11111 */
11112 static void
11113 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
11114 {
11115 struct wm_softc *sc = ifp->if_softc;
11116 uint32_t ctrl, status;
11117
11118 ifmr->ifm_status = IFM_AVALID;
11119 ifmr->ifm_active = IFM_ETHER;
11120
11121 status = CSR_READ(sc, WMREG_STATUS);
11122 if ((status & STATUS_LU) == 0) {
11123 ifmr->ifm_active |= IFM_NONE;
11124 return;
11125 }
11126
11127 ifmr->ifm_status |= IFM_ACTIVE;
11128 /* Only 82545 is LX */
11129 if (sc->sc_type == WM_T_82545)
11130 ifmr->ifm_active |= IFM_1000_LX;
11131 else
11132 ifmr->ifm_active |= IFM_1000_SX;
11133 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
11134 ifmr->ifm_active |= IFM_FDX;
11135 else
11136 ifmr->ifm_active |= IFM_HDX;
11137 ctrl = CSR_READ(sc, WMREG_CTRL);
11138 if (ctrl & CTRL_RFCE)
11139 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
11140 if (ctrl & CTRL_TFCE)
11141 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
11142 }
11143
11144 /* XXX TBI only */
11145 static int
11146 wm_check_for_link(struct wm_softc *sc)
11147 {
11148 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
11149 uint32_t rxcw;
11150 uint32_t ctrl;
11151 uint32_t status;
11152 uint32_t sig;
11153
11154 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
11155 /* XXX need some work for >= 82571 */
11156 if (sc->sc_type >= WM_T_82571) {
11157 sc->sc_tbi_linkup = 1;
11158 return 0;
11159 }
11160 }
11161
11162 rxcw = CSR_READ(sc, WMREG_RXCW);
11163 ctrl = CSR_READ(sc, WMREG_CTRL);
11164 status = CSR_READ(sc, WMREG_STATUS);
11165
11166 sig = (sc->sc_type > WM_T_82544) ? CTRL_SWDPIN(1) : 0;
11167
11168 DPRINTF(WM_DEBUG_LINK,
11169 ("%s: %s: sig = %d, status_lu = %d, rxcw_c = %d\n",
11170 device_xname(sc->sc_dev), __func__,
11171 ((ctrl & CTRL_SWDPIN(1)) == sig),
11172 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0)));
11173
11174 /*
11175 * SWDPIN LU RXCW
11176 * 0 0 0
11177 * 0 0 1 (should not happen)
11178 * 0 1 0 (should not happen)
11179 * 0 1 1 (should not happen)
11180 * 1 0 0 Disable autonego and force linkup
11181 * 1 0 1 got /C/ but not linkup yet
11182 * 1 1 0 (linkup)
11183 * 1 1 1 If IFM_AUTO, back to autonego
11184 *
11185 */
11186 if (((ctrl & CTRL_SWDPIN(1)) == sig)
11187 && ((status & STATUS_LU) == 0)
11188 && ((rxcw & RXCW_C) == 0)) {
11189 DPRINTF(WM_DEBUG_LINK, ("%s: force linkup and fullduplex\n",
11190 __func__));
11191 sc->sc_tbi_linkup = 0;
11192 /* Disable auto-negotiation in the TXCW register */
11193 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
11194
11195 /*
11196 * Force link-up and also force full-duplex.
11197 *
11198 * NOTE: CTRL was updated TFCE and RFCE automatically,
11199 * so we should update sc->sc_ctrl
11200 */
11201 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD;
11202 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11203 } else if (((status & STATUS_LU) != 0)
11204 && ((rxcw & RXCW_C) != 0)
11205 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
11206 sc->sc_tbi_linkup = 1;
11207 DPRINTF(WM_DEBUG_LINK, ("%s: go back to autonego\n",
11208 __func__));
11209 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
11210 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
11211 } else if (((ctrl & CTRL_SWDPIN(1)) == sig)
11212 && ((rxcw & RXCW_C) != 0)) {
11213 DPRINTF(WM_DEBUG_LINK, ("/C/"));
11214 } else {
11215 DPRINTF(WM_DEBUG_LINK, ("%s: %x,%x,%x\n", __func__, rxcw, ctrl,
11216 status));
11217 }
11218
11219 return 0;
11220 }
11221
11222 /*
11223 * wm_tbi_tick:
11224 *
11225 * Check the link on TBI devices.
11226 * This function acts as mii_tick().
11227 */
11228 static void
11229 wm_tbi_tick(struct wm_softc *sc)
11230 {
11231 struct mii_data *mii = &sc->sc_mii;
11232 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
11233 uint32_t status;
11234
11235 KASSERT(WM_CORE_LOCKED(sc));
11236
11237 status = CSR_READ(sc, WMREG_STATUS);
11238
11239 /* XXX is this needed? */
11240 (void)CSR_READ(sc, WMREG_RXCW);
11241 (void)CSR_READ(sc, WMREG_CTRL);
11242
11243 /* set link status */
11244 if ((status & STATUS_LU) == 0) {
11245 DPRINTF(WM_DEBUG_LINK,
11246 ("%s: LINK: checklink -> down\n",
11247 device_xname(sc->sc_dev)));
11248 sc->sc_tbi_linkup = 0;
11249 } else if (sc->sc_tbi_linkup == 0) {
11250 DPRINTF(WM_DEBUG_LINK,
11251 ("%s: LINK: checklink -> up %s\n",
11252 device_xname(sc->sc_dev),
11253 (status & STATUS_FD) ? "FDX" : "HDX"));
11254 sc->sc_tbi_linkup = 1;
11255 sc->sc_tbi_serdes_ticks = 0;
11256 }
11257
11258 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0)
11259 goto setled;
11260
11261 if ((status & STATUS_LU) == 0) {
11262 sc->sc_tbi_linkup = 0;
11263 /* If the timer expired, retry autonegotiation */
11264 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
11265 && (++sc->sc_tbi_serdes_ticks
11266 >= sc->sc_tbi_serdes_anegticks)) {
11267 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
11268 sc->sc_tbi_serdes_ticks = 0;
11269 /*
11270 * Reset the link, and let autonegotiation do
11271 * its thing
11272 */
11273 sc->sc_ctrl |= CTRL_LRST;
11274 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11275 CSR_WRITE_FLUSH(sc);
11276 delay(1000);
11277 sc->sc_ctrl &= ~CTRL_LRST;
11278 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11279 CSR_WRITE_FLUSH(sc);
11280 delay(1000);
11281 CSR_WRITE(sc, WMREG_TXCW,
11282 sc->sc_txcw & ~TXCW_ANE);
11283 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
11284 }
11285 }
11286
11287 setled:
11288 wm_tbi_serdes_set_linkled(sc);
11289 }
11290
11291 /* SERDES related */
11292 static void
11293 wm_serdes_power_up_link_82575(struct wm_softc *sc)
11294 {
11295 uint32_t reg;
11296
11297 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
11298 && ((sc->sc_flags & WM_F_SGMII) == 0))
11299 return;
11300
11301 reg = CSR_READ(sc, WMREG_PCS_CFG);
11302 reg |= PCS_CFG_PCS_EN;
11303 CSR_WRITE(sc, WMREG_PCS_CFG, reg);
11304
11305 reg = CSR_READ(sc, WMREG_CTRL_EXT);
11306 reg &= ~CTRL_EXT_SWDPIN(3);
11307 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
11308 CSR_WRITE_FLUSH(sc);
11309 }
11310
11311 static int
11312 wm_serdes_mediachange(struct ifnet *ifp)
11313 {
11314 struct wm_softc *sc = ifp->if_softc;
11315 bool pcs_autoneg = true; /* XXX */
11316 uint32_t ctrl_ext, pcs_lctl, reg;
11317
11318 /* XXX Currently, this function is not called on 8257[12] */
11319 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
11320 || (sc->sc_type >= WM_T_82575))
11321 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
11322
11323 wm_serdes_power_up_link_82575(sc);
11324
11325 sc->sc_ctrl |= CTRL_SLU;
11326
11327 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576))
11328 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1);
11329
11330 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
11331 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL);
11332 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) {
11333 case CTRL_EXT_LINK_MODE_SGMII:
11334 pcs_autoneg = true;
11335 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT;
11336 break;
11337 case CTRL_EXT_LINK_MODE_1000KX:
11338 pcs_autoneg = false;
11339 /* FALLTHROUGH */
11340 default:
11341 if ((sc->sc_type == WM_T_82575)
11342 || (sc->sc_type == WM_T_82576)) {
11343 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0)
11344 pcs_autoneg = false;
11345 }
11346 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD
11347 | CTRL_FRCFDX;
11348 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL;
11349 }
11350 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11351
11352 if (pcs_autoneg) {
11353 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART;
11354 pcs_lctl &= ~PCS_LCTL_FORCE_FC;
11355
11356 reg = CSR_READ(sc, WMREG_PCS_ANADV);
11357 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE);
11358 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE;
11359 CSR_WRITE(sc, WMREG_PCS_ANADV, reg);
11360 } else
11361 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC;
11362
11363 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl);
11364
11365
11366 return 0;
11367 }
11368
11369 static void
11370 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
11371 {
11372 struct wm_softc *sc = ifp->if_softc;
11373 struct mii_data *mii = &sc->sc_mii;
11374 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
11375 uint32_t pcs_adv, pcs_lpab, reg;
11376
11377 ifmr->ifm_status = IFM_AVALID;
11378 ifmr->ifm_active = IFM_ETHER;
11379
11380 /* Check PCS */
11381 reg = CSR_READ(sc, WMREG_PCS_LSTS);
11382 if ((reg & PCS_LSTS_LINKOK) == 0) {
11383 ifmr->ifm_active |= IFM_NONE;
11384 sc->sc_tbi_linkup = 0;
11385 goto setled;
11386 }
11387
11388 sc->sc_tbi_linkup = 1;
11389 ifmr->ifm_status |= IFM_ACTIVE;
11390 if (sc->sc_type == WM_T_I354) {
11391 uint32_t status;
11392
11393 status = CSR_READ(sc, WMREG_STATUS);
11394 if (((status & STATUS_2P5_SKU) != 0)
11395 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
11396 ifmr->ifm_active |= IFM_2500_SX; /* XXX KX */
11397 } else
11398 ifmr->ifm_active |= IFM_1000_SX; /* XXX KX */
11399 } else {
11400 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) {
11401 case PCS_LSTS_SPEED_10:
11402 ifmr->ifm_active |= IFM_10_T; /* XXX */
11403 break;
11404 case PCS_LSTS_SPEED_100:
11405 ifmr->ifm_active |= IFM_100_FX; /* XXX */
11406 break;
11407 case PCS_LSTS_SPEED_1000:
11408 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
11409 break;
11410 default:
11411 device_printf(sc->sc_dev, "Unknown speed\n");
11412 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
11413 break;
11414 }
11415 }
11416 if ((reg & PCS_LSTS_FDX) != 0)
11417 ifmr->ifm_active |= IFM_FDX;
11418 else
11419 ifmr->ifm_active |= IFM_HDX;
11420 mii->mii_media_active &= ~IFM_ETH_FMASK;
11421 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
11422 /* Check flow */
11423 reg = CSR_READ(sc, WMREG_PCS_LSTS);
11424 if ((reg & PCS_LSTS_AN_COMP) == 0) {
11425 DPRINTF(WM_DEBUG_LINK, ("XXX LINKOK but not ACOMP\n"));
11426 goto setled;
11427 }
11428 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
11429 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
11430 DPRINTF(WM_DEBUG_LINK,
11431 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab));
11432 if ((pcs_adv & TXCW_SYM_PAUSE)
11433 && (pcs_lpab & TXCW_SYM_PAUSE)) {
11434 mii->mii_media_active |= IFM_FLOW
11435 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
11436 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
11437 && (pcs_adv & TXCW_ASYM_PAUSE)
11438 && (pcs_lpab & TXCW_SYM_PAUSE)
11439 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
11440 mii->mii_media_active |= IFM_FLOW
11441 | IFM_ETH_TXPAUSE;
11442 } else if ((pcs_adv & TXCW_SYM_PAUSE)
11443 && (pcs_adv & TXCW_ASYM_PAUSE)
11444 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
11445 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
11446 mii->mii_media_active |= IFM_FLOW
11447 | IFM_ETH_RXPAUSE;
11448 }
11449 }
11450 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
11451 | (mii->mii_media_active & IFM_ETH_FMASK);
11452 setled:
11453 wm_tbi_serdes_set_linkled(sc);
11454 }
11455
11456 /*
11457 * wm_serdes_tick:
11458 *
11459 * Check the link on serdes devices.
11460 */
11461 static void
11462 wm_serdes_tick(struct wm_softc *sc)
11463 {
11464 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
11465 struct mii_data *mii = &sc->sc_mii;
11466 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
11467 uint32_t reg;
11468
11469 KASSERT(WM_CORE_LOCKED(sc));
11470
11471 mii->mii_media_status = IFM_AVALID;
11472 mii->mii_media_active = IFM_ETHER;
11473
11474 /* Check PCS */
11475 reg = CSR_READ(sc, WMREG_PCS_LSTS);
11476 if ((reg & PCS_LSTS_LINKOK) != 0) {
11477 mii->mii_media_status |= IFM_ACTIVE;
11478 sc->sc_tbi_linkup = 1;
11479 sc->sc_tbi_serdes_ticks = 0;
11480 mii->mii_media_active |= IFM_1000_SX; /* XXX */
11481 if ((reg & PCS_LSTS_FDX) != 0)
11482 mii->mii_media_active |= IFM_FDX;
11483 else
11484 mii->mii_media_active |= IFM_HDX;
11485 } else {
11486 mii->mii_media_status |= IFM_NONE;
11487 sc->sc_tbi_linkup = 0;
11488 /* If the timer expired, retry autonegotiation */
11489 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
11490 && (++sc->sc_tbi_serdes_ticks
11491 >= sc->sc_tbi_serdes_anegticks)) {
11492 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
11493 sc->sc_tbi_serdes_ticks = 0;
11494 /* XXX */
11495 wm_serdes_mediachange(ifp);
11496 }
11497 }
11498
11499 wm_tbi_serdes_set_linkled(sc);
11500 }
11501
11502 /* SFP related */
11503
11504 static int
11505 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data)
11506 {
11507 uint32_t i2ccmd;
11508 int i;
11509
11510 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
11511 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
11512
11513 /* Poll the ready bit */
11514 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
11515 delay(50);
11516 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
11517 if (i2ccmd & I2CCMD_READY)
11518 break;
11519 }
11520 if ((i2ccmd & I2CCMD_READY) == 0)
11521 return -1;
11522 if ((i2ccmd & I2CCMD_ERROR) != 0)
11523 return -1;
11524
11525 *data = i2ccmd & 0x00ff;
11526
11527 return 0;
11528 }
11529
11530 static uint32_t
11531 wm_sfp_get_media_type(struct wm_softc *sc)
11532 {
11533 uint32_t ctrl_ext;
11534 uint8_t val = 0;
11535 int timeout = 3;
11536 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN;
11537 int rv = -1;
11538
11539 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
11540 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
11541 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA);
11542 CSR_WRITE_FLUSH(sc);
11543
11544 /* Read SFP module data */
11545 while (timeout) {
11546 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val);
11547 if (rv == 0)
11548 break;
11549 delay(100*1000); /* XXX too big */
11550 timeout--;
11551 }
11552 if (rv != 0)
11553 goto out;
11554 switch (val) {
11555 case SFF_SFP_ID_SFF:
11556 aprint_normal_dev(sc->sc_dev,
11557 "Module/Connector soldered to board\n");
11558 break;
11559 case SFF_SFP_ID_SFP:
11560 aprint_normal_dev(sc->sc_dev, "SFP\n");
11561 break;
11562 case SFF_SFP_ID_UNKNOWN:
11563 goto out;
11564 default:
11565 break;
11566 }
11567
11568 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val);
11569 if (rv != 0) {
11570 goto out;
11571 }
11572
11573 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0)
11574 mediatype = WM_MEDIATYPE_SERDES;
11575 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0){
11576 sc->sc_flags |= WM_F_SGMII;
11577 mediatype = WM_MEDIATYPE_COPPER;
11578 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0){
11579 sc->sc_flags |= WM_F_SGMII;
11580 mediatype = WM_MEDIATYPE_SERDES;
11581 }
11582
11583 out:
11584 /* Restore I2C interface setting */
11585 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
11586
11587 return mediatype;
11588 }
11589
11590 /*
11591 * NVM related.
11592 * Microwire, SPI (w/wo EERD) and Flash.
11593 */
11594
11595 /* Both spi and uwire */
11596
11597 /*
11598 * wm_eeprom_sendbits:
11599 *
11600 * Send a series of bits to the EEPROM.
11601 */
11602 static void
11603 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits)
11604 {
11605 uint32_t reg;
11606 int x;
11607
11608 reg = CSR_READ(sc, WMREG_EECD);
11609
11610 for (x = nbits; x > 0; x--) {
11611 if (bits & (1U << (x - 1)))
11612 reg |= EECD_DI;
11613 else
11614 reg &= ~EECD_DI;
11615 CSR_WRITE(sc, WMREG_EECD, reg);
11616 CSR_WRITE_FLUSH(sc);
11617 delay(2);
11618 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
11619 CSR_WRITE_FLUSH(sc);
11620 delay(2);
11621 CSR_WRITE(sc, WMREG_EECD, reg);
11622 CSR_WRITE_FLUSH(sc);
11623 delay(2);
11624 }
11625 }
11626
11627 /*
11628 * wm_eeprom_recvbits:
11629 *
11630 * Receive a series of bits from the EEPROM.
11631 */
11632 static void
11633 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits)
11634 {
11635 uint32_t reg, val;
11636 int x;
11637
11638 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI;
11639
11640 val = 0;
11641 for (x = nbits; x > 0; x--) {
11642 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
11643 CSR_WRITE_FLUSH(sc);
11644 delay(2);
11645 if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
11646 val |= (1U << (x - 1));
11647 CSR_WRITE(sc, WMREG_EECD, reg);
11648 CSR_WRITE_FLUSH(sc);
11649 delay(2);
11650 }
11651 *valp = val;
11652 }
11653
11654 /* Microwire */
11655
11656 /*
11657 * wm_nvm_read_uwire:
11658 *
11659 * Read a word from the EEPROM using the MicroWire protocol.
11660 */
11661 static int
11662 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
11663 {
11664 uint32_t reg, val;
11665 int i;
11666
11667 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11668 device_xname(sc->sc_dev), __func__));
11669
11670 if (sc->nvm.acquire(sc) != 0)
11671 return -1;
11672
11673 for (i = 0; i < wordcnt; i++) {
11674 /* Clear SK and DI. */
11675 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI);
11676 CSR_WRITE(sc, WMREG_EECD, reg);
11677
11678 /*
11679 * XXX: workaround for a bug in qemu-0.12.x and prior
11680 * and Xen.
11681 *
11682 * We use this workaround only for 82540 because qemu's
11683 * e1000 act as 82540.
11684 */
11685 if (sc->sc_type == WM_T_82540) {
11686 reg |= EECD_SK;
11687 CSR_WRITE(sc, WMREG_EECD, reg);
11688 reg &= ~EECD_SK;
11689 CSR_WRITE(sc, WMREG_EECD, reg);
11690 CSR_WRITE_FLUSH(sc);
11691 delay(2);
11692 }
11693 /* XXX: end of workaround */
11694
11695 /* Set CHIP SELECT. */
11696 reg |= EECD_CS;
11697 CSR_WRITE(sc, WMREG_EECD, reg);
11698 CSR_WRITE_FLUSH(sc);
11699 delay(2);
11700
11701 /* Shift in the READ command. */
11702 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3);
11703
11704 /* Shift in address. */
11705 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits);
11706
11707 /* Shift out the data. */
11708 wm_eeprom_recvbits(sc, &val, 16);
11709 data[i] = val & 0xffff;
11710
11711 /* Clear CHIP SELECT. */
11712 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS;
11713 CSR_WRITE(sc, WMREG_EECD, reg);
11714 CSR_WRITE_FLUSH(sc);
11715 delay(2);
11716 }
11717
11718 sc->nvm.release(sc);
11719 return 0;
11720 }
11721
11722 /* SPI */
11723
11724 /*
11725 * Set SPI and FLASH related information from the EECD register.
11726 * For 82541 and 82547, the word size is taken from EEPROM.
11727 */
11728 static int
11729 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc)
11730 {
11731 int size;
11732 uint32_t reg;
11733 uint16_t data;
11734
11735 reg = CSR_READ(sc, WMREG_EECD);
11736 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8;
11737
11738 /* Read the size of NVM from EECD by default */
11739 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
11740 switch (sc->sc_type) {
11741 case WM_T_82541:
11742 case WM_T_82541_2:
11743 case WM_T_82547:
11744 case WM_T_82547_2:
11745 /* Set dummy value to access EEPROM */
11746 sc->sc_nvm_wordsize = 64;
11747 if (wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data) != 0) {
11748 aprint_error_dev(sc->sc_dev,
11749 "%s: failed to read EEPROM size\n", __func__);
11750 }
11751 reg = data;
11752 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
11753 if (size == 0)
11754 size = 6; /* 64 word size */
11755 else
11756 size += NVM_WORD_SIZE_BASE_SHIFT + 1;
11757 break;
11758 case WM_T_80003:
11759 case WM_T_82571:
11760 case WM_T_82572:
11761 case WM_T_82573: /* SPI case */
11762 case WM_T_82574: /* SPI case */
11763 case WM_T_82583: /* SPI case */
11764 size += NVM_WORD_SIZE_BASE_SHIFT;
11765 if (size > 14)
11766 size = 14;
11767 break;
11768 case WM_T_82575:
11769 case WM_T_82576:
11770 case WM_T_82580:
11771 case WM_T_I350:
11772 case WM_T_I354:
11773 case WM_T_I210:
11774 case WM_T_I211:
11775 size += NVM_WORD_SIZE_BASE_SHIFT;
11776 if (size > 15)
11777 size = 15;
11778 break;
11779 default:
11780 aprint_error_dev(sc->sc_dev,
11781 "%s: unknown device(%d)?\n", __func__, sc->sc_type);
11782 return -1;
11783 break;
11784 }
11785
11786 sc->sc_nvm_wordsize = 1 << size;
11787
11788 return 0;
11789 }
11790
11791 /*
11792 * wm_nvm_ready_spi:
11793 *
11794 * Wait for a SPI EEPROM to be ready for commands.
11795 */
11796 static int
11797 wm_nvm_ready_spi(struct wm_softc *sc)
11798 {
11799 uint32_t val;
11800 int usec;
11801
11802 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11803 device_xname(sc->sc_dev), __func__));
11804
11805 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) {
11806 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8);
11807 wm_eeprom_recvbits(sc, &val, 8);
11808 if ((val & SPI_SR_RDY) == 0)
11809 break;
11810 }
11811 if (usec >= SPI_MAX_RETRIES) {
11812 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n");
11813 return -1;
11814 }
11815 return 0;
11816 }
11817
11818 /*
11819 * wm_nvm_read_spi:
11820 *
11821 * Read a work from the EEPROM using the SPI protocol.
11822 */
11823 static int
11824 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
11825 {
11826 uint32_t reg, val;
11827 int i;
11828 uint8_t opc;
11829 int rv = 0;
11830
11831 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11832 device_xname(sc->sc_dev), __func__));
11833
11834 if (sc->nvm.acquire(sc) != 0)
11835 return -1;
11836
11837 /* Clear SK and CS. */
11838 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS);
11839 CSR_WRITE(sc, WMREG_EECD, reg);
11840 CSR_WRITE_FLUSH(sc);
11841 delay(2);
11842
11843 if ((rv = wm_nvm_ready_spi(sc)) != 0)
11844 goto out;
11845
11846 /* Toggle CS to flush commands. */
11847 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS);
11848 CSR_WRITE_FLUSH(sc);
11849 delay(2);
11850 CSR_WRITE(sc, WMREG_EECD, reg);
11851 CSR_WRITE_FLUSH(sc);
11852 delay(2);
11853
11854 opc = SPI_OPC_READ;
11855 if (sc->sc_nvm_addrbits == 8 && word >= 128)
11856 opc |= SPI_OPC_A8;
11857
11858 wm_eeprom_sendbits(sc, opc, 8);
11859 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits);
11860
11861 for (i = 0; i < wordcnt; i++) {
11862 wm_eeprom_recvbits(sc, &val, 16);
11863 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8);
11864 }
11865
11866 /* Raise CS and clear SK. */
11867 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS;
11868 CSR_WRITE(sc, WMREG_EECD, reg);
11869 CSR_WRITE_FLUSH(sc);
11870 delay(2);
11871
11872 out:
11873 sc->nvm.release(sc);
11874 return rv;
11875 }
11876
11877 /* Using with EERD */
11878
11879 static int
11880 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw)
11881 {
11882 uint32_t attempts = 100000;
11883 uint32_t i, reg = 0;
11884 int32_t done = -1;
11885
11886 for (i = 0; i < attempts; i++) {
11887 reg = CSR_READ(sc, rw);
11888
11889 if (reg & EERD_DONE) {
11890 done = 0;
11891 break;
11892 }
11893 delay(5);
11894 }
11895
11896 return done;
11897 }
11898
11899 static int
11900 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt,
11901 uint16_t *data)
11902 {
11903 int i, eerd = 0;
11904 int rv = 0;
11905
11906 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11907 device_xname(sc->sc_dev), __func__));
11908
11909 if (sc->nvm.acquire(sc) != 0)
11910 return -1;
11911
11912 for (i = 0; i < wordcnt; i++) {
11913 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START;
11914 CSR_WRITE(sc, WMREG_EERD, eerd);
11915 rv = wm_poll_eerd_eewr_done(sc, WMREG_EERD);
11916 if (rv != 0) {
11917 aprint_error_dev(sc->sc_dev, "EERD polling failed: "
11918 "offset=%d. wordcnt=%d\n", offset, wordcnt);
11919 break;
11920 }
11921 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT);
11922 }
11923
11924 sc->nvm.release(sc);
11925 return rv;
11926 }
11927
11928 /* Flash */
11929
11930 static int
11931 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank)
11932 {
11933 uint32_t eecd;
11934 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1;
11935 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t);
11936 uint8_t sig_byte = 0;
11937
11938 switch (sc->sc_type) {
11939 case WM_T_PCH_SPT:
11940 /*
11941 * In SPT, read from the CTRL_EXT reg instead of accessing the
11942 * sector valid bits from the NVM.
11943 */
11944 *bank = CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_NVMVS;
11945 if ((*bank == 0) || (*bank == 1)) {
11946 aprint_error_dev(sc->sc_dev,
11947 "%s: no valid NVM bank present (%u)\n", __func__,
11948 *bank);
11949 return -1;
11950 } else {
11951 *bank = *bank - 2;
11952 return 0;
11953 }
11954 case WM_T_ICH8:
11955 case WM_T_ICH9:
11956 eecd = CSR_READ(sc, WMREG_EECD);
11957 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) {
11958 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0;
11959 return 0;
11960 }
11961 /* FALLTHROUGH */
11962 default:
11963 /* Default to 0 */
11964 *bank = 0;
11965
11966 /* Check bank 0 */
11967 wm_read_ich8_byte(sc, act_offset, &sig_byte);
11968 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
11969 *bank = 0;
11970 return 0;
11971 }
11972
11973 /* Check bank 1 */
11974 wm_read_ich8_byte(sc, act_offset + bank1_offset,
11975 &sig_byte);
11976 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
11977 *bank = 1;
11978 return 0;
11979 }
11980 }
11981
11982 DPRINTF(WM_DEBUG_NVM, ("%s: No valid NVM bank present\n",
11983 device_xname(sc->sc_dev)));
11984 return -1;
11985 }
11986
11987 /******************************************************************************
11988 * This function does initial flash setup so that a new read/write/erase cycle
11989 * can be started.
11990 *
11991 * sc - The pointer to the hw structure
11992 ****************************************************************************/
11993 static int32_t
11994 wm_ich8_cycle_init(struct wm_softc *sc)
11995 {
11996 uint16_t hsfsts;
11997 int32_t error = 1;
11998 int32_t i = 0;
11999
12000 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
12001
12002 /* May be check the Flash Des Valid bit in Hw status */
12003 if ((hsfsts & HSFSTS_FLDVAL) == 0) {
12004 return error;
12005 }
12006
12007 /* Clear FCERR in Hw status by writing 1 */
12008 /* Clear DAEL in Hw status by writing a 1 */
12009 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL;
12010
12011 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
12012
12013 /*
12014 * Either we should have a hardware SPI cycle in progress bit to check
12015 * against, in order to start a new cycle or FDONE bit should be
12016 * changed in the hardware so that it is 1 after harware reset, which
12017 * can then be used as an indication whether a cycle is in progress or
12018 * has been completed .. we should also have some software semaphore
12019 * mechanism to guard FDONE or the cycle in progress bit so that two
12020 * threads access to those bits can be sequentiallized or a way so that
12021 * 2 threads dont start the cycle at the same time
12022 */
12023
12024 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
12025 /*
12026 * There is no cycle running at present, so we can start a
12027 * cycle
12028 */
12029
12030 /* Begin by setting Flash Cycle Done. */
12031 hsfsts |= HSFSTS_DONE;
12032 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
12033 error = 0;
12034 } else {
12035 /*
12036 * otherwise poll for sometime so the current cycle has a
12037 * chance to end before giving up.
12038 */
12039 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
12040 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
12041 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
12042 error = 0;
12043 break;
12044 }
12045 delay(1);
12046 }
12047 if (error == 0) {
12048 /*
12049 * Successful in waiting for previous cycle to timeout,
12050 * now set the Flash Cycle Done.
12051 */
12052 hsfsts |= HSFSTS_DONE;
12053 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
12054 }
12055 }
12056 return error;
12057 }
12058
12059 /******************************************************************************
12060 * This function starts a flash cycle and waits for its completion
12061 *
12062 * sc - The pointer to the hw structure
12063 ****************************************************************************/
12064 static int32_t
12065 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout)
12066 {
12067 uint16_t hsflctl;
12068 uint16_t hsfsts;
12069 int32_t error = 1;
12070 uint32_t i = 0;
12071
12072 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
12073 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
12074 hsflctl |= HSFCTL_GO;
12075 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
12076
12077 /* Wait till FDONE bit is set to 1 */
12078 do {
12079 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
12080 if (hsfsts & HSFSTS_DONE)
12081 break;
12082 delay(1);
12083 i++;
12084 } while (i < timeout);
12085 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0)
12086 error = 0;
12087
12088 return error;
12089 }
12090
12091 /******************************************************************************
12092 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers.
12093 *
12094 * sc - The pointer to the hw structure
12095 * index - The index of the byte or word to read.
12096 * size - Size of data to read, 1=byte 2=word, 4=dword
12097 * data - Pointer to the word to store the value read.
12098 *****************************************************************************/
12099 static int32_t
12100 wm_read_ich8_data(struct wm_softc *sc, uint32_t index,
12101 uint32_t size, uint32_t *data)
12102 {
12103 uint16_t hsfsts;
12104 uint16_t hsflctl;
12105 uint32_t flash_linear_address;
12106 uint32_t flash_data = 0;
12107 int32_t error = 1;
12108 int32_t count = 0;
12109
12110 if (size < 1 || size > 4 || data == 0x0 ||
12111 index > ICH_FLASH_LINEAR_ADDR_MASK)
12112 return error;
12113
12114 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
12115 sc->sc_ich8_flash_base;
12116
12117 do {
12118 delay(1);
12119 /* Steps */
12120 error = wm_ich8_cycle_init(sc);
12121 if (error)
12122 break;
12123
12124 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
12125 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
12126 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT)
12127 & HSFCTL_BCOUNT_MASK;
12128 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT;
12129 if (sc->sc_type == WM_T_PCH_SPT) {
12130 /*
12131 * In SPT, This register is in Lan memory space, not
12132 * flash. Therefore, only 32 bit access is supported.
12133 */
12134 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFCTL,
12135 (uint32_t)hsflctl);
12136 } else
12137 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
12138
12139 /*
12140 * Write the last 24 bits of index into Flash Linear address
12141 * field in Flash Address
12142 */
12143 /* TODO: TBD maybe check the index against the size of flash */
12144
12145 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address);
12146
12147 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT);
12148
12149 /*
12150 * Check if FCERR is set to 1, if set to 1, clear it and try
12151 * the whole sequence a few more times, else read in (shift in)
12152 * the Flash Data0, the order is least significant byte first
12153 * msb to lsb
12154 */
12155 if (error == 0) {
12156 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0);
12157 if (size == 1)
12158 *data = (uint8_t)(flash_data & 0x000000FF);
12159 else if (size == 2)
12160 *data = (uint16_t)(flash_data & 0x0000FFFF);
12161 else if (size == 4)
12162 *data = (uint32_t)flash_data;
12163 break;
12164 } else {
12165 /*
12166 * If we've gotten here, then things are probably
12167 * completely hosed, but if the error condition is
12168 * detected, it won't hurt to give it another try...
12169 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
12170 */
12171 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
12172 if (hsfsts & HSFSTS_ERR) {
12173 /* Repeat for some time before giving up. */
12174 continue;
12175 } else if ((hsfsts & HSFSTS_DONE) == 0)
12176 break;
12177 }
12178 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
12179
12180 return error;
12181 }
12182
12183 /******************************************************************************
12184 * Reads a single byte from the NVM using the ICH8 flash access registers.
12185 *
12186 * sc - pointer to wm_hw structure
12187 * index - The index of the byte to read.
12188 * data - Pointer to a byte to store the value read.
12189 *****************************************************************************/
12190 static int32_t
12191 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data)
12192 {
12193 int32_t status;
12194 uint32_t word = 0;
12195
12196 status = wm_read_ich8_data(sc, index, 1, &word);
12197 if (status == 0)
12198 *data = (uint8_t)word;
12199 else
12200 *data = 0;
12201
12202 return status;
12203 }
12204
12205 /******************************************************************************
12206 * Reads a word from the NVM using the ICH8 flash access registers.
12207 *
12208 * sc - pointer to wm_hw structure
12209 * index - The starting byte index of the word to read.
12210 * data - Pointer to a word to store the value read.
12211 *****************************************************************************/
12212 static int32_t
12213 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data)
12214 {
12215 int32_t status;
12216 uint32_t word = 0;
12217
12218 status = wm_read_ich8_data(sc, index, 2, &word);
12219 if (status == 0)
12220 *data = (uint16_t)word;
12221 else
12222 *data = 0;
12223
12224 return status;
12225 }
12226
12227 /******************************************************************************
12228 * Reads a dword from the NVM using the ICH8 flash access registers.
12229 *
12230 * sc - pointer to wm_hw structure
12231 * index - The starting byte index of the word to read.
12232 * data - Pointer to a word to store the value read.
12233 *****************************************************************************/
12234 static int32_t
12235 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data)
12236 {
12237 int32_t status;
12238
12239 status = wm_read_ich8_data(sc, index, 4, data);
12240 return status;
12241 }
12242
12243 /******************************************************************************
12244 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
12245 * register.
12246 *
12247 * sc - Struct containing variables accessed by shared code
12248 * offset - offset of word in the EEPROM to read
12249 * data - word read from the EEPROM
12250 * words - number of words to read
12251 *****************************************************************************/
12252 static int
12253 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data)
12254 {
12255 int32_t rv = 0;
12256 uint32_t flash_bank = 0;
12257 uint32_t act_offset = 0;
12258 uint32_t bank_offset = 0;
12259 uint16_t word = 0;
12260 uint16_t i = 0;
12261
12262 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12263 device_xname(sc->sc_dev), __func__));
12264
12265 if (sc->nvm.acquire(sc) != 0)
12266 return -1;
12267
12268 /*
12269 * We need to know which is the valid flash bank. In the event
12270 * that we didn't allocate eeprom_shadow_ram, we may not be
12271 * managing flash_bank. So it cannot be trusted and needs
12272 * to be updated with each read.
12273 */
12274 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
12275 if (rv) {
12276 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
12277 device_xname(sc->sc_dev)));
12278 flash_bank = 0;
12279 }
12280
12281 /*
12282 * Adjust offset appropriately if we're on bank 1 - adjust for word
12283 * size
12284 */
12285 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
12286
12287 for (i = 0; i < words; i++) {
12288 /* The NVM part needs a byte offset, hence * 2 */
12289 act_offset = bank_offset + ((offset + i) * 2);
12290 rv = wm_read_ich8_word(sc, act_offset, &word);
12291 if (rv) {
12292 aprint_error_dev(sc->sc_dev,
12293 "%s: failed to read NVM\n", __func__);
12294 break;
12295 }
12296 data[i] = word;
12297 }
12298
12299 sc->nvm.release(sc);
12300 return rv;
12301 }
12302
12303 /******************************************************************************
12304 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access
12305 * register.
12306 *
12307 * sc - Struct containing variables accessed by shared code
12308 * offset - offset of word in the EEPROM to read
12309 * data - word read from the EEPROM
12310 * words - number of words to read
12311 *****************************************************************************/
12312 static int
12313 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data)
12314 {
12315 int32_t rv = 0;
12316 uint32_t flash_bank = 0;
12317 uint32_t act_offset = 0;
12318 uint32_t bank_offset = 0;
12319 uint32_t dword = 0;
12320 uint16_t i = 0;
12321
12322 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12323 device_xname(sc->sc_dev), __func__));
12324
12325 if (sc->nvm.acquire(sc) != 0)
12326 return -1;
12327
12328 /*
12329 * We need to know which is the valid flash bank. In the event
12330 * that we didn't allocate eeprom_shadow_ram, we may not be
12331 * managing flash_bank. So it cannot be trusted and needs
12332 * to be updated with each read.
12333 */
12334 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
12335 if (rv) {
12336 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
12337 device_xname(sc->sc_dev)));
12338 flash_bank = 0;
12339 }
12340
12341 /*
12342 * Adjust offset appropriately if we're on bank 1 - adjust for word
12343 * size
12344 */
12345 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
12346
12347 for (i = 0; i < words; i++) {
12348 /* The NVM part needs a byte offset, hence * 2 */
12349 act_offset = bank_offset + ((offset + i) * 2);
12350 /* but we must read dword aligned, so mask ... */
12351 rv = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword);
12352 if (rv) {
12353 aprint_error_dev(sc->sc_dev,
12354 "%s: failed to read NVM\n", __func__);
12355 break;
12356 }
12357 /* ... and pick out low or high word */
12358 if ((act_offset & 0x2) == 0)
12359 data[i] = (uint16_t)(dword & 0xFFFF);
12360 else
12361 data[i] = (uint16_t)((dword >> 16) & 0xFFFF);
12362 }
12363
12364 sc->nvm.release(sc);
12365 return rv;
12366 }
12367
12368 /* iNVM */
12369
12370 static int
12371 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data)
12372 {
12373 int32_t rv = 0;
12374 uint32_t invm_dword;
12375 uint16_t i;
12376 uint8_t record_type, word_address;
12377
12378 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12379 device_xname(sc->sc_dev), __func__));
12380
12381 for (i = 0; i < INVM_SIZE; i++) {
12382 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i));
12383 /* Get record type */
12384 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
12385 if (record_type == INVM_UNINITIALIZED_STRUCTURE)
12386 break;
12387 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE)
12388 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
12389 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE)
12390 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
12391 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) {
12392 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
12393 if (word_address == address) {
12394 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
12395 rv = 0;
12396 break;
12397 }
12398 }
12399 }
12400
12401 return rv;
12402 }
12403
12404 static int
12405 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data)
12406 {
12407 int rv = 0;
12408 int i;
12409
12410 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12411 device_xname(sc->sc_dev), __func__));
12412
12413 if (sc->nvm.acquire(sc) != 0)
12414 return -1;
12415
12416 for (i = 0; i < words; i++) {
12417 switch (offset + i) {
12418 case NVM_OFF_MACADDR:
12419 case NVM_OFF_MACADDR1:
12420 case NVM_OFF_MACADDR2:
12421 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]);
12422 if (rv != 0) {
12423 data[i] = 0xffff;
12424 rv = -1;
12425 }
12426 break;
12427 case NVM_OFF_CFG2:
12428 rv = wm_nvm_read_word_invm(sc, offset, data);
12429 if (rv != 0) {
12430 *data = NVM_INIT_CTRL_2_DEFAULT_I211;
12431 rv = 0;
12432 }
12433 break;
12434 case NVM_OFF_CFG4:
12435 rv = wm_nvm_read_word_invm(sc, offset, data);
12436 if (rv != 0) {
12437 *data = NVM_INIT_CTRL_4_DEFAULT_I211;
12438 rv = 0;
12439 }
12440 break;
12441 case NVM_OFF_LED_1_CFG:
12442 rv = wm_nvm_read_word_invm(sc, offset, data);
12443 if (rv != 0) {
12444 *data = NVM_LED_1_CFG_DEFAULT_I211;
12445 rv = 0;
12446 }
12447 break;
12448 case NVM_OFF_LED_0_2_CFG:
12449 rv = wm_nvm_read_word_invm(sc, offset, data);
12450 if (rv != 0) {
12451 *data = NVM_LED_0_2_CFG_DEFAULT_I211;
12452 rv = 0;
12453 }
12454 break;
12455 case NVM_OFF_ID_LED_SETTINGS:
12456 rv = wm_nvm_read_word_invm(sc, offset, data);
12457 if (rv != 0) {
12458 *data = ID_LED_RESERVED_FFFF;
12459 rv = 0;
12460 }
12461 break;
12462 default:
12463 DPRINTF(WM_DEBUG_NVM,
12464 ("NVM word 0x%02x is not mapped.\n", offset));
12465 *data = NVM_RESERVED_WORD;
12466 break;
12467 }
12468 }
12469
12470 sc->nvm.release(sc);
12471 return rv;
12472 }
12473
12474 /* Lock, detecting NVM type, validate checksum, version and read */
12475
12476 static int
12477 wm_nvm_is_onboard_eeprom(struct wm_softc *sc)
12478 {
12479 uint32_t eecd = 0;
12480
12481 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574
12482 || sc->sc_type == WM_T_82583) {
12483 eecd = CSR_READ(sc, WMREG_EECD);
12484
12485 /* Isolate bits 15 & 16 */
12486 eecd = ((eecd >> 15) & 0x03);
12487
12488 /* If both bits are set, device is Flash type */
12489 if (eecd == 0x03)
12490 return 0;
12491 }
12492 return 1;
12493 }
12494
12495 static int
12496 wm_nvm_flash_presence_i210(struct wm_softc *sc)
12497 {
12498 uint32_t eec;
12499
12500 eec = CSR_READ(sc, WMREG_EEC);
12501 if ((eec & EEC_FLASH_DETECTED) != 0)
12502 return 1;
12503
12504 return 0;
12505 }
12506
12507 /*
12508 * wm_nvm_validate_checksum
12509 *
12510 * The checksum is defined as the sum of the first 64 (16 bit) words.
12511 */
12512 static int
12513 wm_nvm_validate_checksum(struct wm_softc *sc)
12514 {
12515 uint16_t checksum;
12516 uint16_t eeprom_data;
12517 #ifdef WM_DEBUG
12518 uint16_t csum_wordaddr, valid_checksum;
12519 #endif
12520 int i;
12521
12522 checksum = 0;
12523
12524 /* Don't check for I211 */
12525 if (sc->sc_type == WM_T_I211)
12526 return 0;
12527
12528 #ifdef WM_DEBUG
12529 if (sc->sc_type == WM_T_PCH_LPT) {
12530 csum_wordaddr = NVM_OFF_COMPAT;
12531 valid_checksum = NVM_COMPAT_VALID_CHECKSUM;
12532 } else {
12533 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1;
12534 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM;
12535 }
12536
12537 /* Dump EEPROM image for debug */
12538 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
12539 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
12540 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
12541 /* XXX PCH_SPT? */
12542 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data);
12543 if ((eeprom_data & valid_checksum) == 0) {
12544 DPRINTF(WM_DEBUG_NVM,
12545 ("%s: NVM need to be updated (%04x != %04x)\n",
12546 device_xname(sc->sc_dev), eeprom_data,
12547 valid_checksum));
12548 }
12549 }
12550
12551 if ((wm_debug & WM_DEBUG_NVM) != 0) {
12552 printf("%s: NVM dump:\n", device_xname(sc->sc_dev));
12553 for (i = 0; i < NVM_SIZE; i++) {
12554 if (wm_nvm_read(sc, i, 1, &eeprom_data))
12555 printf("XXXX ");
12556 else
12557 printf("%04hx ", eeprom_data);
12558 if (i % 8 == 7)
12559 printf("\n");
12560 }
12561 }
12562
12563 #endif /* WM_DEBUG */
12564
12565 for (i = 0; i < NVM_SIZE; i++) {
12566 if (wm_nvm_read(sc, i, 1, &eeprom_data))
12567 return 1;
12568 checksum += eeprom_data;
12569 }
12570
12571 if (checksum != (uint16_t) NVM_CHECKSUM) {
12572 #ifdef WM_DEBUG
12573 printf("%s: NVM checksum mismatch (%04x != %04x)\n",
12574 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM);
12575 #endif
12576 }
12577
12578 return 0;
12579 }
12580
12581 static void
12582 wm_nvm_version_invm(struct wm_softc *sc)
12583 {
12584 uint32_t dword;
12585
12586 /*
12587 * Linux's code to decode version is very strange, so we don't
12588 * obey that algorithm and just use word 61 as the document.
12589 * Perhaps it's not perfect though...
12590 *
12591 * Example:
12592 *
12593 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6)
12594 */
12595 dword = CSR_READ(sc, WM_INVM_DATA_REG(61));
12596 dword = __SHIFTOUT(dword, INVM_VER_1);
12597 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR);
12598 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR);
12599 }
12600
12601 static void
12602 wm_nvm_version(struct wm_softc *sc)
12603 {
12604 uint16_t major, minor, build, patch;
12605 uint16_t uid0, uid1;
12606 uint16_t nvm_data;
12607 uint16_t off;
12608 bool check_version = false;
12609 bool check_optionrom = false;
12610 bool have_build = false;
12611 bool have_uid = true;
12612
12613 /*
12614 * Version format:
12615 *
12616 * XYYZ
12617 * X0YZ
12618 * X0YY
12619 *
12620 * Example:
12621 *
12622 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10)
12623 * 82571 0x50a6 5.10.6?
12624 * 82572 0x506a 5.6.10?
12625 * 82572EI 0x5069 5.6.9?
12626 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4)
12627 * 0x2013 2.1.3?
12628 * 82583 0x10a0 1.10.0? (document says it's default vaule)
12629 */
12630
12631 /*
12632 * XXX
12633 * Qemu's e1000e emulation (82574L)'s SPI has only 64 words.
12634 * I've never seen on real 82574 hardware with such small SPI ROM.
12635 */
12636 if ((sc->sc_nvm_wordsize < NVM_OFF_IMAGE_UID1)
12637 || (wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1) != 0))
12638 have_uid = false;
12639
12640 switch (sc->sc_type) {
12641 case WM_T_82571:
12642 case WM_T_82572:
12643 case WM_T_82574:
12644 case WM_T_82583:
12645 check_version = true;
12646 check_optionrom = true;
12647 have_build = true;
12648 break;
12649 case WM_T_82575:
12650 case WM_T_82576:
12651 case WM_T_82580:
12652 if (have_uid && (uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID)
12653 check_version = true;
12654 break;
12655 case WM_T_I211:
12656 wm_nvm_version_invm(sc);
12657 have_uid = false;
12658 goto printver;
12659 case WM_T_I210:
12660 if (!wm_nvm_flash_presence_i210(sc)) {
12661 wm_nvm_version_invm(sc);
12662 have_uid = false;
12663 goto printver;
12664 }
12665 /* FALLTHROUGH */
12666 case WM_T_I350:
12667 case WM_T_I354:
12668 check_version = true;
12669 check_optionrom = true;
12670 break;
12671 default:
12672 return;
12673 }
12674 if (check_version
12675 && (wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data) == 0)) {
12676 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
12677 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) {
12678 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT;
12679 build = nvm_data & NVM_BUILD_MASK;
12680 have_build = true;
12681 } else
12682 minor = nvm_data & 0x00ff;
12683
12684 /* Decimal */
12685 minor = (minor / 16) * 10 + (minor % 16);
12686 sc->sc_nvm_ver_major = major;
12687 sc->sc_nvm_ver_minor = minor;
12688
12689 printver:
12690 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major,
12691 sc->sc_nvm_ver_minor);
12692 if (have_build) {
12693 sc->sc_nvm_ver_build = build;
12694 aprint_verbose(".%d", build);
12695 }
12696 }
12697
12698 /* Assume the Option ROM area is at avove NVM_SIZE */
12699 if ((sc->sc_nvm_wordsize > NVM_SIZE) && check_optionrom
12700 && (wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off) == 0)) {
12701 /* Option ROM Version */
12702 if ((off != 0x0000) && (off != 0xffff)) {
12703 int rv;
12704
12705 off += NVM_COMBO_VER_OFF;
12706 rv = wm_nvm_read(sc, off + 1, 1, &uid1);
12707 rv |= wm_nvm_read(sc, off, 1, &uid0);
12708 if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff)
12709 && (uid1 != 0) && (uid1 != 0xffff)) {
12710 /* 16bits */
12711 major = uid0 >> 8;
12712 build = (uid0 << 8) | (uid1 >> 8);
12713 patch = uid1 & 0x00ff;
12714 aprint_verbose(", option ROM Version %d.%d.%d",
12715 major, build, patch);
12716 }
12717 }
12718 }
12719
12720 if (have_uid && (wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0) == 0))
12721 aprint_verbose(", Image Unique ID %08x", (uid1 << 16) | uid0);
12722 }
12723
12724 /*
12725 * wm_nvm_read:
12726 *
12727 * Read data from the serial EEPROM.
12728 */
12729 static int
12730 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
12731 {
12732 int rv;
12733
12734 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12735 device_xname(sc->sc_dev), __func__));
12736
12737 if (sc->sc_flags & WM_F_EEPROM_INVALID)
12738 return -1;
12739
12740 rv = sc->nvm.read(sc, word, wordcnt, data);
12741
12742 return rv;
12743 }
12744
12745 /*
12746 * Hardware semaphores.
12747 * Very complexed...
12748 */
12749
12750 static int
12751 wm_get_null(struct wm_softc *sc)
12752 {
12753
12754 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12755 device_xname(sc->sc_dev), __func__));
12756 return 0;
12757 }
12758
12759 static void
12760 wm_put_null(struct wm_softc *sc)
12761 {
12762
12763 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12764 device_xname(sc->sc_dev), __func__));
12765 return;
12766 }
12767
12768 static int
12769 wm_get_eecd(struct wm_softc *sc)
12770 {
12771 uint32_t reg;
12772 int x;
12773
12774 DPRINTF(WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
12775 device_xname(sc->sc_dev), __func__));
12776
12777 reg = CSR_READ(sc, WMREG_EECD);
12778
12779 /* Request EEPROM access. */
12780 reg |= EECD_EE_REQ;
12781 CSR_WRITE(sc, WMREG_EECD, reg);
12782
12783 /* ..and wait for it to be granted. */
12784 for (x = 0; x < 1000; x++) {
12785 reg = CSR_READ(sc, WMREG_EECD);
12786 if (reg & EECD_EE_GNT)
12787 break;
12788 delay(5);
12789 }
12790 if ((reg & EECD_EE_GNT) == 0) {
12791 aprint_error_dev(sc->sc_dev,
12792 "could not acquire EEPROM GNT\n");
12793 reg &= ~EECD_EE_REQ;
12794 CSR_WRITE(sc, WMREG_EECD, reg);
12795 return -1;
12796 }
12797
12798 return 0;
12799 }
12800
12801 static void
12802 wm_nvm_eec_clock_raise(struct wm_softc *sc, uint32_t *eecd)
12803 {
12804
12805 *eecd |= EECD_SK;
12806 CSR_WRITE(sc, WMREG_EECD, *eecd);
12807 CSR_WRITE_FLUSH(sc);
12808 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
12809 delay(1);
12810 else
12811 delay(50);
12812 }
12813
12814 static void
12815 wm_nvm_eec_clock_lower(struct wm_softc *sc, uint32_t *eecd)
12816 {
12817
12818 *eecd &= ~EECD_SK;
12819 CSR_WRITE(sc, WMREG_EECD, *eecd);
12820 CSR_WRITE_FLUSH(sc);
12821 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
12822 delay(1);
12823 else
12824 delay(50);
12825 }
12826
12827 static void
12828 wm_put_eecd(struct wm_softc *sc)
12829 {
12830 uint32_t reg;
12831
12832 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12833 device_xname(sc->sc_dev), __func__));
12834
12835 /* Stop nvm */
12836 reg = CSR_READ(sc, WMREG_EECD);
12837 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) {
12838 /* Pull CS high */
12839 reg |= EECD_CS;
12840 wm_nvm_eec_clock_lower(sc, ®);
12841 } else {
12842 /* CS on Microwire is active-high */
12843 reg &= ~(EECD_CS | EECD_DI);
12844 CSR_WRITE(sc, WMREG_EECD, reg);
12845 wm_nvm_eec_clock_raise(sc, ®);
12846 wm_nvm_eec_clock_lower(sc, ®);
12847 }
12848
12849 reg = CSR_READ(sc, WMREG_EECD);
12850 reg &= ~EECD_EE_REQ;
12851 CSR_WRITE(sc, WMREG_EECD, reg);
12852
12853 return;
12854 }
12855
12856 /*
12857 * Get hardware semaphore.
12858 * Same as e1000_get_hw_semaphore_generic()
12859 */
12860 static int
12861 wm_get_swsm_semaphore(struct wm_softc *sc)
12862 {
12863 int32_t timeout;
12864 uint32_t swsm;
12865
12866 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12867 device_xname(sc->sc_dev), __func__));
12868 KASSERT(sc->sc_nvm_wordsize > 0);
12869
12870 retry:
12871 /* Get the SW semaphore. */
12872 timeout = sc->sc_nvm_wordsize + 1;
12873 while (timeout) {
12874 swsm = CSR_READ(sc, WMREG_SWSM);
12875
12876 if ((swsm & SWSM_SMBI) == 0)
12877 break;
12878
12879 delay(50);
12880 timeout--;
12881 }
12882
12883 if (timeout == 0) {
12884 if ((sc->sc_flags & WM_F_WA_I210_CLSEM) != 0) {
12885 /*
12886 * In rare circumstances, the SW semaphore may already
12887 * be held unintentionally. Clear the semaphore once
12888 * before giving up.
12889 */
12890 sc->sc_flags &= ~WM_F_WA_I210_CLSEM;
12891 wm_put_swsm_semaphore(sc);
12892 goto retry;
12893 }
12894 aprint_error_dev(sc->sc_dev,
12895 "could not acquire SWSM SMBI\n");
12896 return 1;
12897 }
12898
12899 /* Get the FW semaphore. */
12900 timeout = sc->sc_nvm_wordsize + 1;
12901 while (timeout) {
12902 swsm = CSR_READ(sc, WMREG_SWSM);
12903 swsm |= SWSM_SWESMBI;
12904 CSR_WRITE(sc, WMREG_SWSM, swsm);
12905 /* If we managed to set the bit we got the semaphore. */
12906 swsm = CSR_READ(sc, WMREG_SWSM);
12907 if (swsm & SWSM_SWESMBI)
12908 break;
12909
12910 delay(50);
12911 timeout--;
12912 }
12913
12914 if (timeout == 0) {
12915 aprint_error_dev(sc->sc_dev,
12916 "could not acquire SWSM SWESMBI\n");
12917 /* Release semaphores */
12918 wm_put_swsm_semaphore(sc);
12919 return 1;
12920 }
12921 return 0;
12922 }
12923
12924 /*
12925 * Put hardware semaphore.
12926 * Same as e1000_put_hw_semaphore_generic()
12927 */
12928 static void
12929 wm_put_swsm_semaphore(struct wm_softc *sc)
12930 {
12931 uint32_t swsm;
12932
12933 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12934 device_xname(sc->sc_dev), __func__));
12935
12936 swsm = CSR_READ(sc, WMREG_SWSM);
12937 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI);
12938 CSR_WRITE(sc, WMREG_SWSM, swsm);
12939 }
12940
12941 /*
12942 * Get SW/FW semaphore.
12943 * Same as e1000_acquire_swfw_sync_{80003es2lan,82575}().
12944 */
12945 static int
12946 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
12947 {
12948 uint32_t swfw_sync;
12949 uint32_t swmask = mask << SWFW_SOFT_SHIFT;
12950 uint32_t fwmask = mask << SWFW_FIRM_SHIFT;
12951 int timeout;
12952
12953 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12954 device_xname(sc->sc_dev), __func__));
12955
12956 if (sc->sc_type == WM_T_80003)
12957 timeout = 50;
12958 else
12959 timeout = 200;
12960
12961 for (timeout = 0; timeout < 200; timeout++) {
12962 if (wm_get_swsm_semaphore(sc)) {
12963 aprint_error_dev(sc->sc_dev,
12964 "%s: failed to get semaphore\n",
12965 __func__);
12966 return 1;
12967 }
12968 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
12969 if ((swfw_sync & (swmask | fwmask)) == 0) {
12970 swfw_sync |= swmask;
12971 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
12972 wm_put_swsm_semaphore(sc);
12973 return 0;
12974 }
12975 wm_put_swsm_semaphore(sc);
12976 delay(5000);
12977 }
12978 printf("%s: failed to get swfw semaphore mask 0x%x swfw 0x%x\n",
12979 device_xname(sc->sc_dev), mask, swfw_sync);
12980 return 1;
12981 }
12982
12983 static void
12984 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
12985 {
12986 uint32_t swfw_sync;
12987
12988 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12989 device_xname(sc->sc_dev), __func__));
12990
12991 while (wm_get_swsm_semaphore(sc) != 0)
12992 continue;
12993
12994 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
12995 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT);
12996 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
12997
12998 wm_put_swsm_semaphore(sc);
12999 }
13000
13001 static int
13002 wm_get_nvm_80003(struct wm_softc *sc)
13003 {
13004 int rv;
13005
13006 DPRINTF(WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
13007 device_xname(sc->sc_dev), __func__));
13008
13009 if ((rv = wm_get_swfw_semaphore(sc, SWFW_EEP_SM)) != 0) {
13010 aprint_error_dev(sc->sc_dev,
13011 "%s: failed to get semaphore(SWFW)\n",
13012 __func__);
13013 return rv;
13014 }
13015
13016 if (((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13017 && (rv = wm_get_eecd(sc)) != 0) {
13018 aprint_error_dev(sc->sc_dev,
13019 "%s: failed to get semaphore(EECD)\n",
13020 __func__);
13021 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
13022 return rv;
13023 }
13024
13025 return 0;
13026 }
13027
13028 static void
13029 wm_put_nvm_80003(struct wm_softc *sc)
13030 {
13031
13032 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13033 device_xname(sc->sc_dev), __func__));
13034
13035 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13036 wm_put_eecd(sc);
13037 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
13038 }
13039
13040 static int
13041 wm_get_nvm_82571(struct wm_softc *sc)
13042 {
13043 int rv;
13044
13045 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13046 device_xname(sc->sc_dev), __func__));
13047
13048 if ((rv = wm_get_swsm_semaphore(sc)) != 0)
13049 return rv;
13050
13051 switch (sc->sc_type) {
13052 case WM_T_82573:
13053 break;
13054 default:
13055 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13056 rv = wm_get_eecd(sc);
13057 break;
13058 }
13059
13060 if (rv != 0) {
13061 aprint_error_dev(sc->sc_dev,
13062 "%s: failed to get semaphore\n",
13063 __func__);
13064 wm_put_swsm_semaphore(sc);
13065 }
13066
13067 return rv;
13068 }
13069
13070 static void
13071 wm_put_nvm_82571(struct wm_softc *sc)
13072 {
13073
13074 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13075 device_xname(sc->sc_dev), __func__));
13076
13077 switch (sc->sc_type) {
13078 case WM_T_82573:
13079 break;
13080 default:
13081 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13082 wm_put_eecd(sc);
13083 break;
13084 }
13085
13086 wm_put_swsm_semaphore(sc);
13087 }
13088
13089 static int
13090 wm_get_phy_82575(struct wm_softc *sc)
13091 {
13092
13093 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13094 device_xname(sc->sc_dev), __func__));
13095 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
13096 }
13097
13098 static void
13099 wm_put_phy_82575(struct wm_softc *sc)
13100 {
13101
13102 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13103 device_xname(sc->sc_dev), __func__));
13104 return wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
13105 }
13106
13107 static int
13108 wm_get_swfwhw_semaphore(struct wm_softc *sc)
13109 {
13110 uint32_t ext_ctrl;
13111 int timeout = 200;
13112
13113 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13114 device_xname(sc->sc_dev), __func__));
13115
13116 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
13117 for (timeout = 0; timeout < 200; timeout++) {
13118 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13119 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
13120 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13121
13122 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13123 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
13124 return 0;
13125 delay(5000);
13126 }
13127 printf("%s: failed to get swfwhw semaphore ext_ctrl 0x%x\n",
13128 device_xname(sc->sc_dev), ext_ctrl);
13129 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
13130 return 1;
13131 }
13132
13133 static void
13134 wm_put_swfwhw_semaphore(struct wm_softc *sc)
13135 {
13136 uint32_t ext_ctrl;
13137
13138 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13139 device_xname(sc->sc_dev), __func__));
13140
13141 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13142 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13143 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13144
13145 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
13146 }
13147
13148 static int
13149 wm_get_swflag_ich8lan(struct wm_softc *sc)
13150 {
13151 uint32_t ext_ctrl;
13152 int timeout;
13153
13154 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13155 device_xname(sc->sc_dev), __func__));
13156 mutex_enter(sc->sc_ich_phymtx);
13157 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) {
13158 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13159 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0)
13160 break;
13161 delay(1000);
13162 }
13163 if (timeout >= WM_PHY_CFG_TIMEOUT) {
13164 printf("%s: SW has already locked the resource\n",
13165 device_xname(sc->sc_dev));
13166 goto out;
13167 }
13168
13169 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
13170 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13171 for (timeout = 0; timeout < 1000; timeout++) {
13172 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13173 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
13174 break;
13175 delay(1000);
13176 }
13177 if (timeout >= 1000) {
13178 printf("%s: failed to acquire semaphore\n",
13179 device_xname(sc->sc_dev));
13180 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13181 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13182 goto out;
13183 }
13184 return 0;
13185
13186 out:
13187 mutex_exit(sc->sc_ich_phymtx);
13188 return 1;
13189 }
13190
13191 static void
13192 wm_put_swflag_ich8lan(struct wm_softc *sc)
13193 {
13194 uint32_t ext_ctrl;
13195
13196 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13197 device_xname(sc->sc_dev), __func__));
13198 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13199 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) {
13200 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13201 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13202 } else {
13203 printf("%s: Semaphore unexpectedly released\n",
13204 device_xname(sc->sc_dev));
13205 }
13206
13207 mutex_exit(sc->sc_ich_phymtx);
13208 }
13209
13210 static int
13211 wm_get_nvm_ich8lan(struct wm_softc *sc)
13212 {
13213
13214 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13215 device_xname(sc->sc_dev), __func__));
13216 mutex_enter(sc->sc_ich_nvmmtx);
13217
13218 return 0;
13219 }
13220
13221 static void
13222 wm_put_nvm_ich8lan(struct wm_softc *sc)
13223 {
13224
13225 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13226 device_xname(sc->sc_dev), __func__));
13227 mutex_exit(sc->sc_ich_nvmmtx);
13228 }
13229
13230 static int
13231 wm_get_hw_semaphore_82573(struct wm_softc *sc)
13232 {
13233 int i = 0;
13234 uint32_t reg;
13235
13236 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13237 device_xname(sc->sc_dev), __func__));
13238
13239 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13240 do {
13241 CSR_WRITE(sc, WMREG_EXTCNFCTR,
13242 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP);
13243 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13244 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0)
13245 break;
13246 delay(2*1000);
13247 i++;
13248 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT);
13249
13250 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) {
13251 wm_put_hw_semaphore_82573(sc);
13252 log(LOG_ERR, "%s: Driver can't access the PHY\n",
13253 device_xname(sc->sc_dev));
13254 return -1;
13255 }
13256
13257 return 0;
13258 }
13259
13260 static void
13261 wm_put_hw_semaphore_82573(struct wm_softc *sc)
13262 {
13263 uint32_t reg;
13264
13265 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13266 device_xname(sc->sc_dev), __func__));
13267
13268 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13269 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13270 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
13271 }
13272
13273 /*
13274 * Management mode and power management related subroutines.
13275 * BMC, AMT, suspend/resume and EEE.
13276 */
13277
13278 #ifdef WM_WOL
13279 static int
13280 wm_check_mng_mode(struct wm_softc *sc)
13281 {
13282 int rv;
13283
13284 switch (sc->sc_type) {
13285 case WM_T_ICH8:
13286 case WM_T_ICH9:
13287 case WM_T_ICH10:
13288 case WM_T_PCH:
13289 case WM_T_PCH2:
13290 case WM_T_PCH_LPT:
13291 case WM_T_PCH_SPT:
13292 rv = wm_check_mng_mode_ich8lan(sc);
13293 break;
13294 case WM_T_82574:
13295 case WM_T_82583:
13296 rv = wm_check_mng_mode_82574(sc);
13297 break;
13298 case WM_T_82571:
13299 case WM_T_82572:
13300 case WM_T_82573:
13301 case WM_T_80003:
13302 rv = wm_check_mng_mode_generic(sc);
13303 break;
13304 default:
13305 /* noting to do */
13306 rv = 0;
13307 break;
13308 }
13309
13310 return rv;
13311 }
13312
13313 static int
13314 wm_check_mng_mode_ich8lan(struct wm_softc *sc)
13315 {
13316 uint32_t fwsm;
13317
13318 fwsm = CSR_READ(sc, WMREG_FWSM);
13319
13320 if (((fwsm & FWSM_FW_VALID) != 0)
13321 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
13322 return 1;
13323
13324 return 0;
13325 }
13326
13327 static int
13328 wm_check_mng_mode_82574(struct wm_softc *sc)
13329 {
13330 uint16_t data;
13331
13332 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
13333
13334 if ((data & NVM_CFG2_MNGM_MASK) != 0)
13335 return 1;
13336
13337 return 0;
13338 }
13339
13340 static int
13341 wm_check_mng_mode_generic(struct wm_softc *sc)
13342 {
13343 uint32_t fwsm;
13344
13345 fwsm = CSR_READ(sc, WMREG_FWSM);
13346
13347 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE)
13348 return 1;
13349
13350 return 0;
13351 }
13352 #endif /* WM_WOL */
13353
13354 static int
13355 wm_enable_mng_pass_thru(struct wm_softc *sc)
13356 {
13357 uint32_t manc, fwsm, factps;
13358
13359 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0)
13360 return 0;
13361
13362 manc = CSR_READ(sc, WMREG_MANC);
13363
13364 DPRINTF(WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n",
13365 device_xname(sc->sc_dev), manc));
13366 if ((manc & MANC_RECV_TCO_EN) == 0)
13367 return 0;
13368
13369 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) {
13370 fwsm = CSR_READ(sc, WMREG_FWSM);
13371 factps = CSR_READ(sc, WMREG_FACTPS);
13372 if (((factps & FACTPS_MNGCG) == 0)
13373 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
13374 return 1;
13375 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
13376 uint16_t data;
13377
13378 factps = CSR_READ(sc, WMREG_FACTPS);
13379 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
13380 DPRINTF(WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n",
13381 device_xname(sc->sc_dev), factps, data));
13382 if (((factps & FACTPS_MNGCG) == 0)
13383 && ((data & NVM_CFG2_MNGM_MASK)
13384 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT)))
13385 return 1;
13386 } else if (((manc & MANC_SMBUS_EN) != 0)
13387 && ((manc & MANC_ASF_EN) == 0))
13388 return 1;
13389
13390 return 0;
13391 }
13392
13393 static bool
13394 wm_phy_resetisblocked(struct wm_softc *sc)
13395 {
13396 bool blocked = false;
13397 uint32_t reg;
13398 int i = 0;
13399
13400 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13401 device_xname(sc->sc_dev), __func__));
13402
13403 switch (sc->sc_type) {
13404 case WM_T_ICH8:
13405 case WM_T_ICH9:
13406 case WM_T_ICH10:
13407 case WM_T_PCH:
13408 case WM_T_PCH2:
13409 case WM_T_PCH_LPT:
13410 case WM_T_PCH_SPT:
13411 do {
13412 reg = CSR_READ(sc, WMREG_FWSM);
13413 if ((reg & FWSM_RSPCIPHY) == 0) {
13414 blocked = true;
13415 delay(10*1000);
13416 continue;
13417 }
13418 blocked = false;
13419 } while (blocked && (i++ < 30));
13420 return blocked;
13421 break;
13422 case WM_T_82571:
13423 case WM_T_82572:
13424 case WM_T_82573:
13425 case WM_T_82574:
13426 case WM_T_82583:
13427 case WM_T_80003:
13428 reg = CSR_READ(sc, WMREG_MANC);
13429 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0)
13430 return true;
13431 else
13432 return false;
13433 break;
13434 default:
13435 /* no problem */
13436 break;
13437 }
13438
13439 return false;
13440 }
13441
13442 static void
13443 wm_get_hw_control(struct wm_softc *sc)
13444 {
13445 uint32_t reg;
13446
13447 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13448 device_xname(sc->sc_dev), __func__));
13449
13450 if (sc->sc_type == WM_T_82573) {
13451 reg = CSR_READ(sc, WMREG_SWSM);
13452 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD);
13453 } else if (sc->sc_type >= WM_T_82571) {
13454 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13455 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
13456 }
13457 }
13458
13459 static void
13460 wm_release_hw_control(struct wm_softc *sc)
13461 {
13462 uint32_t reg;
13463
13464 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13465 device_xname(sc->sc_dev), __func__));
13466
13467 if (sc->sc_type == WM_T_82573) {
13468 reg = CSR_READ(sc, WMREG_SWSM);
13469 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD);
13470 } else if (sc->sc_type >= WM_T_82571) {
13471 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13472 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD);
13473 }
13474 }
13475
13476 static void
13477 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate)
13478 {
13479 uint32_t reg;
13480
13481 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13482 device_xname(sc->sc_dev), __func__));
13483
13484 if (sc->sc_type < WM_T_PCH2)
13485 return;
13486
13487 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13488
13489 if (gate)
13490 reg |= EXTCNFCTR_GATE_PHY_CFG;
13491 else
13492 reg &= ~EXTCNFCTR_GATE_PHY_CFG;
13493
13494 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
13495 }
13496
13497 static void
13498 wm_smbustopci(struct wm_softc *sc)
13499 {
13500 uint32_t fwsm, reg;
13501 int rv = 0;
13502
13503 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13504 device_xname(sc->sc_dev), __func__));
13505
13506 /* Gate automatic PHY configuration by hardware on non-managed 82579 */
13507 wm_gate_hw_phy_config_ich8lan(sc, true);
13508
13509 /* Disable ULP */
13510 wm_ulp_disable(sc);
13511
13512 /* Acquire PHY semaphore */
13513 sc->phy.acquire(sc);
13514
13515 fwsm = CSR_READ(sc, WMREG_FWSM);
13516 switch (sc->sc_type) {
13517 case WM_T_PCH_LPT:
13518 case WM_T_PCH_SPT:
13519 if (wm_phy_is_accessible_pchlan(sc))
13520 break;
13521
13522 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13523 reg |= CTRL_EXT_FORCE_SMBUS;
13524 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13525 #if 0
13526 /* XXX Isn't this required??? */
13527 CSR_WRITE_FLUSH(sc);
13528 #endif
13529 delay(50 * 1000);
13530 /* FALLTHROUGH */
13531 case WM_T_PCH2:
13532 if (wm_phy_is_accessible_pchlan(sc) == true)
13533 break;
13534 /* FALLTHROUGH */
13535 case WM_T_PCH:
13536 if (sc->sc_type == WM_T_PCH)
13537 if ((fwsm & FWSM_FW_VALID) != 0)
13538 break;
13539
13540 if (wm_phy_resetisblocked(sc) == true) {
13541 printf("XXX reset is blocked(3)\n");
13542 break;
13543 }
13544
13545 wm_toggle_lanphypc_pch_lpt(sc);
13546
13547 if (sc->sc_type >= WM_T_PCH_LPT) {
13548 if (wm_phy_is_accessible_pchlan(sc) == true)
13549 break;
13550
13551 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13552 reg &= ~CTRL_EXT_FORCE_SMBUS;
13553 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13554
13555 if (wm_phy_is_accessible_pchlan(sc) == true)
13556 break;
13557 rv = -1;
13558 }
13559 break;
13560 default:
13561 break;
13562 }
13563
13564 /* Release semaphore */
13565 sc->phy.release(sc);
13566
13567 if (rv == 0) {
13568 if (wm_phy_resetisblocked(sc)) {
13569 printf("XXX reset is blocked(4)\n");
13570 goto out;
13571 }
13572 wm_reset_phy(sc);
13573 if (wm_phy_resetisblocked(sc))
13574 printf("XXX reset is blocked(4)\n");
13575 }
13576
13577 out:
13578 /*
13579 * Ungate automatic PHY configuration by hardware on non-managed 82579
13580 */
13581 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) {
13582 delay(10*1000);
13583 wm_gate_hw_phy_config_ich8lan(sc, false);
13584 }
13585 }
13586
13587 static void
13588 wm_init_manageability(struct wm_softc *sc)
13589 {
13590
13591 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13592 device_xname(sc->sc_dev), __func__));
13593 if (sc->sc_flags & WM_F_HAS_MANAGE) {
13594 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H);
13595 uint32_t manc = CSR_READ(sc, WMREG_MANC);
13596
13597 /* Disable hardware interception of ARP */
13598 manc &= ~MANC_ARP_EN;
13599
13600 /* Enable receiving management packets to the host */
13601 if (sc->sc_type >= WM_T_82571) {
13602 manc |= MANC_EN_MNG2HOST;
13603 manc2h |= MANC2H_PORT_623| MANC2H_PORT_624;
13604 CSR_WRITE(sc, WMREG_MANC2H, manc2h);
13605 }
13606
13607 CSR_WRITE(sc, WMREG_MANC, manc);
13608 }
13609 }
13610
13611 static void
13612 wm_release_manageability(struct wm_softc *sc)
13613 {
13614
13615 if (sc->sc_flags & WM_F_HAS_MANAGE) {
13616 uint32_t manc = CSR_READ(sc, WMREG_MANC);
13617
13618 manc |= MANC_ARP_EN;
13619 if (sc->sc_type >= WM_T_82571)
13620 manc &= ~MANC_EN_MNG2HOST;
13621
13622 CSR_WRITE(sc, WMREG_MANC, manc);
13623 }
13624 }
13625
13626 static void
13627 wm_get_wakeup(struct wm_softc *sc)
13628 {
13629
13630 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */
13631 switch (sc->sc_type) {
13632 case WM_T_82573:
13633 case WM_T_82583:
13634 sc->sc_flags |= WM_F_HAS_AMT;
13635 /* FALLTHROUGH */
13636 case WM_T_80003:
13637 case WM_T_82575:
13638 case WM_T_82576:
13639 case WM_T_82580:
13640 case WM_T_I350:
13641 case WM_T_I354:
13642 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0)
13643 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID;
13644 /* FALLTHROUGH */
13645 case WM_T_82541:
13646 case WM_T_82541_2:
13647 case WM_T_82547:
13648 case WM_T_82547_2:
13649 case WM_T_82571:
13650 case WM_T_82572:
13651 case WM_T_82574:
13652 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
13653 break;
13654 case WM_T_ICH8:
13655 case WM_T_ICH9:
13656 case WM_T_ICH10:
13657 case WM_T_PCH:
13658 case WM_T_PCH2:
13659 case WM_T_PCH_LPT:
13660 case WM_T_PCH_SPT:
13661 sc->sc_flags |= WM_F_HAS_AMT;
13662 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
13663 break;
13664 default:
13665 break;
13666 }
13667
13668 /* 1: HAS_MANAGE */
13669 if (wm_enable_mng_pass_thru(sc) != 0)
13670 sc->sc_flags |= WM_F_HAS_MANAGE;
13671
13672 /*
13673 * Note that the WOL flags is set after the resetting of the eeprom
13674 * stuff
13675 */
13676 }
13677
13678 /*
13679 * Unconfigure Ultra Low Power mode.
13680 * Only for I217 and newer (see below).
13681 */
13682 static void
13683 wm_ulp_disable(struct wm_softc *sc)
13684 {
13685 uint32_t reg;
13686 int i = 0;
13687
13688 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13689 device_xname(sc->sc_dev), __func__));
13690 /* Exclude old devices */
13691 if ((sc->sc_type < WM_T_PCH_LPT)
13692 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM)
13693 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V)
13694 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2)
13695 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2))
13696 return;
13697
13698 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) {
13699 /* Request ME un-configure ULP mode in the PHY */
13700 reg = CSR_READ(sc, WMREG_H2ME);
13701 reg &= ~H2ME_ULP;
13702 reg |= H2ME_ENFORCE_SETTINGS;
13703 CSR_WRITE(sc, WMREG_H2ME, reg);
13704
13705 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */
13706 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) {
13707 if (i++ == 30) {
13708 printf("%s timed out\n", __func__);
13709 return;
13710 }
13711 delay(10 * 1000);
13712 }
13713 reg = CSR_READ(sc, WMREG_H2ME);
13714 reg &= ~H2ME_ENFORCE_SETTINGS;
13715 CSR_WRITE(sc, WMREG_H2ME, reg);
13716
13717 return;
13718 }
13719
13720 /* Acquire semaphore */
13721 sc->phy.acquire(sc);
13722
13723 /* Toggle LANPHYPC */
13724 wm_toggle_lanphypc_pch_lpt(sc);
13725
13726 /* Unforce SMBus mode in PHY */
13727 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL);
13728 if (reg == 0x0000 || reg == 0xffff) {
13729 uint32_t reg2;
13730
13731 printf("%s: Force SMBus first.\n", __func__);
13732 reg2 = CSR_READ(sc, WMREG_CTRL_EXT);
13733 reg2 |= CTRL_EXT_FORCE_SMBUS;
13734 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2);
13735 delay(50 * 1000);
13736
13737 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL);
13738 }
13739 reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
13740 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, reg);
13741
13742 /* Unforce SMBus mode in MAC */
13743 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13744 reg &= ~CTRL_EXT_FORCE_SMBUS;
13745 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13746
13747 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL);
13748 reg |= HV_PM_CTRL_K1_ENA;
13749 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, reg);
13750
13751 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1);
13752 reg &= ~(I218_ULP_CONFIG1_IND
13753 | I218_ULP_CONFIG1_STICKY_ULP
13754 | I218_ULP_CONFIG1_RESET_TO_SMBUS
13755 | I218_ULP_CONFIG1_WOL_HOST
13756 | I218_ULP_CONFIG1_INBAND_EXIT
13757 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC
13758 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST
13759 | I218_ULP_CONFIG1_DIS_SMB_PERST);
13760 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, reg);
13761 reg |= I218_ULP_CONFIG1_START;
13762 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, reg);
13763
13764 reg = CSR_READ(sc, WMREG_FEXTNVM7);
13765 reg &= ~FEXTNVM7_DIS_SMB_PERST;
13766 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
13767
13768 /* Release semaphore */
13769 sc->phy.release(sc);
13770 wm_gmii_reset(sc);
13771 delay(50 * 1000);
13772 }
13773
13774 /* WOL in the newer chipset interfaces (pchlan) */
13775 static void
13776 wm_enable_phy_wakeup(struct wm_softc *sc)
13777 {
13778 #if 0
13779 uint16_t preg;
13780
13781 /* Copy MAC RARs to PHY RARs */
13782
13783 /* Copy MAC MTA to PHY MTA */
13784
13785 /* Configure PHY Rx Control register */
13786
13787 /* Enable PHY wakeup in MAC register */
13788
13789 /* Configure and enable PHY wakeup in PHY registers */
13790
13791 /* Activate PHY wakeup */
13792
13793 /* XXX */
13794 #endif
13795 }
13796
13797 /* Power down workaround on D3 */
13798 static void
13799 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc)
13800 {
13801 uint32_t reg;
13802 int i;
13803
13804 for (i = 0; i < 2; i++) {
13805 /* Disable link */
13806 reg = CSR_READ(sc, WMREG_PHY_CTRL);
13807 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
13808 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
13809
13810 /*
13811 * Call gig speed drop workaround on Gig disable before
13812 * accessing any PHY registers
13813 */
13814 if (sc->sc_type == WM_T_ICH8)
13815 wm_gig_downshift_workaround_ich8lan(sc);
13816
13817 /* Write VR power-down enable */
13818 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
13819 reg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
13820 reg |= IGP3_VR_CTRL_MODE_SHUTDOWN;
13821 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, reg);
13822
13823 /* Read it back and test */
13824 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
13825 reg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
13826 if ((reg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0))
13827 break;
13828
13829 /* Issue PHY reset and repeat at most one more time */
13830 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
13831 }
13832 }
13833
13834 static void
13835 wm_enable_wakeup(struct wm_softc *sc)
13836 {
13837 uint32_t reg, pmreg;
13838 pcireg_t pmode;
13839
13840 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13841 device_xname(sc->sc_dev), __func__));
13842
13843 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
13844 &pmreg, NULL) == 0)
13845 return;
13846
13847 /* Advertise the wakeup capability */
13848 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2)
13849 | CTRL_SWDPIN(3));
13850 CSR_WRITE(sc, WMREG_WUC, WUC_APME);
13851
13852 /* ICH workaround */
13853 switch (sc->sc_type) {
13854 case WM_T_ICH8:
13855 case WM_T_ICH9:
13856 case WM_T_ICH10:
13857 case WM_T_PCH:
13858 case WM_T_PCH2:
13859 case WM_T_PCH_LPT:
13860 case WM_T_PCH_SPT:
13861 /* Disable gig during WOL */
13862 reg = CSR_READ(sc, WMREG_PHY_CTRL);
13863 reg |= PHY_CTRL_D0A_LPLU | PHY_CTRL_GBE_DIS;
13864 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
13865 if (sc->sc_type == WM_T_PCH)
13866 wm_gmii_reset(sc);
13867
13868 /* Power down workaround */
13869 if (sc->sc_phytype == WMPHY_82577) {
13870 struct mii_softc *child;
13871
13872 /* Assume that the PHY is copper */
13873 child = LIST_FIRST(&sc->sc_mii.mii_phys);
13874 if ((child != NULL) && (child->mii_mpd_rev <= 2))
13875 sc->sc_mii.mii_writereg(sc->sc_dev, 1,
13876 (768 << 5) | 25, 0x0444); /* magic num */
13877 }
13878 break;
13879 default:
13880 break;
13881 }
13882
13883 /* Keep the laser running on fiber adapters */
13884 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
13885 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
13886 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13887 reg |= CTRL_EXT_SWDPIN(3);
13888 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13889 }
13890
13891 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG;
13892 #if 0 /* for the multicast packet */
13893 reg |= WUFC_MC;
13894 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE);
13895 #endif
13896
13897 if (sc->sc_type >= WM_T_PCH)
13898 wm_enable_phy_wakeup(sc);
13899 else {
13900 CSR_WRITE(sc, WMREG_WUC, CSR_READ(sc, WMREG_WUC) | WUC_PME_EN);
13901 CSR_WRITE(sc, WMREG_WUFC, reg);
13902 }
13903
13904 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
13905 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
13906 || (sc->sc_type == WM_T_PCH2))
13907 && (sc->sc_phytype == WMPHY_IGP_3))
13908 wm_igp3_phy_powerdown_workaround_ich8lan(sc);
13909
13910 /* Request PME */
13911 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR);
13912 #if 0
13913 /* Disable WOL */
13914 pmode &= ~(PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN);
13915 #else
13916 /* For WOL */
13917 pmode |= PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN;
13918 #endif
13919 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode);
13920 }
13921
13922 /* Disable ASPM L0s and/or L1 for workaround */
13923 static void
13924 wm_disable_aspm(struct wm_softc *sc)
13925 {
13926 pcireg_t reg, mask = 0;
13927 unsigned const char *str = "";
13928
13929 /*
13930 * Only for PCIe device which has PCIe capability in the PCI config
13931 * space.
13932 */
13933 if (((sc->sc_flags & WM_F_PCIE) == 0) || (sc->sc_pcixe_capoff == 0))
13934 return;
13935
13936 switch (sc->sc_type) {
13937 case WM_T_82571:
13938 case WM_T_82572:
13939 /*
13940 * 8257[12] Errata 13: Device Does Not Support PCIe Active
13941 * State Power management L1 State (ASPM L1).
13942 */
13943 mask = PCIE_LCSR_ASPM_L1;
13944 str = "L1 is";
13945 break;
13946 case WM_T_82573:
13947 case WM_T_82574:
13948 case WM_T_82583:
13949 /*
13950 * The 82573 disappears when PCIe ASPM L0s is enabled.
13951 *
13952 * The 82574 and 82583 does not support PCIe ASPM L0s with
13953 * some chipset. The document of 82574 and 82583 says that
13954 * disabling L0s with some specific chipset is sufficient,
13955 * but we follow as of the Intel em driver does.
13956 *
13957 * References:
13958 * Errata 8 of the Specification Update of i82573.
13959 * Errata 20 of the Specification Update of i82574.
13960 * Errata 9 of the Specification Update of i82583.
13961 */
13962 mask = PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S;
13963 str = "L0s and L1 are";
13964 break;
13965 default:
13966 return;
13967 }
13968
13969 reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
13970 sc->sc_pcixe_capoff + PCIE_LCSR);
13971 reg &= ~mask;
13972 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
13973 sc->sc_pcixe_capoff + PCIE_LCSR, reg);
13974
13975 /* Print only in wm_attach() */
13976 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
13977 aprint_verbose_dev(sc->sc_dev,
13978 "ASPM %s disabled to workaround the errata.\n",
13979 str);
13980 }
13981
13982 /* LPLU */
13983
13984 static void
13985 wm_lplu_d0_disable(struct wm_softc *sc)
13986 {
13987 struct mii_data *mii = &sc->sc_mii;
13988 uint32_t reg;
13989
13990 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13991 device_xname(sc->sc_dev), __func__));
13992
13993 if (sc->sc_phytype == WMPHY_IFE)
13994 return;
13995
13996 switch (sc->sc_type) {
13997 case WM_T_82571:
13998 case WM_T_82572:
13999 case WM_T_82573:
14000 case WM_T_82575:
14001 case WM_T_82576:
14002 reg = mii->mii_readreg(sc->sc_dev, 1, MII_IGPHY_POWER_MGMT);
14003 reg &= ~PMR_D0_LPLU;
14004 mii->mii_writereg(sc->sc_dev, 1, MII_IGPHY_POWER_MGMT, reg);
14005 break;
14006 case WM_T_82580:
14007 case WM_T_I350:
14008 case WM_T_I210:
14009 case WM_T_I211:
14010 reg = CSR_READ(sc, WMREG_PHPM);
14011 reg &= ~PHPM_D0A_LPLU;
14012 CSR_WRITE(sc, WMREG_PHPM, reg);
14013 break;
14014 case WM_T_82574:
14015 case WM_T_82583:
14016 case WM_T_ICH8:
14017 case WM_T_ICH9:
14018 case WM_T_ICH10:
14019 reg = CSR_READ(sc, WMREG_PHY_CTRL);
14020 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU);
14021 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
14022 CSR_WRITE_FLUSH(sc);
14023 break;
14024 case WM_T_PCH:
14025 case WM_T_PCH2:
14026 case WM_T_PCH_LPT:
14027 case WM_T_PCH_SPT:
14028 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS);
14029 reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
14030 if (wm_phy_resetisblocked(sc) == false)
14031 reg |= HV_OEM_BITS_ANEGNOW;
14032 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, reg);
14033 break;
14034 default:
14035 break;
14036 }
14037 }
14038
14039 /* EEE */
14040
14041 static void
14042 wm_set_eee_i350(struct wm_softc *sc)
14043 {
14044 uint32_t ipcnfg, eeer;
14045
14046 ipcnfg = CSR_READ(sc, WMREG_IPCNFG);
14047 eeer = CSR_READ(sc, WMREG_EEER);
14048
14049 if ((sc->sc_flags & WM_F_EEE) != 0) {
14050 ipcnfg |= (IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
14051 eeer |= (EEER_TX_LPI_EN | EEER_RX_LPI_EN
14052 | EEER_LPI_FC);
14053 } else {
14054 ipcnfg &= ~(IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
14055 ipcnfg &= ~IPCNFG_10BASE_TE;
14056 eeer &= ~(EEER_TX_LPI_EN | EEER_RX_LPI_EN
14057 | EEER_LPI_FC);
14058 }
14059
14060 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg);
14061 CSR_WRITE(sc, WMREG_EEER, eeer);
14062 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */
14063 CSR_READ(sc, WMREG_EEER); /* XXX flush? */
14064 }
14065
14066 /*
14067 * Workarounds (mainly PHY related).
14068 * Basically, PHY's workarounds are in the PHY drivers.
14069 */
14070
14071 /* Work-around for 82566 Kumeran PCS lock loss */
14072 static void
14073 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc)
14074 {
14075 struct mii_data *mii = &sc->sc_mii;
14076 uint32_t status = CSR_READ(sc, WMREG_STATUS);
14077 int i;
14078 int reg;
14079
14080 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14081 device_xname(sc->sc_dev), __func__));
14082
14083 /* If the link is not up, do nothing */
14084 if ((status & STATUS_LU) == 0)
14085 return;
14086
14087 /* Nothing to do if the link is other than 1Gbps */
14088 if (__SHIFTOUT(status, STATUS_SPEED) != STATUS_SPEED_1000)
14089 return;
14090
14091 reg = CSR_READ(sc, WMREG_PHY_CTRL);
14092 for (i = 0; i < 10; i++) {
14093 /* read twice */
14094 reg = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
14095 reg = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
14096 if ((reg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0)
14097 goto out; /* GOOD! */
14098
14099 /* Reset the PHY */
14100 wm_reset_phy(sc);
14101 delay(5*1000);
14102 }
14103
14104 /* Disable GigE link negotiation */
14105 reg = CSR_READ(sc, WMREG_PHY_CTRL);
14106 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
14107 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
14108
14109 /*
14110 * Call gig speed drop workaround on Gig disable before accessing
14111 * any PHY registers.
14112 */
14113 wm_gig_downshift_workaround_ich8lan(sc);
14114
14115 out:
14116 return;
14117 }
14118
14119 /* WOL from S5 stops working */
14120 static void
14121 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc)
14122 {
14123 uint16_t kmreg;
14124
14125 /* Only for igp3 */
14126 if (sc->sc_phytype == WMPHY_IGP_3) {
14127 if (wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG, &kmreg) != 0)
14128 return;
14129 kmreg |= KUMCTRLSTA_DIAG_NELPBK;
14130 if (wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg) != 0)
14131 return;
14132 kmreg &= ~KUMCTRLSTA_DIAG_NELPBK;
14133 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg);
14134 }
14135 }
14136
14137 /*
14138 * Workaround for pch's PHYs
14139 * XXX should be moved to new PHY driver?
14140 */
14141 static void
14142 wm_hv_phy_workaround_ich8lan(struct wm_softc *sc)
14143 {
14144
14145 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14146 device_xname(sc->sc_dev), __func__));
14147 KASSERT(sc->sc_type == WM_T_PCH);
14148
14149 if (sc->sc_phytype == WMPHY_82577)
14150 wm_set_mdio_slow_mode_hv(sc);
14151
14152 /* (PCH rev.2) && (82577 && (phy rev 2 or 3)) */
14153
14154 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/
14155
14156 /* 82578 */
14157 if (sc->sc_phytype == WMPHY_82578) {
14158 struct mii_softc *child;
14159
14160 /*
14161 * Return registers to default by doing a soft reset then
14162 * writing 0x3140 to the control register
14163 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1
14164 */
14165 child = LIST_FIRST(&sc->sc_mii.mii_phys);
14166 if ((child != NULL) && (child->mii_mpd_rev < 2)) {
14167 PHY_RESET(child);
14168 sc->sc_mii.mii_writereg(sc->sc_dev, 2, MII_BMCR,
14169 0x3140);
14170 }
14171 }
14172
14173 /* Select page 0 */
14174 sc->phy.acquire(sc);
14175 wm_gmii_mdic_writereg(sc->sc_dev, 1, MII_IGPHY_PAGE_SELECT, 0);
14176 sc->phy.release(sc);
14177
14178 /*
14179 * Configure the K1 Si workaround during phy reset assuming there is
14180 * link so that it disables K1 if link is in 1Gbps.
14181 */
14182 wm_k1_gig_workaround_hv(sc, 1);
14183 }
14184
14185 static void
14186 wm_lv_phy_workaround_ich8lan(struct wm_softc *sc)
14187 {
14188
14189 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14190 device_xname(sc->sc_dev), __func__));
14191 KASSERT(sc->sc_type == WM_T_PCH2);
14192
14193 wm_set_mdio_slow_mode_hv(sc);
14194 }
14195
14196 static int
14197 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link)
14198 {
14199 int k1_enable = sc->sc_nvm_k1_enabled;
14200
14201 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14202 device_xname(sc->sc_dev), __func__));
14203
14204 if (sc->phy.acquire(sc) != 0)
14205 return -1;
14206
14207 if (link) {
14208 k1_enable = 0;
14209
14210 /* Link stall fix for link up */
14211 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x0100);
14212 } else {
14213 /* Link stall fix for link down */
14214 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x4100);
14215 }
14216
14217 wm_configure_k1_ich8lan(sc, k1_enable);
14218 sc->phy.release(sc);
14219
14220 return 0;
14221 }
14222
14223 static void
14224 wm_set_mdio_slow_mode_hv(struct wm_softc *sc)
14225 {
14226 uint32_t reg;
14227
14228 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL);
14229 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL,
14230 reg | HV_KMRN_MDIO_SLOW);
14231 }
14232
14233 static void
14234 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable)
14235 {
14236 uint32_t ctrl, ctrl_ext, tmp;
14237 uint16_t kmreg;
14238 int rv;
14239
14240 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, &kmreg);
14241 if (rv != 0)
14242 return;
14243
14244 if (k1_enable)
14245 kmreg |= KUMCTRLSTA_K1_ENABLE;
14246 else
14247 kmreg &= ~KUMCTRLSTA_K1_ENABLE;
14248
14249 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmreg);
14250 if (rv != 0)
14251 return;
14252
14253 delay(20);
14254
14255 ctrl = CSR_READ(sc, WMREG_CTRL);
14256 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
14257
14258 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100);
14259 tmp |= CTRL_FRCSPD;
14260
14261 CSR_WRITE(sc, WMREG_CTRL, tmp);
14262 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS);
14263 CSR_WRITE_FLUSH(sc);
14264 delay(20);
14265
14266 CSR_WRITE(sc, WMREG_CTRL, ctrl);
14267 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
14268 CSR_WRITE_FLUSH(sc);
14269 delay(20);
14270
14271 return;
14272 }
14273
14274 /* special case - for 82575 - need to do manual init ... */
14275 static void
14276 wm_reset_init_script_82575(struct wm_softc *sc)
14277 {
14278 /*
14279 * remark: this is untested code - we have no board without EEPROM
14280 * same setup as mentioned int the FreeBSD driver for the i82575
14281 */
14282
14283 /* SerDes configuration via SERDESCTRL */
14284 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c);
14285 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
14286 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23);
14287 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
14288
14289 /* CCM configuration via CCMCTL register */
14290 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
14291 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
14292
14293 /* PCIe lanes configuration */
14294 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec);
14295 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf);
14296 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
14297 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81);
14298
14299 /* PCIe PLL Configuration */
14300 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
14301 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
14302 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
14303 }
14304
14305 static void
14306 wm_reset_mdicnfg_82580(struct wm_softc *sc)
14307 {
14308 uint32_t reg;
14309 uint16_t nvmword;
14310 int rv;
14311
14312 if (sc->sc_type != WM_T_82580)
14313 return;
14314 if ((sc->sc_flags & WM_F_SGMII) == 0)
14315 return;
14316
14317 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid)
14318 + NVM_OFF_CFG3_PORTA, 1, &nvmword);
14319 if (rv != 0) {
14320 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n",
14321 __func__);
14322 return;
14323 }
14324
14325 reg = CSR_READ(sc, WMREG_MDICNFG);
14326 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO)
14327 reg |= MDICNFG_DEST;
14328 if (nvmword & NVM_CFG3_PORTA_COM_MDIO)
14329 reg |= MDICNFG_COM_MDIO;
14330 CSR_WRITE(sc, WMREG_MDICNFG, reg);
14331 }
14332
14333 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff))
14334
14335 static bool
14336 wm_phy_is_accessible_pchlan(struct wm_softc *sc)
14337 {
14338 int i;
14339 uint32_t reg;
14340 uint16_t id1, id2;
14341
14342 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14343 device_xname(sc->sc_dev), __func__));
14344 id1 = id2 = 0xffff;
14345 for (i = 0; i < 2; i++) {
14346 id1 = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1);
14347 if (MII_INVALIDID(id1))
14348 continue;
14349 id2 = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2);
14350 if (MII_INVALIDID(id2))
14351 continue;
14352 break;
14353 }
14354 if (!MII_INVALIDID(id1) && !MII_INVALIDID(id2)) {
14355 goto out;
14356 }
14357
14358 if (sc->sc_type < WM_T_PCH_LPT) {
14359 sc->phy.release(sc);
14360 wm_set_mdio_slow_mode_hv(sc);
14361 id1 = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR1);
14362 id2 = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR2);
14363 sc->phy.acquire(sc);
14364 }
14365 if (MII_INVALIDID(id1) || MII_INVALIDID(id2)) {
14366 printf("XXX return with false\n");
14367 return false;
14368 }
14369 out:
14370 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)) {
14371 /* Only unforce SMBus if ME is not active */
14372 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
14373 /* Unforce SMBus mode in PHY */
14374 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2,
14375 CV_SMB_CTRL);
14376 reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
14377 wm_gmii_hv_writereg_locked(sc->sc_dev, 2,
14378 CV_SMB_CTRL, reg);
14379
14380 /* Unforce SMBus mode in MAC */
14381 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14382 reg &= ~CTRL_EXT_FORCE_SMBUS;
14383 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14384 }
14385 }
14386 return true;
14387 }
14388
14389 static void
14390 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc)
14391 {
14392 uint32_t reg;
14393 int i;
14394
14395 /* Set PHY Config Counter to 50msec */
14396 reg = CSR_READ(sc, WMREG_FEXTNVM3);
14397 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
14398 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
14399 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
14400
14401 /* Toggle LANPHYPC */
14402 reg = CSR_READ(sc, WMREG_CTRL);
14403 reg |= CTRL_LANPHYPC_OVERRIDE;
14404 reg &= ~CTRL_LANPHYPC_VALUE;
14405 CSR_WRITE(sc, WMREG_CTRL, reg);
14406 CSR_WRITE_FLUSH(sc);
14407 delay(1000);
14408 reg &= ~CTRL_LANPHYPC_OVERRIDE;
14409 CSR_WRITE(sc, WMREG_CTRL, reg);
14410 CSR_WRITE_FLUSH(sc);
14411
14412 if (sc->sc_type < WM_T_PCH_LPT)
14413 delay(50 * 1000);
14414 else {
14415 i = 20;
14416
14417 do {
14418 delay(5 * 1000);
14419 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0)
14420 && i--);
14421
14422 delay(30 * 1000);
14423 }
14424 }
14425
14426 static int
14427 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link)
14428 {
14429 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ)
14430 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND;
14431 uint32_t rxa;
14432 uint16_t scale = 0, lat_enc = 0;
14433 int32_t obff_hwm = 0;
14434 int64_t lat_ns, value;
14435
14436 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14437 device_xname(sc->sc_dev), __func__));
14438
14439 if (link) {
14440 uint16_t max_snoop, max_nosnoop, max_ltr_enc;
14441 uint32_t status;
14442 uint16_t speed;
14443 pcireg_t preg;
14444
14445 status = CSR_READ(sc, WMREG_STATUS);
14446 switch (__SHIFTOUT(status, STATUS_SPEED)) {
14447 case STATUS_SPEED_10:
14448 speed = 10;
14449 break;
14450 case STATUS_SPEED_100:
14451 speed = 100;
14452 break;
14453 case STATUS_SPEED_1000:
14454 speed = 1000;
14455 break;
14456 default:
14457 device_printf(sc->sc_dev, "Unknown speed "
14458 "(status = %08x)\n", status);
14459 return -1;
14460 }
14461
14462 /* Rx Packet Buffer Allocation size (KB) */
14463 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK;
14464
14465 /*
14466 * Determine the maximum latency tolerated by the device.
14467 *
14468 * Per the PCIe spec, the tolerated latencies are encoded as
14469 * a 3-bit encoded scale (only 0-5 are valid) multiplied by
14470 * a 10-bit value (0-1023) to provide a range from 1 ns to
14471 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns,
14472 * 1=2^5ns, 2=2^10ns,...5=2^25ns.
14473 */
14474 lat_ns = ((int64_t)rxa * 1024 -
14475 (2 * ((int64_t)sc->sc_ethercom.ec_if.if_mtu
14476 + ETHER_HDR_LEN))) * 8 * 1000;
14477 if (lat_ns < 0)
14478 lat_ns = 0;
14479 else
14480 lat_ns /= speed;
14481 value = lat_ns;
14482
14483 while (value > LTRV_VALUE) {
14484 scale ++;
14485 value = howmany(value, __BIT(5));
14486 }
14487 if (scale > LTRV_SCALE_MAX) {
14488 printf("%s: Invalid LTR latency scale %d\n",
14489 device_xname(sc->sc_dev), scale);
14490 return -1;
14491 }
14492 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value);
14493
14494 /* Determine the maximum latency tolerated by the platform */
14495 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
14496 WM_PCI_LTR_CAP_LPT);
14497 max_snoop = preg & 0xffff;
14498 max_nosnoop = preg >> 16;
14499
14500 max_ltr_enc = MAX(max_snoop, max_nosnoop);
14501
14502 if (lat_enc > max_ltr_enc) {
14503 lat_enc = max_ltr_enc;
14504 lat_ns = __SHIFTOUT(lat_enc, PCI_LTR_MAXSNOOPLAT_VAL)
14505 * PCI_LTR_SCALETONS(
14506 __SHIFTOUT(lat_enc,
14507 PCI_LTR_MAXSNOOPLAT_SCALE));
14508 }
14509
14510 if (lat_ns) {
14511 lat_ns *= speed * 1000;
14512 lat_ns /= 8;
14513 lat_ns /= 1000000000;
14514 obff_hwm = (int32_t)(rxa - lat_ns);
14515 }
14516 if ((obff_hwm < 0) || (obff_hwm > SVT_OFF_HWM)) {
14517 device_printf(sc->sc_dev, "Invalid high water mark %d"
14518 "(rxa = %d, lat_ns = %d)\n",
14519 obff_hwm, (int32_t)rxa, (int32_t)lat_ns);
14520 return -1;
14521 }
14522 }
14523 /* Snoop and No-Snoop latencies the same */
14524 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP);
14525 CSR_WRITE(sc, WMREG_LTRV, reg);
14526
14527 /* Set OBFF high water mark */
14528 reg = CSR_READ(sc, WMREG_SVT) & ~SVT_OFF_HWM;
14529 reg |= obff_hwm;
14530 CSR_WRITE(sc, WMREG_SVT, reg);
14531
14532 /* Enable OBFF */
14533 reg = CSR_READ(sc, WMREG_SVCR);
14534 reg |= SVCR_OFF_EN | SVCR_OFF_MASKINT;
14535 CSR_WRITE(sc, WMREG_SVCR, reg);
14536
14537 return 0;
14538 }
14539
14540 /*
14541 * I210 Errata 25 and I211 Errata 10
14542 * Slow System Clock.
14543 */
14544 static void
14545 wm_pll_workaround_i210(struct wm_softc *sc)
14546 {
14547 uint32_t mdicnfg, wuc;
14548 uint32_t reg;
14549 pcireg_t pcireg;
14550 uint32_t pmreg;
14551 uint16_t nvmword, tmp_nvmword;
14552 int phyval;
14553 bool wa_done = false;
14554 int i;
14555
14556 /* Save WUC and MDICNFG registers */
14557 wuc = CSR_READ(sc, WMREG_WUC);
14558 mdicnfg = CSR_READ(sc, WMREG_MDICNFG);
14559
14560 reg = mdicnfg & ~MDICNFG_DEST;
14561 CSR_WRITE(sc, WMREG_MDICNFG, reg);
14562
14563 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0)
14564 nvmword = INVM_DEFAULT_AL;
14565 tmp_nvmword = nvmword | INVM_PLL_WO_VAL;
14566
14567 /* Get Power Management cap offset */
14568 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
14569 &pmreg, NULL) == 0)
14570 return;
14571 for (i = 0; i < WM_MAX_PLL_TRIES; i++) {
14572 phyval = wm_gmii_gs40g_readreg(sc->sc_dev, 1,
14573 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG);
14574
14575 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) {
14576 break; /* OK */
14577 }
14578
14579 wa_done = true;
14580 /* Directly reset the internal PHY */
14581 reg = CSR_READ(sc, WMREG_CTRL);
14582 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
14583
14584 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14585 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE;
14586 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14587
14588 CSR_WRITE(sc, WMREG_WUC, 0);
14589 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16);
14590 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
14591
14592 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
14593 pmreg + PCI_PMCSR);
14594 pcireg |= PCI_PMCSR_STATE_D3;
14595 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
14596 pmreg + PCI_PMCSR, pcireg);
14597 delay(1000);
14598 pcireg &= ~PCI_PMCSR_STATE_D3;
14599 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
14600 pmreg + PCI_PMCSR, pcireg);
14601
14602 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16);
14603 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
14604
14605 /* Restore WUC register */
14606 CSR_WRITE(sc, WMREG_WUC, wuc);
14607 }
14608
14609 /* Restore MDICNFG setting */
14610 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg);
14611 if (wa_done)
14612 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n");
14613 }
14614
14615 static void
14616 wm_legacy_irq_quirk_spt(struct wm_softc *sc)
14617 {
14618 uint32_t reg;
14619
14620 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14621 device_xname(sc->sc_dev), __func__));
14622 KASSERT(sc->sc_type == WM_T_PCH_SPT);
14623
14624 reg = CSR_READ(sc, WMREG_FEXTNVM7);
14625 reg |= FEXTNVM7_SIDE_CLK_UNGATE;
14626 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
14627
14628 reg = CSR_READ(sc, WMREG_FEXTNVM9);
14629 reg |= FEXTNVM9_IOSFSB_CLKGATE_DIS | FEXTNVM9_IOSFSB_CLKREQ_DIS;
14630 CSR_WRITE(sc, WMREG_FEXTNVM9, reg);
14631 }
14632