if_wm.c revision 1.576 1 /* $NetBSD: if_wm.c,v 1.576 2018/04/23 01:35:25 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.576 2018/04/23 01:35:25 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_sending;
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 TX/RX 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 *,
694 uint16_t *);
695 static void wm_watchdog_txq_locked(struct ifnet *, struct wm_txqueue *,
696 uint16_t *);
697 static void wm_tick(void *);
698 static int wm_ifflags_cb(struct ethercom *);
699 static int wm_ioctl(struct ifnet *, u_long, void *);
700 /* MAC address related */
701 static uint16_t wm_check_alt_mac_addr(struct wm_softc *);
702 static int wm_read_mac_addr(struct wm_softc *, uint8_t *);
703 static void wm_set_ral(struct wm_softc *, const uint8_t *, int);
704 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *);
705 static void wm_set_filter(struct wm_softc *);
706 /* Reset and init related */
707 static void wm_set_vlan(struct wm_softc *);
708 static void wm_set_pcie_completion_timeout(struct wm_softc *);
709 static void wm_get_auto_rd_done(struct wm_softc *);
710 static void wm_lan_init_done(struct wm_softc *);
711 static void wm_get_cfg_done(struct wm_softc *);
712 static void wm_phy_post_reset(struct wm_softc *);
713 static void wm_write_smbus_addr(struct wm_softc *);
714 static void wm_init_lcd_from_nvm(struct wm_softc *);
715 static void wm_initialize_hardware_bits(struct wm_softc *);
716 static uint32_t wm_rxpbs_adjust_82580(uint32_t);
717 static void wm_reset_phy(struct wm_softc *);
718 static void wm_flush_desc_rings(struct wm_softc *);
719 static void wm_reset(struct wm_softc *);
720 static int wm_add_rxbuf(struct wm_rxqueue *, int);
721 static void wm_rxdrain(struct wm_rxqueue *);
722 static void wm_init_rss(struct wm_softc *);
723 static void wm_adjust_qnum(struct wm_softc *, int);
724 static inline bool wm_is_using_msix(struct wm_softc *);
725 static inline bool wm_is_using_multiqueue(struct wm_softc *);
726 static int wm_softint_establish(struct wm_softc *, int, int);
727 static int wm_setup_legacy(struct wm_softc *);
728 static int wm_setup_msix(struct wm_softc *);
729 static int wm_init(struct ifnet *);
730 static int wm_init_locked(struct ifnet *);
731 static void wm_unset_stopping_flags(struct wm_softc *);
732 static void wm_set_stopping_flags(struct wm_softc *);
733 static void wm_stop(struct ifnet *, int);
734 static void wm_stop_locked(struct ifnet *, int);
735 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *);
736 static void wm_82547_txfifo_stall(void *);
737 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *);
738 static void wm_itrs_writereg(struct wm_softc *, struct wm_queue *);
739 /* DMA related */
740 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *);
741 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *);
742 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *);
743 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *,
744 struct wm_txqueue *);
745 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *);
746 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *);
747 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *,
748 struct wm_rxqueue *);
749 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *);
750 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *);
751 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *);
752 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
753 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
754 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
755 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *,
756 struct wm_txqueue *);
757 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *,
758 struct wm_rxqueue *);
759 static int wm_alloc_txrx_queues(struct wm_softc *);
760 static void wm_free_txrx_queues(struct wm_softc *);
761 static int wm_init_txrx_queues(struct wm_softc *);
762 /* Start */
763 static int wm_tx_offload(struct wm_softc *, struct wm_txqueue *,
764 struct wm_txsoft *, uint32_t *, uint8_t *);
765 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *);
766 static void wm_start(struct ifnet *);
767 static void wm_start_locked(struct ifnet *);
768 static int wm_transmit(struct ifnet *, struct mbuf *);
769 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *);
770 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *,
771 bool);
772 static int wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *,
773 struct wm_txsoft *, uint32_t *, uint32_t *, bool *);
774 static void wm_nq_start(struct ifnet *);
775 static void wm_nq_start_locked(struct ifnet *);
776 static int wm_nq_transmit(struct ifnet *, struct mbuf *);
777 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *);
778 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *,
779 bool);
780 static void wm_deferred_start_locked(struct wm_txqueue *);
781 static void wm_handle_queue(void *);
782 /* Interrupt */
783 static bool wm_txeof(struct wm_txqueue *, u_int);
784 static bool wm_rxeof(struct wm_rxqueue *, u_int);
785 static void wm_linkintr_gmii(struct wm_softc *, uint32_t);
786 static void wm_linkintr_tbi(struct wm_softc *, uint32_t);
787 static void wm_linkintr_serdes(struct wm_softc *, uint32_t);
788 static void wm_linkintr(struct wm_softc *, uint32_t);
789 static int wm_intr_legacy(void *);
790 static inline void wm_txrxintr_disable(struct wm_queue *);
791 static inline void wm_txrxintr_enable(struct wm_queue *);
792 static void wm_itrs_calculate(struct wm_softc *, struct wm_queue *);
793 static int wm_txrxintr_msix(void *);
794 static int wm_linkintr_msix(void *);
795
796 /*
797 * Media related.
798 * GMII, SGMII, TBI, SERDES and SFP.
799 */
800 /* Common */
801 static void wm_tbi_serdes_set_linkled(struct wm_softc *);
802 /* GMII related */
803 static void wm_gmii_reset(struct wm_softc *);
804 static void wm_gmii_setup_phytype(struct wm_softc *, uint32_t, uint16_t);
805 static int wm_get_phy_id_82575(struct wm_softc *);
806 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t);
807 static int wm_gmii_mediachange(struct ifnet *);
808 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
809 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int);
810 static uint32_t wm_i82543_mii_recvbits(struct wm_softc *);
811 static int wm_gmii_i82543_readreg(device_t, int, int);
812 static void wm_gmii_i82543_writereg(device_t, int, int, int);
813 static int wm_gmii_mdic_readreg(device_t, int, int);
814 static void wm_gmii_mdic_writereg(device_t, int, int, int);
815 static int wm_gmii_i82544_readreg(device_t, int, int);
816 static void wm_gmii_i82544_writereg(device_t, int, int, int);
817 static int wm_gmii_i80003_readreg(device_t, int, int);
818 static void wm_gmii_i80003_writereg(device_t, int, int, int);
819 static int wm_gmii_bm_readreg(device_t, int, int);
820 static void wm_gmii_bm_writereg(device_t, int, int, int);
821 static void wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int);
822 static int wm_gmii_hv_readreg(device_t, int, int);
823 static int wm_gmii_hv_readreg_locked(device_t, int, int);
824 static void wm_gmii_hv_writereg(device_t, int, int, int);
825 static void wm_gmii_hv_writereg_locked(device_t, int, int, int);
826 static int wm_gmii_82580_readreg(device_t, int, int);
827 static void wm_gmii_82580_writereg(device_t, int, int, int);
828 static int wm_gmii_gs40g_readreg(device_t, int, int);
829 static void wm_gmii_gs40g_writereg(device_t, int, int, int);
830 static void wm_gmii_statchg(struct ifnet *);
831 /*
832 * kumeran related (80003, ICH* and PCH*).
833 * These functions are not for accessing MII registers but for accessing
834 * kumeran specific registers.
835 */
836 static int wm_kmrn_readreg(struct wm_softc *, int, uint16_t *);
837 static int wm_kmrn_readreg_locked(struct wm_softc *, int, uint16_t *);
838 static int wm_kmrn_writereg(struct wm_softc *, int, uint16_t);
839 static int wm_kmrn_writereg_locked(struct wm_softc *, int, uint16_t);
840 /* SGMII */
841 static bool wm_sgmii_uses_mdio(struct wm_softc *);
842 static int wm_sgmii_readreg(device_t, int, int);
843 static void wm_sgmii_writereg(device_t, int, int, int);
844 /* TBI related */
845 static void wm_tbi_mediainit(struct wm_softc *);
846 static int wm_tbi_mediachange(struct ifnet *);
847 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
848 static int wm_check_for_link(struct wm_softc *);
849 static void wm_tbi_tick(struct wm_softc *);
850 /* SERDES related */
851 static void wm_serdes_power_up_link_82575(struct wm_softc *);
852 static int wm_serdes_mediachange(struct ifnet *);
853 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *);
854 static void wm_serdes_tick(struct wm_softc *);
855 /* SFP related */
856 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *);
857 static uint32_t wm_sfp_get_media_type(struct wm_softc *);
858
859 /*
860 * NVM related.
861 * Microwire, SPI (w/wo EERD) and Flash.
862 */
863 /* Misc functions */
864 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int);
865 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int);
866 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *);
867 /* Microwire */
868 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *);
869 /* SPI */
870 static int wm_nvm_ready_spi(struct wm_softc *);
871 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *);
872 /* Using with EERD */
873 static int wm_poll_eerd_eewr_done(struct wm_softc *, int);
874 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *);
875 /* Flash */
876 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *,
877 unsigned int *);
878 static int32_t wm_ich8_cycle_init(struct wm_softc *);
879 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t);
880 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t,
881 uint32_t *);
882 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *);
883 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *);
884 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *);
885 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *);
886 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *);
887 /* iNVM */
888 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *);
889 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *);
890 /* Lock, detecting NVM type, validate checksum and read */
891 static int wm_nvm_is_onboard_eeprom(struct wm_softc *);
892 static int wm_nvm_flash_presence_i210(struct wm_softc *);
893 static int wm_nvm_validate_checksum(struct wm_softc *);
894 static void wm_nvm_version_invm(struct wm_softc *);
895 static void wm_nvm_version(struct wm_softc *);
896 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *);
897
898 /*
899 * Hardware semaphores.
900 * Very complexed...
901 */
902 static int wm_get_null(struct wm_softc *);
903 static void wm_put_null(struct wm_softc *);
904 static int wm_get_eecd(struct wm_softc *);
905 static void wm_put_eecd(struct wm_softc *);
906 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */
907 static void wm_put_swsm_semaphore(struct wm_softc *);
908 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t);
909 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t);
910 static int wm_get_nvm_80003(struct wm_softc *);
911 static void wm_put_nvm_80003(struct wm_softc *);
912 static int wm_get_nvm_82571(struct wm_softc *);
913 static void wm_put_nvm_82571(struct wm_softc *);
914 static int wm_get_phy_82575(struct wm_softc *);
915 static void wm_put_phy_82575(struct wm_softc *);
916 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */
917 static void wm_put_swfwhw_semaphore(struct wm_softc *);
918 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */
919 static void wm_put_swflag_ich8lan(struct wm_softc *);
920 static int wm_get_nvm_ich8lan(struct wm_softc *);
921 static void wm_put_nvm_ich8lan(struct wm_softc *);
922 static int wm_get_hw_semaphore_82573(struct wm_softc *);
923 static void wm_put_hw_semaphore_82573(struct wm_softc *);
924
925 /*
926 * Management mode and power management related subroutines.
927 * BMC, AMT, suspend/resume and EEE.
928 */
929 #if 0
930 static int wm_check_mng_mode(struct wm_softc *);
931 static int wm_check_mng_mode_ich8lan(struct wm_softc *);
932 static int wm_check_mng_mode_82574(struct wm_softc *);
933 static int wm_check_mng_mode_generic(struct wm_softc *);
934 #endif
935 static int wm_enable_mng_pass_thru(struct wm_softc *);
936 static bool wm_phy_resetisblocked(struct wm_softc *);
937 static void wm_get_hw_control(struct wm_softc *);
938 static void wm_release_hw_control(struct wm_softc *);
939 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool);
940 static void wm_smbustopci(struct wm_softc *);
941 static void wm_init_manageability(struct wm_softc *);
942 static void wm_release_manageability(struct wm_softc *);
943 static void wm_get_wakeup(struct wm_softc *);
944 static void wm_ulp_disable(struct wm_softc *);
945 static void wm_enable_phy_wakeup(struct wm_softc *);
946 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *);
947 static void wm_enable_wakeup(struct wm_softc *);
948 static void wm_disable_aspm(struct wm_softc *);
949 /* LPLU (Low Power Link Up) */
950 static void wm_lplu_d0_disable(struct wm_softc *);
951 /* EEE */
952 static void wm_set_eee_i350(struct wm_softc *);
953
954 /*
955 * Workarounds (mainly PHY related).
956 * Basically, PHY's workarounds are in the PHY drivers.
957 */
958 static void wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *);
959 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *);
960 static void wm_hv_phy_workaround_ich8lan(struct wm_softc *);
961 static void wm_lv_phy_workaround_ich8lan(struct wm_softc *);
962 static int wm_k1_gig_workaround_hv(struct wm_softc *, int);
963 static void wm_set_mdio_slow_mode_hv(struct wm_softc *);
964 static void wm_configure_k1_ich8lan(struct wm_softc *, int);
965 static void wm_reset_init_script_82575(struct wm_softc *);
966 static void wm_reset_mdicnfg_82580(struct wm_softc *);
967 static bool wm_phy_is_accessible_pchlan(struct wm_softc *);
968 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *);
969 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool);
970 static void wm_pll_workaround_i210(struct wm_softc *);
971 static void wm_legacy_irq_quirk_spt(struct wm_softc *);
972
973 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc),
974 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
975
976 /*
977 * Devices supported by this driver.
978 */
979 static const struct wm_product {
980 pci_vendor_id_t wmp_vendor;
981 pci_product_id_t wmp_product;
982 const char *wmp_name;
983 wm_chip_type wmp_type;
984 uint32_t wmp_flags;
985 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN
986 #define WMP_F_FIBER WM_MEDIATYPE_FIBER
987 #define WMP_F_COPPER WM_MEDIATYPE_COPPER
988 #define WMP_F_SERDES WM_MEDIATYPE_SERDES
989 #define WMP_MEDIATYPE(x) ((x) & 0x03)
990 } wm_products[] = {
991 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542,
992 "Intel i82542 1000BASE-X Ethernet",
993 WM_T_82542_2_1, WMP_F_FIBER },
994
995 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER,
996 "Intel i82543GC 1000BASE-X Ethernet",
997 WM_T_82543, WMP_F_FIBER },
998
999 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER,
1000 "Intel i82543GC 1000BASE-T Ethernet",
1001 WM_T_82543, WMP_F_COPPER },
1002
1003 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER,
1004 "Intel i82544EI 1000BASE-T Ethernet",
1005 WM_T_82544, WMP_F_COPPER },
1006
1007 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER,
1008 "Intel i82544EI 1000BASE-X Ethernet",
1009 WM_T_82544, WMP_F_FIBER },
1010
1011 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER,
1012 "Intel i82544GC 1000BASE-T Ethernet",
1013 WM_T_82544, WMP_F_COPPER },
1014
1015 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM,
1016 "Intel i82544GC (LOM) 1000BASE-T Ethernet",
1017 WM_T_82544, WMP_F_COPPER },
1018
1019 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM,
1020 "Intel i82540EM 1000BASE-T Ethernet",
1021 WM_T_82540, WMP_F_COPPER },
1022
1023 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM,
1024 "Intel i82540EM (LOM) 1000BASE-T Ethernet",
1025 WM_T_82540, WMP_F_COPPER },
1026
1027 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM,
1028 "Intel i82540EP 1000BASE-T Ethernet",
1029 WM_T_82540, WMP_F_COPPER },
1030
1031 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP,
1032 "Intel i82540EP 1000BASE-T Ethernet",
1033 WM_T_82540, WMP_F_COPPER },
1034
1035 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP,
1036 "Intel i82540EP 1000BASE-T Ethernet",
1037 WM_T_82540, WMP_F_COPPER },
1038
1039 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER,
1040 "Intel i82545EM 1000BASE-T Ethernet",
1041 WM_T_82545, WMP_F_COPPER },
1042
1043 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER,
1044 "Intel i82545GM 1000BASE-T Ethernet",
1045 WM_T_82545_3, WMP_F_COPPER },
1046
1047 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER,
1048 "Intel i82545GM 1000BASE-X Ethernet",
1049 WM_T_82545_3, WMP_F_FIBER },
1050
1051 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES,
1052 "Intel i82545GM Gigabit Ethernet (SERDES)",
1053 WM_T_82545_3, WMP_F_SERDES },
1054
1055 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER,
1056 "Intel i82546EB 1000BASE-T Ethernet",
1057 WM_T_82546, WMP_F_COPPER },
1058
1059 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD,
1060 "Intel i82546EB 1000BASE-T Ethernet",
1061 WM_T_82546, WMP_F_COPPER },
1062
1063 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER,
1064 "Intel i82545EM 1000BASE-X Ethernet",
1065 WM_T_82545, WMP_F_FIBER },
1066
1067 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER,
1068 "Intel i82546EB 1000BASE-X Ethernet",
1069 WM_T_82546, WMP_F_FIBER },
1070
1071 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER,
1072 "Intel i82546GB 1000BASE-T Ethernet",
1073 WM_T_82546_3, WMP_F_COPPER },
1074
1075 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER,
1076 "Intel i82546GB 1000BASE-X Ethernet",
1077 WM_T_82546_3, WMP_F_FIBER },
1078
1079 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES,
1080 "Intel i82546GB Gigabit Ethernet (SERDES)",
1081 WM_T_82546_3, WMP_F_SERDES },
1082
1083 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER,
1084 "i82546GB quad-port Gigabit Ethernet",
1085 WM_T_82546_3, WMP_F_COPPER },
1086
1087 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
1088 "i82546GB quad-port Gigabit Ethernet (KSP3)",
1089 WM_T_82546_3, WMP_F_COPPER },
1090
1091 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE,
1092 "Intel PRO/1000MT (82546GB)",
1093 WM_T_82546_3, WMP_F_COPPER },
1094
1095 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI,
1096 "Intel i82541EI 1000BASE-T Ethernet",
1097 WM_T_82541, WMP_F_COPPER },
1098
1099 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM,
1100 "Intel i82541ER (LOM) 1000BASE-T Ethernet",
1101 WM_T_82541, WMP_F_COPPER },
1102
1103 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE,
1104 "Intel i82541EI Mobile 1000BASE-T Ethernet",
1105 WM_T_82541, WMP_F_COPPER },
1106
1107 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER,
1108 "Intel i82541ER 1000BASE-T Ethernet",
1109 WM_T_82541_2, WMP_F_COPPER },
1110
1111 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI,
1112 "Intel i82541GI 1000BASE-T Ethernet",
1113 WM_T_82541_2, WMP_F_COPPER },
1114
1115 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE,
1116 "Intel i82541GI Mobile 1000BASE-T Ethernet",
1117 WM_T_82541_2, WMP_F_COPPER },
1118
1119 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI,
1120 "Intel i82541PI 1000BASE-T Ethernet",
1121 WM_T_82541_2, WMP_F_COPPER },
1122
1123 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI,
1124 "Intel i82547EI 1000BASE-T Ethernet",
1125 WM_T_82547, WMP_F_COPPER },
1126
1127 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE,
1128 "Intel i82547EI Mobile 1000BASE-T Ethernet",
1129 WM_T_82547, WMP_F_COPPER },
1130
1131 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI,
1132 "Intel i82547GI 1000BASE-T Ethernet",
1133 WM_T_82547_2, WMP_F_COPPER },
1134
1135 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER,
1136 "Intel PRO/1000 PT (82571EB)",
1137 WM_T_82571, WMP_F_COPPER },
1138
1139 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER,
1140 "Intel PRO/1000 PF (82571EB)",
1141 WM_T_82571, WMP_F_FIBER },
1142
1143 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES,
1144 "Intel PRO/1000 PB (82571EB)",
1145 WM_T_82571, WMP_F_SERDES },
1146
1147 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER,
1148 "Intel PRO/1000 QT (82571EB)",
1149 WM_T_82571, WMP_F_COPPER },
1150
1151 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER,
1152 "Intel PRO/1000 PT Quad Port Server Adapter",
1153 WM_T_82571, WMP_F_COPPER, },
1154
1155 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER,
1156 "Intel Gigabit PT Quad Port Server ExpressModule",
1157 WM_T_82571, WMP_F_COPPER, },
1158
1159 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES,
1160 "Intel 82571EB Dual Gigabit Ethernet (SERDES)",
1161 WM_T_82571, WMP_F_SERDES, },
1162
1163 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES,
1164 "Intel 82571EB Quad Gigabit Ethernet (SERDES)",
1165 WM_T_82571, WMP_F_SERDES, },
1166
1167 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER,
1168 "Intel 82571EB Quad 1000baseX Ethernet",
1169 WM_T_82571, WMP_F_FIBER, },
1170
1171 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER,
1172 "Intel i82572EI 1000baseT Ethernet",
1173 WM_T_82572, WMP_F_COPPER },
1174
1175 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER,
1176 "Intel i82572EI 1000baseX Ethernet",
1177 WM_T_82572, WMP_F_FIBER },
1178
1179 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES,
1180 "Intel i82572EI Gigabit Ethernet (SERDES)",
1181 WM_T_82572, WMP_F_SERDES },
1182
1183 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI,
1184 "Intel i82572EI 1000baseT Ethernet",
1185 WM_T_82572, WMP_F_COPPER },
1186
1187 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E,
1188 "Intel i82573E",
1189 WM_T_82573, WMP_F_COPPER },
1190
1191 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT,
1192 "Intel i82573E IAMT",
1193 WM_T_82573, WMP_F_COPPER },
1194
1195 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L,
1196 "Intel i82573L Gigabit Ethernet",
1197 WM_T_82573, WMP_F_COPPER },
1198
1199 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L,
1200 "Intel i82574L",
1201 WM_T_82574, WMP_F_COPPER },
1202
1203 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA,
1204 "Intel i82574L",
1205 WM_T_82574, WMP_F_COPPER },
1206
1207 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V,
1208 "Intel i82583V",
1209 WM_T_82583, WMP_F_COPPER },
1210
1211 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT,
1212 "i80003 dual 1000baseT Ethernet",
1213 WM_T_80003, WMP_F_COPPER },
1214
1215 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT,
1216 "i80003 dual 1000baseX Ethernet",
1217 WM_T_80003, WMP_F_COPPER },
1218
1219 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT,
1220 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)",
1221 WM_T_80003, WMP_F_SERDES },
1222
1223 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT,
1224 "Intel i80003 1000baseT Ethernet",
1225 WM_T_80003, WMP_F_COPPER },
1226
1227 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT,
1228 "Intel i80003 Gigabit Ethernet (SERDES)",
1229 WM_T_80003, WMP_F_SERDES },
1230
1231 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT,
1232 "Intel i82801H (M_AMT) LAN Controller",
1233 WM_T_ICH8, WMP_F_COPPER },
1234 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT,
1235 "Intel i82801H (AMT) LAN Controller",
1236 WM_T_ICH8, WMP_F_COPPER },
1237 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN,
1238 "Intel i82801H LAN Controller",
1239 WM_T_ICH8, WMP_F_COPPER },
1240 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN,
1241 "Intel i82801H (IFE) 10/100 LAN Controller",
1242 WM_T_ICH8, WMP_F_COPPER },
1243 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN,
1244 "Intel i82801H (M) LAN Controller",
1245 WM_T_ICH8, WMP_F_COPPER },
1246 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT,
1247 "Intel i82801H IFE (GT) 10/100 LAN Controller",
1248 WM_T_ICH8, WMP_F_COPPER },
1249 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G,
1250 "Intel i82801H IFE (G) 10/100 LAN Controller",
1251 WM_T_ICH8, WMP_F_COPPER },
1252 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3,
1253 "82567V-3 LAN Controller",
1254 WM_T_ICH8, WMP_F_COPPER },
1255 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT,
1256 "82801I (AMT) LAN Controller",
1257 WM_T_ICH9, WMP_F_COPPER },
1258 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE,
1259 "82801I 10/100 LAN Controller",
1260 WM_T_ICH9, WMP_F_COPPER },
1261 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G,
1262 "82801I (G) 10/100 LAN Controller",
1263 WM_T_ICH9, WMP_F_COPPER },
1264 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT,
1265 "82801I (GT) 10/100 LAN Controller",
1266 WM_T_ICH9, WMP_F_COPPER },
1267 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C,
1268 "82801I (C) LAN Controller",
1269 WM_T_ICH9, WMP_F_COPPER },
1270 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M,
1271 "82801I mobile LAN Controller",
1272 WM_T_ICH9, WMP_F_COPPER },
1273 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V,
1274 "82801I mobile (V) LAN Controller",
1275 WM_T_ICH9, WMP_F_COPPER },
1276 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
1277 "82801I mobile (AMT) LAN Controller",
1278 WM_T_ICH9, WMP_F_COPPER },
1279 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM,
1280 "82567LM-4 LAN Controller",
1281 WM_T_ICH9, WMP_F_COPPER },
1282 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM,
1283 "82567LM-2 LAN Controller",
1284 WM_T_ICH10, WMP_F_COPPER },
1285 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF,
1286 "82567LF-2 LAN Controller",
1287 WM_T_ICH10, WMP_F_COPPER },
1288 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM,
1289 "82567LM-3 LAN Controller",
1290 WM_T_ICH10, WMP_F_COPPER },
1291 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF,
1292 "82567LF-3 LAN Controller",
1293 WM_T_ICH10, WMP_F_COPPER },
1294 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V,
1295 "82567V-2 LAN Controller",
1296 WM_T_ICH10, WMP_F_COPPER },
1297 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V,
1298 "82567V-3? LAN Controller",
1299 WM_T_ICH10, WMP_F_COPPER },
1300 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE,
1301 "HANKSVILLE LAN Controller",
1302 WM_T_ICH10, WMP_F_COPPER },
1303 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM,
1304 "PCH LAN (82577LM) Controller",
1305 WM_T_PCH, WMP_F_COPPER },
1306 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC,
1307 "PCH LAN (82577LC) Controller",
1308 WM_T_PCH, WMP_F_COPPER },
1309 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM,
1310 "PCH LAN (82578DM) Controller",
1311 WM_T_PCH, WMP_F_COPPER },
1312 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC,
1313 "PCH LAN (82578DC) Controller",
1314 WM_T_PCH, WMP_F_COPPER },
1315 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM,
1316 "PCH2 LAN (82579LM) Controller",
1317 WM_T_PCH2, WMP_F_COPPER },
1318 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V,
1319 "PCH2 LAN (82579V) Controller",
1320 WM_T_PCH2, WMP_F_COPPER },
1321 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER,
1322 "82575EB dual-1000baseT Ethernet",
1323 WM_T_82575, WMP_F_COPPER },
1324 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
1325 "82575EB dual-1000baseX Ethernet (SERDES)",
1326 WM_T_82575, WMP_F_SERDES },
1327 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
1328 "82575GB quad-1000baseT Ethernet",
1329 WM_T_82575, WMP_F_COPPER },
1330 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
1331 "82575GB quad-1000baseT Ethernet (PM)",
1332 WM_T_82575, WMP_F_COPPER },
1333 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER,
1334 "82576 1000BaseT Ethernet",
1335 WM_T_82576, WMP_F_COPPER },
1336 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER,
1337 "82576 1000BaseX Ethernet",
1338 WM_T_82576, WMP_F_FIBER },
1339
1340 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES,
1341 "82576 gigabit Ethernet (SERDES)",
1342 WM_T_82576, WMP_F_SERDES },
1343
1344 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER,
1345 "82576 quad-1000BaseT Ethernet",
1346 WM_T_82576, WMP_F_COPPER },
1347
1348 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2,
1349 "82576 Gigabit ET2 Quad Port Server Adapter",
1350 WM_T_82576, WMP_F_COPPER },
1351
1352 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS,
1353 "82576 gigabit Ethernet",
1354 WM_T_82576, WMP_F_COPPER },
1355
1356 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES,
1357 "82576 gigabit Ethernet (SERDES)",
1358 WM_T_82576, WMP_F_SERDES },
1359 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD,
1360 "82576 quad-gigabit Ethernet (SERDES)",
1361 WM_T_82576, WMP_F_SERDES },
1362
1363 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER,
1364 "82580 1000BaseT Ethernet",
1365 WM_T_82580, WMP_F_COPPER },
1366 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER,
1367 "82580 1000BaseX Ethernet",
1368 WM_T_82580, WMP_F_FIBER },
1369
1370 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES,
1371 "82580 1000BaseT Ethernet (SERDES)",
1372 WM_T_82580, WMP_F_SERDES },
1373
1374 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII,
1375 "82580 gigabit Ethernet (SGMII)",
1376 WM_T_82580, WMP_F_COPPER },
1377 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL,
1378 "82580 dual-1000BaseT Ethernet",
1379 WM_T_82580, WMP_F_COPPER },
1380
1381 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER,
1382 "82580 quad-1000BaseX Ethernet",
1383 WM_T_82580, WMP_F_FIBER },
1384
1385 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII,
1386 "DH89XXCC Gigabit Ethernet (SGMII)",
1387 WM_T_82580, WMP_F_COPPER },
1388
1389 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES,
1390 "DH89XXCC Gigabit Ethernet (SERDES)",
1391 WM_T_82580, WMP_F_SERDES },
1392
1393 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE,
1394 "DH89XXCC 1000BASE-KX Ethernet",
1395 WM_T_82580, WMP_F_SERDES },
1396
1397 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP,
1398 "DH89XXCC Gigabit Ethernet (SFP)",
1399 WM_T_82580, WMP_F_SERDES },
1400
1401 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER,
1402 "I350 Gigabit Network Connection",
1403 WM_T_I350, WMP_F_COPPER },
1404
1405 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER,
1406 "I350 Gigabit Fiber Network Connection",
1407 WM_T_I350, WMP_F_FIBER },
1408
1409 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES,
1410 "I350 Gigabit Backplane Connection",
1411 WM_T_I350, WMP_F_SERDES },
1412
1413 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4,
1414 "I350 Quad Port Gigabit Ethernet",
1415 WM_T_I350, WMP_F_SERDES },
1416
1417 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII,
1418 "I350 Gigabit Connection",
1419 WM_T_I350, WMP_F_COPPER },
1420
1421 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX,
1422 "I354 Gigabit Ethernet (KX)",
1423 WM_T_I354, WMP_F_SERDES },
1424
1425 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII,
1426 "I354 Gigabit Ethernet (SGMII)",
1427 WM_T_I354, WMP_F_COPPER },
1428
1429 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE,
1430 "I354 Gigabit Ethernet (2.5G)",
1431 WM_T_I354, WMP_F_COPPER },
1432
1433 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1,
1434 "I210-T1 Ethernet Server Adapter",
1435 WM_T_I210, WMP_F_COPPER },
1436
1437 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1,
1438 "I210 Ethernet (Copper OEM)",
1439 WM_T_I210, WMP_F_COPPER },
1440
1441 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT,
1442 "I210 Ethernet (Copper IT)",
1443 WM_T_I210, WMP_F_COPPER },
1444
1445 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF,
1446 "I210 Ethernet (FLASH less)",
1447 WM_T_I210, WMP_F_COPPER },
1448
1449 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER,
1450 "I210 Gigabit Ethernet (Fiber)",
1451 WM_T_I210, WMP_F_FIBER },
1452
1453 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES,
1454 "I210 Gigabit Ethernet (SERDES)",
1455 WM_T_I210, WMP_F_SERDES },
1456
1457 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF,
1458 "I210 Gigabit Ethernet (FLASH less)",
1459 WM_T_I210, WMP_F_SERDES },
1460
1461 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII,
1462 "I210 Gigabit Ethernet (SGMII)",
1463 WM_T_I210, WMP_F_COPPER },
1464
1465 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER,
1466 "I211 Ethernet (COPPER)",
1467 WM_T_I211, WMP_F_COPPER },
1468 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V,
1469 "I217 V Ethernet Connection",
1470 WM_T_PCH_LPT, WMP_F_COPPER },
1471 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM,
1472 "I217 LM Ethernet Connection",
1473 WM_T_PCH_LPT, WMP_F_COPPER },
1474 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V,
1475 "I218 V Ethernet Connection",
1476 WM_T_PCH_LPT, WMP_F_COPPER },
1477 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2,
1478 "I218 V Ethernet Connection",
1479 WM_T_PCH_LPT, WMP_F_COPPER },
1480 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3,
1481 "I218 V Ethernet Connection",
1482 WM_T_PCH_LPT, WMP_F_COPPER },
1483 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM,
1484 "I218 LM Ethernet Connection",
1485 WM_T_PCH_LPT, WMP_F_COPPER },
1486 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2,
1487 "I218 LM Ethernet Connection",
1488 WM_T_PCH_LPT, WMP_F_COPPER },
1489 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3,
1490 "I218 LM Ethernet Connection",
1491 WM_T_PCH_LPT, WMP_F_COPPER },
1492 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V,
1493 "I219 V Ethernet Connection",
1494 WM_T_PCH_SPT, WMP_F_COPPER },
1495 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2,
1496 "I219 V Ethernet Connection",
1497 WM_T_PCH_SPT, WMP_F_COPPER },
1498 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4,
1499 "I219 V Ethernet Connection",
1500 WM_T_PCH_SPT, WMP_F_COPPER },
1501 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5,
1502 "I219 V Ethernet Connection",
1503 WM_T_PCH_SPT, WMP_F_COPPER },
1504 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM,
1505 "I219 LM Ethernet Connection",
1506 WM_T_PCH_SPT, WMP_F_COPPER },
1507 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2,
1508 "I219 LM Ethernet Connection",
1509 WM_T_PCH_SPT, WMP_F_COPPER },
1510 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3,
1511 "I219 LM Ethernet Connection",
1512 WM_T_PCH_SPT, WMP_F_COPPER },
1513 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4,
1514 "I219 LM Ethernet Connection",
1515 WM_T_PCH_SPT, WMP_F_COPPER },
1516 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5,
1517 "I219 LM Ethernet Connection",
1518 WM_T_PCH_SPT, WMP_F_COPPER },
1519 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V6,
1520 "I219 V Ethernet Connection",
1521 WM_T_PCH_CNP, WMP_F_COPPER },
1522 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V7,
1523 "I219 V Ethernet Connection",
1524 WM_T_PCH_CNP, WMP_F_COPPER },
1525 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM6,
1526 "I219 LM Ethernet Connection",
1527 WM_T_PCH_CNP, WMP_F_COPPER },
1528 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM7,
1529 "I219 LM Ethernet Connection",
1530 WM_T_PCH_CNP, WMP_F_COPPER },
1531 { 0, 0,
1532 NULL,
1533 0, 0 },
1534 };
1535
1536 /*
1537 * Register read/write functions.
1538 * Other than CSR_{READ|WRITE}().
1539 */
1540
1541 #if 0 /* Not currently used */
1542 static inline uint32_t
1543 wm_io_read(struct wm_softc *sc, int reg)
1544 {
1545
1546 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1547 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4));
1548 }
1549 #endif
1550
1551 static inline void
1552 wm_io_write(struct wm_softc *sc, int reg, uint32_t val)
1553 {
1554
1555 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1556 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val);
1557 }
1558
1559 static inline void
1560 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off,
1561 uint32_t data)
1562 {
1563 uint32_t regval;
1564 int i;
1565
1566 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
1567
1568 CSR_WRITE(sc, reg, regval);
1569
1570 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) {
1571 delay(5);
1572 if (CSR_READ(sc, reg) & SCTL_CTL_READY)
1573 break;
1574 }
1575 if (i == SCTL_CTL_POLL_TIMEOUT) {
1576 aprint_error("%s: WARNING:"
1577 " i82575 reg 0x%08x setup did not indicate ready\n",
1578 device_xname(sc->sc_dev), reg);
1579 }
1580 }
1581
1582 static inline void
1583 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v)
1584 {
1585 wa->wa_low = htole32(v & 0xffffffffU);
1586 if (sizeof(bus_addr_t) == 8)
1587 wa->wa_high = htole32((uint64_t) v >> 32);
1588 else
1589 wa->wa_high = 0;
1590 }
1591
1592 /*
1593 * Descriptor sync/init functions.
1594 */
1595 static inline void
1596 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops)
1597 {
1598 struct wm_softc *sc = txq->txq_sc;
1599
1600 /* If it will wrap around, sync to the end of the ring. */
1601 if ((start + num) > WM_NTXDESC(txq)) {
1602 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1603 WM_CDTXOFF(txq, start), txq->txq_descsize *
1604 (WM_NTXDESC(txq) - start), ops);
1605 num -= (WM_NTXDESC(txq) - start);
1606 start = 0;
1607 }
1608
1609 /* Now sync whatever is left. */
1610 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1611 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops);
1612 }
1613
1614 static inline void
1615 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops)
1616 {
1617 struct wm_softc *sc = rxq->rxq_sc;
1618
1619 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap,
1620 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops);
1621 }
1622
1623 static inline void
1624 wm_init_rxdesc(struct wm_rxqueue *rxq, int start)
1625 {
1626 struct wm_softc *sc = rxq->rxq_sc;
1627 struct wm_rxsoft *rxs = &rxq->rxq_soft[start];
1628 struct mbuf *m = rxs->rxs_mbuf;
1629
1630 /*
1631 * Note: We scoot the packet forward 2 bytes in the buffer
1632 * so that the payload after the Ethernet header is aligned
1633 * to a 4-byte boundary.
1634
1635 * XXX BRAINDAMAGE ALERT!
1636 * The stupid chip uses the same size for every buffer, which
1637 * is set in the Receive Control register. We are using the 2K
1638 * size option, but what we REALLY want is (2K - 2)! For this
1639 * reason, we can't "scoot" packets longer than the standard
1640 * Ethernet MTU. On strict-alignment platforms, if the total
1641 * size exceeds (2K - 2) we set align_tweak to 0 and let
1642 * the upper layer copy the headers.
1643 */
1644 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak;
1645
1646 if (sc->sc_type == WM_T_82574) {
1647 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start];
1648 rxd->erx_data.erxd_addr =
1649 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1650 rxd->erx_data.erxd_dd = 0;
1651 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
1652 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start];
1653
1654 rxd->nqrx_data.nrxd_paddr =
1655 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1656 /* Currently, split header is not supported. */
1657 rxd->nqrx_data.nrxd_haddr = 0;
1658 } else {
1659 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start];
1660
1661 wm_set_dma_addr(&rxd->wrx_addr,
1662 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1663 rxd->wrx_len = 0;
1664 rxd->wrx_cksum = 0;
1665 rxd->wrx_status = 0;
1666 rxd->wrx_errors = 0;
1667 rxd->wrx_special = 0;
1668 }
1669 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1670
1671 CSR_WRITE(sc, rxq->rxq_rdt_reg, start);
1672 }
1673
1674 /*
1675 * Device driver interface functions and commonly used functions.
1676 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
1677 */
1678
1679 /* Lookup supported device table */
1680 static const struct wm_product *
1681 wm_lookup(const struct pci_attach_args *pa)
1682 {
1683 const struct wm_product *wmp;
1684
1685 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
1686 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
1687 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
1688 return wmp;
1689 }
1690 return NULL;
1691 }
1692
1693 /* The match function (ca_match) */
1694 static int
1695 wm_match(device_t parent, cfdata_t cf, void *aux)
1696 {
1697 struct pci_attach_args *pa = aux;
1698
1699 if (wm_lookup(pa) != NULL)
1700 return 1;
1701
1702 return 0;
1703 }
1704
1705 /* The attach function (ca_attach) */
1706 static void
1707 wm_attach(device_t parent, device_t self, void *aux)
1708 {
1709 struct wm_softc *sc = device_private(self);
1710 struct pci_attach_args *pa = aux;
1711 prop_dictionary_t dict;
1712 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1713 pci_chipset_tag_t pc = pa->pa_pc;
1714 int counts[PCI_INTR_TYPE_SIZE];
1715 pci_intr_type_t max_type;
1716 const char *eetype, *xname;
1717 bus_space_tag_t memt;
1718 bus_space_handle_t memh;
1719 bus_size_t memsize;
1720 int memh_valid;
1721 int i, error;
1722 const struct wm_product *wmp;
1723 prop_data_t ea;
1724 prop_number_t pn;
1725 uint8_t enaddr[ETHER_ADDR_LEN];
1726 char buf[256];
1727 uint16_t cfg1, cfg2, swdpin, nvmword;
1728 pcireg_t preg, memtype;
1729 uint16_t eeprom_data, apme_mask;
1730 bool force_clear_smbi;
1731 uint32_t link_mode;
1732 uint32_t reg;
1733
1734 sc->sc_dev = self;
1735 callout_init(&sc->sc_tick_ch, CALLOUT_FLAGS);
1736 sc->sc_core_stopping = false;
1737
1738 wmp = wm_lookup(pa);
1739 #ifdef DIAGNOSTIC
1740 if (wmp == NULL) {
1741 printf("\n");
1742 panic("wm_attach: impossible");
1743 }
1744 #endif
1745 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags);
1746
1747 sc->sc_pc = pa->pa_pc;
1748 sc->sc_pcitag = pa->pa_tag;
1749
1750 if (pci_dma64_available(pa))
1751 sc->sc_dmat = pa->pa_dmat64;
1752 else
1753 sc->sc_dmat = pa->pa_dmat;
1754
1755 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id);
1756 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG));
1757 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1);
1758
1759 sc->sc_type = wmp->wmp_type;
1760
1761 /* Set default function pointers */
1762 sc->phy.acquire = sc->nvm.acquire = wm_get_null;
1763 sc->phy.release = sc->nvm.release = wm_put_null;
1764 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000;
1765
1766 if (sc->sc_type < WM_T_82543) {
1767 if (sc->sc_rev < 2) {
1768 aprint_error_dev(sc->sc_dev,
1769 "i82542 must be at least rev. 2\n");
1770 return;
1771 }
1772 if (sc->sc_rev < 3)
1773 sc->sc_type = WM_T_82542_2_0;
1774 }
1775
1776 /*
1777 * Disable MSI for Errata:
1778 * "Message Signaled Interrupt Feature May Corrupt Write Transactions"
1779 *
1780 * 82544: Errata 25
1781 * 82540: Errata 6 (easy to reproduce device timeout)
1782 * 82545: Errata 4 (easy to reproduce device timeout)
1783 * 82546: Errata 26 (easy to reproduce device timeout)
1784 * 82541: Errata 7 (easy to reproduce device timeout)
1785 *
1786 * "Byte Enables 2 and 3 are not set on MSI writes"
1787 *
1788 * 82571 & 82572: Errata 63
1789 */
1790 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571)
1791 || (sc->sc_type == WM_T_82572))
1792 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY;
1793
1794 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1795 || (sc->sc_type == WM_T_82580)
1796 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
1797 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
1798 sc->sc_flags |= WM_F_NEWQUEUE;
1799
1800 /* Set device properties (mactype) */
1801 dict = device_properties(sc->sc_dev);
1802 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type);
1803
1804 /*
1805 * Map the device. All devices support memory-mapped acccess,
1806 * and it is really required for normal operation.
1807 */
1808 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
1809 switch (memtype) {
1810 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1811 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1812 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
1813 memtype, 0, &memt, &memh, NULL, &memsize) == 0);
1814 break;
1815 default:
1816 memh_valid = 0;
1817 break;
1818 }
1819
1820 if (memh_valid) {
1821 sc->sc_st = memt;
1822 sc->sc_sh = memh;
1823 sc->sc_ss = memsize;
1824 } else {
1825 aprint_error_dev(sc->sc_dev,
1826 "unable to map device registers\n");
1827 return;
1828 }
1829
1830 /*
1831 * In addition, i82544 and later support I/O mapped indirect
1832 * register access. It is not desirable (nor supported in
1833 * this driver) to use it for normal operation, though it is
1834 * required to work around bugs in some chip versions.
1835 */
1836 if (sc->sc_type >= WM_T_82544) {
1837 /* First we have to find the I/O BAR. */
1838 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) {
1839 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
1840 if (memtype == PCI_MAPREG_TYPE_IO)
1841 break;
1842 if (PCI_MAPREG_MEM_TYPE(memtype) ==
1843 PCI_MAPREG_MEM_TYPE_64BIT)
1844 i += 4; /* skip high bits, too */
1845 }
1846 if (i < PCI_MAPREG_END) {
1847 /*
1848 * We found PCI_MAPREG_TYPE_IO. Note that 82580
1849 * (and newer?) chip has no PCI_MAPREG_TYPE_IO.
1850 * It's no problem because newer chips has no this
1851 * bug.
1852 *
1853 * The i8254x doesn't apparently respond when the
1854 * I/O BAR is 0, which looks somewhat like it's not
1855 * been configured.
1856 */
1857 preg = pci_conf_read(pc, pa->pa_tag, i);
1858 if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
1859 aprint_error_dev(sc->sc_dev,
1860 "WARNING: I/O BAR at zero.\n");
1861 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
1862 0, &sc->sc_iot, &sc->sc_ioh,
1863 NULL, &sc->sc_ios) == 0) {
1864 sc->sc_flags |= WM_F_IOH_VALID;
1865 } else {
1866 aprint_error_dev(sc->sc_dev,
1867 "WARNING: unable to map I/O space\n");
1868 }
1869 }
1870
1871 }
1872
1873 /* Enable bus mastering. Disable MWI on the i82542 2.0. */
1874 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
1875 preg |= PCI_COMMAND_MASTER_ENABLE;
1876 if (sc->sc_type < WM_T_82542_2_1)
1877 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
1878 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
1879
1880 /* power up chip */
1881 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self,
1882 NULL)) && error != EOPNOTSUPP) {
1883 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error);
1884 return;
1885 }
1886
1887 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag));
1888 /*
1889 * Don't use MSI-X if we can use only one queue to save interrupt
1890 * resource.
1891 */
1892 if (sc->sc_nqueues > 1) {
1893 max_type = PCI_INTR_TYPE_MSIX;
1894 /*
1895 * 82583 has a MSI-X capability in the PCI configuration space
1896 * but it doesn't support it. At least the document doesn't
1897 * say anything about MSI-X.
1898 */
1899 counts[PCI_INTR_TYPE_MSIX]
1900 = (sc->sc_type == WM_T_82583) ? 0 : sc->sc_nqueues + 1;
1901 } else {
1902 max_type = PCI_INTR_TYPE_MSI;
1903 counts[PCI_INTR_TYPE_MSIX] = 0;
1904 }
1905
1906 /* Allocation settings */
1907 counts[PCI_INTR_TYPE_MSI] = 1;
1908 counts[PCI_INTR_TYPE_INTX] = 1;
1909 /* overridden by disable flags */
1910 if (wm_disable_msi != 0) {
1911 counts[PCI_INTR_TYPE_MSI] = 0;
1912 if (wm_disable_msix != 0) {
1913 max_type = PCI_INTR_TYPE_INTX;
1914 counts[PCI_INTR_TYPE_MSIX] = 0;
1915 }
1916 } else if (wm_disable_msix != 0) {
1917 max_type = PCI_INTR_TYPE_MSI;
1918 counts[PCI_INTR_TYPE_MSIX] = 0;
1919 }
1920
1921 alloc_retry:
1922 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) {
1923 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n");
1924 return;
1925 }
1926
1927 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) {
1928 error = wm_setup_msix(sc);
1929 if (error) {
1930 pci_intr_release(pc, sc->sc_intrs,
1931 counts[PCI_INTR_TYPE_MSIX]);
1932
1933 /* Setup for MSI: Disable MSI-X */
1934 max_type = PCI_INTR_TYPE_MSI;
1935 counts[PCI_INTR_TYPE_MSI] = 1;
1936 counts[PCI_INTR_TYPE_INTX] = 1;
1937 goto alloc_retry;
1938 }
1939 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) {
1940 wm_adjust_qnum(sc, 0); /* must not use multiqueue */
1941 error = wm_setup_legacy(sc);
1942 if (error) {
1943 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1944 counts[PCI_INTR_TYPE_MSI]);
1945
1946 /* The next try is for INTx: Disable MSI */
1947 max_type = PCI_INTR_TYPE_INTX;
1948 counts[PCI_INTR_TYPE_INTX] = 1;
1949 goto alloc_retry;
1950 }
1951 } else {
1952 wm_adjust_qnum(sc, 0); /* must not use multiqueue */
1953 error = wm_setup_legacy(sc);
1954 if (error) {
1955 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1956 counts[PCI_INTR_TYPE_INTX]);
1957 return;
1958 }
1959 }
1960
1961 /*
1962 * Check the function ID (unit number of the chip).
1963 */
1964 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3)
1965 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003)
1966 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1967 || (sc->sc_type == WM_T_82580)
1968 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
1969 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS)
1970 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK;
1971 else
1972 sc->sc_funcid = 0;
1973
1974 /*
1975 * Determine a few things about the bus we're connected to.
1976 */
1977 if (sc->sc_type < WM_T_82543) {
1978 /* We don't really know the bus characteristics here. */
1979 sc->sc_bus_speed = 33;
1980 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) {
1981 /*
1982 * CSA (Communication Streaming Architecture) is about as fast
1983 * a 32-bit 66MHz PCI Bus.
1984 */
1985 sc->sc_flags |= WM_F_CSA;
1986 sc->sc_bus_speed = 66;
1987 aprint_verbose_dev(sc->sc_dev,
1988 "Communication Streaming Architecture\n");
1989 if (sc->sc_type == WM_T_82547) {
1990 callout_init(&sc->sc_txfifo_ch, CALLOUT_FLAGS);
1991 callout_setfunc(&sc->sc_txfifo_ch,
1992 wm_82547_txfifo_stall, sc);
1993 aprint_verbose_dev(sc->sc_dev,
1994 "using 82547 Tx FIFO stall work-around\n");
1995 }
1996 } else if (sc->sc_type >= WM_T_82571) {
1997 sc->sc_flags |= WM_F_PCIE;
1998 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
1999 && (sc->sc_type != WM_T_ICH10)
2000 && (sc->sc_type != WM_T_PCH)
2001 && (sc->sc_type != WM_T_PCH2)
2002 && (sc->sc_type != WM_T_PCH_LPT)
2003 && (sc->sc_type != WM_T_PCH_SPT)
2004 && (sc->sc_type != WM_T_PCH_CNP)) {
2005 /* ICH* and PCH* have no PCIe capability registers */
2006 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2007 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff,
2008 NULL) == 0)
2009 aprint_error_dev(sc->sc_dev,
2010 "unable to find PCIe capability\n");
2011 }
2012 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n");
2013 } else {
2014 reg = CSR_READ(sc, WMREG_STATUS);
2015 if (reg & STATUS_BUS64)
2016 sc->sc_flags |= WM_F_BUS64;
2017 if ((reg & STATUS_PCIX_MODE) != 0) {
2018 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb;
2019
2020 sc->sc_flags |= WM_F_PCIX;
2021 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
2022 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0)
2023 aprint_error_dev(sc->sc_dev,
2024 "unable to find PCIX capability\n");
2025 else if (sc->sc_type != WM_T_82545_3 &&
2026 sc->sc_type != WM_T_82546_3) {
2027 /*
2028 * Work around a problem caused by the BIOS
2029 * setting the max memory read byte count
2030 * incorrectly.
2031 */
2032 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag,
2033 sc->sc_pcixe_capoff + PCIX_CMD);
2034 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag,
2035 sc->sc_pcixe_capoff + PCIX_STATUS);
2036
2037 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >>
2038 PCIX_CMD_BYTECNT_SHIFT;
2039 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >>
2040 PCIX_STATUS_MAXB_SHIFT;
2041 if (bytecnt > maxb) {
2042 aprint_verbose_dev(sc->sc_dev,
2043 "resetting PCI-X MMRBC: %d -> %d\n",
2044 512 << bytecnt, 512 << maxb);
2045 pcix_cmd = (pcix_cmd &
2046 ~PCIX_CMD_BYTECNT_MASK) |
2047 (maxb << PCIX_CMD_BYTECNT_SHIFT);
2048 pci_conf_write(pa->pa_pc, pa->pa_tag,
2049 sc->sc_pcixe_capoff + PCIX_CMD,
2050 pcix_cmd);
2051 }
2052 }
2053 }
2054 /*
2055 * The quad port adapter is special; it has a PCIX-PCIX
2056 * bridge on the board, and can run the secondary bus at
2057 * a higher speed.
2058 */
2059 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) {
2060 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120
2061 : 66;
2062 } else if (sc->sc_flags & WM_F_PCIX) {
2063 switch (reg & STATUS_PCIXSPD_MASK) {
2064 case STATUS_PCIXSPD_50_66:
2065 sc->sc_bus_speed = 66;
2066 break;
2067 case STATUS_PCIXSPD_66_100:
2068 sc->sc_bus_speed = 100;
2069 break;
2070 case STATUS_PCIXSPD_100_133:
2071 sc->sc_bus_speed = 133;
2072 break;
2073 default:
2074 aprint_error_dev(sc->sc_dev,
2075 "unknown PCIXSPD %d; assuming 66MHz\n",
2076 reg & STATUS_PCIXSPD_MASK);
2077 sc->sc_bus_speed = 66;
2078 break;
2079 }
2080 } else
2081 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33;
2082 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n",
2083 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
2084 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI");
2085 }
2086
2087 /* Disable ASPM L0s and/or L1 for workaround */
2088 wm_disable_aspm(sc);
2089
2090 /* clear interesting stat counters */
2091 CSR_READ(sc, WMREG_COLC);
2092 CSR_READ(sc, WMREG_RXERRC);
2093
2094 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)
2095 || (sc->sc_type >= WM_T_ICH8))
2096 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2097 if (sc->sc_type >= WM_T_ICH8)
2098 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2099
2100 /* Set PHY, NVM mutex related stuff */
2101 switch (sc->sc_type) {
2102 case WM_T_82542_2_0:
2103 case WM_T_82542_2_1:
2104 case WM_T_82543:
2105 case WM_T_82544:
2106 /* Microwire */
2107 sc->nvm.read = wm_nvm_read_uwire;
2108 sc->sc_nvm_wordsize = 64;
2109 sc->sc_nvm_addrbits = 6;
2110 break;
2111 case WM_T_82540:
2112 case WM_T_82545:
2113 case WM_T_82545_3:
2114 case WM_T_82546:
2115 case WM_T_82546_3:
2116 /* Microwire */
2117 sc->nvm.read = wm_nvm_read_uwire;
2118 reg = CSR_READ(sc, WMREG_EECD);
2119 if (reg & EECD_EE_SIZE) {
2120 sc->sc_nvm_wordsize = 256;
2121 sc->sc_nvm_addrbits = 8;
2122 } else {
2123 sc->sc_nvm_wordsize = 64;
2124 sc->sc_nvm_addrbits = 6;
2125 }
2126 sc->sc_flags |= WM_F_LOCK_EECD;
2127 sc->nvm.acquire = wm_get_eecd;
2128 sc->nvm.release = wm_put_eecd;
2129 break;
2130 case WM_T_82541:
2131 case WM_T_82541_2:
2132 case WM_T_82547:
2133 case WM_T_82547_2:
2134 reg = CSR_READ(sc, WMREG_EECD);
2135 /*
2136 * wm_nvm_set_addrbits_size_eecd() accesses SPI in it only
2137 * on 8254[17], so set flags and functios before calling it.
2138 */
2139 sc->sc_flags |= WM_F_LOCK_EECD;
2140 sc->nvm.acquire = wm_get_eecd;
2141 sc->nvm.release = wm_put_eecd;
2142 if (reg & EECD_EE_TYPE) {
2143 /* SPI */
2144 sc->nvm.read = wm_nvm_read_spi;
2145 sc->sc_flags |= WM_F_EEPROM_SPI;
2146 wm_nvm_set_addrbits_size_eecd(sc);
2147 } else {
2148 /* Microwire */
2149 sc->nvm.read = wm_nvm_read_uwire;
2150 if ((reg & EECD_EE_ABITS) != 0) {
2151 sc->sc_nvm_wordsize = 256;
2152 sc->sc_nvm_addrbits = 8;
2153 } else {
2154 sc->sc_nvm_wordsize = 64;
2155 sc->sc_nvm_addrbits = 6;
2156 }
2157 }
2158 break;
2159 case WM_T_82571:
2160 case WM_T_82572:
2161 /* SPI */
2162 sc->nvm.read = wm_nvm_read_eerd;
2163 /* Not use WM_F_LOCK_EECD because we use EERD */
2164 sc->sc_flags |= WM_F_EEPROM_SPI;
2165 wm_nvm_set_addrbits_size_eecd(sc);
2166 sc->phy.acquire = wm_get_swsm_semaphore;
2167 sc->phy.release = wm_put_swsm_semaphore;
2168 sc->nvm.acquire = wm_get_nvm_82571;
2169 sc->nvm.release = wm_put_nvm_82571;
2170 break;
2171 case WM_T_82573:
2172 case WM_T_82574:
2173 case WM_T_82583:
2174 sc->nvm.read = wm_nvm_read_eerd;
2175 /* Not use WM_F_LOCK_EECD because we use EERD */
2176 if (sc->sc_type == WM_T_82573) {
2177 sc->phy.acquire = wm_get_swsm_semaphore;
2178 sc->phy.release = wm_put_swsm_semaphore;
2179 sc->nvm.acquire = wm_get_nvm_82571;
2180 sc->nvm.release = wm_put_nvm_82571;
2181 } else {
2182 /* Both PHY and NVM use the same semaphore. */
2183 sc->phy.acquire = sc->nvm.acquire
2184 = wm_get_swfwhw_semaphore;
2185 sc->phy.release = sc->nvm.release
2186 = wm_put_swfwhw_semaphore;
2187 }
2188 if (wm_nvm_is_onboard_eeprom(sc) == 0) {
2189 sc->sc_flags |= WM_F_EEPROM_FLASH;
2190 sc->sc_nvm_wordsize = 2048;
2191 } else {
2192 /* SPI */
2193 sc->sc_flags |= WM_F_EEPROM_SPI;
2194 wm_nvm_set_addrbits_size_eecd(sc);
2195 }
2196 break;
2197 case WM_T_82575:
2198 case WM_T_82576:
2199 case WM_T_82580:
2200 case WM_T_I350:
2201 case WM_T_I354:
2202 case WM_T_80003:
2203 /* SPI */
2204 sc->sc_flags |= WM_F_EEPROM_SPI;
2205 wm_nvm_set_addrbits_size_eecd(sc);
2206 if((sc->sc_type == WM_T_80003)
2207 || (sc->sc_nvm_wordsize < (1 << 15))) {
2208 sc->nvm.read = wm_nvm_read_eerd;
2209 /* Don't use WM_F_LOCK_EECD because we use EERD */
2210 } else {
2211 sc->nvm.read = wm_nvm_read_spi;
2212 sc->sc_flags |= WM_F_LOCK_EECD;
2213 }
2214 sc->phy.acquire = wm_get_phy_82575;
2215 sc->phy.release = wm_put_phy_82575;
2216 sc->nvm.acquire = wm_get_nvm_80003;
2217 sc->nvm.release = wm_put_nvm_80003;
2218 break;
2219 case WM_T_ICH8:
2220 case WM_T_ICH9:
2221 case WM_T_ICH10:
2222 case WM_T_PCH:
2223 case WM_T_PCH2:
2224 case WM_T_PCH_LPT:
2225 sc->nvm.read = wm_nvm_read_ich8;
2226 /* FLASH */
2227 sc->sc_flags |= WM_F_EEPROM_FLASH;
2228 sc->sc_nvm_wordsize = 2048;
2229 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH);
2230 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0,
2231 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) {
2232 aprint_error_dev(sc->sc_dev,
2233 "can't map FLASH registers\n");
2234 goto out;
2235 }
2236 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG);
2237 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) *
2238 ICH_FLASH_SECTOR_SIZE;
2239 sc->sc_ich8_flash_bank_size =
2240 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1;
2241 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK);
2242 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
2243 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t);
2244 sc->sc_flashreg_offset = 0;
2245 sc->phy.acquire = wm_get_swflag_ich8lan;
2246 sc->phy.release = wm_put_swflag_ich8lan;
2247 sc->nvm.acquire = wm_get_nvm_ich8lan;
2248 sc->nvm.release = wm_put_nvm_ich8lan;
2249 break;
2250 case WM_T_PCH_SPT:
2251 case WM_T_PCH_CNP:
2252 sc->nvm.read = wm_nvm_read_spt;
2253 /* SPT has no GFPREG; flash registers mapped through BAR0 */
2254 sc->sc_flags |= WM_F_EEPROM_FLASH;
2255 sc->sc_flasht = sc->sc_st;
2256 sc->sc_flashh = sc->sc_sh;
2257 sc->sc_ich8_flash_base = 0;
2258 sc->sc_nvm_wordsize =
2259 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1)
2260 * NVM_SIZE_MULTIPLIER;
2261 /* It is size in bytes, we want words */
2262 sc->sc_nvm_wordsize /= 2;
2263 /* assume 2 banks */
2264 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2;
2265 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET;
2266 sc->phy.acquire = wm_get_swflag_ich8lan;
2267 sc->phy.release = wm_put_swflag_ich8lan;
2268 sc->nvm.acquire = wm_get_nvm_ich8lan;
2269 sc->nvm.release = wm_put_nvm_ich8lan;
2270 break;
2271 case WM_T_I210:
2272 case WM_T_I211:
2273 /* Allow a single clear of the SW semaphore on I210 and newer*/
2274 sc->sc_flags |= WM_F_WA_I210_CLSEM;
2275 if (wm_nvm_flash_presence_i210(sc)) {
2276 sc->nvm.read = wm_nvm_read_eerd;
2277 /* Don't use WM_F_LOCK_EECD because we use EERD */
2278 sc->sc_flags |= WM_F_EEPROM_FLASH_HW;
2279 wm_nvm_set_addrbits_size_eecd(sc);
2280 } else {
2281 sc->nvm.read = wm_nvm_read_invm;
2282 sc->sc_flags |= WM_F_EEPROM_INVM;
2283 sc->sc_nvm_wordsize = INVM_SIZE;
2284 }
2285 sc->phy.acquire = wm_get_phy_82575;
2286 sc->phy.release = wm_put_phy_82575;
2287 sc->nvm.acquire = wm_get_nvm_80003;
2288 sc->nvm.release = wm_put_nvm_80003;
2289 break;
2290 default:
2291 break;
2292 }
2293
2294 /* Ensure the SMBI bit is clear before first NVM or PHY access */
2295 switch (sc->sc_type) {
2296 case WM_T_82571:
2297 case WM_T_82572:
2298 reg = CSR_READ(sc, WMREG_SWSM2);
2299 if ((reg & SWSM2_LOCK) == 0) {
2300 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK);
2301 force_clear_smbi = true;
2302 } else
2303 force_clear_smbi = false;
2304 break;
2305 case WM_T_82573:
2306 case WM_T_82574:
2307 case WM_T_82583:
2308 force_clear_smbi = true;
2309 break;
2310 default:
2311 force_clear_smbi = false;
2312 break;
2313 }
2314 if (force_clear_smbi) {
2315 reg = CSR_READ(sc, WMREG_SWSM);
2316 if ((reg & SWSM_SMBI) != 0)
2317 aprint_error_dev(sc->sc_dev,
2318 "Please update the Bootagent\n");
2319 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI);
2320 }
2321
2322 /*
2323 * Defer printing the EEPROM type until after verifying the checksum
2324 * This allows the EEPROM type to be printed correctly in the case
2325 * that no EEPROM is attached.
2326 */
2327 /*
2328 * Validate the EEPROM checksum. If the checksum fails, flag
2329 * this for later, so we can fail future reads from the EEPROM.
2330 */
2331 if (wm_nvm_validate_checksum(sc)) {
2332 /*
2333 * Read twice again because some PCI-e parts fail the
2334 * first check due to the link being in sleep state.
2335 */
2336 if (wm_nvm_validate_checksum(sc))
2337 sc->sc_flags |= WM_F_EEPROM_INVALID;
2338 }
2339
2340 if (sc->sc_flags & WM_F_EEPROM_INVALID)
2341 aprint_verbose_dev(sc->sc_dev, "No EEPROM");
2342 else {
2343 aprint_verbose_dev(sc->sc_dev, "%u words ",
2344 sc->sc_nvm_wordsize);
2345 if (sc->sc_flags & WM_F_EEPROM_INVM)
2346 aprint_verbose("iNVM");
2347 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW)
2348 aprint_verbose("FLASH(HW)");
2349 else if (sc->sc_flags & WM_F_EEPROM_FLASH)
2350 aprint_verbose("FLASH");
2351 else {
2352 if (sc->sc_flags & WM_F_EEPROM_SPI)
2353 eetype = "SPI";
2354 else
2355 eetype = "MicroWire";
2356 aprint_verbose("(%d address bits) %s EEPROM",
2357 sc->sc_nvm_addrbits, eetype);
2358 }
2359 }
2360 wm_nvm_version(sc);
2361 aprint_verbose("\n");
2362
2363 /*
2364 * XXX The first call of wm_gmii_setup_phytype. The result might be
2365 * incorrect.
2366 */
2367 wm_gmii_setup_phytype(sc, 0, 0);
2368
2369 /* Reset the chip to a known state. */
2370 wm_reset(sc);
2371
2372 /*
2373 * Check for I21[01] PLL workaround.
2374 *
2375 * Three cases:
2376 * a) Chip is I211.
2377 * b) Chip is I210 and it uses INVM (not FLASH).
2378 * c) Chip is I210 (and it uses FLASH) and the NVM image version < 3.25
2379 */
2380 if (sc->sc_type == WM_T_I211)
2381 sc->sc_flags |= WM_F_PLL_WA_I210;
2382 if (sc->sc_type == WM_T_I210) {
2383 if (!wm_nvm_flash_presence_i210(sc))
2384 sc->sc_flags |= WM_F_PLL_WA_I210;
2385 else if ((sc->sc_nvm_ver_major < 3)
2386 || ((sc->sc_nvm_ver_major == 3)
2387 && (sc->sc_nvm_ver_minor < 25))) {
2388 aprint_verbose_dev(sc->sc_dev,
2389 "ROM image version %d.%d is older than 3.25\n",
2390 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor);
2391 sc->sc_flags |= WM_F_PLL_WA_I210;
2392 }
2393 }
2394 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
2395 wm_pll_workaround_i210(sc);
2396
2397 wm_get_wakeup(sc);
2398
2399 /* Non-AMT based hardware can now take control from firmware */
2400 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
2401 wm_get_hw_control(sc);
2402
2403 /*
2404 * Read the Ethernet address from the EEPROM, if not first found
2405 * in device properties.
2406 */
2407 ea = prop_dictionary_get(dict, "mac-address");
2408 if (ea != NULL) {
2409 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA);
2410 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN);
2411 memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN);
2412 } else {
2413 if (wm_read_mac_addr(sc, enaddr) != 0) {
2414 aprint_error_dev(sc->sc_dev,
2415 "unable to read Ethernet address\n");
2416 goto out;
2417 }
2418 }
2419
2420 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
2421 ether_sprintf(enaddr));
2422
2423 /*
2424 * Read the config info from the EEPROM, and set up various
2425 * bits in the control registers based on their contents.
2426 */
2427 pn = prop_dictionary_get(dict, "i82543-cfg1");
2428 if (pn != NULL) {
2429 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2430 cfg1 = (uint16_t) prop_number_integer_value(pn);
2431 } else {
2432 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) {
2433 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n");
2434 goto out;
2435 }
2436 }
2437
2438 pn = prop_dictionary_get(dict, "i82543-cfg2");
2439 if (pn != NULL) {
2440 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2441 cfg2 = (uint16_t) prop_number_integer_value(pn);
2442 } else {
2443 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) {
2444 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n");
2445 goto out;
2446 }
2447 }
2448
2449 /* check for WM_F_WOL */
2450 switch (sc->sc_type) {
2451 case WM_T_82542_2_0:
2452 case WM_T_82542_2_1:
2453 case WM_T_82543:
2454 /* dummy? */
2455 eeprom_data = 0;
2456 apme_mask = NVM_CFG3_APME;
2457 break;
2458 case WM_T_82544:
2459 apme_mask = NVM_CFG2_82544_APM_EN;
2460 eeprom_data = cfg2;
2461 break;
2462 case WM_T_82546:
2463 case WM_T_82546_3:
2464 case WM_T_82571:
2465 case WM_T_82572:
2466 case WM_T_82573:
2467 case WM_T_82574:
2468 case WM_T_82583:
2469 case WM_T_80003:
2470 default:
2471 apme_mask = NVM_CFG3_APME;
2472 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB
2473 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2474 break;
2475 case WM_T_82575:
2476 case WM_T_82576:
2477 case WM_T_82580:
2478 case WM_T_I350:
2479 case WM_T_I354: /* XXX ok? */
2480 case WM_T_ICH8:
2481 case WM_T_ICH9:
2482 case WM_T_ICH10:
2483 case WM_T_PCH:
2484 case WM_T_PCH2:
2485 case WM_T_PCH_LPT:
2486 case WM_T_PCH_SPT:
2487 case WM_T_PCH_CNP:
2488 /* XXX The funcid should be checked on some devices */
2489 apme_mask = WUC_APME;
2490 eeprom_data = CSR_READ(sc, WMREG_WUC);
2491 break;
2492 }
2493
2494 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */
2495 if ((eeprom_data & apme_mask) != 0)
2496 sc->sc_flags |= WM_F_WOL;
2497
2498 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) {
2499 /* Check NVM for autonegotiation */
2500 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) {
2501 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) != 0)
2502 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO;
2503 }
2504 }
2505
2506 /*
2507 * XXX need special handling for some multiple port cards
2508 * to disable a paticular port.
2509 */
2510
2511 if (sc->sc_type >= WM_T_82544) {
2512 pn = prop_dictionary_get(dict, "i82543-swdpin");
2513 if (pn != NULL) {
2514 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2515 swdpin = (uint16_t) prop_number_integer_value(pn);
2516 } else {
2517 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) {
2518 aprint_error_dev(sc->sc_dev,
2519 "unable to read SWDPIN\n");
2520 goto out;
2521 }
2522 }
2523 }
2524
2525 if (cfg1 & NVM_CFG1_ILOS)
2526 sc->sc_ctrl |= CTRL_ILOS;
2527
2528 /*
2529 * XXX
2530 * This code isn't correct because pin 2 and 3 are located
2531 * in different position on newer chips. Check all datasheet.
2532 *
2533 * Until resolve this problem, check if a chip < 82580
2534 */
2535 if (sc->sc_type <= WM_T_82580) {
2536 if (sc->sc_type >= WM_T_82544) {
2537 sc->sc_ctrl |=
2538 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
2539 CTRL_SWDPIO_SHIFT;
2540 sc->sc_ctrl |=
2541 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
2542 CTRL_SWDPINS_SHIFT;
2543 } else {
2544 sc->sc_ctrl |=
2545 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) <<
2546 CTRL_SWDPIO_SHIFT;
2547 }
2548 }
2549
2550 /* XXX For other than 82580? */
2551 if (sc->sc_type == WM_T_82580) {
2552 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &nvmword);
2553 if (nvmword & __BIT(13))
2554 sc->sc_ctrl |= CTRL_ILOS;
2555 }
2556
2557 #if 0
2558 if (sc->sc_type >= WM_T_82544) {
2559 if (cfg1 & NVM_CFG1_IPS0)
2560 sc->sc_ctrl_ext |= CTRL_EXT_IPS;
2561 if (cfg1 & NVM_CFG1_IPS1)
2562 sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
2563 sc->sc_ctrl_ext |=
2564 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
2565 CTRL_EXT_SWDPIO_SHIFT;
2566 sc->sc_ctrl_ext |=
2567 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
2568 CTRL_EXT_SWDPINS_SHIFT;
2569 } else {
2570 sc->sc_ctrl_ext |=
2571 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) <<
2572 CTRL_EXT_SWDPIO_SHIFT;
2573 }
2574 #endif
2575
2576 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2577 #if 0
2578 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
2579 #endif
2580
2581 if (sc->sc_type == WM_T_PCH) {
2582 uint16_t val;
2583
2584 /* Save the NVM K1 bit setting */
2585 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val);
2586
2587 if ((val & NVM_K1_CONFIG_ENABLE) != 0)
2588 sc->sc_nvm_k1_enabled = 1;
2589 else
2590 sc->sc_nvm_k1_enabled = 0;
2591 }
2592
2593 /* Determine if we're GMII, TBI, SERDES or SGMII mode */
2594 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9
2595 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH
2596 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT
2597 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_PCH_CNP
2598 || sc->sc_type == WM_T_82573
2599 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) {
2600 /* Copper only */
2601 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2602 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350)
2603 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210)
2604 || (sc->sc_type ==WM_T_I211)) {
2605 reg = CSR_READ(sc, WMREG_CTRL_EXT);
2606 link_mode = reg & CTRL_EXT_LINK_MODE_MASK;
2607 switch (link_mode) {
2608 case CTRL_EXT_LINK_MODE_1000KX:
2609 aprint_verbose_dev(sc->sc_dev, "1000KX\n");
2610 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2611 break;
2612 case CTRL_EXT_LINK_MODE_SGMII:
2613 if (wm_sgmii_uses_mdio(sc)) {
2614 aprint_verbose_dev(sc->sc_dev,
2615 "SGMII(MDIO)\n");
2616 sc->sc_flags |= WM_F_SGMII;
2617 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2618 break;
2619 }
2620 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n");
2621 /*FALLTHROUGH*/
2622 case CTRL_EXT_LINK_MODE_PCIE_SERDES:
2623 sc->sc_mediatype = wm_sfp_get_media_type(sc);
2624 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) {
2625 if (link_mode
2626 == CTRL_EXT_LINK_MODE_SGMII) {
2627 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2628 sc->sc_flags |= WM_F_SGMII;
2629 } else {
2630 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2631 aprint_verbose_dev(sc->sc_dev,
2632 "SERDES\n");
2633 }
2634 break;
2635 }
2636 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
2637 aprint_verbose_dev(sc->sc_dev, "SERDES\n");
2638
2639 /* Change current link mode setting */
2640 reg &= ~CTRL_EXT_LINK_MODE_MASK;
2641 switch (sc->sc_mediatype) {
2642 case WM_MEDIATYPE_COPPER:
2643 reg |= CTRL_EXT_LINK_MODE_SGMII;
2644 break;
2645 case WM_MEDIATYPE_SERDES:
2646 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES;
2647 break;
2648 default:
2649 break;
2650 }
2651 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2652 break;
2653 case CTRL_EXT_LINK_MODE_GMII:
2654 default:
2655 aprint_verbose_dev(sc->sc_dev, "Copper\n");
2656 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2657 break;
2658 }
2659
2660 reg &= ~CTRL_EXT_I2C_ENA;
2661 if ((sc->sc_flags & WM_F_SGMII) != 0)
2662 reg |= CTRL_EXT_I2C_ENA;
2663 else
2664 reg &= ~CTRL_EXT_I2C_ENA;
2665 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2666 } else if (sc->sc_type < WM_T_82543 ||
2667 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
2668 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2669 aprint_error_dev(sc->sc_dev,
2670 "WARNING: TBIMODE set on 1000BASE-T product!\n");
2671 sc->sc_mediatype = WM_MEDIATYPE_FIBER;
2672 }
2673 } else {
2674 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) {
2675 aprint_error_dev(sc->sc_dev,
2676 "WARNING: TBIMODE clear on 1000BASE-X product!\n");
2677 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2678 }
2679 }
2680 snprintb(buf, sizeof(buf), WM_FLAGS, sc->sc_flags);
2681 aprint_verbose_dev(sc->sc_dev, "%s\n", buf);
2682
2683 /* Set device properties (macflags) */
2684 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags);
2685
2686 /* Initialize the media structures accordingly. */
2687 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2688 wm_gmii_mediainit(sc, wmp->wmp_product);
2689 else
2690 wm_tbi_mediainit(sc); /* All others */
2691
2692 ifp = &sc->sc_ethercom.ec_if;
2693 xname = device_xname(sc->sc_dev);
2694 strlcpy(ifp->if_xname, xname, IFNAMSIZ);
2695 ifp->if_softc = sc;
2696 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2697 #ifdef WM_MPSAFE
2698 ifp->if_extflags = IFEF_MPSAFE;
2699 #endif
2700 ifp->if_ioctl = wm_ioctl;
2701 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
2702 ifp->if_start = wm_nq_start;
2703 /*
2704 * When the number of CPUs is one and the controller can use
2705 * MSI-X, wm(4) use MSI-X but *does not* use multiqueue.
2706 * That is, wm(4) use two interrupts, one is used for Tx/Rx
2707 * and the other is used for link status changing.
2708 * In this situation, wm_nq_transmit() is disadvantageous
2709 * because of wm_select_txqueue() and pcq(9) overhead.
2710 */
2711 if (wm_is_using_multiqueue(sc))
2712 ifp->if_transmit = wm_nq_transmit;
2713 } else {
2714 ifp->if_start = wm_start;
2715 /*
2716 * wm_transmit() has the same disadvantage as wm_transmit().
2717 */
2718 if (wm_is_using_multiqueue(sc))
2719 ifp->if_transmit = wm_transmit;
2720 }
2721 /* wm(4) doest not use ifp->if_watchdog, use wm_tick as watchdog. */
2722 ifp->if_init = wm_init;
2723 ifp->if_stop = wm_stop;
2724 IFQ_SET_MAXLEN(&ifp->if_snd, max(WM_IFQUEUELEN, IFQ_MAXLEN));
2725 IFQ_SET_READY(&ifp->if_snd);
2726
2727 /* Check for jumbo frame */
2728 switch (sc->sc_type) {
2729 case WM_T_82573:
2730 /* XXX limited to 9234 if ASPM is disabled */
2731 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword);
2732 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0)
2733 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2734 break;
2735 case WM_T_82571:
2736 case WM_T_82572:
2737 case WM_T_82574:
2738 case WM_T_82583:
2739 case WM_T_82575:
2740 case WM_T_82576:
2741 case WM_T_82580:
2742 case WM_T_I350:
2743 case WM_T_I354:
2744 case WM_T_I210:
2745 case WM_T_I211:
2746 case WM_T_80003:
2747 case WM_T_ICH9:
2748 case WM_T_ICH10:
2749 case WM_T_PCH2: /* PCH2 supports 9K frame size */
2750 case WM_T_PCH_LPT:
2751 case WM_T_PCH_SPT:
2752 case WM_T_PCH_CNP:
2753 /* XXX limited to 9234 */
2754 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2755 break;
2756 case WM_T_PCH:
2757 /* XXX limited to 4096 */
2758 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2759 break;
2760 case WM_T_82542_2_0:
2761 case WM_T_82542_2_1:
2762 case WM_T_ICH8:
2763 /* No support for jumbo frame */
2764 break;
2765 default:
2766 /* ETHER_MAX_LEN_JUMBO */
2767 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2768 break;
2769 }
2770
2771 /* If we're a i82543 or greater, we can support VLANs. */
2772 if (sc->sc_type >= WM_T_82543)
2773 sc->sc_ethercom.ec_capabilities |=
2774 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING;
2775
2776 /*
2777 * We can perform TCPv4 and UDPv4 checkums in-bound. Only
2778 * on i82543 and later.
2779 */
2780 if (sc->sc_type >= WM_T_82543) {
2781 ifp->if_capabilities |=
2782 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
2783 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
2784 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
2785 IFCAP_CSUM_TCPv6_Tx |
2786 IFCAP_CSUM_UDPv6_Tx;
2787 }
2788
2789 /*
2790 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL.
2791 *
2792 * 82541GI (8086:1076) ... no
2793 * 82572EI (8086:10b9) ... yes
2794 */
2795 if (sc->sc_type >= WM_T_82571) {
2796 ifp->if_capabilities |=
2797 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
2798 }
2799
2800 /*
2801 * If we're a i82544 or greater (except i82547), we can do
2802 * TCP segmentation offload.
2803 */
2804 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) {
2805 ifp->if_capabilities |= IFCAP_TSOv4;
2806 }
2807
2808 if (sc->sc_type >= WM_T_82571) {
2809 ifp->if_capabilities |= IFCAP_TSOv6;
2810 }
2811
2812 sc->sc_tx_process_limit = WM_TX_PROCESS_LIMIT_DEFAULT;
2813 sc->sc_tx_intr_process_limit = WM_TX_INTR_PROCESS_LIMIT_DEFAULT;
2814 sc->sc_rx_process_limit = WM_RX_PROCESS_LIMIT_DEFAULT;
2815 sc->sc_rx_intr_process_limit = WM_RX_INTR_PROCESS_LIMIT_DEFAULT;
2816
2817 #ifdef WM_MPSAFE
2818 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2819 #else
2820 sc->sc_core_lock = NULL;
2821 #endif
2822
2823 /* Attach the interface. */
2824 error = if_initialize(ifp);
2825 if (error != 0) {
2826 aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
2827 error);
2828 return; /* Error */
2829 }
2830 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if);
2831 ether_ifattach(ifp, enaddr);
2832 if_register(ifp);
2833 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb);
2834 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET,
2835 RND_FLAG_DEFAULT);
2836
2837 #ifdef WM_EVENT_COUNTERS
2838 /* Attach event counters. */
2839 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
2840 NULL, xname, "linkintr");
2841
2842 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC,
2843 NULL, xname, "tx_xoff");
2844 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC,
2845 NULL, xname, "tx_xon");
2846 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC,
2847 NULL, xname, "rx_xoff");
2848 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC,
2849 NULL, xname, "rx_xon");
2850 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC,
2851 NULL, xname, "rx_macctl");
2852 #endif /* WM_EVENT_COUNTERS */
2853
2854 if (pmf_device_register(self, wm_suspend, wm_resume))
2855 pmf_class_network_register(self, ifp);
2856 else
2857 aprint_error_dev(self, "couldn't establish power handler\n");
2858
2859 sc->sc_flags |= WM_F_ATTACHED;
2860 out:
2861 return;
2862 }
2863
2864 /* The detach function (ca_detach) */
2865 static int
2866 wm_detach(device_t self, int flags __unused)
2867 {
2868 struct wm_softc *sc = device_private(self);
2869 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2870 int i;
2871
2872 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
2873 return 0;
2874
2875 /* Stop the interface. Callouts are stopped in it. */
2876 wm_stop(ifp, 1);
2877
2878 pmf_device_deregister(self);
2879
2880 #ifdef WM_EVENT_COUNTERS
2881 evcnt_detach(&sc->sc_ev_linkintr);
2882
2883 evcnt_detach(&sc->sc_ev_tx_xoff);
2884 evcnt_detach(&sc->sc_ev_tx_xon);
2885 evcnt_detach(&sc->sc_ev_rx_xoff);
2886 evcnt_detach(&sc->sc_ev_rx_xon);
2887 evcnt_detach(&sc->sc_ev_rx_macctl);
2888 #endif /* WM_EVENT_COUNTERS */
2889
2890 /* Tell the firmware about the release */
2891 WM_CORE_LOCK(sc);
2892 wm_release_manageability(sc);
2893 wm_release_hw_control(sc);
2894 wm_enable_wakeup(sc);
2895 WM_CORE_UNLOCK(sc);
2896
2897 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
2898
2899 /* Delete all remaining media. */
2900 ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
2901
2902 ether_ifdetach(ifp);
2903 if_detach(ifp);
2904 if_percpuq_destroy(sc->sc_ipq);
2905
2906 /* Unload RX dmamaps and free mbufs */
2907 for (i = 0; i < sc->sc_nqueues; i++) {
2908 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
2909 mutex_enter(rxq->rxq_lock);
2910 wm_rxdrain(rxq);
2911 mutex_exit(rxq->rxq_lock);
2912 }
2913 /* Must unlock here */
2914
2915 /* Disestablish the interrupt handler */
2916 for (i = 0; i < sc->sc_nintrs; i++) {
2917 if (sc->sc_ihs[i] != NULL) {
2918 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
2919 sc->sc_ihs[i] = NULL;
2920 }
2921 }
2922 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs);
2923
2924 wm_free_txrx_queues(sc);
2925
2926 /* Unmap the registers */
2927 if (sc->sc_ss) {
2928 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss);
2929 sc->sc_ss = 0;
2930 }
2931 if (sc->sc_ios) {
2932 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
2933 sc->sc_ios = 0;
2934 }
2935 if (sc->sc_flashs) {
2936 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs);
2937 sc->sc_flashs = 0;
2938 }
2939
2940 if (sc->sc_core_lock)
2941 mutex_obj_free(sc->sc_core_lock);
2942 if (sc->sc_ich_phymtx)
2943 mutex_obj_free(sc->sc_ich_phymtx);
2944 if (sc->sc_ich_nvmmtx)
2945 mutex_obj_free(sc->sc_ich_nvmmtx);
2946
2947 return 0;
2948 }
2949
2950 static bool
2951 wm_suspend(device_t self, const pmf_qual_t *qual)
2952 {
2953 struct wm_softc *sc = device_private(self);
2954
2955 wm_release_manageability(sc);
2956 wm_release_hw_control(sc);
2957 wm_enable_wakeup(sc);
2958
2959 return true;
2960 }
2961
2962 static bool
2963 wm_resume(device_t self, const pmf_qual_t *qual)
2964 {
2965 struct wm_softc *sc = device_private(self);
2966
2967 /* Disable ASPM L0s and/or L1 for workaround */
2968 wm_disable_aspm(sc);
2969 wm_init_manageability(sc);
2970
2971 return true;
2972 }
2973
2974 /*
2975 * wm_watchdog: [ifnet interface function]
2976 *
2977 * Watchdog timer handler.
2978 */
2979 static void
2980 wm_watchdog(struct ifnet *ifp)
2981 {
2982 int qid;
2983 struct wm_softc *sc = ifp->if_softc;
2984 uint16_t hang_queue = 0; /* Max queue number of wm(4) is 82576's 16. */
2985
2986 for (qid = 0; qid < sc->sc_nqueues; qid++) {
2987 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq;
2988
2989 wm_watchdog_txq(ifp, txq, &hang_queue);
2990 }
2991
2992 /*
2993 * IF any of queues hanged up, reset the interface.
2994 */
2995 if (hang_queue != 0) {
2996 (void) wm_init(ifp);
2997
2998 /*
2999 * There are still some upper layer processing which call
3000 * ifp->if_start(). e.g. ALTQ or one CPU system
3001 */
3002 /* Try to get more packets going. */
3003 ifp->if_start(ifp);
3004 }
3005 }
3006
3007
3008 static void
3009 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang)
3010 {
3011
3012 mutex_enter(txq->txq_lock);
3013 if (txq->txq_sending &&
3014 time_uptime - txq->txq_lastsent > wm_watchdog_timeout) {
3015 wm_watchdog_txq_locked(ifp, txq, hang);
3016 }
3017 mutex_exit(txq->txq_lock);
3018 }
3019
3020 static void
3021 wm_watchdog_txq_locked(struct ifnet *ifp, struct wm_txqueue *txq,
3022 uint16_t *hang)
3023 {
3024 struct wm_softc *sc = ifp->if_softc;
3025 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
3026
3027 KASSERT(mutex_owned(txq->txq_lock));
3028
3029 /*
3030 * Since we're using delayed interrupts, sweep up
3031 * before we report an error.
3032 */
3033 wm_txeof(txq, UINT_MAX);
3034
3035 if (txq->txq_sending)
3036 *hang |= __BIT(wmq->wmq_id);
3037
3038 if (txq->txq_free == WM_NTXDESC(txq)) {
3039 log(LOG_ERR, "%s: device timeout (lost interrupt)\n",
3040 device_xname(sc->sc_dev));
3041 } else {
3042 #ifdef WM_DEBUG
3043 int i, j;
3044 struct wm_txsoft *txs;
3045 #endif
3046 log(LOG_ERR,
3047 "%s: device timeout (txfree %d txsfree %d txnext %d)\n",
3048 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree,
3049 txq->txq_next);
3050 ifp->if_oerrors++;
3051 #ifdef WM_DEBUG
3052 for (i = txq->txq_sdirty; i != txq->txq_snext ;
3053 i = WM_NEXTTXS(txq, i)) {
3054 txs = &txq->txq_soft[i];
3055 printf("txs %d tx %d -> %d\n",
3056 i, txs->txs_firstdesc, txs->txs_lastdesc);
3057 for (j = txs->txs_firstdesc; ;
3058 j = WM_NEXTTX(txq, j)) {
3059 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
3060 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3061 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr);
3062 printf("\t %#08x%08x\n",
3063 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields,
3064 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen);
3065 } else {
3066 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
3067 (uint64_t)txq->txq_descs[j].wtx_addr.wa_high << 32 |
3068 txq->txq_descs[j].wtx_addr.wa_low);
3069 printf("\t %#04x%02x%02x%08x\n",
3070 txq->txq_descs[j].wtx_fields.wtxu_vlan,
3071 txq->txq_descs[j].wtx_fields.wtxu_options,
3072 txq->txq_descs[j].wtx_fields.wtxu_status,
3073 txq->txq_descs[j].wtx_cmdlen);
3074 }
3075 if (j == txs->txs_lastdesc)
3076 break;
3077 }
3078 }
3079 #endif
3080 }
3081 }
3082
3083 /*
3084 * wm_tick:
3085 *
3086 * One second timer, used to check link status, sweep up
3087 * completed transmit jobs, etc.
3088 */
3089 static void
3090 wm_tick(void *arg)
3091 {
3092 struct wm_softc *sc = arg;
3093 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3094 #ifndef WM_MPSAFE
3095 int s = splnet();
3096 #endif
3097
3098 WM_CORE_LOCK(sc);
3099
3100 if (sc->sc_core_stopping) {
3101 WM_CORE_UNLOCK(sc);
3102 #ifndef WM_MPSAFE
3103 splx(s);
3104 #endif
3105 return;
3106 }
3107
3108 if (sc->sc_type >= WM_T_82542_2_1) {
3109 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
3110 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
3111 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
3112 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
3113 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
3114 }
3115
3116 ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
3117 ifp->if_ierrors += 0ULL /* ensure quad_t */
3118 + CSR_READ(sc, WMREG_CRCERRS)
3119 + CSR_READ(sc, WMREG_ALGNERRC)
3120 + CSR_READ(sc, WMREG_SYMERRC)
3121 + CSR_READ(sc, WMREG_RXERRC)
3122 + CSR_READ(sc, WMREG_SEC)
3123 + CSR_READ(sc, WMREG_CEXTERR)
3124 + CSR_READ(sc, WMREG_RLEC);
3125 /*
3126 * WMREG_RNBC is incremented when there is no available buffers in host
3127 * memory. It does not mean the number of dropped packet. Because
3128 * ethernet controller can receive packets in such case if there is
3129 * space in phy's FIFO.
3130 *
3131 * If you want to know the nubmer of WMREG_RMBC, you should use such as
3132 * own EVCNT instead of if_iqdrops.
3133 */
3134 ifp->if_iqdrops += CSR_READ(sc, WMREG_MPC);
3135
3136 if (sc->sc_flags & WM_F_HAS_MII)
3137 mii_tick(&sc->sc_mii);
3138 else if ((sc->sc_type >= WM_T_82575)
3139 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
3140 wm_serdes_tick(sc);
3141 else
3142 wm_tbi_tick(sc);
3143
3144 WM_CORE_UNLOCK(sc);
3145
3146 wm_watchdog(ifp);
3147
3148 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
3149 }
3150
3151 static int
3152 wm_ifflags_cb(struct ethercom *ec)
3153 {
3154 struct ifnet *ifp = &ec->ec_if;
3155 struct wm_softc *sc = ifp->if_softc;
3156 int rc = 0;
3157
3158 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3159 device_xname(sc->sc_dev), __func__));
3160
3161 WM_CORE_LOCK(sc);
3162
3163 int change = ifp->if_flags ^ sc->sc_if_flags;
3164 sc->sc_if_flags = ifp->if_flags;
3165
3166 if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
3167 rc = ENETRESET;
3168 goto out;
3169 }
3170
3171 if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
3172 wm_set_filter(sc);
3173
3174 wm_set_vlan(sc);
3175
3176 out:
3177 WM_CORE_UNLOCK(sc);
3178
3179 return rc;
3180 }
3181
3182 /*
3183 * wm_ioctl: [ifnet interface function]
3184 *
3185 * Handle control requests from the operator.
3186 */
3187 static int
3188 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
3189 {
3190 struct wm_softc *sc = ifp->if_softc;
3191 struct ifreq *ifr = (struct ifreq *) data;
3192 struct ifaddr *ifa = (struct ifaddr *)data;
3193 struct sockaddr_dl *sdl;
3194 int s, error;
3195
3196 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3197 device_xname(sc->sc_dev), __func__));
3198
3199 #ifndef WM_MPSAFE
3200 s = splnet();
3201 #endif
3202 switch (cmd) {
3203 case SIOCSIFMEDIA:
3204 case SIOCGIFMEDIA:
3205 WM_CORE_LOCK(sc);
3206 /* Flow control requires full-duplex mode. */
3207 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
3208 (ifr->ifr_media & IFM_FDX) == 0)
3209 ifr->ifr_media &= ~IFM_ETH_FMASK;
3210 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
3211 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
3212 /* We can do both TXPAUSE and RXPAUSE. */
3213 ifr->ifr_media |=
3214 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
3215 }
3216 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
3217 }
3218 WM_CORE_UNLOCK(sc);
3219 #ifdef WM_MPSAFE
3220 s = splnet();
3221 #endif
3222 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
3223 #ifdef WM_MPSAFE
3224 splx(s);
3225 #endif
3226 break;
3227 case SIOCINITIFADDR:
3228 WM_CORE_LOCK(sc);
3229 if (ifa->ifa_addr->sa_family == AF_LINK) {
3230 sdl = satosdl(ifp->if_dl->ifa_addr);
3231 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len,
3232 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen);
3233 /* unicast address is first multicast entry */
3234 wm_set_filter(sc);
3235 error = 0;
3236 WM_CORE_UNLOCK(sc);
3237 break;
3238 }
3239 WM_CORE_UNLOCK(sc);
3240 /*FALLTHROUGH*/
3241 default:
3242 #ifdef WM_MPSAFE
3243 s = splnet();
3244 #endif
3245 /* It may call wm_start, so unlock here */
3246 error = ether_ioctl(ifp, cmd, data);
3247 #ifdef WM_MPSAFE
3248 splx(s);
3249 #endif
3250 if (error != ENETRESET)
3251 break;
3252
3253 error = 0;
3254
3255 if (cmd == SIOCSIFCAP) {
3256 error = (*ifp->if_init)(ifp);
3257 } else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
3258 ;
3259 else if (ifp->if_flags & IFF_RUNNING) {
3260 /*
3261 * Multicast list has changed; set the hardware filter
3262 * accordingly.
3263 */
3264 WM_CORE_LOCK(sc);
3265 wm_set_filter(sc);
3266 WM_CORE_UNLOCK(sc);
3267 }
3268 break;
3269 }
3270
3271 #ifndef WM_MPSAFE
3272 splx(s);
3273 #endif
3274 return error;
3275 }
3276
3277 /* MAC address related */
3278
3279 /*
3280 * Get the offset of MAC address and return it.
3281 * If error occured, use offset 0.
3282 */
3283 static uint16_t
3284 wm_check_alt_mac_addr(struct wm_softc *sc)
3285 {
3286 uint16_t myea[ETHER_ADDR_LEN / 2];
3287 uint16_t offset = NVM_OFF_MACADDR;
3288
3289 /* Try to read alternative MAC address pointer */
3290 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0)
3291 return 0;
3292
3293 /* Check pointer if it's valid or not. */
3294 if ((offset == 0x0000) || (offset == 0xffff))
3295 return 0;
3296
3297 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid);
3298 /*
3299 * Check whether alternative MAC address is valid or not.
3300 * Some cards have non 0xffff pointer but those don't use
3301 * alternative MAC address in reality.
3302 *
3303 * Check whether the broadcast bit is set or not.
3304 */
3305 if (wm_nvm_read(sc, offset, 1, myea) == 0)
3306 if (((myea[0] & 0xff) & 0x01) == 0)
3307 return offset; /* Found */
3308
3309 /* Not found */
3310 return 0;
3311 }
3312
3313 static int
3314 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr)
3315 {
3316 uint16_t myea[ETHER_ADDR_LEN / 2];
3317 uint16_t offset = NVM_OFF_MACADDR;
3318 int do_invert = 0;
3319
3320 switch (sc->sc_type) {
3321 case WM_T_82580:
3322 case WM_T_I350:
3323 case WM_T_I354:
3324 /* EEPROM Top Level Partitioning */
3325 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0;
3326 break;
3327 case WM_T_82571:
3328 case WM_T_82575:
3329 case WM_T_82576:
3330 case WM_T_80003:
3331 case WM_T_I210:
3332 case WM_T_I211:
3333 offset = wm_check_alt_mac_addr(sc);
3334 if (offset == 0)
3335 if ((sc->sc_funcid & 0x01) == 1)
3336 do_invert = 1;
3337 break;
3338 default:
3339 if ((sc->sc_funcid & 0x01) == 1)
3340 do_invert = 1;
3341 break;
3342 }
3343
3344 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0)
3345 goto bad;
3346
3347 enaddr[0] = myea[0] & 0xff;
3348 enaddr[1] = myea[0] >> 8;
3349 enaddr[2] = myea[1] & 0xff;
3350 enaddr[3] = myea[1] >> 8;
3351 enaddr[4] = myea[2] & 0xff;
3352 enaddr[5] = myea[2] >> 8;
3353
3354 /*
3355 * Toggle the LSB of the MAC address on the second port
3356 * of some dual port cards.
3357 */
3358 if (do_invert != 0)
3359 enaddr[5] ^= 1;
3360
3361 return 0;
3362
3363 bad:
3364 return -1;
3365 }
3366
3367 /*
3368 * wm_set_ral:
3369 *
3370 * Set an entery in the receive address list.
3371 */
3372 static void
3373 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
3374 {
3375 uint32_t ral_lo, ral_hi, addrl, addrh;
3376 uint32_t wlock_mac;
3377 int rv;
3378
3379 if (enaddr != NULL) {
3380 ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) |
3381 (enaddr[3] << 24);
3382 ral_hi = enaddr[4] | (enaddr[5] << 8);
3383 ral_hi |= RAL_AV;
3384 } else {
3385 ral_lo = 0;
3386 ral_hi = 0;
3387 }
3388
3389 switch (sc->sc_type) {
3390 case WM_T_82542_2_0:
3391 case WM_T_82542_2_1:
3392 case WM_T_82543:
3393 CSR_WRITE(sc, WMREG_RAL(idx), ral_lo);
3394 CSR_WRITE_FLUSH(sc);
3395 CSR_WRITE(sc, WMREG_RAH(idx), ral_hi);
3396 CSR_WRITE_FLUSH(sc);
3397 break;
3398 case WM_T_PCH2:
3399 case WM_T_PCH_LPT:
3400 case WM_T_PCH_SPT:
3401 case WM_T_PCH_CNP:
3402 if (idx == 0) {
3403 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3404 CSR_WRITE_FLUSH(sc);
3405 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3406 CSR_WRITE_FLUSH(sc);
3407 return;
3408 }
3409 if (sc->sc_type != WM_T_PCH2) {
3410 wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM),
3411 FWSM_WLOCK_MAC);
3412 addrl = WMREG_SHRAL(idx - 1);
3413 addrh = WMREG_SHRAH(idx - 1);
3414 } else {
3415 wlock_mac = 0;
3416 addrl = WMREG_PCH_LPT_SHRAL(idx - 1);
3417 addrh = WMREG_PCH_LPT_SHRAH(idx - 1);
3418 }
3419
3420 if ((wlock_mac == 0) || (idx <= wlock_mac)) {
3421 rv = wm_get_swflag_ich8lan(sc);
3422 if (rv != 0)
3423 return;
3424 CSR_WRITE(sc, addrl, ral_lo);
3425 CSR_WRITE_FLUSH(sc);
3426 CSR_WRITE(sc, addrh, ral_hi);
3427 CSR_WRITE_FLUSH(sc);
3428 wm_put_swflag_ich8lan(sc);
3429 }
3430
3431 break;
3432 default:
3433 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo);
3434 CSR_WRITE_FLUSH(sc);
3435 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi);
3436 CSR_WRITE_FLUSH(sc);
3437 break;
3438 }
3439 }
3440
3441 /*
3442 * wm_mchash:
3443 *
3444 * Compute the hash of the multicast address for the 4096-bit
3445 * multicast filter.
3446 */
3447 static uint32_t
3448 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
3449 {
3450 static const int lo_shift[4] = { 4, 3, 2, 0 };
3451 static const int hi_shift[4] = { 4, 5, 6, 8 };
3452 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 };
3453 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 };
3454 uint32_t hash;
3455
3456 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3457 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3458 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3459 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){
3460 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) |
3461 (((uint16_t) enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]);
3462 return (hash & 0x3ff);
3463 }
3464 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
3465 (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]);
3466
3467 return (hash & 0xfff);
3468 }
3469
3470 /*
3471 * wm_set_filter:
3472 *
3473 * Set up the receive filter.
3474 */
3475 static void
3476 wm_set_filter(struct wm_softc *sc)
3477 {
3478 struct ethercom *ec = &sc->sc_ethercom;
3479 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3480 struct ether_multi *enm;
3481 struct ether_multistep step;
3482 bus_addr_t mta_reg;
3483 uint32_t hash, reg, bit;
3484 int i, size, ralmax;
3485
3486 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3487 device_xname(sc->sc_dev), __func__));
3488
3489 if (sc->sc_type >= WM_T_82544)
3490 mta_reg = WMREG_CORDOVA_MTA;
3491 else
3492 mta_reg = WMREG_MTA;
3493
3494 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
3495
3496 if (ifp->if_flags & IFF_BROADCAST)
3497 sc->sc_rctl |= RCTL_BAM;
3498 if (ifp->if_flags & IFF_PROMISC) {
3499 sc->sc_rctl |= RCTL_UPE;
3500 goto allmulti;
3501 }
3502
3503 /*
3504 * Set the station address in the first RAL slot, and
3505 * clear the remaining slots.
3506 */
3507 if (sc->sc_type == WM_T_ICH8)
3508 size = WM_RAL_TABSIZE_ICH8 -1;
3509 else if ((sc->sc_type == WM_T_ICH9) || (sc->sc_type == WM_T_ICH10)
3510 || (sc->sc_type == WM_T_PCH))
3511 size = WM_RAL_TABSIZE_ICH8;
3512 else if (sc->sc_type == WM_T_PCH2)
3513 size = WM_RAL_TABSIZE_PCH2;
3514 else if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
3515 || (sc->sc_type == WM_T_PCH_CNP))
3516 size = WM_RAL_TABSIZE_PCH_LPT;
3517 else if (sc->sc_type == WM_T_82575)
3518 size = WM_RAL_TABSIZE_82575;
3519 else if ((sc->sc_type == WM_T_82576) || (sc->sc_type == WM_T_82580))
3520 size = WM_RAL_TABSIZE_82576;
3521 else if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
3522 size = WM_RAL_TABSIZE_I350;
3523 else
3524 size = WM_RAL_TABSIZE;
3525 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0);
3526
3527 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
3528 || (sc->sc_type == WM_T_PCH_CNP)) {
3529 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC);
3530 switch (i) {
3531 case 0:
3532 /* We can use all entries */
3533 ralmax = size;
3534 break;
3535 case 1:
3536 /* Only RAR[0] */
3537 ralmax = 1;
3538 break;
3539 default:
3540 /* available SHRA + RAR[0] */
3541 ralmax = i + 1;
3542 }
3543 } else
3544 ralmax = size;
3545 for (i = 1; i < size; i++) {
3546 if (i < ralmax)
3547 wm_set_ral(sc, NULL, i);
3548 }
3549
3550 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3551 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3552 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3553 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP))
3554 size = WM_ICH8_MC_TABSIZE;
3555 else
3556 size = WM_MC_TABSIZE;
3557 /* Clear out the multicast table. */
3558 for (i = 0; i < size; i++) {
3559 CSR_WRITE(sc, mta_reg + (i << 2), 0);
3560 CSR_WRITE_FLUSH(sc);
3561 }
3562
3563 ETHER_LOCK(ec);
3564 ETHER_FIRST_MULTI(step, ec, enm);
3565 while (enm != NULL) {
3566 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
3567 ETHER_UNLOCK(ec);
3568 /*
3569 * We must listen to a range of multicast addresses.
3570 * For now, just accept all multicasts, rather than
3571 * trying to set only those filter bits needed to match
3572 * the range. (At this time, the only use of address
3573 * ranges is for IP multicast routing, for which the
3574 * range is big enough to require all bits set.)
3575 */
3576 goto allmulti;
3577 }
3578
3579 hash = wm_mchash(sc, enm->enm_addrlo);
3580
3581 reg = (hash >> 5);
3582 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3583 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3584 || (sc->sc_type == WM_T_PCH2)
3585 || (sc->sc_type == WM_T_PCH_LPT)
3586 || (sc->sc_type == WM_T_PCH_SPT)
3587 || (sc->sc_type == WM_T_PCH_CNP))
3588 reg &= 0x1f;
3589 else
3590 reg &= 0x7f;
3591 bit = hash & 0x1f;
3592
3593 hash = CSR_READ(sc, mta_reg + (reg << 2));
3594 hash |= 1U << bit;
3595
3596 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) {
3597 /*
3598 * 82544 Errata 9: Certain register cannot be written
3599 * with particular alignments in PCI-X bus operation
3600 * (FCAH, MTA and VFTA).
3601 */
3602 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
3603 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3604 CSR_WRITE_FLUSH(sc);
3605 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
3606 CSR_WRITE_FLUSH(sc);
3607 } else {
3608 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3609 CSR_WRITE_FLUSH(sc);
3610 }
3611
3612 ETHER_NEXT_MULTI(step, enm);
3613 }
3614 ETHER_UNLOCK(ec);
3615
3616 ifp->if_flags &= ~IFF_ALLMULTI;
3617 goto setit;
3618
3619 allmulti:
3620 ifp->if_flags |= IFF_ALLMULTI;
3621 sc->sc_rctl |= RCTL_MPE;
3622
3623 setit:
3624 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
3625 }
3626
3627 /* Reset and init related */
3628
3629 static void
3630 wm_set_vlan(struct wm_softc *sc)
3631 {
3632
3633 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3634 device_xname(sc->sc_dev), __func__));
3635
3636 /* Deal with VLAN enables. */
3637 if (VLAN_ATTACHED(&sc->sc_ethercom))
3638 sc->sc_ctrl |= CTRL_VME;
3639 else
3640 sc->sc_ctrl &= ~CTRL_VME;
3641
3642 /* Write the control registers. */
3643 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
3644 }
3645
3646 static void
3647 wm_set_pcie_completion_timeout(struct wm_softc *sc)
3648 {
3649 uint32_t gcr;
3650 pcireg_t ctrl2;
3651
3652 gcr = CSR_READ(sc, WMREG_GCR);
3653
3654 /* Only take action if timeout value is defaulted to 0 */
3655 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0)
3656 goto out;
3657
3658 if ((gcr & GCR_CAP_VER2) == 0) {
3659 gcr |= GCR_CMPL_TMOUT_10MS;
3660 goto out;
3661 }
3662
3663 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
3664 sc->sc_pcixe_capoff + PCIE_DCSR2);
3665 ctrl2 |= WM_PCIE_DCSR2_16MS;
3666 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
3667 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2);
3668
3669 out:
3670 /* Disable completion timeout resend */
3671 gcr &= ~GCR_CMPL_TMOUT_RESEND;
3672
3673 CSR_WRITE(sc, WMREG_GCR, gcr);
3674 }
3675
3676 void
3677 wm_get_auto_rd_done(struct wm_softc *sc)
3678 {
3679 int i;
3680
3681 /* wait for eeprom to reload */
3682 switch (sc->sc_type) {
3683 case WM_T_82571:
3684 case WM_T_82572:
3685 case WM_T_82573:
3686 case WM_T_82574:
3687 case WM_T_82583:
3688 case WM_T_82575:
3689 case WM_T_82576:
3690 case WM_T_82580:
3691 case WM_T_I350:
3692 case WM_T_I354:
3693 case WM_T_I210:
3694 case WM_T_I211:
3695 case WM_T_80003:
3696 case WM_T_ICH8:
3697 case WM_T_ICH9:
3698 for (i = 0; i < 10; i++) {
3699 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
3700 break;
3701 delay(1000);
3702 }
3703 if (i == 10) {
3704 log(LOG_ERR, "%s: auto read from eeprom failed to "
3705 "complete\n", device_xname(sc->sc_dev));
3706 }
3707 break;
3708 default:
3709 break;
3710 }
3711 }
3712
3713 void
3714 wm_lan_init_done(struct wm_softc *sc)
3715 {
3716 uint32_t reg = 0;
3717 int i;
3718
3719 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3720 device_xname(sc->sc_dev), __func__));
3721
3722 /* Wait for eeprom to reload */
3723 switch (sc->sc_type) {
3724 case WM_T_ICH10:
3725 case WM_T_PCH:
3726 case WM_T_PCH2:
3727 case WM_T_PCH_LPT:
3728 case WM_T_PCH_SPT:
3729 case WM_T_PCH_CNP:
3730 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) {
3731 reg = CSR_READ(sc, WMREG_STATUS);
3732 if ((reg & STATUS_LAN_INIT_DONE) != 0)
3733 break;
3734 delay(100);
3735 }
3736 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) {
3737 log(LOG_ERR, "%s: %s: lan_init_done failed to "
3738 "complete\n", device_xname(sc->sc_dev), __func__);
3739 }
3740 break;
3741 default:
3742 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
3743 __func__);
3744 break;
3745 }
3746
3747 reg &= ~STATUS_LAN_INIT_DONE;
3748 CSR_WRITE(sc, WMREG_STATUS, reg);
3749 }
3750
3751 void
3752 wm_get_cfg_done(struct wm_softc *sc)
3753 {
3754 int mask;
3755 uint32_t reg;
3756 int i;
3757
3758 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3759 device_xname(sc->sc_dev), __func__));
3760
3761 /* Wait for eeprom to reload */
3762 switch (sc->sc_type) {
3763 case WM_T_82542_2_0:
3764 case WM_T_82542_2_1:
3765 /* null */
3766 break;
3767 case WM_T_82543:
3768 case WM_T_82544:
3769 case WM_T_82540:
3770 case WM_T_82545:
3771 case WM_T_82545_3:
3772 case WM_T_82546:
3773 case WM_T_82546_3:
3774 case WM_T_82541:
3775 case WM_T_82541_2:
3776 case WM_T_82547:
3777 case WM_T_82547_2:
3778 case WM_T_82573:
3779 case WM_T_82574:
3780 case WM_T_82583:
3781 /* generic */
3782 delay(10*1000);
3783 break;
3784 case WM_T_80003:
3785 case WM_T_82571:
3786 case WM_T_82572:
3787 case WM_T_82575:
3788 case WM_T_82576:
3789 case WM_T_82580:
3790 case WM_T_I350:
3791 case WM_T_I354:
3792 case WM_T_I210:
3793 case WM_T_I211:
3794 if (sc->sc_type == WM_T_82571) {
3795 /* Only 82571 shares port 0 */
3796 mask = EEMNGCTL_CFGDONE_0;
3797 } else
3798 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid;
3799 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) {
3800 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask)
3801 break;
3802 delay(1000);
3803 }
3804 if (i >= WM_PHY_CFG_TIMEOUT) {
3805 DPRINTF(WM_DEBUG_GMII, ("%s: %s failed\n",
3806 device_xname(sc->sc_dev), __func__));
3807 }
3808 break;
3809 case WM_T_ICH8:
3810 case WM_T_ICH9:
3811 case WM_T_ICH10:
3812 case WM_T_PCH:
3813 case WM_T_PCH2:
3814 case WM_T_PCH_LPT:
3815 case WM_T_PCH_SPT:
3816 case WM_T_PCH_CNP:
3817 delay(10*1000);
3818 if (sc->sc_type >= WM_T_ICH10)
3819 wm_lan_init_done(sc);
3820 else
3821 wm_get_auto_rd_done(sc);
3822
3823 reg = CSR_READ(sc, WMREG_STATUS);
3824 if ((reg & STATUS_PHYRA) != 0)
3825 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA);
3826 break;
3827 default:
3828 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
3829 __func__);
3830 break;
3831 }
3832 }
3833
3834 void
3835 wm_phy_post_reset(struct wm_softc *sc)
3836 {
3837 uint32_t reg;
3838
3839 /* This function is only for ICH8 and newer. */
3840 if (sc->sc_type < WM_T_ICH8)
3841 return;
3842
3843 if (wm_phy_resetisblocked(sc)) {
3844 /* XXX */
3845 device_printf(sc->sc_dev, "PHY is blocked\n");
3846 return;
3847 }
3848
3849 /* Allow time for h/w to get to quiescent state after reset */
3850 delay(10*1000);
3851
3852 /* Perform any necessary post-reset workarounds */
3853 if (sc->sc_type == WM_T_PCH)
3854 wm_hv_phy_workaround_ich8lan(sc);
3855 if (sc->sc_type == WM_T_PCH2)
3856 wm_lv_phy_workaround_ich8lan(sc);
3857
3858 /* Clear the host wakeup bit after lcd reset */
3859 if (sc->sc_type >= WM_T_PCH) {
3860 reg = wm_gmii_hv_readreg(sc->sc_dev, 2,
3861 BM_PORT_GEN_CFG);
3862 reg &= ~BM_WUC_HOST_WU_BIT;
3863 wm_gmii_hv_writereg(sc->sc_dev, 2,
3864 BM_PORT_GEN_CFG, reg);
3865 }
3866
3867 /* Configure the LCD with the extended configuration region in NVM */
3868 wm_init_lcd_from_nvm(sc);
3869
3870 /* Configure the LCD with the OEM bits in NVM */
3871 }
3872
3873 /* Only for PCH and newer */
3874 static void
3875 wm_write_smbus_addr(struct wm_softc *sc)
3876 {
3877 uint32_t strap, freq;
3878 uint32_t phy_data;
3879
3880 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3881 device_xname(sc->sc_dev), __func__));
3882
3883 strap = CSR_READ(sc, WMREG_STRAP);
3884 freq = __SHIFTOUT(strap, STRAP_FREQ);
3885
3886 phy_data = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_SMB_ADDR);
3887
3888 phy_data &= ~HV_SMB_ADDR_ADDR;
3889 phy_data |= __SHIFTOUT(strap, STRAP_SMBUSADDR);
3890 phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
3891
3892 if (sc->sc_phytype == WMPHY_I217) {
3893 /* Restore SMBus frequency */
3894 if (freq --) {
3895 phy_data &= ~(HV_SMB_ADDR_FREQ_LOW
3896 | HV_SMB_ADDR_FREQ_HIGH);
3897 phy_data |= __SHIFTIN((freq & 0x01) != 0,
3898 HV_SMB_ADDR_FREQ_LOW);
3899 phy_data |= __SHIFTIN((freq & 0x02) != 0,
3900 HV_SMB_ADDR_FREQ_HIGH);
3901 } else {
3902 DPRINTF(WM_DEBUG_INIT,
3903 ("%s: %s Unsupported SMB frequency in PHY\n",
3904 device_xname(sc->sc_dev), __func__));
3905 }
3906 }
3907
3908 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_SMB_ADDR, phy_data);
3909 }
3910
3911 void
3912 wm_init_lcd_from_nvm(struct wm_softc *sc)
3913 {
3914 uint32_t extcnfctr, sw_cfg_mask, cnf_size, word_addr, i, reg;
3915 uint16_t phy_page = 0;
3916
3917 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3918 device_xname(sc->sc_dev), __func__));
3919
3920 switch (sc->sc_type) {
3921 case WM_T_ICH8:
3922 if ((sc->sc_phytype == WMPHY_UNKNOWN)
3923 || (sc->sc_phytype != WMPHY_IGP_3))
3924 return;
3925
3926 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_AMT)
3927 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_LAN)) {
3928 sw_cfg_mask = FEXTNVM_SW_CONFIG;
3929 break;
3930 }
3931 /* FALLTHROUGH */
3932 case WM_T_PCH:
3933 case WM_T_PCH2:
3934 case WM_T_PCH_LPT:
3935 case WM_T_PCH_SPT:
3936 case WM_T_PCH_CNP:
3937 sw_cfg_mask = FEXTNVM_SW_CONFIG_ICH8M;
3938 break;
3939 default:
3940 return;
3941 }
3942
3943 sc->phy.acquire(sc);
3944
3945 reg = CSR_READ(sc, WMREG_FEXTNVM);
3946 if ((reg & sw_cfg_mask) == 0)
3947 goto release;
3948
3949 /*
3950 * Make sure HW does not configure LCD from PHY extended configuration
3951 * before SW configuration
3952 */
3953 extcnfctr = CSR_READ(sc, WMREG_EXTCNFCTR);
3954 if ((sc->sc_type < WM_T_PCH2)
3955 && ((extcnfctr & EXTCNFCTR_PCIE_WRITE_ENABLE) != 0))
3956 goto release;
3957
3958 DPRINTF(WM_DEBUG_INIT, ("%s: %s: Configure LCD by software\n",
3959 device_xname(sc->sc_dev), __func__));
3960 /* word_addr is in DWORD */
3961 word_addr = __SHIFTOUT(extcnfctr, EXTCNFCTR_EXT_CNF_POINTER) << 1;
3962
3963 reg = CSR_READ(sc, WMREG_EXTCNFSIZE);
3964 cnf_size = __SHIFTOUT(reg, EXTCNFSIZE_LENGTH);
3965 if (cnf_size == 0)
3966 goto release;
3967
3968 if (((sc->sc_type == WM_T_PCH)
3969 && ((extcnfctr & EXTCNFCTR_OEM_WRITE_ENABLE) == 0))
3970 || (sc->sc_type > WM_T_PCH)) {
3971 /*
3972 * HW configures the SMBus address and LEDs when the OEM and
3973 * LCD Write Enable bits are set in the NVM. When both NVM bits
3974 * are cleared, SW will configure them instead.
3975 */
3976 DPRINTF(WM_DEBUG_INIT, ("%s: %s: Configure SMBus and LED\n",
3977 device_xname(sc->sc_dev), __func__));
3978 wm_write_smbus_addr(sc);
3979
3980 reg = CSR_READ(sc, WMREG_LEDCTL);
3981 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_LED_CONFIG, reg);
3982 }
3983
3984 /* Configure LCD from extended configuration region. */
3985 for (i = 0; i < cnf_size; i++) {
3986 uint16_t reg_data, reg_addr;
3987
3988 if (wm_nvm_read(sc, (word_addr + i * 2), 1, ®_data) != 0)
3989 goto release;
3990
3991 if (wm_nvm_read(sc, (word_addr + i * 2 + 1), 1, ®_addr) !=0)
3992 goto release;
3993
3994 if (reg_addr == MII_IGPHY_PAGE_SELECT)
3995 phy_page = reg_data;
3996
3997 reg_addr &= IGPHY_MAXREGADDR;
3998 reg_addr |= phy_page;
3999
4000 sc->phy.release(sc); /* XXX */
4001 sc->sc_mii.mii_writereg(sc->sc_dev, 1, reg_addr, reg_data);
4002 sc->phy.acquire(sc); /* XXX */
4003 }
4004
4005 release:
4006 sc->phy.release(sc);
4007 return;
4008 }
4009
4010
4011 /* Init hardware bits */
4012 void
4013 wm_initialize_hardware_bits(struct wm_softc *sc)
4014 {
4015 uint32_t tarc0, tarc1, reg;
4016
4017 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4018 device_xname(sc->sc_dev), __func__));
4019
4020 /* For 82571 variant, 80003 and ICHs */
4021 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
4022 || (sc->sc_type >= WM_T_80003)) {
4023
4024 /* Transmit Descriptor Control 0 */
4025 reg = CSR_READ(sc, WMREG_TXDCTL(0));
4026 reg |= TXDCTL_COUNT_DESC;
4027 CSR_WRITE(sc, WMREG_TXDCTL(0), reg);
4028
4029 /* Transmit Descriptor Control 1 */
4030 reg = CSR_READ(sc, WMREG_TXDCTL(1));
4031 reg |= TXDCTL_COUNT_DESC;
4032 CSR_WRITE(sc, WMREG_TXDCTL(1), reg);
4033
4034 /* TARC0 */
4035 tarc0 = CSR_READ(sc, WMREG_TARC0);
4036 switch (sc->sc_type) {
4037 case WM_T_82571:
4038 case WM_T_82572:
4039 case WM_T_82573:
4040 case WM_T_82574:
4041 case WM_T_82583:
4042 case WM_T_80003:
4043 /* Clear bits 30..27 */
4044 tarc0 &= ~__BITS(30, 27);
4045 break;
4046 default:
4047 break;
4048 }
4049
4050 switch (sc->sc_type) {
4051 case WM_T_82571:
4052 case WM_T_82572:
4053 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */
4054
4055 tarc1 = CSR_READ(sc, WMREG_TARC1);
4056 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */
4057 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */
4058 /* 8257[12] Errata No.7 */
4059 tarc1 |= __BIT(22); /* TARC1 bits 22 */
4060
4061 /* TARC1 bit 28 */
4062 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4063 tarc1 &= ~__BIT(28);
4064 else
4065 tarc1 |= __BIT(28);
4066 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4067
4068 /*
4069 * 8257[12] Errata No.13
4070 * Disable Dyamic Clock Gating.
4071 */
4072 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4073 reg &= ~CTRL_EXT_DMA_DYN_CLK;
4074 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4075 break;
4076 case WM_T_82573:
4077 case WM_T_82574:
4078 case WM_T_82583:
4079 if ((sc->sc_type == WM_T_82574)
4080 || (sc->sc_type == WM_T_82583))
4081 tarc0 |= __BIT(26); /* TARC0 bit 26 */
4082
4083 /* Extended Device Control */
4084 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4085 reg &= ~__BIT(23); /* Clear bit 23 */
4086 reg |= __BIT(22); /* Set bit 22 */
4087 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4088
4089 /* Device Control */
4090 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */
4091 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4092
4093 /* PCIe Control Register */
4094 /*
4095 * 82573 Errata (unknown).
4096 *
4097 * 82574 Errata 25 and 82583 Errata 12
4098 * "Dropped Rx Packets":
4099 * NVM Image Version 2.1.4 and newer has no this bug.
4100 */
4101 reg = CSR_READ(sc, WMREG_GCR);
4102 reg |= GCR_L1_ACT_WITHOUT_L0S_RX;
4103 CSR_WRITE(sc, WMREG_GCR, reg);
4104
4105 if ((sc->sc_type == WM_T_82574)
4106 || (sc->sc_type == WM_T_82583)) {
4107 /*
4108 * Document says this bit must be set for
4109 * proper operation.
4110 */
4111 reg = CSR_READ(sc, WMREG_GCR);
4112 reg |= __BIT(22);
4113 CSR_WRITE(sc, WMREG_GCR, reg);
4114
4115 /*
4116 * Apply workaround for hardware errata
4117 * documented in errata docs Fixes issue where
4118 * some error prone or unreliable PCIe
4119 * completions are occurring, particularly
4120 * with ASPM enabled. Without fix, issue can
4121 * cause Tx timeouts.
4122 */
4123 reg = CSR_READ(sc, WMREG_GCR2);
4124 reg |= __BIT(0);
4125 CSR_WRITE(sc, WMREG_GCR2, reg);
4126 }
4127 break;
4128 case WM_T_80003:
4129 /* TARC0 */
4130 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
4131 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
4132 tarc0 &= ~__BIT(20); /* Clear bits 20 */
4133
4134 /* TARC1 bit 28 */
4135 tarc1 = CSR_READ(sc, WMREG_TARC1);
4136 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4137 tarc1 &= ~__BIT(28);
4138 else
4139 tarc1 |= __BIT(28);
4140 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4141 break;
4142 case WM_T_ICH8:
4143 case WM_T_ICH9:
4144 case WM_T_ICH10:
4145 case WM_T_PCH:
4146 case WM_T_PCH2:
4147 case WM_T_PCH_LPT:
4148 case WM_T_PCH_SPT:
4149 case WM_T_PCH_CNP:
4150 /* TARC0 */
4151 if (sc->sc_type == WM_T_ICH8) {
4152 /* Set TARC0 bits 29 and 28 */
4153 tarc0 |= __BITS(29, 28);
4154 } else if (sc->sc_type == WM_T_PCH_SPT) {
4155 tarc0 |= __BIT(29);
4156 /*
4157 * Drop bit 28. From Linux.
4158 * See I218/I219 spec update
4159 * "5. Buffer Overrun While the I219 is
4160 * Processing DMA Transactions"
4161 */
4162 tarc0 &= ~__BIT(28);
4163 }
4164 /* Set TARC0 bits 23,24,26,27 */
4165 tarc0 |= __BITS(27, 26) | __BITS(24, 23);
4166
4167 /* CTRL_EXT */
4168 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4169 reg |= __BIT(22); /* Set bit 22 */
4170 /*
4171 * Enable PHY low-power state when MAC is at D3
4172 * w/o WoL
4173 */
4174 if (sc->sc_type >= WM_T_PCH)
4175 reg |= CTRL_EXT_PHYPDEN;
4176 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4177
4178 /* TARC1 */
4179 tarc1 = CSR_READ(sc, WMREG_TARC1);
4180 /* bit 28 */
4181 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
4182 tarc1 &= ~__BIT(28);
4183 else
4184 tarc1 |= __BIT(28);
4185 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30);
4186 CSR_WRITE(sc, WMREG_TARC1, tarc1);
4187
4188 /* Device Status */
4189 if (sc->sc_type == WM_T_ICH8) {
4190 reg = CSR_READ(sc, WMREG_STATUS);
4191 reg &= ~__BIT(31);
4192 CSR_WRITE(sc, WMREG_STATUS, reg);
4193
4194 }
4195
4196 /* IOSFPC */
4197 if (sc->sc_type == WM_T_PCH_SPT) {
4198 reg = CSR_READ(sc, WMREG_IOSFPC);
4199 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */
4200 CSR_WRITE(sc, WMREG_IOSFPC, reg);
4201 }
4202 /*
4203 * Work-around descriptor data corruption issue during
4204 * NFS v2 UDP traffic, just disable the NFS filtering
4205 * capability.
4206 */
4207 reg = CSR_READ(sc, WMREG_RFCTL);
4208 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS;
4209 CSR_WRITE(sc, WMREG_RFCTL, reg);
4210 break;
4211 default:
4212 break;
4213 }
4214 CSR_WRITE(sc, WMREG_TARC0, tarc0);
4215
4216 switch (sc->sc_type) {
4217 /*
4218 * 8257[12] Errata No.52, 82573 Errata No.43 and some others.
4219 * Avoid RSS Hash Value bug.
4220 */
4221 case WM_T_82571:
4222 case WM_T_82572:
4223 case WM_T_82573:
4224 case WM_T_80003:
4225 case WM_T_ICH8:
4226 reg = CSR_READ(sc, WMREG_RFCTL);
4227 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
4228 CSR_WRITE(sc, WMREG_RFCTL, reg);
4229 break;
4230 case WM_T_82574:
4231 /* use extened Rx descriptor. */
4232 reg = CSR_READ(sc, WMREG_RFCTL);
4233 reg |= WMREG_RFCTL_EXSTEN;
4234 CSR_WRITE(sc, WMREG_RFCTL, reg);
4235 break;
4236 default:
4237 break;
4238 }
4239 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) {
4240 /*
4241 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24,
4242 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11:
4243 * "Certain Malformed IPv6 Extension Headers are Not Processed
4244 * Correctly by the Device"
4245 *
4246 * I354(C2000) Errata AVR53:
4247 * "Malformed IPv6 Extension Headers May Result in LAN Device
4248 * Hang"
4249 */
4250 reg = CSR_READ(sc, WMREG_RFCTL);
4251 reg |= WMREG_RFCTL_IPV6EXDIS;
4252 CSR_WRITE(sc, WMREG_RFCTL, reg);
4253 }
4254 }
4255
4256 static uint32_t
4257 wm_rxpbs_adjust_82580(uint32_t val)
4258 {
4259 uint32_t rv = 0;
4260
4261 if (val < __arraycount(wm_82580_rxpbs_table))
4262 rv = wm_82580_rxpbs_table[val];
4263
4264 return rv;
4265 }
4266
4267 /*
4268 * wm_reset_phy:
4269 *
4270 * generic PHY reset function.
4271 * Same as e1000_phy_hw_reset_generic()
4272 */
4273 static void
4274 wm_reset_phy(struct wm_softc *sc)
4275 {
4276 uint32_t reg;
4277
4278 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4279 device_xname(sc->sc_dev), __func__));
4280 if (wm_phy_resetisblocked(sc))
4281 return;
4282
4283 sc->phy.acquire(sc);
4284
4285 reg = CSR_READ(sc, WMREG_CTRL);
4286 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
4287 CSR_WRITE_FLUSH(sc);
4288
4289 delay(sc->phy.reset_delay_us);
4290
4291 CSR_WRITE(sc, WMREG_CTRL, reg);
4292 CSR_WRITE_FLUSH(sc);
4293
4294 delay(150);
4295
4296 sc->phy.release(sc);
4297
4298 wm_get_cfg_done(sc);
4299 wm_phy_post_reset(sc);
4300 }
4301
4302 /*
4303 * Only used by WM_T_PCH_SPT which does not use multiqueue,
4304 * so it is enough to check sc->sc_queue[0] only.
4305 */
4306 static void
4307 wm_flush_desc_rings(struct wm_softc *sc)
4308 {
4309 pcireg_t preg;
4310 uint32_t reg;
4311 struct wm_txqueue *txq;
4312 wiseman_txdesc_t *txd;
4313 int nexttx;
4314 uint32_t rctl;
4315
4316 /* First, disable MULR fix in FEXTNVM11 */
4317 reg = CSR_READ(sc, WMREG_FEXTNVM11);
4318 reg |= FEXTNVM11_DIS_MULRFIX;
4319 CSR_WRITE(sc, WMREG_FEXTNVM11, reg);
4320
4321 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4322 reg = CSR_READ(sc, WMREG_TDLEN(0));
4323 if (((preg & DESCRING_STATUS_FLUSH_REQ) == 0) || (reg == 0))
4324 return;
4325
4326 /* TX */
4327 printf("%s: Need TX flush (reg = %08x, len = %u)\n",
4328 device_xname(sc->sc_dev), preg, reg);
4329 reg = CSR_READ(sc, WMREG_TCTL);
4330 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN);
4331
4332 txq = &sc->sc_queue[0].wmq_txq;
4333 nexttx = txq->txq_next;
4334 txd = &txq->txq_descs[nexttx];
4335 wm_set_dma_addr(&txd->wtx_addr, WM_CDTXADDR(txq, nexttx));
4336 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS | 512);
4337 txd->wtx_fields.wtxu_status = 0;
4338 txd->wtx_fields.wtxu_options = 0;
4339 txd->wtx_fields.wtxu_vlan = 0;
4340
4341 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4342 BUS_SPACE_BARRIER_WRITE);
4343
4344 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
4345 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next);
4346 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
4347 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
4348 delay(250);
4349
4350 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
4351 if ((preg & DESCRING_STATUS_FLUSH_REQ) == 0)
4352 return;
4353
4354 /* RX */
4355 printf("%s: Need RX flush (reg = %08x)\n",
4356 device_xname(sc->sc_dev), preg);
4357 rctl = CSR_READ(sc, WMREG_RCTL);
4358 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4359 CSR_WRITE_FLUSH(sc);
4360 delay(150);
4361
4362 reg = CSR_READ(sc, WMREG_RXDCTL(0));
4363 /* zero the lower 14 bits (prefetch and host thresholds) */
4364 reg &= 0xffffc000;
4365 /*
4366 * update thresholds: prefetch threshold to 31, host threshold
4367 * to 1 and make sure the granularity is "descriptors" and not
4368 * "cache lines"
4369 */
4370 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN);
4371 CSR_WRITE(sc, WMREG_RXDCTL(0), reg);
4372
4373 /*
4374 * momentarily enable the RX ring for the changes to take
4375 * effect
4376 */
4377 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN);
4378 CSR_WRITE_FLUSH(sc);
4379 delay(150);
4380 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
4381 }
4382
4383 /*
4384 * wm_reset:
4385 *
4386 * Reset the i82542 chip.
4387 */
4388 static void
4389 wm_reset(struct wm_softc *sc)
4390 {
4391 int phy_reset = 0;
4392 int i, error = 0;
4393 uint32_t reg;
4394 uint16_t kmreg;
4395 int rv;
4396
4397 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4398 device_xname(sc->sc_dev), __func__));
4399 KASSERT(sc->sc_type != 0);
4400
4401 /*
4402 * Allocate on-chip memory according to the MTU size.
4403 * The Packet Buffer Allocation register must be written
4404 * before the chip is reset.
4405 */
4406 switch (sc->sc_type) {
4407 case WM_T_82547:
4408 case WM_T_82547_2:
4409 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4410 PBA_22K : PBA_30K;
4411 for (i = 0; i < sc->sc_nqueues; i++) {
4412 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
4413 txq->txq_fifo_head = 0;
4414 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT;
4415 txq->txq_fifo_size =
4416 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT;
4417 txq->txq_fifo_stall = 0;
4418 }
4419 break;
4420 case WM_T_82571:
4421 case WM_T_82572:
4422 case WM_T_82575: /* XXX need special handing for jumbo frames */
4423 case WM_T_80003:
4424 sc->sc_pba = PBA_32K;
4425 break;
4426 case WM_T_82573:
4427 sc->sc_pba = PBA_12K;
4428 break;
4429 case WM_T_82574:
4430 case WM_T_82583:
4431 sc->sc_pba = PBA_20K;
4432 break;
4433 case WM_T_82576:
4434 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS);
4435 sc->sc_pba &= RXPBS_SIZE_MASK_82576;
4436 break;
4437 case WM_T_82580:
4438 case WM_T_I350:
4439 case WM_T_I354:
4440 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS));
4441 break;
4442 case WM_T_I210:
4443 case WM_T_I211:
4444 sc->sc_pba = PBA_34K;
4445 break;
4446 case WM_T_ICH8:
4447 /* Workaround for a bit corruption issue in FIFO memory */
4448 sc->sc_pba = PBA_8K;
4449 CSR_WRITE(sc, WMREG_PBS, PBA_16K);
4450 break;
4451 case WM_T_ICH9:
4452 case WM_T_ICH10:
4453 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ?
4454 PBA_14K : PBA_10K;
4455 break;
4456 case WM_T_PCH:
4457 case WM_T_PCH2: /* XXX 14K? */
4458 case WM_T_PCH_LPT:
4459 case WM_T_PCH_SPT:
4460 case WM_T_PCH_CNP:
4461 sc->sc_pba = PBA_26K;
4462 break;
4463 default:
4464 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
4465 PBA_40K : PBA_48K;
4466 break;
4467 }
4468 /*
4469 * Only old or non-multiqueue devices have the PBA register
4470 * XXX Need special handling for 82575.
4471 */
4472 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0)
4473 || (sc->sc_type == WM_T_82575))
4474 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba);
4475
4476 /* Prevent the PCI-E bus from sticking */
4477 if (sc->sc_flags & WM_F_PCIE) {
4478 int timeout = 800;
4479
4480 sc->sc_ctrl |= CTRL_GIO_M_DIS;
4481 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
4482
4483 while (timeout--) {
4484 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA)
4485 == 0)
4486 break;
4487 delay(100);
4488 }
4489 if (timeout == 0)
4490 device_printf(sc->sc_dev,
4491 "failed to disable busmastering\n");
4492 }
4493
4494 /* Set the completion timeout for interface */
4495 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
4496 || (sc->sc_type == WM_T_82580)
4497 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
4498 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
4499 wm_set_pcie_completion_timeout(sc);
4500
4501 /* Clear interrupt */
4502 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4503 if (wm_is_using_msix(sc)) {
4504 if (sc->sc_type != WM_T_82574) {
4505 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4506 CSR_WRITE(sc, WMREG_EIAC, 0);
4507 } else {
4508 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4509 }
4510 }
4511
4512 /* Stop the transmit and receive processes. */
4513 CSR_WRITE(sc, WMREG_RCTL, 0);
4514 sc->sc_rctl &= ~RCTL_EN;
4515 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP);
4516 CSR_WRITE_FLUSH(sc);
4517
4518 /* XXX set_tbi_sbp_82543() */
4519
4520 delay(10*1000);
4521
4522 /* Must acquire the MDIO ownership before MAC reset */
4523 switch (sc->sc_type) {
4524 case WM_T_82573:
4525 case WM_T_82574:
4526 case WM_T_82583:
4527 error = wm_get_hw_semaphore_82573(sc);
4528 break;
4529 default:
4530 break;
4531 }
4532
4533 /*
4534 * 82541 Errata 29? & 82547 Errata 28?
4535 * See also the description about PHY_RST bit in CTRL register
4536 * in 8254x_GBe_SDM.pdf.
4537 */
4538 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) {
4539 CSR_WRITE(sc, WMREG_CTRL,
4540 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET);
4541 CSR_WRITE_FLUSH(sc);
4542 delay(5000);
4543 }
4544
4545 switch (sc->sc_type) {
4546 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */
4547 case WM_T_82541:
4548 case WM_T_82541_2:
4549 case WM_T_82547:
4550 case WM_T_82547_2:
4551 /*
4552 * On some chipsets, a reset through a memory-mapped write
4553 * cycle can cause the chip to reset before completing the
4554 * write cycle. This causes major headache that can be
4555 * avoided by issuing the reset via indirect register writes
4556 * through I/O space.
4557 *
4558 * So, if we successfully mapped the I/O BAR at attach time,
4559 * use that. Otherwise, try our luck with a memory-mapped
4560 * reset.
4561 */
4562 if (sc->sc_flags & WM_F_IOH_VALID)
4563 wm_io_write(sc, WMREG_CTRL, CTRL_RST);
4564 else
4565 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
4566 break;
4567 case WM_T_82545_3:
4568 case WM_T_82546_3:
4569 /* Use the shadow control register on these chips. */
4570 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST);
4571 break;
4572 case WM_T_80003:
4573 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4574 sc->phy.acquire(sc);
4575 CSR_WRITE(sc, WMREG_CTRL, reg);
4576 sc->phy.release(sc);
4577 break;
4578 case WM_T_ICH8:
4579 case WM_T_ICH9:
4580 case WM_T_ICH10:
4581 case WM_T_PCH:
4582 case WM_T_PCH2:
4583 case WM_T_PCH_LPT:
4584 case WM_T_PCH_SPT:
4585 case WM_T_PCH_CNP:
4586 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4587 if (wm_phy_resetisblocked(sc) == false) {
4588 /*
4589 * Gate automatic PHY configuration by hardware on
4590 * non-managed 82579
4591 */
4592 if ((sc->sc_type == WM_T_PCH2)
4593 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID)
4594 == 0))
4595 wm_gate_hw_phy_config_ich8lan(sc, true);
4596
4597 reg |= CTRL_PHY_RESET;
4598 phy_reset = 1;
4599 } else
4600 printf("XXX reset is blocked!!!\n");
4601 sc->phy.acquire(sc);
4602 CSR_WRITE(sc, WMREG_CTRL, reg);
4603 /* Don't insert a completion barrier when reset */
4604 delay(20*1000);
4605 mutex_exit(sc->sc_ich_phymtx);
4606 break;
4607 case WM_T_82580:
4608 case WM_T_I350:
4609 case WM_T_I354:
4610 case WM_T_I210:
4611 case WM_T_I211:
4612 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
4613 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII)
4614 CSR_WRITE_FLUSH(sc);
4615 delay(5000);
4616 break;
4617 case WM_T_82542_2_0:
4618 case WM_T_82542_2_1:
4619 case WM_T_82543:
4620 case WM_T_82540:
4621 case WM_T_82545:
4622 case WM_T_82546:
4623 case WM_T_82571:
4624 case WM_T_82572:
4625 case WM_T_82573:
4626 case WM_T_82574:
4627 case WM_T_82575:
4628 case WM_T_82576:
4629 case WM_T_82583:
4630 default:
4631 /* Everything else can safely use the documented method. */
4632 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
4633 break;
4634 }
4635
4636 /* Must release the MDIO ownership after MAC reset */
4637 switch (sc->sc_type) {
4638 case WM_T_82573:
4639 case WM_T_82574:
4640 case WM_T_82583:
4641 if (error == 0)
4642 wm_put_hw_semaphore_82573(sc);
4643 break;
4644 default:
4645 break;
4646 }
4647
4648 if (phy_reset != 0)
4649 wm_get_cfg_done(sc);
4650
4651 /* reload EEPROM */
4652 switch (sc->sc_type) {
4653 case WM_T_82542_2_0:
4654 case WM_T_82542_2_1:
4655 case WM_T_82543:
4656 case WM_T_82544:
4657 delay(10);
4658 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
4659 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4660 CSR_WRITE_FLUSH(sc);
4661 delay(2000);
4662 break;
4663 case WM_T_82540:
4664 case WM_T_82545:
4665 case WM_T_82545_3:
4666 case WM_T_82546:
4667 case WM_T_82546_3:
4668 delay(5*1000);
4669 /* XXX Disable HW ARPs on ASF enabled adapters */
4670 break;
4671 case WM_T_82541:
4672 case WM_T_82541_2:
4673 case WM_T_82547:
4674 case WM_T_82547_2:
4675 delay(20000);
4676 /* XXX Disable HW ARPs on ASF enabled adapters */
4677 break;
4678 case WM_T_82571:
4679 case WM_T_82572:
4680 case WM_T_82573:
4681 case WM_T_82574:
4682 case WM_T_82583:
4683 if (sc->sc_flags & WM_F_EEPROM_FLASH) {
4684 delay(10);
4685 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
4686 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4687 CSR_WRITE_FLUSH(sc);
4688 }
4689 /* check EECD_EE_AUTORD */
4690 wm_get_auto_rd_done(sc);
4691 /*
4692 * Phy configuration from NVM just starts after EECD_AUTO_RD
4693 * is set.
4694 */
4695 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574)
4696 || (sc->sc_type == WM_T_82583))
4697 delay(25*1000);
4698 break;
4699 case WM_T_82575:
4700 case WM_T_82576:
4701 case WM_T_82580:
4702 case WM_T_I350:
4703 case WM_T_I354:
4704 case WM_T_I210:
4705 case WM_T_I211:
4706 case WM_T_80003:
4707 /* check EECD_EE_AUTORD */
4708 wm_get_auto_rd_done(sc);
4709 break;
4710 case WM_T_ICH8:
4711 case WM_T_ICH9:
4712 case WM_T_ICH10:
4713 case WM_T_PCH:
4714 case WM_T_PCH2:
4715 case WM_T_PCH_LPT:
4716 case WM_T_PCH_SPT:
4717 case WM_T_PCH_CNP:
4718 break;
4719 default:
4720 panic("%s: unknown type\n", __func__);
4721 }
4722
4723 /* Check whether EEPROM is present or not */
4724 switch (sc->sc_type) {
4725 case WM_T_82575:
4726 case WM_T_82576:
4727 case WM_T_82580:
4728 case WM_T_I350:
4729 case WM_T_I354:
4730 case WM_T_ICH8:
4731 case WM_T_ICH9:
4732 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) {
4733 /* Not found */
4734 sc->sc_flags |= WM_F_EEPROM_INVALID;
4735 if (sc->sc_type == WM_T_82575)
4736 wm_reset_init_script_82575(sc);
4737 }
4738 break;
4739 default:
4740 break;
4741 }
4742
4743 if (phy_reset != 0)
4744 wm_phy_post_reset(sc);
4745
4746 if ((sc->sc_type == WM_T_82580)
4747 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) {
4748 /* clear global device reset status bit */
4749 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET);
4750 }
4751
4752 /* Clear any pending interrupt events. */
4753 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4754 reg = CSR_READ(sc, WMREG_ICR);
4755 if (wm_is_using_msix(sc)) {
4756 if (sc->sc_type != WM_T_82574) {
4757 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4758 CSR_WRITE(sc, WMREG_EIAC, 0);
4759 } else
4760 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4761 }
4762
4763 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
4764 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
4765 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
4766 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){
4767 reg = CSR_READ(sc, WMREG_KABGTXD);
4768 reg |= KABGTXD_BGSQLBIAS;
4769 CSR_WRITE(sc, WMREG_KABGTXD, reg);
4770 }
4771
4772 /* reload sc_ctrl */
4773 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
4774
4775 if (sc->sc_type == WM_T_I354) {
4776 #if 0
4777 /* I354 uses an external PHY */
4778 wm_set_eee_i354(sc);
4779 #endif
4780 } else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211))
4781 wm_set_eee_i350(sc);
4782
4783 /*
4784 * For PCH, this write will make sure that any noise will be detected
4785 * as a CRC error and be dropped rather than show up as a bad packet
4786 * to the DMA engine
4787 */
4788 if (sc->sc_type == WM_T_PCH)
4789 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565);
4790
4791 if (sc->sc_type >= WM_T_82544)
4792 CSR_WRITE(sc, WMREG_WUC, 0);
4793
4794 wm_reset_mdicnfg_82580(sc);
4795
4796 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
4797 wm_pll_workaround_i210(sc);
4798
4799 if (sc->sc_type == WM_T_80003) {
4800 /* default to TRUE to enable the MDIC W/A */
4801 sc->sc_flags |= WM_F_80003_MDIC_WA;
4802
4803 rv = wm_kmrn_readreg(sc,
4804 KUMCTRLSTA_OFFSET >> KUMCTRLSTA_OFFSET_SHIFT, &kmreg);
4805 if (rv == 0) {
4806 if ((kmreg & KUMCTRLSTA_OPMODE_MASK)
4807 == KUMCTRLSTA_OPMODE_INBAND_MDIO)
4808 sc->sc_flags &= ~WM_F_80003_MDIC_WA;
4809 else
4810 sc->sc_flags |= WM_F_80003_MDIC_WA;
4811 }
4812 }
4813 }
4814
4815 /*
4816 * wm_add_rxbuf:
4817 *
4818 * Add a receive buffer to the indiciated descriptor.
4819 */
4820 static int
4821 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx)
4822 {
4823 struct wm_softc *sc = rxq->rxq_sc;
4824 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx];
4825 struct mbuf *m;
4826 int error;
4827
4828 KASSERT(mutex_owned(rxq->rxq_lock));
4829
4830 MGETHDR(m, M_DONTWAIT, MT_DATA);
4831 if (m == NULL)
4832 return ENOBUFS;
4833
4834 MCLGET(m, M_DONTWAIT);
4835 if ((m->m_flags & M_EXT) == 0) {
4836 m_freem(m);
4837 return ENOBUFS;
4838 }
4839
4840 if (rxs->rxs_mbuf != NULL)
4841 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
4842
4843 rxs->rxs_mbuf = m;
4844
4845 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
4846 error = bus_dmamap_load_mbuf(sc->sc_dmat, rxs->rxs_dmamap, m,
4847 BUS_DMA_READ | BUS_DMA_NOWAIT);
4848 if (error) {
4849 /* XXX XXX XXX */
4850 aprint_error_dev(sc->sc_dev,
4851 "unable to load rx DMA map %d, error = %d\n", idx, error);
4852 panic("wm_add_rxbuf");
4853 }
4854
4855 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
4856 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
4857
4858 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
4859 if ((sc->sc_rctl & RCTL_EN) != 0)
4860 wm_init_rxdesc(rxq, idx);
4861 } else
4862 wm_init_rxdesc(rxq, idx);
4863
4864 return 0;
4865 }
4866
4867 /*
4868 * wm_rxdrain:
4869 *
4870 * Drain the receive queue.
4871 */
4872 static void
4873 wm_rxdrain(struct wm_rxqueue *rxq)
4874 {
4875 struct wm_softc *sc = rxq->rxq_sc;
4876 struct wm_rxsoft *rxs;
4877 int i;
4878
4879 KASSERT(mutex_owned(rxq->rxq_lock));
4880
4881 for (i = 0; i < WM_NRXDESC; i++) {
4882 rxs = &rxq->rxq_soft[i];
4883 if (rxs->rxs_mbuf != NULL) {
4884 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
4885 m_freem(rxs->rxs_mbuf);
4886 rxs->rxs_mbuf = NULL;
4887 }
4888 }
4889 }
4890
4891 /*
4892 * Setup registers for RSS.
4893 *
4894 * XXX not yet VMDq support
4895 */
4896 static void
4897 wm_init_rss(struct wm_softc *sc)
4898 {
4899 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS];
4900 int i;
4901
4902 CTASSERT(sizeof(rss_key) == RSS_KEYSIZE);
4903
4904 for (i = 0; i < RETA_NUM_ENTRIES; i++) {
4905 int qid, reta_ent;
4906
4907 qid = i % sc->sc_nqueues;
4908 switch(sc->sc_type) {
4909 case WM_T_82574:
4910 reta_ent = __SHIFTIN(qid,
4911 RETA_ENT_QINDEX_MASK_82574);
4912 break;
4913 case WM_T_82575:
4914 reta_ent = __SHIFTIN(qid,
4915 RETA_ENT_QINDEX1_MASK_82575);
4916 break;
4917 default:
4918 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK);
4919 break;
4920 }
4921
4922 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i));
4923 reta_reg &= ~RETA_ENTRY_MASK_Q(i);
4924 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i));
4925 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg);
4926 }
4927
4928 rss_getkey((uint8_t *)rss_key);
4929 for (i = 0; i < RSSRK_NUM_REGS; i++)
4930 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]);
4931
4932 if (sc->sc_type == WM_T_82574)
4933 mrqc = MRQC_ENABLE_RSS_MQ_82574;
4934 else
4935 mrqc = MRQC_ENABLE_RSS_MQ;
4936
4937 /*
4938 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata.
4939 * See IPV6EXDIS bit in wm_initialize_hardware_bits().
4940 */
4941 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP);
4942 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP);
4943 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP);
4944 mrqc |= (MRQC_RSS_FIELD_IPV6_UDP_EX | MRQC_RSS_FIELD_IPV6_TCP_EX);
4945
4946 CSR_WRITE(sc, WMREG_MRQC, mrqc);
4947 }
4948
4949 /*
4950 * Adjust TX and RX queue numbers which the system actulally uses.
4951 *
4952 * The numbers are affected by below parameters.
4953 * - The nubmer of hardware queues
4954 * - The number of MSI-X vectors (= "nvectors" argument)
4955 * - ncpu
4956 */
4957 static void
4958 wm_adjust_qnum(struct wm_softc *sc, int nvectors)
4959 {
4960 int hw_ntxqueues, hw_nrxqueues, hw_nqueues;
4961
4962 if (nvectors < 2) {
4963 sc->sc_nqueues = 1;
4964 return;
4965 }
4966
4967 switch(sc->sc_type) {
4968 case WM_T_82572:
4969 hw_ntxqueues = 2;
4970 hw_nrxqueues = 2;
4971 break;
4972 case WM_T_82574:
4973 hw_ntxqueues = 2;
4974 hw_nrxqueues = 2;
4975 break;
4976 case WM_T_82575:
4977 hw_ntxqueues = 4;
4978 hw_nrxqueues = 4;
4979 break;
4980 case WM_T_82576:
4981 hw_ntxqueues = 16;
4982 hw_nrxqueues = 16;
4983 break;
4984 case WM_T_82580:
4985 case WM_T_I350:
4986 case WM_T_I354:
4987 hw_ntxqueues = 8;
4988 hw_nrxqueues = 8;
4989 break;
4990 case WM_T_I210:
4991 hw_ntxqueues = 4;
4992 hw_nrxqueues = 4;
4993 break;
4994 case WM_T_I211:
4995 hw_ntxqueues = 2;
4996 hw_nrxqueues = 2;
4997 break;
4998 /*
4999 * As below ethernet controllers does not support MSI-X,
5000 * this driver let them not use multiqueue.
5001 * - WM_T_80003
5002 * - WM_T_ICH8
5003 * - WM_T_ICH9
5004 * - WM_T_ICH10
5005 * - WM_T_PCH
5006 * - WM_T_PCH2
5007 * - WM_T_PCH_LPT
5008 */
5009 default:
5010 hw_ntxqueues = 1;
5011 hw_nrxqueues = 1;
5012 break;
5013 }
5014
5015 hw_nqueues = min(hw_ntxqueues, hw_nrxqueues);
5016
5017 /*
5018 * As queues more than MSI-X vectors cannot improve scaling, we limit
5019 * the number of queues used actually.
5020 */
5021 if (nvectors < hw_nqueues + 1)
5022 sc->sc_nqueues = nvectors - 1;
5023 else
5024 sc->sc_nqueues = hw_nqueues;
5025
5026 /*
5027 * As queues more then cpus cannot improve scaling, we limit
5028 * the number of queues used actually.
5029 */
5030 if (ncpu < sc->sc_nqueues)
5031 sc->sc_nqueues = ncpu;
5032 }
5033
5034 static inline bool
5035 wm_is_using_msix(struct wm_softc *sc)
5036 {
5037
5038 return (sc->sc_nintrs > 1);
5039 }
5040
5041 static inline bool
5042 wm_is_using_multiqueue(struct wm_softc *sc)
5043 {
5044
5045 return (sc->sc_nqueues > 1);
5046 }
5047
5048 static int
5049 wm_softint_establish(struct wm_softc *sc, int qidx, int intr_idx)
5050 {
5051 struct wm_queue *wmq = &sc->sc_queue[qidx];
5052 wmq->wmq_id = qidx;
5053 wmq->wmq_intr_idx = intr_idx;
5054 wmq->wmq_si = softint_establish(SOFTINT_NET
5055 #ifdef WM_MPSAFE
5056 | SOFTINT_MPSAFE
5057 #endif
5058 , wm_handle_queue, wmq);
5059 if (wmq->wmq_si != NULL)
5060 return 0;
5061
5062 aprint_error_dev(sc->sc_dev, "unable to establish queue[%d] handler\n",
5063 wmq->wmq_id);
5064
5065 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[wmq->wmq_intr_idx]);
5066 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5067 return ENOMEM;
5068 }
5069
5070 /*
5071 * Both single interrupt MSI and INTx can use this function.
5072 */
5073 static int
5074 wm_setup_legacy(struct wm_softc *sc)
5075 {
5076 pci_chipset_tag_t pc = sc->sc_pc;
5077 const char *intrstr = NULL;
5078 char intrbuf[PCI_INTRSTR_LEN];
5079 int error;
5080
5081 error = wm_alloc_txrx_queues(sc);
5082 if (error) {
5083 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5084 error);
5085 return ENOMEM;
5086 }
5087 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf,
5088 sizeof(intrbuf));
5089 #ifdef WM_MPSAFE
5090 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true);
5091 #endif
5092 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
5093 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev));
5094 if (sc->sc_ihs[0] == NULL) {
5095 aprint_error_dev(sc->sc_dev,"unable to establish %s\n",
5096 (pci_intr_type(pc, sc->sc_intrs[0])
5097 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
5098 return ENOMEM;
5099 }
5100
5101 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
5102 sc->sc_nintrs = 1;
5103
5104 return wm_softint_establish(sc, 0, 0);
5105 }
5106
5107 static int
5108 wm_setup_msix(struct wm_softc *sc)
5109 {
5110 void *vih;
5111 kcpuset_t *affinity;
5112 int qidx, error, intr_idx, txrx_established;
5113 pci_chipset_tag_t pc = sc->sc_pc;
5114 const char *intrstr = NULL;
5115 char intrbuf[PCI_INTRSTR_LEN];
5116 char intr_xname[INTRDEVNAMEBUF];
5117
5118 if (sc->sc_nqueues < ncpu) {
5119 /*
5120 * To avoid other devices' interrupts, the affinity of Tx/Rx
5121 * interrupts start from CPU#1.
5122 */
5123 sc->sc_affinity_offset = 1;
5124 } else {
5125 /*
5126 * In this case, this device use all CPUs. So, we unify
5127 * affinitied cpu_index to msix vector number for readability.
5128 */
5129 sc->sc_affinity_offset = 0;
5130 }
5131
5132 error = wm_alloc_txrx_queues(sc);
5133 if (error) {
5134 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
5135 error);
5136 return ENOMEM;
5137 }
5138
5139 kcpuset_create(&affinity, false);
5140 intr_idx = 0;
5141
5142 /*
5143 * TX and RX
5144 */
5145 txrx_established = 0;
5146 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5147 struct wm_queue *wmq = &sc->sc_queue[qidx];
5148 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu;
5149
5150 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5151 sizeof(intrbuf));
5152 #ifdef WM_MPSAFE
5153 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx],
5154 PCI_INTR_MPSAFE, true);
5155 #endif
5156 memset(intr_xname, 0, sizeof(intr_xname));
5157 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d",
5158 device_xname(sc->sc_dev), qidx);
5159 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5160 IPL_NET, wm_txrxintr_msix, wmq, intr_xname);
5161 if (vih == NULL) {
5162 aprint_error_dev(sc->sc_dev,
5163 "unable to establish MSI-X(for TX and RX)%s%s\n",
5164 intrstr ? " at " : "",
5165 intrstr ? intrstr : "");
5166
5167 goto fail;
5168 }
5169 kcpuset_zero(affinity);
5170 /* Round-robin affinity */
5171 kcpuset_set(affinity, affinity_to);
5172 error = interrupt_distribute(vih, affinity, NULL);
5173 if (error == 0) {
5174 aprint_normal_dev(sc->sc_dev,
5175 "for TX and RX interrupting at %s affinity to %u\n",
5176 intrstr, affinity_to);
5177 } else {
5178 aprint_normal_dev(sc->sc_dev,
5179 "for TX and RX interrupting at %s\n", intrstr);
5180 }
5181 sc->sc_ihs[intr_idx] = vih;
5182 if (wm_softint_establish(sc, qidx, intr_idx) != 0)
5183 goto fail;
5184 txrx_established++;
5185 intr_idx++;
5186 }
5187
5188 /*
5189 * LINK
5190 */
5191 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
5192 sizeof(intrbuf));
5193 #ifdef WM_MPSAFE
5194 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true);
5195 #endif
5196 memset(intr_xname, 0, sizeof(intr_xname));
5197 snprintf(intr_xname, sizeof(intr_xname), "%sLINK",
5198 device_xname(sc->sc_dev));
5199 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
5200 IPL_NET, wm_linkintr_msix, sc, intr_xname);
5201 if (vih == NULL) {
5202 aprint_error_dev(sc->sc_dev,
5203 "unable to establish MSI-X(for LINK)%s%s\n",
5204 intrstr ? " at " : "",
5205 intrstr ? intrstr : "");
5206
5207 goto fail;
5208 }
5209 /* keep default affinity to LINK interrupt */
5210 aprint_normal_dev(sc->sc_dev,
5211 "for LINK interrupting at %s\n", intrstr);
5212 sc->sc_ihs[intr_idx] = vih;
5213 sc->sc_link_intr_idx = intr_idx;
5214
5215 sc->sc_nintrs = sc->sc_nqueues + 1;
5216 kcpuset_destroy(affinity);
5217 return 0;
5218
5219 fail:
5220 for (qidx = 0; qidx < txrx_established; qidx++) {
5221 struct wm_queue *wmq = &sc->sc_queue[qidx];
5222 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]);
5223 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
5224 }
5225
5226 kcpuset_destroy(affinity);
5227 return ENOMEM;
5228 }
5229
5230 static void
5231 wm_unset_stopping_flags(struct wm_softc *sc)
5232 {
5233 int i;
5234
5235 KASSERT(WM_CORE_LOCKED(sc));
5236
5237 /*
5238 * must unset stopping flags in ascending order.
5239 */
5240 for(i = 0; i < sc->sc_nqueues; i++) {
5241 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5242 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5243
5244 mutex_enter(txq->txq_lock);
5245 txq->txq_stopping = false;
5246 mutex_exit(txq->txq_lock);
5247
5248 mutex_enter(rxq->rxq_lock);
5249 rxq->rxq_stopping = false;
5250 mutex_exit(rxq->rxq_lock);
5251 }
5252
5253 sc->sc_core_stopping = false;
5254 }
5255
5256 static void
5257 wm_set_stopping_flags(struct wm_softc *sc)
5258 {
5259 int i;
5260
5261 KASSERT(WM_CORE_LOCKED(sc));
5262
5263 sc->sc_core_stopping = true;
5264
5265 /*
5266 * must set stopping flags in ascending order.
5267 */
5268 for(i = 0; i < sc->sc_nqueues; i++) {
5269 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5270 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5271
5272 mutex_enter(rxq->rxq_lock);
5273 rxq->rxq_stopping = true;
5274 mutex_exit(rxq->rxq_lock);
5275
5276 mutex_enter(txq->txq_lock);
5277 txq->txq_stopping = true;
5278 mutex_exit(txq->txq_lock);
5279 }
5280 }
5281
5282 /*
5283 * write interrupt interval value to ITR or EITR
5284 */
5285 static void
5286 wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq)
5287 {
5288
5289 if (!wmq->wmq_set_itr)
5290 return;
5291
5292 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5293 uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK);
5294
5295 /*
5296 * 82575 doesn't have CNT_INGR field.
5297 * So, overwrite counter field by software.
5298 */
5299 if (sc->sc_type == WM_T_82575)
5300 eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575);
5301 else
5302 eitr |= EITR_CNT_INGR;
5303
5304 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx), eitr);
5305 } else if (sc->sc_type == WM_T_82574 && wm_is_using_msix(sc)) {
5306 /*
5307 * 82574 has both ITR and EITR. SET EITR when we use
5308 * the multi queue function with MSI-X.
5309 */
5310 CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx),
5311 wmq->wmq_itr & EITR_ITR_INT_MASK_82574);
5312 } else {
5313 KASSERT(wmq->wmq_id == 0);
5314 CSR_WRITE(sc, WMREG_ITR, wmq->wmq_itr);
5315 }
5316
5317 wmq->wmq_set_itr = false;
5318 }
5319
5320 /*
5321 * TODO
5322 * Below dynamic calculation of itr is almost the same as linux igb,
5323 * however it does not fit to wm(4). So, we will have been disable AIM
5324 * until we will find appropriate calculation of itr.
5325 */
5326 /*
5327 * calculate interrupt interval value to be going to write register in
5328 * wm_itrs_writereg(). This function does not write ITR/EITR register.
5329 */
5330 static void
5331 wm_itrs_calculate(struct wm_softc *sc, struct wm_queue *wmq)
5332 {
5333 #ifdef NOTYET
5334 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
5335 struct wm_txqueue *txq = &wmq->wmq_txq;
5336 uint32_t avg_size = 0;
5337 uint32_t new_itr;
5338
5339 if (rxq->rxq_packets)
5340 avg_size = rxq->rxq_bytes / rxq->rxq_packets;
5341 if (txq->txq_packets)
5342 avg_size = max(avg_size, txq->txq_bytes / txq->txq_packets);
5343
5344 if (avg_size == 0) {
5345 new_itr = 450; /* restore default value */
5346 goto out;
5347 }
5348
5349 /* Add 24 bytes to size to account for CRC, preamble, and gap */
5350 avg_size += 24;
5351
5352 /* Don't starve jumbo frames */
5353 avg_size = min(avg_size, 3000);
5354
5355 /* Give a little boost to mid-size frames */
5356 if ((avg_size > 300) && (avg_size < 1200))
5357 new_itr = avg_size / 3;
5358 else
5359 new_itr = avg_size / 2;
5360
5361 out:
5362 /*
5363 * The usage of 82574 and 82575 EITR is different from otther NEWQUEUE
5364 * controllers. See sc->sc_itr_init setting in wm_init_locked().
5365 */
5366 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0 || sc->sc_type != WM_T_82575)
5367 new_itr *= 4;
5368
5369 if (new_itr != wmq->wmq_itr) {
5370 wmq->wmq_itr = new_itr;
5371 wmq->wmq_set_itr = true;
5372 } else
5373 wmq->wmq_set_itr = false;
5374
5375 rxq->rxq_packets = 0;
5376 rxq->rxq_bytes = 0;
5377 txq->txq_packets = 0;
5378 txq->txq_bytes = 0;
5379 #endif
5380 }
5381
5382 /*
5383 * wm_init: [ifnet interface function]
5384 *
5385 * Initialize the interface.
5386 */
5387 static int
5388 wm_init(struct ifnet *ifp)
5389 {
5390 struct wm_softc *sc = ifp->if_softc;
5391 int ret;
5392
5393 WM_CORE_LOCK(sc);
5394 ret = wm_init_locked(ifp);
5395 WM_CORE_UNLOCK(sc);
5396
5397 return ret;
5398 }
5399
5400 static int
5401 wm_init_locked(struct ifnet *ifp)
5402 {
5403 struct wm_softc *sc = ifp->if_softc;
5404 int i, j, trynum, error = 0;
5405 uint32_t reg;
5406
5407 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5408 device_xname(sc->sc_dev), __func__));
5409 KASSERT(WM_CORE_LOCKED(sc));
5410
5411 /*
5412 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
5413 * There is a small but measurable benefit to avoiding the adjusment
5414 * of the descriptor so that the headers are aligned, for normal mtu,
5415 * on such platforms. One possibility is that the DMA itself is
5416 * slightly more efficient if the front of the entire packet (instead
5417 * of the front of the headers) is aligned.
5418 *
5419 * Note we must always set align_tweak to 0 if we are using
5420 * jumbo frames.
5421 */
5422 #ifdef __NO_STRICT_ALIGNMENT
5423 sc->sc_align_tweak = 0;
5424 #else
5425 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
5426 sc->sc_align_tweak = 0;
5427 else
5428 sc->sc_align_tweak = 2;
5429 #endif /* __NO_STRICT_ALIGNMENT */
5430
5431 /* Cancel any pending I/O. */
5432 wm_stop_locked(ifp, 0);
5433
5434 /* update statistics before reset */
5435 ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
5436 ifp->if_ierrors += CSR_READ(sc, WMREG_RXERRC);
5437
5438 /* PCH_SPT hardware workaround */
5439 if (sc->sc_type == WM_T_PCH_SPT)
5440 wm_flush_desc_rings(sc);
5441
5442 /* Reset the chip to a known state. */
5443 wm_reset(sc);
5444
5445 /*
5446 * AMT based hardware can now take control from firmware
5447 * Do this after reset.
5448 */
5449 if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
5450 wm_get_hw_control(sc);
5451
5452 if ((sc->sc_type >= WM_T_PCH_SPT) &&
5453 pci_intr_type(sc->sc_pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_INTX)
5454 wm_legacy_irq_quirk_spt(sc);
5455
5456 /* Init hardware bits */
5457 wm_initialize_hardware_bits(sc);
5458
5459 /* Reset the PHY. */
5460 if (sc->sc_flags & WM_F_HAS_MII)
5461 wm_gmii_reset(sc);
5462
5463 /* Calculate (E)ITR value */
5464 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0 && sc->sc_type != WM_T_82575) {
5465 /*
5466 * For NEWQUEUE's EITR (except for 82575).
5467 * 82575's EITR should be set same throttling value as other
5468 * old controllers' ITR because the interrupt/sec calculation
5469 * is the same, that is, 1,000,000,000 / (N * 256).
5470 *
5471 * 82574's EITR should be set same throttling value as ITR.
5472 *
5473 * For N interrupts/sec, set this value to:
5474 * 1,000,000 / N in contrast to ITR throttoling value.
5475 */
5476 sc->sc_itr_init = 450;
5477 } else if (sc->sc_type >= WM_T_82543) {
5478 /*
5479 * Set up the interrupt throttling register (units of 256ns)
5480 * Note that a footnote in Intel's documentation says this
5481 * ticker runs at 1/4 the rate when the chip is in 100Mbit
5482 * or 10Mbit mode. Empirically, it appears to be the case
5483 * that that is also true for the 1024ns units of the other
5484 * interrupt-related timer registers -- so, really, we ought
5485 * to divide this value by 4 when the link speed is low.
5486 *
5487 * XXX implement this division at link speed change!
5488 */
5489
5490 /*
5491 * For N interrupts/sec, set this value to:
5492 * 1,000,000,000 / (N * 256). Note that we set the
5493 * absolute and packet timer values to this value
5494 * divided by 4 to get "simple timer" behavior.
5495 */
5496 sc->sc_itr_init = 1500; /* 2604 ints/sec */
5497 }
5498
5499 error = wm_init_txrx_queues(sc);
5500 if (error)
5501 goto out;
5502
5503 /*
5504 * Clear out the VLAN table -- we don't use it (yet).
5505 */
5506 CSR_WRITE(sc, WMREG_VET, 0);
5507 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
5508 trynum = 10; /* Due to hw errata */
5509 else
5510 trynum = 1;
5511 for (i = 0; i < WM_VLAN_TABSIZE; i++)
5512 for (j = 0; j < trynum; j++)
5513 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
5514
5515 /*
5516 * Set up flow-control parameters.
5517 *
5518 * XXX Values could probably stand some tuning.
5519 */
5520 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
5521 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH)
5522 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)
5523 && (sc->sc_type != WM_T_PCH_SPT) && (sc->sc_type != WM_T_PCH_CNP)){
5524 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
5525 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
5526 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
5527 }
5528
5529 sc->sc_fcrtl = FCRTL_DFLT;
5530 if (sc->sc_type < WM_T_82543) {
5531 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
5532 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl);
5533 } else {
5534 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
5535 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
5536 }
5537
5538 if (sc->sc_type == WM_T_80003)
5539 CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
5540 else
5541 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
5542
5543 /* Writes the control register. */
5544 wm_set_vlan(sc);
5545
5546 if (sc->sc_flags & WM_F_HAS_MII) {
5547 uint16_t kmreg;
5548
5549 switch (sc->sc_type) {
5550 case WM_T_80003:
5551 case WM_T_ICH8:
5552 case WM_T_ICH9:
5553 case WM_T_ICH10:
5554 case WM_T_PCH:
5555 case WM_T_PCH2:
5556 case WM_T_PCH_LPT:
5557 case WM_T_PCH_SPT:
5558 case WM_T_PCH_CNP:
5559 /*
5560 * Set the mac to wait the maximum time between each
5561 * iteration and increase the max iterations when
5562 * polling the phy; this fixes erroneous timeouts at
5563 * 10Mbps.
5564 */
5565 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
5566 0xFFFF);
5567 wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
5568 &kmreg);
5569 kmreg |= 0x3F;
5570 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM,
5571 kmreg);
5572 break;
5573 default:
5574 break;
5575 }
5576
5577 if (sc->sc_type == WM_T_80003) {
5578 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5579 reg &= ~CTRL_EXT_LINK_MODE_MASK;
5580 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5581
5582 /* Bypass RX and TX FIFO's */
5583 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
5584 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS
5585 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
5586 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
5587 KUMCTRLSTA_INB_CTRL_DIS_PADDING |
5588 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
5589 }
5590 }
5591 #if 0
5592 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
5593 #endif
5594
5595 /* Set up checksum offload parameters. */
5596 reg = CSR_READ(sc, WMREG_RXCSUM);
5597 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL);
5598 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
5599 reg |= RXCSUM_IPOFL;
5600 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx))
5601 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
5602 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
5603 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL;
5604 CSR_WRITE(sc, WMREG_RXCSUM, reg);
5605
5606 /* Set registers about MSI-X */
5607 if (wm_is_using_msix(sc)) {
5608 uint32_t ivar;
5609 struct wm_queue *wmq;
5610 int qid, qintr_idx;
5611
5612 if (sc->sc_type == WM_T_82575) {
5613 /* Interrupt control */
5614 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5615 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR;
5616 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5617
5618 /* TX and RX */
5619 for (i = 0; i < sc->sc_nqueues; i++) {
5620 wmq = &sc->sc_queue[i];
5621 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx),
5622 EITR_TX_QUEUE(wmq->wmq_id)
5623 | EITR_RX_QUEUE(wmq->wmq_id));
5624 }
5625 /* Link status */
5626 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx),
5627 EITR_OTHER);
5628 } else if (sc->sc_type == WM_T_82574) {
5629 /* Interrupt control */
5630 reg = CSR_READ(sc, WMREG_CTRL_EXT);
5631 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME;
5632 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
5633
5634 /*
5635 * workaround issue with spurious interrupts
5636 * in MSI-X mode.
5637 * At wm_initialize_hardware_bits(), sc_nintrs has not
5638 * initialized yet. So re-initialize WMREG_RFCTL here.
5639 */
5640 reg = CSR_READ(sc, WMREG_RFCTL);
5641 reg |= WMREG_RFCTL_ACKDIS;
5642 CSR_WRITE(sc, WMREG_RFCTL, reg);
5643
5644 ivar = 0;
5645 /* TX and RX */
5646 for (i = 0; i < sc->sc_nqueues; i++) {
5647 wmq = &sc->sc_queue[i];
5648 qid = wmq->wmq_id;
5649 qintr_idx = wmq->wmq_intr_idx;
5650
5651 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
5652 IVAR_TX_MASK_Q_82574(qid));
5653 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
5654 IVAR_RX_MASK_Q_82574(qid));
5655 }
5656 /* Link status */
5657 ivar |= __SHIFTIN((IVAR_VALID_82574
5658 | sc->sc_link_intr_idx), IVAR_OTHER_MASK);
5659 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB);
5660 } else {
5661 /* Interrupt control */
5662 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX
5663 | GPIE_EIAME | GPIE_PBA);
5664
5665 switch (sc->sc_type) {
5666 case WM_T_82580:
5667 case WM_T_I350:
5668 case WM_T_I354:
5669 case WM_T_I210:
5670 case WM_T_I211:
5671 /* TX and RX */
5672 for (i = 0; i < sc->sc_nqueues; i++) {
5673 wmq = &sc->sc_queue[i];
5674 qid = wmq->wmq_id;
5675 qintr_idx = wmq->wmq_intr_idx;
5676
5677 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid));
5678 ivar &= ~IVAR_TX_MASK_Q(qid);
5679 ivar |= __SHIFTIN((qintr_idx
5680 | IVAR_VALID),
5681 IVAR_TX_MASK_Q(qid));
5682 ivar &= ~IVAR_RX_MASK_Q(qid);
5683 ivar |= __SHIFTIN((qintr_idx
5684 | IVAR_VALID),
5685 IVAR_RX_MASK_Q(qid));
5686 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar);
5687 }
5688 break;
5689 case WM_T_82576:
5690 /* TX and RX */
5691 for (i = 0; i < sc->sc_nqueues; i++) {
5692 wmq = &sc->sc_queue[i];
5693 qid = wmq->wmq_id;
5694 qintr_idx = wmq->wmq_intr_idx;
5695
5696 ivar = CSR_READ(sc,
5697 WMREG_IVAR_Q_82576(qid));
5698 ivar &= ~IVAR_TX_MASK_Q_82576(qid);
5699 ivar |= __SHIFTIN((qintr_idx
5700 | IVAR_VALID),
5701 IVAR_TX_MASK_Q_82576(qid));
5702 ivar &= ~IVAR_RX_MASK_Q_82576(qid);
5703 ivar |= __SHIFTIN((qintr_idx
5704 | IVAR_VALID),
5705 IVAR_RX_MASK_Q_82576(qid));
5706 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid),
5707 ivar);
5708 }
5709 break;
5710 default:
5711 break;
5712 }
5713
5714 /* Link status */
5715 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID),
5716 IVAR_MISC_OTHER);
5717 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar);
5718 }
5719
5720 if (wm_is_using_multiqueue(sc)) {
5721 wm_init_rss(sc);
5722
5723 /*
5724 ** NOTE: Receive Full-Packet Checksum Offload
5725 ** is mutually exclusive with Multiqueue. However
5726 ** this is not the same as TCP/IP checksums which
5727 ** still work.
5728 */
5729 reg = CSR_READ(sc, WMREG_RXCSUM);
5730 reg |= RXCSUM_PCSD;
5731 CSR_WRITE(sc, WMREG_RXCSUM, reg);
5732 }
5733 }
5734
5735 /* Set up the interrupt registers. */
5736 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5737 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
5738 ICR_RXO | ICR_RXT0;
5739 if (wm_is_using_msix(sc)) {
5740 uint32_t mask;
5741 struct wm_queue *wmq;
5742
5743 switch (sc->sc_type) {
5744 case WM_T_82574:
5745 mask = 0;
5746 for (i = 0; i < sc->sc_nqueues; i++) {
5747 wmq = &sc->sc_queue[i];
5748 mask |= ICR_TXQ(wmq->wmq_id);
5749 mask |= ICR_RXQ(wmq->wmq_id);
5750 }
5751 mask |= ICR_OTHER;
5752 CSR_WRITE(sc, WMREG_EIAC_82574, mask);
5753 CSR_WRITE(sc, WMREG_IMS, mask | ICR_LSC);
5754 break;
5755 default:
5756 if (sc->sc_type == WM_T_82575) {
5757 mask = 0;
5758 for (i = 0; i < sc->sc_nqueues; i++) {
5759 wmq = &sc->sc_queue[i];
5760 mask |= EITR_TX_QUEUE(wmq->wmq_id);
5761 mask |= EITR_RX_QUEUE(wmq->wmq_id);
5762 }
5763 mask |= EITR_OTHER;
5764 } else {
5765 mask = 0;
5766 for (i = 0; i < sc->sc_nqueues; i++) {
5767 wmq = &sc->sc_queue[i];
5768 mask |= 1 << wmq->wmq_intr_idx;
5769 }
5770 mask |= 1 << sc->sc_link_intr_idx;
5771 }
5772 CSR_WRITE(sc, WMREG_EIAC, mask);
5773 CSR_WRITE(sc, WMREG_EIAM, mask);
5774 CSR_WRITE(sc, WMREG_EIMS, mask);
5775 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
5776 break;
5777 }
5778 } else
5779 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
5780
5781 /* Set up the inter-packet gap. */
5782 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
5783
5784 if (sc->sc_type >= WM_T_82543) {
5785 for (int qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5786 struct wm_queue *wmq = &sc->sc_queue[qidx];
5787 wm_itrs_writereg(sc, wmq);
5788 }
5789 /*
5790 * Link interrupts occur much less than TX
5791 * interrupts and RX interrupts. So, we don't
5792 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like
5793 * FreeBSD's if_igb.
5794 */
5795 }
5796
5797 /* Set the VLAN ethernetype. */
5798 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
5799
5800 /*
5801 * Set up the transmit control register; we start out with
5802 * a collision distance suitable for FDX, but update it whe
5803 * we resolve the media type.
5804 */
5805 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
5806 | TCTL_CT(TX_COLLISION_THRESHOLD)
5807 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
5808 if (sc->sc_type >= WM_T_82571)
5809 sc->sc_tctl |= TCTL_MULR;
5810 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
5811
5812 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5813 /* Write TDT after TCTL.EN is set. See the document. */
5814 CSR_WRITE(sc, WMREG_TDT(0), 0);
5815 }
5816
5817 if (sc->sc_type == WM_T_80003) {
5818 reg = CSR_READ(sc, WMREG_TCTL_EXT);
5819 reg &= ~TCTL_EXT_GCEX_MASK;
5820 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
5821 CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
5822 }
5823
5824 /* Set the media. */
5825 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
5826 goto out;
5827
5828 /* Configure for OS presence */
5829 wm_init_manageability(sc);
5830
5831 /*
5832 * Set up the receive control register; we actually program
5833 * the register when we set the receive filter. Use multicast
5834 * address offset type 0.
5835 *
5836 * Only the i82544 has the ability to strip the incoming
5837 * CRC, so we don't enable that feature.
5838 */
5839 sc->sc_mchash_type = 0;
5840 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
5841 | RCTL_MO(sc->sc_mchash_type);
5842
5843 /*
5844 * 82574 use one buffer extended Rx descriptor.
5845 */
5846 if (sc->sc_type == WM_T_82574)
5847 sc->sc_rctl |= RCTL_DTYP_ONEBUF;
5848
5849 /*
5850 * The I350 has a bug where it always strips the CRC whether
5851 * asked to or not. So ask for stripped CRC here and cope in rxeof
5852 */
5853 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
5854 || (sc->sc_type == WM_T_I210))
5855 sc->sc_rctl |= RCTL_SECRC;
5856
5857 if (((sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
5858 && (ifp->if_mtu > ETHERMTU)) {
5859 sc->sc_rctl |= RCTL_LPE;
5860 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
5861 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
5862 }
5863
5864 if (MCLBYTES == 2048) {
5865 sc->sc_rctl |= RCTL_2k;
5866 } else {
5867 if (sc->sc_type >= WM_T_82543) {
5868 switch (MCLBYTES) {
5869 case 4096:
5870 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k;
5871 break;
5872 case 8192:
5873 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k;
5874 break;
5875 case 16384:
5876 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k;
5877 break;
5878 default:
5879 panic("wm_init: MCLBYTES %d unsupported",
5880 MCLBYTES);
5881 break;
5882 }
5883 } else panic("wm_init: i82542 requires MCLBYTES = 2048");
5884 }
5885
5886 /* Enable ECC */
5887 switch (sc->sc_type) {
5888 case WM_T_82571:
5889 reg = CSR_READ(sc, WMREG_PBA_ECC);
5890 reg |= PBA_ECC_CORR_EN;
5891 CSR_WRITE(sc, WMREG_PBA_ECC, reg);
5892 break;
5893 case WM_T_PCH_LPT:
5894 case WM_T_PCH_SPT:
5895 case WM_T_PCH_CNP:
5896 reg = CSR_READ(sc, WMREG_PBECCSTS);
5897 reg |= PBECCSTS_UNCORR_ECC_ENABLE;
5898 CSR_WRITE(sc, WMREG_PBECCSTS, reg);
5899
5900 sc->sc_ctrl |= CTRL_MEHE;
5901 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
5902 break;
5903 default:
5904 break;
5905 }
5906
5907 /*
5908 * Set the receive filter.
5909 *
5910 * For 82575 and 82576, the RX descriptors must be initialized after
5911 * the setting of RCTL.EN in wm_set_filter()
5912 */
5913 wm_set_filter(sc);
5914
5915 /* On 575 and later set RDT only if RX enabled */
5916 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5917 int qidx;
5918 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5919 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq;
5920 for (i = 0; i < WM_NRXDESC; i++) {
5921 mutex_enter(rxq->rxq_lock);
5922 wm_init_rxdesc(rxq, i);
5923 mutex_exit(rxq->rxq_lock);
5924
5925 }
5926 }
5927 }
5928
5929 wm_unset_stopping_flags(sc);
5930
5931 /* Start the one second link check clock. */
5932 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
5933
5934 /* ...all done! */
5935 ifp->if_flags |= IFF_RUNNING;
5936 ifp->if_flags &= ~IFF_OACTIVE;
5937
5938 out:
5939 sc->sc_if_flags = ifp->if_flags;
5940 if (error)
5941 log(LOG_ERR, "%s: interface not running\n",
5942 device_xname(sc->sc_dev));
5943 return error;
5944 }
5945
5946 /*
5947 * wm_stop: [ifnet interface function]
5948 *
5949 * Stop transmission on the interface.
5950 */
5951 static void
5952 wm_stop(struct ifnet *ifp, int disable)
5953 {
5954 struct wm_softc *sc = ifp->if_softc;
5955
5956 WM_CORE_LOCK(sc);
5957 wm_stop_locked(ifp, disable);
5958 WM_CORE_UNLOCK(sc);
5959 }
5960
5961 static void
5962 wm_stop_locked(struct ifnet *ifp, int disable)
5963 {
5964 struct wm_softc *sc = ifp->if_softc;
5965 struct wm_txsoft *txs;
5966 int i, qidx;
5967
5968 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5969 device_xname(sc->sc_dev), __func__));
5970 KASSERT(WM_CORE_LOCKED(sc));
5971
5972 wm_set_stopping_flags(sc);
5973
5974 /* Stop the one second clock. */
5975 callout_stop(&sc->sc_tick_ch);
5976
5977 /* Stop the 82547 Tx FIFO stall check timer. */
5978 if (sc->sc_type == WM_T_82547)
5979 callout_stop(&sc->sc_txfifo_ch);
5980
5981 if (sc->sc_flags & WM_F_HAS_MII) {
5982 /* Down the MII. */
5983 mii_down(&sc->sc_mii);
5984 } else {
5985 #if 0
5986 /* Should we clear PHY's status properly? */
5987 wm_reset(sc);
5988 #endif
5989 }
5990
5991 /* Stop the transmit and receive processes. */
5992 CSR_WRITE(sc, WMREG_TCTL, 0);
5993 CSR_WRITE(sc, WMREG_RCTL, 0);
5994 sc->sc_rctl &= ~RCTL_EN;
5995
5996 /*
5997 * Clear the interrupt mask to ensure the device cannot assert its
5998 * interrupt line.
5999 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to
6000 * service any currently pending or shared interrupt.
6001 */
6002 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
6003 sc->sc_icr = 0;
6004 if (wm_is_using_msix(sc)) {
6005 if (sc->sc_type != WM_T_82574) {
6006 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
6007 CSR_WRITE(sc, WMREG_EIAC, 0);
6008 } else
6009 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
6010 }
6011
6012 /* Release any queued transmit buffers. */
6013 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
6014 struct wm_queue *wmq = &sc->sc_queue[qidx];
6015 struct wm_txqueue *txq = &wmq->wmq_txq;
6016 mutex_enter(txq->txq_lock);
6017 txq->txq_sending = false; /* ensure watchdog disabled */
6018 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6019 txs = &txq->txq_soft[i];
6020 if (txs->txs_mbuf != NULL) {
6021 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap);
6022 m_freem(txs->txs_mbuf);
6023 txs->txs_mbuf = NULL;
6024 }
6025 }
6026 mutex_exit(txq->txq_lock);
6027 }
6028
6029 /* Mark the interface as down and cancel the watchdog timer. */
6030 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
6031
6032 if (disable) {
6033 for (i = 0; i < sc->sc_nqueues; i++) {
6034 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6035 mutex_enter(rxq->rxq_lock);
6036 wm_rxdrain(rxq);
6037 mutex_exit(rxq->rxq_lock);
6038 }
6039 }
6040
6041 #if 0 /* notyet */
6042 if (sc->sc_type >= WM_T_82544)
6043 CSR_WRITE(sc, WMREG_WUC, 0);
6044 #endif
6045 }
6046
6047 static void
6048 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0)
6049 {
6050 struct mbuf *m;
6051 int i;
6052
6053 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev));
6054 for (m = m0, i = 0; m != NULL; m = m->m_next, i++)
6055 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, "
6056 "m_flags = 0x%08x\n", device_xname(sc->sc_dev),
6057 m->m_data, m->m_len, m->m_flags);
6058 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev),
6059 i, i == 1 ? "" : "s");
6060 }
6061
6062 /*
6063 * wm_82547_txfifo_stall:
6064 *
6065 * Callout used to wait for the 82547 Tx FIFO to drain,
6066 * reset the FIFO pointers, and restart packet transmission.
6067 */
6068 static void
6069 wm_82547_txfifo_stall(void *arg)
6070 {
6071 struct wm_softc *sc = arg;
6072 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6073
6074 mutex_enter(txq->txq_lock);
6075
6076 if (txq->txq_stopping)
6077 goto out;
6078
6079 if (txq->txq_fifo_stall) {
6080 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) &&
6081 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) &&
6082 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) {
6083 /*
6084 * Packets have drained. Stop transmitter, reset
6085 * FIFO pointers, restart transmitter, and kick
6086 * the packet queue.
6087 */
6088 uint32_t tctl = CSR_READ(sc, WMREG_TCTL);
6089 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN);
6090 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr);
6091 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr);
6092 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr);
6093 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr);
6094 CSR_WRITE(sc, WMREG_TCTL, tctl);
6095 CSR_WRITE_FLUSH(sc);
6096
6097 txq->txq_fifo_head = 0;
6098 txq->txq_fifo_stall = 0;
6099 wm_start_locked(&sc->sc_ethercom.ec_if);
6100 } else {
6101 /*
6102 * Still waiting for packets to drain; try again in
6103 * another tick.
6104 */
6105 callout_schedule(&sc->sc_txfifo_ch, 1);
6106 }
6107 }
6108
6109 out:
6110 mutex_exit(txq->txq_lock);
6111 }
6112
6113 /*
6114 * wm_82547_txfifo_bugchk:
6115 *
6116 * Check for bug condition in the 82547 Tx FIFO. We need to
6117 * prevent enqueueing a packet that would wrap around the end
6118 * if the Tx FIFO ring buffer, otherwise the chip will croak.
6119 *
6120 * We do this by checking the amount of space before the end
6121 * of the Tx FIFO buffer. If the packet will not fit, we "stall"
6122 * the Tx FIFO, wait for all remaining packets to drain, reset
6123 * the internal FIFO pointers to the beginning, and restart
6124 * transmission on the interface.
6125 */
6126 #define WM_FIFO_HDR 0x10
6127 #define WM_82547_PAD_LEN 0x3e0
6128 static int
6129 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0)
6130 {
6131 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6132 int space = txq->txq_fifo_size - txq->txq_fifo_head;
6133 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR);
6134
6135 /* Just return if already stalled. */
6136 if (txq->txq_fifo_stall)
6137 return 1;
6138
6139 if (sc->sc_mii.mii_media_active & IFM_FDX) {
6140 /* Stall only occurs in half-duplex mode. */
6141 goto send_packet;
6142 }
6143
6144 if (len >= WM_82547_PAD_LEN + space) {
6145 txq->txq_fifo_stall = 1;
6146 callout_schedule(&sc->sc_txfifo_ch, 1);
6147 return 1;
6148 }
6149
6150 send_packet:
6151 txq->txq_fifo_head += len;
6152 if (txq->txq_fifo_head >= txq->txq_fifo_size)
6153 txq->txq_fifo_head -= txq->txq_fifo_size;
6154
6155 return 0;
6156 }
6157
6158 static int
6159 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6160 {
6161 int error;
6162
6163 /*
6164 * Allocate the control data structures, and create and load the
6165 * DMA map for it.
6166 *
6167 * NOTE: All Tx descriptors must be in the same 4G segment of
6168 * memory. So must Rx descriptors. We simplify by allocating
6169 * both sets within the same 4G segment.
6170 */
6171 if (sc->sc_type < WM_T_82544)
6172 WM_NTXDESC(txq) = WM_NTXDESC_82542;
6173 else
6174 WM_NTXDESC(txq) = WM_NTXDESC_82544;
6175 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6176 txq->txq_descsize = sizeof(nq_txdesc_t);
6177 else
6178 txq->txq_descsize = sizeof(wiseman_txdesc_t);
6179
6180 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq),
6181 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg,
6182 1, &txq->txq_desc_rseg, 0)) != 0) {
6183 aprint_error_dev(sc->sc_dev,
6184 "unable to allocate TX control data, error = %d\n",
6185 error);
6186 goto fail_0;
6187 }
6188
6189 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg,
6190 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq),
6191 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) {
6192 aprint_error_dev(sc->sc_dev,
6193 "unable to map TX control data, error = %d\n", error);
6194 goto fail_1;
6195 }
6196
6197 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1,
6198 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) {
6199 aprint_error_dev(sc->sc_dev,
6200 "unable to create TX control data DMA map, error = %d\n",
6201 error);
6202 goto fail_2;
6203 }
6204
6205 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap,
6206 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) {
6207 aprint_error_dev(sc->sc_dev,
6208 "unable to load TX control data DMA map, error = %d\n",
6209 error);
6210 goto fail_3;
6211 }
6212
6213 return 0;
6214
6215 fail_3:
6216 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6217 fail_2:
6218 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6219 WM_TXDESCS_SIZE(txq));
6220 fail_1:
6221 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6222 fail_0:
6223 return error;
6224 }
6225
6226 static void
6227 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
6228 {
6229
6230 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap);
6231 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
6232 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
6233 WM_TXDESCS_SIZE(txq));
6234 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
6235 }
6236
6237 static int
6238 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6239 {
6240 int error;
6241 size_t rxq_descs_size;
6242
6243 /*
6244 * Allocate the control data structures, and create and load the
6245 * DMA map for it.
6246 *
6247 * NOTE: All Tx descriptors must be in the same 4G segment of
6248 * memory. So must Rx descriptors. We simplify by allocating
6249 * both sets within the same 4G segment.
6250 */
6251 rxq->rxq_ndesc = WM_NRXDESC;
6252 if (sc->sc_type == WM_T_82574)
6253 rxq->rxq_descsize = sizeof(ext_rxdesc_t);
6254 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6255 rxq->rxq_descsize = sizeof(nq_rxdesc_t);
6256 else
6257 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t);
6258 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc;
6259
6260 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size,
6261 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg,
6262 1, &rxq->rxq_desc_rseg, 0)) != 0) {
6263 aprint_error_dev(sc->sc_dev,
6264 "unable to allocate RX control data, error = %d\n",
6265 error);
6266 goto fail_0;
6267 }
6268
6269 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg,
6270 rxq->rxq_desc_rseg, rxq_descs_size,
6271 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) {
6272 aprint_error_dev(sc->sc_dev,
6273 "unable to map RX control data, error = %d\n", error);
6274 goto fail_1;
6275 }
6276
6277 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1,
6278 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) {
6279 aprint_error_dev(sc->sc_dev,
6280 "unable to create RX control data DMA map, error = %d\n",
6281 error);
6282 goto fail_2;
6283 }
6284
6285 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap,
6286 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) {
6287 aprint_error_dev(sc->sc_dev,
6288 "unable to load RX control data DMA map, error = %d\n",
6289 error);
6290 goto fail_3;
6291 }
6292
6293 return 0;
6294
6295 fail_3:
6296 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
6297 fail_2:
6298 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
6299 rxq_descs_size);
6300 fail_1:
6301 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
6302 fail_0:
6303 return error;
6304 }
6305
6306 static void
6307 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
6308 {
6309
6310 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap);
6311 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
6312 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
6313 rxq->rxq_descsize * rxq->rxq_ndesc);
6314 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
6315 }
6316
6317
6318 static int
6319 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
6320 {
6321 int i, error;
6322
6323 /* Create the transmit buffer DMA maps. */
6324 WM_TXQUEUELEN(txq) =
6325 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ?
6326 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX;
6327 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6328 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA,
6329 WM_NTXSEGS, WTX_MAX_LEN, 0, 0,
6330 &txq->txq_soft[i].txs_dmamap)) != 0) {
6331 aprint_error_dev(sc->sc_dev,
6332 "unable to create Tx DMA map %d, error = %d\n",
6333 i, error);
6334 goto fail;
6335 }
6336 }
6337
6338 return 0;
6339
6340 fail:
6341 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6342 if (txq->txq_soft[i].txs_dmamap != NULL)
6343 bus_dmamap_destroy(sc->sc_dmat,
6344 txq->txq_soft[i].txs_dmamap);
6345 }
6346 return error;
6347 }
6348
6349 static void
6350 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
6351 {
6352 int i;
6353
6354 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
6355 if (txq->txq_soft[i].txs_dmamap != NULL)
6356 bus_dmamap_destroy(sc->sc_dmat,
6357 txq->txq_soft[i].txs_dmamap);
6358 }
6359 }
6360
6361 static int
6362 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6363 {
6364 int i, error;
6365
6366 /* Create the receive buffer DMA maps. */
6367 for (i = 0; i < rxq->rxq_ndesc; i++) {
6368 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
6369 MCLBYTES, 0, 0,
6370 &rxq->rxq_soft[i].rxs_dmamap)) != 0) {
6371 aprint_error_dev(sc->sc_dev,
6372 "unable to create Rx DMA map %d error = %d\n",
6373 i, error);
6374 goto fail;
6375 }
6376 rxq->rxq_soft[i].rxs_mbuf = NULL;
6377 }
6378
6379 return 0;
6380
6381 fail:
6382 for (i = 0; i < rxq->rxq_ndesc; i++) {
6383 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
6384 bus_dmamap_destroy(sc->sc_dmat,
6385 rxq->rxq_soft[i].rxs_dmamap);
6386 }
6387 return error;
6388 }
6389
6390 static void
6391 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6392 {
6393 int i;
6394
6395 for (i = 0; i < rxq->rxq_ndesc; i++) {
6396 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
6397 bus_dmamap_destroy(sc->sc_dmat,
6398 rxq->rxq_soft[i].rxs_dmamap);
6399 }
6400 }
6401
6402 /*
6403 * wm_alloc_quques:
6404 * Allocate {tx,rx}descs and {tx,rx} buffers
6405 */
6406 static int
6407 wm_alloc_txrx_queues(struct wm_softc *sc)
6408 {
6409 int i, error, tx_done, rx_done;
6410
6411 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues,
6412 KM_SLEEP);
6413 if (sc->sc_queue == NULL) {
6414 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n");
6415 error = ENOMEM;
6416 goto fail_0;
6417 }
6418
6419 /*
6420 * For transmission
6421 */
6422 error = 0;
6423 tx_done = 0;
6424 for (i = 0; i < sc->sc_nqueues; i++) {
6425 #ifdef WM_EVENT_COUNTERS
6426 int j;
6427 const char *xname;
6428 #endif
6429 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6430 txq->txq_sc = sc;
6431 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
6432
6433 error = wm_alloc_tx_descs(sc, txq);
6434 if (error)
6435 break;
6436 error = wm_alloc_tx_buffer(sc, txq);
6437 if (error) {
6438 wm_free_tx_descs(sc, txq);
6439 break;
6440 }
6441 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP);
6442 if (txq->txq_interq == NULL) {
6443 wm_free_tx_descs(sc, txq);
6444 wm_free_tx_buffer(sc, txq);
6445 error = ENOMEM;
6446 break;
6447 }
6448
6449 #ifdef WM_EVENT_COUNTERS
6450 xname = device_xname(sc->sc_dev);
6451
6452 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname);
6453 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname);
6454 WM_Q_MISC_EVCNT_ATTACH(txq, txfifo_stall, txq, i, xname);
6455 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname);
6456 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname);
6457
6458 WM_Q_MISC_EVCNT_ATTACH(txq, txipsum, txq, i, xname);
6459 WM_Q_MISC_EVCNT_ATTACH(txq, txtusum, txq, i, xname);
6460 WM_Q_MISC_EVCNT_ATTACH(txq, txtusum6, txq, i, xname);
6461 WM_Q_MISC_EVCNT_ATTACH(txq, txtso, txq, i, xname);
6462 WM_Q_MISC_EVCNT_ATTACH(txq, txtso6, txq, i, xname);
6463 WM_Q_MISC_EVCNT_ATTACH(txq, txtsopain, txq, i, xname);
6464
6465 for (j = 0; j < WM_NTXSEGS; j++) {
6466 snprintf(txq->txq_txseg_evcnt_names[j],
6467 sizeof(txq->txq_txseg_evcnt_names[j]), "txq%02dtxseg%d", i, j);
6468 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], EVCNT_TYPE_MISC,
6469 NULL, xname, txq->txq_txseg_evcnt_names[j]);
6470 }
6471
6472 WM_Q_MISC_EVCNT_ATTACH(txq, txdrop, txq, i, xname);
6473
6474 WM_Q_MISC_EVCNT_ATTACH(txq, tu, txq, i, xname);
6475 #endif /* WM_EVENT_COUNTERS */
6476
6477 tx_done++;
6478 }
6479 if (error)
6480 goto fail_1;
6481
6482 /*
6483 * For recieve
6484 */
6485 error = 0;
6486 rx_done = 0;
6487 for (i = 0; i < sc->sc_nqueues; i++) {
6488 #ifdef WM_EVENT_COUNTERS
6489 const char *xname;
6490 #endif
6491 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6492 rxq->rxq_sc = sc;
6493 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
6494
6495 error = wm_alloc_rx_descs(sc, rxq);
6496 if (error)
6497 break;
6498
6499 error = wm_alloc_rx_buffer(sc, rxq);
6500 if (error) {
6501 wm_free_rx_descs(sc, rxq);
6502 break;
6503 }
6504
6505 #ifdef WM_EVENT_COUNTERS
6506 xname = device_xname(sc->sc_dev);
6507
6508 WM_Q_INTR_EVCNT_ATTACH(rxq, rxintr, rxq, i, xname);
6509 WM_Q_INTR_EVCNT_ATTACH(rxq, rxdefer, rxq, i, xname);
6510
6511 WM_Q_INTR_EVCNT_ATTACH(rxq, rxipsum, rxq, i, xname);
6512 WM_Q_INTR_EVCNT_ATTACH(rxq, rxtusum, rxq, i, xname);
6513 #endif /* WM_EVENT_COUNTERS */
6514
6515 rx_done++;
6516 }
6517 if (error)
6518 goto fail_2;
6519
6520 return 0;
6521
6522 fail_2:
6523 for (i = 0; i < rx_done; i++) {
6524 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6525 wm_free_rx_buffer(sc, rxq);
6526 wm_free_rx_descs(sc, rxq);
6527 if (rxq->rxq_lock)
6528 mutex_obj_free(rxq->rxq_lock);
6529 }
6530 fail_1:
6531 for (i = 0; i < tx_done; i++) {
6532 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6533 pcq_destroy(txq->txq_interq);
6534 wm_free_tx_buffer(sc, txq);
6535 wm_free_tx_descs(sc, txq);
6536 if (txq->txq_lock)
6537 mutex_obj_free(txq->txq_lock);
6538 }
6539
6540 kmem_free(sc->sc_queue,
6541 sizeof(struct wm_queue) * sc->sc_nqueues);
6542 fail_0:
6543 return error;
6544 }
6545
6546 /*
6547 * wm_free_quques:
6548 * Free {tx,rx}descs and {tx,rx} buffers
6549 */
6550 static void
6551 wm_free_txrx_queues(struct wm_softc *sc)
6552 {
6553 int i;
6554
6555 for (i = 0; i < sc->sc_nqueues; i++) {
6556 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
6557
6558 #ifdef WM_EVENT_COUNTERS
6559 WM_Q_EVCNT_DETACH(rxq, rxintr, rxq, i);
6560 WM_Q_EVCNT_DETACH(rxq, rxdefer, rxq, i);
6561 WM_Q_EVCNT_DETACH(rxq, rxipsum, rxq, i);
6562 WM_Q_EVCNT_DETACH(rxq, rxtusum, rxq, i);
6563 #endif /* WM_EVENT_COUNTERS */
6564
6565 wm_free_rx_buffer(sc, rxq);
6566 wm_free_rx_descs(sc, rxq);
6567 if (rxq->rxq_lock)
6568 mutex_obj_free(rxq->rxq_lock);
6569 }
6570
6571 for (i = 0; i < sc->sc_nqueues; i++) {
6572 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
6573 struct mbuf *m;
6574 #ifdef WM_EVENT_COUNTERS
6575 int j;
6576
6577 WM_Q_EVCNT_DETACH(txq, txsstall, txq, i);
6578 WM_Q_EVCNT_DETACH(txq, txdstall, txq, i);
6579 WM_Q_EVCNT_DETACH(txq, txfifo_stall, txq, i);
6580 WM_Q_EVCNT_DETACH(txq, txdw, txq, i);
6581 WM_Q_EVCNT_DETACH(txq, txqe, txq, i);
6582 WM_Q_EVCNT_DETACH(txq, txipsum, txq, i);
6583 WM_Q_EVCNT_DETACH(txq, txtusum, txq, i);
6584 WM_Q_EVCNT_DETACH(txq, txtusum6, txq, i);
6585 WM_Q_EVCNT_DETACH(txq, txtso, txq, i);
6586 WM_Q_EVCNT_DETACH(txq, txtso6, txq, i);
6587 WM_Q_EVCNT_DETACH(txq, txtsopain, txq, i);
6588
6589 for (j = 0; j < WM_NTXSEGS; j++)
6590 evcnt_detach(&txq->txq_ev_txseg[j]);
6591
6592 WM_Q_EVCNT_DETACH(txq, txdrop, txq, i);
6593 WM_Q_EVCNT_DETACH(txq, tu, txq, i);
6594 #endif /* WM_EVENT_COUNTERS */
6595
6596 /* drain txq_interq */
6597 while ((m = pcq_get(txq->txq_interq)) != NULL)
6598 m_freem(m);
6599 pcq_destroy(txq->txq_interq);
6600
6601 wm_free_tx_buffer(sc, txq);
6602 wm_free_tx_descs(sc, txq);
6603 if (txq->txq_lock)
6604 mutex_obj_free(txq->txq_lock);
6605 }
6606
6607 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues);
6608 }
6609
6610 static void
6611 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq)
6612 {
6613
6614 KASSERT(mutex_owned(txq->txq_lock));
6615
6616 /* Initialize the transmit descriptor ring. */
6617 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq));
6618 wm_cdtxsync(txq, 0, WM_NTXDESC(txq),
6619 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
6620 txq->txq_free = WM_NTXDESC(txq);
6621 txq->txq_next = 0;
6622 }
6623
6624 static void
6625 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq,
6626 struct wm_txqueue *txq)
6627 {
6628
6629 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
6630 device_xname(sc->sc_dev), __func__));
6631 KASSERT(mutex_owned(txq->txq_lock));
6632
6633 if (sc->sc_type < WM_T_82543) {
6634 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0));
6635 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0));
6636 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq));
6637 CSR_WRITE(sc, WMREG_OLD_TDH, 0);
6638 CSR_WRITE(sc, WMREG_OLD_TDT, 0);
6639 CSR_WRITE(sc, WMREG_OLD_TIDV, 128);
6640 } else {
6641 int qid = wmq->wmq_id;
6642
6643 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0));
6644 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0));
6645 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq));
6646 CSR_WRITE(sc, WMREG_TDH(qid), 0);
6647
6648 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
6649 /*
6650 * Don't write TDT before TCTL.EN is set.
6651 * See the document.
6652 */
6653 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE
6654 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0)
6655 | TXDCTL_WTHRESH(0));
6656 else {
6657 /* XXX should update with AIM? */
6658 CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4);
6659 if (sc->sc_type >= WM_T_82540) {
6660 /* should be same */
6661 CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4);
6662 }
6663
6664 CSR_WRITE(sc, WMREG_TDT(qid), 0);
6665 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) |
6666 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
6667 }
6668 }
6669 }
6670
6671 static void
6672 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq)
6673 {
6674 int i;
6675
6676 KASSERT(mutex_owned(txq->txq_lock));
6677
6678 /* Initialize the transmit job descriptors. */
6679 for (i = 0; i < WM_TXQUEUELEN(txq); i++)
6680 txq->txq_soft[i].txs_mbuf = NULL;
6681 txq->txq_sfree = WM_TXQUEUELEN(txq);
6682 txq->txq_snext = 0;
6683 txq->txq_sdirty = 0;
6684 }
6685
6686 static void
6687 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq,
6688 struct wm_txqueue *txq)
6689 {
6690
6691 KASSERT(mutex_owned(txq->txq_lock));
6692
6693 /*
6694 * Set up some register offsets that are different between
6695 * the i82542 and the i82543 and later chips.
6696 */
6697 if (sc->sc_type < WM_T_82543)
6698 txq->txq_tdt_reg = WMREG_OLD_TDT;
6699 else
6700 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id);
6701
6702 wm_init_tx_descs(sc, txq);
6703 wm_init_tx_regs(sc, wmq, txq);
6704 wm_init_tx_buffer(sc, txq);
6705
6706 txq->txq_sending = false;
6707 }
6708
6709 static void
6710 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq,
6711 struct wm_rxqueue *rxq)
6712 {
6713
6714 KASSERT(mutex_owned(rxq->rxq_lock));
6715
6716 /*
6717 * Initialize the receive descriptor and receive job
6718 * descriptor rings.
6719 */
6720 if (sc->sc_type < WM_T_82543) {
6721 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0));
6722 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0));
6723 CSR_WRITE(sc, WMREG_OLD_RDLEN0,
6724 rxq->rxq_descsize * rxq->rxq_ndesc);
6725 CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
6726 CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
6727 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD);
6728
6729 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
6730 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
6731 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
6732 CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
6733 CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
6734 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
6735 } else {
6736 int qid = wmq->wmq_id;
6737
6738 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0));
6739 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0));
6740 CSR_WRITE(sc, WMREG_RDLEN(qid),
6741 rxq->rxq_descsize * rxq->rxq_ndesc);
6742
6743 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6744 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
6745 panic("%s: MCLBYTES %d unsupported for 82575 or higher\n", __func__, MCLBYTES);
6746
6747 /* Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF only. */
6748 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_ADV_ONEBUF
6749 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
6750 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE
6751 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8)
6752 | RXDCTL_WTHRESH(1));
6753 CSR_WRITE(sc, WMREG_RDH(qid), 0);
6754 CSR_WRITE(sc, WMREG_RDT(qid), 0);
6755 } else {
6756 CSR_WRITE(sc, WMREG_RDH(qid), 0);
6757 CSR_WRITE(sc, WMREG_RDT(qid), 0);
6758 /* XXX should update with AIM? */
6759 CSR_WRITE(sc, WMREG_RDTR,
6760 (wmq->wmq_itr / 4) | RDTR_FPD);
6761 /* MUST be same */
6762 CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4);
6763 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) |
6764 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
6765 }
6766 }
6767 }
6768
6769 static int
6770 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6771 {
6772 struct wm_rxsoft *rxs;
6773 int error, i;
6774
6775 KASSERT(mutex_owned(rxq->rxq_lock));
6776
6777 for (i = 0; i < rxq->rxq_ndesc; i++) {
6778 rxs = &rxq->rxq_soft[i];
6779 if (rxs->rxs_mbuf == NULL) {
6780 if ((error = wm_add_rxbuf(rxq, i)) != 0) {
6781 log(LOG_ERR, "%s: unable to allocate or map "
6782 "rx buffer %d, error = %d\n",
6783 device_xname(sc->sc_dev), i, error);
6784 /*
6785 * XXX Should attempt to run with fewer receive
6786 * XXX buffers instead of just failing.
6787 */
6788 wm_rxdrain(rxq);
6789 return ENOMEM;
6790 }
6791 } else {
6792 /*
6793 * For 82575 and 82576, the RX descriptors must be
6794 * initialized after the setting of RCTL.EN in
6795 * wm_set_filter()
6796 */
6797 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0)
6798 wm_init_rxdesc(rxq, i);
6799 }
6800 }
6801 rxq->rxq_ptr = 0;
6802 rxq->rxq_discard = 0;
6803 WM_RXCHAIN_RESET(rxq);
6804
6805 return 0;
6806 }
6807
6808 static int
6809 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq,
6810 struct wm_rxqueue *rxq)
6811 {
6812
6813 KASSERT(mutex_owned(rxq->rxq_lock));
6814
6815 /*
6816 * Set up some register offsets that are different between
6817 * the i82542 and the i82543 and later chips.
6818 */
6819 if (sc->sc_type < WM_T_82543)
6820 rxq->rxq_rdt_reg = WMREG_OLD_RDT0;
6821 else
6822 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id);
6823
6824 wm_init_rx_regs(sc, wmq, rxq);
6825 return wm_init_rx_buffer(sc, rxq);
6826 }
6827
6828 /*
6829 * wm_init_quques:
6830 * Initialize {tx,rx}descs and {tx,rx} buffers
6831 */
6832 static int
6833 wm_init_txrx_queues(struct wm_softc *sc)
6834 {
6835 int i, error = 0;
6836
6837 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
6838 device_xname(sc->sc_dev), __func__));
6839
6840 for (i = 0; i < sc->sc_nqueues; i++) {
6841 struct wm_queue *wmq = &sc->sc_queue[i];
6842 struct wm_txqueue *txq = &wmq->wmq_txq;
6843 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
6844
6845 /*
6846 * TODO
6847 * Currently, use constant variable instead of AIM.
6848 * Furthermore, the interrupt interval of multiqueue which use
6849 * polling mode is less than default value.
6850 * More tuning and AIM are required.
6851 */
6852 if (wm_is_using_multiqueue(sc))
6853 wmq->wmq_itr = 50;
6854 else
6855 wmq->wmq_itr = sc->sc_itr_init;
6856 wmq->wmq_set_itr = true;
6857
6858 mutex_enter(txq->txq_lock);
6859 wm_init_tx_queue(sc, wmq, txq);
6860 mutex_exit(txq->txq_lock);
6861
6862 mutex_enter(rxq->rxq_lock);
6863 error = wm_init_rx_queue(sc, wmq, rxq);
6864 mutex_exit(rxq->rxq_lock);
6865 if (error)
6866 break;
6867 }
6868
6869 return error;
6870 }
6871
6872 /*
6873 * wm_tx_offload:
6874 *
6875 * Set up TCP/IP checksumming parameters for the
6876 * specified packet.
6877 */
6878 static int
6879 wm_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
6880 struct wm_txsoft *txs, uint32_t *cmdp, uint8_t *fieldsp)
6881 {
6882 struct mbuf *m0 = txs->txs_mbuf;
6883 struct livengood_tcpip_ctxdesc *t;
6884 uint32_t ipcs, tucs, cmd, cmdlen, seg;
6885 uint32_t ipcse;
6886 struct ether_header *eh;
6887 int offset, iphl;
6888 uint8_t fields;
6889
6890 /*
6891 * XXX It would be nice if the mbuf pkthdr had offset
6892 * fields for the protocol headers.
6893 */
6894
6895 eh = mtod(m0, struct ether_header *);
6896 switch (htons(eh->ether_type)) {
6897 case ETHERTYPE_IP:
6898 case ETHERTYPE_IPV6:
6899 offset = ETHER_HDR_LEN;
6900 break;
6901
6902 case ETHERTYPE_VLAN:
6903 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
6904 break;
6905
6906 default:
6907 /*
6908 * Don't support this protocol or encapsulation.
6909 */
6910 *fieldsp = 0;
6911 *cmdp = 0;
6912 return 0;
6913 }
6914
6915 if ((m0->m_pkthdr.csum_flags &
6916 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
6917 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
6918 } else {
6919 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
6920 }
6921 ipcse = offset + iphl - 1;
6922
6923 cmd = WTX_CMD_DEXT | WTX_DTYP_D;
6924 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE;
6925 seg = 0;
6926 fields = 0;
6927
6928 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
6929 int hlen = offset + iphl;
6930 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
6931
6932 if (__predict_false(m0->m_len <
6933 (hlen + sizeof(struct tcphdr)))) {
6934 /*
6935 * TCP/IP headers are not in the first mbuf; we need
6936 * to do this the slow and painful way. Let's just
6937 * hope this doesn't happen very often.
6938 */
6939 struct tcphdr th;
6940
6941 WM_Q_EVCNT_INCR(txq, txtsopain);
6942
6943 m_copydata(m0, hlen, sizeof(th), &th);
6944 if (v4) {
6945 struct ip ip;
6946
6947 m_copydata(m0, offset, sizeof(ip), &ip);
6948 ip.ip_len = 0;
6949 m_copyback(m0,
6950 offset + offsetof(struct ip, ip_len),
6951 sizeof(ip.ip_len), &ip.ip_len);
6952 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
6953 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
6954 } else {
6955 struct ip6_hdr ip6;
6956
6957 m_copydata(m0, offset, sizeof(ip6), &ip6);
6958 ip6.ip6_plen = 0;
6959 m_copyback(m0,
6960 offset + offsetof(struct ip6_hdr, ip6_plen),
6961 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
6962 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
6963 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
6964 }
6965 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
6966 sizeof(th.th_sum), &th.th_sum);
6967
6968 hlen += th.th_off << 2;
6969 } else {
6970 /*
6971 * TCP/IP headers are in the first mbuf; we can do
6972 * this the easy way.
6973 */
6974 struct tcphdr *th;
6975
6976 if (v4) {
6977 struct ip *ip =
6978 (void *)(mtod(m0, char *) + offset);
6979 th = (void *)(mtod(m0, char *) + hlen);
6980
6981 ip->ip_len = 0;
6982 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
6983 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
6984 } else {
6985 struct ip6_hdr *ip6 =
6986 (void *)(mtod(m0, char *) + offset);
6987 th = (void *)(mtod(m0, char *) + hlen);
6988
6989 ip6->ip6_plen = 0;
6990 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
6991 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
6992 }
6993 hlen += th->th_off << 2;
6994 }
6995
6996 if (v4) {
6997 WM_Q_EVCNT_INCR(txq, txtso);
6998 cmdlen |= WTX_TCPIP_CMD_IP;
6999 } else {
7000 WM_Q_EVCNT_INCR(txq, txtso6);
7001 ipcse = 0;
7002 }
7003 cmd |= WTX_TCPIP_CMD_TSE;
7004 cmdlen |= WTX_TCPIP_CMD_TSE |
7005 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen);
7006 seg = WTX_TCPIP_SEG_HDRLEN(hlen) |
7007 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz);
7008 }
7009
7010 /*
7011 * NOTE: Even if we're not using the IP or TCP/UDP checksum
7012 * offload feature, if we load the context descriptor, we
7013 * MUST provide valid values for IPCSS and TUCSS fields.
7014 */
7015
7016 ipcs = WTX_TCPIP_IPCSS(offset) |
7017 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
7018 WTX_TCPIP_IPCSE(ipcse);
7019 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) {
7020 WM_Q_EVCNT_INCR(txq, txipsum);
7021 fields |= WTX_IXSM;
7022 }
7023
7024 offset += iphl;
7025
7026 if (m0->m_pkthdr.csum_flags &
7027 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) {
7028 WM_Q_EVCNT_INCR(txq, txtusum);
7029 fields |= WTX_TXSM;
7030 tucs = WTX_TCPIP_TUCSS(offset) |
7031 WTX_TCPIP_TUCSO(offset +
7032 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) |
7033 WTX_TCPIP_TUCSE(0) /* rest of packet */;
7034 } else if ((m0->m_pkthdr.csum_flags &
7035 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) {
7036 WM_Q_EVCNT_INCR(txq, txtusum6);
7037 fields |= WTX_TXSM;
7038 tucs = WTX_TCPIP_TUCSS(offset) |
7039 WTX_TCPIP_TUCSO(offset +
7040 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) |
7041 WTX_TCPIP_TUCSE(0) /* rest of packet */;
7042 } else {
7043 /* Just initialize it to a valid TCP context. */
7044 tucs = WTX_TCPIP_TUCSS(offset) |
7045 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
7046 WTX_TCPIP_TUCSE(0) /* rest of packet */;
7047 }
7048
7049 /*
7050 * We don't have to write context descriptor for every packet
7051 * except for 82574. For 82574, we must write context descriptor
7052 * for every packet when we use two descriptor queues.
7053 * It would be overhead to write context descriptor for every packet,
7054 * however it does not cause problems.
7055 */
7056 /* Fill in the context descriptor. */
7057 t = (struct livengood_tcpip_ctxdesc *)
7058 &txq->txq_descs[txq->txq_next];
7059 t->tcpip_ipcs = htole32(ipcs);
7060 t->tcpip_tucs = htole32(tucs);
7061 t->tcpip_cmdlen = htole32(cmdlen);
7062 t->tcpip_seg = htole32(seg);
7063 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
7064
7065 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
7066 txs->txs_ndesc++;
7067
7068 *cmdp = cmd;
7069 *fieldsp = fields;
7070
7071 return 0;
7072 }
7073
7074 static inline int
7075 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m)
7076 {
7077 struct wm_softc *sc = ifp->if_softc;
7078 u_int cpuid = cpu_index(curcpu());
7079
7080 /*
7081 * Currently, simple distribute strategy.
7082 * TODO:
7083 * distribute by flowid(RSS has value).
7084 */
7085 return (cpuid + ncpu - sc->sc_affinity_offset) % sc->sc_nqueues;
7086 }
7087
7088 /*
7089 * wm_start: [ifnet interface function]
7090 *
7091 * Start packet transmission on the interface.
7092 */
7093 static void
7094 wm_start(struct ifnet *ifp)
7095 {
7096 struct wm_softc *sc = ifp->if_softc;
7097 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7098
7099 #ifdef WM_MPSAFE
7100 KASSERT(if_is_mpsafe(ifp));
7101 #endif
7102 /*
7103 * ifp->if_obytes and ifp->if_omcasts are added in if_transmit()@if.c.
7104 */
7105
7106 mutex_enter(txq->txq_lock);
7107 if (!txq->txq_stopping)
7108 wm_start_locked(ifp);
7109 mutex_exit(txq->txq_lock);
7110 }
7111
7112 static void
7113 wm_start_locked(struct ifnet *ifp)
7114 {
7115 struct wm_softc *sc = ifp->if_softc;
7116 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7117
7118 wm_send_common_locked(ifp, txq, false);
7119 }
7120
7121 static int
7122 wm_transmit(struct ifnet *ifp, struct mbuf *m)
7123 {
7124 int qid;
7125 struct wm_softc *sc = ifp->if_softc;
7126 struct wm_txqueue *txq;
7127
7128 qid = wm_select_txqueue(ifp, m);
7129 txq = &sc->sc_queue[qid].wmq_txq;
7130
7131 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7132 m_freem(m);
7133 WM_Q_EVCNT_INCR(txq, txdrop);
7134 return ENOBUFS;
7135 }
7136
7137 /*
7138 * XXXX NOMPSAFE: ifp->if_data should be percpu.
7139 */
7140 ifp->if_obytes += m->m_pkthdr.len;
7141 if (m->m_flags & M_MCAST)
7142 ifp->if_omcasts++;
7143
7144 if (mutex_tryenter(txq->txq_lock)) {
7145 if (!txq->txq_stopping)
7146 wm_transmit_locked(ifp, txq);
7147 mutex_exit(txq->txq_lock);
7148 }
7149
7150 return 0;
7151 }
7152
7153 static void
7154 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7155 {
7156
7157 wm_send_common_locked(ifp, txq, true);
7158 }
7159
7160 static void
7161 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7162 bool is_transmit)
7163 {
7164 struct wm_softc *sc = ifp->if_softc;
7165 struct mbuf *m0;
7166 struct wm_txsoft *txs;
7167 bus_dmamap_t dmamap;
7168 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso;
7169 bus_addr_t curaddr;
7170 bus_size_t seglen, curlen;
7171 uint32_t cksumcmd;
7172 uint8_t cksumfields;
7173
7174 KASSERT(mutex_owned(txq->txq_lock));
7175
7176 if ((ifp->if_flags & IFF_RUNNING) == 0)
7177 return;
7178 if ((ifp->if_flags & IFF_OACTIVE) != 0 && !is_transmit)
7179 return;
7180 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7181 return;
7182
7183 /* Remember the previous number of free descriptors. */
7184 ofree = txq->txq_free;
7185
7186 /*
7187 * Loop through the send queue, setting up transmit descriptors
7188 * until we drain the queue, or use up all available transmit
7189 * descriptors.
7190 */
7191 for (;;) {
7192 m0 = NULL;
7193
7194 /* Get a work queue entry. */
7195 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7196 wm_txeof(txq, UINT_MAX);
7197 if (txq->txq_sfree == 0) {
7198 DPRINTF(WM_DEBUG_TX,
7199 ("%s: TX: no free job descriptors\n",
7200 device_xname(sc->sc_dev)));
7201 WM_Q_EVCNT_INCR(txq, txsstall);
7202 break;
7203 }
7204 }
7205
7206 /* Grab a packet off the queue. */
7207 if (is_transmit)
7208 m0 = pcq_get(txq->txq_interq);
7209 else
7210 IFQ_DEQUEUE(&ifp->if_snd, m0);
7211 if (m0 == NULL)
7212 break;
7213
7214 DPRINTF(WM_DEBUG_TX,
7215 ("%s: TX: have packet to transmit: %p\n",
7216 device_xname(sc->sc_dev), m0));
7217
7218 txs = &txq->txq_soft[txq->txq_snext];
7219 dmamap = txs->txs_dmamap;
7220
7221 use_tso = (m0->m_pkthdr.csum_flags &
7222 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0;
7223
7224 /*
7225 * So says the Linux driver:
7226 * The controller does a simple calculation to make sure
7227 * there is enough room in the FIFO before initiating the
7228 * DMA for each buffer. The calc is:
7229 * 4 = ceil(buffer len / MSS)
7230 * To make sure we don't overrun the FIFO, adjust the max
7231 * buffer len if the MSS drops.
7232 */
7233 dmamap->dm_maxsegsz =
7234 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN)
7235 ? m0->m_pkthdr.segsz << 2
7236 : WTX_MAX_LEN;
7237
7238 /*
7239 * Load the DMA map. If this fails, the packet either
7240 * didn't fit in the allotted number of segments, or we
7241 * were short on resources. For the too-many-segments
7242 * case, we simply report an error and drop the packet,
7243 * since we can't sanely copy a jumbo packet to a single
7244 * buffer.
7245 */
7246 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
7247 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
7248 if (error) {
7249 if (error == EFBIG) {
7250 WM_Q_EVCNT_INCR(txq, txdrop);
7251 log(LOG_ERR, "%s: Tx packet consumes too many "
7252 "DMA segments, dropping...\n",
7253 device_xname(sc->sc_dev));
7254 wm_dump_mbuf_chain(sc, m0);
7255 m_freem(m0);
7256 continue;
7257 }
7258 /* Short on resources, just stop for now. */
7259 DPRINTF(WM_DEBUG_TX,
7260 ("%s: TX: dmamap load failed: %d\n",
7261 device_xname(sc->sc_dev), error));
7262 break;
7263 }
7264
7265 segs_needed = dmamap->dm_nsegs;
7266 if (use_tso) {
7267 /* For sentinel descriptor; see below. */
7268 segs_needed++;
7269 }
7270
7271 /*
7272 * Ensure we have enough descriptors free to describe
7273 * the packet. Note, we always reserve one descriptor
7274 * at the end of the ring due to the semantics of the
7275 * TDT register, plus one more in the event we need
7276 * to load offload context.
7277 */
7278 if (segs_needed > txq->txq_free - 2) {
7279 /*
7280 * Not enough free descriptors to transmit this
7281 * packet. We haven't committed anything yet,
7282 * so just unload the DMA map, put the packet
7283 * pack on the queue, and punt. Notify the upper
7284 * layer that there are no more slots left.
7285 */
7286 DPRINTF(WM_DEBUG_TX,
7287 ("%s: TX: need %d (%d) descriptors, have %d\n",
7288 device_xname(sc->sc_dev), dmamap->dm_nsegs,
7289 segs_needed, txq->txq_free - 1));
7290 if (!is_transmit)
7291 ifp->if_flags |= IFF_OACTIVE;
7292 txq->txq_flags |= WM_TXQ_NO_SPACE;
7293 bus_dmamap_unload(sc->sc_dmat, dmamap);
7294 WM_Q_EVCNT_INCR(txq, txdstall);
7295 break;
7296 }
7297
7298 /*
7299 * Check for 82547 Tx FIFO bug. We need to do this
7300 * once we know we can transmit the packet, since we
7301 * do some internal FIFO space accounting here.
7302 */
7303 if (sc->sc_type == WM_T_82547 &&
7304 wm_82547_txfifo_bugchk(sc, m0)) {
7305 DPRINTF(WM_DEBUG_TX,
7306 ("%s: TX: 82547 Tx FIFO bug detected\n",
7307 device_xname(sc->sc_dev)));
7308 if (!is_transmit)
7309 ifp->if_flags |= IFF_OACTIVE;
7310 txq->txq_flags |= WM_TXQ_NO_SPACE;
7311 bus_dmamap_unload(sc->sc_dmat, dmamap);
7312 WM_Q_EVCNT_INCR(txq, txfifo_stall);
7313 break;
7314 }
7315
7316 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
7317
7318 DPRINTF(WM_DEBUG_TX,
7319 ("%s: TX: packet has %d (%d) DMA segments\n",
7320 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
7321
7322 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
7323
7324 /*
7325 * Store a pointer to the packet so that we can free it
7326 * later.
7327 *
7328 * Initially, we consider the number of descriptors the
7329 * packet uses the number of DMA segments. This may be
7330 * incremented by 1 if we do checksum offload (a descriptor
7331 * is used to set the checksum context).
7332 */
7333 txs->txs_mbuf = m0;
7334 txs->txs_firstdesc = txq->txq_next;
7335 txs->txs_ndesc = segs_needed;
7336
7337 /* Set up offload parameters for this packet. */
7338 if (m0->m_pkthdr.csum_flags &
7339 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
7340 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7341 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
7342 if (wm_tx_offload(sc, txq, txs, &cksumcmd,
7343 &cksumfields) != 0) {
7344 /* Error message already displayed. */
7345 bus_dmamap_unload(sc->sc_dmat, dmamap);
7346 continue;
7347 }
7348 } else {
7349 cksumcmd = 0;
7350 cksumfields = 0;
7351 }
7352
7353 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS;
7354
7355 /* Sync the DMA map. */
7356 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
7357 BUS_DMASYNC_PREWRITE);
7358
7359 /* Initialize the transmit descriptor. */
7360 for (nexttx = txq->txq_next, seg = 0;
7361 seg < dmamap->dm_nsegs; seg++) {
7362 for (seglen = dmamap->dm_segs[seg].ds_len,
7363 curaddr = dmamap->dm_segs[seg].ds_addr;
7364 seglen != 0;
7365 curaddr += curlen, seglen -= curlen,
7366 nexttx = WM_NEXTTX(txq, nexttx)) {
7367 curlen = seglen;
7368
7369 /*
7370 * So says the Linux driver:
7371 * Work around for premature descriptor
7372 * write-backs in TSO mode. Append a
7373 * 4-byte sentinel descriptor.
7374 */
7375 if (use_tso && seg == dmamap->dm_nsegs - 1 &&
7376 curlen > 8)
7377 curlen -= 4;
7378
7379 wm_set_dma_addr(
7380 &txq->txq_descs[nexttx].wtx_addr, curaddr);
7381 txq->txq_descs[nexttx].wtx_cmdlen
7382 = htole32(cksumcmd | curlen);
7383 txq->txq_descs[nexttx].wtx_fields.wtxu_status
7384 = 0;
7385 txq->txq_descs[nexttx].wtx_fields.wtxu_options
7386 = cksumfields;
7387 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
7388 lasttx = nexttx;
7389
7390 DPRINTF(WM_DEBUG_TX,
7391 ("%s: TX: desc %d: low %#" PRIx64 ", "
7392 "len %#04zx\n",
7393 device_xname(sc->sc_dev), nexttx,
7394 (uint64_t)curaddr, curlen));
7395 }
7396 }
7397
7398 KASSERT(lasttx != -1);
7399
7400 /*
7401 * Set up the command byte on the last descriptor of
7402 * the packet. If we're in the interrupt delay window,
7403 * delay the interrupt.
7404 */
7405 txq->txq_descs[lasttx].wtx_cmdlen |=
7406 htole32(WTX_CMD_EOP | WTX_CMD_RS);
7407
7408 /*
7409 * If VLANs are enabled and the packet has a VLAN tag, set
7410 * up the descriptor to encapsulate the packet for us.
7411 *
7412 * This is only valid on the last descriptor of the packet.
7413 */
7414 if (vlan_has_tag(m0)) {
7415 txq->txq_descs[lasttx].wtx_cmdlen |=
7416 htole32(WTX_CMD_VLE);
7417 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan
7418 = htole16(vlan_get_tag(m0));
7419 }
7420
7421 txs->txs_lastdesc = lasttx;
7422
7423 DPRINTF(WM_DEBUG_TX,
7424 ("%s: TX: desc %d: cmdlen 0x%08x\n",
7425 device_xname(sc->sc_dev),
7426 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
7427
7428 /* Sync the descriptors we're using. */
7429 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
7430 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7431
7432 /* Give the packet to the chip. */
7433 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
7434
7435 DPRINTF(WM_DEBUG_TX,
7436 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
7437
7438 DPRINTF(WM_DEBUG_TX,
7439 ("%s: TX: finished transmitting packet, job %d\n",
7440 device_xname(sc->sc_dev), txq->txq_snext));
7441
7442 /* Advance the tx pointer. */
7443 txq->txq_free -= txs->txs_ndesc;
7444 txq->txq_next = nexttx;
7445
7446 txq->txq_sfree--;
7447 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
7448
7449 /* Pass the packet to any BPF listeners. */
7450 bpf_mtap(ifp, m0);
7451 }
7452
7453 if (m0 != NULL) {
7454 if (!is_transmit)
7455 ifp->if_flags |= IFF_OACTIVE;
7456 txq->txq_flags |= WM_TXQ_NO_SPACE;
7457 WM_Q_EVCNT_INCR(txq, txdrop);
7458 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
7459 __func__));
7460 m_freem(m0);
7461 }
7462
7463 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
7464 /* No more slots; notify upper layer. */
7465 if (!is_transmit)
7466 ifp->if_flags |= IFF_OACTIVE;
7467 txq->txq_flags |= WM_TXQ_NO_SPACE;
7468 }
7469
7470 if (txq->txq_free != ofree) {
7471 /* Set a watchdog timer in case the chip flakes out. */
7472 txq->txq_lastsent = time_uptime;
7473 txq->txq_sending = true;
7474 }
7475 }
7476
7477 /*
7478 * wm_nq_tx_offload:
7479 *
7480 * Set up TCP/IP checksumming parameters for the
7481 * specified packet, for NEWQUEUE devices
7482 */
7483 static int
7484 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
7485 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum)
7486 {
7487 struct mbuf *m0 = txs->txs_mbuf;
7488 uint32_t vl_len, mssidx, cmdc;
7489 struct ether_header *eh;
7490 int offset, iphl;
7491
7492 /*
7493 * XXX It would be nice if the mbuf pkthdr had offset
7494 * fields for the protocol headers.
7495 */
7496 *cmdlenp = 0;
7497 *fieldsp = 0;
7498
7499 eh = mtod(m0, struct ether_header *);
7500 switch (htons(eh->ether_type)) {
7501 case ETHERTYPE_IP:
7502 case ETHERTYPE_IPV6:
7503 offset = ETHER_HDR_LEN;
7504 break;
7505
7506 case ETHERTYPE_VLAN:
7507 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
7508 break;
7509
7510 default:
7511 /* Don't support this protocol or encapsulation. */
7512 *do_csum = false;
7513 return 0;
7514 }
7515 *do_csum = true;
7516 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS;
7517 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT;
7518
7519 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT);
7520 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0);
7521
7522 if ((m0->m_pkthdr.csum_flags &
7523 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
7524 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
7525 } else {
7526 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
7527 }
7528 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT);
7529 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0);
7530
7531 if (vlan_has_tag(m0)) {
7532 vl_len |= ((vlan_get_tag(m0) & NQTXC_VLLEN_VLAN_MASK)
7533 << NQTXC_VLLEN_VLAN_SHIFT);
7534 *cmdlenp |= NQTX_CMD_VLE;
7535 }
7536
7537 mssidx = 0;
7538
7539 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
7540 int hlen = offset + iphl;
7541 int tcp_hlen;
7542 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
7543
7544 if (__predict_false(m0->m_len <
7545 (hlen + sizeof(struct tcphdr)))) {
7546 /*
7547 * TCP/IP headers are not in the first mbuf; we need
7548 * to do this the slow and painful way. Let's just
7549 * hope this doesn't happen very often.
7550 */
7551 struct tcphdr th;
7552
7553 WM_Q_EVCNT_INCR(txq, txtsopain);
7554
7555 m_copydata(m0, hlen, sizeof(th), &th);
7556 if (v4) {
7557 struct ip ip;
7558
7559 m_copydata(m0, offset, sizeof(ip), &ip);
7560 ip.ip_len = 0;
7561 m_copyback(m0,
7562 offset + offsetof(struct ip, ip_len),
7563 sizeof(ip.ip_len), &ip.ip_len);
7564 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
7565 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
7566 } else {
7567 struct ip6_hdr ip6;
7568
7569 m_copydata(m0, offset, sizeof(ip6), &ip6);
7570 ip6.ip6_plen = 0;
7571 m_copyback(m0,
7572 offset + offsetof(struct ip6_hdr, ip6_plen),
7573 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
7574 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
7575 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
7576 }
7577 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
7578 sizeof(th.th_sum), &th.th_sum);
7579
7580 tcp_hlen = th.th_off << 2;
7581 } else {
7582 /*
7583 * TCP/IP headers are in the first mbuf; we can do
7584 * this the easy way.
7585 */
7586 struct tcphdr *th;
7587
7588 if (v4) {
7589 struct ip *ip =
7590 (void *)(mtod(m0, char *) + offset);
7591 th = (void *)(mtod(m0, char *) + hlen);
7592
7593 ip->ip_len = 0;
7594 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
7595 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
7596 } else {
7597 struct ip6_hdr *ip6 =
7598 (void *)(mtod(m0, char *) + offset);
7599 th = (void *)(mtod(m0, char *) + hlen);
7600
7601 ip6->ip6_plen = 0;
7602 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
7603 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
7604 }
7605 tcp_hlen = th->th_off << 2;
7606 }
7607 hlen += tcp_hlen;
7608 *cmdlenp |= NQTX_CMD_TSE;
7609
7610 if (v4) {
7611 WM_Q_EVCNT_INCR(txq, txtso);
7612 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM;
7613 } else {
7614 WM_Q_EVCNT_INCR(txq, txtso6);
7615 *fieldsp |= NQTXD_FIELDS_TUXSM;
7616 }
7617 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT);
7618 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
7619 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT);
7620 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0);
7621 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT);
7622 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0);
7623 } else {
7624 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT);
7625 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
7626 }
7627
7628 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
7629 *fieldsp |= NQTXD_FIELDS_IXSM;
7630 cmdc |= NQTXC_CMD_IP4;
7631 }
7632
7633 if (m0->m_pkthdr.csum_flags &
7634 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
7635 WM_Q_EVCNT_INCR(txq, txtusum);
7636 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
7637 cmdc |= NQTXC_CMD_TCP;
7638 } else {
7639 cmdc |= NQTXC_CMD_UDP;
7640 }
7641 cmdc |= NQTXC_CMD_IP4;
7642 *fieldsp |= NQTXD_FIELDS_TUXSM;
7643 }
7644 if (m0->m_pkthdr.csum_flags &
7645 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
7646 WM_Q_EVCNT_INCR(txq, txtusum6);
7647 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
7648 cmdc |= NQTXC_CMD_TCP;
7649 } else {
7650 cmdc |= NQTXC_CMD_UDP;
7651 }
7652 cmdc |= NQTXC_CMD_IP6;
7653 *fieldsp |= NQTXD_FIELDS_TUXSM;
7654 }
7655
7656 /*
7657 * We don't have to write context descriptor for every packet to
7658 * NEWQUEUE controllers, that is 82575, 82576, 82580, I350, I354,
7659 * I210 and I211. It is enough to write once per a Tx queue for these
7660 * controllers.
7661 * It would be overhead to write context descriptor for every packet,
7662 * however it does not cause problems.
7663 */
7664 /* Fill in the context descriptor. */
7665 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len =
7666 htole32(vl_len);
7667 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0;
7668 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd =
7669 htole32(cmdc);
7670 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx =
7671 htole32(mssidx);
7672 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
7673 DPRINTF(WM_DEBUG_TX,
7674 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev),
7675 txq->txq_next, 0, vl_len));
7676 DPRINTF(WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc));
7677 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
7678 txs->txs_ndesc++;
7679 return 0;
7680 }
7681
7682 /*
7683 * wm_nq_start: [ifnet interface function]
7684 *
7685 * Start packet transmission on the interface for NEWQUEUE devices
7686 */
7687 static void
7688 wm_nq_start(struct ifnet *ifp)
7689 {
7690 struct wm_softc *sc = ifp->if_softc;
7691 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7692
7693 #ifdef WM_MPSAFE
7694 KASSERT(if_is_mpsafe(ifp));
7695 #endif
7696 /*
7697 * ifp->if_obytes and ifp->if_omcasts are added in if_transmit()@if.c.
7698 */
7699
7700 mutex_enter(txq->txq_lock);
7701 if (!txq->txq_stopping)
7702 wm_nq_start_locked(ifp);
7703 mutex_exit(txq->txq_lock);
7704 }
7705
7706 static void
7707 wm_nq_start_locked(struct ifnet *ifp)
7708 {
7709 struct wm_softc *sc = ifp->if_softc;
7710 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
7711
7712 wm_nq_send_common_locked(ifp, txq, false);
7713 }
7714
7715 static int
7716 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m)
7717 {
7718 int qid;
7719 struct wm_softc *sc = ifp->if_softc;
7720 struct wm_txqueue *txq;
7721
7722 qid = wm_select_txqueue(ifp, m);
7723 txq = &sc->sc_queue[qid].wmq_txq;
7724
7725 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7726 m_freem(m);
7727 WM_Q_EVCNT_INCR(txq, txdrop);
7728 return ENOBUFS;
7729 }
7730
7731 /*
7732 * XXXX NOMPSAFE: ifp->if_data should be percpu.
7733 */
7734 ifp->if_obytes += m->m_pkthdr.len;
7735 if (m->m_flags & M_MCAST)
7736 ifp->if_omcasts++;
7737
7738 /*
7739 * The situations which this mutex_tryenter() fails at running time
7740 * are below two patterns.
7741 * (1) contention with interrupt handler(wm_txrxintr_msix())
7742 * (2) contention with deferred if_start softint(wm_handle_queue())
7743 * In the case of (1), the last packet enqueued to txq->txq_interq is
7744 * dequeued by wm_deferred_start_locked(). So, it does not get stuck.
7745 * In the case of (2), the last packet enqueued to txq->txq_interq is
7746 * also dequeued by wm_deferred_start_locked(). So, it does not get
7747 * stuck, either.
7748 */
7749 if (mutex_tryenter(txq->txq_lock)) {
7750 if (!txq->txq_stopping)
7751 wm_nq_transmit_locked(ifp, txq);
7752 mutex_exit(txq->txq_lock);
7753 }
7754
7755 return 0;
7756 }
7757
7758 static void
7759 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7760 {
7761
7762 wm_nq_send_common_locked(ifp, txq, true);
7763 }
7764
7765 static void
7766 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7767 bool is_transmit)
7768 {
7769 struct wm_softc *sc = ifp->if_softc;
7770 struct mbuf *m0;
7771 struct wm_txsoft *txs;
7772 bus_dmamap_t dmamap;
7773 int error, nexttx, lasttx = -1, seg, segs_needed;
7774 bool do_csum, sent;
7775
7776 KASSERT(mutex_owned(txq->txq_lock));
7777
7778 if ((ifp->if_flags & IFF_RUNNING) == 0)
7779 return;
7780 if ((ifp->if_flags & IFF_OACTIVE) != 0 && !is_transmit)
7781 return;
7782 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7783 return;
7784
7785 sent = false;
7786
7787 /*
7788 * Loop through the send queue, setting up transmit descriptors
7789 * until we drain the queue, or use up all available transmit
7790 * descriptors.
7791 */
7792 for (;;) {
7793 m0 = NULL;
7794
7795 /* Get a work queue entry. */
7796 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7797 wm_txeof(txq, UINT_MAX);
7798 if (txq->txq_sfree == 0) {
7799 DPRINTF(WM_DEBUG_TX,
7800 ("%s: TX: no free job descriptors\n",
7801 device_xname(sc->sc_dev)));
7802 WM_Q_EVCNT_INCR(txq, txsstall);
7803 break;
7804 }
7805 }
7806
7807 /* Grab a packet off the queue. */
7808 if (is_transmit)
7809 m0 = pcq_get(txq->txq_interq);
7810 else
7811 IFQ_DEQUEUE(&ifp->if_snd, m0);
7812 if (m0 == NULL)
7813 break;
7814
7815 DPRINTF(WM_DEBUG_TX,
7816 ("%s: TX: have packet to transmit: %p\n",
7817 device_xname(sc->sc_dev), m0));
7818
7819 txs = &txq->txq_soft[txq->txq_snext];
7820 dmamap = txs->txs_dmamap;
7821
7822 /*
7823 * Load the DMA map. If this fails, the packet either
7824 * didn't fit in the allotted number of segments, or we
7825 * were short on resources. For the too-many-segments
7826 * case, we simply report an error and drop the packet,
7827 * since we can't sanely copy a jumbo packet to a single
7828 * buffer.
7829 */
7830 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
7831 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
7832 if (error) {
7833 if (error == EFBIG) {
7834 WM_Q_EVCNT_INCR(txq, txdrop);
7835 log(LOG_ERR, "%s: Tx packet consumes too many "
7836 "DMA segments, dropping...\n",
7837 device_xname(sc->sc_dev));
7838 wm_dump_mbuf_chain(sc, m0);
7839 m_freem(m0);
7840 continue;
7841 }
7842 /* Short on resources, just stop for now. */
7843 DPRINTF(WM_DEBUG_TX,
7844 ("%s: TX: dmamap load failed: %d\n",
7845 device_xname(sc->sc_dev), error));
7846 break;
7847 }
7848
7849 segs_needed = dmamap->dm_nsegs;
7850
7851 /*
7852 * Ensure we have enough descriptors free to describe
7853 * the packet. Note, we always reserve one descriptor
7854 * at the end of the ring due to the semantics of the
7855 * TDT register, plus one more in the event we need
7856 * to load offload context.
7857 */
7858 if (segs_needed > txq->txq_free - 2) {
7859 /*
7860 * Not enough free descriptors to transmit this
7861 * packet. We haven't committed anything yet,
7862 * so just unload the DMA map, put the packet
7863 * pack on the queue, and punt. Notify the upper
7864 * layer that there are no more slots left.
7865 */
7866 DPRINTF(WM_DEBUG_TX,
7867 ("%s: TX: need %d (%d) descriptors, have %d\n",
7868 device_xname(sc->sc_dev), dmamap->dm_nsegs,
7869 segs_needed, txq->txq_free - 1));
7870 if (!is_transmit)
7871 ifp->if_flags |= IFF_OACTIVE;
7872 txq->txq_flags |= WM_TXQ_NO_SPACE;
7873 bus_dmamap_unload(sc->sc_dmat, dmamap);
7874 WM_Q_EVCNT_INCR(txq, txdstall);
7875 break;
7876 }
7877
7878 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
7879
7880 DPRINTF(WM_DEBUG_TX,
7881 ("%s: TX: packet has %d (%d) DMA segments\n",
7882 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
7883
7884 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
7885
7886 /*
7887 * Store a pointer to the packet so that we can free it
7888 * later.
7889 *
7890 * Initially, we consider the number of descriptors the
7891 * packet uses the number of DMA segments. This may be
7892 * incremented by 1 if we do checksum offload (a descriptor
7893 * is used to set the checksum context).
7894 */
7895 txs->txs_mbuf = m0;
7896 txs->txs_firstdesc = txq->txq_next;
7897 txs->txs_ndesc = segs_needed;
7898
7899 /* Set up offload parameters for this packet. */
7900 uint32_t cmdlen, fields, dcmdlen;
7901 if (m0->m_pkthdr.csum_flags &
7902 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
7903 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7904 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
7905 if (wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields,
7906 &do_csum) != 0) {
7907 /* Error message already displayed. */
7908 bus_dmamap_unload(sc->sc_dmat, dmamap);
7909 continue;
7910 }
7911 } else {
7912 do_csum = false;
7913 cmdlen = 0;
7914 fields = 0;
7915 }
7916
7917 /* Sync the DMA map. */
7918 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
7919 BUS_DMASYNC_PREWRITE);
7920
7921 /* Initialize the first transmit descriptor. */
7922 nexttx = txq->txq_next;
7923 if (!do_csum) {
7924 /* setup a legacy descriptor */
7925 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr,
7926 dmamap->dm_segs[0].ds_addr);
7927 txq->txq_descs[nexttx].wtx_cmdlen =
7928 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len);
7929 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0;
7930 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0;
7931 if (vlan_has_tag(m0)) {
7932 txq->txq_descs[nexttx].wtx_cmdlen |=
7933 htole32(WTX_CMD_VLE);
7934 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =
7935 htole16(vlan_get_tag(m0));
7936 } else {
7937 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
7938 }
7939 dcmdlen = 0;
7940 } else {
7941 /* setup an advanced data descriptor */
7942 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
7943 htole64(dmamap->dm_segs[0].ds_addr);
7944 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0);
7945 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
7946 htole32(dmamap->dm_segs[0].ds_len | cmdlen );
7947 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields =
7948 htole32(fields);
7949 DPRINTF(WM_DEBUG_TX,
7950 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n",
7951 device_xname(sc->sc_dev), nexttx,
7952 (uint64_t)dmamap->dm_segs[0].ds_addr));
7953 DPRINTF(WM_DEBUG_TX,
7954 ("\t 0x%08x%08x\n", fields,
7955 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen));
7956 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT;
7957 }
7958
7959 lasttx = nexttx;
7960 nexttx = WM_NEXTTX(txq, nexttx);
7961 /*
7962 * fill in the next descriptors. legacy or advanced format
7963 * is the same here
7964 */
7965 for (seg = 1; seg < dmamap->dm_nsegs;
7966 seg++, nexttx = WM_NEXTTX(txq, nexttx)) {
7967 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
7968 htole64(dmamap->dm_segs[seg].ds_addr);
7969 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
7970 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len);
7971 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0);
7972 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0;
7973 lasttx = nexttx;
7974
7975 DPRINTF(WM_DEBUG_TX,
7976 ("%s: TX: desc %d: %#" PRIx64 ", "
7977 "len %#04zx\n",
7978 device_xname(sc->sc_dev), nexttx,
7979 (uint64_t)dmamap->dm_segs[seg].ds_addr,
7980 dmamap->dm_segs[seg].ds_len));
7981 }
7982
7983 KASSERT(lasttx != -1);
7984
7985 /*
7986 * Set up the command byte on the last descriptor of
7987 * the packet. If we're in the interrupt delay window,
7988 * delay the interrupt.
7989 */
7990 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) ==
7991 (NQTX_CMD_EOP | NQTX_CMD_RS));
7992 txq->txq_descs[lasttx].wtx_cmdlen |=
7993 htole32(WTX_CMD_EOP | WTX_CMD_RS);
7994
7995 txs->txs_lastdesc = lasttx;
7996
7997 DPRINTF(WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n",
7998 device_xname(sc->sc_dev),
7999 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
8000
8001 /* Sync the descriptors we're using. */
8002 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
8003 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
8004
8005 /* Give the packet to the chip. */
8006 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
8007 sent = true;
8008
8009 DPRINTF(WM_DEBUG_TX,
8010 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
8011
8012 DPRINTF(WM_DEBUG_TX,
8013 ("%s: TX: finished transmitting packet, job %d\n",
8014 device_xname(sc->sc_dev), txq->txq_snext));
8015
8016 /* Advance the tx pointer. */
8017 txq->txq_free -= txs->txs_ndesc;
8018 txq->txq_next = nexttx;
8019
8020 txq->txq_sfree--;
8021 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
8022
8023 /* Pass the packet to any BPF listeners. */
8024 bpf_mtap(ifp, m0);
8025 }
8026
8027 if (m0 != NULL) {
8028 if (!is_transmit)
8029 ifp->if_flags |= IFF_OACTIVE;
8030 txq->txq_flags |= WM_TXQ_NO_SPACE;
8031 WM_Q_EVCNT_INCR(txq, txdrop);
8032 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
8033 __func__));
8034 m_freem(m0);
8035 }
8036
8037 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
8038 /* No more slots; notify upper layer. */
8039 if (!is_transmit)
8040 ifp->if_flags |= IFF_OACTIVE;
8041 txq->txq_flags |= WM_TXQ_NO_SPACE;
8042 }
8043
8044 if (sent) {
8045 /* Set a watchdog timer in case the chip flakes out. */
8046 txq->txq_lastsent = time_uptime;
8047 txq->txq_sending = true;
8048 }
8049 }
8050
8051 static void
8052 wm_deferred_start_locked(struct wm_txqueue *txq)
8053 {
8054 struct wm_softc *sc = txq->txq_sc;
8055 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8056 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
8057 int qid = wmq->wmq_id;
8058
8059 KASSERT(mutex_owned(txq->txq_lock));
8060
8061 if (txq->txq_stopping) {
8062 mutex_exit(txq->txq_lock);
8063 return;
8064 }
8065
8066 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
8067 /* XXX need for ALTQ or one CPU system */
8068 if (qid == 0)
8069 wm_nq_start_locked(ifp);
8070 wm_nq_transmit_locked(ifp, txq);
8071 } else {
8072 /* XXX need for ALTQ or one CPU system */
8073 if (qid == 0)
8074 wm_start_locked(ifp);
8075 wm_transmit_locked(ifp, txq);
8076 }
8077 }
8078
8079 /* Interrupt */
8080
8081 /*
8082 * wm_txeof:
8083 *
8084 * Helper; handle transmit interrupts.
8085 */
8086 static bool
8087 wm_txeof(struct wm_txqueue *txq, u_int limit)
8088 {
8089 struct wm_softc *sc = txq->txq_sc;
8090 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8091 struct wm_txsoft *txs;
8092 int count = 0;
8093 int i;
8094 uint8_t status;
8095 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq);
8096 bool more = false;
8097
8098 KASSERT(mutex_owned(txq->txq_lock));
8099
8100 if (txq->txq_stopping)
8101 return false;
8102
8103 txq->txq_flags &= ~WM_TXQ_NO_SPACE;
8104 /* for ALTQ and legacy(not use multiqueue) ethernet controller */
8105 if (wmq->wmq_id == 0)
8106 ifp->if_flags &= ~IFF_OACTIVE;
8107
8108 /*
8109 * Go through the Tx list and free mbufs for those
8110 * frames which have been transmitted.
8111 */
8112 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq);
8113 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) {
8114 if (limit-- == 0) {
8115 more = true;
8116 DPRINTF(WM_DEBUG_TX,
8117 ("%s: TX: loop limited, job %d is not processed\n",
8118 device_xname(sc->sc_dev), i));
8119 break;
8120 }
8121
8122 txs = &txq->txq_soft[i];
8123
8124 DPRINTF(WM_DEBUG_TX, ("%s: TX: checking job %d\n",
8125 device_xname(sc->sc_dev), i));
8126
8127 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc,
8128 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
8129
8130 status =
8131 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status;
8132 if ((status & WTX_ST_DD) == 0) {
8133 wm_cdtxsync(txq, txs->txs_lastdesc, 1,
8134 BUS_DMASYNC_PREREAD);
8135 break;
8136 }
8137
8138 count++;
8139 DPRINTF(WM_DEBUG_TX,
8140 ("%s: TX: job %d done: descs %d..%d\n",
8141 device_xname(sc->sc_dev), i, txs->txs_firstdesc,
8142 txs->txs_lastdesc));
8143
8144 /*
8145 * XXX We should probably be using the statistics
8146 * XXX registers, but I don't know if they exist
8147 * XXX on chips before the i82544.
8148 */
8149
8150 #ifdef WM_EVENT_COUNTERS
8151 if (status & WTX_ST_TU)
8152 WM_Q_EVCNT_INCR(txq, tu);
8153 #endif /* WM_EVENT_COUNTERS */
8154
8155 if (status & (WTX_ST_EC | WTX_ST_LC)) {
8156 ifp->if_oerrors++;
8157 if (status & WTX_ST_LC)
8158 log(LOG_WARNING, "%s: late collision\n",
8159 device_xname(sc->sc_dev));
8160 else if (status & WTX_ST_EC) {
8161 ifp->if_collisions += 16;
8162 log(LOG_WARNING, "%s: excessive collisions\n",
8163 device_xname(sc->sc_dev));
8164 }
8165 } else
8166 ifp->if_opackets++;
8167
8168 txq->txq_packets++;
8169 txq->txq_bytes += txs->txs_mbuf->m_pkthdr.len;
8170
8171 txq->txq_free += txs->txs_ndesc;
8172 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
8173 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
8174 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
8175 m_freem(txs->txs_mbuf);
8176 txs->txs_mbuf = NULL;
8177 }
8178
8179 /* Update the dirty transmit buffer pointer. */
8180 txq->txq_sdirty = i;
8181 DPRINTF(WM_DEBUG_TX,
8182 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i));
8183
8184 if (count != 0)
8185 rnd_add_uint32(&sc->rnd_source, count);
8186
8187 /*
8188 * If there are no more pending transmissions, cancel the watchdog
8189 * timer.
8190 */
8191 if (txq->txq_sfree == WM_TXQUEUELEN(txq))
8192 txq->txq_sending = false;
8193
8194 return more;
8195 }
8196
8197 static inline uint32_t
8198 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx)
8199 {
8200 struct wm_softc *sc = rxq->rxq_sc;
8201
8202 if (sc->sc_type == WM_T_82574)
8203 return EXTRXC_STATUS(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
8204 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8205 return NQRXC_STATUS(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
8206 else
8207 return rxq->rxq_descs[idx].wrx_status;
8208 }
8209
8210 static inline uint32_t
8211 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx)
8212 {
8213 struct wm_softc *sc = rxq->rxq_sc;
8214
8215 if (sc->sc_type == WM_T_82574)
8216 return EXTRXC_ERROR(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
8217 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8218 return NQRXC_ERROR(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
8219 else
8220 return rxq->rxq_descs[idx].wrx_errors;
8221 }
8222
8223 static inline uint16_t
8224 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx)
8225 {
8226 struct wm_softc *sc = rxq->rxq_sc;
8227
8228 if (sc->sc_type == WM_T_82574)
8229 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan;
8230 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8231 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan;
8232 else
8233 return rxq->rxq_descs[idx].wrx_special;
8234 }
8235
8236 static inline int
8237 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx)
8238 {
8239 struct wm_softc *sc = rxq->rxq_sc;
8240
8241 if (sc->sc_type == WM_T_82574)
8242 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen;
8243 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8244 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen;
8245 else
8246 return rxq->rxq_descs[idx].wrx_len;
8247 }
8248
8249 #ifdef WM_DEBUG
8250 static inline uint32_t
8251 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx)
8252 {
8253 struct wm_softc *sc = rxq->rxq_sc;
8254
8255 if (sc->sc_type == WM_T_82574)
8256 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash;
8257 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8258 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash;
8259 else
8260 return 0;
8261 }
8262
8263 static inline uint8_t
8264 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx)
8265 {
8266 struct wm_softc *sc = rxq->rxq_sc;
8267
8268 if (sc->sc_type == WM_T_82574)
8269 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq);
8270 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8271 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc);
8272 else
8273 return 0;
8274 }
8275 #endif /* WM_DEBUG */
8276
8277 static inline bool
8278 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status,
8279 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
8280 {
8281
8282 if (sc->sc_type == WM_T_82574)
8283 return (status & ext_bit) != 0;
8284 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8285 return (status & nq_bit) != 0;
8286 else
8287 return (status & legacy_bit) != 0;
8288 }
8289
8290 static inline bool
8291 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error,
8292 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
8293 {
8294
8295 if (sc->sc_type == WM_T_82574)
8296 return (error & ext_bit) != 0;
8297 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
8298 return (error & nq_bit) != 0;
8299 else
8300 return (error & legacy_bit) != 0;
8301 }
8302
8303 static inline bool
8304 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status)
8305 {
8306
8307 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
8308 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP))
8309 return true;
8310 else
8311 return false;
8312 }
8313
8314 static inline bool
8315 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors)
8316 {
8317 struct wm_softc *sc = rxq->rxq_sc;
8318
8319 /* XXXX missing error bit for newqueue? */
8320 if (wm_rxdesc_is_set_error(sc, errors,
8321 WRX_ER_CE | WRX_ER_SE | WRX_ER_SEQ | WRX_ER_CXE | WRX_ER_RXE,
8322 EXTRXC_ERROR_CE | EXTRXC_ERROR_SE | EXTRXC_ERROR_SEQ
8323 | EXTRXC_ERROR_CXE | EXTRXC_ERROR_RXE,
8324 NQRXC_ERROR_RXE)) {
8325 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE,
8326 EXTRXC_ERROR_SE, 0))
8327 log(LOG_WARNING, "%s: symbol error\n",
8328 device_xname(sc->sc_dev));
8329 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ,
8330 EXTRXC_ERROR_SEQ, 0))
8331 log(LOG_WARNING, "%s: receive sequence error\n",
8332 device_xname(sc->sc_dev));
8333 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE,
8334 EXTRXC_ERROR_CE, 0))
8335 log(LOG_WARNING, "%s: CRC error\n",
8336 device_xname(sc->sc_dev));
8337 return true;
8338 }
8339
8340 return false;
8341 }
8342
8343 static inline bool
8344 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status)
8345 {
8346 struct wm_softc *sc = rxq->rxq_sc;
8347
8348 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD,
8349 NQRXC_STATUS_DD)) {
8350 /* We have processed all of the receive descriptors. */
8351 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD);
8352 return false;
8353 }
8354
8355 return true;
8356 }
8357
8358 static inline bool
8359 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status,
8360 uint16_t vlantag, struct mbuf *m)
8361 {
8362
8363 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
8364 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) {
8365 vlan_set_tag(m, le16toh(vlantag));
8366 }
8367
8368 return true;
8369 }
8370
8371 static inline void
8372 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status,
8373 uint32_t errors, struct mbuf *m)
8374 {
8375 struct wm_softc *sc = rxq->rxq_sc;
8376
8377 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) {
8378 if (wm_rxdesc_is_set_status(sc, status,
8379 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) {
8380 WM_Q_EVCNT_INCR(rxq, rxipsum);
8381 m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
8382 if (wm_rxdesc_is_set_error(sc, errors,
8383 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE))
8384 m->m_pkthdr.csum_flags |=
8385 M_CSUM_IPv4_BAD;
8386 }
8387 if (wm_rxdesc_is_set_status(sc, status,
8388 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) {
8389 /*
8390 * Note: we don't know if this was TCP or UDP,
8391 * so we just set both bits, and expect the
8392 * upper layers to deal.
8393 */
8394 WM_Q_EVCNT_INCR(rxq, rxtusum);
8395 m->m_pkthdr.csum_flags |=
8396 M_CSUM_TCPv4 | M_CSUM_UDPv4 |
8397 M_CSUM_TCPv6 | M_CSUM_UDPv6;
8398 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_TCPE,
8399 EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E))
8400 m->m_pkthdr.csum_flags |=
8401 M_CSUM_TCP_UDP_BAD;
8402 }
8403 }
8404 }
8405
8406 /*
8407 * wm_rxeof:
8408 *
8409 * Helper; handle receive interrupts.
8410 */
8411 static bool
8412 wm_rxeof(struct wm_rxqueue *rxq, u_int limit)
8413 {
8414 struct wm_softc *sc = rxq->rxq_sc;
8415 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8416 struct wm_rxsoft *rxs;
8417 struct mbuf *m;
8418 int i, len;
8419 int count = 0;
8420 uint32_t status, errors;
8421 uint16_t vlantag;
8422 bool more = false;
8423
8424 KASSERT(mutex_owned(rxq->rxq_lock));
8425
8426 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) {
8427 if (limit-- == 0) {
8428 rxq->rxq_ptr = i;
8429 more = true;
8430 DPRINTF(WM_DEBUG_RX,
8431 ("%s: RX: loop limited, descriptor %d is not processed\n",
8432 device_xname(sc->sc_dev), i));
8433 break;
8434 }
8435
8436 rxs = &rxq->rxq_soft[i];
8437
8438 DPRINTF(WM_DEBUG_RX,
8439 ("%s: RX: checking descriptor %d\n",
8440 device_xname(sc->sc_dev), i));
8441 wm_cdrxsync(rxq, i,
8442 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
8443
8444 status = wm_rxdesc_get_status(rxq, i);
8445 errors = wm_rxdesc_get_errors(rxq, i);
8446 len = le16toh(wm_rxdesc_get_pktlen(rxq, i));
8447 vlantag = wm_rxdesc_get_vlantag(rxq, i);
8448 #ifdef WM_DEBUG
8449 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i));
8450 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i);
8451 #endif
8452
8453 if (!wm_rxdesc_dd(rxq, i, status)) {
8454 /*
8455 * Update the receive pointer holding rxq_lock
8456 * consistent with increment counter.
8457 */
8458 rxq->rxq_ptr = i;
8459 break;
8460 }
8461
8462 count++;
8463 if (__predict_false(rxq->rxq_discard)) {
8464 DPRINTF(WM_DEBUG_RX,
8465 ("%s: RX: discarding contents of descriptor %d\n",
8466 device_xname(sc->sc_dev), i));
8467 wm_init_rxdesc(rxq, i);
8468 if (wm_rxdesc_is_eop(rxq, status)) {
8469 /* Reset our state. */
8470 DPRINTF(WM_DEBUG_RX,
8471 ("%s: RX: resetting rxdiscard -> 0\n",
8472 device_xname(sc->sc_dev)));
8473 rxq->rxq_discard = 0;
8474 }
8475 continue;
8476 }
8477
8478 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
8479 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
8480
8481 m = rxs->rxs_mbuf;
8482
8483 /*
8484 * Add a new receive buffer to the ring, unless of
8485 * course the length is zero. Treat the latter as a
8486 * failed mapping.
8487 */
8488 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) {
8489 /*
8490 * Failed, throw away what we've done so
8491 * far, and discard the rest of the packet.
8492 */
8493 ifp->if_ierrors++;
8494 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
8495 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
8496 wm_init_rxdesc(rxq, i);
8497 if (!wm_rxdesc_is_eop(rxq, status))
8498 rxq->rxq_discard = 1;
8499 if (rxq->rxq_head != NULL)
8500 m_freem(rxq->rxq_head);
8501 WM_RXCHAIN_RESET(rxq);
8502 DPRINTF(WM_DEBUG_RX,
8503 ("%s: RX: Rx buffer allocation failed, "
8504 "dropping packet%s\n", device_xname(sc->sc_dev),
8505 rxq->rxq_discard ? " (discard)" : ""));
8506 continue;
8507 }
8508
8509 m->m_len = len;
8510 rxq->rxq_len += len;
8511 DPRINTF(WM_DEBUG_RX,
8512 ("%s: RX: buffer at %p len %d\n",
8513 device_xname(sc->sc_dev), m->m_data, len));
8514
8515 /* If this is not the end of the packet, keep looking. */
8516 if (!wm_rxdesc_is_eop(rxq, status)) {
8517 WM_RXCHAIN_LINK(rxq, m);
8518 DPRINTF(WM_DEBUG_RX,
8519 ("%s: RX: not yet EOP, rxlen -> %d\n",
8520 device_xname(sc->sc_dev), rxq->rxq_len));
8521 continue;
8522 }
8523
8524 /*
8525 * Okay, we have the entire packet now. The chip is
8526 * configured to include the FCS except I350 and I21[01]
8527 * (not all chips can be configured to strip it),
8528 * so we need to trim it.
8529 * May need to adjust length of previous mbuf in the
8530 * chain if the current mbuf is too short.
8531 * For an eratta, the RCTL_SECRC bit in RCTL register
8532 * is always set in I350, so we don't trim it.
8533 */
8534 if ((sc->sc_type != WM_T_I350) && (sc->sc_type != WM_T_I354)
8535 && (sc->sc_type != WM_T_I210)
8536 && (sc->sc_type != WM_T_I211)) {
8537 if (m->m_len < ETHER_CRC_LEN) {
8538 rxq->rxq_tail->m_len
8539 -= (ETHER_CRC_LEN - m->m_len);
8540 m->m_len = 0;
8541 } else
8542 m->m_len -= ETHER_CRC_LEN;
8543 len = rxq->rxq_len - ETHER_CRC_LEN;
8544 } else
8545 len = rxq->rxq_len;
8546
8547 WM_RXCHAIN_LINK(rxq, m);
8548
8549 *rxq->rxq_tailp = NULL;
8550 m = rxq->rxq_head;
8551
8552 WM_RXCHAIN_RESET(rxq);
8553
8554 DPRINTF(WM_DEBUG_RX,
8555 ("%s: RX: have entire packet, len -> %d\n",
8556 device_xname(sc->sc_dev), len));
8557
8558 /* If an error occurred, update stats and drop the packet. */
8559 if (wm_rxdesc_has_errors(rxq, errors)) {
8560 m_freem(m);
8561 continue;
8562 }
8563
8564 /* No errors. Receive the packet. */
8565 m_set_rcvif(m, ifp);
8566 m->m_pkthdr.len = len;
8567 /*
8568 * TODO
8569 * should be save rsshash and rsstype to this mbuf.
8570 */
8571 DPRINTF(WM_DEBUG_RX,
8572 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n",
8573 device_xname(sc->sc_dev), rsstype, rsshash));
8574
8575 /*
8576 * If VLANs are enabled, VLAN packets have been unwrapped
8577 * for us. Associate the tag with the packet.
8578 */
8579 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m))
8580 continue;
8581
8582 /* Set up checksum info for this packet. */
8583 wm_rxdesc_ensure_checksum(rxq, status, errors, m);
8584 /*
8585 * Update the receive pointer holding rxq_lock consistent with
8586 * increment counter.
8587 */
8588 rxq->rxq_ptr = i;
8589 rxq->rxq_packets++;
8590 rxq->rxq_bytes += len;
8591 mutex_exit(rxq->rxq_lock);
8592
8593 /* Pass it on. */
8594 if_percpuq_enqueue(sc->sc_ipq, m);
8595
8596 mutex_enter(rxq->rxq_lock);
8597
8598 if (rxq->rxq_stopping)
8599 break;
8600 }
8601
8602 if (count != 0)
8603 rnd_add_uint32(&sc->rnd_source, count);
8604
8605 DPRINTF(WM_DEBUG_RX,
8606 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i));
8607
8608 return more;
8609 }
8610
8611 /*
8612 * wm_linkintr_gmii:
8613 *
8614 * Helper; handle link interrupts for GMII.
8615 */
8616 static void
8617 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr)
8618 {
8619
8620 KASSERT(WM_CORE_LOCKED(sc));
8621
8622 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8623 __func__));
8624
8625 if (icr & ICR_LSC) {
8626 uint32_t reg;
8627 uint32_t status = CSR_READ(sc, WMREG_STATUS);
8628
8629 if ((status & STATUS_LU) != 0) {
8630 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
8631 device_xname(sc->sc_dev),
8632 (status & STATUS_FD) ? "FDX" : "HDX"));
8633 } else {
8634 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8635 device_xname(sc->sc_dev)));
8636 }
8637 if ((sc->sc_type == WM_T_ICH8) && ((status & STATUS_LU) == 0))
8638 wm_gig_downshift_workaround_ich8lan(sc);
8639
8640 if ((sc->sc_type == WM_T_ICH8)
8641 && (sc->sc_phytype == WMPHY_IGP_3)) {
8642 wm_kmrn_lock_loss_workaround_ich8lan(sc);
8643 }
8644 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n",
8645 device_xname(sc->sc_dev)));
8646 mii_pollstat(&sc->sc_mii);
8647 if (sc->sc_type == WM_T_82543) {
8648 int miistatus, active;
8649
8650 /*
8651 * With 82543, we need to force speed and
8652 * duplex on the MAC equal to what the PHY
8653 * speed and duplex configuration is.
8654 */
8655 miistatus = sc->sc_mii.mii_media_status;
8656
8657 if (miistatus & IFM_ACTIVE) {
8658 active = sc->sc_mii.mii_media_active;
8659 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
8660 switch (IFM_SUBTYPE(active)) {
8661 case IFM_10_T:
8662 sc->sc_ctrl |= CTRL_SPEED_10;
8663 break;
8664 case IFM_100_TX:
8665 sc->sc_ctrl |= CTRL_SPEED_100;
8666 break;
8667 case IFM_1000_T:
8668 sc->sc_ctrl |= CTRL_SPEED_1000;
8669 break;
8670 default:
8671 /*
8672 * fiber?
8673 * Shoud not enter here.
8674 */
8675 printf("unknown media (%x)\n", active);
8676 break;
8677 }
8678 if (active & IFM_FDX)
8679 sc->sc_ctrl |= CTRL_FD;
8680 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8681 }
8682 } else if (sc->sc_type == WM_T_PCH) {
8683 wm_k1_gig_workaround_hv(sc,
8684 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
8685 }
8686
8687 if ((sc->sc_phytype == WMPHY_82578)
8688 && (IFM_SUBTYPE(sc->sc_mii.mii_media_active)
8689 == IFM_1000_T)) {
8690
8691 if ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0) {
8692 delay(200*1000); /* XXX too big */
8693
8694 /* Link stall fix for link up */
8695 wm_gmii_hv_writereg(sc->sc_dev, 1,
8696 HV_MUX_DATA_CTRL,
8697 HV_MUX_DATA_CTRL_GEN_TO_MAC
8698 | HV_MUX_DATA_CTRL_FORCE_SPEED);
8699 wm_gmii_hv_writereg(sc->sc_dev, 1,
8700 HV_MUX_DATA_CTRL,
8701 HV_MUX_DATA_CTRL_GEN_TO_MAC);
8702 }
8703 }
8704 /*
8705 * I217 Packet Loss issue:
8706 * ensure that FEXTNVM4 Beacon Duration is set correctly
8707 * on power up.
8708 * Set the Beacon Duration for I217 to 8 usec
8709 */
8710 if (sc->sc_type >= WM_T_PCH_LPT) {
8711 reg = CSR_READ(sc, WMREG_FEXTNVM4);
8712 reg &= ~FEXTNVM4_BEACON_DURATION;
8713 reg |= FEXTNVM4_BEACON_DURATION_8US;
8714 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
8715 }
8716
8717 /* XXX Work-around I218 hang issue */
8718 /* e1000_k1_workaround_lpt_lp() */
8719
8720 if (sc->sc_type >= WM_T_PCH_LPT) {
8721 /*
8722 * Set platform power management values for Latency
8723 * Tolerance Reporting (LTR)
8724 */
8725 wm_platform_pm_pch_lpt(sc,
8726 ((sc->sc_mii.mii_media_status & IFM_ACTIVE)
8727 != 0));
8728 }
8729
8730 /* FEXTNVM6 K1-off workaround */
8731 if (sc->sc_type == WM_T_PCH_SPT) {
8732 reg = CSR_READ(sc, WMREG_FEXTNVM6);
8733 if (CSR_READ(sc, WMREG_PCIEANACFG)
8734 & FEXTNVM6_K1_OFF_ENABLE)
8735 reg |= FEXTNVM6_K1_OFF_ENABLE;
8736 else
8737 reg &= ~FEXTNVM6_K1_OFF_ENABLE;
8738 CSR_WRITE(sc, WMREG_FEXTNVM6, reg);
8739 }
8740 } else if (icr & ICR_RXSEQ) {
8741 DPRINTF(WM_DEBUG_LINK, ("%s: LINK Receive sequence error\n",
8742 device_xname(sc->sc_dev)));
8743 }
8744 }
8745
8746 /*
8747 * wm_linkintr_tbi:
8748 *
8749 * Helper; handle link interrupts for TBI mode.
8750 */
8751 static void
8752 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr)
8753 {
8754 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8755 uint32_t status;
8756
8757 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8758 __func__));
8759
8760 status = CSR_READ(sc, WMREG_STATUS);
8761 if (icr & ICR_LSC) {
8762 if (status & STATUS_LU) {
8763 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
8764 device_xname(sc->sc_dev),
8765 (status & STATUS_FD) ? "FDX" : "HDX"));
8766 /*
8767 * NOTE: CTRL will update TFCE and RFCE automatically,
8768 * so we should update sc->sc_ctrl
8769 */
8770
8771 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
8772 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
8773 sc->sc_fcrtl &= ~FCRTL_XONE;
8774 if (status & STATUS_FD)
8775 sc->sc_tctl |=
8776 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
8777 else
8778 sc->sc_tctl |=
8779 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
8780 if (sc->sc_ctrl & CTRL_TFCE)
8781 sc->sc_fcrtl |= FCRTL_XONE;
8782 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
8783 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
8784 WMREG_OLD_FCRTL : WMREG_FCRTL,
8785 sc->sc_fcrtl);
8786 sc->sc_tbi_linkup = 1;
8787 if_link_state_change(ifp, LINK_STATE_UP);
8788 } else {
8789 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8790 device_xname(sc->sc_dev)));
8791 sc->sc_tbi_linkup = 0;
8792 if_link_state_change(ifp, LINK_STATE_DOWN);
8793 }
8794 /* Update LED */
8795 wm_tbi_serdes_set_linkled(sc);
8796 } else if (icr & ICR_RXSEQ) {
8797 DPRINTF(WM_DEBUG_LINK,
8798 ("%s: LINK: Receive sequence error\n",
8799 device_xname(sc->sc_dev)));
8800 }
8801 }
8802
8803 /*
8804 * wm_linkintr_serdes:
8805 *
8806 * Helper; handle link interrupts for TBI mode.
8807 */
8808 static void
8809 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr)
8810 {
8811 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8812 struct mii_data *mii = &sc->sc_mii;
8813 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
8814 uint32_t pcs_adv, pcs_lpab, reg;
8815
8816 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8817 __func__));
8818
8819 if (icr & ICR_LSC) {
8820 /* Check PCS */
8821 reg = CSR_READ(sc, WMREG_PCS_LSTS);
8822 if ((reg & PCS_LSTS_LINKOK) != 0) {
8823 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up\n",
8824 device_xname(sc->sc_dev)));
8825 mii->mii_media_status |= IFM_ACTIVE;
8826 sc->sc_tbi_linkup = 1;
8827 if_link_state_change(ifp, LINK_STATE_UP);
8828 } else {
8829 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8830 device_xname(sc->sc_dev)));
8831 mii->mii_media_status |= IFM_NONE;
8832 sc->sc_tbi_linkup = 0;
8833 if_link_state_change(ifp, LINK_STATE_DOWN);
8834 wm_tbi_serdes_set_linkled(sc);
8835 return;
8836 }
8837 mii->mii_media_active |= IFM_1000_SX;
8838 if ((reg & PCS_LSTS_FDX) != 0)
8839 mii->mii_media_active |= IFM_FDX;
8840 else
8841 mii->mii_media_active |= IFM_HDX;
8842 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
8843 /* Check flow */
8844 reg = CSR_READ(sc, WMREG_PCS_LSTS);
8845 if ((reg & PCS_LSTS_AN_COMP) == 0) {
8846 DPRINTF(WM_DEBUG_LINK,
8847 ("XXX LINKOK but not ACOMP\n"));
8848 return;
8849 }
8850 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
8851 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
8852 DPRINTF(WM_DEBUG_LINK,
8853 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab));
8854 if ((pcs_adv & TXCW_SYM_PAUSE)
8855 && (pcs_lpab & TXCW_SYM_PAUSE)) {
8856 mii->mii_media_active |= IFM_FLOW
8857 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
8858 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
8859 && (pcs_adv & TXCW_ASYM_PAUSE)
8860 && (pcs_lpab & TXCW_SYM_PAUSE)
8861 && (pcs_lpab & TXCW_ASYM_PAUSE))
8862 mii->mii_media_active |= IFM_FLOW
8863 | IFM_ETH_TXPAUSE;
8864 else if ((pcs_adv & TXCW_SYM_PAUSE)
8865 && (pcs_adv & TXCW_ASYM_PAUSE)
8866 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
8867 && (pcs_lpab & TXCW_ASYM_PAUSE))
8868 mii->mii_media_active |= IFM_FLOW
8869 | IFM_ETH_RXPAUSE;
8870 }
8871 /* Update LED */
8872 wm_tbi_serdes_set_linkled(sc);
8873 } else {
8874 DPRINTF(WM_DEBUG_LINK,
8875 ("%s: LINK: Receive sequence error\n",
8876 device_xname(sc->sc_dev)));
8877 }
8878 }
8879
8880 /*
8881 * wm_linkintr:
8882 *
8883 * Helper; handle link interrupts.
8884 */
8885 static void
8886 wm_linkintr(struct wm_softc *sc, uint32_t icr)
8887 {
8888
8889 KASSERT(WM_CORE_LOCKED(sc));
8890
8891 if (sc->sc_flags & WM_F_HAS_MII)
8892 wm_linkintr_gmii(sc, icr);
8893 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES)
8894 && (sc->sc_type >= WM_T_82575))
8895 wm_linkintr_serdes(sc, icr);
8896 else
8897 wm_linkintr_tbi(sc, icr);
8898 }
8899
8900 /*
8901 * wm_intr_legacy:
8902 *
8903 * Interrupt service routine for INTx and MSI.
8904 */
8905 static int
8906 wm_intr_legacy(void *arg)
8907 {
8908 struct wm_softc *sc = arg;
8909 struct wm_queue *wmq = &sc->sc_queue[0];
8910 struct wm_txqueue *txq = &wmq->wmq_txq;
8911 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
8912 uint32_t icr, rndval = 0;
8913 int handled = 0;
8914
8915 while (1 /* CONSTCOND */) {
8916 icr = CSR_READ(sc, WMREG_ICR);
8917 if ((icr & sc->sc_icr) == 0)
8918 break;
8919 if (handled == 0) {
8920 DPRINTF(WM_DEBUG_TX,
8921 ("%s: INTx: got intr\n",device_xname(sc->sc_dev)));
8922 }
8923 if (rndval == 0)
8924 rndval = icr;
8925
8926 mutex_enter(rxq->rxq_lock);
8927
8928 if (rxq->rxq_stopping) {
8929 mutex_exit(rxq->rxq_lock);
8930 break;
8931 }
8932
8933 handled = 1;
8934
8935 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
8936 if (icr & (ICR_RXDMT0 | ICR_RXT0)) {
8937 DPRINTF(WM_DEBUG_RX,
8938 ("%s: RX: got Rx intr 0x%08x\n",
8939 device_xname(sc->sc_dev),
8940 icr & (ICR_RXDMT0 | ICR_RXT0)));
8941 WM_Q_EVCNT_INCR(rxq, rxintr);
8942 }
8943 #endif
8944 /*
8945 * wm_rxeof() does *not* call upper layer functions directly,
8946 * as if_percpuq_enqueue() just call softint_schedule().
8947 * So, we can call wm_rxeof() in interrupt context.
8948 */
8949 wm_rxeof(rxq, UINT_MAX);
8950
8951 mutex_exit(rxq->rxq_lock);
8952 mutex_enter(txq->txq_lock);
8953
8954 if (txq->txq_stopping) {
8955 mutex_exit(txq->txq_lock);
8956 break;
8957 }
8958
8959 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
8960 if (icr & ICR_TXDW) {
8961 DPRINTF(WM_DEBUG_TX,
8962 ("%s: TX: got TXDW interrupt\n",
8963 device_xname(sc->sc_dev)));
8964 WM_Q_EVCNT_INCR(txq, txdw);
8965 }
8966 #endif
8967 wm_txeof(txq, UINT_MAX);
8968
8969 mutex_exit(txq->txq_lock);
8970 WM_CORE_LOCK(sc);
8971
8972 if (sc->sc_core_stopping) {
8973 WM_CORE_UNLOCK(sc);
8974 break;
8975 }
8976
8977 if (icr & (ICR_LSC | ICR_RXSEQ)) {
8978 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
8979 wm_linkintr(sc, icr);
8980 }
8981
8982 WM_CORE_UNLOCK(sc);
8983
8984 if (icr & ICR_RXO) {
8985 #if defined(WM_DEBUG)
8986 log(LOG_WARNING, "%s: Receive overrun\n",
8987 device_xname(sc->sc_dev));
8988 #endif /* defined(WM_DEBUG) */
8989 }
8990 }
8991
8992 rnd_add_uint32(&sc->rnd_source, rndval);
8993
8994 if (handled) {
8995 /* Try to get more packets going. */
8996 softint_schedule(wmq->wmq_si);
8997 }
8998
8999 return handled;
9000 }
9001
9002 static inline void
9003 wm_txrxintr_disable(struct wm_queue *wmq)
9004 {
9005 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
9006
9007 if (sc->sc_type == WM_T_82574)
9008 CSR_WRITE(sc, WMREG_IMC,
9009 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id));
9010 else if (sc->sc_type == WM_T_82575)
9011 CSR_WRITE(sc, WMREG_EIMC,
9012 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
9013 else
9014 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx);
9015 }
9016
9017 static inline void
9018 wm_txrxintr_enable(struct wm_queue *wmq)
9019 {
9020 struct wm_softc *sc = wmq->wmq_txq.txq_sc;
9021
9022 wm_itrs_calculate(sc, wmq);
9023
9024 /*
9025 * ICR_OTHER which is disabled in wm_linkintr_msix() is enabled here.
9026 * There is no need to care about which of RXQ(0) and RXQ(1) enable
9027 * ICR_OTHER in first, because each RXQ/TXQ interrupt is disabled
9028 * while each wm_handle_queue(wmq) is runnig.
9029 */
9030 if (sc->sc_type == WM_T_82574)
9031 CSR_WRITE(sc, WMREG_IMS,
9032 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id) | ICR_OTHER);
9033 else if (sc->sc_type == WM_T_82575)
9034 CSR_WRITE(sc, WMREG_EIMS,
9035 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
9036 else
9037 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx);
9038 }
9039
9040 static int
9041 wm_txrxintr_msix(void *arg)
9042 {
9043 struct wm_queue *wmq = arg;
9044 struct wm_txqueue *txq = &wmq->wmq_txq;
9045 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9046 struct wm_softc *sc = txq->txq_sc;
9047 u_int txlimit = sc->sc_tx_intr_process_limit;
9048 u_int rxlimit = sc->sc_rx_intr_process_limit;
9049 bool txmore;
9050 bool rxmore;
9051
9052 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id);
9053
9054 DPRINTF(WM_DEBUG_TX,
9055 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev)));
9056
9057 wm_txrxintr_disable(wmq);
9058
9059 mutex_enter(txq->txq_lock);
9060
9061 if (txq->txq_stopping) {
9062 mutex_exit(txq->txq_lock);
9063 return 0;
9064 }
9065
9066 WM_Q_EVCNT_INCR(txq, txdw);
9067 txmore = wm_txeof(txq, txlimit);
9068 /* wm_deferred start() is done in wm_handle_queue(). */
9069 mutex_exit(txq->txq_lock);
9070
9071 DPRINTF(WM_DEBUG_RX,
9072 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev)));
9073 mutex_enter(rxq->rxq_lock);
9074
9075 if (rxq->rxq_stopping) {
9076 mutex_exit(rxq->rxq_lock);
9077 return 0;
9078 }
9079
9080 WM_Q_EVCNT_INCR(rxq, rxintr);
9081 rxmore = wm_rxeof(rxq, rxlimit);
9082 mutex_exit(rxq->rxq_lock);
9083
9084 wm_itrs_writereg(sc, wmq);
9085
9086 if (txmore || rxmore)
9087 softint_schedule(wmq->wmq_si);
9088 else
9089 wm_txrxintr_enable(wmq);
9090
9091 return 1;
9092 }
9093
9094 static void
9095 wm_handle_queue(void *arg)
9096 {
9097 struct wm_queue *wmq = arg;
9098 struct wm_txqueue *txq = &wmq->wmq_txq;
9099 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
9100 struct wm_softc *sc = txq->txq_sc;
9101 u_int txlimit = sc->sc_tx_process_limit;
9102 u_int rxlimit = sc->sc_rx_process_limit;
9103 bool txmore;
9104 bool rxmore;
9105
9106 mutex_enter(txq->txq_lock);
9107 if (txq->txq_stopping) {
9108 mutex_exit(txq->txq_lock);
9109 return;
9110 }
9111 txmore = wm_txeof(txq, txlimit);
9112 wm_deferred_start_locked(txq);
9113 mutex_exit(txq->txq_lock);
9114
9115 mutex_enter(rxq->rxq_lock);
9116 if (rxq->rxq_stopping) {
9117 mutex_exit(rxq->rxq_lock);
9118 return;
9119 }
9120 WM_Q_EVCNT_INCR(rxq, rxdefer);
9121 rxmore = wm_rxeof(rxq, rxlimit);
9122 mutex_exit(rxq->rxq_lock);
9123
9124 if (txmore || rxmore)
9125 softint_schedule(wmq->wmq_si);
9126 else
9127 wm_txrxintr_enable(wmq);
9128 }
9129
9130 /*
9131 * wm_linkintr_msix:
9132 *
9133 * Interrupt service routine for link status change for MSI-X.
9134 */
9135 static int
9136 wm_linkintr_msix(void *arg)
9137 {
9138 struct wm_softc *sc = arg;
9139 uint32_t reg;
9140 bool has_rxo;
9141
9142 DPRINTF(WM_DEBUG_LINK,
9143 ("%s: LINK: got link intr\n", device_xname(sc->sc_dev)));
9144
9145 reg = CSR_READ(sc, WMREG_ICR);
9146 WM_CORE_LOCK(sc);
9147 if (sc->sc_core_stopping)
9148 goto out;
9149
9150 if((reg & ICR_LSC) != 0) {
9151 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
9152 wm_linkintr(sc, ICR_LSC);
9153 }
9154
9155 /*
9156 * XXX 82574 MSI-X mode workaround
9157 *
9158 * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER
9159 * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor
9160 * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1)
9161 * interrupts by writing WMREG_ICS to process receive packets.
9162 */
9163 if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) {
9164 #if defined(WM_DEBUG)
9165 log(LOG_WARNING, "%s: Receive overrun\n",
9166 device_xname(sc->sc_dev));
9167 #endif /* defined(WM_DEBUG) */
9168
9169 has_rxo = true;
9170 /*
9171 * The RXO interrupt is very high rate when receive traffic is
9172 * high rate. We use polling mode for ICR_OTHER like Tx/Rx
9173 * interrupts. ICR_OTHER will be enabled at the end of
9174 * wm_txrxintr_msix() which is kicked by both ICR_RXQ(0) and
9175 * ICR_RXQ(1) interrupts.
9176 */
9177 CSR_WRITE(sc, WMREG_IMC, ICR_OTHER);
9178
9179 CSR_WRITE(sc, WMREG_ICS, ICR_RXQ(0) | ICR_RXQ(1));
9180 }
9181
9182
9183
9184 out:
9185 WM_CORE_UNLOCK(sc);
9186
9187 if (sc->sc_type == WM_T_82574) {
9188 if (!has_rxo)
9189 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC);
9190 else
9191 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
9192 } else if (sc->sc_type == WM_T_82575)
9193 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER);
9194 else
9195 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx);
9196
9197 return 1;
9198 }
9199
9200 /*
9201 * Media related.
9202 * GMII, SGMII, TBI (and SERDES)
9203 */
9204
9205 /* Common */
9206
9207 /*
9208 * wm_tbi_serdes_set_linkled:
9209 *
9210 * Update the link LED on TBI and SERDES devices.
9211 */
9212 static void
9213 wm_tbi_serdes_set_linkled(struct wm_softc *sc)
9214 {
9215
9216 if (sc->sc_tbi_linkup)
9217 sc->sc_ctrl |= CTRL_SWDPIN(0);
9218 else
9219 sc->sc_ctrl &= ~CTRL_SWDPIN(0);
9220
9221 /* 82540 or newer devices are active low */
9222 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0;
9223
9224 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9225 }
9226
9227 /* GMII related */
9228
9229 /*
9230 * wm_gmii_reset:
9231 *
9232 * Reset the PHY.
9233 */
9234 static void
9235 wm_gmii_reset(struct wm_softc *sc)
9236 {
9237 uint32_t reg;
9238 int rv;
9239
9240 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
9241 device_xname(sc->sc_dev), __func__));
9242
9243 rv = sc->phy.acquire(sc);
9244 if (rv != 0) {
9245 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9246 __func__);
9247 return;
9248 }
9249
9250 switch (sc->sc_type) {
9251 case WM_T_82542_2_0:
9252 case WM_T_82542_2_1:
9253 /* null */
9254 break;
9255 case WM_T_82543:
9256 /*
9257 * With 82543, we need to force speed and duplex on the MAC
9258 * equal to what the PHY speed and duplex configuration is.
9259 * In addition, we need to perform a hardware reset on the PHY
9260 * to take it out of reset.
9261 */
9262 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
9263 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9264
9265 /* The PHY reset pin is active-low. */
9266 reg = CSR_READ(sc, WMREG_CTRL_EXT);
9267 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
9268 CTRL_EXT_SWDPIN(4));
9269 reg |= CTRL_EXT_SWDPIO(4);
9270
9271 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
9272 CSR_WRITE_FLUSH(sc);
9273 delay(10*1000);
9274
9275 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
9276 CSR_WRITE_FLUSH(sc);
9277 delay(150);
9278 #if 0
9279 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
9280 #endif
9281 delay(20*1000); /* XXX extra delay to get PHY ID? */
9282 break;
9283 case WM_T_82544: /* reset 10000us */
9284 case WM_T_82540:
9285 case WM_T_82545:
9286 case WM_T_82545_3:
9287 case WM_T_82546:
9288 case WM_T_82546_3:
9289 case WM_T_82541:
9290 case WM_T_82541_2:
9291 case WM_T_82547:
9292 case WM_T_82547_2:
9293 case WM_T_82571: /* reset 100us */
9294 case WM_T_82572:
9295 case WM_T_82573:
9296 case WM_T_82574:
9297 case WM_T_82575:
9298 case WM_T_82576:
9299 case WM_T_82580:
9300 case WM_T_I350:
9301 case WM_T_I354:
9302 case WM_T_I210:
9303 case WM_T_I211:
9304 case WM_T_82583:
9305 case WM_T_80003:
9306 /* generic reset */
9307 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
9308 CSR_WRITE_FLUSH(sc);
9309 delay(20000);
9310 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9311 CSR_WRITE_FLUSH(sc);
9312 delay(20000);
9313
9314 if ((sc->sc_type == WM_T_82541)
9315 || (sc->sc_type == WM_T_82541_2)
9316 || (sc->sc_type == WM_T_82547)
9317 || (sc->sc_type == WM_T_82547_2)) {
9318 /* workaround for igp are done in igp_reset() */
9319 /* XXX add code to set LED after phy reset */
9320 }
9321 break;
9322 case WM_T_ICH8:
9323 case WM_T_ICH9:
9324 case WM_T_ICH10:
9325 case WM_T_PCH:
9326 case WM_T_PCH2:
9327 case WM_T_PCH_LPT:
9328 case WM_T_PCH_SPT:
9329 case WM_T_PCH_CNP:
9330 /* generic reset */
9331 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
9332 CSR_WRITE_FLUSH(sc);
9333 delay(100);
9334 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9335 CSR_WRITE_FLUSH(sc);
9336 delay(150);
9337 break;
9338 default:
9339 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
9340 __func__);
9341 break;
9342 }
9343
9344 sc->phy.release(sc);
9345
9346 /* get_cfg_done */
9347 wm_get_cfg_done(sc);
9348
9349 /* extra setup */
9350 switch (sc->sc_type) {
9351 case WM_T_82542_2_0:
9352 case WM_T_82542_2_1:
9353 case WM_T_82543:
9354 case WM_T_82544:
9355 case WM_T_82540:
9356 case WM_T_82545:
9357 case WM_T_82545_3:
9358 case WM_T_82546:
9359 case WM_T_82546_3:
9360 case WM_T_82541_2:
9361 case WM_T_82547_2:
9362 case WM_T_82571:
9363 case WM_T_82572:
9364 case WM_T_82573:
9365 case WM_T_82574:
9366 case WM_T_82583:
9367 case WM_T_82575:
9368 case WM_T_82576:
9369 case WM_T_82580:
9370 case WM_T_I350:
9371 case WM_T_I354:
9372 case WM_T_I210:
9373 case WM_T_I211:
9374 case WM_T_80003:
9375 /* null */
9376 break;
9377 case WM_T_82541:
9378 case WM_T_82547:
9379 /* XXX Configure actively LED after PHY reset */
9380 break;
9381 case WM_T_ICH8:
9382 case WM_T_ICH9:
9383 case WM_T_ICH10:
9384 case WM_T_PCH:
9385 case WM_T_PCH2:
9386 case WM_T_PCH_LPT:
9387 case WM_T_PCH_SPT:
9388 case WM_T_PCH_CNP:
9389 wm_phy_post_reset(sc);
9390 break;
9391 default:
9392 panic("%s: unknown type\n", __func__);
9393 break;
9394 }
9395 }
9396
9397 /*
9398 * Setup sc_phytype and mii_{read|write}reg.
9399 *
9400 * To identify PHY type, correct read/write function should be selected.
9401 * To select correct read/write function, PCI ID or MAC type are required
9402 * without accessing PHY registers.
9403 *
9404 * On the first call of this function, PHY ID is not known yet. Check
9405 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the
9406 * result might be incorrect.
9407 *
9408 * In the second call, PHY OUI and model is used to identify PHY type.
9409 * It might not be perfpect because of the lack of compared entry, but it
9410 * would be better than the first call.
9411 *
9412 * If the detected new result and previous assumption is different,
9413 * diagnous message will be printed.
9414 */
9415 static void
9416 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui,
9417 uint16_t phy_model)
9418 {
9419 device_t dev = sc->sc_dev;
9420 struct mii_data *mii = &sc->sc_mii;
9421 uint16_t new_phytype = WMPHY_UNKNOWN;
9422 uint16_t doubt_phytype = WMPHY_UNKNOWN;
9423 mii_readreg_t new_readreg;
9424 mii_writereg_t new_writereg;
9425
9426 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
9427 device_xname(sc->sc_dev), __func__));
9428
9429 if (mii->mii_readreg == NULL) {
9430 /*
9431 * This is the first call of this function. For ICH and PCH
9432 * variants, it's difficult to determine the PHY access method
9433 * by sc_type, so use the PCI product ID for some devices.
9434 */
9435
9436 switch (sc->sc_pcidevid) {
9437 case PCI_PRODUCT_INTEL_PCH_M_LM:
9438 case PCI_PRODUCT_INTEL_PCH_M_LC:
9439 /* 82577 */
9440 new_phytype = WMPHY_82577;
9441 break;
9442 case PCI_PRODUCT_INTEL_PCH_D_DM:
9443 case PCI_PRODUCT_INTEL_PCH_D_DC:
9444 /* 82578 */
9445 new_phytype = WMPHY_82578;
9446 break;
9447 case PCI_PRODUCT_INTEL_PCH2_LV_LM:
9448 case PCI_PRODUCT_INTEL_PCH2_LV_V:
9449 /* 82579 */
9450 new_phytype = WMPHY_82579;
9451 break;
9452 case PCI_PRODUCT_INTEL_82801H_82567V_3:
9453 case PCI_PRODUCT_INTEL_82801I_BM:
9454 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */
9455 case PCI_PRODUCT_INTEL_82801J_R_BM_LM:
9456 case PCI_PRODUCT_INTEL_82801J_R_BM_LF:
9457 case PCI_PRODUCT_INTEL_82801J_D_BM_LM:
9458 case PCI_PRODUCT_INTEL_82801J_D_BM_LF:
9459 case PCI_PRODUCT_INTEL_82801J_R_BM_V:
9460 /* ICH8, 9, 10 with 82567 */
9461 new_phytype = WMPHY_BM;
9462 break;
9463 default:
9464 break;
9465 }
9466 } else {
9467 /* It's not the first call. Use PHY OUI and model */
9468 switch (phy_oui) {
9469 case MII_OUI_ATHEROS: /* XXX ??? */
9470 switch (phy_model) {
9471 case 0x0004: /* XXX */
9472 new_phytype = WMPHY_82578;
9473 break;
9474 default:
9475 break;
9476 }
9477 break;
9478 case MII_OUI_xxMARVELL:
9479 switch (phy_model) {
9480 case MII_MODEL_xxMARVELL_I210:
9481 new_phytype = WMPHY_I210;
9482 break;
9483 case MII_MODEL_xxMARVELL_E1011:
9484 case MII_MODEL_xxMARVELL_E1000_3:
9485 case MII_MODEL_xxMARVELL_E1000_5:
9486 case MII_MODEL_xxMARVELL_E1112:
9487 new_phytype = WMPHY_M88;
9488 break;
9489 case MII_MODEL_xxMARVELL_E1149:
9490 new_phytype = WMPHY_BM;
9491 break;
9492 case MII_MODEL_xxMARVELL_E1111:
9493 case MII_MODEL_xxMARVELL_I347:
9494 case MII_MODEL_xxMARVELL_E1512:
9495 case MII_MODEL_xxMARVELL_E1340M:
9496 case MII_MODEL_xxMARVELL_E1543:
9497 new_phytype = WMPHY_M88;
9498 break;
9499 case MII_MODEL_xxMARVELL_I82563:
9500 new_phytype = WMPHY_GG82563;
9501 break;
9502 default:
9503 break;
9504 }
9505 break;
9506 case MII_OUI_INTEL:
9507 switch (phy_model) {
9508 case MII_MODEL_INTEL_I82577:
9509 new_phytype = WMPHY_82577;
9510 break;
9511 case MII_MODEL_INTEL_I82579:
9512 new_phytype = WMPHY_82579;
9513 break;
9514 case MII_MODEL_INTEL_I217:
9515 new_phytype = WMPHY_I217;
9516 break;
9517 case MII_MODEL_INTEL_I82580:
9518 case MII_MODEL_INTEL_I350:
9519 new_phytype = WMPHY_82580;
9520 break;
9521 default:
9522 break;
9523 }
9524 break;
9525 case MII_OUI_yyINTEL:
9526 switch (phy_model) {
9527 case MII_MODEL_yyINTEL_I82562G:
9528 case MII_MODEL_yyINTEL_I82562EM:
9529 case MII_MODEL_yyINTEL_I82562ET:
9530 new_phytype = WMPHY_IFE;
9531 break;
9532 case MII_MODEL_yyINTEL_IGP01E1000:
9533 new_phytype = WMPHY_IGP;
9534 break;
9535 case MII_MODEL_yyINTEL_I82566:
9536 new_phytype = WMPHY_IGP_3;
9537 break;
9538 default:
9539 break;
9540 }
9541 break;
9542 default:
9543 break;
9544 }
9545 if (new_phytype == WMPHY_UNKNOWN)
9546 aprint_verbose_dev(dev, "%s: unknown PHY model\n",
9547 __func__);
9548
9549 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9550 && (sc->sc_phytype != new_phytype )) {
9551 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
9552 "was incorrect. PHY type from PHY ID = %u\n",
9553 sc->sc_phytype, new_phytype);
9554 }
9555 }
9556
9557 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */
9558 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) {
9559 /* SGMII */
9560 new_readreg = wm_sgmii_readreg;
9561 new_writereg = wm_sgmii_writereg;
9562 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
9563 /* BM2 (phyaddr == 1) */
9564 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9565 && (new_phytype != WMPHY_BM)
9566 && (new_phytype != WMPHY_UNKNOWN))
9567 doubt_phytype = new_phytype;
9568 new_phytype = WMPHY_BM;
9569 new_readreg = wm_gmii_bm_readreg;
9570 new_writereg = wm_gmii_bm_writereg;
9571 } else if (sc->sc_type >= WM_T_PCH) {
9572 /* All PCH* use _hv_ */
9573 new_readreg = wm_gmii_hv_readreg;
9574 new_writereg = wm_gmii_hv_writereg;
9575 } else if (sc->sc_type >= WM_T_ICH8) {
9576 /* non-82567 ICH8, 9 and 10 */
9577 new_readreg = wm_gmii_i82544_readreg;
9578 new_writereg = wm_gmii_i82544_writereg;
9579 } else if (sc->sc_type >= WM_T_80003) {
9580 /* 80003 */
9581 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9582 && (new_phytype != WMPHY_GG82563)
9583 && (new_phytype != WMPHY_UNKNOWN))
9584 doubt_phytype = new_phytype;
9585 new_phytype = WMPHY_GG82563;
9586 new_readreg = wm_gmii_i80003_readreg;
9587 new_writereg = wm_gmii_i80003_writereg;
9588 } else if (sc->sc_type >= WM_T_I210) {
9589 /* I210 and I211 */
9590 if ((sc->sc_phytype != WMPHY_UNKNOWN)
9591 && (new_phytype != WMPHY_I210)
9592 && (new_phytype != WMPHY_UNKNOWN))
9593 doubt_phytype = new_phytype;
9594 new_phytype = WMPHY_I210;
9595 new_readreg = wm_gmii_gs40g_readreg;
9596 new_writereg = wm_gmii_gs40g_writereg;
9597 } else if (sc->sc_type >= WM_T_82580) {
9598 /* 82580, I350 and I354 */
9599 new_readreg = wm_gmii_82580_readreg;
9600 new_writereg = wm_gmii_82580_writereg;
9601 } else if (sc->sc_type >= WM_T_82544) {
9602 /* 82544, 0, [56], [17], 8257[1234] and 82583 */
9603 new_readreg = wm_gmii_i82544_readreg;
9604 new_writereg = wm_gmii_i82544_writereg;
9605 } else {
9606 new_readreg = wm_gmii_i82543_readreg;
9607 new_writereg = wm_gmii_i82543_writereg;
9608 }
9609
9610 if (new_phytype == WMPHY_BM) {
9611 /* All BM use _bm_ */
9612 new_readreg = wm_gmii_bm_readreg;
9613 new_writereg = wm_gmii_bm_writereg;
9614 }
9615 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_CNP)) {
9616 /* All PCH* use _hv_ */
9617 new_readreg = wm_gmii_hv_readreg;
9618 new_writereg = wm_gmii_hv_writereg;
9619 }
9620
9621 /* Diag output */
9622 if (doubt_phytype != WMPHY_UNKNOWN)
9623 aprint_error_dev(dev, "Assumed new PHY type was "
9624 "incorrect. old = %u, new = %u\n", sc->sc_phytype,
9625 new_phytype);
9626 else if ((sc->sc_phytype != WMPHY_UNKNOWN)
9627 && (sc->sc_phytype != new_phytype ))
9628 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
9629 "was incorrect. New PHY type = %u\n",
9630 sc->sc_phytype, new_phytype);
9631
9632 if ((mii->mii_readreg != NULL) && (new_phytype == WMPHY_UNKNOWN))
9633 aprint_error_dev(dev, "PHY type is still unknown.\n");
9634
9635 if ((mii->mii_readreg != NULL) && (mii->mii_readreg != new_readreg))
9636 aprint_error_dev(dev, "Previously assumed PHY read/write "
9637 "function was incorrect.\n");
9638
9639 /* Update now */
9640 sc->sc_phytype = new_phytype;
9641 mii->mii_readreg = new_readreg;
9642 mii->mii_writereg = new_writereg;
9643 }
9644
9645 /*
9646 * wm_get_phy_id_82575:
9647 *
9648 * Return PHY ID. Return -1 if it failed.
9649 */
9650 static int
9651 wm_get_phy_id_82575(struct wm_softc *sc)
9652 {
9653 uint32_t reg;
9654 int phyid = -1;
9655
9656 /* XXX */
9657 if ((sc->sc_flags & WM_F_SGMII) == 0)
9658 return -1;
9659
9660 if (wm_sgmii_uses_mdio(sc)) {
9661 switch (sc->sc_type) {
9662 case WM_T_82575:
9663 case WM_T_82576:
9664 reg = CSR_READ(sc, WMREG_MDIC);
9665 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT;
9666 break;
9667 case WM_T_82580:
9668 case WM_T_I350:
9669 case WM_T_I354:
9670 case WM_T_I210:
9671 case WM_T_I211:
9672 reg = CSR_READ(sc, WMREG_MDICNFG);
9673 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT;
9674 break;
9675 default:
9676 return -1;
9677 }
9678 }
9679
9680 return phyid;
9681 }
9682
9683
9684 /*
9685 * wm_gmii_mediainit:
9686 *
9687 * Initialize media for use on 1000BASE-T devices.
9688 */
9689 static void
9690 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid)
9691 {
9692 device_t dev = sc->sc_dev;
9693 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
9694 struct mii_data *mii = &sc->sc_mii;
9695 uint32_t reg;
9696
9697 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9698 device_xname(sc->sc_dev), __func__));
9699
9700 /* We have GMII. */
9701 sc->sc_flags |= WM_F_HAS_MII;
9702
9703 if (sc->sc_type == WM_T_80003)
9704 sc->sc_tipg = TIPG_1000T_80003_DFLT;
9705 else
9706 sc->sc_tipg = TIPG_1000T_DFLT;
9707
9708 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */
9709 if ((sc->sc_type == WM_T_82580)
9710 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210)
9711 || (sc->sc_type == WM_T_I211)) {
9712 reg = CSR_READ(sc, WMREG_PHPM);
9713 reg &= ~PHPM_GO_LINK_D;
9714 CSR_WRITE(sc, WMREG_PHPM, reg);
9715 }
9716
9717 /*
9718 * Let the chip set speed/duplex on its own based on
9719 * signals from the PHY.
9720 * XXXbouyer - I'm not sure this is right for the 80003,
9721 * the em driver only sets CTRL_SLU here - but it seems to work.
9722 */
9723 sc->sc_ctrl |= CTRL_SLU;
9724 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9725
9726 /* Initialize our media structures and probe the GMII. */
9727 mii->mii_ifp = ifp;
9728
9729 mii->mii_statchg = wm_gmii_statchg;
9730
9731 /* get PHY control from SMBus to PCIe */
9732 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
9733 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
9734 || (sc->sc_type == WM_T_PCH_CNP))
9735 wm_smbustopci(sc);
9736
9737 wm_gmii_reset(sc);
9738
9739 sc->sc_ethercom.ec_mii = &sc->sc_mii;
9740 ifmedia_init(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange,
9741 wm_gmii_mediastatus);
9742
9743 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
9744 || (sc->sc_type == WM_T_82580)
9745 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
9746 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) {
9747 if ((sc->sc_flags & WM_F_SGMII) == 0) {
9748 /* Attach only one port */
9749 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1,
9750 MII_OFFSET_ANY, MIIF_DOPAUSE);
9751 } else {
9752 int i, id;
9753 uint32_t ctrl_ext;
9754
9755 id = wm_get_phy_id_82575(sc);
9756 if (id != -1) {
9757 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff,
9758 id, MII_OFFSET_ANY, MIIF_DOPAUSE);
9759 }
9760 if ((id == -1)
9761 || (LIST_FIRST(&mii->mii_phys) == NULL)) {
9762 /* Power on sgmii phy if it is disabled */
9763 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
9764 CSR_WRITE(sc, WMREG_CTRL_EXT,
9765 ctrl_ext &~ CTRL_EXT_SWDPIN(3));
9766 CSR_WRITE_FLUSH(sc);
9767 delay(300*1000); /* XXX too long */
9768
9769 /* from 1 to 8 */
9770 for (i = 1; i < 8; i++)
9771 mii_attach(sc->sc_dev, &sc->sc_mii,
9772 0xffffffff, i, MII_OFFSET_ANY,
9773 MIIF_DOPAUSE);
9774
9775 /* restore previous sfp cage power state */
9776 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
9777 }
9778 }
9779 } else {
9780 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
9781 MII_OFFSET_ANY, MIIF_DOPAUSE);
9782 }
9783
9784 /*
9785 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call
9786 * wm_set_mdio_slow_mode_hv() for a workaround and retry.
9787 */
9788 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
9789 || (sc->sc_type == WM_T_PCH_SPT)
9790 || (sc->sc_type == WM_T_PCH_CNP))
9791 && (LIST_FIRST(&mii->mii_phys) == NULL)) {
9792 wm_set_mdio_slow_mode_hv(sc);
9793 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
9794 MII_OFFSET_ANY, MIIF_DOPAUSE);
9795 }
9796
9797 /*
9798 * (For ICH8 variants)
9799 * If PHY detection failed, use BM's r/w function and retry.
9800 */
9801 if (LIST_FIRST(&mii->mii_phys) == NULL) {
9802 /* if failed, retry with *_bm_* */
9803 aprint_verbose_dev(dev, "Assumed PHY access function "
9804 "(type = %d) might be incorrect. Use BM and retry.\n",
9805 sc->sc_phytype);
9806 sc->sc_phytype = WMPHY_BM;
9807 mii->mii_readreg = wm_gmii_bm_readreg;
9808 mii->mii_writereg = wm_gmii_bm_writereg;
9809
9810 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
9811 MII_OFFSET_ANY, MIIF_DOPAUSE);
9812 }
9813
9814 if (LIST_FIRST(&mii->mii_phys) == NULL) {
9815 /* Any PHY wasn't find */
9816 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
9817 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
9818 sc->sc_phytype = WMPHY_NONE;
9819 } else {
9820 struct mii_softc *child = LIST_FIRST(&mii->mii_phys);
9821
9822 /*
9823 * PHY Found! Check PHY type again by the second call of
9824 * wm_gmii_setup_phytype.
9825 */
9826 wm_gmii_setup_phytype(sc, child->mii_mpd_oui,
9827 child->mii_mpd_model);
9828
9829 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
9830 }
9831 }
9832
9833 /*
9834 * wm_gmii_mediachange: [ifmedia interface function]
9835 *
9836 * Set hardware to newly-selected media on a 1000BASE-T device.
9837 */
9838 static int
9839 wm_gmii_mediachange(struct ifnet *ifp)
9840 {
9841 struct wm_softc *sc = ifp->if_softc;
9842 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
9843 int rc;
9844
9845 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9846 device_xname(sc->sc_dev), __func__));
9847 if ((ifp->if_flags & IFF_UP) == 0)
9848 return 0;
9849
9850 /* Disable D0 LPLU. */
9851 wm_lplu_d0_disable(sc);
9852
9853 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
9854 sc->sc_ctrl |= CTRL_SLU;
9855 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
9856 || (sc->sc_type > WM_T_82543)) {
9857 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
9858 } else {
9859 sc->sc_ctrl &= ~CTRL_ASDE;
9860 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
9861 if (ife->ifm_media & IFM_FDX)
9862 sc->sc_ctrl |= CTRL_FD;
9863 switch (IFM_SUBTYPE(ife->ifm_media)) {
9864 case IFM_10_T:
9865 sc->sc_ctrl |= CTRL_SPEED_10;
9866 break;
9867 case IFM_100_TX:
9868 sc->sc_ctrl |= CTRL_SPEED_100;
9869 break;
9870 case IFM_1000_T:
9871 sc->sc_ctrl |= CTRL_SPEED_1000;
9872 break;
9873 default:
9874 panic("wm_gmii_mediachange: bad media 0x%x",
9875 ife->ifm_media);
9876 }
9877 }
9878 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9879 CSR_WRITE_FLUSH(sc);
9880 if (sc->sc_type <= WM_T_82543)
9881 wm_gmii_reset(sc);
9882
9883 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
9884 return 0;
9885 return rc;
9886 }
9887
9888 /*
9889 * wm_gmii_mediastatus: [ifmedia interface function]
9890 *
9891 * Get the current interface media status on a 1000BASE-T device.
9892 */
9893 static void
9894 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
9895 {
9896 struct wm_softc *sc = ifp->if_softc;
9897
9898 ether_mediastatus(ifp, ifmr);
9899 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
9900 | sc->sc_flowflags;
9901 }
9902
9903 #define MDI_IO CTRL_SWDPIN(2)
9904 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */
9905 #define MDI_CLK CTRL_SWDPIN(3)
9906
9907 static void
9908 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
9909 {
9910 uint32_t i, v;
9911
9912 v = CSR_READ(sc, WMREG_CTRL);
9913 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
9914 v |= MDI_DIR | CTRL_SWDPIO(3);
9915
9916 for (i = 1 << (nbits - 1); i != 0; i >>= 1) {
9917 if (data & i)
9918 v |= MDI_IO;
9919 else
9920 v &= ~MDI_IO;
9921 CSR_WRITE(sc, WMREG_CTRL, v);
9922 CSR_WRITE_FLUSH(sc);
9923 delay(10);
9924 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9925 CSR_WRITE_FLUSH(sc);
9926 delay(10);
9927 CSR_WRITE(sc, WMREG_CTRL, v);
9928 CSR_WRITE_FLUSH(sc);
9929 delay(10);
9930 }
9931 }
9932
9933 static uint32_t
9934 wm_i82543_mii_recvbits(struct wm_softc *sc)
9935 {
9936 uint32_t v, i, data = 0;
9937
9938 v = CSR_READ(sc, WMREG_CTRL);
9939 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
9940 v |= CTRL_SWDPIO(3);
9941
9942 CSR_WRITE(sc, WMREG_CTRL, v);
9943 CSR_WRITE_FLUSH(sc);
9944 delay(10);
9945 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9946 CSR_WRITE_FLUSH(sc);
9947 delay(10);
9948 CSR_WRITE(sc, WMREG_CTRL, v);
9949 CSR_WRITE_FLUSH(sc);
9950 delay(10);
9951
9952 for (i = 0; i < 16; i++) {
9953 data <<= 1;
9954 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9955 CSR_WRITE_FLUSH(sc);
9956 delay(10);
9957 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
9958 data |= 1;
9959 CSR_WRITE(sc, WMREG_CTRL, v);
9960 CSR_WRITE_FLUSH(sc);
9961 delay(10);
9962 }
9963
9964 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9965 CSR_WRITE_FLUSH(sc);
9966 delay(10);
9967 CSR_WRITE(sc, WMREG_CTRL, v);
9968 CSR_WRITE_FLUSH(sc);
9969 delay(10);
9970
9971 return data;
9972 }
9973
9974 #undef MDI_IO
9975 #undef MDI_DIR
9976 #undef MDI_CLK
9977
9978 /*
9979 * wm_gmii_i82543_readreg: [mii interface function]
9980 *
9981 * Read a PHY register on the GMII (i82543 version).
9982 */
9983 static int
9984 wm_gmii_i82543_readreg(device_t dev, int phy, int reg)
9985 {
9986 struct wm_softc *sc = device_private(dev);
9987 int rv;
9988
9989 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
9990 wm_i82543_mii_sendbits(sc, reg | (phy << 5) |
9991 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
9992 rv = wm_i82543_mii_recvbits(sc) & 0xffff;
9993
9994 DPRINTF(WM_DEBUG_GMII, ("%s: GMII: read phy %d reg %d -> 0x%04x\n",
9995 device_xname(dev), phy, reg, rv));
9996
9997 return rv;
9998 }
9999
10000 /*
10001 * wm_gmii_i82543_writereg: [mii interface function]
10002 *
10003 * Write a PHY register on the GMII (i82543 version).
10004 */
10005 static void
10006 wm_gmii_i82543_writereg(device_t dev, int phy, int reg, int val)
10007 {
10008 struct wm_softc *sc = device_private(dev);
10009
10010 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
10011 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
10012 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
10013 (MII_COMMAND_START << 30), 32);
10014 }
10015
10016 /*
10017 * wm_gmii_mdic_readreg: [mii interface function]
10018 *
10019 * Read a PHY register on the GMII.
10020 */
10021 static int
10022 wm_gmii_mdic_readreg(device_t dev, int phy, int reg)
10023 {
10024 struct wm_softc *sc = device_private(dev);
10025 uint32_t mdic = 0;
10026 int i, rv;
10027
10028 if (reg > MII_ADDRMASK) {
10029 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10030 __func__, sc->sc_phytype, reg);
10031 reg &= MII_ADDRMASK;
10032 }
10033
10034 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
10035 MDIC_REGADD(reg));
10036
10037 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
10038 mdic = CSR_READ(sc, WMREG_MDIC);
10039 if (mdic & MDIC_READY)
10040 break;
10041 delay(50);
10042 }
10043
10044 if ((mdic & MDIC_READY) == 0) {
10045 log(LOG_WARNING, "%s: MDIC read timed out: phy %d reg %d\n",
10046 device_xname(dev), phy, reg);
10047 rv = 0;
10048 } else if (mdic & MDIC_E) {
10049 #if 0 /* This is normal if no PHY is present. */
10050 log(LOG_WARNING, "%s: MDIC read error: phy %d reg %d\n",
10051 device_xname(dev), phy, reg);
10052 #endif
10053 rv = 0;
10054 } else {
10055 rv = MDIC_DATA(mdic);
10056 if (rv == 0xffff)
10057 rv = 0;
10058 }
10059
10060 return rv;
10061 }
10062
10063 /*
10064 * wm_gmii_mdic_writereg: [mii interface function]
10065 *
10066 * Write a PHY register on the GMII.
10067 */
10068 static void
10069 wm_gmii_mdic_writereg(device_t dev, int phy, int reg, int val)
10070 {
10071 struct wm_softc *sc = device_private(dev);
10072 uint32_t mdic = 0;
10073 int i;
10074
10075 if (reg > MII_ADDRMASK) {
10076 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10077 __func__, sc->sc_phytype, reg);
10078 reg &= MII_ADDRMASK;
10079 }
10080
10081 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
10082 MDIC_REGADD(reg) | MDIC_DATA(val));
10083
10084 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
10085 mdic = CSR_READ(sc, WMREG_MDIC);
10086 if (mdic & MDIC_READY)
10087 break;
10088 delay(50);
10089 }
10090
10091 if ((mdic & MDIC_READY) == 0)
10092 log(LOG_WARNING, "%s: MDIC write timed out: phy %d reg %d\n",
10093 device_xname(dev), phy, reg);
10094 else if (mdic & MDIC_E)
10095 log(LOG_WARNING, "%s: MDIC write error: phy %d reg %d\n",
10096 device_xname(dev), phy, reg);
10097 }
10098
10099 /*
10100 * wm_gmii_i82544_readreg: [mii interface function]
10101 *
10102 * Read a PHY register on the GMII.
10103 */
10104 static int
10105 wm_gmii_i82544_readreg(device_t dev, int phy, int reg)
10106 {
10107 struct wm_softc *sc = device_private(dev);
10108 int rv;
10109
10110 if (sc->phy.acquire(sc)) {
10111 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10112 return 0;
10113 }
10114
10115 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10116 switch (sc->sc_phytype) {
10117 case WMPHY_IGP:
10118 case WMPHY_IGP_2:
10119 case WMPHY_IGP_3:
10120 wm_gmii_mdic_writereg(dev, phy, MII_IGPHY_PAGE_SELECT,
10121 reg);
10122 break;
10123 default:
10124 #ifdef WM_DEBUG
10125 device_printf(dev, "%s: PHYTYPE = 0x%x, addr = %02x\n",
10126 __func__, sc->sc_phytype, reg);
10127 #endif
10128 break;
10129 }
10130 }
10131
10132 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10133 sc->phy.release(sc);
10134
10135 return rv;
10136 }
10137
10138 /*
10139 * wm_gmii_i82544_writereg: [mii interface function]
10140 *
10141 * Write a PHY register on the GMII.
10142 */
10143 static void
10144 wm_gmii_i82544_writereg(device_t dev, int phy, int reg, int val)
10145 {
10146 struct wm_softc *sc = device_private(dev);
10147
10148 if (sc->phy.acquire(sc)) {
10149 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10150 return;
10151 }
10152
10153 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10154 switch (sc->sc_phytype) {
10155 case WMPHY_IGP:
10156 case WMPHY_IGP_2:
10157 case WMPHY_IGP_3:
10158 wm_gmii_mdic_writereg(dev, phy, MII_IGPHY_PAGE_SELECT,
10159 reg);
10160 break;
10161 default:
10162 #ifdef WM_DEBUG
10163 device_printf(dev, "%s: PHYTYPE == 0x%x, addr = %02x",
10164 __func__, sc->sc_phytype, reg);
10165 #endif
10166 break;
10167 }
10168 }
10169
10170 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10171 sc->phy.release(sc);
10172 }
10173
10174 /*
10175 * wm_gmii_i80003_readreg: [mii interface function]
10176 *
10177 * Read a PHY register on the kumeran
10178 * This could be handled by the PHY layer if we didn't have to lock the
10179 * ressource ...
10180 */
10181 static int
10182 wm_gmii_i80003_readreg(device_t dev, int phy, int reg)
10183 {
10184 struct wm_softc *sc = device_private(dev);
10185 int page_select, temp;
10186 int rv;
10187
10188 if (phy != 1) /* only one PHY on kumeran bus */
10189 return 0;
10190
10191 if (sc->phy.acquire(sc)) {
10192 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10193 return 0;
10194 }
10195
10196 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
10197 page_select = GG82563_PHY_PAGE_SELECT;
10198 else {
10199 /*
10200 * Use Alternative Page Select register to access registers
10201 * 30 and 31.
10202 */
10203 page_select = GG82563_PHY_PAGE_SELECT_ALT;
10204 }
10205 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT;
10206 wm_gmii_mdic_writereg(dev, phy, page_select, temp);
10207 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
10208 /*
10209 * Wait more 200us for a bug of the ready bit in the MDIC
10210 * register.
10211 */
10212 delay(200);
10213 if (wm_gmii_mdic_readreg(dev, phy, page_select) != temp) {
10214 device_printf(dev, "%s failed\n", __func__);
10215 rv = 0; /* XXX */
10216 goto out;
10217 }
10218 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10219 delay(200);
10220 } else
10221 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10222
10223 out:
10224 sc->phy.release(sc);
10225 return rv;
10226 }
10227
10228 /*
10229 * wm_gmii_i80003_writereg: [mii interface function]
10230 *
10231 * Write a PHY register on the kumeran.
10232 * This could be handled by the PHY layer if we didn't have to lock the
10233 * ressource ...
10234 */
10235 static void
10236 wm_gmii_i80003_writereg(device_t dev, int phy, int reg, int val)
10237 {
10238 struct wm_softc *sc = device_private(dev);
10239 int page_select, temp;
10240
10241 if (phy != 1) /* only one PHY on kumeran bus */
10242 return;
10243
10244 if (sc->phy.acquire(sc)) {
10245 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10246 return;
10247 }
10248
10249 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG)
10250 page_select = GG82563_PHY_PAGE_SELECT;
10251 else {
10252 /*
10253 * Use Alternative Page Select register to access registers
10254 * 30 and 31.
10255 */
10256 page_select = GG82563_PHY_PAGE_SELECT_ALT;
10257 }
10258 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT;
10259 wm_gmii_mdic_writereg(dev, phy, page_select, temp);
10260 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) {
10261 /*
10262 * Wait more 200us for a bug of the ready bit in the MDIC
10263 * register.
10264 */
10265 delay(200);
10266 if (wm_gmii_mdic_readreg(dev, phy, page_select) != temp) {
10267 device_printf(dev, "%s failed\n", __func__);
10268 goto out;
10269 }
10270 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10271 delay(200);
10272 } else
10273 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10274
10275 out:
10276 sc->phy.release(sc);
10277 }
10278
10279 /*
10280 * wm_gmii_bm_readreg: [mii interface function]
10281 *
10282 * Read a PHY register on the kumeran
10283 * This could be handled by the PHY layer if we didn't have to lock the
10284 * ressource ...
10285 */
10286 static int
10287 wm_gmii_bm_readreg(device_t dev, int phy, int reg)
10288 {
10289 struct wm_softc *sc = device_private(dev);
10290 uint16_t page = reg >> BME1000_PAGE_SHIFT;
10291 uint16_t val;
10292 int rv;
10293
10294 if (sc->phy.acquire(sc)) {
10295 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10296 return 0;
10297 }
10298
10299 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
10300 phy = ((page >= 768) || ((page == 0) && (reg == 25))
10301 || (reg == 31)) ? 1 : phy;
10302 /* Page 800 works differently than the rest so it has its own func */
10303 if (page == BM_WUC_PAGE) {
10304 wm_access_phy_wakeup_reg_bm(dev, reg, &val, 1);
10305 rv = val;
10306 goto release;
10307 }
10308
10309 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10310 if ((phy == 1) && (sc->sc_type != WM_T_82574)
10311 && (sc->sc_type != WM_T_82583))
10312 wm_gmii_mdic_writereg(dev, phy,
10313 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
10314 else
10315 wm_gmii_mdic_writereg(dev, phy,
10316 BME1000_PHY_PAGE_SELECT, page);
10317 }
10318
10319 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK);
10320
10321 release:
10322 sc->phy.release(sc);
10323 return rv;
10324 }
10325
10326 /*
10327 * wm_gmii_bm_writereg: [mii interface function]
10328 *
10329 * Write a PHY register on the kumeran.
10330 * This could be handled by the PHY layer if we didn't have to lock the
10331 * ressource ...
10332 */
10333 static void
10334 wm_gmii_bm_writereg(device_t dev, int phy, int reg, int val)
10335 {
10336 struct wm_softc *sc = device_private(dev);
10337 uint16_t page = reg >> BME1000_PAGE_SHIFT;
10338
10339 if (sc->phy.acquire(sc)) {
10340 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10341 return;
10342 }
10343
10344 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
10345 phy = ((page >= 768) || ((page == 0) && (reg == 25))
10346 || (reg == 31)) ? 1 : phy;
10347 /* Page 800 works differently than the rest so it has its own func */
10348 if (page == BM_WUC_PAGE) {
10349 uint16_t tmp;
10350
10351 tmp = val;
10352 wm_access_phy_wakeup_reg_bm(dev, reg, &tmp, 0);
10353 goto release;
10354 }
10355
10356 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
10357 if ((phy == 1) && (sc->sc_type != WM_T_82574)
10358 && (sc->sc_type != WM_T_82583))
10359 wm_gmii_mdic_writereg(dev, phy,
10360 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
10361 else
10362 wm_gmii_mdic_writereg(dev, phy,
10363 BME1000_PHY_PAGE_SELECT, page);
10364 }
10365
10366 wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val);
10367
10368 release:
10369 sc->phy.release(sc);
10370 }
10371
10372 static void
10373 wm_access_phy_wakeup_reg_bm(device_t dev, int offset, int16_t *val, int rd)
10374 {
10375 struct wm_softc *sc = device_private(dev);
10376 uint16_t regnum = BM_PHY_REG_NUM(offset);
10377 uint16_t wuce, reg;
10378
10379 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10380 device_xname(dev), __func__));
10381 /* XXX Gig must be disabled for MDIO accesses to page 800 */
10382 if (sc->sc_type == WM_T_PCH) {
10383 /* XXX e1000 driver do nothing... why? */
10384 }
10385
10386 /*
10387 * 1) Enable PHY wakeup register first.
10388 * See e1000_enable_phy_wakeup_reg_access_bm().
10389 */
10390
10391 /* Set page 769 */
10392 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10393 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
10394
10395 /* Read WUCE and save it */
10396 wuce = wm_gmii_mdic_readreg(dev, 1, BM_WUC_ENABLE_REG);
10397
10398 reg = wuce | BM_WUC_ENABLE_BIT;
10399 reg &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT);
10400 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, reg);
10401
10402 /* Select page 800 */
10403 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10404 BM_WUC_PAGE << BME1000_PAGE_SHIFT);
10405
10406 /*
10407 * 2) Access PHY wakeup register.
10408 * See e1000_access_phy_wakeup_reg_bm.
10409 */
10410
10411 /* Write page 800 */
10412 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ADDRESS_OPCODE, regnum);
10413
10414 if (rd)
10415 *val = wm_gmii_mdic_readreg(dev, 1, BM_WUC_DATA_OPCODE);
10416 else
10417 wm_gmii_mdic_writereg(dev, 1, BM_WUC_DATA_OPCODE, *val);
10418
10419 /*
10420 * 3) Disable PHY wakeup register.
10421 * See e1000_disable_phy_wakeup_reg_access_bm().
10422 */
10423 /* Set page 769 */
10424 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10425 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
10426
10427 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, wuce);
10428 }
10429
10430 /*
10431 * wm_gmii_hv_readreg: [mii interface function]
10432 *
10433 * Read a PHY register on the kumeran
10434 * This could be handled by the PHY layer if we didn't have to lock the
10435 * ressource ...
10436 */
10437 static int
10438 wm_gmii_hv_readreg(device_t dev, int phy, int reg)
10439 {
10440 struct wm_softc *sc = device_private(dev);
10441 int rv;
10442
10443 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10444 device_xname(dev), __func__));
10445 if (sc->phy.acquire(sc)) {
10446 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10447 return 0;
10448 }
10449
10450 rv = wm_gmii_hv_readreg_locked(dev, phy, reg);
10451 sc->phy.release(sc);
10452 return rv;
10453 }
10454
10455 static int
10456 wm_gmii_hv_readreg_locked(device_t dev, int phy, int reg)
10457 {
10458 uint16_t page = BM_PHY_REG_PAGE(reg);
10459 uint16_t regnum = BM_PHY_REG_NUM(reg);
10460 uint16_t val;
10461 int rv;
10462
10463 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
10464
10465 /* Page 800 works differently than the rest so it has its own func */
10466 if (page == BM_WUC_PAGE) {
10467 wm_access_phy_wakeup_reg_bm(dev, reg, &val, 1);
10468 return val;
10469 }
10470
10471 /*
10472 * Lower than page 768 works differently than the rest so it has its
10473 * own func
10474 */
10475 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
10476 printf("gmii_hv_readreg!!!\n");
10477 return 0;
10478 }
10479
10480 /*
10481 * XXX I21[789] documents say that the SMBus Address register is at
10482 * PHY address 01, Page 0 (not 768), Register 26.
10483 */
10484 if (page == HV_INTC_FC_PAGE_START)
10485 page = 0;
10486
10487 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
10488 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10489 page << BME1000_PAGE_SHIFT);
10490 }
10491
10492 rv = wm_gmii_mdic_readreg(dev, phy, regnum & MII_ADDRMASK);
10493 return rv;
10494 }
10495
10496 /*
10497 * wm_gmii_hv_writereg: [mii interface function]
10498 *
10499 * Write a PHY register on the kumeran.
10500 * This could be handled by the PHY layer if we didn't have to lock the
10501 * ressource ...
10502 */
10503 static void
10504 wm_gmii_hv_writereg(device_t dev, int phy, int reg, int val)
10505 {
10506 struct wm_softc *sc = device_private(dev);
10507
10508 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
10509 device_xname(dev), __func__));
10510
10511 if (sc->phy.acquire(sc)) {
10512 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10513 return;
10514 }
10515
10516 wm_gmii_hv_writereg_locked(dev, phy, reg, val);
10517 sc->phy.release(sc);
10518 }
10519
10520 static void
10521 wm_gmii_hv_writereg_locked(device_t dev, int phy, int reg, int val)
10522 {
10523 struct wm_softc *sc = device_private(dev);
10524 uint16_t page = BM_PHY_REG_PAGE(reg);
10525 uint16_t regnum = BM_PHY_REG_NUM(reg);
10526
10527 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
10528
10529 /* Page 800 works differently than the rest so it has its own func */
10530 if (page == BM_WUC_PAGE) {
10531 uint16_t tmp;
10532
10533 tmp = val;
10534 wm_access_phy_wakeup_reg_bm(dev, reg, &tmp, 0);
10535 return;
10536 }
10537
10538 /*
10539 * Lower than page 768 works differently than the rest so it has its
10540 * own func
10541 */
10542 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
10543 printf("gmii_hv_writereg!!!\n");
10544 return;
10545 }
10546
10547 {
10548 /*
10549 * XXX I21[789] documents say that the SMBus Address register
10550 * is at PHY address 01, Page 0 (not 768), Register 26.
10551 */
10552 if (page == HV_INTC_FC_PAGE_START)
10553 page = 0;
10554
10555 /*
10556 * XXX Workaround MDIO accesses being disabled after entering
10557 * IEEE Power Down (whenever bit 11 of the PHY control
10558 * register is set)
10559 */
10560 if (sc->sc_phytype == WMPHY_82578) {
10561 struct mii_softc *child;
10562
10563 child = LIST_FIRST(&sc->sc_mii.mii_phys);
10564 if ((child != NULL) && (child->mii_mpd_rev >= 1)
10565 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0)
10566 && ((val & (1 << 11)) != 0)) {
10567 printf("XXX need workaround\n");
10568 }
10569 }
10570
10571 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
10572 wm_gmii_mdic_writereg(dev, 1, MII_IGPHY_PAGE_SELECT,
10573 page << BME1000_PAGE_SHIFT);
10574 }
10575 }
10576
10577 wm_gmii_mdic_writereg(dev, phy, regnum & MII_ADDRMASK, val);
10578 }
10579
10580 /*
10581 * wm_gmii_82580_readreg: [mii interface function]
10582 *
10583 * Read a PHY register on the 82580 and I350.
10584 * This could be handled by the PHY layer if we didn't have to lock the
10585 * ressource ...
10586 */
10587 static int
10588 wm_gmii_82580_readreg(device_t dev, int phy, int reg)
10589 {
10590 struct wm_softc *sc = device_private(dev);
10591 int rv;
10592
10593 if (sc->phy.acquire(sc) != 0) {
10594 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10595 return 0;
10596 }
10597
10598 #ifdef DIAGNOSTIC
10599 if (reg > MII_ADDRMASK) {
10600 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10601 __func__, sc->sc_phytype, reg);
10602 reg &= MII_ADDRMASK;
10603 }
10604 #endif
10605 rv = wm_gmii_mdic_readreg(dev, phy, reg);
10606
10607 sc->phy.release(sc);
10608 return rv;
10609 }
10610
10611 /*
10612 * wm_gmii_82580_writereg: [mii interface function]
10613 *
10614 * Write a PHY register on the 82580 and I350.
10615 * This could be handled by the PHY layer if we didn't have to lock the
10616 * ressource ...
10617 */
10618 static void
10619 wm_gmii_82580_writereg(device_t dev, int phy, int reg, int val)
10620 {
10621 struct wm_softc *sc = device_private(dev);
10622
10623 if (sc->phy.acquire(sc) != 0) {
10624 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10625 return;
10626 }
10627
10628 #ifdef DIAGNOSTIC
10629 if (reg > MII_ADDRMASK) {
10630 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n",
10631 __func__, sc->sc_phytype, reg);
10632 reg &= MII_ADDRMASK;
10633 }
10634 #endif
10635 wm_gmii_mdic_writereg(dev, phy, reg, val);
10636
10637 sc->phy.release(sc);
10638 }
10639
10640 /*
10641 * wm_gmii_gs40g_readreg: [mii interface function]
10642 *
10643 * Read a PHY register on the I2100 and I211.
10644 * This could be handled by the PHY layer if we didn't have to lock the
10645 * ressource ...
10646 */
10647 static int
10648 wm_gmii_gs40g_readreg(device_t dev, int phy, int reg)
10649 {
10650 struct wm_softc *sc = device_private(dev);
10651 int page, offset;
10652 int rv;
10653
10654 /* Acquire semaphore */
10655 if (sc->phy.acquire(sc)) {
10656 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10657 return 0;
10658 }
10659
10660 /* Page select */
10661 page = reg >> GS40G_PAGE_SHIFT;
10662 wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
10663
10664 /* Read reg */
10665 offset = reg & GS40G_OFFSET_MASK;
10666 rv = wm_gmii_mdic_readreg(dev, phy, offset);
10667
10668 sc->phy.release(sc);
10669 return rv;
10670 }
10671
10672 /*
10673 * wm_gmii_gs40g_writereg: [mii interface function]
10674 *
10675 * Write a PHY register on the I210 and I211.
10676 * This could be handled by the PHY layer if we didn't have to lock the
10677 * ressource ...
10678 */
10679 static void
10680 wm_gmii_gs40g_writereg(device_t dev, int phy, int reg, int val)
10681 {
10682 struct wm_softc *sc = device_private(dev);
10683 int page, offset;
10684
10685 /* Acquire semaphore */
10686 if (sc->phy.acquire(sc)) {
10687 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10688 return;
10689 }
10690
10691 /* Page select */
10692 page = reg >> GS40G_PAGE_SHIFT;
10693 wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page);
10694
10695 /* Write reg */
10696 offset = reg & GS40G_OFFSET_MASK;
10697 wm_gmii_mdic_writereg(dev, phy, offset, val);
10698
10699 /* Release semaphore */
10700 sc->phy.release(sc);
10701 }
10702
10703 /*
10704 * wm_gmii_statchg: [mii interface function]
10705 *
10706 * Callback from MII layer when media changes.
10707 */
10708 static void
10709 wm_gmii_statchg(struct ifnet *ifp)
10710 {
10711 struct wm_softc *sc = ifp->if_softc;
10712 struct mii_data *mii = &sc->sc_mii;
10713
10714 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE);
10715 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
10716 sc->sc_fcrtl &= ~FCRTL_XONE;
10717
10718 /*
10719 * Get flow control negotiation result.
10720 */
10721 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
10722 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) {
10723 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
10724 mii->mii_media_active &= ~IFM_ETH_FMASK;
10725 }
10726
10727 if (sc->sc_flowflags & IFM_FLOW) {
10728 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) {
10729 sc->sc_ctrl |= CTRL_TFCE;
10730 sc->sc_fcrtl |= FCRTL_XONE;
10731 }
10732 if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
10733 sc->sc_ctrl |= CTRL_RFCE;
10734 }
10735
10736 if (sc->sc_mii.mii_media_active & IFM_FDX) {
10737 DPRINTF(WM_DEBUG_LINK,
10738 ("%s: LINK: statchg: FDX\n", ifp->if_xname));
10739 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
10740 } else {
10741 DPRINTF(WM_DEBUG_LINK,
10742 ("%s: LINK: statchg: HDX\n", ifp->if_xname));
10743 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
10744 }
10745
10746 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10747 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
10748 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
10749 : WMREG_FCRTL, sc->sc_fcrtl);
10750 if (sc->sc_type == WM_T_80003) {
10751 switch (IFM_SUBTYPE(sc->sc_mii.mii_media_active)) {
10752 case IFM_1000_T:
10753 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
10754 KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
10755 sc->sc_tipg = TIPG_1000T_80003_DFLT;
10756 break;
10757 default:
10758 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
10759 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
10760 sc->sc_tipg = TIPG_10_100_80003_DFLT;
10761 break;
10762 }
10763 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
10764 }
10765 }
10766
10767 /* kumeran related (80003, ICH* and PCH*) */
10768
10769 /*
10770 * wm_kmrn_readreg:
10771 *
10772 * Read a kumeran register
10773 */
10774 static int
10775 wm_kmrn_readreg(struct wm_softc *sc, int reg, uint16_t *val)
10776 {
10777 int rv;
10778
10779 if (sc->sc_type == WM_T_80003)
10780 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10781 else
10782 rv = sc->phy.acquire(sc);
10783 if (rv != 0) {
10784 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
10785 __func__);
10786 return rv;
10787 }
10788
10789 rv = wm_kmrn_readreg_locked(sc, reg, val);
10790
10791 if (sc->sc_type == WM_T_80003)
10792 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10793 else
10794 sc->phy.release(sc);
10795
10796 return rv;
10797 }
10798
10799 static int
10800 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg, uint16_t *val)
10801 {
10802
10803 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
10804 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
10805 KUMCTRLSTA_REN);
10806 CSR_WRITE_FLUSH(sc);
10807 delay(2);
10808
10809 *val = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
10810
10811 return 0;
10812 }
10813
10814 /*
10815 * wm_kmrn_writereg:
10816 *
10817 * Write a kumeran register
10818 */
10819 static int
10820 wm_kmrn_writereg(struct wm_softc *sc, int reg, uint16_t val)
10821 {
10822 int rv;
10823
10824 if (sc->sc_type == WM_T_80003)
10825 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10826 else
10827 rv = sc->phy.acquire(sc);
10828 if (rv != 0) {
10829 device_printf(sc->sc_dev, "%s: failed to get semaphore\n",
10830 __func__);
10831 return rv;
10832 }
10833
10834 rv = wm_kmrn_writereg_locked(sc, reg, val);
10835
10836 if (sc->sc_type == WM_T_80003)
10837 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
10838 else
10839 sc->phy.release(sc);
10840
10841 return rv;
10842 }
10843
10844 static int
10845 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, uint16_t val)
10846 {
10847
10848 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
10849 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | val);
10850
10851 return 0;
10852 }
10853
10854 /* SGMII related */
10855
10856 /*
10857 * wm_sgmii_uses_mdio
10858 *
10859 * Check whether the transaction is to the internal PHY or the external
10860 * MDIO interface. Return true if it's MDIO.
10861 */
10862 static bool
10863 wm_sgmii_uses_mdio(struct wm_softc *sc)
10864 {
10865 uint32_t reg;
10866 bool ismdio = false;
10867
10868 switch (sc->sc_type) {
10869 case WM_T_82575:
10870 case WM_T_82576:
10871 reg = CSR_READ(sc, WMREG_MDIC);
10872 ismdio = ((reg & MDIC_DEST) != 0);
10873 break;
10874 case WM_T_82580:
10875 case WM_T_I350:
10876 case WM_T_I354:
10877 case WM_T_I210:
10878 case WM_T_I211:
10879 reg = CSR_READ(sc, WMREG_MDICNFG);
10880 ismdio = ((reg & MDICNFG_DEST) != 0);
10881 break;
10882 default:
10883 break;
10884 }
10885
10886 return ismdio;
10887 }
10888
10889 /*
10890 * wm_sgmii_readreg: [mii interface function]
10891 *
10892 * Read a PHY register on the SGMII
10893 * This could be handled by the PHY layer if we didn't have to lock the
10894 * ressource ...
10895 */
10896 static int
10897 wm_sgmii_readreg(device_t dev, int phy, int reg)
10898 {
10899 struct wm_softc *sc = device_private(dev);
10900 uint32_t i2ccmd;
10901 int i, rv;
10902
10903 if (sc->phy.acquire(sc)) {
10904 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10905 return 0;
10906 }
10907
10908 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
10909 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
10910 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
10911
10912 /* Poll the ready bit */
10913 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
10914 delay(50);
10915 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
10916 if (i2ccmd & I2CCMD_READY)
10917 break;
10918 }
10919 if ((i2ccmd & I2CCMD_READY) == 0)
10920 device_printf(dev, "I2CCMD Read did not complete\n");
10921 if ((i2ccmd & I2CCMD_ERROR) != 0)
10922 device_printf(dev, "I2CCMD Error bit set\n");
10923
10924 rv = ((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00);
10925
10926 sc->phy.release(sc);
10927 return rv;
10928 }
10929
10930 /*
10931 * wm_sgmii_writereg: [mii interface function]
10932 *
10933 * Write a PHY register on the SGMII.
10934 * This could be handled by the PHY layer if we didn't have to lock the
10935 * ressource ...
10936 */
10937 static void
10938 wm_sgmii_writereg(device_t dev, int phy, int reg, int val)
10939 {
10940 struct wm_softc *sc = device_private(dev);
10941 uint32_t i2ccmd;
10942 int i;
10943 int swapdata;
10944
10945 if (sc->phy.acquire(sc) != 0) {
10946 device_printf(dev, "%s: failed to get semaphore\n", __func__);
10947 return;
10948 }
10949 /* Swap the data bytes for the I2C interface */
10950 swapdata = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00);
10951 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
10952 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_WRITE | swapdata;
10953 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
10954
10955 /* Poll the ready bit */
10956 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
10957 delay(50);
10958 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
10959 if (i2ccmd & I2CCMD_READY)
10960 break;
10961 }
10962 if ((i2ccmd & I2CCMD_READY) == 0)
10963 device_printf(dev, "I2CCMD Write did not complete\n");
10964 if ((i2ccmd & I2CCMD_ERROR) != 0)
10965 device_printf(dev, "I2CCMD Error bit set\n");
10966
10967 sc->phy.release(sc);
10968 }
10969
10970 /* TBI related */
10971
10972 /*
10973 * wm_tbi_mediainit:
10974 *
10975 * Initialize media for use on 1000BASE-X devices.
10976 */
10977 static void
10978 wm_tbi_mediainit(struct wm_softc *sc)
10979 {
10980 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
10981 const char *sep = "";
10982
10983 if (sc->sc_type < WM_T_82543)
10984 sc->sc_tipg = TIPG_WM_DFLT;
10985 else
10986 sc->sc_tipg = TIPG_LG_DFLT;
10987
10988 sc->sc_tbi_serdes_anegticks = 5;
10989
10990 /* Initialize our media structures */
10991 sc->sc_mii.mii_ifp = ifp;
10992 sc->sc_ethercom.ec_mii = &sc->sc_mii;
10993
10994 if ((sc->sc_type >= WM_T_82575)
10995 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
10996 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
10997 wm_serdes_mediachange, wm_serdes_mediastatus);
10998 else
10999 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
11000 wm_tbi_mediachange, wm_tbi_mediastatus);
11001
11002 /*
11003 * SWD Pins:
11004 *
11005 * 0 = Link LED (output)
11006 * 1 = Loss Of Signal (input)
11007 */
11008 sc->sc_ctrl |= CTRL_SWDPIO(0);
11009
11010 /* XXX Perhaps this is only for TBI */
11011 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES)
11012 sc->sc_ctrl &= ~CTRL_SWDPIO(1);
11013
11014 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
11015 sc->sc_ctrl &= ~CTRL_LRST;
11016
11017 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11018
11019 #define ADD(ss, mm, dd) \
11020 do { \
11021 aprint_normal("%s%s", sep, ss); \
11022 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \
11023 sep = ", "; \
11024 } while (/*CONSTCOND*/0)
11025
11026 aprint_normal_dev(sc->sc_dev, "");
11027
11028 if (sc->sc_type == WM_T_I354) {
11029 uint32_t status;
11030
11031 status = CSR_READ(sc, WMREG_STATUS);
11032 if (((status & STATUS_2P5_SKU) != 0)
11033 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
11034 ADD("2500baseKX-FDX", IFM_2500_KX | IFM_FDX,ANAR_X_FD);
11035 } else
11036 ADD("1000baseKX-FDX", IFM_1000_KX | IFM_FDX,ANAR_X_FD);
11037 } else if (sc->sc_type == WM_T_82545) {
11038 /* Only 82545 is LX (XXX except SFP) */
11039 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
11040 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
11041 } else {
11042 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
11043 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
11044 }
11045 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD);
11046 aprint_normal("\n");
11047
11048 #undef ADD
11049
11050 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
11051 }
11052
11053 /*
11054 * wm_tbi_mediachange: [ifmedia interface function]
11055 *
11056 * Set hardware to newly-selected media on a 1000BASE-X device.
11057 */
11058 static int
11059 wm_tbi_mediachange(struct ifnet *ifp)
11060 {
11061 struct wm_softc *sc = ifp->if_softc;
11062 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
11063 uint32_t status;
11064 int i;
11065
11066 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
11067 /* XXX need some work for >= 82571 and < 82575 */
11068 if (sc->sc_type < WM_T_82575)
11069 return 0;
11070 }
11071
11072 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
11073 || (sc->sc_type >= WM_T_82575))
11074 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
11075
11076 sc->sc_ctrl &= ~CTRL_LRST;
11077 sc->sc_txcw = TXCW_ANE;
11078 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
11079 sc->sc_txcw |= TXCW_FD | TXCW_HD;
11080 else if (ife->ifm_media & IFM_FDX)
11081 sc->sc_txcw |= TXCW_FD;
11082 else
11083 sc->sc_txcw |= TXCW_HD;
11084
11085 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0)
11086 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE;
11087
11088 DPRINTF(WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n",
11089 device_xname(sc->sc_dev), sc->sc_txcw));
11090 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
11091 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11092 CSR_WRITE_FLUSH(sc);
11093 delay(1000);
11094
11095 i = CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1);
11096 DPRINTF(WM_DEBUG_LINK,("%s: i = 0x%x\n", device_xname(sc->sc_dev),i));
11097
11098 /*
11099 * On 82544 chips and later, the CTRL_SWDPIN(1) bit will be set if the
11100 * optics detect a signal, 0 if they don't.
11101 */
11102 if (((i != 0) && (sc->sc_type > WM_T_82544)) || (i == 0)) {
11103 /* Have signal; wait for the link to come up. */
11104 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
11105 delay(10000);
11106 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
11107 break;
11108 }
11109
11110 DPRINTF(WM_DEBUG_LINK,("%s: i = %d after waiting for link\n",
11111 device_xname(sc->sc_dev),i));
11112
11113 status = CSR_READ(sc, WMREG_STATUS);
11114 DPRINTF(WM_DEBUG_LINK,
11115 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n",
11116 device_xname(sc->sc_dev),status, STATUS_LU));
11117 if (status & STATUS_LU) {
11118 /* Link is up. */
11119 DPRINTF(WM_DEBUG_LINK,
11120 ("%s: LINK: set media -> link up %s\n",
11121 device_xname(sc->sc_dev),
11122 (status & STATUS_FD) ? "FDX" : "HDX"));
11123
11124 /*
11125 * NOTE: CTRL will update TFCE and RFCE automatically,
11126 * so we should update sc->sc_ctrl
11127 */
11128 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
11129 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
11130 sc->sc_fcrtl &= ~FCRTL_XONE;
11131 if (status & STATUS_FD)
11132 sc->sc_tctl |=
11133 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
11134 else
11135 sc->sc_tctl |=
11136 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
11137 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE)
11138 sc->sc_fcrtl |= FCRTL_XONE;
11139 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
11140 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
11141 WMREG_OLD_FCRTL : WMREG_FCRTL,
11142 sc->sc_fcrtl);
11143 sc->sc_tbi_linkup = 1;
11144 } else {
11145 if (i == WM_LINKUP_TIMEOUT)
11146 wm_check_for_link(sc);
11147 /* Link is down. */
11148 DPRINTF(WM_DEBUG_LINK,
11149 ("%s: LINK: set media -> link down\n",
11150 device_xname(sc->sc_dev)));
11151 sc->sc_tbi_linkup = 0;
11152 }
11153 } else {
11154 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
11155 device_xname(sc->sc_dev)));
11156 sc->sc_tbi_linkup = 0;
11157 }
11158
11159 wm_tbi_serdes_set_linkled(sc);
11160
11161 return 0;
11162 }
11163
11164 /*
11165 * wm_tbi_mediastatus: [ifmedia interface function]
11166 *
11167 * Get the current interface media status on a 1000BASE-X device.
11168 */
11169 static void
11170 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
11171 {
11172 struct wm_softc *sc = ifp->if_softc;
11173 uint32_t ctrl, status;
11174
11175 ifmr->ifm_status = IFM_AVALID;
11176 ifmr->ifm_active = IFM_ETHER;
11177
11178 status = CSR_READ(sc, WMREG_STATUS);
11179 if ((status & STATUS_LU) == 0) {
11180 ifmr->ifm_active |= IFM_NONE;
11181 return;
11182 }
11183
11184 ifmr->ifm_status |= IFM_ACTIVE;
11185 /* Only 82545 is LX */
11186 if (sc->sc_type == WM_T_82545)
11187 ifmr->ifm_active |= IFM_1000_LX;
11188 else
11189 ifmr->ifm_active |= IFM_1000_SX;
11190 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
11191 ifmr->ifm_active |= IFM_FDX;
11192 else
11193 ifmr->ifm_active |= IFM_HDX;
11194 ctrl = CSR_READ(sc, WMREG_CTRL);
11195 if (ctrl & CTRL_RFCE)
11196 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
11197 if (ctrl & CTRL_TFCE)
11198 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
11199 }
11200
11201 /* XXX TBI only */
11202 static int
11203 wm_check_for_link(struct wm_softc *sc)
11204 {
11205 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
11206 uint32_t rxcw;
11207 uint32_t ctrl;
11208 uint32_t status;
11209 uint32_t sig;
11210
11211 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
11212 /* XXX need some work for >= 82571 */
11213 if (sc->sc_type >= WM_T_82571) {
11214 sc->sc_tbi_linkup = 1;
11215 return 0;
11216 }
11217 }
11218
11219 rxcw = CSR_READ(sc, WMREG_RXCW);
11220 ctrl = CSR_READ(sc, WMREG_CTRL);
11221 status = CSR_READ(sc, WMREG_STATUS);
11222
11223 sig = (sc->sc_type > WM_T_82544) ? CTRL_SWDPIN(1) : 0;
11224
11225 DPRINTF(WM_DEBUG_LINK,
11226 ("%s: %s: sig = %d, status_lu = %d, rxcw_c = %d\n",
11227 device_xname(sc->sc_dev), __func__,
11228 ((ctrl & CTRL_SWDPIN(1)) == sig),
11229 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0)));
11230
11231 /*
11232 * SWDPIN LU RXCW
11233 * 0 0 0
11234 * 0 0 1 (should not happen)
11235 * 0 1 0 (should not happen)
11236 * 0 1 1 (should not happen)
11237 * 1 0 0 Disable autonego and force linkup
11238 * 1 0 1 got /C/ but not linkup yet
11239 * 1 1 0 (linkup)
11240 * 1 1 1 If IFM_AUTO, back to autonego
11241 *
11242 */
11243 if (((ctrl & CTRL_SWDPIN(1)) == sig)
11244 && ((status & STATUS_LU) == 0)
11245 && ((rxcw & RXCW_C) == 0)) {
11246 DPRINTF(WM_DEBUG_LINK, ("%s: force linkup and fullduplex\n",
11247 __func__));
11248 sc->sc_tbi_linkup = 0;
11249 /* Disable auto-negotiation in the TXCW register */
11250 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
11251
11252 /*
11253 * Force link-up and also force full-duplex.
11254 *
11255 * NOTE: CTRL was updated TFCE and RFCE automatically,
11256 * so we should update sc->sc_ctrl
11257 */
11258 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD;
11259 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11260 } else if (((status & STATUS_LU) != 0)
11261 && ((rxcw & RXCW_C) != 0)
11262 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
11263 sc->sc_tbi_linkup = 1;
11264 DPRINTF(WM_DEBUG_LINK, ("%s: go back to autonego\n",
11265 __func__));
11266 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
11267 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
11268 } else if (((ctrl & CTRL_SWDPIN(1)) == sig)
11269 && ((rxcw & RXCW_C) != 0)) {
11270 DPRINTF(WM_DEBUG_LINK, ("/C/"));
11271 } else {
11272 DPRINTF(WM_DEBUG_LINK, ("%s: %x,%x,%x\n", __func__, rxcw, ctrl,
11273 status));
11274 }
11275
11276 return 0;
11277 }
11278
11279 /*
11280 * wm_tbi_tick:
11281 *
11282 * Check the link on TBI devices.
11283 * This function acts as mii_tick().
11284 */
11285 static void
11286 wm_tbi_tick(struct wm_softc *sc)
11287 {
11288 struct mii_data *mii = &sc->sc_mii;
11289 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
11290 uint32_t status;
11291
11292 KASSERT(WM_CORE_LOCKED(sc));
11293
11294 status = CSR_READ(sc, WMREG_STATUS);
11295
11296 /* XXX is this needed? */
11297 (void)CSR_READ(sc, WMREG_RXCW);
11298 (void)CSR_READ(sc, WMREG_CTRL);
11299
11300 /* set link status */
11301 if ((status & STATUS_LU) == 0) {
11302 DPRINTF(WM_DEBUG_LINK,
11303 ("%s: LINK: checklink -> down\n",
11304 device_xname(sc->sc_dev)));
11305 sc->sc_tbi_linkup = 0;
11306 } else if (sc->sc_tbi_linkup == 0) {
11307 DPRINTF(WM_DEBUG_LINK,
11308 ("%s: LINK: checklink -> up %s\n",
11309 device_xname(sc->sc_dev),
11310 (status & STATUS_FD) ? "FDX" : "HDX"));
11311 sc->sc_tbi_linkup = 1;
11312 sc->sc_tbi_serdes_ticks = 0;
11313 }
11314
11315 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0)
11316 goto setled;
11317
11318 if ((status & STATUS_LU) == 0) {
11319 sc->sc_tbi_linkup = 0;
11320 /* If the timer expired, retry autonegotiation */
11321 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
11322 && (++sc->sc_tbi_serdes_ticks
11323 >= sc->sc_tbi_serdes_anegticks)) {
11324 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
11325 sc->sc_tbi_serdes_ticks = 0;
11326 /*
11327 * Reset the link, and let autonegotiation do
11328 * its thing
11329 */
11330 sc->sc_ctrl |= CTRL_LRST;
11331 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11332 CSR_WRITE_FLUSH(sc);
11333 delay(1000);
11334 sc->sc_ctrl &= ~CTRL_LRST;
11335 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11336 CSR_WRITE_FLUSH(sc);
11337 delay(1000);
11338 CSR_WRITE(sc, WMREG_TXCW,
11339 sc->sc_txcw & ~TXCW_ANE);
11340 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
11341 }
11342 }
11343
11344 setled:
11345 wm_tbi_serdes_set_linkled(sc);
11346 }
11347
11348 /* SERDES related */
11349 static void
11350 wm_serdes_power_up_link_82575(struct wm_softc *sc)
11351 {
11352 uint32_t reg;
11353
11354 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
11355 && ((sc->sc_flags & WM_F_SGMII) == 0))
11356 return;
11357
11358 reg = CSR_READ(sc, WMREG_PCS_CFG);
11359 reg |= PCS_CFG_PCS_EN;
11360 CSR_WRITE(sc, WMREG_PCS_CFG, reg);
11361
11362 reg = CSR_READ(sc, WMREG_CTRL_EXT);
11363 reg &= ~CTRL_EXT_SWDPIN(3);
11364 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
11365 CSR_WRITE_FLUSH(sc);
11366 }
11367
11368 static int
11369 wm_serdes_mediachange(struct ifnet *ifp)
11370 {
11371 struct wm_softc *sc = ifp->if_softc;
11372 bool pcs_autoneg = true; /* XXX */
11373 uint32_t ctrl_ext, pcs_lctl, reg;
11374
11375 /* XXX Currently, this function is not called on 8257[12] */
11376 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
11377 || (sc->sc_type >= WM_T_82575))
11378 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
11379
11380 wm_serdes_power_up_link_82575(sc);
11381
11382 sc->sc_ctrl |= CTRL_SLU;
11383
11384 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576))
11385 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1);
11386
11387 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
11388 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL);
11389 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) {
11390 case CTRL_EXT_LINK_MODE_SGMII:
11391 pcs_autoneg = true;
11392 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT;
11393 break;
11394 case CTRL_EXT_LINK_MODE_1000KX:
11395 pcs_autoneg = false;
11396 /* FALLTHROUGH */
11397 default:
11398 if ((sc->sc_type == WM_T_82575)
11399 || (sc->sc_type == WM_T_82576)) {
11400 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0)
11401 pcs_autoneg = false;
11402 }
11403 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD
11404 | CTRL_FRCFDX;
11405 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL;
11406 }
11407 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
11408
11409 if (pcs_autoneg) {
11410 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART;
11411 pcs_lctl &= ~PCS_LCTL_FORCE_FC;
11412
11413 reg = CSR_READ(sc, WMREG_PCS_ANADV);
11414 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE);
11415 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE;
11416 CSR_WRITE(sc, WMREG_PCS_ANADV, reg);
11417 } else
11418 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC;
11419
11420 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl);
11421
11422
11423 return 0;
11424 }
11425
11426 static void
11427 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
11428 {
11429 struct wm_softc *sc = ifp->if_softc;
11430 struct mii_data *mii = &sc->sc_mii;
11431 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
11432 uint32_t pcs_adv, pcs_lpab, reg;
11433
11434 ifmr->ifm_status = IFM_AVALID;
11435 ifmr->ifm_active = IFM_ETHER;
11436
11437 /* Check PCS */
11438 reg = CSR_READ(sc, WMREG_PCS_LSTS);
11439 if ((reg & PCS_LSTS_LINKOK) == 0) {
11440 ifmr->ifm_active |= IFM_NONE;
11441 sc->sc_tbi_linkup = 0;
11442 goto setled;
11443 }
11444
11445 sc->sc_tbi_linkup = 1;
11446 ifmr->ifm_status |= IFM_ACTIVE;
11447 if (sc->sc_type == WM_T_I354) {
11448 uint32_t status;
11449
11450 status = CSR_READ(sc, WMREG_STATUS);
11451 if (((status & STATUS_2P5_SKU) != 0)
11452 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
11453 ifmr->ifm_active |= IFM_2500_SX; /* XXX KX */
11454 } else
11455 ifmr->ifm_active |= IFM_1000_SX; /* XXX KX */
11456 } else {
11457 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) {
11458 case PCS_LSTS_SPEED_10:
11459 ifmr->ifm_active |= IFM_10_T; /* XXX */
11460 break;
11461 case PCS_LSTS_SPEED_100:
11462 ifmr->ifm_active |= IFM_100_FX; /* XXX */
11463 break;
11464 case PCS_LSTS_SPEED_1000:
11465 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
11466 break;
11467 default:
11468 device_printf(sc->sc_dev, "Unknown speed\n");
11469 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
11470 break;
11471 }
11472 }
11473 if ((reg & PCS_LSTS_FDX) != 0)
11474 ifmr->ifm_active |= IFM_FDX;
11475 else
11476 ifmr->ifm_active |= IFM_HDX;
11477 mii->mii_media_active &= ~IFM_ETH_FMASK;
11478 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
11479 /* Check flow */
11480 reg = CSR_READ(sc, WMREG_PCS_LSTS);
11481 if ((reg & PCS_LSTS_AN_COMP) == 0) {
11482 DPRINTF(WM_DEBUG_LINK, ("XXX LINKOK but not ACOMP\n"));
11483 goto setled;
11484 }
11485 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
11486 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
11487 DPRINTF(WM_DEBUG_LINK,
11488 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab));
11489 if ((pcs_adv & TXCW_SYM_PAUSE)
11490 && (pcs_lpab & TXCW_SYM_PAUSE)) {
11491 mii->mii_media_active |= IFM_FLOW
11492 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
11493 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
11494 && (pcs_adv & TXCW_ASYM_PAUSE)
11495 && (pcs_lpab & TXCW_SYM_PAUSE)
11496 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
11497 mii->mii_media_active |= IFM_FLOW
11498 | IFM_ETH_TXPAUSE;
11499 } else if ((pcs_adv & TXCW_SYM_PAUSE)
11500 && (pcs_adv & TXCW_ASYM_PAUSE)
11501 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
11502 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
11503 mii->mii_media_active |= IFM_FLOW
11504 | IFM_ETH_RXPAUSE;
11505 }
11506 }
11507 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
11508 | (mii->mii_media_active & IFM_ETH_FMASK);
11509 setled:
11510 wm_tbi_serdes_set_linkled(sc);
11511 }
11512
11513 /*
11514 * wm_serdes_tick:
11515 *
11516 * Check the link on serdes devices.
11517 */
11518 static void
11519 wm_serdes_tick(struct wm_softc *sc)
11520 {
11521 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
11522 struct mii_data *mii = &sc->sc_mii;
11523 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
11524 uint32_t reg;
11525
11526 KASSERT(WM_CORE_LOCKED(sc));
11527
11528 mii->mii_media_status = IFM_AVALID;
11529 mii->mii_media_active = IFM_ETHER;
11530
11531 /* Check PCS */
11532 reg = CSR_READ(sc, WMREG_PCS_LSTS);
11533 if ((reg & PCS_LSTS_LINKOK) != 0) {
11534 mii->mii_media_status |= IFM_ACTIVE;
11535 sc->sc_tbi_linkup = 1;
11536 sc->sc_tbi_serdes_ticks = 0;
11537 mii->mii_media_active |= IFM_1000_SX; /* XXX */
11538 if ((reg & PCS_LSTS_FDX) != 0)
11539 mii->mii_media_active |= IFM_FDX;
11540 else
11541 mii->mii_media_active |= IFM_HDX;
11542 } else {
11543 mii->mii_media_status |= IFM_NONE;
11544 sc->sc_tbi_linkup = 0;
11545 /* If the timer expired, retry autonegotiation */
11546 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
11547 && (++sc->sc_tbi_serdes_ticks
11548 >= sc->sc_tbi_serdes_anegticks)) {
11549 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
11550 sc->sc_tbi_serdes_ticks = 0;
11551 /* XXX */
11552 wm_serdes_mediachange(ifp);
11553 }
11554 }
11555
11556 wm_tbi_serdes_set_linkled(sc);
11557 }
11558
11559 /* SFP related */
11560
11561 static int
11562 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data)
11563 {
11564 uint32_t i2ccmd;
11565 int i;
11566
11567 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
11568 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
11569
11570 /* Poll the ready bit */
11571 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
11572 delay(50);
11573 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
11574 if (i2ccmd & I2CCMD_READY)
11575 break;
11576 }
11577 if ((i2ccmd & I2CCMD_READY) == 0)
11578 return -1;
11579 if ((i2ccmd & I2CCMD_ERROR) != 0)
11580 return -1;
11581
11582 *data = i2ccmd & 0x00ff;
11583
11584 return 0;
11585 }
11586
11587 static uint32_t
11588 wm_sfp_get_media_type(struct wm_softc *sc)
11589 {
11590 uint32_t ctrl_ext;
11591 uint8_t val = 0;
11592 int timeout = 3;
11593 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN;
11594 int rv = -1;
11595
11596 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
11597 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
11598 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA);
11599 CSR_WRITE_FLUSH(sc);
11600
11601 /* Read SFP module data */
11602 while (timeout) {
11603 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val);
11604 if (rv == 0)
11605 break;
11606 delay(100*1000); /* XXX too big */
11607 timeout--;
11608 }
11609 if (rv != 0)
11610 goto out;
11611 switch (val) {
11612 case SFF_SFP_ID_SFF:
11613 aprint_normal_dev(sc->sc_dev,
11614 "Module/Connector soldered to board\n");
11615 break;
11616 case SFF_SFP_ID_SFP:
11617 aprint_normal_dev(sc->sc_dev, "SFP\n");
11618 break;
11619 case SFF_SFP_ID_UNKNOWN:
11620 goto out;
11621 default:
11622 break;
11623 }
11624
11625 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val);
11626 if (rv != 0) {
11627 goto out;
11628 }
11629
11630 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0)
11631 mediatype = WM_MEDIATYPE_SERDES;
11632 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0){
11633 sc->sc_flags |= WM_F_SGMII;
11634 mediatype = WM_MEDIATYPE_COPPER;
11635 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0){
11636 sc->sc_flags |= WM_F_SGMII;
11637 mediatype = WM_MEDIATYPE_SERDES;
11638 }
11639
11640 out:
11641 /* Restore I2C interface setting */
11642 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
11643
11644 return mediatype;
11645 }
11646
11647 /*
11648 * NVM related.
11649 * Microwire, SPI (w/wo EERD) and Flash.
11650 */
11651
11652 /* Both spi and uwire */
11653
11654 /*
11655 * wm_eeprom_sendbits:
11656 *
11657 * Send a series of bits to the EEPROM.
11658 */
11659 static void
11660 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits)
11661 {
11662 uint32_t reg;
11663 int x;
11664
11665 reg = CSR_READ(sc, WMREG_EECD);
11666
11667 for (x = nbits; x > 0; x--) {
11668 if (bits & (1U << (x - 1)))
11669 reg |= EECD_DI;
11670 else
11671 reg &= ~EECD_DI;
11672 CSR_WRITE(sc, WMREG_EECD, reg);
11673 CSR_WRITE_FLUSH(sc);
11674 delay(2);
11675 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
11676 CSR_WRITE_FLUSH(sc);
11677 delay(2);
11678 CSR_WRITE(sc, WMREG_EECD, reg);
11679 CSR_WRITE_FLUSH(sc);
11680 delay(2);
11681 }
11682 }
11683
11684 /*
11685 * wm_eeprom_recvbits:
11686 *
11687 * Receive a series of bits from the EEPROM.
11688 */
11689 static void
11690 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits)
11691 {
11692 uint32_t reg, val;
11693 int x;
11694
11695 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI;
11696
11697 val = 0;
11698 for (x = nbits; x > 0; x--) {
11699 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
11700 CSR_WRITE_FLUSH(sc);
11701 delay(2);
11702 if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
11703 val |= (1U << (x - 1));
11704 CSR_WRITE(sc, WMREG_EECD, reg);
11705 CSR_WRITE_FLUSH(sc);
11706 delay(2);
11707 }
11708 *valp = val;
11709 }
11710
11711 /* Microwire */
11712
11713 /*
11714 * wm_nvm_read_uwire:
11715 *
11716 * Read a word from the EEPROM using the MicroWire protocol.
11717 */
11718 static int
11719 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
11720 {
11721 uint32_t reg, val;
11722 int i;
11723
11724 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11725 device_xname(sc->sc_dev), __func__));
11726
11727 if (sc->nvm.acquire(sc) != 0)
11728 return -1;
11729
11730 for (i = 0; i < wordcnt; i++) {
11731 /* Clear SK and DI. */
11732 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI);
11733 CSR_WRITE(sc, WMREG_EECD, reg);
11734
11735 /*
11736 * XXX: workaround for a bug in qemu-0.12.x and prior
11737 * and Xen.
11738 *
11739 * We use this workaround only for 82540 because qemu's
11740 * e1000 act as 82540.
11741 */
11742 if (sc->sc_type == WM_T_82540) {
11743 reg |= EECD_SK;
11744 CSR_WRITE(sc, WMREG_EECD, reg);
11745 reg &= ~EECD_SK;
11746 CSR_WRITE(sc, WMREG_EECD, reg);
11747 CSR_WRITE_FLUSH(sc);
11748 delay(2);
11749 }
11750 /* XXX: end of workaround */
11751
11752 /* Set CHIP SELECT. */
11753 reg |= EECD_CS;
11754 CSR_WRITE(sc, WMREG_EECD, reg);
11755 CSR_WRITE_FLUSH(sc);
11756 delay(2);
11757
11758 /* Shift in the READ command. */
11759 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3);
11760
11761 /* Shift in address. */
11762 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits);
11763
11764 /* Shift out the data. */
11765 wm_eeprom_recvbits(sc, &val, 16);
11766 data[i] = val & 0xffff;
11767
11768 /* Clear CHIP SELECT. */
11769 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS;
11770 CSR_WRITE(sc, WMREG_EECD, reg);
11771 CSR_WRITE_FLUSH(sc);
11772 delay(2);
11773 }
11774
11775 sc->nvm.release(sc);
11776 return 0;
11777 }
11778
11779 /* SPI */
11780
11781 /*
11782 * Set SPI and FLASH related information from the EECD register.
11783 * For 82541 and 82547, the word size is taken from EEPROM.
11784 */
11785 static int
11786 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc)
11787 {
11788 int size;
11789 uint32_t reg;
11790 uint16_t data;
11791
11792 reg = CSR_READ(sc, WMREG_EECD);
11793 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8;
11794
11795 /* Read the size of NVM from EECD by default */
11796 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
11797 switch (sc->sc_type) {
11798 case WM_T_82541:
11799 case WM_T_82541_2:
11800 case WM_T_82547:
11801 case WM_T_82547_2:
11802 /* Set dummy value to access EEPROM */
11803 sc->sc_nvm_wordsize = 64;
11804 if (wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data) != 0) {
11805 aprint_error_dev(sc->sc_dev,
11806 "%s: failed to read EEPROM size\n", __func__);
11807 }
11808 reg = data;
11809 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
11810 if (size == 0)
11811 size = 6; /* 64 word size */
11812 else
11813 size += NVM_WORD_SIZE_BASE_SHIFT + 1;
11814 break;
11815 case WM_T_80003:
11816 case WM_T_82571:
11817 case WM_T_82572:
11818 case WM_T_82573: /* SPI case */
11819 case WM_T_82574: /* SPI case */
11820 case WM_T_82583: /* SPI case */
11821 size += NVM_WORD_SIZE_BASE_SHIFT;
11822 if (size > 14)
11823 size = 14;
11824 break;
11825 case WM_T_82575:
11826 case WM_T_82576:
11827 case WM_T_82580:
11828 case WM_T_I350:
11829 case WM_T_I354:
11830 case WM_T_I210:
11831 case WM_T_I211:
11832 size += NVM_WORD_SIZE_BASE_SHIFT;
11833 if (size > 15)
11834 size = 15;
11835 break;
11836 default:
11837 aprint_error_dev(sc->sc_dev,
11838 "%s: unknown device(%d)?\n", __func__, sc->sc_type);
11839 return -1;
11840 break;
11841 }
11842
11843 sc->sc_nvm_wordsize = 1 << size;
11844
11845 return 0;
11846 }
11847
11848 /*
11849 * wm_nvm_ready_spi:
11850 *
11851 * Wait for a SPI EEPROM to be ready for commands.
11852 */
11853 static int
11854 wm_nvm_ready_spi(struct wm_softc *sc)
11855 {
11856 uint32_t val;
11857 int usec;
11858
11859 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11860 device_xname(sc->sc_dev), __func__));
11861
11862 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) {
11863 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8);
11864 wm_eeprom_recvbits(sc, &val, 8);
11865 if ((val & SPI_SR_RDY) == 0)
11866 break;
11867 }
11868 if (usec >= SPI_MAX_RETRIES) {
11869 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n");
11870 return -1;
11871 }
11872 return 0;
11873 }
11874
11875 /*
11876 * wm_nvm_read_spi:
11877 *
11878 * Read a work from the EEPROM using the SPI protocol.
11879 */
11880 static int
11881 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
11882 {
11883 uint32_t reg, val;
11884 int i;
11885 uint8_t opc;
11886 int rv = 0;
11887
11888 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11889 device_xname(sc->sc_dev), __func__));
11890
11891 if (sc->nvm.acquire(sc) != 0)
11892 return -1;
11893
11894 /* Clear SK and CS. */
11895 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS);
11896 CSR_WRITE(sc, WMREG_EECD, reg);
11897 CSR_WRITE_FLUSH(sc);
11898 delay(2);
11899
11900 if ((rv = wm_nvm_ready_spi(sc)) != 0)
11901 goto out;
11902
11903 /* Toggle CS to flush commands. */
11904 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS);
11905 CSR_WRITE_FLUSH(sc);
11906 delay(2);
11907 CSR_WRITE(sc, WMREG_EECD, reg);
11908 CSR_WRITE_FLUSH(sc);
11909 delay(2);
11910
11911 opc = SPI_OPC_READ;
11912 if (sc->sc_nvm_addrbits == 8 && word >= 128)
11913 opc |= SPI_OPC_A8;
11914
11915 wm_eeprom_sendbits(sc, opc, 8);
11916 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits);
11917
11918 for (i = 0; i < wordcnt; i++) {
11919 wm_eeprom_recvbits(sc, &val, 16);
11920 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8);
11921 }
11922
11923 /* Raise CS and clear SK. */
11924 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS;
11925 CSR_WRITE(sc, WMREG_EECD, reg);
11926 CSR_WRITE_FLUSH(sc);
11927 delay(2);
11928
11929 out:
11930 sc->nvm.release(sc);
11931 return rv;
11932 }
11933
11934 /* Using with EERD */
11935
11936 static int
11937 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw)
11938 {
11939 uint32_t attempts = 100000;
11940 uint32_t i, reg = 0;
11941 int32_t done = -1;
11942
11943 for (i = 0; i < attempts; i++) {
11944 reg = CSR_READ(sc, rw);
11945
11946 if (reg & EERD_DONE) {
11947 done = 0;
11948 break;
11949 }
11950 delay(5);
11951 }
11952
11953 return done;
11954 }
11955
11956 static int
11957 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt, uint16_t *data)
11958 {
11959 int i, eerd = 0;
11960 int rv = 0;
11961
11962 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11963 device_xname(sc->sc_dev), __func__));
11964
11965 if (sc->nvm.acquire(sc) != 0)
11966 return -1;
11967
11968 for (i = 0; i < wordcnt; i++) {
11969 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START;
11970 CSR_WRITE(sc, WMREG_EERD, eerd);
11971 rv = wm_poll_eerd_eewr_done(sc, WMREG_EERD);
11972 if (rv != 0) {
11973 aprint_error_dev(sc->sc_dev, "EERD polling failed: "
11974 "offset=%d. wordcnt=%d\n", offset, wordcnt);
11975 break;
11976 }
11977 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT);
11978 }
11979
11980 sc->nvm.release(sc);
11981 return rv;
11982 }
11983
11984 /* Flash */
11985
11986 static int
11987 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank)
11988 {
11989 uint32_t eecd;
11990 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1;
11991 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t);
11992 uint32_t nvm_dword = 0;
11993 uint8_t sig_byte = 0;
11994 int rv;
11995
11996 switch (sc->sc_type) {
11997 case WM_T_PCH_SPT:
11998 case WM_T_PCH_CNP:
11999 bank1_offset = sc->sc_ich8_flash_bank_size * 2;
12000 act_offset = ICH_NVM_SIG_WORD * 2;
12001
12002 /* set bank to 0 in case flash read fails. */
12003 *bank = 0;
12004
12005 /* Check bank 0 */
12006 rv = wm_read_ich8_dword(sc, act_offset, &nvm_dword);
12007 if (rv != 0)
12008 return rv;
12009 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8);
12010 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
12011 *bank = 0;
12012 return 0;
12013 }
12014
12015 /* Check bank 1 */
12016 rv = wm_read_ich8_dword(sc, act_offset + bank1_offset,
12017 &nvm_dword);
12018 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8);
12019 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
12020 *bank = 1;
12021 return 0;
12022 }
12023 aprint_error_dev(sc->sc_dev,
12024 "%s: no valid NVM bank present (%u)\n", __func__, *bank);
12025 return -1;
12026 case WM_T_ICH8:
12027 case WM_T_ICH9:
12028 eecd = CSR_READ(sc, WMREG_EECD);
12029 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) {
12030 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0;
12031 return 0;
12032 }
12033 /* FALLTHROUGH */
12034 default:
12035 /* Default to 0 */
12036 *bank = 0;
12037
12038 /* Check bank 0 */
12039 wm_read_ich8_byte(sc, act_offset, &sig_byte);
12040 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
12041 *bank = 0;
12042 return 0;
12043 }
12044
12045 /* Check bank 1 */
12046 wm_read_ich8_byte(sc, act_offset + bank1_offset,
12047 &sig_byte);
12048 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
12049 *bank = 1;
12050 return 0;
12051 }
12052 }
12053
12054 DPRINTF(WM_DEBUG_NVM, ("%s: No valid NVM bank present\n",
12055 device_xname(sc->sc_dev)));
12056 return -1;
12057 }
12058
12059 /******************************************************************************
12060 * This function does initial flash setup so that a new read/write/erase cycle
12061 * can be started.
12062 *
12063 * sc - The pointer to the hw structure
12064 ****************************************************************************/
12065 static int32_t
12066 wm_ich8_cycle_init(struct wm_softc *sc)
12067 {
12068 uint16_t hsfsts;
12069 int32_t error = 1;
12070 int32_t i = 0;
12071
12072 if (sc->sc_type >= WM_T_PCH_SPT)
12073 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) & 0xffffUL;
12074 else
12075 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
12076
12077 /* May be check the Flash Des Valid bit in Hw status */
12078 if ((hsfsts & HSFSTS_FLDVAL) == 0) {
12079 return error;
12080 }
12081
12082 /* Clear FCERR in Hw status by writing 1 */
12083 /* Clear DAEL in Hw status by writing a 1 */
12084 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL;
12085
12086 if (sc->sc_type >= WM_T_PCH_SPT)
12087 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, hsfsts & 0xffffUL);
12088 else
12089 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
12090
12091 /*
12092 * Either we should have a hardware SPI cycle in progress bit to check
12093 * against, in order to start a new cycle or FDONE bit should be
12094 * changed in the hardware so that it is 1 after harware reset, which
12095 * can then be used as an indication whether a cycle is in progress or
12096 * has been completed .. we should also have some software semaphore
12097 * mechanism to guard FDONE or the cycle in progress bit so that two
12098 * threads access to those bits can be sequentiallized or a way so that
12099 * 2 threads dont start the cycle at the same time
12100 */
12101
12102 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
12103 /*
12104 * There is no cycle running at present, so we can start a
12105 * cycle
12106 */
12107
12108 /* Begin by setting Flash Cycle Done. */
12109 hsfsts |= HSFSTS_DONE;
12110 if (sc->sc_type >= WM_T_PCH_SPT)
12111 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
12112 hsfsts & 0xffffUL);
12113 else
12114 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
12115 error = 0;
12116 } else {
12117 /*
12118 * otherwise poll for sometime so the current cycle has a
12119 * chance to end before giving up.
12120 */
12121 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
12122 if (sc->sc_type >= WM_T_PCH_SPT)
12123 hsfsts = ICH8_FLASH_READ32(sc,
12124 ICH_FLASH_HSFSTS) & 0xffffUL;
12125 else
12126 hsfsts = ICH8_FLASH_READ16(sc,
12127 ICH_FLASH_HSFSTS);
12128 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
12129 error = 0;
12130 break;
12131 }
12132 delay(1);
12133 }
12134 if (error == 0) {
12135 /*
12136 * Successful in waiting for previous cycle to timeout,
12137 * now set the Flash Cycle Done.
12138 */
12139 hsfsts |= HSFSTS_DONE;
12140 if (sc->sc_type >= WM_T_PCH_SPT)
12141 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
12142 hsfsts & 0xffffUL);
12143 else
12144 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS,
12145 hsfsts);
12146 }
12147 }
12148 return error;
12149 }
12150
12151 /******************************************************************************
12152 * This function starts a flash cycle and waits for its completion
12153 *
12154 * sc - The pointer to the hw structure
12155 ****************************************************************************/
12156 static int32_t
12157 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout)
12158 {
12159 uint16_t hsflctl;
12160 uint16_t hsfsts;
12161 int32_t error = 1;
12162 uint32_t i = 0;
12163
12164 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
12165 if (sc->sc_type >= WM_T_PCH_SPT)
12166 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) >> 16;
12167 else
12168 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
12169 hsflctl |= HSFCTL_GO;
12170 if (sc->sc_type >= WM_T_PCH_SPT)
12171 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
12172 (uint32_t)hsflctl << 16);
12173 else
12174 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
12175
12176 /* Wait till FDONE bit is set to 1 */
12177 do {
12178 if (sc->sc_type >= WM_T_PCH_SPT)
12179 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS)
12180 & 0xffffUL;
12181 else
12182 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
12183 if (hsfsts & HSFSTS_DONE)
12184 break;
12185 delay(1);
12186 i++;
12187 } while (i < timeout);
12188 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0)
12189 error = 0;
12190
12191 return error;
12192 }
12193
12194 /******************************************************************************
12195 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers.
12196 *
12197 * sc - The pointer to the hw structure
12198 * index - The index of the byte or word to read.
12199 * size - Size of data to read, 1=byte 2=word, 4=dword
12200 * data - Pointer to the word to store the value read.
12201 *****************************************************************************/
12202 static int32_t
12203 wm_read_ich8_data(struct wm_softc *sc, uint32_t index,
12204 uint32_t size, uint32_t *data)
12205 {
12206 uint16_t hsfsts;
12207 uint16_t hsflctl;
12208 uint32_t flash_linear_address;
12209 uint32_t flash_data = 0;
12210 int32_t error = 1;
12211 int32_t count = 0;
12212
12213 if (size < 1 || size > 4 || data == 0x0 ||
12214 index > ICH_FLASH_LINEAR_ADDR_MASK)
12215 return error;
12216
12217 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
12218 sc->sc_ich8_flash_base;
12219
12220 do {
12221 delay(1);
12222 /* Steps */
12223 error = wm_ich8_cycle_init(sc);
12224 if (error)
12225 break;
12226
12227 if (sc->sc_type >= WM_T_PCH_SPT)
12228 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS)
12229 >> 16;
12230 else
12231 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
12232 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
12233 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT)
12234 & HSFCTL_BCOUNT_MASK;
12235 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT;
12236 if (sc->sc_type >= WM_T_PCH_SPT) {
12237 /*
12238 * In SPT, This register is in Lan memory space, not
12239 * flash. Therefore, only 32 bit access is supported.
12240 */
12241 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS,
12242 (uint32_t)hsflctl << 16);
12243 } else
12244 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
12245
12246 /*
12247 * Write the last 24 bits of index into Flash Linear address
12248 * field in Flash Address
12249 */
12250 /* TODO: TBD maybe check the index against the size of flash */
12251
12252 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address);
12253
12254 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT);
12255
12256 /*
12257 * Check if FCERR is set to 1, if set to 1, clear it and try
12258 * the whole sequence a few more times, else read in (shift in)
12259 * the Flash Data0, the order is least significant byte first
12260 * msb to lsb
12261 */
12262 if (error == 0) {
12263 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0);
12264 if (size == 1)
12265 *data = (uint8_t)(flash_data & 0x000000FF);
12266 else if (size == 2)
12267 *data = (uint16_t)(flash_data & 0x0000FFFF);
12268 else if (size == 4)
12269 *data = (uint32_t)flash_data;
12270 break;
12271 } else {
12272 /*
12273 * If we've gotten here, then things are probably
12274 * completely hosed, but if the error condition is
12275 * detected, it won't hurt to give it another try...
12276 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
12277 */
12278 if (sc->sc_type >= WM_T_PCH_SPT)
12279 hsfsts = ICH8_FLASH_READ32(sc,
12280 ICH_FLASH_HSFSTS) & 0xffffUL;
12281 else
12282 hsfsts = ICH8_FLASH_READ16(sc,
12283 ICH_FLASH_HSFSTS);
12284
12285 if (hsfsts & HSFSTS_ERR) {
12286 /* Repeat for some time before giving up. */
12287 continue;
12288 } else if ((hsfsts & HSFSTS_DONE) == 0)
12289 break;
12290 }
12291 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
12292
12293 return error;
12294 }
12295
12296 /******************************************************************************
12297 * Reads a single byte from the NVM using the ICH8 flash access registers.
12298 *
12299 * sc - pointer to wm_hw structure
12300 * index - The index of the byte to read.
12301 * data - Pointer to a byte to store the value read.
12302 *****************************************************************************/
12303 static int32_t
12304 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data)
12305 {
12306 int32_t status;
12307 uint32_t word = 0;
12308
12309 status = wm_read_ich8_data(sc, index, 1, &word);
12310 if (status == 0)
12311 *data = (uint8_t)word;
12312 else
12313 *data = 0;
12314
12315 return status;
12316 }
12317
12318 /******************************************************************************
12319 * Reads a word from the NVM using the ICH8 flash access registers.
12320 *
12321 * sc - pointer to wm_hw structure
12322 * index - The starting byte index of the word to read.
12323 * data - Pointer to a word to store the value read.
12324 *****************************************************************************/
12325 static int32_t
12326 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data)
12327 {
12328 int32_t status;
12329 uint32_t word = 0;
12330
12331 status = wm_read_ich8_data(sc, index, 2, &word);
12332 if (status == 0)
12333 *data = (uint16_t)word;
12334 else
12335 *data = 0;
12336
12337 return status;
12338 }
12339
12340 /******************************************************************************
12341 * Reads a dword from the NVM using the ICH8 flash access registers.
12342 *
12343 * sc - pointer to wm_hw structure
12344 * index - The starting byte index of the word to read.
12345 * data - Pointer to a word to store the value read.
12346 *****************************************************************************/
12347 static int32_t
12348 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data)
12349 {
12350 int32_t status;
12351
12352 status = wm_read_ich8_data(sc, index, 4, data);
12353 return status;
12354 }
12355
12356 /******************************************************************************
12357 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
12358 * register.
12359 *
12360 * sc - Struct containing variables accessed by shared code
12361 * offset - offset of word in the EEPROM to read
12362 * data - word read from the EEPROM
12363 * words - number of words to read
12364 *****************************************************************************/
12365 static int
12366 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data)
12367 {
12368 int32_t rv = 0;
12369 uint32_t flash_bank = 0;
12370 uint32_t act_offset = 0;
12371 uint32_t bank_offset = 0;
12372 uint16_t word = 0;
12373 uint16_t i = 0;
12374
12375 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12376 device_xname(sc->sc_dev), __func__));
12377
12378 if (sc->nvm.acquire(sc) != 0)
12379 return -1;
12380
12381 /*
12382 * We need to know which is the valid flash bank. In the event
12383 * that we didn't allocate eeprom_shadow_ram, we may not be
12384 * managing flash_bank. So it cannot be trusted and needs
12385 * to be updated with each read.
12386 */
12387 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
12388 if (rv) {
12389 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
12390 device_xname(sc->sc_dev)));
12391 flash_bank = 0;
12392 }
12393
12394 /*
12395 * Adjust offset appropriately if we're on bank 1 - adjust for word
12396 * size
12397 */
12398 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
12399
12400 for (i = 0; i < words; i++) {
12401 /* The NVM part needs a byte offset, hence * 2 */
12402 act_offset = bank_offset + ((offset + i) * 2);
12403 rv = wm_read_ich8_word(sc, act_offset, &word);
12404 if (rv) {
12405 aprint_error_dev(sc->sc_dev,
12406 "%s: failed to read NVM\n", __func__);
12407 break;
12408 }
12409 data[i] = word;
12410 }
12411
12412 sc->nvm.release(sc);
12413 return rv;
12414 }
12415
12416 /******************************************************************************
12417 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access
12418 * register.
12419 *
12420 * sc - Struct containing variables accessed by shared code
12421 * offset - offset of word in the EEPROM to read
12422 * data - word read from the EEPROM
12423 * words - number of words to read
12424 *****************************************************************************/
12425 static int
12426 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data)
12427 {
12428 int32_t rv = 0;
12429 uint32_t flash_bank = 0;
12430 uint32_t act_offset = 0;
12431 uint32_t bank_offset = 0;
12432 uint32_t dword = 0;
12433 uint16_t i = 0;
12434
12435 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12436 device_xname(sc->sc_dev), __func__));
12437
12438 if (sc->nvm.acquire(sc) != 0)
12439 return -1;
12440
12441 /*
12442 * We need to know which is the valid flash bank. In the event
12443 * that we didn't allocate eeprom_shadow_ram, we may not be
12444 * managing flash_bank. So it cannot be trusted and needs
12445 * to be updated with each read.
12446 */
12447 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
12448 if (rv) {
12449 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
12450 device_xname(sc->sc_dev)));
12451 flash_bank = 0;
12452 }
12453
12454 /*
12455 * Adjust offset appropriately if we're on bank 1 - adjust for word
12456 * size
12457 */
12458 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
12459
12460 for (i = 0; i < words; i++) {
12461 /* The NVM part needs a byte offset, hence * 2 */
12462 act_offset = bank_offset + ((offset + i) * 2);
12463 /* but we must read dword aligned, so mask ... */
12464 rv = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword);
12465 if (rv) {
12466 aprint_error_dev(sc->sc_dev,
12467 "%s: failed to read NVM\n", __func__);
12468 break;
12469 }
12470 /* ... and pick out low or high word */
12471 if ((act_offset & 0x2) == 0)
12472 data[i] = (uint16_t)(dword & 0xFFFF);
12473 else
12474 data[i] = (uint16_t)((dword >> 16) & 0xFFFF);
12475 }
12476
12477 sc->nvm.release(sc);
12478 return rv;
12479 }
12480
12481 /* iNVM */
12482
12483 static int
12484 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data)
12485 {
12486 int32_t rv = 0;
12487 uint32_t invm_dword;
12488 uint16_t i;
12489 uint8_t record_type, word_address;
12490
12491 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12492 device_xname(sc->sc_dev), __func__));
12493
12494 for (i = 0; i < INVM_SIZE; i++) {
12495 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i));
12496 /* Get record type */
12497 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
12498 if (record_type == INVM_UNINITIALIZED_STRUCTURE)
12499 break;
12500 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE)
12501 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
12502 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE)
12503 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
12504 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) {
12505 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
12506 if (word_address == address) {
12507 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
12508 rv = 0;
12509 break;
12510 }
12511 }
12512 }
12513
12514 return rv;
12515 }
12516
12517 static int
12518 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data)
12519 {
12520 int rv = 0;
12521 int i;
12522
12523 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12524 device_xname(sc->sc_dev), __func__));
12525
12526 if (sc->nvm.acquire(sc) != 0)
12527 return -1;
12528
12529 for (i = 0; i < words; i++) {
12530 switch (offset + i) {
12531 case NVM_OFF_MACADDR:
12532 case NVM_OFF_MACADDR1:
12533 case NVM_OFF_MACADDR2:
12534 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]);
12535 if (rv != 0) {
12536 data[i] = 0xffff;
12537 rv = -1;
12538 }
12539 break;
12540 case NVM_OFF_CFG2:
12541 rv = wm_nvm_read_word_invm(sc, offset, data);
12542 if (rv != 0) {
12543 *data = NVM_INIT_CTRL_2_DEFAULT_I211;
12544 rv = 0;
12545 }
12546 break;
12547 case NVM_OFF_CFG4:
12548 rv = wm_nvm_read_word_invm(sc, offset, data);
12549 if (rv != 0) {
12550 *data = NVM_INIT_CTRL_4_DEFAULT_I211;
12551 rv = 0;
12552 }
12553 break;
12554 case NVM_OFF_LED_1_CFG:
12555 rv = wm_nvm_read_word_invm(sc, offset, data);
12556 if (rv != 0) {
12557 *data = NVM_LED_1_CFG_DEFAULT_I211;
12558 rv = 0;
12559 }
12560 break;
12561 case NVM_OFF_LED_0_2_CFG:
12562 rv = wm_nvm_read_word_invm(sc, offset, data);
12563 if (rv != 0) {
12564 *data = NVM_LED_0_2_CFG_DEFAULT_I211;
12565 rv = 0;
12566 }
12567 break;
12568 case NVM_OFF_ID_LED_SETTINGS:
12569 rv = wm_nvm_read_word_invm(sc, offset, data);
12570 if (rv != 0) {
12571 *data = ID_LED_RESERVED_FFFF;
12572 rv = 0;
12573 }
12574 break;
12575 default:
12576 DPRINTF(WM_DEBUG_NVM,
12577 ("NVM word 0x%02x is not mapped.\n", offset));
12578 *data = NVM_RESERVED_WORD;
12579 break;
12580 }
12581 }
12582
12583 sc->nvm.release(sc);
12584 return rv;
12585 }
12586
12587 /* Lock, detecting NVM type, validate checksum, version and read */
12588
12589 static int
12590 wm_nvm_is_onboard_eeprom(struct wm_softc *sc)
12591 {
12592 uint32_t eecd = 0;
12593
12594 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574
12595 || sc->sc_type == WM_T_82583) {
12596 eecd = CSR_READ(sc, WMREG_EECD);
12597
12598 /* Isolate bits 15 & 16 */
12599 eecd = ((eecd >> 15) & 0x03);
12600
12601 /* If both bits are set, device is Flash type */
12602 if (eecd == 0x03)
12603 return 0;
12604 }
12605 return 1;
12606 }
12607
12608 static int
12609 wm_nvm_flash_presence_i210(struct wm_softc *sc)
12610 {
12611 uint32_t eec;
12612
12613 eec = CSR_READ(sc, WMREG_EEC);
12614 if ((eec & EEC_FLASH_DETECTED) != 0)
12615 return 1;
12616
12617 return 0;
12618 }
12619
12620 /*
12621 * wm_nvm_validate_checksum
12622 *
12623 * The checksum is defined as the sum of the first 64 (16 bit) words.
12624 */
12625 static int
12626 wm_nvm_validate_checksum(struct wm_softc *sc)
12627 {
12628 uint16_t checksum;
12629 uint16_t eeprom_data;
12630 #ifdef WM_DEBUG
12631 uint16_t csum_wordaddr, valid_checksum;
12632 #endif
12633 int i;
12634
12635 checksum = 0;
12636
12637 /* Don't check for I211 */
12638 if (sc->sc_type == WM_T_I211)
12639 return 0;
12640
12641 #ifdef WM_DEBUG
12642 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)
12643 || (sc->sc_type == WM_T_PCH_CNP)) {
12644 csum_wordaddr = NVM_OFF_COMPAT;
12645 valid_checksum = NVM_COMPAT_VALID_CHECKSUM;
12646 } else {
12647 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1;
12648 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM;
12649 }
12650
12651 /* Dump EEPROM image for debug */
12652 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
12653 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
12654 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
12655 /* XXX PCH_SPT? */
12656 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data);
12657 if ((eeprom_data & valid_checksum) == 0) {
12658 DPRINTF(WM_DEBUG_NVM,
12659 ("%s: NVM need to be updated (%04x != %04x)\n",
12660 device_xname(sc->sc_dev), eeprom_data,
12661 valid_checksum));
12662 }
12663 }
12664
12665 if ((wm_debug & WM_DEBUG_NVM) != 0) {
12666 printf("%s: NVM dump:\n", device_xname(sc->sc_dev));
12667 for (i = 0; i < NVM_SIZE; i++) {
12668 if (wm_nvm_read(sc, i, 1, &eeprom_data))
12669 printf("XXXX ");
12670 else
12671 printf("%04hx ", eeprom_data);
12672 if (i % 8 == 7)
12673 printf("\n");
12674 }
12675 }
12676
12677 #endif /* WM_DEBUG */
12678
12679 for (i = 0; i < NVM_SIZE; i++) {
12680 if (wm_nvm_read(sc, i, 1, &eeprom_data))
12681 return 1;
12682 checksum += eeprom_data;
12683 }
12684
12685 if (checksum != (uint16_t) NVM_CHECKSUM) {
12686 #ifdef WM_DEBUG
12687 printf("%s: NVM checksum mismatch (%04x != %04x)\n",
12688 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM);
12689 #endif
12690 }
12691
12692 return 0;
12693 }
12694
12695 static void
12696 wm_nvm_version_invm(struct wm_softc *sc)
12697 {
12698 uint32_t dword;
12699
12700 /*
12701 * Linux's code to decode version is very strange, so we don't
12702 * obey that algorithm and just use word 61 as the document.
12703 * Perhaps it's not perfect though...
12704 *
12705 * Example:
12706 *
12707 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6)
12708 */
12709 dword = CSR_READ(sc, WM_INVM_DATA_REG(61));
12710 dword = __SHIFTOUT(dword, INVM_VER_1);
12711 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR);
12712 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR);
12713 }
12714
12715 static void
12716 wm_nvm_version(struct wm_softc *sc)
12717 {
12718 uint16_t major, minor, build, patch;
12719 uint16_t uid0, uid1;
12720 uint16_t nvm_data;
12721 uint16_t off;
12722 bool check_version = false;
12723 bool check_optionrom = false;
12724 bool have_build = false;
12725 bool have_uid = true;
12726
12727 /*
12728 * Version format:
12729 *
12730 * XYYZ
12731 * X0YZ
12732 * X0YY
12733 *
12734 * Example:
12735 *
12736 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10)
12737 * 82571 0x50a6 5.10.6?
12738 * 82572 0x506a 5.6.10?
12739 * 82572EI 0x5069 5.6.9?
12740 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4)
12741 * 0x2013 2.1.3?
12742 * 82583 0x10a0 1.10.0? (document says it's default vaule)
12743 */
12744
12745 /*
12746 * XXX
12747 * Qemu's e1000e emulation (82574L)'s SPI has only 64 words.
12748 * I've never seen on real 82574 hardware with such small SPI ROM.
12749 */
12750 if ((sc->sc_nvm_wordsize < NVM_OFF_IMAGE_UID1)
12751 || (wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1) != 0))
12752 have_uid = false;
12753
12754 switch (sc->sc_type) {
12755 case WM_T_82571:
12756 case WM_T_82572:
12757 case WM_T_82574:
12758 case WM_T_82583:
12759 check_version = true;
12760 check_optionrom = true;
12761 have_build = true;
12762 break;
12763 case WM_T_82575:
12764 case WM_T_82576:
12765 case WM_T_82580:
12766 if (have_uid && (uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID)
12767 check_version = true;
12768 break;
12769 case WM_T_I211:
12770 wm_nvm_version_invm(sc);
12771 have_uid = false;
12772 goto printver;
12773 case WM_T_I210:
12774 if (!wm_nvm_flash_presence_i210(sc)) {
12775 wm_nvm_version_invm(sc);
12776 have_uid = false;
12777 goto printver;
12778 }
12779 /* FALLTHROUGH */
12780 case WM_T_I350:
12781 case WM_T_I354:
12782 check_version = true;
12783 check_optionrom = true;
12784 break;
12785 default:
12786 return;
12787 }
12788 if (check_version
12789 && (wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data) == 0)) {
12790 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
12791 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) {
12792 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT;
12793 build = nvm_data & NVM_BUILD_MASK;
12794 have_build = true;
12795 } else
12796 minor = nvm_data & 0x00ff;
12797
12798 /* Decimal */
12799 minor = (minor / 16) * 10 + (minor % 16);
12800 sc->sc_nvm_ver_major = major;
12801 sc->sc_nvm_ver_minor = minor;
12802
12803 printver:
12804 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major,
12805 sc->sc_nvm_ver_minor);
12806 if (have_build) {
12807 sc->sc_nvm_ver_build = build;
12808 aprint_verbose(".%d", build);
12809 }
12810 }
12811
12812 /* Assume the Option ROM area is at avove NVM_SIZE */
12813 if ((sc->sc_nvm_wordsize > NVM_SIZE) && check_optionrom
12814 && (wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off) == 0)) {
12815 /* Option ROM Version */
12816 if ((off != 0x0000) && (off != 0xffff)) {
12817 int rv;
12818
12819 off += NVM_COMBO_VER_OFF;
12820 rv = wm_nvm_read(sc, off + 1, 1, &uid1);
12821 rv |= wm_nvm_read(sc, off, 1, &uid0);
12822 if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff)
12823 && (uid1 != 0) && (uid1 != 0xffff)) {
12824 /* 16bits */
12825 major = uid0 >> 8;
12826 build = (uid0 << 8) | (uid1 >> 8);
12827 patch = uid1 & 0x00ff;
12828 aprint_verbose(", option ROM Version %d.%d.%d",
12829 major, build, patch);
12830 }
12831 }
12832 }
12833
12834 if (have_uid && (wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0) == 0))
12835 aprint_verbose(", Image Unique ID %08x", (uid1 << 16) | uid0);
12836 }
12837
12838 /*
12839 * wm_nvm_read:
12840 *
12841 * Read data from the serial EEPROM.
12842 */
12843 static int
12844 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
12845 {
12846 int rv;
12847
12848 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
12849 device_xname(sc->sc_dev), __func__));
12850
12851 if (sc->sc_flags & WM_F_EEPROM_INVALID)
12852 return -1;
12853
12854 rv = sc->nvm.read(sc, word, wordcnt, data);
12855
12856 return rv;
12857 }
12858
12859 /*
12860 * Hardware semaphores.
12861 * Very complexed...
12862 */
12863
12864 static int
12865 wm_get_null(struct wm_softc *sc)
12866 {
12867
12868 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12869 device_xname(sc->sc_dev), __func__));
12870 return 0;
12871 }
12872
12873 static void
12874 wm_put_null(struct wm_softc *sc)
12875 {
12876
12877 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12878 device_xname(sc->sc_dev), __func__));
12879 return;
12880 }
12881
12882 static int
12883 wm_get_eecd(struct wm_softc *sc)
12884 {
12885 uint32_t reg;
12886 int x;
12887
12888 DPRINTF(WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
12889 device_xname(sc->sc_dev), __func__));
12890
12891 reg = CSR_READ(sc, WMREG_EECD);
12892
12893 /* Request EEPROM access. */
12894 reg |= EECD_EE_REQ;
12895 CSR_WRITE(sc, WMREG_EECD, reg);
12896
12897 /* ..and wait for it to be granted. */
12898 for (x = 0; x < 1000; x++) {
12899 reg = CSR_READ(sc, WMREG_EECD);
12900 if (reg & EECD_EE_GNT)
12901 break;
12902 delay(5);
12903 }
12904 if ((reg & EECD_EE_GNT) == 0) {
12905 aprint_error_dev(sc->sc_dev,
12906 "could not acquire EEPROM GNT\n");
12907 reg &= ~EECD_EE_REQ;
12908 CSR_WRITE(sc, WMREG_EECD, reg);
12909 return -1;
12910 }
12911
12912 return 0;
12913 }
12914
12915 static void
12916 wm_nvm_eec_clock_raise(struct wm_softc *sc, uint32_t *eecd)
12917 {
12918
12919 *eecd |= EECD_SK;
12920 CSR_WRITE(sc, WMREG_EECD, *eecd);
12921 CSR_WRITE_FLUSH(sc);
12922 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
12923 delay(1);
12924 else
12925 delay(50);
12926 }
12927
12928 static void
12929 wm_nvm_eec_clock_lower(struct wm_softc *sc, uint32_t *eecd)
12930 {
12931
12932 *eecd &= ~EECD_SK;
12933 CSR_WRITE(sc, WMREG_EECD, *eecd);
12934 CSR_WRITE_FLUSH(sc);
12935 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0)
12936 delay(1);
12937 else
12938 delay(50);
12939 }
12940
12941 static void
12942 wm_put_eecd(struct wm_softc *sc)
12943 {
12944 uint32_t reg;
12945
12946 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12947 device_xname(sc->sc_dev), __func__));
12948
12949 /* Stop nvm */
12950 reg = CSR_READ(sc, WMREG_EECD);
12951 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) {
12952 /* Pull CS high */
12953 reg |= EECD_CS;
12954 wm_nvm_eec_clock_lower(sc, ®);
12955 } else {
12956 /* CS on Microwire is active-high */
12957 reg &= ~(EECD_CS | EECD_DI);
12958 CSR_WRITE(sc, WMREG_EECD, reg);
12959 wm_nvm_eec_clock_raise(sc, ®);
12960 wm_nvm_eec_clock_lower(sc, ®);
12961 }
12962
12963 reg = CSR_READ(sc, WMREG_EECD);
12964 reg &= ~EECD_EE_REQ;
12965 CSR_WRITE(sc, WMREG_EECD, reg);
12966
12967 return;
12968 }
12969
12970 /*
12971 * Get hardware semaphore.
12972 * Same as e1000_get_hw_semaphore_generic()
12973 */
12974 static int
12975 wm_get_swsm_semaphore(struct wm_softc *sc)
12976 {
12977 int32_t timeout;
12978 uint32_t swsm;
12979
12980 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12981 device_xname(sc->sc_dev), __func__));
12982 KASSERT(sc->sc_nvm_wordsize > 0);
12983
12984 retry:
12985 /* Get the SW semaphore. */
12986 timeout = sc->sc_nvm_wordsize + 1;
12987 while (timeout) {
12988 swsm = CSR_READ(sc, WMREG_SWSM);
12989
12990 if ((swsm & SWSM_SMBI) == 0)
12991 break;
12992
12993 delay(50);
12994 timeout--;
12995 }
12996
12997 if (timeout == 0) {
12998 if ((sc->sc_flags & WM_F_WA_I210_CLSEM) != 0) {
12999 /*
13000 * In rare circumstances, the SW semaphore may already
13001 * be held unintentionally. Clear the semaphore once
13002 * before giving up.
13003 */
13004 sc->sc_flags &= ~WM_F_WA_I210_CLSEM;
13005 wm_put_swsm_semaphore(sc);
13006 goto retry;
13007 }
13008 aprint_error_dev(sc->sc_dev,
13009 "could not acquire SWSM SMBI\n");
13010 return 1;
13011 }
13012
13013 /* Get the FW semaphore. */
13014 timeout = sc->sc_nvm_wordsize + 1;
13015 while (timeout) {
13016 swsm = CSR_READ(sc, WMREG_SWSM);
13017 swsm |= SWSM_SWESMBI;
13018 CSR_WRITE(sc, WMREG_SWSM, swsm);
13019 /* If we managed to set the bit we got the semaphore. */
13020 swsm = CSR_READ(sc, WMREG_SWSM);
13021 if (swsm & SWSM_SWESMBI)
13022 break;
13023
13024 delay(50);
13025 timeout--;
13026 }
13027
13028 if (timeout == 0) {
13029 aprint_error_dev(sc->sc_dev,
13030 "could not acquire SWSM SWESMBI\n");
13031 /* Release semaphores */
13032 wm_put_swsm_semaphore(sc);
13033 return 1;
13034 }
13035 return 0;
13036 }
13037
13038 /*
13039 * Put hardware semaphore.
13040 * Same as e1000_put_hw_semaphore_generic()
13041 */
13042 static void
13043 wm_put_swsm_semaphore(struct wm_softc *sc)
13044 {
13045 uint32_t swsm;
13046
13047 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13048 device_xname(sc->sc_dev), __func__));
13049
13050 swsm = CSR_READ(sc, WMREG_SWSM);
13051 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI);
13052 CSR_WRITE(sc, WMREG_SWSM, swsm);
13053 }
13054
13055 /*
13056 * Get SW/FW semaphore.
13057 * Same as e1000_acquire_swfw_sync_{80003es2lan,82575}().
13058 */
13059 static int
13060 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
13061 {
13062 uint32_t swfw_sync;
13063 uint32_t swmask = mask << SWFW_SOFT_SHIFT;
13064 uint32_t fwmask = mask << SWFW_FIRM_SHIFT;
13065 int timeout;
13066
13067 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13068 device_xname(sc->sc_dev), __func__));
13069
13070 if (sc->sc_type == WM_T_80003)
13071 timeout = 50;
13072 else
13073 timeout = 200;
13074
13075 while (timeout) {
13076 if (wm_get_swsm_semaphore(sc)) {
13077 aprint_error_dev(sc->sc_dev,
13078 "%s: failed to get semaphore\n",
13079 __func__);
13080 return 1;
13081 }
13082 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
13083 if ((swfw_sync & (swmask | fwmask)) == 0) {
13084 swfw_sync |= swmask;
13085 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
13086 wm_put_swsm_semaphore(sc);
13087 return 0;
13088 }
13089 wm_put_swsm_semaphore(sc);
13090 delay(5000);
13091 timeout--;
13092 }
13093 printf("%s: failed to get swfw semaphore mask 0x%x swfw 0x%x\n",
13094 device_xname(sc->sc_dev), mask, swfw_sync);
13095 return 1;
13096 }
13097
13098 static void
13099 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
13100 {
13101 uint32_t swfw_sync;
13102
13103 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13104 device_xname(sc->sc_dev), __func__));
13105
13106 while (wm_get_swsm_semaphore(sc) != 0)
13107 continue;
13108
13109 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
13110 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT);
13111 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
13112
13113 wm_put_swsm_semaphore(sc);
13114 }
13115
13116 static int
13117 wm_get_nvm_80003(struct wm_softc *sc)
13118 {
13119 int rv;
13120
13121 DPRINTF(WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n",
13122 device_xname(sc->sc_dev), __func__));
13123
13124 if ((rv = wm_get_swfw_semaphore(sc, SWFW_EEP_SM)) != 0) {
13125 aprint_error_dev(sc->sc_dev,
13126 "%s: failed to get semaphore(SWFW)\n",
13127 __func__);
13128 return rv;
13129 }
13130
13131 if (((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13132 && (rv = wm_get_eecd(sc)) != 0) {
13133 aprint_error_dev(sc->sc_dev,
13134 "%s: failed to get semaphore(EECD)\n",
13135 __func__);
13136 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
13137 return rv;
13138 }
13139
13140 return 0;
13141 }
13142
13143 static void
13144 wm_put_nvm_80003(struct wm_softc *sc)
13145 {
13146
13147 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13148 device_xname(sc->sc_dev), __func__));
13149
13150 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13151 wm_put_eecd(sc);
13152 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
13153 }
13154
13155 static int
13156 wm_get_nvm_82571(struct wm_softc *sc)
13157 {
13158 int rv;
13159
13160 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13161 device_xname(sc->sc_dev), __func__));
13162
13163 if ((rv = wm_get_swsm_semaphore(sc)) != 0)
13164 return rv;
13165
13166 switch (sc->sc_type) {
13167 case WM_T_82573:
13168 break;
13169 default:
13170 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13171 rv = wm_get_eecd(sc);
13172 break;
13173 }
13174
13175 if (rv != 0) {
13176 aprint_error_dev(sc->sc_dev,
13177 "%s: failed to get semaphore\n",
13178 __func__);
13179 wm_put_swsm_semaphore(sc);
13180 }
13181
13182 return rv;
13183 }
13184
13185 static void
13186 wm_put_nvm_82571(struct wm_softc *sc)
13187 {
13188
13189 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13190 device_xname(sc->sc_dev), __func__));
13191
13192 switch (sc->sc_type) {
13193 case WM_T_82573:
13194 break;
13195 default:
13196 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0)
13197 wm_put_eecd(sc);
13198 break;
13199 }
13200
13201 wm_put_swsm_semaphore(sc);
13202 }
13203
13204 static int
13205 wm_get_phy_82575(struct wm_softc *sc)
13206 {
13207
13208 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13209 device_xname(sc->sc_dev), __func__));
13210 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
13211 }
13212
13213 static void
13214 wm_put_phy_82575(struct wm_softc *sc)
13215 {
13216
13217 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13218 device_xname(sc->sc_dev), __func__));
13219 return wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
13220 }
13221
13222 static int
13223 wm_get_swfwhw_semaphore(struct wm_softc *sc)
13224 {
13225 uint32_t ext_ctrl;
13226 int timeout = 200;
13227
13228 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13229 device_xname(sc->sc_dev), __func__));
13230
13231 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
13232 for (timeout = 0; timeout < 200; timeout++) {
13233 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13234 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
13235 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13236
13237 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13238 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
13239 return 0;
13240 delay(5000);
13241 }
13242 printf("%s: failed to get swfwhw semaphore ext_ctrl 0x%x\n",
13243 device_xname(sc->sc_dev), ext_ctrl);
13244 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
13245 return 1;
13246 }
13247
13248 static void
13249 wm_put_swfwhw_semaphore(struct wm_softc *sc)
13250 {
13251 uint32_t ext_ctrl;
13252
13253 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13254 device_xname(sc->sc_dev), __func__));
13255
13256 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13257 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13258 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13259
13260 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
13261 }
13262
13263 static int
13264 wm_get_swflag_ich8lan(struct wm_softc *sc)
13265 {
13266 uint32_t ext_ctrl;
13267 int timeout;
13268
13269 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13270 device_xname(sc->sc_dev), __func__));
13271 mutex_enter(sc->sc_ich_phymtx);
13272 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) {
13273 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13274 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0)
13275 break;
13276 delay(1000);
13277 }
13278 if (timeout >= WM_PHY_CFG_TIMEOUT) {
13279 printf("%s: SW has already locked the resource\n",
13280 device_xname(sc->sc_dev));
13281 goto out;
13282 }
13283
13284 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
13285 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13286 for (timeout = 0; timeout < 1000; timeout++) {
13287 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13288 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
13289 break;
13290 delay(1000);
13291 }
13292 if (timeout >= 1000) {
13293 printf("%s: failed to acquire semaphore\n",
13294 device_xname(sc->sc_dev));
13295 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13296 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13297 goto out;
13298 }
13299 return 0;
13300
13301 out:
13302 mutex_exit(sc->sc_ich_phymtx);
13303 return 1;
13304 }
13305
13306 static void
13307 wm_put_swflag_ich8lan(struct wm_softc *sc)
13308 {
13309 uint32_t ext_ctrl;
13310
13311 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13312 device_xname(sc->sc_dev), __func__));
13313 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
13314 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) {
13315 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13316 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
13317 } else {
13318 printf("%s: Semaphore unexpectedly released\n",
13319 device_xname(sc->sc_dev));
13320 }
13321
13322 mutex_exit(sc->sc_ich_phymtx);
13323 }
13324
13325 static int
13326 wm_get_nvm_ich8lan(struct wm_softc *sc)
13327 {
13328
13329 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13330 device_xname(sc->sc_dev), __func__));
13331 mutex_enter(sc->sc_ich_nvmmtx);
13332
13333 return 0;
13334 }
13335
13336 static void
13337 wm_put_nvm_ich8lan(struct wm_softc *sc)
13338 {
13339
13340 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13341 device_xname(sc->sc_dev), __func__));
13342 mutex_exit(sc->sc_ich_nvmmtx);
13343 }
13344
13345 static int
13346 wm_get_hw_semaphore_82573(struct wm_softc *sc)
13347 {
13348 int i = 0;
13349 uint32_t reg;
13350
13351 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13352 device_xname(sc->sc_dev), __func__));
13353
13354 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13355 do {
13356 CSR_WRITE(sc, WMREG_EXTCNFCTR,
13357 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP);
13358 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13359 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0)
13360 break;
13361 delay(2*1000);
13362 i++;
13363 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT);
13364
13365 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) {
13366 wm_put_hw_semaphore_82573(sc);
13367 log(LOG_ERR, "%s: Driver can't access the PHY\n",
13368 device_xname(sc->sc_dev));
13369 return -1;
13370 }
13371
13372 return 0;
13373 }
13374
13375 static void
13376 wm_put_hw_semaphore_82573(struct wm_softc *sc)
13377 {
13378 uint32_t reg;
13379
13380 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13381 device_xname(sc->sc_dev), __func__));
13382
13383 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13384 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
13385 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
13386 }
13387
13388 /*
13389 * Management mode and power management related subroutines.
13390 * BMC, AMT, suspend/resume and EEE.
13391 */
13392
13393 #ifdef WM_WOL
13394 static int
13395 wm_check_mng_mode(struct wm_softc *sc)
13396 {
13397 int rv;
13398
13399 switch (sc->sc_type) {
13400 case WM_T_ICH8:
13401 case WM_T_ICH9:
13402 case WM_T_ICH10:
13403 case WM_T_PCH:
13404 case WM_T_PCH2:
13405 case WM_T_PCH_LPT:
13406 case WM_T_PCH_SPT:
13407 case WM_T_PCH_CNP:
13408 rv = wm_check_mng_mode_ich8lan(sc);
13409 break;
13410 case WM_T_82574:
13411 case WM_T_82583:
13412 rv = wm_check_mng_mode_82574(sc);
13413 break;
13414 case WM_T_82571:
13415 case WM_T_82572:
13416 case WM_T_82573:
13417 case WM_T_80003:
13418 rv = wm_check_mng_mode_generic(sc);
13419 break;
13420 default:
13421 /* noting to do */
13422 rv = 0;
13423 break;
13424 }
13425
13426 return rv;
13427 }
13428
13429 static int
13430 wm_check_mng_mode_ich8lan(struct wm_softc *sc)
13431 {
13432 uint32_t fwsm;
13433
13434 fwsm = CSR_READ(sc, WMREG_FWSM);
13435
13436 if (((fwsm & FWSM_FW_VALID) != 0)
13437 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
13438 return 1;
13439
13440 return 0;
13441 }
13442
13443 static int
13444 wm_check_mng_mode_82574(struct wm_softc *sc)
13445 {
13446 uint16_t data;
13447
13448 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
13449
13450 if ((data & NVM_CFG2_MNGM_MASK) != 0)
13451 return 1;
13452
13453 return 0;
13454 }
13455
13456 static int
13457 wm_check_mng_mode_generic(struct wm_softc *sc)
13458 {
13459 uint32_t fwsm;
13460
13461 fwsm = CSR_READ(sc, WMREG_FWSM);
13462
13463 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE)
13464 return 1;
13465
13466 return 0;
13467 }
13468 #endif /* WM_WOL */
13469
13470 static int
13471 wm_enable_mng_pass_thru(struct wm_softc *sc)
13472 {
13473 uint32_t manc, fwsm, factps;
13474
13475 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0)
13476 return 0;
13477
13478 manc = CSR_READ(sc, WMREG_MANC);
13479
13480 DPRINTF(WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n",
13481 device_xname(sc->sc_dev), manc));
13482 if ((manc & MANC_RECV_TCO_EN) == 0)
13483 return 0;
13484
13485 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) {
13486 fwsm = CSR_READ(sc, WMREG_FWSM);
13487 factps = CSR_READ(sc, WMREG_FACTPS);
13488 if (((factps & FACTPS_MNGCG) == 0)
13489 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
13490 return 1;
13491 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
13492 uint16_t data;
13493
13494 factps = CSR_READ(sc, WMREG_FACTPS);
13495 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
13496 DPRINTF(WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n",
13497 device_xname(sc->sc_dev), factps, data));
13498 if (((factps & FACTPS_MNGCG) == 0)
13499 && ((data & NVM_CFG2_MNGM_MASK)
13500 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT)))
13501 return 1;
13502 } else if (((manc & MANC_SMBUS_EN) != 0)
13503 && ((manc & MANC_ASF_EN) == 0))
13504 return 1;
13505
13506 return 0;
13507 }
13508
13509 static bool
13510 wm_phy_resetisblocked(struct wm_softc *sc)
13511 {
13512 bool blocked = false;
13513 uint32_t reg;
13514 int i = 0;
13515
13516 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13517 device_xname(sc->sc_dev), __func__));
13518
13519 switch (sc->sc_type) {
13520 case WM_T_ICH8:
13521 case WM_T_ICH9:
13522 case WM_T_ICH10:
13523 case WM_T_PCH:
13524 case WM_T_PCH2:
13525 case WM_T_PCH_LPT:
13526 case WM_T_PCH_SPT:
13527 case WM_T_PCH_CNP:
13528 do {
13529 reg = CSR_READ(sc, WMREG_FWSM);
13530 if ((reg & FWSM_RSPCIPHY) == 0) {
13531 blocked = true;
13532 delay(10*1000);
13533 continue;
13534 }
13535 blocked = false;
13536 } while (blocked && (i++ < 30));
13537 return blocked;
13538 break;
13539 case WM_T_82571:
13540 case WM_T_82572:
13541 case WM_T_82573:
13542 case WM_T_82574:
13543 case WM_T_82583:
13544 case WM_T_80003:
13545 reg = CSR_READ(sc, WMREG_MANC);
13546 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0)
13547 return true;
13548 else
13549 return false;
13550 break;
13551 default:
13552 /* no problem */
13553 break;
13554 }
13555
13556 return false;
13557 }
13558
13559 static void
13560 wm_get_hw_control(struct wm_softc *sc)
13561 {
13562 uint32_t reg;
13563
13564 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13565 device_xname(sc->sc_dev), __func__));
13566
13567 if (sc->sc_type == WM_T_82573) {
13568 reg = CSR_READ(sc, WMREG_SWSM);
13569 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD);
13570 } else if (sc->sc_type >= WM_T_82571) {
13571 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13572 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
13573 }
13574 }
13575
13576 static void
13577 wm_release_hw_control(struct wm_softc *sc)
13578 {
13579 uint32_t reg;
13580
13581 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
13582 device_xname(sc->sc_dev), __func__));
13583
13584 if (sc->sc_type == WM_T_82573) {
13585 reg = CSR_READ(sc, WMREG_SWSM);
13586 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD);
13587 } else if (sc->sc_type >= WM_T_82571) {
13588 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13589 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD);
13590 }
13591 }
13592
13593 static void
13594 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate)
13595 {
13596 uint32_t reg;
13597
13598 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13599 device_xname(sc->sc_dev), __func__));
13600
13601 if (sc->sc_type < WM_T_PCH2)
13602 return;
13603
13604 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
13605
13606 if (gate)
13607 reg |= EXTCNFCTR_GATE_PHY_CFG;
13608 else
13609 reg &= ~EXTCNFCTR_GATE_PHY_CFG;
13610
13611 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
13612 }
13613
13614 static void
13615 wm_smbustopci(struct wm_softc *sc)
13616 {
13617 uint32_t fwsm, reg;
13618 int rv = 0;
13619
13620 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13621 device_xname(sc->sc_dev), __func__));
13622
13623 /* Gate automatic PHY configuration by hardware on non-managed 82579 */
13624 wm_gate_hw_phy_config_ich8lan(sc, true);
13625
13626 /* Disable ULP */
13627 wm_ulp_disable(sc);
13628
13629 /* Acquire PHY semaphore */
13630 sc->phy.acquire(sc);
13631
13632 fwsm = CSR_READ(sc, WMREG_FWSM);
13633 switch (sc->sc_type) {
13634 case WM_T_PCH_LPT:
13635 case WM_T_PCH_SPT:
13636 case WM_T_PCH_CNP:
13637 if (wm_phy_is_accessible_pchlan(sc))
13638 break;
13639
13640 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13641 reg |= CTRL_EXT_FORCE_SMBUS;
13642 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13643 #if 0
13644 /* XXX Isn't this required??? */
13645 CSR_WRITE_FLUSH(sc);
13646 #endif
13647 delay(50 * 1000);
13648 /* FALLTHROUGH */
13649 case WM_T_PCH2:
13650 if (wm_phy_is_accessible_pchlan(sc) == true)
13651 break;
13652 /* FALLTHROUGH */
13653 case WM_T_PCH:
13654 if (sc->sc_type == WM_T_PCH)
13655 if ((fwsm & FWSM_FW_VALID) != 0)
13656 break;
13657
13658 if (wm_phy_resetisblocked(sc) == true) {
13659 printf("XXX reset is blocked(3)\n");
13660 break;
13661 }
13662
13663 wm_toggle_lanphypc_pch_lpt(sc);
13664
13665 if (sc->sc_type >= WM_T_PCH_LPT) {
13666 if (wm_phy_is_accessible_pchlan(sc) == true)
13667 break;
13668
13669 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13670 reg &= ~CTRL_EXT_FORCE_SMBUS;
13671 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13672
13673 if (wm_phy_is_accessible_pchlan(sc) == true)
13674 break;
13675 rv = -1;
13676 }
13677 break;
13678 default:
13679 break;
13680 }
13681
13682 /* Release semaphore */
13683 sc->phy.release(sc);
13684
13685 if (rv == 0) {
13686 if (wm_phy_resetisblocked(sc)) {
13687 printf("XXX reset is blocked(4)\n");
13688 goto out;
13689 }
13690 wm_reset_phy(sc);
13691 if (wm_phy_resetisblocked(sc))
13692 printf("XXX reset is blocked(4)\n");
13693 }
13694
13695 out:
13696 /*
13697 * Ungate automatic PHY configuration by hardware on non-managed 82579
13698 */
13699 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) {
13700 delay(10*1000);
13701 wm_gate_hw_phy_config_ich8lan(sc, false);
13702 }
13703 }
13704
13705 static void
13706 wm_init_manageability(struct wm_softc *sc)
13707 {
13708
13709 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13710 device_xname(sc->sc_dev), __func__));
13711 if (sc->sc_flags & WM_F_HAS_MANAGE) {
13712 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H);
13713 uint32_t manc = CSR_READ(sc, WMREG_MANC);
13714
13715 /* Disable hardware interception of ARP */
13716 manc &= ~MANC_ARP_EN;
13717
13718 /* Enable receiving management packets to the host */
13719 if (sc->sc_type >= WM_T_82571) {
13720 manc |= MANC_EN_MNG2HOST;
13721 manc2h |= MANC2H_PORT_623 | MANC2H_PORT_624;
13722 CSR_WRITE(sc, WMREG_MANC2H, manc2h);
13723 }
13724
13725 CSR_WRITE(sc, WMREG_MANC, manc);
13726 }
13727 }
13728
13729 static void
13730 wm_release_manageability(struct wm_softc *sc)
13731 {
13732
13733 if (sc->sc_flags & WM_F_HAS_MANAGE) {
13734 uint32_t manc = CSR_READ(sc, WMREG_MANC);
13735
13736 manc |= MANC_ARP_EN;
13737 if (sc->sc_type >= WM_T_82571)
13738 manc &= ~MANC_EN_MNG2HOST;
13739
13740 CSR_WRITE(sc, WMREG_MANC, manc);
13741 }
13742 }
13743
13744 static void
13745 wm_get_wakeup(struct wm_softc *sc)
13746 {
13747
13748 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */
13749 switch (sc->sc_type) {
13750 case WM_T_82573:
13751 case WM_T_82583:
13752 sc->sc_flags |= WM_F_HAS_AMT;
13753 /* FALLTHROUGH */
13754 case WM_T_80003:
13755 case WM_T_82575:
13756 case WM_T_82576:
13757 case WM_T_82580:
13758 case WM_T_I350:
13759 case WM_T_I354:
13760 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0)
13761 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID;
13762 /* FALLTHROUGH */
13763 case WM_T_82541:
13764 case WM_T_82541_2:
13765 case WM_T_82547:
13766 case WM_T_82547_2:
13767 case WM_T_82571:
13768 case WM_T_82572:
13769 case WM_T_82574:
13770 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
13771 break;
13772 case WM_T_ICH8:
13773 case WM_T_ICH9:
13774 case WM_T_ICH10:
13775 case WM_T_PCH:
13776 case WM_T_PCH2:
13777 case WM_T_PCH_LPT:
13778 case WM_T_PCH_SPT:
13779 case WM_T_PCH_CNP:
13780 sc->sc_flags |= WM_F_HAS_AMT;
13781 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
13782 break;
13783 default:
13784 break;
13785 }
13786
13787 /* 1: HAS_MANAGE */
13788 if (wm_enable_mng_pass_thru(sc) != 0)
13789 sc->sc_flags |= WM_F_HAS_MANAGE;
13790
13791 /*
13792 * Note that the WOL flags is set after the resetting of the eeprom
13793 * stuff
13794 */
13795 }
13796
13797 /*
13798 * Unconfigure Ultra Low Power mode.
13799 * Only for I217 and newer (see below).
13800 */
13801 static void
13802 wm_ulp_disable(struct wm_softc *sc)
13803 {
13804 uint32_t reg;
13805 int i = 0;
13806
13807 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13808 device_xname(sc->sc_dev), __func__));
13809 /* Exclude old devices */
13810 if ((sc->sc_type < WM_T_PCH_LPT)
13811 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM)
13812 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V)
13813 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2)
13814 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2))
13815 return;
13816
13817 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) {
13818 /* Request ME un-configure ULP mode in the PHY */
13819 reg = CSR_READ(sc, WMREG_H2ME);
13820 reg &= ~H2ME_ULP;
13821 reg |= H2ME_ENFORCE_SETTINGS;
13822 CSR_WRITE(sc, WMREG_H2ME, reg);
13823
13824 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */
13825 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) {
13826 if (i++ == 30) {
13827 printf("%s timed out\n", __func__);
13828 return;
13829 }
13830 delay(10 * 1000);
13831 }
13832 reg = CSR_READ(sc, WMREG_H2ME);
13833 reg &= ~H2ME_ENFORCE_SETTINGS;
13834 CSR_WRITE(sc, WMREG_H2ME, reg);
13835
13836 return;
13837 }
13838
13839 /* Acquire semaphore */
13840 sc->phy.acquire(sc);
13841
13842 /* Toggle LANPHYPC */
13843 wm_toggle_lanphypc_pch_lpt(sc);
13844
13845 /* Unforce SMBus mode in PHY */
13846 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL);
13847 if (reg == 0x0000 || reg == 0xffff) {
13848 uint32_t reg2;
13849
13850 printf("%s: Force SMBus first.\n", __func__);
13851 reg2 = CSR_READ(sc, WMREG_CTRL_EXT);
13852 reg2 |= CTRL_EXT_FORCE_SMBUS;
13853 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2);
13854 delay(50 * 1000);
13855
13856 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL);
13857 }
13858 reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
13859 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, reg);
13860
13861 /* Unforce SMBus mode in MAC */
13862 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13863 reg &= ~CTRL_EXT_FORCE_SMBUS;
13864 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13865
13866 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL);
13867 reg |= HV_PM_CTRL_K1_ENA;
13868 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, reg);
13869
13870 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1);
13871 reg &= ~(I218_ULP_CONFIG1_IND
13872 | I218_ULP_CONFIG1_STICKY_ULP
13873 | I218_ULP_CONFIG1_RESET_TO_SMBUS
13874 | I218_ULP_CONFIG1_WOL_HOST
13875 | I218_ULP_CONFIG1_INBAND_EXIT
13876 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC
13877 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST
13878 | I218_ULP_CONFIG1_DIS_SMB_PERST);
13879 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, reg);
13880 reg |= I218_ULP_CONFIG1_START;
13881 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, reg);
13882
13883 reg = CSR_READ(sc, WMREG_FEXTNVM7);
13884 reg &= ~FEXTNVM7_DIS_SMB_PERST;
13885 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
13886
13887 /* Release semaphore */
13888 sc->phy.release(sc);
13889 wm_gmii_reset(sc);
13890 delay(50 * 1000);
13891 }
13892
13893 /* WOL in the newer chipset interfaces (pchlan) */
13894 static void
13895 wm_enable_phy_wakeup(struct wm_softc *sc)
13896 {
13897 #if 0
13898 uint16_t preg;
13899
13900 /* Copy MAC RARs to PHY RARs */
13901
13902 /* Copy MAC MTA to PHY MTA */
13903
13904 /* Configure PHY Rx Control register */
13905
13906 /* Enable PHY wakeup in MAC register */
13907
13908 /* Configure and enable PHY wakeup in PHY registers */
13909
13910 /* Activate PHY wakeup */
13911
13912 /* XXX */
13913 #endif
13914 }
13915
13916 /* Power down workaround on D3 */
13917 static void
13918 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc)
13919 {
13920 uint32_t reg;
13921 int i;
13922
13923 for (i = 0; i < 2; i++) {
13924 /* Disable link */
13925 reg = CSR_READ(sc, WMREG_PHY_CTRL);
13926 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
13927 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
13928
13929 /*
13930 * Call gig speed drop workaround on Gig disable before
13931 * accessing any PHY registers
13932 */
13933 if (sc->sc_type == WM_T_ICH8)
13934 wm_gig_downshift_workaround_ich8lan(sc);
13935
13936 /* Write VR power-down enable */
13937 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
13938 reg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
13939 reg |= IGP3_VR_CTRL_MODE_SHUTDOWN;
13940 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, reg);
13941
13942 /* Read it back and test */
13943 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
13944 reg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
13945 if ((reg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0))
13946 break;
13947
13948 /* Issue PHY reset and repeat at most one more time */
13949 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
13950 }
13951 }
13952
13953 static void
13954 wm_enable_wakeup(struct wm_softc *sc)
13955 {
13956 uint32_t reg, pmreg;
13957 pcireg_t pmode;
13958
13959 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13960 device_xname(sc->sc_dev), __func__));
13961
13962 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
13963 &pmreg, NULL) == 0)
13964 return;
13965
13966 /* Advertise the wakeup capability */
13967 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2)
13968 | CTRL_SWDPIN(3));
13969 CSR_WRITE(sc, WMREG_WUC, WUC_APME);
13970
13971 /* ICH workaround */
13972 switch (sc->sc_type) {
13973 case WM_T_ICH8:
13974 case WM_T_ICH9:
13975 case WM_T_ICH10:
13976 case WM_T_PCH:
13977 case WM_T_PCH2:
13978 case WM_T_PCH_LPT:
13979 case WM_T_PCH_SPT:
13980 case WM_T_PCH_CNP:
13981 /* Disable gig during WOL */
13982 reg = CSR_READ(sc, WMREG_PHY_CTRL);
13983 reg |= PHY_CTRL_D0A_LPLU | PHY_CTRL_GBE_DIS;
13984 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
13985 if (sc->sc_type == WM_T_PCH)
13986 wm_gmii_reset(sc);
13987
13988 /* Power down workaround */
13989 if (sc->sc_phytype == WMPHY_82577) {
13990 struct mii_softc *child;
13991
13992 /* Assume that the PHY is copper */
13993 child = LIST_FIRST(&sc->sc_mii.mii_phys);
13994 if ((child != NULL) && (child->mii_mpd_rev <= 2))
13995 sc->sc_mii.mii_writereg(sc->sc_dev, 1,
13996 (768 << 5) | 25, 0x0444); /* magic num */
13997 }
13998 break;
13999 default:
14000 break;
14001 }
14002
14003 /* Keep the laser running on fiber adapters */
14004 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
14005 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
14006 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14007 reg |= CTRL_EXT_SWDPIN(3);
14008 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14009 }
14010
14011 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG;
14012 #if 0 /* for the multicast packet */
14013 reg |= WUFC_MC;
14014 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE);
14015 #endif
14016
14017 if (sc->sc_type >= WM_T_PCH)
14018 wm_enable_phy_wakeup(sc);
14019 else {
14020 CSR_WRITE(sc, WMREG_WUC, CSR_READ(sc, WMREG_WUC) | WUC_PME_EN);
14021 CSR_WRITE(sc, WMREG_WUFC, reg);
14022 }
14023
14024 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
14025 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
14026 || (sc->sc_type == WM_T_PCH2))
14027 && (sc->sc_phytype == WMPHY_IGP_3))
14028 wm_igp3_phy_powerdown_workaround_ich8lan(sc);
14029
14030 /* Request PME */
14031 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR);
14032 #if 0
14033 /* Disable WOL */
14034 pmode &= ~(PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN);
14035 #else
14036 /* For WOL */
14037 pmode |= PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN;
14038 #endif
14039 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode);
14040 }
14041
14042 /* Disable ASPM L0s and/or L1 for workaround */
14043 static void
14044 wm_disable_aspm(struct wm_softc *sc)
14045 {
14046 pcireg_t reg, mask = 0;
14047 unsigned const char *str = "";
14048
14049 /*
14050 * Only for PCIe device which has PCIe capability in the PCI config
14051 * space.
14052 */
14053 if (((sc->sc_flags & WM_F_PCIE) == 0) || (sc->sc_pcixe_capoff == 0))
14054 return;
14055
14056 switch (sc->sc_type) {
14057 case WM_T_82571:
14058 case WM_T_82572:
14059 /*
14060 * 8257[12] Errata 13: Device Does Not Support PCIe Active
14061 * State Power management L1 State (ASPM L1).
14062 */
14063 mask = PCIE_LCSR_ASPM_L1;
14064 str = "L1 is";
14065 break;
14066 case WM_T_82573:
14067 case WM_T_82574:
14068 case WM_T_82583:
14069 /*
14070 * The 82573 disappears when PCIe ASPM L0s is enabled.
14071 *
14072 * The 82574 and 82583 does not support PCIe ASPM L0s with
14073 * some chipset. The document of 82574 and 82583 says that
14074 * disabling L0s with some specific chipset is sufficient,
14075 * but we follow as of the Intel em driver does.
14076 *
14077 * References:
14078 * Errata 8 of the Specification Update of i82573.
14079 * Errata 20 of the Specification Update of i82574.
14080 * Errata 9 of the Specification Update of i82583.
14081 */
14082 mask = PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S;
14083 str = "L0s and L1 are";
14084 break;
14085 default:
14086 return;
14087 }
14088
14089 reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
14090 sc->sc_pcixe_capoff + PCIE_LCSR);
14091 reg &= ~mask;
14092 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
14093 sc->sc_pcixe_capoff + PCIE_LCSR, reg);
14094
14095 /* Print only in wm_attach() */
14096 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
14097 aprint_verbose_dev(sc->sc_dev,
14098 "ASPM %s disabled to workaround the errata.\n",
14099 str);
14100 }
14101
14102 /* LPLU */
14103
14104 static void
14105 wm_lplu_d0_disable(struct wm_softc *sc)
14106 {
14107 struct mii_data *mii = &sc->sc_mii;
14108 uint32_t reg;
14109
14110 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14111 device_xname(sc->sc_dev), __func__));
14112
14113 if (sc->sc_phytype == WMPHY_IFE)
14114 return;
14115
14116 switch (sc->sc_type) {
14117 case WM_T_82571:
14118 case WM_T_82572:
14119 case WM_T_82573:
14120 case WM_T_82575:
14121 case WM_T_82576:
14122 reg = mii->mii_readreg(sc->sc_dev, 1, MII_IGPHY_POWER_MGMT);
14123 reg &= ~PMR_D0_LPLU;
14124 mii->mii_writereg(sc->sc_dev, 1, MII_IGPHY_POWER_MGMT, reg);
14125 break;
14126 case WM_T_82580:
14127 case WM_T_I350:
14128 case WM_T_I210:
14129 case WM_T_I211:
14130 reg = CSR_READ(sc, WMREG_PHPM);
14131 reg &= ~PHPM_D0A_LPLU;
14132 CSR_WRITE(sc, WMREG_PHPM, reg);
14133 break;
14134 case WM_T_82574:
14135 case WM_T_82583:
14136 case WM_T_ICH8:
14137 case WM_T_ICH9:
14138 case WM_T_ICH10:
14139 reg = CSR_READ(sc, WMREG_PHY_CTRL);
14140 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU);
14141 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
14142 CSR_WRITE_FLUSH(sc);
14143 break;
14144 case WM_T_PCH:
14145 case WM_T_PCH2:
14146 case WM_T_PCH_LPT:
14147 case WM_T_PCH_SPT:
14148 case WM_T_PCH_CNP:
14149 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS);
14150 reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
14151 if (wm_phy_resetisblocked(sc) == false)
14152 reg |= HV_OEM_BITS_ANEGNOW;
14153 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, reg);
14154 break;
14155 default:
14156 break;
14157 }
14158 }
14159
14160 /* EEE */
14161
14162 static void
14163 wm_set_eee_i350(struct wm_softc *sc)
14164 {
14165 uint32_t ipcnfg, eeer;
14166
14167 ipcnfg = CSR_READ(sc, WMREG_IPCNFG);
14168 eeer = CSR_READ(sc, WMREG_EEER);
14169
14170 if ((sc->sc_flags & WM_F_EEE) != 0) {
14171 ipcnfg |= (IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
14172 eeer |= (EEER_TX_LPI_EN | EEER_RX_LPI_EN
14173 | EEER_LPI_FC);
14174 } else {
14175 ipcnfg &= ~(IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
14176 ipcnfg &= ~IPCNFG_10BASE_TE;
14177 eeer &= ~(EEER_TX_LPI_EN | EEER_RX_LPI_EN
14178 | EEER_LPI_FC);
14179 }
14180
14181 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg);
14182 CSR_WRITE(sc, WMREG_EEER, eeer);
14183 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */
14184 CSR_READ(sc, WMREG_EEER); /* XXX flush? */
14185 }
14186
14187 /*
14188 * Workarounds (mainly PHY related).
14189 * Basically, PHY's workarounds are in the PHY drivers.
14190 */
14191
14192 /* Work-around for 82566 Kumeran PCS lock loss */
14193 static void
14194 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc)
14195 {
14196 struct mii_data *mii = &sc->sc_mii;
14197 uint32_t status = CSR_READ(sc, WMREG_STATUS);
14198 int i;
14199 int reg;
14200
14201 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14202 device_xname(sc->sc_dev), __func__));
14203
14204 /* If the link is not up, do nothing */
14205 if ((status & STATUS_LU) == 0)
14206 return;
14207
14208 /* Nothing to do if the link is other than 1Gbps */
14209 if (__SHIFTOUT(status, STATUS_SPEED) != STATUS_SPEED_1000)
14210 return;
14211
14212 reg = CSR_READ(sc, WMREG_PHY_CTRL);
14213 for (i = 0; i < 10; i++) {
14214 /* read twice */
14215 reg = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
14216 reg = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
14217 if ((reg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0)
14218 goto out; /* GOOD! */
14219
14220 /* Reset the PHY */
14221 wm_reset_phy(sc);
14222 delay(5*1000);
14223 }
14224
14225 /* Disable GigE link negotiation */
14226 reg = CSR_READ(sc, WMREG_PHY_CTRL);
14227 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
14228 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
14229
14230 /*
14231 * Call gig speed drop workaround on Gig disable before accessing
14232 * any PHY registers.
14233 */
14234 wm_gig_downshift_workaround_ich8lan(sc);
14235
14236 out:
14237 return;
14238 }
14239
14240 /* WOL from S5 stops working */
14241 static void
14242 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc)
14243 {
14244 uint16_t kmreg;
14245
14246 /* Only for igp3 */
14247 if (sc->sc_phytype == WMPHY_IGP_3) {
14248 if (wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG, &kmreg) != 0)
14249 return;
14250 kmreg |= KUMCTRLSTA_DIAG_NELPBK;
14251 if (wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg) != 0)
14252 return;
14253 kmreg &= ~KUMCTRLSTA_DIAG_NELPBK;
14254 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg);
14255 }
14256 }
14257
14258 /*
14259 * Workaround for pch's PHYs
14260 * XXX should be moved to new PHY driver?
14261 */
14262 static void
14263 wm_hv_phy_workaround_ich8lan(struct wm_softc *sc)
14264 {
14265
14266 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14267 device_xname(sc->sc_dev), __func__));
14268 KASSERT(sc->sc_type == WM_T_PCH);
14269
14270 if (sc->sc_phytype == WMPHY_82577)
14271 wm_set_mdio_slow_mode_hv(sc);
14272
14273 /* (PCH rev.2) && (82577 && (phy rev 2 or 3)) */
14274
14275 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/
14276
14277 /* 82578 */
14278 if (sc->sc_phytype == WMPHY_82578) {
14279 struct mii_softc *child;
14280
14281 /*
14282 * Return registers to default by doing a soft reset then
14283 * writing 0x3140 to the control register
14284 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1
14285 */
14286 child = LIST_FIRST(&sc->sc_mii.mii_phys);
14287 if ((child != NULL) && (child->mii_mpd_rev < 2)) {
14288 PHY_RESET(child);
14289 sc->sc_mii.mii_writereg(sc->sc_dev, 2, MII_BMCR,
14290 0x3140);
14291 }
14292 }
14293
14294 /* Select page 0 */
14295 sc->phy.acquire(sc);
14296 wm_gmii_mdic_writereg(sc->sc_dev, 1, MII_IGPHY_PAGE_SELECT, 0);
14297 sc->phy.release(sc);
14298
14299 /*
14300 * Configure the K1 Si workaround during phy reset assuming there is
14301 * link so that it disables K1 if link is in 1Gbps.
14302 */
14303 wm_k1_gig_workaround_hv(sc, 1);
14304 }
14305
14306 static void
14307 wm_lv_phy_workaround_ich8lan(struct wm_softc *sc)
14308 {
14309
14310 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14311 device_xname(sc->sc_dev), __func__));
14312 KASSERT(sc->sc_type == WM_T_PCH2);
14313
14314 wm_set_mdio_slow_mode_hv(sc);
14315 }
14316
14317 static int
14318 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link)
14319 {
14320 int k1_enable = sc->sc_nvm_k1_enabled;
14321
14322 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14323 device_xname(sc->sc_dev), __func__));
14324
14325 if (sc->phy.acquire(sc) != 0)
14326 return -1;
14327
14328 if (link) {
14329 k1_enable = 0;
14330
14331 /* Link stall fix for link up */
14332 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG,
14333 0x0100);
14334 } else {
14335 /* Link stall fix for link down */
14336 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG,
14337 0x4100);
14338 }
14339
14340 wm_configure_k1_ich8lan(sc, k1_enable);
14341 sc->phy.release(sc);
14342
14343 return 0;
14344 }
14345
14346 static void
14347 wm_set_mdio_slow_mode_hv(struct wm_softc *sc)
14348 {
14349 uint32_t reg;
14350
14351 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL);
14352 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL,
14353 reg | HV_KMRN_MDIO_SLOW);
14354 }
14355
14356 static void
14357 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable)
14358 {
14359 uint32_t ctrl, ctrl_ext, tmp;
14360 uint16_t kmreg;
14361 int rv;
14362
14363 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, &kmreg);
14364 if (rv != 0)
14365 return;
14366
14367 if (k1_enable)
14368 kmreg |= KUMCTRLSTA_K1_ENABLE;
14369 else
14370 kmreg &= ~KUMCTRLSTA_K1_ENABLE;
14371
14372 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmreg);
14373 if (rv != 0)
14374 return;
14375
14376 delay(20);
14377
14378 ctrl = CSR_READ(sc, WMREG_CTRL);
14379 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
14380
14381 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100);
14382 tmp |= CTRL_FRCSPD;
14383
14384 CSR_WRITE(sc, WMREG_CTRL, tmp);
14385 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS);
14386 CSR_WRITE_FLUSH(sc);
14387 delay(20);
14388
14389 CSR_WRITE(sc, WMREG_CTRL, ctrl);
14390 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
14391 CSR_WRITE_FLUSH(sc);
14392 delay(20);
14393
14394 return;
14395 }
14396
14397 /* special case - for 82575 - need to do manual init ... */
14398 static void
14399 wm_reset_init_script_82575(struct wm_softc *sc)
14400 {
14401 /*
14402 * remark: this is untested code - we have no board without EEPROM
14403 * same setup as mentioned int the FreeBSD driver for the i82575
14404 */
14405
14406 /* SerDes configuration via SERDESCTRL */
14407 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c);
14408 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
14409 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23);
14410 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
14411
14412 /* CCM configuration via CCMCTL register */
14413 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
14414 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
14415
14416 /* PCIe lanes configuration */
14417 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec);
14418 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf);
14419 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
14420 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81);
14421
14422 /* PCIe PLL Configuration */
14423 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
14424 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
14425 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
14426 }
14427
14428 static void
14429 wm_reset_mdicnfg_82580(struct wm_softc *sc)
14430 {
14431 uint32_t reg;
14432 uint16_t nvmword;
14433 int rv;
14434
14435 if (sc->sc_type != WM_T_82580)
14436 return;
14437 if ((sc->sc_flags & WM_F_SGMII) == 0)
14438 return;
14439
14440 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid)
14441 + NVM_OFF_CFG3_PORTA, 1, &nvmword);
14442 if (rv != 0) {
14443 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n",
14444 __func__);
14445 return;
14446 }
14447
14448 reg = CSR_READ(sc, WMREG_MDICNFG);
14449 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO)
14450 reg |= MDICNFG_DEST;
14451 if (nvmword & NVM_CFG3_PORTA_COM_MDIO)
14452 reg |= MDICNFG_COM_MDIO;
14453 CSR_WRITE(sc, WMREG_MDICNFG, reg);
14454 }
14455
14456 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff))
14457
14458 static bool
14459 wm_phy_is_accessible_pchlan(struct wm_softc *sc)
14460 {
14461 int i;
14462 uint32_t reg;
14463 uint16_t id1, id2;
14464
14465 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14466 device_xname(sc->sc_dev), __func__));
14467 id1 = id2 = 0xffff;
14468 for (i = 0; i < 2; i++) {
14469 id1 = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1);
14470 if (MII_INVALIDID(id1))
14471 continue;
14472 id2 = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2);
14473 if (MII_INVALIDID(id2))
14474 continue;
14475 break;
14476 }
14477 if (!MII_INVALIDID(id1) && !MII_INVALIDID(id2)) {
14478 goto out;
14479 }
14480
14481 if (sc->sc_type < WM_T_PCH_LPT) {
14482 sc->phy.release(sc);
14483 wm_set_mdio_slow_mode_hv(sc);
14484 id1 = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR1);
14485 id2 = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR2);
14486 sc->phy.acquire(sc);
14487 }
14488 if (MII_INVALIDID(id1) || MII_INVALIDID(id2)) {
14489 printf("XXX return with false\n");
14490 return false;
14491 }
14492 out:
14493 if (sc->sc_type >= WM_T_PCH_LPT) {
14494 /* Only unforce SMBus if ME is not active */
14495 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
14496 /* Unforce SMBus mode in PHY */
14497 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2,
14498 CV_SMB_CTRL);
14499 reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
14500 wm_gmii_hv_writereg_locked(sc->sc_dev, 2,
14501 CV_SMB_CTRL, reg);
14502
14503 /* Unforce SMBus mode in MAC */
14504 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14505 reg &= ~CTRL_EXT_FORCE_SMBUS;
14506 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14507 }
14508 }
14509 return true;
14510 }
14511
14512 static void
14513 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc)
14514 {
14515 uint32_t reg;
14516 int i;
14517
14518 /* Set PHY Config Counter to 50msec */
14519 reg = CSR_READ(sc, WMREG_FEXTNVM3);
14520 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
14521 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
14522 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
14523
14524 /* Toggle LANPHYPC */
14525 reg = CSR_READ(sc, WMREG_CTRL);
14526 reg |= CTRL_LANPHYPC_OVERRIDE;
14527 reg &= ~CTRL_LANPHYPC_VALUE;
14528 CSR_WRITE(sc, WMREG_CTRL, reg);
14529 CSR_WRITE_FLUSH(sc);
14530 delay(1000);
14531 reg &= ~CTRL_LANPHYPC_OVERRIDE;
14532 CSR_WRITE(sc, WMREG_CTRL, reg);
14533 CSR_WRITE_FLUSH(sc);
14534
14535 if (sc->sc_type < WM_T_PCH_LPT)
14536 delay(50 * 1000);
14537 else {
14538 i = 20;
14539
14540 do {
14541 delay(5 * 1000);
14542 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0)
14543 && i--);
14544
14545 delay(30 * 1000);
14546 }
14547 }
14548
14549 static int
14550 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link)
14551 {
14552 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ)
14553 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND;
14554 uint32_t rxa;
14555 uint16_t scale = 0, lat_enc = 0;
14556 int32_t obff_hwm = 0;
14557 int64_t lat_ns, value;
14558
14559 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14560 device_xname(sc->sc_dev), __func__));
14561
14562 if (link) {
14563 uint16_t max_snoop, max_nosnoop, max_ltr_enc;
14564 uint32_t status;
14565 uint16_t speed;
14566 pcireg_t preg;
14567
14568 status = CSR_READ(sc, WMREG_STATUS);
14569 switch (__SHIFTOUT(status, STATUS_SPEED)) {
14570 case STATUS_SPEED_10:
14571 speed = 10;
14572 break;
14573 case STATUS_SPEED_100:
14574 speed = 100;
14575 break;
14576 case STATUS_SPEED_1000:
14577 speed = 1000;
14578 break;
14579 default:
14580 device_printf(sc->sc_dev, "Unknown speed "
14581 "(status = %08x)\n", status);
14582 return -1;
14583 }
14584
14585 /* Rx Packet Buffer Allocation size (KB) */
14586 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK;
14587
14588 /*
14589 * Determine the maximum latency tolerated by the device.
14590 *
14591 * Per the PCIe spec, the tolerated latencies are encoded as
14592 * a 3-bit encoded scale (only 0-5 are valid) multiplied by
14593 * a 10-bit value (0-1023) to provide a range from 1 ns to
14594 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns,
14595 * 1=2^5ns, 2=2^10ns,...5=2^25ns.
14596 */
14597 lat_ns = ((int64_t)rxa * 1024 -
14598 (2 * ((int64_t)sc->sc_ethercom.ec_if.if_mtu
14599 + ETHER_HDR_LEN))) * 8 * 1000;
14600 if (lat_ns < 0)
14601 lat_ns = 0;
14602 else
14603 lat_ns /= speed;
14604 value = lat_ns;
14605
14606 while (value > LTRV_VALUE) {
14607 scale ++;
14608 value = howmany(value, __BIT(5));
14609 }
14610 if (scale > LTRV_SCALE_MAX) {
14611 printf("%s: Invalid LTR latency scale %d\n",
14612 device_xname(sc->sc_dev), scale);
14613 return -1;
14614 }
14615 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value);
14616
14617 /* Determine the maximum latency tolerated by the platform */
14618 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
14619 WM_PCI_LTR_CAP_LPT);
14620 max_snoop = preg & 0xffff;
14621 max_nosnoop = preg >> 16;
14622
14623 max_ltr_enc = MAX(max_snoop, max_nosnoop);
14624
14625 if (lat_enc > max_ltr_enc) {
14626 lat_enc = max_ltr_enc;
14627 lat_ns = __SHIFTOUT(lat_enc, PCI_LTR_MAXSNOOPLAT_VAL)
14628 * PCI_LTR_SCALETONS(
14629 __SHIFTOUT(lat_enc,
14630 PCI_LTR_MAXSNOOPLAT_SCALE));
14631 }
14632
14633 if (lat_ns) {
14634 lat_ns *= speed * 1000;
14635 lat_ns /= 8;
14636 lat_ns /= 1000000000;
14637 obff_hwm = (int32_t)(rxa - lat_ns);
14638 }
14639 if ((obff_hwm < 0) || (obff_hwm > SVT_OFF_HWM)) {
14640 device_printf(sc->sc_dev, "Invalid high water mark %d"
14641 "(rxa = %d, lat_ns = %d)\n",
14642 obff_hwm, (int32_t)rxa, (int32_t)lat_ns);
14643 return -1;
14644 }
14645 }
14646 /* Snoop and No-Snoop latencies the same */
14647 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP);
14648 CSR_WRITE(sc, WMREG_LTRV, reg);
14649
14650 /* Set OBFF high water mark */
14651 reg = CSR_READ(sc, WMREG_SVT) & ~SVT_OFF_HWM;
14652 reg |= obff_hwm;
14653 CSR_WRITE(sc, WMREG_SVT, reg);
14654
14655 /* Enable OBFF */
14656 reg = CSR_READ(sc, WMREG_SVCR);
14657 reg |= SVCR_OFF_EN | SVCR_OFF_MASKINT;
14658 CSR_WRITE(sc, WMREG_SVCR, reg);
14659
14660 return 0;
14661 }
14662
14663 /*
14664 * I210 Errata 25 and I211 Errata 10
14665 * Slow System Clock.
14666 */
14667 static void
14668 wm_pll_workaround_i210(struct wm_softc *sc)
14669 {
14670 uint32_t mdicnfg, wuc;
14671 uint32_t reg;
14672 pcireg_t pcireg;
14673 uint32_t pmreg;
14674 uint16_t nvmword, tmp_nvmword;
14675 int phyval;
14676 bool wa_done = false;
14677 int i;
14678
14679 /* Save WUC and MDICNFG registers */
14680 wuc = CSR_READ(sc, WMREG_WUC);
14681 mdicnfg = CSR_READ(sc, WMREG_MDICNFG);
14682
14683 reg = mdicnfg & ~MDICNFG_DEST;
14684 CSR_WRITE(sc, WMREG_MDICNFG, reg);
14685
14686 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0)
14687 nvmword = INVM_DEFAULT_AL;
14688 tmp_nvmword = nvmword | INVM_PLL_WO_VAL;
14689
14690 /* Get Power Management cap offset */
14691 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
14692 &pmreg, NULL) == 0)
14693 return;
14694 for (i = 0; i < WM_MAX_PLL_TRIES; i++) {
14695 phyval = wm_gmii_gs40g_readreg(sc->sc_dev, 1,
14696 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG);
14697
14698 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) {
14699 break; /* OK */
14700 }
14701
14702 wa_done = true;
14703 /* Directly reset the internal PHY */
14704 reg = CSR_READ(sc, WMREG_CTRL);
14705 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
14706
14707 reg = CSR_READ(sc, WMREG_CTRL_EXT);
14708 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE;
14709 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
14710
14711 CSR_WRITE(sc, WMREG_WUC, 0);
14712 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16);
14713 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
14714
14715 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
14716 pmreg + PCI_PMCSR);
14717 pcireg |= PCI_PMCSR_STATE_D3;
14718 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
14719 pmreg + PCI_PMCSR, pcireg);
14720 delay(1000);
14721 pcireg &= ~PCI_PMCSR_STATE_D3;
14722 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
14723 pmreg + PCI_PMCSR, pcireg);
14724
14725 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16);
14726 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
14727
14728 /* Restore WUC register */
14729 CSR_WRITE(sc, WMREG_WUC, wuc);
14730 }
14731
14732 /* Restore MDICNFG setting */
14733 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg);
14734 if (wa_done)
14735 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n");
14736 }
14737
14738 static void
14739 wm_legacy_irq_quirk_spt(struct wm_softc *sc)
14740 {
14741 uint32_t reg;
14742
14743 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
14744 device_xname(sc->sc_dev), __func__));
14745 KASSERT(sc->sc_type == WM_T_PCH_SPT);
14746
14747 reg = CSR_READ(sc, WMREG_FEXTNVM7);
14748 reg |= FEXTNVM7_SIDE_CLK_UNGATE;
14749 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
14750
14751 reg = CSR_READ(sc, WMREG_FEXTNVM9);
14752 reg |= FEXTNVM9_IOSFSB_CLKGATE_DIS | FEXTNVM9_IOSFSB_CLKREQ_DIS;
14753 CSR_WRITE(sc, WMREG_FEXTNVM9, reg);
14754 }
14755