1 /* $NetBSD: if_wm.c,v 1.715 2021/10/20 08:10:26 msaitoh Exp $ */ 2 3 /* 4 * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Jason R. Thorpe for Wasabi Systems, Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed for the NetBSD Project by 20 * Wasabi Systems, Inc. 21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 * or promote products derived from this software without specific prior 23 * written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 /******************************************************************************* 39 40 Copyright (c) 2001-2005, Intel Corporation 41 All rights reserved. 42 43 Redistribution and use in source and binary forms, with or without 44 modification, are permitted provided that the following conditions are met: 45 46 1. Redistributions of source code must retain the above copyright notice, 47 this list of conditions and the following disclaimer. 48 49 2. Redistributions in binary form must reproduce the above copyright 50 notice, this list of conditions and the following disclaimer in the 51 documentation and/or other materials provided with the distribution. 52 53 3. Neither the name of the Intel Corporation nor the names of its 54 contributors may be used to endorse or promote products derived from 55 this software without specific prior written permission. 56 57 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 58 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 59 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 60 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 61 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 62 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 63 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 64 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 65 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 66 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 67 POSSIBILITY OF SUCH DAMAGE. 68 69 *******************************************************************************/ 70 /* 71 * Device driver for the Intel i8254x family of Gigabit Ethernet chips. 72 * 73 * TODO (in order of importance): 74 * 75 * - Check XXX'ed comments 76 * - TX Multi queue improvement (refine queue selection logic) 77 * - Split header buffer for newer descriptors 78 * - EEE (Energy Efficiency Ethernet) for I354 79 * - Virtual Function 80 * - Set LED correctly (based on contents in EEPROM) 81 * - Rework how parameters are loaded from the EEPROM. 82 */ 83 84 #include <sys/cdefs.h> 85 __KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.715 2021/10/20 08:10:26 msaitoh Exp $"); 86 87 #ifdef _KERNEL_OPT 88 #include "opt_net_mpsafe.h" 89 #include "opt_if_wm.h" 90 #endif 91 92 #include <sys/param.h> 93 #include <sys/systm.h> 94 #include <sys/callout.h> 95 #include <sys/mbuf.h> 96 #include <sys/malloc.h> 97 #include <sys/kmem.h> 98 #include <sys/kernel.h> 99 #include <sys/socket.h> 100 #include <sys/ioctl.h> 101 #include <sys/errno.h> 102 #include <sys/device.h> 103 #include <sys/queue.h> 104 #include <sys/syslog.h> 105 #include <sys/interrupt.h> 106 #include <sys/cpu.h> 107 #include <sys/pcq.h> 108 #include <sys/sysctl.h> 109 #include <sys/workqueue.h> 110 #include <sys/atomic.h> 111 112 #include <sys/rndsource.h> 113 114 #include <net/if.h> 115 #include <net/if_dl.h> 116 #include <net/if_media.h> 117 #include <net/if_ether.h> 118 119 #include <net/bpf.h> 120 121 #include <net/rss_config.h> 122 123 #include <netinet/in.h> /* XXX for struct ip */ 124 #include <netinet/in_systm.h> /* XXX for struct ip */ 125 #include <netinet/ip.h> /* XXX for struct ip */ 126 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */ 127 #include <netinet/tcp.h> /* XXX for struct tcphdr */ 128 129 #include <sys/bus.h> 130 #include <sys/intr.h> 131 #include <machine/endian.h> 132 133 #include <dev/mii/mii.h> 134 #include <dev/mii/mdio.h> 135 #include <dev/mii/miivar.h> 136 #include <dev/mii/miidevs.h> 137 #include <dev/mii/mii_bitbang.h> 138 #include <dev/mii/ikphyreg.h> 139 #include <dev/mii/igphyreg.h> 140 #include <dev/mii/igphyvar.h> 141 #include <dev/mii/inbmphyreg.h> 142 #include <dev/mii/ihphyreg.h> 143 #include <dev/mii/makphyreg.h> 144 145 #include <dev/pci/pcireg.h> 146 #include <dev/pci/pcivar.h> 147 #include <dev/pci/pcidevs.h> 148 149 #include <dev/pci/if_wmreg.h> 150 #include <dev/pci/if_wmvar.h> 151 152 #ifdef WM_DEBUG 153 #define WM_DEBUG_LINK __BIT(0) 154 #define WM_DEBUG_TX __BIT(1) 155 #define WM_DEBUG_RX __BIT(2) 156 #define WM_DEBUG_GMII __BIT(3) 157 #define WM_DEBUG_MANAGE __BIT(4) 158 #define WM_DEBUG_NVM __BIT(5) 159 #define WM_DEBUG_INIT __BIT(6) 160 #define WM_DEBUG_LOCK __BIT(7) 161 162 #if 0 163 #define WM_DEBUG_DEFAULT WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | \ 164 WM_DEBUG_GMII | WM_DEBUG_MANAGE | WM_DEBUG_NVM | WM_DEBUG_INIT | \ 165 WM_DEBUG_LOCK 166 #endif 167 168 #define DPRINTF(sc, x, y) \ 169 do { \ 170 if ((sc)->sc_debug & (x)) \ 171 printf y; \ 172 } while (0) 173 #else 174 #define DPRINTF(sc, x, y) __nothing 175 #endif /* WM_DEBUG */ 176 177 #ifdef NET_MPSAFE 178 #define WM_MPSAFE 1 179 #define WM_CALLOUT_FLAGS CALLOUT_MPSAFE 180 #define WM_SOFTINT_FLAGS SOFTINT_MPSAFE 181 #define WM_WORKQUEUE_FLAGS WQ_PERCPU | WQ_MPSAFE 182 #else 183 #define WM_CALLOUT_FLAGS 0 184 #define WM_SOFTINT_FLAGS 0 185 #define WM_WORKQUEUE_FLAGS WQ_PERCPU 186 #endif 187 188 #define WM_WORKQUEUE_PRI PRI_SOFTNET 189 190 /* 191 * This device driver's max interrupt numbers. 192 */ 193 #define WM_MAX_NQUEUEINTR 16 194 #define WM_MAX_NINTR (WM_MAX_NQUEUEINTR + 1) 195 196 #ifndef WM_DISABLE_MSI 197 #define WM_DISABLE_MSI 0 198 #endif 199 #ifndef WM_DISABLE_MSIX 200 #define WM_DISABLE_MSIX 0 201 #endif 202 203 int wm_disable_msi = WM_DISABLE_MSI; 204 int wm_disable_msix = WM_DISABLE_MSIX; 205 206 #ifndef WM_WATCHDOG_TIMEOUT 207 #define WM_WATCHDOG_TIMEOUT 5 208 #endif 209 static int wm_watchdog_timeout = WM_WATCHDOG_TIMEOUT; 210 211 /* 212 * Transmit descriptor list size. Due to errata, we can only have 213 * 256 hardware descriptors in the ring on < 82544, but we use 4096 214 * on >= 82544. We tell the upper layers that they can queue a lot 215 * of packets, and we go ahead and manage up to 64 (16 for the i82547) 216 * of them at a time. 217 * 218 * We allow up to 64 DMA segments per packet. Pathological packet 219 * chains containing many small mbufs have been observed in zero-copy 220 * situations with jumbo frames. If a mbuf chain has more than 64 DMA segments, 221 * m_defrag() is called to reduce it. 222 */ 223 #define WM_NTXSEGS 64 224 #define WM_IFQUEUELEN 256 225 #define WM_TXQUEUELEN_MAX 64 226 #define WM_TXQUEUELEN_MAX_82547 16 227 #define WM_TXQUEUELEN(txq) ((txq)->txq_num) 228 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1) 229 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8) 230 #define WM_NTXDESC_82542 256 231 #define WM_NTXDESC_82544 4096 232 #define WM_NTXDESC(txq) ((txq)->txq_ndesc) 233 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1) 234 #define WM_TXDESCS_SIZE(txq) (WM_NTXDESC(txq) * (txq)->txq_descsize) 235 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq)) 236 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq)) 237 238 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */ 239 240 #define WM_TXINTERQSIZE 256 241 242 #ifndef WM_TX_PROCESS_LIMIT_DEFAULT 243 #define WM_TX_PROCESS_LIMIT_DEFAULT 100U 244 #endif 245 #ifndef WM_TX_INTR_PROCESS_LIMIT_DEFAULT 246 #define WM_TX_INTR_PROCESS_LIMIT_DEFAULT 0U 247 #endif 248 249 /* 250 * Receive descriptor list size. We have one Rx buffer for normal 251 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized 252 * packet. We allocate 256 receive descriptors, each with a 2k 253 * buffer (MCLBYTES), which gives us room for 50 jumbo packets. 254 */ 255 #define WM_NRXDESC 256U 256 #define WM_NRXDESC_MASK (WM_NRXDESC - 1) 257 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK) 258 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK) 259 260 #ifndef WM_RX_PROCESS_LIMIT_DEFAULT 261 #define WM_RX_PROCESS_LIMIT_DEFAULT 100U 262 #endif 263 #ifndef WM_RX_INTR_PROCESS_LIMIT_DEFAULT 264 #define WM_RX_INTR_PROCESS_LIMIT_DEFAULT 0U 265 #endif 266 267 typedef union txdescs { 268 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544]; 269 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544]; 270 } txdescs_t; 271 272 typedef union rxdescs { 273 wiseman_rxdesc_t sctxu_rxdescs[WM_NRXDESC]; 274 ext_rxdesc_t sctxu_ext_rxdescs[WM_NRXDESC]; /* 82574 only */ 275 nq_rxdesc_t sctxu_nq_rxdescs[WM_NRXDESC]; /* 82575 and newer */ 276 } rxdescs_t; 277 278 #define WM_CDTXOFF(txq, x) ((txq)->txq_descsize * (x)) 279 #define WM_CDRXOFF(rxq, x) ((rxq)->rxq_descsize * (x)) 280 281 /* 282 * Software state for transmit jobs. 283 */ 284 struct wm_txsoft { 285 struct mbuf *txs_mbuf; /* head of our mbuf chain */ 286 bus_dmamap_t txs_dmamap; /* our DMA map */ 287 int txs_firstdesc; /* first descriptor in packet */ 288 int txs_lastdesc; /* last descriptor in packet */ 289 int txs_ndesc; /* # of descriptors used */ 290 }; 291 292 /* 293 * Software state for receive buffers. Each descriptor gets a 2k (MCLBYTES) 294 * buffer and a DMA map. For packets which fill more than one buffer, we chain 295 * them together. 296 */ 297 struct wm_rxsoft { 298 struct mbuf *rxs_mbuf; /* head of our mbuf chain */ 299 bus_dmamap_t rxs_dmamap; /* our DMA map */ 300 }; 301 302 #define WM_LINKUP_TIMEOUT 50 303 304 static uint16_t swfwphysem[] = { 305 SWFW_PHY0_SM, 306 SWFW_PHY1_SM, 307 SWFW_PHY2_SM, 308 SWFW_PHY3_SM 309 }; 310 311 static const uint32_t wm_82580_rxpbs_table[] = { 312 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140 313 }; 314 315 struct wm_softc; 316 317 #if defined(_LP64) && !defined(WM_DISABLE_EVENT_COUNTERS) 318 #if !defined(WM_EVENT_COUNTERS) 319 #define WM_EVENT_COUNTERS 1 320 #endif 321 #endif 322 323 #ifdef WM_EVENT_COUNTERS 324 #define WM_Q_EVCNT_DEFINE(qname, evname) \ 325 char qname##_##evname##_evcnt_name[sizeof("qname##XX##evname")]; \ 326 struct evcnt qname##_ev_##evname; 327 328 #define WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, evtype) \ 329 do { \ 330 snprintf((q)->qname##_##evname##_evcnt_name, \ 331 sizeof((q)->qname##_##evname##_evcnt_name), \ 332 "%s%02d%s", #qname, (qnum), #evname); \ 333 evcnt_attach_dynamic(&(q)->qname##_ev_##evname, \ 334 (evtype), NULL, (xname), \ 335 (q)->qname##_##evname##_evcnt_name); \ 336 } while (0) 337 338 #define WM_Q_MISC_EVCNT_ATTACH(qname, evname, q, qnum, xname) \ 339 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_MISC) 340 341 #define WM_Q_INTR_EVCNT_ATTACH(qname, evname, q, qnum, xname) \ 342 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_INTR) 343 344 #define WM_Q_EVCNT_DETACH(qname, evname, q, qnum) \ 345 evcnt_detach(&(q)->qname##_ev_##evname); 346 #endif /* WM_EVENT_COUNTERS */ 347 348 struct wm_txqueue { 349 kmutex_t *txq_lock; /* lock for tx operations */ 350 351 struct wm_softc *txq_sc; /* shortcut (skip struct wm_queue) */ 352 353 /* Software state for the transmit descriptors. */ 354 int txq_num; /* must be a power of two */ 355 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX]; 356 357 /* TX control data structures. */ 358 int txq_ndesc; /* must be a power of two */ 359 size_t txq_descsize; /* a tx descriptor size */ 360 txdescs_t *txq_descs_u; 361 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */ 362 bus_dma_segment_t txq_desc_seg; /* control data segment */ 363 int txq_desc_rseg; /* real number of control segment */ 364 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr 365 #define txq_descs txq_descs_u->sctxu_txdescs 366 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs 367 368 bus_addr_t txq_tdt_reg; /* offset of TDT register */ 369 370 int txq_free; /* number of free Tx descriptors */ 371 int txq_next; /* next ready Tx descriptor */ 372 373 int txq_sfree; /* number of free Tx jobs */ 374 int txq_snext; /* next free Tx job */ 375 int txq_sdirty; /* dirty Tx jobs */ 376 377 /* These 4 variables are used only on the 82547. */ 378 int txq_fifo_size; /* Tx FIFO size */ 379 int txq_fifo_head; /* current head of FIFO */ 380 uint32_t txq_fifo_addr; /* internal address of start of FIFO */ 381 int txq_fifo_stall; /* Tx FIFO is stalled */ 382 383 /* 384 * When ncpu > number of Tx queues, a Tx queue is shared by multiple 385 * CPUs. This queue intermediate them without block. 386 */ 387 pcq_t *txq_interq; 388 389 /* 390 * NEWQUEUE devices must use not ifp->if_flags but txq->txq_flags 391 * to manage Tx H/W queue's busy flag. 392 */ 393 int txq_flags; /* flags for H/W queue, see below */ 394 #define WM_TXQ_NO_SPACE 0x1 395 #define WM_TXQ_LINKDOWN_DISCARD 0x2 396 397 bool txq_stopping; 398 399 bool txq_sending; 400 time_t txq_lastsent; 401 402 /* Checksum flags used for previous packet */ 403 uint32_t txq_last_hw_cmd; 404 uint8_t txq_last_hw_fields; 405 uint16_t txq_last_hw_ipcs; 406 uint16_t txq_last_hw_tucs; 407 408 uint32_t txq_packets; /* for AIM */ 409 uint32_t txq_bytes; /* for AIM */ 410 #ifdef WM_EVENT_COUNTERS 411 /* TX event counters */ 412 WM_Q_EVCNT_DEFINE(txq, txsstall) /* Stalled due to no txs */ 413 WM_Q_EVCNT_DEFINE(txq, txdstall) /* Stalled due to no txd */ 414 WM_Q_EVCNT_DEFINE(txq, fifo_stall) /* FIFO stalls (82547) */ 415 WM_Q_EVCNT_DEFINE(txq, txdw) /* Tx descriptor interrupts */ 416 WM_Q_EVCNT_DEFINE(txq, txqe) /* Tx queue empty interrupts */ 417 /* XXX not used? */ 418 419 WM_Q_EVCNT_DEFINE(txq, ipsum) /* IP checksums comp. */ 420 WM_Q_EVCNT_DEFINE(txq, tusum) /* TCP/UDP cksums comp. */ 421 WM_Q_EVCNT_DEFINE(txq, tusum6) /* TCP/UDP v6 cksums comp. */ 422 WM_Q_EVCNT_DEFINE(txq, tso) /* TCP seg offload (IPv4) */ 423 WM_Q_EVCNT_DEFINE(txq, tso6) /* TCP seg offload (IPv6) */ 424 WM_Q_EVCNT_DEFINE(txq, tsopain) /* Painful header manip. for TSO */ 425 WM_Q_EVCNT_DEFINE(txq, pcqdrop) /* Pkt dropped in pcq */ 426 WM_Q_EVCNT_DEFINE(txq, descdrop) /* Pkt dropped in MAC desc ring */ 427 /* other than toomanyseg */ 428 429 WM_Q_EVCNT_DEFINE(txq, toomanyseg) /* Pkt dropped(toomany DMA segs) */ 430 WM_Q_EVCNT_DEFINE(txq, defrag) /* m_defrag() */ 431 WM_Q_EVCNT_DEFINE(txq, underrun) /* Tx underrun */ 432 WM_Q_EVCNT_DEFINE(txq, skipcontext) /* Tx skip wring cksum context */ 433 434 char txq_txseg_evcnt_names[WM_NTXSEGS][sizeof("txqXXtxsegXXX")]; 435 struct evcnt txq_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */ 436 #endif /* WM_EVENT_COUNTERS */ 437 }; 438 439 struct wm_rxqueue { 440 kmutex_t *rxq_lock; /* lock for rx operations */ 441 442 struct wm_softc *rxq_sc; /* shortcut (skip struct wm_queue) */ 443 444 /* Software state for the receive descriptors. */ 445 struct wm_rxsoft rxq_soft[WM_NRXDESC]; 446 447 /* RX control data structures. */ 448 int rxq_ndesc; /* must be a power of two */ 449 size_t rxq_descsize; /* a rx descriptor size */ 450 rxdescs_t *rxq_descs_u; 451 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */ 452 bus_dma_segment_t rxq_desc_seg; /* control data segment */ 453 int rxq_desc_rseg; /* real number of control segment */ 454 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr 455 #define rxq_descs rxq_descs_u->sctxu_rxdescs 456 #define rxq_ext_descs rxq_descs_u->sctxu_ext_rxdescs 457 #define rxq_nq_descs rxq_descs_u->sctxu_nq_rxdescs 458 459 bus_addr_t rxq_rdt_reg; /* offset of RDT register */ 460 461 int rxq_ptr; /* next ready Rx desc/queue ent */ 462 int rxq_discard; 463 int rxq_len; 464 struct mbuf *rxq_head; 465 struct mbuf *rxq_tail; 466 struct mbuf **rxq_tailp; 467 468 bool rxq_stopping; 469 470 uint32_t rxq_packets; /* for AIM */ 471 uint32_t rxq_bytes; /* for AIM */ 472 #ifdef WM_EVENT_COUNTERS 473 /* RX event counters */ 474 WM_Q_EVCNT_DEFINE(rxq, intr); /* Interrupts */ 475 WM_Q_EVCNT_DEFINE(rxq, defer); /* Rx deferred processing */ 476 477 WM_Q_EVCNT_DEFINE(rxq, ipsum); /* IP checksums checked */ 478 WM_Q_EVCNT_DEFINE(rxq, tusum); /* TCP/UDP cksums checked */ 479 #endif 480 }; 481 482 struct wm_queue { 483 int wmq_id; /* index of TX/RX queues */ 484 int wmq_intr_idx; /* index of MSI-X tables */ 485 486 uint32_t wmq_itr; /* interrupt interval per queue. */ 487 bool wmq_set_itr; 488 489 struct wm_txqueue wmq_txq; 490 struct wm_rxqueue wmq_rxq; 491 char sysctlname[32]; /* Name for sysctl */ 492 493 bool wmq_txrx_use_workqueue; 494 struct work wmq_cookie; 495 void *wmq_si; 496 }; 497 498 struct wm_phyop { 499 int (*acquire)(struct wm_softc *); 500 void (*release)(struct wm_softc *); 501 int (*readreg_locked)(device_t, int, int, uint16_t *); 502 int (*writereg_locked)(device_t, int, int, uint16_t); 503 int reset_delay_us; 504 bool no_errprint; 505 }; 506 507 struct wm_nvmop { 508 int (*acquire)(struct wm_softc *); 509 void (*release)(struct wm_softc *); 510 int (*read)(struct wm_softc *, int, int, uint16_t *); 511 }; 512 513 /* 514 * Software state per device. 515 */ 516 struct wm_softc { 517 device_t sc_dev; /* generic device information */ 518 bus_space_tag_t sc_st; /* bus space tag */ 519 bus_space_handle_t sc_sh; /* bus space handle */ 520 bus_size_t sc_ss; /* bus space size */ 521 bus_space_tag_t sc_iot; /* I/O space tag */ 522 bus_space_handle_t sc_ioh; /* I/O space handle */ 523 bus_size_t sc_ios; /* I/O space size */ 524 bus_space_tag_t sc_flasht; /* flash registers space tag */ 525 bus_space_handle_t sc_flashh; /* flash registers space handle */ 526 bus_size_t sc_flashs; /* flash registers space size */ 527 off_t sc_flashreg_offset; /* 528 * offset to flash registers from 529 * start of BAR 530 */ 531 bus_dma_tag_t sc_dmat; /* bus DMA tag */ 532 533 struct ethercom sc_ethercom; /* ethernet common data */ 534 struct mii_data sc_mii; /* MII/media information */ 535 536 pci_chipset_tag_t sc_pc; 537 pcitag_t sc_pcitag; 538 int sc_bus_speed; /* PCI/PCIX bus speed */ 539 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */ 540 541 uint16_t sc_pcidevid; /* PCI device ID */ 542 wm_chip_type sc_type; /* MAC type */ 543 int sc_rev; /* MAC revision */ 544 wm_phy_type sc_phytype; /* PHY type */ 545 uint8_t sc_sfptype; /* SFP type */ 546 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/ 547 #define WM_MEDIATYPE_UNKNOWN 0x00 548 #define WM_MEDIATYPE_FIBER 0x01 549 #define WM_MEDIATYPE_COPPER 0x02 550 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */ 551 int sc_funcid; /* unit number of the chip (0 to 3) */ 552 int sc_flags; /* flags; see below */ 553 u_short sc_if_flags; /* last if_flags */ 554 int sc_ec_capenable; /* last ec_capenable */ 555 int sc_flowflags; /* 802.3x flow control flags */ 556 uint16_t eee_lp_ability; /* EEE link partner's ability */ 557 int sc_align_tweak; 558 559 void *sc_ihs[WM_MAX_NINTR]; /* 560 * interrupt cookie. 561 * - legacy and msi use sc_ihs[0] only 562 * - msix use sc_ihs[0] to sc_ihs[nintrs-1] 563 */ 564 pci_intr_handle_t *sc_intrs; /* 565 * legacy and msi use sc_intrs[0] only 566 * msix use sc_intrs[0] to sc_ihs[nintrs-1] 567 */ 568 int sc_nintrs; /* number of interrupts */ 569 570 int sc_link_intr_idx; /* index of MSI-X tables */ 571 572 callout_t sc_tick_ch; /* tick callout */ 573 bool sc_core_stopping; 574 575 int sc_nvm_ver_major; 576 int sc_nvm_ver_minor; 577 int sc_nvm_ver_build; 578 int sc_nvm_addrbits; /* NVM address bits */ 579 unsigned int sc_nvm_wordsize; /* NVM word size */ 580 int sc_ich8_flash_base; 581 int sc_ich8_flash_bank_size; 582 int sc_nvm_k1_enabled; 583 584 int sc_nqueues; 585 struct wm_queue *sc_queue; 586 u_int sc_tx_process_limit; /* Tx proc. repeat limit in softint */ 587 u_int sc_tx_intr_process_limit; /* Tx proc. repeat limit in H/W intr */ 588 u_int sc_rx_process_limit; /* Rx proc. repeat limit in softint */ 589 u_int sc_rx_intr_process_limit; /* Rx proc. repeat limit in H/W intr */ 590 struct workqueue *sc_queue_wq; 591 bool sc_txrx_use_workqueue; 592 593 int sc_affinity_offset; 594 595 #ifdef WM_EVENT_COUNTERS 596 /* Event counters. */ 597 struct evcnt sc_ev_linkintr; /* Link interrupts */ 598 599 /* WM_T_82542_2_1 only */ 600 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */ 601 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */ 602 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */ 603 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */ 604 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */ 605 #endif /* WM_EVENT_COUNTERS */ 606 607 struct sysctllog *sc_sysctllog; 608 609 /* This variable are used only on the 82547. */ 610 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */ 611 612 uint32_t sc_ctrl; /* prototype CTRL register */ 613 #if 0 614 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */ 615 #endif 616 uint32_t sc_icr; /* prototype interrupt bits */ 617 uint32_t sc_itr_init; /* prototype intr throttling reg */ 618 uint32_t sc_tctl; /* prototype TCTL register */ 619 uint32_t sc_rctl; /* prototype RCTL register */ 620 uint32_t sc_txcw; /* prototype TXCW register */ 621 uint32_t sc_tipg; /* prototype TIPG register */ 622 uint32_t sc_fcrtl; /* prototype FCRTL register */ 623 uint32_t sc_pba; /* prototype PBA register */ 624 625 int sc_tbi_linkup; /* TBI link status */ 626 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */ 627 int sc_tbi_serdes_ticks; /* tbi ticks */ 628 629 int sc_mchash_type; /* multicast filter offset */ 630 631 krndsource_t rnd_source; /* random source */ 632 633 struct if_percpuq *sc_ipq; /* softint-based input queues */ 634 635 kmutex_t *sc_core_lock; /* lock for softc operations */ 636 kmutex_t *sc_ich_phymtx; /* 637 * 82574/82583/ICH/PCH specific PHY 638 * mutex. For 82574/82583, the mutex 639 * is used for both PHY and NVM. 640 */ 641 kmutex_t *sc_ich_nvmmtx; /* ICH/PCH specific NVM mutex */ 642 643 struct wm_phyop phy; 644 struct wm_nvmop nvm; 645 #ifdef WM_DEBUG 646 uint32_t sc_debug; 647 #endif 648 }; 649 650 #define WM_CORE_LOCK(_sc) \ 651 if ((_sc)->sc_core_lock) mutex_enter((_sc)->sc_core_lock) 652 #define WM_CORE_UNLOCK(_sc) \ 653 if ((_sc)->sc_core_lock) mutex_exit((_sc)->sc_core_lock) 654 #define WM_CORE_LOCKED(_sc) \ 655 (!(_sc)->sc_core_lock || mutex_owned((_sc)->sc_core_lock)) 656 657 #define WM_RXCHAIN_RESET(rxq) \ 658 do { \ 659 (rxq)->rxq_tailp = &(rxq)->rxq_head; \ 660 *(rxq)->rxq_tailp = NULL; \ 661 (rxq)->rxq_len = 0; \ 662 } while (/*CONSTCOND*/0) 663 664 #define WM_RXCHAIN_LINK(rxq, m) \ 665 do { \ 666 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \ 667 (rxq)->rxq_tailp = &(m)->m_next; \ 668 } while (/*CONSTCOND*/0) 669 670 #ifdef WM_EVENT_COUNTERS 671 #ifdef __HAVE_ATOMIC64_LOADSTORE 672 #define WM_EVCNT_INCR(ev) \ 673 atomic_store_relaxed(&((ev)->ev_count), \ 674 atomic_load_relaxed(&(ev)->ev_count) + 1) 675 #define WM_EVCNT_ADD(ev, val) \ 676 atomic_store_relaxed(&((ev)->ev_count), \ 677 atomic_load_relaxed(&(ev)->ev_count) + (val)) 678 #else 679 #define WM_EVCNT_INCR(ev) \ 680 ((ev)->ev_count)++ 681 #define WM_EVCNT_ADD(ev, val) \ 682 (ev)->ev_count += (val) 683 #endif 684 685 #define WM_Q_EVCNT_INCR(qname, evname) \ 686 WM_EVCNT_INCR(&(qname)->qname##_ev_##evname) 687 #define WM_Q_EVCNT_ADD(qname, evname, val) \ 688 WM_EVCNT_ADD(&(qname)->qname##_ev_##evname, (val)) 689 #else /* !WM_EVENT_COUNTERS */ 690 #define WM_EVCNT_INCR(ev) /* nothing */ 691 #define WM_EVCNT_ADD(ev, val) /* nothing */ 692 693 #define WM_Q_EVCNT_INCR(qname, evname) /* nothing */ 694 #define WM_Q_EVCNT_ADD(qname, evname, val) /* nothing */ 695 #endif /* !WM_EVENT_COUNTERS */ 696 697 #define CSR_READ(sc, reg) \ 698 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 699 #define CSR_WRITE(sc, reg, val) \ 700 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 701 #define CSR_WRITE_FLUSH(sc) \ 702 (void)CSR_READ((sc), WMREG_STATUS) 703 704 #define ICH8_FLASH_READ32(sc, reg) \ 705 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, \ 706 (reg) + sc->sc_flashreg_offset) 707 #define ICH8_FLASH_WRITE32(sc, reg, data) \ 708 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, \ 709 (reg) + sc->sc_flashreg_offset, (data)) 710 711 #define ICH8_FLASH_READ16(sc, reg) \ 712 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, \ 713 (reg) + sc->sc_flashreg_offset) 714 #define ICH8_FLASH_WRITE16(sc, reg, data) \ 715 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, \ 716 (reg) + sc->sc_flashreg_offset, (data)) 717 718 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((txq), (x))) 719 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((rxq), (x))) 720 721 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU) 722 #define WM_CDTXADDR_HI(txq, x) \ 723 (sizeof(bus_addr_t) == 8 ? \ 724 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0) 725 726 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU) 727 #define WM_CDRXADDR_HI(rxq, x) \ 728 (sizeof(bus_addr_t) == 8 ? \ 729 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0) 730 731 /* 732 * Register read/write functions. 733 * Other than CSR_{READ|WRITE}(). 734 */ 735 #if 0 736 static inline uint32_t wm_io_read(struct wm_softc *, int); 737 #endif 738 static inline void wm_io_write(struct wm_softc *, int, uint32_t); 739 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t, 740 uint32_t, uint32_t); 741 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t); 742 743 /* 744 * Descriptor sync/init functions. 745 */ 746 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int); 747 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int); 748 static inline void wm_init_rxdesc(struct wm_rxqueue *, int); 749 750 /* 751 * Device driver interface functions and commonly used functions. 752 * match, attach, detach, init, start, stop, ioctl, watchdog and so on. 753 */ 754 static const struct wm_product *wm_lookup(const struct pci_attach_args *); 755 static int wm_match(device_t, cfdata_t, void *); 756 static void wm_attach(device_t, device_t, void *); 757 static int wm_detach(device_t, int); 758 static bool wm_suspend(device_t, const pmf_qual_t *); 759 static bool wm_resume(device_t, const pmf_qual_t *); 760 static void wm_watchdog(struct ifnet *); 761 static void wm_watchdog_txq(struct ifnet *, struct wm_txqueue *, 762 uint16_t *); 763 static void wm_watchdog_txq_locked(struct ifnet *, struct wm_txqueue *, 764 uint16_t *); 765 static void wm_tick(void *); 766 static int wm_ifflags_cb(struct ethercom *); 767 static int wm_ioctl(struct ifnet *, u_long, void *); 768 /* MAC address related */ 769 static uint16_t wm_check_alt_mac_addr(struct wm_softc *); 770 static int wm_read_mac_addr(struct wm_softc *, uint8_t *); 771 static void wm_set_ral(struct wm_softc *, const uint8_t *, int); 772 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *); 773 static int wm_rar_count(struct wm_softc *); 774 static void wm_set_filter(struct wm_softc *); 775 /* Reset and init related */ 776 static void wm_set_vlan(struct wm_softc *); 777 static void wm_set_pcie_completion_timeout(struct wm_softc *); 778 static void wm_get_auto_rd_done(struct wm_softc *); 779 static void wm_lan_init_done(struct wm_softc *); 780 static void wm_get_cfg_done(struct wm_softc *); 781 static int wm_phy_post_reset(struct wm_softc *); 782 static int wm_write_smbus_addr(struct wm_softc *); 783 static int wm_init_lcd_from_nvm(struct wm_softc *); 784 static int wm_oem_bits_config_ich8lan(struct wm_softc *, bool); 785 static void wm_initialize_hardware_bits(struct wm_softc *); 786 static uint32_t wm_rxpbs_adjust_82580(uint32_t); 787 static int wm_reset_phy(struct wm_softc *); 788 static void wm_flush_desc_rings(struct wm_softc *); 789 static void wm_reset(struct wm_softc *); 790 static int wm_add_rxbuf(struct wm_rxqueue *, int); 791 static void wm_rxdrain(struct wm_rxqueue *); 792 static void wm_init_rss(struct wm_softc *); 793 static void wm_adjust_qnum(struct wm_softc *, int); 794 static inline bool wm_is_using_msix(struct wm_softc *); 795 static inline bool wm_is_using_multiqueue(struct wm_softc *); 796 static int wm_softint_establish_queue(struct wm_softc *, int, int); 797 static int wm_setup_legacy(struct wm_softc *); 798 static int wm_setup_msix(struct wm_softc *); 799 static int wm_init(struct ifnet *); 800 static int wm_init_locked(struct ifnet *); 801 static void wm_init_sysctls(struct wm_softc *); 802 static void wm_unset_stopping_flags(struct wm_softc *); 803 static void wm_set_stopping_flags(struct wm_softc *); 804 static void wm_stop(struct ifnet *, int); 805 static void wm_stop_locked(struct ifnet *, bool, bool); 806 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *); 807 static void wm_82547_txfifo_stall(void *); 808 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *); 809 static void wm_itrs_writereg(struct wm_softc *, struct wm_queue *); 810 /* DMA related */ 811 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *); 812 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *); 813 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *); 814 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *, 815 struct wm_txqueue *); 816 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *); 817 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *); 818 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *, 819 struct wm_rxqueue *); 820 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *); 821 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *); 822 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *); 823 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 824 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 825 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 826 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *, 827 struct wm_txqueue *); 828 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *, 829 struct wm_rxqueue *); 830 static int wm_alloc_txrx_queues(struct wm_softc *); 831 static void wm_free_txrx_queues(struct wm_softc *); 832 static int wm_init_txrx_queues(struct wm_softc *); 833 /* Start */ 834 static void wm_tx_offload(struct wm_softc *, struct wm_txqueue *, 835 struct wm_txsoft *, uint32_t *, uint8_t *); 836 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *); 837 static void wm_start(struct ifnet *); 838 static void wm_start_locked(struct ifnet *); 839 static int wm_transmit(struct ifnet *, struct mbuf *); 840 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *); 841 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *, 842 bool); 843 static void wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *, 844 struct wm_txsoft *, uint32_t *, uint32_t *, bool *); 845 static void wm_nq_start(struct ifnet *); 846 static void wm_nq_start_locked(struct ifnet *); 847 static int wm_nq_transmit(struct ifnet *, struct mbuf *); 848 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *); 849 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *, 850 bool); 851 static void wm_deferred_start_locked(struct wm_txqueue *); 852 static void wm_handle_queue(void *); 853 static void wm_handle_queue_work(struct work *, void *); 854 /* Interrupt */ 855 static bool wm_txeof(struct wm_txqueue *, u_int); 856 static bool wm_rxeof(struct wm_rxqueue *, u_int); 857 static void wm_linkintr_gmii(struct wm_softc *, uint32_t); 858 static void wm_linkintr_tbi(struct wm_softc *, uint32_t); 859 static void wm_linkintr_serdes(struct wm_softc *, uint32_t); 860 static void wm_linkintr(struct wm_softc *, uint32_t); 861 static int wm_intr_legacy(void *); 862 static inline void wm_txrxintr_disable(struct wm_queue *); 863 static inline void wm_txrxintr_enable(struct wm_queue *); 864 static void wm_itrs_calculate(struct wm_softc *, struct wm_queue *); 865 static int wm_txrxintr_msix(void *); 866 static int wm_linkintr_msix(void *); 867 868 /* 869 * Media related. 870 * GMII, SGMII, TBI, SERDES and SFP. 871 */ 872 /* Common */ 873 static void wm_tbi_serdes_set_linkled(struct wm_softc *); 874 /* GMII related */ 875 static void wm_gmii_reset(struct wm_softc *); 876 static void wm_gmii_setup_phytype(struct wm_softc *, uint32_t, uint16_t); 877 static int wm_get_phy_id_82575(struct wm_softc *); 878 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t); 879 static int wm_gmii_mediachange(struct ifnet *); 880 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *); 881 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int); 882 static uint16_t wm_i82543_mii_recvbits(struct wm_softc *); 883 static int wm_gmii_i82543_readreg(device_t, int, int, uint16_t *); 884 static int wm_gmii_i82543_writereg(device_t, int, int, uint16_t); 885 static int wm_gmii_mdic_readreg(device_t, int, int, uint16_t *); 886 static int wm_gmii_mdic_writereg(device_t, int, int, uint16_t); 887 static int wm_gmii_i82544_readreg(device_t, int, int, uint16_t *); 888 static int wm_gmii_i82544_readreg_locked(device_t, int, int, uint16_t *); 889 static int wm_gmii_i82544_writereg(device_t, int, int, uint16_t); 890 static int wm_gmii_i82544_writereg_locked(device_t, int, int, uint16_t); 891 static int wm_gmii_i80003_readreg(device_t, int, int, uint16_t *); 892 static int wm_gmii_i80003_writereg(device_t, int, int, uint16_t); 893 static int wm_gmii_bm_readreg(device_t, int, int, uint16_t *); 894 static int wm_gmii_bm_writereg(device_t, int, int, uint16_t); 895 static int wm_enable_phy_wakeup_reg_access_bm(device_t, uint16_t *); 896 static int wm_disable_phy_wakeup_reg_access_bm(device_t, uint16_t *); 897 static int wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int, 898 bool); 899 static int wm_gmii_hv_readreg(device_t, int, int, uint16_t *); 900 static int wm_gmii_hv_readreg_locked(device_t, int, int, uint16_t *); 901 static int wm_gmii_hv_writereg(device_t, int, int, uint16_t); 902 static int wm_gmii_hv_writereg_locked(device_t, int, int, uint16_t); 903 static int wm_gmii_82580_readreg(device_t, int, int, uint16_t *); 904 static int wm_gmii_82580_writereg(device_t, int, int, uint16_t); 905 static int wm_gmii_gs40g_readreg(device_t, int, int, uint16_t *); 906 static int wm_gmii_gs40g_writereg(device_t, int, int, uint16_t); 907 static void wm_gmii_statchg(struct ifnet *); 908 /* 909 * kumeran related (80003, ICH* and PCH*). 910 * These functions are not for accessing MII registers but for accessing 911 * kumeran specific registers. 912 */ 913 static int wm_kmrn_readreg(struct wm_softc *, int, uint16_t *); 914 static int wm_kmrn_readreg_locked(struct wm_softc *, int, uint16_t *); 915 static int wm_kmrn_writereg(struct wm_softc *, int, uint16_t); 916 static int wm_kmrn_writereg_locked(struct wm_softc *, int, uint16_t); 917 /* EMI register related */ 918 static int wm_access_emi_reg_locked(device_t, int, uint16_t *, bool); 919 static int wm_read_emi_reg_locked(device_t, int, uint16_t *); 920 static int wm_write_emi_reg_locked(device_t, int, uint16_t); 921 /* SGMII */ 922 static bool wm_sgmii_uses_mdio(struct wm_softc *); 923 static void wm_sgmii_sfp_preconfig(struct wm_softc *); 924 static int wm_sgmii_readreg(device_t, int, int, uint16_t *); 925 static int wm_sgmii_readreg_locked(device_t, int, int, uint16_t *); 926 static int wm_sgmii_writereg(device_t, int, int, uint16_t); 927 static int wm_sgmii_writereg_locked(device_t, int, int, uint16_t); 928 /* TBI related */ 929 static bool wm_tbi_havesignal(struct wm_softc *, uint32_t); 930 static void wm_tbi_mediainit(struct wm_softc *); 931 static int wm_tbi_mediachange(struct ifnet *); 932 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *); 933 static int wm_check_for_link(struct wm_softc *); 934 static void wm_tbi_tick(struct wm_softc *); 935 /* SERDES related */ 936 static void wm_serdes_power_up_link_82575(struct wm_softc *); 937 static int wm_serdes_mediachange(struct ifnet *); 938 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *); 939 static void wm_serdes_tick(struct wm_softc *); 940 /* SFP related */ 941 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *); 942 static uint32_t wm_sfp_get_media_type(struct wm_softc *); 943 944 /* 945 * NVM related. 946 * Microwire, SPI (w/wo EERD) and Flash. 947 */ 948 /* Misc functions */ 949 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int); 950 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int); 951 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *); 952 /* Microwire */ 953 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *); 954 /* SPI */ 955 static int wm_nvm_ready_spi(struct wm_softc *); 956 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *); 957 /* Using with EERD */ 958 static int wm_poll_eerd_eewr_done(struct wm_softc *, int); 959 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *); 960 /* Flash */ 961 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *, 962 unsigned int *); 963 static int32_t wm_ich8_cycle_init(struct wm_softc *); 964 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t); 965 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t, 966 uint32_t *); 967 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *); 968 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *); 969 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *); 970 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *); 971 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *); 972 /* iNVM */ 973 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *); 974 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *); 975 /* Lock, detecting NVM type, validate checksum and read */ 976 static int wm_nvm_is_onboard_eeprom(struct wm_softc *); 977 static int wm_nvm_flash_presence_i210(struct wm_softc *); 978 static int wm_nvm_validate_checksum(struct wm_softc *); 979 static void wm_nvm_version_invm(struct wm_softc *); 980 static void wm_nvm_version(struct wm_softc *); 981 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *); 982 983 /* 984 * Hardware semaphores. 985 * Very complexed... 986 */ 987 static int wm_get_null(struct wm_softc *); 988 static void wm_put_null(struct wm_softc *); 989 static int wm_get_eecd(struct wm_softc *); 990 static void wm_put_eecd(struct wm_softc *); 991 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */ 992 static void wm_put_swsm_semaphore(struct wm_softc *); 993 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t); 994 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t); 995 static int wm_get_nvm_80003(struct wm_softc *); 996 static void wm_put_nvm_80003(struct wm_softc *); 997 static int wm_get_nvm_82571(struct wm_softc *); 998 static void wm_put_nvm_82571(struct wm_softc *); 999 static int wm_get_phy_82575(struct wm_softc *); 1000 static void wm_put_phy_82575(struct wm_softc *); 1001 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */ 1002 static void wm_put_swfwhw_semaphore(struct wm_softc *); 1003 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */ 1004 static void wm_put_swflag_ich8lan(struct wm_softc *); 1005 static int wm_get_nvm_ich8lan(struct wm_softc *); 1006 static void wm_put_nvm_ich8lan(struct wm_softc *); 1007 static int wm_get_hw_semaphore_82573(struct wm_softc *); 1008 static void wm_put_hw_semaphore_82573(struct wm_softc *); 1009 1010 /* 1011 * Management mode and power management related subroutines. 1012 * BMC, AMT, suspend/resume and EEE. 1013 */ 1014 #if 0 1015 static int wm_check_mng_mode(struct wm_softc *); 1016 static int wm_check_mng_mode_ich8lan(struct wm_softc *); 1017 static int wm_check_mng_mode_82574(struct wm_softc *); 1018 static int wm_check_mng_mode_generic(struct wm_softc *); 1019 #endif 1020 static int wm_enable_mng_pass_thru(struct wm_softc *); 1021 static bool wm_phy_resetisblocked(struct wm_softc *); 1022 static void wm_get_hw_control(struct wm_softc *); 1023 static void wm_release_hw_control(struct wm_softc *); 1024 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool); 1025 static int wm_init_phy_workarounds_pchlan(struct wm_softc *); 1026 static void wm_init_manageability(struct wm_softc *); 1027 static void wm_release_manageability(struct wm_softc *); 1028 static void wm_get_wakeup(struct wm_softc *); 1029 static int wm_ulp_disable(struct wm_softc *); 1030 static int wm_enable_phy_wakeup(struct wm_softc *); 1031 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *); 1032 static void wm_suspend_workarounds_ich8lan(struct wm_softc *); 1033 static int wm_resume_workarounds_pchlan(struct wm_softc *); 1034 static void wm_enable_wakeup(struct wm_softc *); 1035 static void wm_disable_aspm(struct wm_softc *); 1036 /* LPLU (Low Power Link Up) */ 1037 static void wm_lplu_d0_disable(struct wm_softc *); 1038 /* EEE */ 1039 static int wm_set_eee_i350(struct wm_softc *); 1040 static int wm_set_eee_pchlan(struct wm_softc *); 1041 static int wm_set_eee(struct wm_softc *); 1042 1043 /* 1044 * Workarounds (mainly PHY related). 1045 * Basically, PHY's workarounds are in the PHY drivers. 1046 */ 1047 static int wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *); 1048 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *); 1049 static int wm_hv_phy_workarounds_ich8lan(struct wm_softc *); 1050 static void wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *); 1051 static void wm_copy_rx_addrs_to_phy_ich8lan_locked(struct wm_softc *); 1052 static int wm_lv_jumbo_workaround_ich8lan(struct wm_softc *, bool); 1053 static int wm_lv_phy_workarounds_ich8lan(struct wm_softc *); 1054 static int wm_k1_workaround_lpt_lp(struct wm_softc *, bool); 1055 static int wm_k1_gig_workaround_hv(struct wm_softc *, int); 1056 static int wm_k1_workaround_lv(struct wm_softc *); 1057 static int wm_link_stall_workaround_hv(struct wm_softc *); 1058 static int wm_set_mdio_slow_mode_hv(struct wm_softc *); 1059 static void wm_configure_k1_ich8lan(struct wm_softc *, int); 1060 static void wm_reset_init_script_82575(struct wm_softc *); 1061 static void wm_reset_mdicnfg_82580(struct wm_softc *); 1062 static bool wm_phy_is_accessible_pchlan(struct wm_softc *); 1063 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *); 1064 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool); 1065 static int wm_pll_workaround_i210(struct wm_softc *); 1066 static void wm_legacy_irq_quirk_spt(struct wm_softc *); 1067 static bool wm_phy_need_linkdown_discard(struct wm_softc *); 1068 static void wm_set_linkdown_discard(struct wm_softc *); 1069 static void wm_clear_linkdown_discard(struct wm_softc *); 1070 1071 #ifdef WM_DEBUG 1072 static int wm_sysctl_debug(SYSCTLFN_PROTO); 1073 #endif 1074 1075 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc), 1076 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); 1077 1078 /* 1079 * Devices supported by this driver. 1080 */ 1081 static const struct wm_product { 1082 pci_vendor_id_t wmp_vendor; 1083 pci_product_id_t wmp_product; 1084 const char *wmp_name; 1085 wm_chip_type wmp_type; 1086 uint32_t wmp_flags; 1087 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN 1088 #define WMP_F_FIBER WM_MEDIATYPE_FIBER 1089 #define WMP_F_COPPER WM_MEDIATYPE_COPPER 1090 #define WMP_F_SERDES WM_MEDIATYPE_SERDES 1091 #define WMP_MEDIATYPE(x) ((x) & 0x03) 1092 } wm_products[] = { 1093 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542, 1094 "Intel i82542 1000BASE-X Ethernet", 1095 WM_T_82542_2_1, WMP_F_FIBER }, 1096 1097 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER, 1098 "Intel i82543GC 1000BASE-X Ethernet", 1099 WM_T_82543, WMP_F_FIBER }, 1100 1101 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER, 1102 "Intel i82543GC 1000BASE-T Ethernet", 1103 WM_T_82543, WMP_F_COPPER }, 1104 1105 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER, 1106 "Intel i82544EI 1000BASE-T Ethernet", 1107 WM_T_82544, WMP_F_COPPER }, 1108 1109 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER, 1110 "Intel i82544EI 1000BASE-X Ethernet", 1111 WM_T_82544, WMP_F_FIBER }, 1112 1113 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER, 1114 "Intel i82544GC 1000BASE-T Ethernet", 1115 WM_T_82544, WMP_F_COPPER }, 1116 1117 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM, 1118 "Intel i82544GC (LOM) 1000BASE-T Ethernet", 1119 WM_T_82544, WMP_F_COPPER }, 1120 1121 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM, 1122 "Intel i82540EM 1000BASE-T Ethernet", 1123 WM_T_82540, WMP_F_COPPER }, 1124 1125 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM, 1126 "Intel i82540EM (LOM) 1000BASE-T Ethernet", 1127 WM_T_82540, WMP_F_COPPER }, 1128 1129 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM, 1130 "Intel i82540EP 1000BASE-T Ethernet", 1131 WM_T_82540, WMP_F_COPPER }, 1132 1133 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP, 1134 "Intel i82540EP 1000BASE-T Ethernet", 1135 WM_T_82540, WMP_F_COPPER }, 1136 1137 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP, 1138 "Intel i82540EP 1000BASE-T Ethernet", 1139 WM_T_82540, WMP_F_COPPER }, 1140 1141 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER, 1142 "Intel i82545EM 1000BASE-T Ethernet", 1143 WM_T_82545, WMP_F_COPPER }, 1144 1145 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER, 1146 "Intel i82545GM 1000BASE-T Ethernet", 1147 WM_T_82545_3, WMP_F_COPPER }, 1148 1149 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER, 1150 "Intel i82545GM 1000BASE-X Ethernet", 1151 WM_T_82545_3, WMP_F_FIBER }, 1152 1153 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES, 1154 "Intel i82545GM Gigabit Ethernet (SERDES)", 1155 WM_T_82545_3, WMP_F_SERDES }, 1156 1157 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER, 1158 "Intel i82546EB 1000BASE-T Ethernet", 1159 WM_T_82546, WMP_F_COPPER }, 1160 1161 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD, 1162 "Intel i82546EB 1000BASE-T Ethernet", 1163 WM_T_82546, WMP_F_COPPER }, 1164 1165 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER, 1166 "Intel i82545EM 1000BASE-X Ethernet", 1167 WM_T_82545, WMP_F_FIBER }, 1168 1169 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER, 1170 "Intel i82546EB 1000BASE-X Ethernet", 1171 WM_T_82546, WMP_F_FIBER }, 1172 1173 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER, 1174 "Intel i82546GB 1000BASE-T Ethernet", 1175 WM_T_82546_3, WMP_F_COPPER }, 1176 1177 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER, 1178 "Intel i82546GB 1000BASE-X Ethernet", 1179 WM_T_82546_3, WMP_F_FIBER }, 1180 1181 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES, 1182 "Intel i82546GB Gigabit Ethernet (SERDES)", 1183 WM_T_82546_3, WMP_F_SERDES }, 1184 1185 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER, 1186 "i82546GB quad-port Gigabit Ethernet", 1187 WM_T_82546_3, WMP_F_COPPER }, 1188 1189 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3, 1190 "i82546GB quad-port Gigabit Ethernet (KSP3)", 1191 WM_T_82546_3, WMP_F_COPPER }, 1192 1193 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE, 1194 "Intel PRO/1000MT (82546GB)", 1195 WM_T_82546_3, WMP_F_COPPER }, 1196 1197 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI, 1198 "Intel i82541EI 1000BASE-T Ethernet", 1199 WM_T_82541, WMP_F_COPPER }, 1200 1201 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM, 1202 "Intel i82541ER (LOM) 1000BASE-T Ethernet", 1203 WM_T_82541, WMP_F_COPPER }, 1204 1205 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE, 1206 "Intel i82541EI Mobile 1000BASE-T Ethernet", 1207 WM_T_82541, WMP_F_COPPER }, 1208 1209 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER, 1210 "Intel i82541ER 1000BASE-T Ethernet", 1211 WM_T_82541_2, WMP_F_COPPER }, 1212 1213 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI, 1214 "Intel i82541GI 1000BASE-T Ethernet", 1215 WM_T_82541_2, WMP_F_COPPER }, 1216 1217 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE, 1218 "Intel i82541GI Mobile 1000BASE-T Ethernet", 1219 WM_T_82541_2, WMP_F_COPPER }, 1220 1221 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI, 1222 "Intel i82541PI 1000BASE-T Ethernet", 1223 WM_T_82541_2, WMP_F_COPPER }, 1224 1225 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI, 1226 "Intel i82547EI 1000BASE-T Ethernet", 1227 WM_T_82547, WMP_F_COPPER }, 1228 1229 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE, 1230 "Intel i82547EI Mobile 1000BASE-T Ethernet", 1231 WM_T_82547, WMP_F_COPPER }, 1232 1233 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI, 1234 "Intel i82547GI 1000BASE-T Ethernet", 1235 WM_T_82547_2, WMP_F_COPPER }, 1236 1237 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER, 1238 "Intel PRO/1000 PT (82571EB)", 1239 WM_T_82571, WMP_F_COPPER }, 1240 1241 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER, 1242 "Intel PRO/1000 PF (82571EB)", 1243 WM_T_82571, WMP_F_FIBER }, 1244 1245 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES, 1246 "Intel PRO/1000 PB (82571EB)", 1247 WM_T_82571, WMP_F_SERDES }, 1248 1249 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER, 1250 "Intel PRO/1000 QT (82571EB)", 1251 WM_T_82571, WMP_F_COPPER }, 1252 1253 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER, 1254 "Intel PRO/1000 PT Quad Port Server Adapter", 1255 WM_T_82571, WMP_F_COPPER }, 1256 1257 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER, 1258 "Intel Gigabit PT Quad Port Server ExpressModule", 1259 WM_T_82571, WMP_F_COPPER }, 1260 1261 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES, 1262 "Intel 82571EB Dual Gigabit Ethernet (SERDES)", 1263 WM_T_82571, WMP_F_SERDES }, 1264 1265 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES, 1266 "Intel 82571EB Quad Gigabit Ethernet (SERDES)", 1267 WM_T_82571, WMP_F_SERDES }, 1268 1269 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER, 1270 "Intel 82571EB Quad 1000baseX Ethernet", 1271 WM_T_82571, WMP_F_FIBER }, 1272 1273 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER, 1274 "Intel i82572EI 1000baseT Ethernet", 1275 WM_T_82572, WMP_F_COPPER }, 1276 1277 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER, 1278 "Intel i82572EI 1000baseX Ethernet", 1279 WM_T_82572, WMP_F_FIBER }, 1280 1281 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES, 1282 "Intel i82572EI Gigabit Ethernet (SERDES)", 1283 WM_T_82572, WMP_F_SERDES }, 1284 1285 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI, 1286 "Intel i82572EI 1000baseT Ethernet", 1287 WM_T_82572, WMP_F_COPPER }, 1288 1289 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E, 1290 "Intel i82573E", 1291 WM_T_82573, WMP_F_COPPER }, 1292 1293 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT, 1294 "Intel i82573E IAMT", 1295 WM_T_82573, WMP_F_COPPER }, 1296 1297 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L, 1298 "Intel i82573L Gigabit Ethernet", 1299 WM_T_82573, WMP_F_COPPER }, 1300 1301 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L, 1302 "Intel i82574L", 1303 WM_T_82574, WMP_F_COPPER }, 1304 1305 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA, 1306 "Intel i82574L", 1307 WM_T_82574, WMP_F_COPPER }, 1308 1309 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V, 1310 "Intel i82583V", 1311 WM_T_82583, WMP_F_COPPER }, 1312 1313 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT, 1314 "i80003 dual 1000baseT Ethernet", 1315 WM_T_80003, WMP_F_COPPER }, 1316 1317 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT, 1318 "i80003 dual 1000baseX Ethernet", 1319 WM_T_80003, WMP_F_COPPER }, 1320 1321 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT, 1322 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)", 1323 WM_T_80003, WMP_F_SERDES }, 1324 1325 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT, 1326 "Intel i80003 1000baseT Ethernet", 1327 WM_T_80003, WMP_F_COPPER }, 1328 1329 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT, 1330 "Intel i80003 Gigabit Ethernet (SERDES)", 1331 WM_T_80003, WMP_F_SERDES }, 1332 1333 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT, 1334 "Intel i82801H (M_AMT) LAN Controller", 1335 WM_T_ICH8, WMP_F_COPPER }, 1336 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT, 1337 "Intel i82801H (AMT) LAN Controller", 1338 WM_T_ICH8, WMP_F_COPPER }, 1339 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN, 1340 "Intel i82801H LAN Controller", 1341 WM_T_ICH8, WMP_F_COPPER }, 1342 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN, 1343 "Intel i82801H (IFE) 10/100 LAN Controller", 1344 WM_T_ICH8, WMP_F_COPPER }, 1345 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN, 1346 "Intel i82801H (M) LAN Controller", 1347 WM_T_ICH8, WMP_F_COPPER }, 1348 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT, 1349 "Intel i82801H IFE (GT) 10/100 LAN Controller", 1350 WM_T_ICH8, WMP_F_COPPER }, 1351 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G, 1352 "Intel i82801H IFE (G) 10/100 LAN Controller", 1353 WM_T_ICH8, WMP_F_COPPER }, 1354 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3, 1355 "82567V-3 LAN Controller", 1356 WM_T_ICH8, WMP_F_COPPER }, 1357 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT, 1358 "82801I (AMT) LAN Controller", 1359 WM_T_ICH9, WMP_F_COPPER }, 1360 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE, 1361 "82801I 10/100 LAN Controller", 1362 WM_T_ICH9, WMP_F_COPPER }, 1363 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G, 1364 "82801I (G) 10/100 LAN Controller", 1365 WM_T_ICH9, WMP_F_COPPER }, 1366 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT, 1367 "82801I (GT) 10/100 LAN Controller", 1368 WM_T_ICH9, WMP_F_COPPER }, 1369 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C, 1370 "82801I (C) LAN Controller", 1371 WM_T_ICH9, WMP_F_COPPER }, 1372 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M, 1373 "82801I mobile LAN Controller", 1374 WM_T_ICH9, WMP_F_COPPER }, 1375 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V, 1376 "82801I mobile (V) LAN Controller", 1377 WM_T_ICH9, WMP_F_COPPER }, 1378 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT, 1379 "82801I mobile (AMT) LAN Controller", 1380 WM_T_ICH9, WMP_F_COPPER }, 1381 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM, 1382 "82567LM-4 LAN Controller", 1383 WM_T_ICH9, WMP_F_COPPER }, 1384 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM, 1385 "82567LM-2 LAN Controller", 1386 WM_T_ICH10, WMP_F_COPPER }, 1387 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF, 1388 "82567LF-2 LAN Controller", 1389 WM_T_ICH10, WMP_F_COPPER }, 1390 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM, 1391 "82567LM-3 LAN Controller", 1392 WM_T_ICH10, WMP_F_COPPER }, 1393 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF, 1394 "82567LF-3 LAN Controller", 1395 WM_T_ICH10, WMP_F_COPPER }, 1396 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V, 1397 "82567V-2 LAN Controller", 1398 WM_T_ICH10, WMP_F_COPPER }, 1399 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V, 1400 "82567V-3? LAN Controller", 1401 WM_T_ICH10, WMP_F_COPPER }, 1402 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE, 1403 "HANKSVILLE LAN Controller", 1404 WM_T_ICH10, WMP_F_COPPER }, 1405 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM, 1406 "PCH LAN (82577LM) Controller", 1407 WM_T_PCH, WMP_F_COPPER }, 1408 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC, 1409 "PCH LAN (82577LC) Controller", 1410 WM_T_PCH, WMP_F_COPPER }, 1411 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM, 1412 "PCH LAN (82578DM) Controller", 1413 WM_T_PCH, WMP_F_COPPER }, 1414 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC, 1415 "PCH LAN (82578DC) Controller", 1416 WM_T_PCH, WMP_F_COPPER }, 1417 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM, 1418 "PCH2 LAN (82579LM) Controller", 1419 WM_T_PCH2, WMP_F_COPPER }, 1420 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V, 1421 "PCH2 LAN (82579V) Controller", 1422 WM_T_PCH2, WMP_F_COPPER }, 1423 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER, 1424 "82575EB dual-1000baseT Ethernet", 1425 WM_T_82575, WMP_F_COPPER }, 1426 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES, 1427 "82575EB dual-1000baseX Ethernet (SERDES)", 1428 WM_T_82575, WMP_F_SERDES }, 1429 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER, 1430 "82575GB quad-1000baseT Ethernet", 1431 WM_T_82575, WMP_F_COPPER }, 1432 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM, 1433 "82575GB quad-1000baseT Ethernet (PM)", 1434 WM_T_82575, WMP_F_COPPER }, 1435 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER, 1436 "82576 1000BaseT Ethernet", 1437 WM_T_82576, WMP_F_COPPER }, 1438 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER, 1439 "82576 1000BaseX Ethernet", 1440 WM_T_82576, WMP_F_FIBER }, 1441 1442 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES, 1443 "82576 gigabit Ethernet (SERDES)", 1444 WM_T_82576, WMP_F_SERDES }, 1445 1446 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER, 1447 "82576 quad-1000BaseT Ethernet", 1448 WM_T_82576, WMP_F_COPPER }, 1449 1450 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2, 1451 "82576 Gigabit ET2 Quad Port Server Adapter", 1452 WM_T_82576, WMP_F_COPPER }, 1453 1454 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS, 1455 "82576 gigabit Ethernet", 1456 WM_T_82576, WMP_F_COPPER }, 1457 1458 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES, 1459 "82576 gigabit Ethernet (SERDES)", 1460 WM_T_82576, WMP_F_SERDES }, 1461 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD, 1462 "82576 quad-gigabit Ethernet (SERDES)", 1463 WM_T_82576, WMP_F_SERDES }, 1464 1465 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER, 1466 "82580 1000BaseT Ethernet", 1467 WM_T_82580, WMP_F_COPPER }, 1468 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER, 1469 "82580 1000BaseX Ethernet", 1470 WM_T_82580, WMP_F_FIBER }, 1471 1472 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES, 1473 "82580 1000BaseT Ethernet (SERDES)", 1474 WM_T_82580, WMP_F_SERDES }, 1475 1476 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII, 1477 "82580 gigabit Ethernet (SGMII)", 1478 WM_T_82580, WMP_F_COPPER }, 1479 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL, 1480 "82580 dual-1000BaseT Ethernet", 1481 WM_T_82580, WMP_F_COPPER }, 1482 1483 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER, 1484 "82580 quad-1000BaseX Ethernet", 1485 WM_T_82580, WMP_F_FIBER }, 1486 1487 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII, 1488 "DH89XXCC Gigabit Ethernet (SGMII)", 1489 WM_T_82580, WMP_F_COPPER }, 1490 1491 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES, 1492 "DH89XXCC Gigabit Ethernet (SERDES)", 1493 WM_T_82580, WMP_F_SERDES }, 1494 1495 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE, 1496 "DH89XXCC 1000BASE-KX Ethernet", 1497 WM_T_82580, WMP_F_SERDES }, 1498 1499 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP, 1500 "DH89XXCC Gigabit Ethernet (SFP)", 1501 WM_T_82580, WMP_F_SERDES }, 1502 1503 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER, 1504 "I350 Gigabit Network Connection", 1505 WM_T_I350, WMP_F_COPPER }, 1506 1507 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER, 1508 "I350 Gigabit Fiber Network Connection", 1509 WM_T_I350, WMP_F_FIBER }, 1510 1511 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES, 1512 "I350 Gigabit Backplane Connection", 1513 WM_T_I350, WMP_F_SERDES }, 1514 1515 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4, 1516 "I350 Quad Port Gigabit Ethernet", 1517 WM_T_I350, WMP_F_SERDES }, 1518 1519 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII, 1520 "I350 Gigabit Connection", 1521 WM_T_I350, WMP_F_COPPER }, 1522 1523 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX, 1524 "I354 Gigabit Ethernet (KX)", 1525 WM_T_I354, WMP_F_SERDES }, 1526 1527 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII, 1528 "I354 Gigabit Ethernet (SGMII)", 1529 WM_T_I354, WMP_F_COPPER }, 1530 1531 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE, 1532 "I354 Gigabit Ethernet (2.5G)", 1533 WM_T_I354, WMP_F_COPPER }, 1534 1535 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1, 1536 "I210-T1 Ethernet Server Adapter", 1537 WM_T_I210, WMP_F_COPPER }, 1538 1539 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1, 1540 "I210 Ethernet (Copper OEM)", 1541 WM_T_I210, WMP_F_COPPER }, 1542 1543 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT, 1544 "I210 Ethernet (Copper IT)", 1545 WM_T_I210, WMP_F_COPPER }, 1546 1547 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF, 1548 "I210 Ethernet (Copper, FLASH less)", 1549 WM_T_I210, WMP_F_COPPER }, 1550 1551 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER, 1552 "I210 Gigabit Ethernet (Fiber)", 1553 WM_T_I210, WMP_F_FIBER }, 1554 1555 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES, 1556 "I210 Gigabit Ethernet (SERDES)", 1557 WM_T_I210, WMP_F_SERDES }, 1558 1559 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF, 1560 "I210 Gigabit Ethernet (SERDES, FLASH less)", 1561 WM_T_I210, WMP_F_SERDES }, 1562 1563 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII, 1564 "I210 Gigabit Ethernet (SGMII)", 1565 WM_T_I210, WMP_F_COPPER }, 1566 1567 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII_WOF, 1568 "I210 Gigabit Ethernet (SGMII, FLASH less)", 1569 WM_T_I210, WMP_F_COPPER }, 1570 1571 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER, 1572 "I211 Ethernet (COPPER)", 1573 WM_T_I211, WMP_F_COPPER }, 1574 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V, 1575 "I217 V Ethernet Connection", 1576 WM_T_PCH_LPT, WMP_F_COPPER }, 1577 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM, 1578 "I217 LM Ethernet Connection", 1579 WM_T_PCH_LPT, WMP_F_COPPER }, 1580 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V, 1581 "I218 V Ethernet Connection", 1582 WM_T_PCH_LPT, WMP_F_COPPER }, 1583 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2, 1584 "I218 V Ethernet Connection", 1585 WM_T_PCH_LPT, WMP_F_COPPER }, 1586 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3, 1587 "I218 V Ethernet Connection", 1588 WM_T_PCH_LPT, WMP_F_COPPER }, 1589 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM, 1590 "I218 LM Ethernet Connection", 1591 WM_T_PCH_LPT, WMP_F_COPPER }, 1592 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2, 1593 "I218 LM Ethernet Connection", 1594 WM_T_PCH_LPT, WMP_F_COPPER }, 1595 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3, 1596 "I218 LM Ethernet Connection", 1597 WM_T_PCH_LPT, WMP_F_COPPER }, 1598 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM, 1599 "I219 LM Ethernet Connection", 1600 WM_T_PCH_SPT, WMP_F_COPPER }, 1601 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2, 1602 "I219 LM (2) Ethernet Connection", 1603 WM_T_PCH_SPT, WMP_F_COPPER }, 1604 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3, 1605 "I219 LM (3) Ethernet Connection", 1606 WM_T_PCH_SPT, WMP_F_COPPER }, 1607 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4, 1608 "I219 LM (4) Ethernet Connection", 1609 WM_T_PCH_SPT, WMP_F_COPPER }, 1610 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5, 1611 "I219 LM (5) Ethernet Connection", 1612 WM_T_PCH_SPT, WMP_F_COPPER }, 1613 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM6, 1614 "I219 LM (6) Ethernet Connection", 1615 WM_T_PCH_CNP, WMP_F_COPPER }, 1616 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM7, 1617 "I219 LM (7) Ethernet Connection", 1618 WM_T_PCH_CNP, WMP_F_COPPER }, 1619 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM8, 1620 "I219 LM (8) Ethernet Connection", 1621 WM_T_PCH_CNP, WMP_F_COPPER }, 1622 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM9, 1623 "I219 LM (9) Ethernet Connection", 1624 WM_T_PCH_CNP, WMP_F_COPPER }, 1625 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM10, 1626 "I219 LM (10) Ethernet Connection", 1627 WM_T_PCH_CNP, WMP_F_COPPER }, 1628 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM11, 1629 "I219 LM (11) Ethernet Connection", 1630 WM_T_PCH_CNP, WMP_F_COPPER }, 1631 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM12, 1632 "I219 LM (12) Ethernet Connection", 1633 WM_T_PCH_SPT, WMP_F_COPPER }, 1634 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM13, 1635 "I219 LM (13) Ethernet Connection", 1636 WM_T_PCH_CNP, WMP_F_COPPER }, 1637 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM14, 1638 "I219 LM (14) Ethernet Connection", 1639 WM_T_PCH_CNP, WMP_F_COPPER }, 1640 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM15, 1641 "I219 LM (15) Ethernet Connection", 1642 WM_T_PCH_CNP, WMP_F_COPPER }, 1643 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM16, 1644 "I219 LM (16) Ethernet Connection", 1645 WM_T_PCH_CNP, WMP_F_COPPER }, 1646 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM17, 1647 "I219 LM (17) Ethernet Connection", 1648 WM_T_PCH_CNP, WMP_F_COPPER }, 1649 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM18, 1650 "I219 LM (18) Ethernet Connection", 1651 WM_T_PCH_CNP, WMP_F_COPPER }, 1652 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM19, 1653 "I219 LM (19) Ethernet Connection", 1654 WM_T_PCH_CNP, WMP_F_COPPER }, 1655 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V, 1656 "I219 V Ethernet Connection", 1657 WM_T_PCH_SPT, WMP_F_COPPER }, 1658 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2, 1659 "I219 V (2) Ethernet Connection", 1660 WM_T_PCH_SPT, WMP_F_COPPER }, 1661 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4, 1662 "I219 V (4) Ethernet Connection", 1663 WM_T_PCH_SPT, WMP_F_COPPER }, 1664 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5, 1665 "I219 V (5) Ethernet Connection", 1666 WM_T_PCH_SPT, WMP_F_COPPER }, 1667 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V6, 1668 "I219 V (6) Ethernet Connection", 1669 WM_T_PCH_CNP, WMP_F_COPPER }, 1670 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V7, 1671 "I219 V (7) Ethernet Connection", 1672 WM_T_PCH_CNP, WMP_F_COPPER }, 1673 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V8, 1674 "I219 V (8) Ethernet Connection", 1675 WM_T_PCH_CNP, WMP_F_COPPER }, 1676 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V9, 1677 "I219 V (9) Ethernet Connection", 1678 WM_T_PCH_CNP, WMP_F_COPPER }, 1679 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V10, 1680 "I219 V (10) Ethernet Connection", 1681 WM_T_PCH_CNP, WMP_F_COPPER }, 1682 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V11, 1683 "I219 V (11) Ethernet Connection", 1684 WM_T_PCH_CNP, WMP_F_COPPER }, 1685 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V12, 1686 "I219 V (12) Ethernet Connection", 1687 WM_T_PCH_SPT, WMP_F_COPPER }, 1688 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V13, 1689 "I219 V (13) Ethernet Connection", 1690 WM_T_PCH_CNP, WMP_F_COPPER }, 1691 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V14, 1692 "I219 V (14) Ethernet Connection", 1693 WM_T_PCH_CNP, WMP_F_COPPER }, 1694 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V15, 1695 "I219 V (15) Ethernet Connection", 1696 WM_T_PCH_CNP, WMP_F_COPPER }, 1697 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V16, 1698 "I219 V (16) Ethernet Connection", 1699 WM_T_PCH_CNP, WMP_F_COPPER }, 1700 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V17, 1701 "I219 V (17) Ethernet Connection", 1702 WM_T_PCH_CNP, WMP_F_COPPER }, 1703 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V18, 1704 "I219 V (18) Ethernet Connection", 1705 WM_T_PCH_CNP, WMP_F_COPPER }, 1706 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V19, 1707 "I219 V (19) Ethernet Connection", 1708 WM_T_PCH_CNP, WMP_F_COPPER }, 1709 { 0, 0, 1710 NULL, 1711 0, 0 }, 1712 }; 1713 1714 /* 1715 * Register read/write functions. 1716 * Other than CSR_{READ|WRITE}(). 1717 */ 1718 1719 #if 0 /* Not currently used */ 1720 static inline uint32_t 1721 wm_io_read(struct wm_softc *sc, int reg) 1722 { 1723 1724 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg); 1725 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4)); 1726 } 1727 #endif 1728 1729 static inline void 1730 wm_io_write(struct wm_softc *sc, int reg, uint32_t val) 1731 { 1732 1733 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg); 1734 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val); 1735 } 1736 1737 static inline void 1738 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off, 1739 uint32_t data) 1740 { 1741 uint32_t regval; 1742 int i; 1743 1744 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT); 1745 1746 CSR_WRITE(sc, reg, regval); 1747 1748 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) { 1749 delay(5); 1750 if (CSR_READ(sc, reg) & SCTL_CTL_READY) 1751 break; 1752 } 1753 if (i == SCTL_CTL_POLL_TIMEOUT) { 1754 aprint_error("%s: WARNING:" 1755 " i82575 reg 0x%08x setup did not indicate ready\n", 1756 device_xname(sc->sc_dev), reg); 1757 } 1758 } 1759 1760 static inline void 1761 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v) 1762 { 1763 wa->wa_low = htole32(v & 0xffffffffU); 1764 if (sizeof(bus_addr_t) == 8) 1765 wa->wa_high = htole32((uint64_t) v >> 32); 1766 else 1767 wa->wa_high = 0; 1768 } 1769 1770 /* 1771 * Descriptor sync/init functions. 1772 */ 1773 static inline void 1774 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops) 1775 { 1776 struct wm_softc *sc = txq->txq_sc; 1777 1778 /* If it will wrap around, sync to the end of the ring. */ 1779 if ((start + num) > WM_NTXDESC(txq)) { 1780 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap, 1781 WM_CDTXOFF(txq, start), txq->txq_descsize * 1782 (WM_NTXDESC(txq) - start), ops); 1783 num -= (WM_NTXDESC(txq) - start); 1784 start = 0; 1785 } 1786 1787 /* Now sync whatever is left. */ 1788 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap, 1789 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops); 1790 } 1791 1792 static inline void 1793 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops) 1794 { 1795 struct wm_softc *sc = rxq->rxq_sc; 1796 1797 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap, 1798 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops); 1799 } 1800 1801 static inline void 1802 wm_init_rxdesc(struct wm_rxqueue *rxq, int start) 1803 { 1804 struct wm_softc *sc = rxq->rxq_sc; 1805 struct wm_rxsoft *rxs = &rxq->rxq_soft[start]; 1806 struct mbuf *m = rxs->rxs_mbuf; 1807 1808 /* 1809 * Note: We scoot the packet forward 2 bytes in the buffer 1810 * so that the payload after the Ethernet header is aligned 1811 * to a 4-byte boundary. 1812 1813 * XXX BRAINDAMAGE ALERT! 1814 * The stupid chip uses the same size for every buffer, which 1815 * is set in the Receive Control register. We are using the 2K 1816 * size option, but what we REALLY want is (2K - 2)! For this 1817 * reason, we can't "scoot" packets longer than the standard 1818 * Ethernet MTU. On strict-alignment platforms, if the total 1819 * size exceeds (2K - 2) we set align_tweak to 0 and let 1820 * the upper layer copy the headers. 1821 */ 1822 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak; 1823 1824 if (sc->sc_type == WM_T_82574) { 1825 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start]; 1826 rxd->erx_data.erxd_addr = 1827 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1828 rxd->erx_data.erxd_dd = 0; 1829 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 1830 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start]; 1831 1832 rxd->nqrx_data.nrxd_paddr = 1833 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1834 /* Currently, split header is not supported. */ 1835 rxd->nqrx_data.nrxd_haddr = 0; 1836 } else { 1837 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start]; 1838 1839 wm_set_dma_addr(&rxd->wrx_addr, 1840 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1841 rxd->wrx_len = 0; 1842 rxd->wrx_cksum = 0; 1843 rxd->wrx_status = 0; 1844 rxd->wrx_errors = 0; 1845 rxd->wrx_special = 0; 1846 } 1847 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1848 1849 CSR_WRITE(sc, rxq->rxq_rdt_reg, start); 1850 } 1851 1852 /* 1853 * Device driver interface functions and commonly used functions. 1854 * match, attach, detach, init, start, stop, ioctl, watchdog and so on. 1855 */ 1856 1857 /* Lookup supported device table */ 1858 static const struct wm_product * 1859 wm_lookup(const struct pci_attach_args *pa) 1860 { 1861 const struct wm_product *wmp; 1862 1863 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) { 1864 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor && 1865 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product) 1866 return wmp; 1867 } 1868 return NULL; 1869 } 1870 1871 /* The match function (ca_match) */ 1872 static int 1873 wm_match(device_t parent, cfdata_t cf, void *aux) 1874 { 1875 struct pci_attach_args *pa = aux; 1876 1877 if (wm_lookup(pa) != NULL) 1878 return 1; 1879 1880 return 0; 1881 } 1882 1883 /* The attach function (ca_attach) */ 1884 static void 1885 wm_attach(device_t parent, device_t self, void *aux) 1886 { 1887 struct wm_softc *sc = device_private(self); 1888 struct pci_attach_args *pa = aux; 1889 prop_dictionary_t dict; 1890 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1891 pci_chipset_tag_t pc = pa->pa_pc; 1892 int counts[PCI_INTR_TYPE_SIZE]; 1893 pci_intr_type_t max_type; 1894 const char *eetype, *xname; 1895 bus_space_tag_t memt; 1896 bus_space_handle_t memh; 1897 bus_size_t memsize; 1898 int memh_valid; 1899 int i, error; 1900 const struct wm_product *wmp; 1901 prop_data_t ea; 1902 prop_number_t pn; 1903 uint8_t enaddr[ETHER_ADDR_LEN]; 1904 char buf[256]; 1905 char wqname[MAXCOMLEN]; 1906 uint16_t cfg1, cfg2, swdpin, nvmword; 1907 pcireg_t preg, memtype; 1908 uint16_t eeprom_data, apme_mask; 1909 bool force_clear_smbi; 1910 uint32_t link_mode; 1911 uint32_t reg; 1912 1913 #if defined(WM_DEBUG) && defined(WM_DEBUG_DEFAULT) 1914 sc->sc_debug = WM_DEBUG_DEFAULT; 1915 #endif 1916 sc->sc_dev = self; 1917 callout_init(&sc->sc_tick_ch, WM_CALLOUT_FLAGS); 1918 callout_setfunc(&sc->sc_tick_ch, wm_tick, sc); 1919 sc->sc_core_stopping = false; 1920 1921 wmp = wm_lookup(pa); 1922 #ifdef DIAGNOSTIC 1923 if (wmp == NULL) { 1924 printf("\n"); 1925 panic("wm_attach: impossible"); 1926 } 1927 #endif 1928 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags); 1929 1930 sc->sc_pc = pa->pa_pc; 1931 sc->sc_pcitag = pa->pa_tag; 1932 1933 if (pci_dma64_available(pa)) 1934 sc->sc_dmat = pa->pa_dmat64; 1935 else 1936 sc->sc_dmat = pa->pa_dmat; 1937 1938 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id); 1939 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG)); 1940 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1); 1941 1942 sc->sc_type = wmp->wmp_type; 1943 1944 /* Set default function pointers */ 1945 sc->phy.acquire = sc->nvm.acquire = wm_get_null; 1946 sc->phy.release = sc->nvm.release = wm_put_null; 1947 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000; 1948 1949 if (sc->sc_type < WM_T_82543) { 1950 if (sc->sc_rev < 2) { 1951 aprint_error_dev(sc->sc_dev, 1952 "i82542 must be at least rev. 2\n"); 1953 return; 1954 } 1955 if (sc->sc_rev < 3) 1956 sc->sc_type = WM_T_82542_2_0; 1957 } 1958 1959 /* 1960 * Disable MSI for Errata: 1961 * "Message Signaled Interrupt Feature May Corrupt Write Transactions" 1962 * 1963 * 82544: Errata 25 1964 * 82540: Errata 6 (easy to reproduce device timeout) 1965 * 82545: Errata 4 (easy to reproduce device timeout) 1966 * 82546: Errata 26 (easy to reproduce device timeout) 1967 * 82541: Errata 7 (easy to reproduce device timeout) 1968 * 1969 * "Byte Enables 2 and 3 are not set on MSI writes" 1970 * 1971 * 82571 & 82572: Errata 63 1972 */ 1973 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571) 1974 || (sc->sc_type == WM_T_82572)) 1975 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY; 1976 1977 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 1978 || (sc->sc_type == WM_T_82580) 1979 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 1980 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 1981 sc->sc_flags |= WM_F_NEWQUEUE; 1982 1983 /* Set device properties (mactype) */ 1984 dict = device_properties(sc->sc_dev); 1985 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type); 1986 1987 /* 1988 * Map the device. All devices support memory-mapped acccess, 1989 * and it is really required for normal operation. 1990 */ 1991 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA); 1992 switch (memtype) { 1993 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: 1994 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: 1995 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA, 1996 memtype, 0, &memt, &memh, NULL, &memsize) == 0); 1997 break; 1998 default: 1999 memh_valid = 0; 2000 break; 2001 } 2002 2003 if (memh_valid) { 2004 sc->sc_st = memt; 2005 sc->sc_sh = memh; 2006 sc->sc_ss = memsize; 2007 } else { 2008 aprint_error_dev(sc->sc_dev, 2009 "unable to map device registers\n"); 2010 return; 2011 } 2012 2013 /* 2014 * In addition, i82544 and later support I/O mapped indirect 2015 * register access. It is not desirable (nor supported in 2016 * this driver) to use it for normal operation, though it is 2017 * required to work around bugs in some chip versions. 2018 */ 2019 switch (sc->sc_type) { 2020 case WM_T_82544: 2021 case WM_T_82541: 2022 case WM_T_82541_2: 2023 case WM_T_82547: 2024 case WM_T_82547_2: 2025 /* First we have to find the I/O BAR. */ 2026 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) { 2027 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i); 2028 if (memtype == PCI_MAPREG_TYPE_IO) 2029 break; 2030 if (PCI_MAPREG_MEM_TYPE(memtype) == 2031 PCI_MAPREG_MEM_TYPE_64BIT) 2032 i += 4; /* skip high bits, too */ 2033 } 2034 if (i < PCI_MAPREG_END) { 2035 /* 2036 * We found PCI_MAPREG_TYPE_IO. Note that 82580 2037 * (and newer?) chip has no PCI_MAPREG_TYPE_IO. 2038 * It's no problem because newer chips has no this 2039 * bug. 2040 * 2041 * The i8254x doesn't apparently respond when the 2042 * I/O BAR is 0, which looks somewhat like it's not 2043 * been configured. 2044 */ 2045 preg = pci_conf_read(pc, pa->pa_tag, i); 2046 if (PCI_MAPREG_MEM_ADDR(preg) == 0) { 2047 aprint_error_dev(sc->sc_dev, 2048 "WARNING: I/O BAR at zero.\n"); 2049 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO, 2050 0, &sc->sc_iot, &sc->sc_ioh, 2051 NULL, &sc->sc_ios) == 0) { 2052 sc->sc_flags |= WM_F_IOH_VALID; 2053 } else 2054 aprint_error_dev(sc->sc_dev, 2055 "WARNING: unable to map I/O space\n"); 2056 } 2057 break; 2058 default: 2059 break; 2060 } 2061 2062 /* Enable bus mastering. Disable MWI on the i82542 2.0. */ 2063 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 2064 preg |= PCI_COMMAND_MASTER_ENABLE; 2065 if (sc->sc_type < WM_T_82542_2_1) 2066 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE; 2067 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg); 2068 2069 /* Power up chip */ 2070 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self, NULL)) 2071 && error != EOPNOTSUPP) { 2072 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error); 2073 return; 2074 } 2075 2076 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag)); 2077 /* 2078 * Don't use MSI-X if we can use only one queue to save interrupt 2079 * resource. 2080 */ 2081 if (sc->sc_nqueues > 1) { 2082 max_type = PCI_INTR_TYPE_MSIX; 2083 /* 2084 * 82583 has a MSI-X capability in the PCI configuration space 2085 * but it doesn't support it. At least the document doesn't 2086 * say anything about MSI-X. 2087 */ 2088 counts[PCI_INTR_TYPE_MSIX] 2089 = (sc->sc_type == WM_T_82583) ? 0 : sc->sc_nqueues + 1; 2090 } else { 2091 max_type = PCI_INTR_TYPE_MSI; 2092 counts[PCI_INTR_TYPE_MSIX] = 0; 2093 } 2094 2095 /* Allocation settings */ 2096 counts[PCI_INTR_TYPE_MSI] = 1; 2097 counts[PCI_INTR_TYPE_INTX] = 1; 2098 /* overridden by disable flags */ 2099 if (wm_disable_msi != 0) { 2100 counts[PCI_INTR_TYPE_MSI] = 0; 2101 if (wm_disable_msix != 0) { 2102 max_type = PCI_INTR_TYPE_INTX; 2103 counts[PCI_INTR_TYPE_MSIX] = 0; 2104 } 2105 } else if (wm_disable_msix != 0) { 2106 max_type = PCI_INTR_TYPE_MSI; 2107 counts[PCI_INTR_TYPE_MSIX] = 0; 2108 } 2109 2110 alloc_retry: 2111 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) { 2112 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n"); 2113 return; 2114 } 2115 2116 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) { 2117 error = wm_setup_msix(sc); 2118 if (error) { 2119 pci_intr_release(pc, sc->sc_intrs, 2120 counts[PCI_INTR_TYPE_MSIX]); 2121 2122 /* Setup for MSI: Disable MSI-X */ 2123 max_type = PCI_INTR_TYPE_MSI; 2124 counts[PCI_INTR_TYPE_MSI] = 1; 2125 counts[PCI_INTR_TYPE_INTX] = 1; 2126 goto alloc_retry; 2127 } 2128 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) { 2129 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */ 2130 error = wm_setup_legacy(sc); 2131 if (error) { 2132 pci_intr_release(sc->sc_pc, sc->sc_intrs, 2133 counts[PCI_INTR_TYPE_MSI]); 2134 2135 /* The next try is for INTx: Disable MSI */ 2136 max_type = PCI_INTR_TYPE_INTX; 2137 counts[PCI_INTR_TYPE_INTX] = 1; 2138 goto alloc_retry; 2139 } 2140 } else { 2141 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */ 2142 error = wm_setup_legacy(sc); 2143 if (error) { 2144 pci_intr_release(sc->sc_pc, sc->sc_intrs, 2145 counts[PCI_INTR_TYPE_INTX]); 2146 return; 2147 } 2148 } 2149 2150 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(sc->sc_dev)); 2151 error = workqueue_create(&sc->sc_queue_wq, wqname, 2152 wm_handle_queue_work, sc, WM_WORKQUEUE_PRI, IPL_NET, 2153 WM_WORKQUEUE_FLAGS); 2154 if (error) { 2155 aprint_error_dev(sc->sc_dev, 2156 "unable to create workqueue\n"); 2157 goto out; 2158 } 2159 2160 /* 2161 * Check the function ID (unit number of the chip). 2162 */ 2163 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3) 2164 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003) 2165 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 2166 || (sc->sc_type == WM_T_82580) 2167 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 2168 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS) 2169 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK; 2170 else 2171 sc->sc_funcid = 0; 2172 2173 /* 2174 * Determine a few things about the bus we're connected to. 2175 */ 2176 if (sc->sc_type < WM_T_82543) { 2177 /* We don't really know the bus characteristics here. */ 2178 sc->sc_bus_speed = 33; 2179 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) { 2180 /* 2181 * CSA (Communication Streaming Architecture) is about as fast 2182 * a 32-bit 66MHz PCI Bus. 2183 */ 2184 sc->sc_flags |= WM_F_CSA; 2185 sc->sc_bus_speed = 66; 2186 aprint_verbose_dev(sc->sc_dev, 2187 "Communication Streaming Architecture\n"); 2188 if (sc->sc_type == WM_T_82547) { 2189 callout_init(&sc->sc_txfifo_ch, WM_CALLOUT_FLAGS); 2190 callout_setfunc(&sc->sc_txfifo_ch, 2191 wm_82547_txfifo_stall, sc); 2192 aprint_verbose_dev(sc->sc_dev, 2193 "using 82547 Tx FIFO stall work-around\n"); 2194 } 2195 } else if (sc->sc_type >= WM_T_82571) { 2196 sc->sc_flags |= WM_F_PCIE; 2197 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9) 2198 && (sc->sc_type != WM_T_ICH10) 2199 && (sc->sc_type != WM_T_PCH) 2200 && (sc->sc_type != WM_T_PCH2) 2201 && (sc->sc_type != WM_T_PCH_LPT) 2202 && (sc->sc_type != WM_T_PCH_SPT) 2203 && (sc->sc_type != WM_T_PCH_CNP)) { 2204 /* ICH* and PCH* have no PCIe capability registers */ 2205 if (pci_get_capability(pa->pa_pc, pa->pa_tag, 2206 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff, 2207 NULL) == 0) 2208 aprint_error_dev(sc->sc_dev, 2209 "unable to find PCIe capability\n"); 2210 } 2211 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n"); 2212 } else { 2213 reg = CSR_READ(sc, WMREG_STATUS); 2214 if (reg & STATUS_BUS64) 2215 sc->sc_flags |= WM_F_BUS64; 2216 if ((reg & STATUS_PCIX_MODE) != 0) { 2217 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb; 2218 2219 sc->sc_flags |= WM_F_PCIX; 2220 if (pci_get_capability(pa->pa_pc, pa->pa_tag, 2221 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0) 2222 aprint_error_dev(sc->sc_dev, 2223 "unable to find PCIX capability\n"); 2224 else if (sc->sc_type != WM_T_82545_3 && 2225 sc->sc_type != WM_T_82546_3) { 2226 /* 2227 * Work around a problem caused by the BIOS 2228 * setting the max memory read byte count 2229 * incorrectly. 2230 */ 2231 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag, 2232 sc->sc_pcixe_capoff + PCIX_CMD); 2233 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag, 2234 sc->sc_pcixe_capoff + PCIX_STATUS); 2235 2236 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >> 2237 PCIX_CMD_BYTECNT_SHIFT; 2238 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >> 2239 PCIX_STATUS_MAXB_SHIFT; 2240 if (bytecnt > maxb) { 2241 aprint_verbose_dev(sc->sc_dev, 2242 "resetting PCI-X MMRBC: %d -> %d\n", 2243 512 << bytecnt, 512 << maxb); 2244 pcix_cmd = (pcix_cmd & 2245 ~PCIX_CMD_BYTECNT_MASK) | 2246 (maxb << PCIX_CMD_BYTECNT_SHIFT); 2247 pci_conf_write(pa->pa_pc, pa->pa_tag, 2248 sc->sc_pcixe_capoff + PCIX_CMD, 2249 pcix_cmd); 2250 } 2251 } 2252 } 2253 /* 2254 * The quad port adapter is special; it has a PCIX-PCIX 2255 * bridge on the board, and can run the secondary bus at 2256 * a higher speed. 2257 */ 2258 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) { 2259 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120 2260 : 66; 2261 } else if (sc->sc_flags & WM_F_PCIX) { 2262 switch (reg & STATUS_PCIXSPD_MASK) { 2263 case STATUS_PCIXSPD_50_66: 2264 sc->sc_bus_speed = 66; 2265 break; 2266 case STATUS_PCIXSPD_66_100: 2267 sc->sc_bus_speed = 100; 2268 break; 2269 case STATUS_PCIXSPD_100_133: 2270 sc->sc_bus_speed = 133; 2271 break; 2272 default: 2273 aprint_error_dev(sc->sc_dev, 2274 "unknown PCIXSPD %d; assuming 66MHz\n", 2275 reg & STATUS_PCIXSPD_MASK); 2276 sc->sc_bus_speed = 66; 2277 break; 2278 } 2279 } else 2280 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33; 2281 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n", 2282 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed, 2283 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI"); 2284 } 2285 2286 /* clear interesting stat counters */ 2287 CSR_READ(sc, WMREG_COLC); 2288 CSR_READ(sc, WMREG_RXERRC); 2289 2290 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583) 2291 || (sc->sc_type >= WM_T_ICH8)) 2292 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 2293 if (sc->sc_type >= WM_T_ICH8) 2294 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 2295 2296 /* Set PHY, NVM mutex related stuff */ 2297 switch (sc->sc_type) { 2298 case WM_T_82542_2_0: 2299 case WM_T_82542_2_1: 2300 case WM_T_82543: 2301 case WM_T_82544: 2302 /* Microwire */ 2303 sc->nvm.read = wm_nvm_read_uwire; 2304 sc->sc_nvm_wordsize = 64; 2305 sc->sc_nvm_addrbits = 6; 2306 break; 2307 case WM_T_82540: 2308 case WM_T_82545: 2309 case WM_T_82545_3: 2310 case WM_T_82546: 2311 case WM_T_82546_3: 2312 /* Microwire */ 2313 sc->nvm.read = wm_nvm_read_uwire; 2314 reg = CSR_READ(sc, WMREG_EECD); 2315 if (reg & EECD_EE_SIZE) { 2316 sc->sc_nvm_wordsize = 256; 2317 sc->sc_nvm_addrbits = 8; 2318 } else { 2319 sc->sc_nvm_wordsize = 64; 2320 sc->sc_nvm_addrbits = 6; 2321 } 2322 sc->sc_flags |= WM_F_LOCK_EECD; 2323 sc->nvm.acquire = wm_get_eecd; 2324 sc->nvm.release = wm_put_eecd; 2325 break; 2326 case WM_T_82541: 2327 case WM_T_82541_2: 2328 case WM_T_82547: 2329 case WM_T_82547_2: 2330 reg = CSR_READ(sc, WMREG_EECD); 2331 /* 2332 * wm_nvm_set_addrbits_size_eecd() accesses SPI in it only 2333 * on 8254[17], so set flags and functios before calling it. 2334 */ 2335 sc->sc_flags |= WM_F_LOCK_EECD; 2336 sc->nvm.acquire = wm_get_eecd; 2337 sc->nvm.release = wm_put_eecd; 2338 if (reg & EECD_EE_TYPE) { 2339 /* SPI */ 2340 sc->nvm.read = wm_nvm_read_spi; 2341 sc->sc_flags |= WM_F_EEPROM_SPI; 2342 wm_nvm_set_addrbits_size_eecd(sc); 2343 } else { 2344 /* Microwire */ 2345 sc->nvm.read = wm_nvm_read_uwire; 2346 if ((reg & EECD_EE_ABITS) != 0) { 2347 sc->sc_nvm_wordsize = 256; 2348 sc->sc_nvm_addrbits = 8; 2349 } else { 2350 sc->sc_nvm_wordsize = 64; 2351 sc->sc_nvm_addrbits = 6; 2352 } 2353 } 2354 break; 2355 case WM_T_82571: 2356 case WM_T_82572: 2357 /* SPI */ 2358 sc->nvm.read = wm_nvm_read_eerd; 2359 /* Not use WM_F_LOCK_EECD because we use EERD */ 2360 sc->sc_flags |= WM_F_EEPROM_SPI; 2361 wm_nvm_set_addrbits_size_eecd(sc); 2362 sc->phy.acquire = wm_get_swsm_semaphore; 2363 sc->phy.release = wm_put_swsm_semaphore; 2364 sc->nvm.acquire = wm_get_nvm_82571; 2365 sc->nvm.release = wm_put_nvm_82571; 2366 break; 2367 case WM_T_82573: 2368 case WM_T_82574: 2369 case WM_T_82583: 2370 sc->nvm.read = wm_nvm_read_eerd; 2371 /* Not use WM_F_LOCK_EECD because we use EERD */ 2372 if (sc->sc_type == WM_T_82573) { 2373 sc->phy.acquire = wm_get_swsm_semaphore; 2374 sc->phy.release = wm_put_swsm_semaphore; 2375 sc->nvm.acquire = wm_get_nvm_82571; 2376 sc->nvm.release = wm_put_nvm_82571; 2377 } else { 2378 /* Both PHY and NVM use the same semaphore. */ 2379 sc->phy.acquire = sc->nvm.acquire 2380 = wm_get_swfwhw_semaphore; 2381 sc->phy.release = sc->nvm.release 2382 = wm_put_swfwhw_semaphore; 2383 } 2384 if (wm_nvm_is_onboard_eeprom(sc) == 0) { 2385 sc->sc_flags |= WM_F_EEPROM_FLASH; 2386 sc->sc_nvm_wordsize = 2048; 2387 } else { 2388 /* SPI */ 2389 sc->sc_flags |= WM_F_EEPROM_SPI; 2390 wm_nvm_set_addrbits_size_eecd(sc); 2391 } 2392 break; 2393 case WM_T_82575: 2394 case WM_T_82576: 2395 case WM_T_82580: 2396 case WM_T_I350: 2397 case WM_T_I354: 2398 case WM_T_80003: 2399 /* SPI */ 2400 sc->sc_flags |= WM_F_EEPROM_SPI; 2401 wm_nvm_set_addrbits_size_eecd(sc); 2402 if ((sc->sc_type == WM_T_80003) 2403 || (sc->sc_nvm_wordsize < (1 << 15))) { 2404 sc->nvm.read = wm_nvm_read_eerd; 2405 /* Don't use WM_F_LOCK_EECD because we use EERD */ 2406 } else { 2407 sc->nvm.read = wm_nvm_read_spi; 2408 sc->sc_flags |= WM_F_LOCK_EECD; 2409 } 2410 sc->phy.acquire = wm_get_phy_82575; 2411 sc->phy.release = wm_put_phy_82575; 2412 sc->nvm.acquire = wm_get_nvm_80003; 2413 sc->nvm.release = wm_put_nvm_80003; 2414 break; 2415 case WM_T_ICH8: 2416 case WM_T_ICH9: 2417 case WM_T_ICH10: 2418 case WM_T_PCH: 2419 case WM_T_PCH2: 2420 case WM_T_PCH_LPT: 2421 sc->nvm.read = wm_nvm_read_ich8; 2422 /* FLASH */ 2423 sc->sc_flags |= WM_F_EEPROM_FLASH; 2424 sc->sc_nvm_wordsize = 2048; 2425 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH); 2426 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0, 2427 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) { 2428 aprint_error_dev(sc->sc_dev, 2429 "can't map FLASH registers\n"); 2430 goto out; 2431 } 2432 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG); 2433 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) * 2434 ICH_FLASH_SECTOR_SIZE; 2435 sc->sc_ich8_flash_bank_size = 2436 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1; 2437 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK); 2438 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE; 2439 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t); 2440 sc->sc_flashreg_offset = 0; 2441 sc->phy.acquire = wm_get_swflag_ich8lan; 2442 sc->phy.release = wm_put_swflag_ich8lan; 2443 sc->nvm.acquire = wm_get_nvm_ich8lan; 2444 sc->nvm.release = wm_put_nvm_ich8lan; 2445 break; 2446 case WM_T_PCH_SPT: 2447 case WM_T_PCH_CNP: 2448 sc->nvm.read = wm_nvm_read_spt; 2449 /* SPT has no GFPREG; flash registers mapped through BAR0 */ 2450 sc->sc_flags |= WM_F_EEPROM_FLASH; 2451 sc->sc_flasht = sc->sc_st; 2452 sc->sc_flashh = sc->sc_sh; 2453 sc->sc_ich8_flash_base = 0; 2454 sc->sc_nvm_wordsize = 2455 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1) 2456 * NVM_SIZE_MULTIPLIER; 2457 /* It is size in bytes, we want words */ 2458 sc->sc_nvm_wordsize /= 2; 2459 /* Assume 2 banks */ 2460 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2; 2461 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET; 2462 sc->phy.acquire = wm_get_swflag_ich8lan; 2463 sc->phy.release = wm_put_swflag_ich8lan; 2464 sc->nvm.acquire = wm_get_nvm_ich8lan; 2465 sc->nvm.release = wm_put_nvm_ich8lan; 2466 break; 2467 case WM_T_I210: 2468 case WM_T_I211: 2469 /* Allow a single clear of the SW semaphore on I210 and newer*/ 2470 sc->sc_flags |= WM_F_WA_I210_CLSEM; 2471 if (wm_nvm_flash_presence_i210(sc)) { 2472 sc->nvm.read = wm_nvm_read_eerd; 2473 /* Don't use WM_F_LOCK_EECD because we use EERD */ 2474 sc->sc_flags |= WM_F_EEPROM_FLASH_HW; 2475 wm_nvm_set_addrbits_size_eecd(sc); 2476 } else { 2477 sc->nvm.read = wm_nvm_read_invm; 2478 sc->sc_flags |= WM_F_EEPROM_INVM; 2479 sc->sc_nvm_wordsize = INVM_SIZE; 2480 } 2481 sc->phy.acquire = wm_get_phy_82575; 2482 sc->phy.release = wm_put_phy_82575; 2483 sc->nvm.acquire = wm_get_nvm_80003; 2484 sc->nvm.release = wm_put_nvm_80003; 2485 break; 2486 default: 2487 break; 2488 } 2489 2490 /* Ensure the SMBI bit is clear before first NVM or PHY access */ 2491 switch (sc->sc_type) { 2492 case WM_T_82571: 2493 case WM_T_82572: 2494 reg = CSR_READ(sc, WMREG_SWSM2); 2495 if ((reg & SWSM2_LOCK) == 0) { 2496 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK); 2497 force_clear_smbi = true; 2498 } else 2499 force_clear_smbi = false; 2500 break; 2501 case WM_T_82573: 2502 case WM_T_82574: 2503 case WM_T_82583: 2504 force_clear_smbi = true; 2505 break; 2506 default: 2507 force_clear_smbi = false; 2508 break; 2509 } 2510 if (force_clear_smbi) { 2511 reg = CSR_READ(sc, WMREG_SWSM); 2512 if ((reg & SWSM_SMBI) != 0) 2513 aprint_error_dev(sc->sc_dev, 2514 "Please update the Bootagent\n"); 2515 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI); 2516 } 2517 2518 /* 2519 * Defer printing the EEPROM type until after verifying the checksum 2520 * This allows the EEPROM type to be printed correctly in the case 2521 * that no EEPROM is attached. 2522 */ 2523 /* 2524 * Validate the EEPROM checksum. If the checksum fails, flag 2525 * this for later, so we can fail future reads from the EEPROM. 2526 */ 2527 if (wm_nvm_validate_checksum(sc)) { 2528 /* 2529 * Read twice again because some PCI-e parts fail the 2530 * first check due to the link being in sleep state. 2531 */ 2532 if (wm_nvm_validate_checksum(sc)) 2533 sc->sc_flags |= WM_F_EEPROM_INVALID; 2534 } 2535 2536 if (sc->sc_flags & WM_F_EEPROM_INVALID) 2537 aprint_verbose_dev(sc->sc_dev, "No EEPROM"); 2538 else { 2539 aprint_verbose_dev(sc->sc_dev, "%u words ", 2540 sc->sc_nvm_wordsize); 2541 if (sc->sc_flags & WM_F_EEPROM_INVM) 2542 aprint_verbose("iNVM"); 2543 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW) 2544 aprint_verbose("FLASH(HW)"); 2545 else if (sc->sc_flags & WM_F_EEPROM_FLASH) 2546 aprint_verbose("FLASH"); 2547 else { 2548 if (sc->sc_flags & WM_F_EEPROM_SPI) 2549 eetype = "SPI"; 2550 else 2551 eetype = "MicroWire"; 2552 aprint_verbose("(%d address bits) %s EEPROM", 2553 sc->sc_nvm_addrbits, eetype); 2554 } 2555 } 2556 wm_nvm_version(sc); 2557 aprint_verbose("\n"); 2558 2559 /* 2560 * XXX The first call of wm_gmii_setup_phytype. The result might be 2561 * incorrect. 2562 */ 2563 wm_gmii_setup_phytype(sc, 0, 0); 2564 2565 /* Check for WM_F_WOL on some chips before wm_reset() */ 2566 switch (sc->sc_type) { 2567 case WM_T_ICH8: 2568 case WM_T_ICH9: 2569 case WM_T_ICH10: 2570 case WM_T_PCH: 2571 case WM_T_PCH2: 2572 case WM_T_PCH_LPT: 2573 case WM_T_PCH_SPT: 2574 case WM_T_PCH_CNP: 2575 apme_mask = WUC_APME; 2576 eeprom_data = CSR_READ(sc, WMREG_WUC); 2577 if ((eeprom_data & apme_mask) != 0) 2578 sc->sc_flags |= WM_F_WOL; 2579 break; 2580 default: 2581 break; 2582 } 2583 2584 /* Reset the chip to a known state. */ 2585 wm_reset(sc); 2586 2587 /* 2588 * Check for I21[01] PLL workaround. 2589 * 2590 * Three cases: 2591 * a) Chip is I211. 2592 * b) Chip is I210 and it uses INVM (not FLASH). 2593 * c) Chip is I210 (and it uses FLASH) and the NVM image version < 3.25 2594 */ 2595 if (sc->sc_type == WM_T_I211) 2596 sc->sc_flags |= WM_F_PLL_WA_I210; 2597 if (sc->sc_type == WM_T_I210) { 2598 if (!wm_nvm_flash_presence_i210(sc)) 2599 sc->sc_flags |= WM_F_PLL_WA_I210; 2600 else if ((sc->sc_nvm_ver_major < 3) 2601 || ((sc->sc_nvm_ver_major == 3) 2602 && (sc->sc_nvm_ver_minor < 25))) { 2603 aprint_verbose_dev(sc->sc_dev, 2604 "ROM image version %d.%d is older than 3.25\n", 2605 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor); 2606 sc->sc_flags |= WM_F_PLL_WA_I210; 2607 } 2608 } 2609 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0) 2610 wm_pll_workaround_i210(sc); 2611 2612 wm_get_wakeup(sc); 2613 2614 /* Non-AMT based hardware can now take control from firmware */ 2615 if ((sc->sc_flags & WM_F_HAS_AMT) == 0) 2616 wm_get_hw_control(sc); 2617 2618 /* 2619 * Read the Ethernet address from the EEPROM, if not first found 2620 * in device properties. 2621 */ 2622 ea = prop_dictionary_get(dict, "mac-address"); 2623 if (ea != NULL) { 2624 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA); 2625 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN); 2626 memcpy(enaddr, prop_data_value(ea), ETHER_ADDR_LEN); 2627 } else { 2628 if (wm_read_mac_addr(sc, enaddr) != 0) { 2629 aprint_error_dev(sc->sc_dev, 2630 "unable to read Ethernet address\n"); 2631 goto out; 2632 } 2633 } 2634 2635 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n", 2636 ether_sprintf(enaddr)); 2637 2638 /* 2639 * Read the config info from the EEPROM, and set up various 2640 * bits in the control registers based on their contents. 2641 */ 2642 pn = prop_dictionary_get(dict, "i82543-cfg1"); 2643 if (pn != NULL) { 2644 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2645 cfg1 = (uint16_t) prop_number_signed_value(pn); 2646 } else { 2647 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) { 2648 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n"); 2649 goto out; 2650 } 2651 } 2652 2653 pn = prop_dictionary_get(dict, "i82543-cfg2"); 2654 if (pn != NULL) { 2655 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2656 cfg2 = (uint16_t) prop_number_signed_value(pn); 2657 } else { 2658 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) { 2659 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n"); 2660 goto out; 2661 } 2662 } 2663 2664 /* check for WM_F_WOL */ 2665 switch (sc->sc_type) { 2666 case WM_T_82542_2_0: 2667 case WM_T_82542_2_1: 2668 case WM_T_82543: 2669 /* dummy? */ 2670 eeprom_data = 0; 2671 apme_mask = NVM_CFG3_APME; 2672 break; 2673 case WM_T_82544: 2674 apme_mask = NVM_CFG2_82544_APM_EN; 2675 eeprom_data = cfg2; 2676 break; 2677 case WM_T_82546: 2678 case WM_T_82546_3: 2679 case WM_T_82571: 2680 case WM_T_82572: 2681 case WM_T_82573: 2682 case WM_T_82574: 2683 case WM_T_82583: 2684 case WM_T_80003: 2685 case WM_T_82575: 2686 case WM_T_82576: 2687 apme_mask = NVM_CFG3_APME; 2688 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB 2689 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data); 2690 break; 2691 case WM_T_82580: 2692 case WM_T_I350: 2693 case WM_T_I354: 2694 case WM_T_I210: 2695 case WM_T_I211: 2696 apme_mask = NVM_CFG3_APME; 2697 wm_nvm_read(sc, 2698 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA, 2699 1, &eeprom_data); 2700 break; 2701 case WM_T_ICH8: 2702 case WM_T_ICH9: 2703 case WM_T_ICH10: 2704 case WM_T_PCH: 2705 case WM_T_PCH2: 2706 case WM_T_PCH_LPT: 2707 case WM_T_PCH_SPT: 2708 case WM_T_PCH_CNP: 2709 /* Already checked before wm_reset () */ 2710 apme_mask = eeprom_data = 0; 2711 break; 2712 default: /* XXX 82540 */ 2713 apme_mask = NVM_CFG3_APME; 2714 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &eeprom_data); 2715 break; 2716 } 2717 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */ 2718 if ((eeprom_data & apme_mask) != 0) 2719 sc->sc_flags |= WM_F_WOL; 2720 2721 /* 2722 * We have the eeprom settings, now apply the special cases 2723 * where the eeprom may be wrong or the board won't support 2724 * wake on lan on a particular port 2725 */ 2726 switch (sc->sc_pcidevid) { 2727 case PCI_PRODUCT_INTEL_82546GB_PCIE: 2728 sc->sc_flags &= ~WM_F_WOL; 2729 break; 2730 case PCI_PRODUCT_INTEL_82546EB_FIBER: 2731 case PCI_PRODUCT_INTEL_82546GB_FIBER: 2732 /* Wake events only supported on port A for dual fiber 2733 * regardless of eeprom setting */ 2734 if (sc->sc_funcid == 1) 2735 sc->sc_flags &= ~WM_F_WOL; 2736 break; 2737 case PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3: 2738 /* If quad port adapter, disable WoL on all but port A */ 2739 if (sc->sc_funcid != 0) 2740 sc->sc_flags &= ~WM_F_WOL; 2741 break; 2742 case PCI_PRODUCT_INTEL_82571EB_FIBER: 2743 /* Wake events only supported on port A for dual fiber 2744 * regardless of eeprom setting */ 2745 if (sc->sc_funcid == 1) 2746 sc->sc_flags &= ~WM_F_WOL; 2747 break; 2748 case PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER: 2749 case PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER: 2750 case PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER: 2751 /* If quad port adapter, disable WoL on all but port A */ 2752 if (sc->sc_funcid != 0) 2753 sc->sc_flags &= ~WM_F_WOL; 2754 break; 2755 } 2756 2757 if (sc->sc_type >= WM_T_82575) { 2758 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) { 2759 aprint_debug_dev(sc->sc_dev, "COMPAT = %hx\n", 2760 nvmword); 2761 if ((sc->sc_type == WM_T_82575) || 2762 (sc->sc_type == WM_T_82576)) { 2763 /* Check NVM for autonegotiation */ 2764 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) 2765 != 0) 2766 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO; 2767 } 2768 if ((sc->sc_type == WM_T_82575) || 2769 (sc->sc_type == WM_T_I350)) { 2770 if (nvmword & NVM_COMPAT_MAS_EN(sc->sc_funcid)) 2771 sc->sc_flags |= WM_F_MAS; 2772 } 2773 } 2774 } 2775 2776 /* 2777 * XXX need special handling for some multiple port cards 2778 * to disable a paticular port. 2779 */ 2780 2781 if (sc->sc_type >= WM_T_82544) { 2782 pn = prop_dictionary_get(dict, "i82543-swdpin"); 2783 if (pn != NULL) { 2784 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2785 swdpin = (uint16_t) prop_number_signed_value(pn); 2786 } else { 2787 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) { 2788 aprint_error_dev(sc->sc_dev, 2789 "unable to read SWDPIN\n"); 2790 goto out; 2791 } 2792 } 2793 } 2794 2795 if (cfg1 & NVM_CFG1_ILOS) 2796 sc->sc_ctrl |= CTRL_ILOS; 2797 2798 /* 2799 * XXX 2800 * This code isn't correct because pin 2 and 3 are located 2801 * in different position on newer chips. Check all datasheet. 2802 * 2803 * Until resolve this problem, check if a chip < 82580 2804 */ 2805 if (sc->sc_type <= WM_T_82580) { 2806 if (sc->sc_type >= WM_T_82544) { 2807 sc->sc_ctrl |= 2808 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) << 2809 CTRL_SWDPIO_SHIFT; 2810 sc->sc_ctrl |= 2811 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) << 2812 CTRL_SWDPINS_SHIFT; 2813 } else { 2814 sc->sc_ctrl |= 2815 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) << 2816 CTRL_SWDPIO_SHIFT; 2817 } 2818 } 2819 2820 if ((sc->sc_type >= WM_T_82580) && (sc->sc_type <= WM_T_I211)) { 2821 wm_nvm_read(sc, 2822 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA, 2823 1, &nvmword); 2824 if (nvmword & NVM_CFG3_ILOS) 2825 sc->sc_ctrl |= CTRL_ILOS; 2826 } 2827 2828 #if 0 2829 if (sc->sc_type >= WM_T_82544) { 2830 if (cfg1 & NVM_CFG1_IPS0) 2831 sc->sc_ctrl_ext |= CTRL_EXT_IPS; 2832 if (cfg1 & NVM_CFG1_IPS1) 2833 sc->sc_ctrl_ext |= CTRL_EXT_IPS1; 2834 sc->sc_ctrl_ext |= 2835 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) << 2836 CTRL_EXT_SWDPIO_SHIFT; 2837 sc->sc_ctrl_ext |= 2838 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) << 2839 CTRL_EXT_SWDPINS_SHIFT; 2840 } else { 2841 sc->sc_ctrl_ext |= 2842 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) << 2843 CTRL_EXT_SWDPIO_SHIFT; 2844 } 2845 #endif 2846 2847 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 2848 #if 0 2849 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext); 2850 #endif 2851 2852 if (sc->sc_type == WM_T_PCH) { 2853 uint16_t val; 2854 2855 /* Save the NVM K1 bit setting */ 2856 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val); 2857 2858 if ((val & NVM_K1_CONFIG_ENABLE) != 0) 2859 sc->sc_nvm_k1_enabled = 1; 2860 else 2861 sc->sc_nvm_k1_enabled = 0; 2862 } 2863 2864 /* Determine if we're GMII, TBI, SERDES or SGMII mode */ 2865 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9 2866 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH 2867 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT 2868 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_PCH_CNP 2869 || sc->sc_type == WM_T_82573 2870 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) { 2871 /* Copper only */ 2872 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 2873 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350) 2874 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210) 2875 || (sc->sc_type ==WM_T_I211)) { 2876 reg = CSR_READ(sc, WMREG_CTRL_EXT); 2877 link_mode = reg & CTRL_EXT_LINK_MODE_MASK; 2878 switch (link_mode) { 2879 case CTRL_EXT_LINK_MODE_1000KX: 2880 aprint_normal_dev(sc->sc_dev, "1000KX\n"); 2881 sc->sc_mediatype = WM_MEDIATYPE_SERDES; 2882 break; 2883 case CTRL_EXT_LINK_MODE_SGMII: 2884 if (wm_sgmii_uses_mdio(sc)) { 2885 aprint_normal_dev(sc->sc_dev, 2886 "SGMII(MDIO)\n"); 2887 sc->sc_flags |= WM_F_SGMII; 2888 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2889 break; 2890 } 2891 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n"); 2892 /*FALLTHROUGH*/ 2893 case CTRL_EXT_LINK_MODE_PCIE_SERDES: 2894 sc->sc_mediatype = wm_sfp_get_media_type(sc); 2895 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) { 2896 if (link_mode 2897 == CTRL_EXT_LINK_MODE_SGMII) { 2898 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2899 sc->sc_flags |= WM_F_SGMII; 2900 aprint_verbose_dev(sc->sc_dev, 2901 "SGMII\n"); 2902 } else { 2903 sc->sc_mediatype = WM_MEDIATYPE_SERDES; 2904 aprint_verbose_dev(sc->sc_dev, 2905 "SERDES\n"); 2906 } 2907 break; 2908 } 2909 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) 2910 aprint_normal_dev(sc->sc_dev, "SERDES(SFP)\n"); 2911 else if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) { 2912 aprint_normal_dev(sc->sc_dev, "SGMII(SFP)\n"); 2913 sc->sc_flags |= WM_F_SGMII; 2914 } 2915 /* Do not change link mode for 100BaseFX */ 2916 if (sc->sc_sfptype == SFF_SFP_ETH_FLAGS_100FX) 2917 break; 2918 2919 /* Change current link mode setting */ 2920 reg &= ~CTRL_EXT_LINK_MODE_MASK; 2921 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) 2922 reg |= CTRL_EXT_LINK_MODE_SGMII; 2923 else 2924 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES; 2925 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 2926 break; 2927 case CTRL_EXT_LINK_MODE_GMII: 2928 default: 2929 aprint_normal_dev(sc->sc_dev, "Copper\n"); 2930 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2931 break; 2932 } 2933 2934 reg &= ~CTRL_EXT_I2C_ENA; 2935 if ((sc->sc_flags & WM_F_SGMII) != 0) 2936 reg |= CTRL_EXT_I2C_ENA; 2937 else 2938 reg &= ~CTRL_EXT_I2C_ENA; 2939 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 2940 if ((sc->sc_flags & WM_F_SGMII) != 0) { 2941 if (!wm_sgmii_uses_mdio(sc)) 2942 wm_gmii_setup_phytype(sc, 0, 0); 2943 wm_reset_mdicnfg_82580(sc); 2944 } 2945 } else if (sc->sc_type < WM_T_82543 || 2946 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) { 2947 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) { 2948 aprint_error_dev(sc->sc_dev, 2949 "WARNING: TBIMODE set on 1000BASE-T product!\n"); 2950 sc->sc_mediatype = WM_MEDIATYPE_FIBER; 2951 } 2952 } else { 2953 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) { 2954 aprint_error_dev(sc->sc_dev, 2955 "WARNING: TBIMODE clear on 1000BASE-X product!\n"); 2956 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2957 } 2958 } 2959 2960 if (sc->sc_type >= WM_T_PCH2) 2961 sc->sc_flags |= WM_F_EEE; 2962 else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211) 2963 && (sc->sc_mediatype == WM_MEDIATYPE_COPPER)) { 2964 /* XXX: Need special handling for I354. (not yet) */ 2965 if (sc->sc_type != WM_T_I354) 2966 sc->sc_flags |= WM_F_EEE; 2967 } 2968 2969 /* 2970 * The I350 has a bug where it always strips the CRC whether 2971 * asked to or not. So ask for stripped CRC here and cope in rxeof 2972 */ 2973 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 2974 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 2975 sc->sc_flags |= WM_F_CRC_STRIP; 2976 2977 /* Set device properties (macflags) */ 2978 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags); 2979 2980 if (sc->sc_flags != 0) { 2981 snprintb(buf, sizeof(buf), WM_FLAGS, sc->sc_flags); 2982 aprint_verbose_dev(sc->sc_dev, "%s\n", buf); 2983 } 2984 2985 #ifdef WM_MPSAFE 2986 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 2987 #else 2988 sc->sc_core_lock = NULL; 2989 #endif 2990 2991 /* Initialize the media structures accordingly. */ 2992 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) 2993 wm_gmii_mediainit(sc, wmp->wmp_product); 2994 else 2995 wm_tbi_mediainit(sc); /* All others */ 2996 2997 ifp = &sc->sc_ethercom.ec_if; 2998 xname = device_xname(sc->sc_dev); 2999 strlcpy(ifp->if_xname, xname, IFNAMSIZ); 3000 ifp->if_softc = sc; 3001 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 3002 #ifdef WM_MPSAFE 3003 ifp->if_extflags = IFEF_MPSAFE; 3004 #endif 3005 ifp->if_ioctl = wm_ioctl; 3006 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 3007 ifp->if_start = wm_nq_start; 3008 /* 3009 * When the number of CPUs is one and the controller can use 3010 * MSI-X, wm(4) use MSI-X but *does not* use multiqueue. 3011 * That is, wm(4) use two interrupts, one is used for Tx/Rx 3012 * and the other is used for link status changing. 3013 * In this situation, wm_nq_transmit() is disadvantageous 3014 * because of wm_select_txqueue() and pcq(9) overhead. 3015 */ 3016 if (wm_is_using_multiqueue(sc)) 3017 ifp->if_transmit = wm_nq_transmit; 3018 } else { 3019 ifp->if_start = wm_start; 3020 /* 3021 * wm_transmit() has the same disadvantage as wm_transmit(). 3022 */ 3023 if (wm_is_using_multiqueue(sc)) 3024 ifp->if_transmit = wm_transmit; 3025 } 3026 /* wm(4) doest not use ifp->if_watchdog, use wm_tick as watchdog. */ 3027 ifp->if_init = wm_init; 3028 ifp->if_stop = wm_stop; 3029 IFQ_SET_MAXLEN(&ifp->if_snd, uimax(WM_IFQUEUELEN, IFQ_MAXLEN)); 3030 IFQ_SET_READY(&ifp->if_snd); 3031 3032 /* Check for jumbo frame */ 3033 switch (sc->sc_type) { 3034 case WM_T_82573: 3035 /* XXX limited to 9234 if ASPM is disabled */ 3036 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword); 3037 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0) 3038 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3039 break; 3040 case WM_T_82571: 3041 case WM_T_82572: 3042 case WM_T_82574: 3043 case WM_T_82583: 3044 case WM_T_82575: 3045 case WM_T_82576: 3046 case WM_T_82580: 3047 case WM_T_I350: 3048 case WM_T_I354: 3049 case WM_T_I210: 3050 case WM_T_I211: 3051 case WM_T_80003: 3052 case WM_T_ICH9: 3053 case WM_T_ICH10: 3054 case WM_T_PCH2: /* PCH2 supports 9K frame size */ 3055 case WM_T_PCH_LPT: 3056 case WM_T_PCH_SPT: 3057 case WM_T_PCH_CNP: 3058 /* XXX limited to 9234 */ 3059 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3060 break; 3061 case WM_T_PCH: 3062 /* XXX limited to 4096 */ 3063 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3064 break; 3065 case WM_T_82542_2_0: 3066 case WM_T_82542_2_1: 3067 case WM_T_ICH8: 3068 /* No support for jumbo frame */ 3069 break; 3070 default: 3071 /* ETHER_MAX_LEN_JUMBO */ 3072 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3073 break; 3074 } 3075 3076 /* If we're a i82543 or greater, we can support VLANs. */ 3077 if (sc->sc_type >= WM_T_82543) { 3078 sc->sc_ethercom.ec_capabilities |= 3079 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING; 3080 sc->sc_ethercom.ec_capenable |= ETHERCAP_VLAN_HWTAGGING; 3081 } 3082 3083 if ((sc->sc_flags & WM_F_EEE) != 0) 3084 sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE; 3085 3086 /* 3087 * We can perform TCPv4 and UDPv4 checkums in-bound. Only 3088 * on i82543 and later. 3089 */ 3090 if (sc->sc_type >= WM_T_82543) { 3091 ifp->if_capabilities |= 3092 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx | 3093 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx | 3094 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx | 3095 IFCAP_CSUM_TCPv6_Tx | 3096 IFCAP_CSUM_UDPv6_Tx; 3097 } 3098 3099 /* 3100 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL. 3101 * 3102 * 82541GI (8086:1076) ... no 3103 * 82572EI (8086:10b9) ... yes 3104 */ 3105 if (sc->sc_type >= WM_T_82571) { 3106 ifp->if_capabilities |= 3107 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx; 3108 } 3109 3110 /* 3111 * If we're a i82544 or greater (except i82547), we can do 3112 * TCP segmentation offload. 3113 */ 3114 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) { 3115 ifp->if_capabilities |= IFCAP_TSOv4; 3116 } 3117 3118 if (sc->sc_type >= WM_T_82571) { 3119 ifp->if_capabilities |= IFCAP_TSOv6; 3120 } 3121 3122 sc->sc_tx_process_limit = WM_TX_PROCESS_LIMIT_DEFAULT; 3123 sc->sc_tx_intr_process_limit = WM_TX_INTR_PROCESS_LIMIT_DEFAULT; 3124 sc->sc_rx_process_limit = WM_RX_PROCESS_LIMIT_DEFAULT; 3125 sc->sc_rx_intr_process_limit = WM_RX_INTR_PROCESS_LIMIT_DEFAULT; 3126 3127 /* Attach the interface. */ 3128 if_initialize(ifp); 3129 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if); 3130 ether_ifattach(ifp, enaddr); 3131 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb); 3132 if_register(ifp); 3133 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET, 3134 RND_FLAG_DEFAULT); 3135 3136 #ifdef WM_EVENT_COUNTERS 3137 /* Attach event counters. */ 3138 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR, 3139 NULL, xname, "linkintr"); 3140 3141 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC, 3142 NULL, xname, "tx_xoff"); 3143 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC, 3144 NULL, xname, "tx_xon"); 3145 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC, 3146 NULL, xname, "rx_xoff"); 3147 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC, 3148 NULL, xname, "rx_xon"); 3149 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC, 3150 NULL, xname, "rx_macctl"); 3151 #endif /* WM_EVENT_COUNTERS */ 3152 3153 sc->sc_txrx_use_workqueue = false; 3154 3155 if (wm_phy_need_linkdown_discard(sc)) 3156 wm_set_linkdown_discard(sc); 3157 3158 wm_init_sysctls(sc); 3159 3160 if (pmf_device_register(self, wm_suspend, wm_resume)) 3161 pmf_class_network_register(self, ifp); 3162 else 3163 aprint_error_dev(self, "couldn't establish power handler\n"); 3164 3165 sc->sc_flags |= WM_F_ATTACHED; 3166 out: 3167 return; 3168 } 3169 3170 /* The detach function (ca_detach) */ 3171 static int 3172 wm_detach(device_t self, int flags __unused) 3173 { 3174 struct wm_softc *sc = device_private(self); 3175 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3176 int i; 3177 3178 if ((sc->sc_flags & WM_F_ATTACHED) == 0) 3179 return 0; 3180 3181 /* Stop the interface. Callouts are stopped in it. */ 3182 wm_stop(ifp, 1); 3183 3184 pmf_device_deregister(self); 3185 3186 sysctl_teardown(&sc->sc_sysctllog); 3187 3188 #ifdef WM_EVENT_COUNTERS 3189 evcnt_detach(&sc->sc_ev_linkintr); 3190 3191 evcnt_detach(&sc->sc_ev_tx_xoff); 3192 evcnt_detach(&sc->sc_ev_tx_xon); 3193 evcnt_detach(&sc->sc_ev_rx_xoff); 3194 evcnt_detach(&sc->sc_ev_rx_xon); 3195 evcnt_detach(&sc->sc_ev_rx_macctl); 3196 #endif /* WM_EVENT_COUNTERS */ 3197 3198 rnd_detach_source(&sc->rnd_source); 3199 3200 /* Tell the firmware about the release */ 3201 WM_CORE_LOCK(sc); 3202 wm_release_manageability(sc); 3203 wm_release_hw_control(sc); 3204 wm_enable_wakeup(sc); 3205 WM_CORE_UNLOCK(sc); 3206 3207 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY); 3208 3209 ether_ifdetach(ifp); 3210 if_detach(ifp); 3211 if_percpuq_destroy(sc->sc_ipq); 3212 3213 /* Delete all remaining media. */ 3214 ifmedia_fini(&sc->sc_mii.mii_media); 3215 3216 /* Unload RX dmamaps and free mbufs */ 3217 for (i = 0; i < sc->sc_nqueues; i++) { 3218 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 3219 mutex_enter(rxq->rxq_lock); 3220 wm_rxdrain(rxq); 3221 mutex_exit(rxq->rxq_lock); 3222 } 3223 /* Must unlock here */ 3224 3225 /* Disestablish the interrupt handler */ 3226 for (i = 0; i < sc->sc_nintrs; i++) { 3227 if (sc->sc_ihs[i] != NULL) { 3228 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 3229 sc->sc_ihs[i] = NULL; 3230 } 3231 } 3232 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs); 3233 3234 /* wm_stop() ensure workqueue is stopped. */ 3235 workqueue_destroy(sc->sc_queue_wq); 3236 3237 for (i = 0; i < sc->sc_nqueues; i++) 3238 softint_disestablish(sc->sc_queue[i].wmq_si); 3239 3240 wm_free_txrx_queues(sc); 3241 3242 /* Unmap the registers */ 3243 if (sc->sc_ss) { 3244 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss); 3245 sc->sc_ss = 0; 3246 } 3247 if (sc->sc_ios) { 3248 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 3249 sc->sc_ios = 0; 3250 } 3251 if (sc->sc_flashs) { 3252 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs); 3253 sc->sc_flashs = 0; 3254 } 3255 3256 if (sc->sc_core_lock) 3257 mutex_obj_free(sc->sc_core_lock); 3258 if (sc->sc_ich_phymtx) 3259 mutex_obj_free(sc->sc_ich_phymtx); 3260 if (sc->sc_ich_nvmmtx) 3261 mutex_obj_free(sc->sc_ich_nvmmtx); 3262 3263 return 0; 3264 } 3265 3266 static bool 3267 wm_suspend(device_t self, const pmf_qual_t *qual) 3268 { 3269 struct wm_softc *sc = device_private(self); 3270 3271 wm_release_manageability(sc); 3272 wm_release_hw_control(sc); 3273 wm_enable_wakeup(sc); 3274 3275 return true; 3276 } 3277 3278 static bool 3279 wm_resume(device_t self, const pmf_qual_t *qual) 3280 { 3281 struct wm_softc *sc = device_private(self); 3282 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3283 pcireg_t reg; 3284 char buf[256]; 3285 3286 reg = CSR_READ(sc, WMREG_WUS); 3287 if (reg != 0) { 3288 snprintb(buf, sizeof(buf), WUS_FLAGS, reg); 3289 device_printf(sc->sc_dev, "wakeup status %s\n", buf); 3290 CSR_WRITE(sc, WMREG_WUS, 0xffffffff); /* W1C */ 3291 } 3292 3293 if (sc->sc_type >= WM_T_PCH2) 3294 wm_resume_workarounds_pchlan(sc); 3295 if ((ifp->if_flags & IFF_UP) == 0) { 3296 /* >= PCH_SPT hardware workaround before reset. */ 3297 if (sc->sc_type >= WM_T_PCH_SPT) 3298 wm_flush_desc_rings(sc); 3299 3300 wm_reset(sc); 3301 /* Non-AMT based hardware can now take control from firmware */ 3302 if ((sc->sc_flags & WM_F_HAS_AMT) == 0) 3303 wm_get_hw_control(sc); 3304 wm_init_manageability(sc); 3305 } else { 3306 /* 3307 * We called pmf_class_network_register(), so if_init() is 3308 * automatically called when IFF_UP. wm_reset(), 3309 * wm_get_hw_control() and wm_init_manageability() are called 3310 * via wm_init(). 3311 */ 3312 } 3313 3314 return true; 3315 } 3316 3317 /* 3318 * wm_watchdog: [ifnet interface function] 3319 * 3320 * Watchdog timer handler. 3321 */ 3322 static void 3323 wm_watchdog(struct ifnet *ifp) 3324 { 3325 int qid; 3326 struct wm_softc *sc = ifp->if_softc; 3327 uint16_t hang_queue = 0; /* Max queue number of wm(4) is 82576's 16. */ 3328 3329 for (qid = 0; qid < sc->sc_nqueues; qid++) { 3330 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq; 3331 3332 wm_watchdog_txq(ifp, txq, &hang_queue); 3333 } 3334 3335 /* IF any of queues hanged up, reset the interface. */ 3336 if (hang_queue != 0) { 3337 (void)wm_init(ifp); 3338 3339 /* 3340 * There are still some upper layer processing which call 3341 * ifp->if_start(). e.g. ALTQ or one CPU system 3342 */ 3343 /* Try to get more packets going. */ 3344 ifp->if_start(ifp); 3345 } 3346 } 3347 3348 3349 static void 3350 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang) 3351 { 3352 3353 mutex_enter(txq->txq_lock); 3354 if (txq->txq_sending && 3355 time_uptime - txq->txq_lastsent > wm_watchdog_timeout) 3356 wm_watchdog_txq_locked(ifp, txq, hang); 3357 3358 mutex_exit(txq->txq_lock); 3359 } 3360 3361 static void 3362 wm_watchdog_txq_locked(struct ifnet *ifp, struct wm_txqueue *txq, 3363 uint16_t *hang) 3364 { 3365 struct wm_softc *sc = ifp->if_softc; 3366 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq); 3367 3368 KASSERT(mutex_owned(txq->txq_lock)); 3369 3370 /* 3371 * Since we're using delayed interrupts, sweep up 3372 * before we report an error. 3373 */ 3374 wm_txeof(txq, UINT_MAX); 3375 3376 if (txq->txq_sending) 3377 *hang |= __BIT(wmq->wmq_id); 3378 3379 if (txq->txq_free == WM_NTXDESC(txq)) { 3380 log(LOG_ERR, "%s: device timeout (lost interrupt)\n", 3381 device_xname(sc->sc_dev)); 3382 } else { 3383 #ifdef WM_DEBUG 3384 int i, j; 3385 struct wm_txsoft *txs; 3386 #endif 3387 log(LOG_ERR, 3388 "%s: device timeout (txfree %d txsfree %d txnext %d)\n", 3389 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree, 3390 txq->txq_next); 3391 if_statinc(ifp, if_oerrors); 3392 #ifdef WM_DEBUG 3393 for (i = txq->txq_sdirty; i != txq->txq_snext; 3394 i = WM_NEXTTXS(txq, i)) { 3395 txs = &txq->txq_soft[i]; 3396 printf("txs %d tx %d -> %d\n", 3397 i, txs->txs_firstdesc, txs->txs_lastdesc); 3398 for (j = txs->txs_firstdesc; ; j = WM_NEXTTX(txq, j)) { 3399 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 3400 printf("\tdesc %d: 0x%" PRIx64 "\n", j, 3401 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr); 3402 printf("\t %#08x%08x\n", 3403 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields, 3404 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen); 3405 } else { 3406 printf("\tdesc %d: 0x%" PRIx64 "\n", j, 3407 (uint64_t)txq->txq_descs[j].wtx_addr.wa_high << 32 | 3408 txq->txq_descs[j].wtx_addr.wa_low); 3409 printf("\t %#04x%02x%02x%08x\n", 3410 txq->txq_descs[j].wtx_fields.wtxu_vlan, 3411 txq->txq_descs[j].wtx_fields.wtxu_options, 3412 txq->txq_descs[j].wtx_fields.wtxu_status, 3413 txq->txq_descs[j].wtx_cmdlen); 3414 } 3415 if (j == txs->txs_lastdesc) 3416 break; 3417 } 3418 } 3419 #endif 3420 } 3421 } 3422 3423 /* 3424 * wm_tick: 3425 * 3426 * One second timer, used to check link status, sweep up 3427 * completed transmit jobs, etc. 3428 */ 3429 static void 3430 wm_tick(void *arg) 3431 { 3432 struct wm_softc *sc = arg; 3433 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3434 #ifndef WM_MPSAFE 3435 int s = splnet(); 3436 #endif 3437 3438 WM_CORE_LOCK(sc); 3439 3440 if (sc->sc_core_stopping) { 3441 WM_CORE_UNLOCK(sc); 3442 #ifndef WM_MPSAFE 3443 splx(s); 3444 #endif 3445 return; 3446 } 3447 3448 if (sc->sc_type >= WM_T_82542_2_1) { 3449 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC)); 3450 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC)); 3451 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC)); 3452 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC)); 3453 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC)); 3454 } 3455 3456 net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 3457 if_statadd_ref(nsr, if_collisions, CSR_READ(sc, WMREG_COLC)); 3458 if_statadd_ref(nsr, if_ierrors, 0ULL /* ensure quad_t */ 3459 + CSR_READ(sc, WMREG_CRCERRS) 3460 + CSR_READ(sc, WMREG_ALGNERRC) 3461 + CSR_READ(sc, WMREG_SYMERRC) 3462 + CSR_READ(sc, WMREG_RXERRC) 3463 + CSR_READ(sc, WMREG_SEC) 3464 + CSR_READ(sc, WMREG_CEXTERR) 3465 + CSR_READ(sc, WMREG_RLEC)); 3466 /* 3467 * WMREG_RNBC is incremented when there is no available buffers in host 3468 * memory. It does not mean the number of dropped packet. Because 3469 * ethernet controller can receive packets in such case if there is 3470 * space in phy's FIFO. 3471 * 3472 * If you want to know the nubmer of WMREG_RMBC, you should use such as 3473 * own EVCNT instead of if_iqdrops. 3474 */ 3475 if_statadd_ref(nsr, if_iqdrops, CSR_READ(sc, WMREG_MPC)); 3476 IF_STAT_PUTREF(ifp); 3477 3478 if (sc->sc_flags & WM_F_HAS_MII) 3479 mii_tick(&sc->sc_mii); 3480 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211) 3481 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 3482 wm_serdes_tick(sc); 3483 else 3484 wm_tbi_tick(sc); 3485 3486 WM_CORE_UNLOCK(sc); 3487 3488 wm_watchdog(ifp); 3489 3490 callout_schedule(&sc->sc_tick_ch, hz); 3491 } 3492 3493 static int 3494 wm_ifflags_cb(struct ethercom *ec) 3495 { 3496 struct ifnet *ifp = &ec->ec_if; 3497 struct wm_softc *sc = ifp->if_softc; 3498 u_short iffchange; 3499 int ecchange; 3500 bool needreset = false; 3501 int rc = 0; 3502 3503 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 3504 device_xname(sc->sc_dev), __func__)); 3505 3506 WM_CORE_LOCK(sc); 3507 3508 /* 3509 * Check for if_flags. 3510 * Main usage is to prevent linkdown when opening bpf. 3511 */ 3512 iffchange = ifp->if_flags ^ sc->sc_if_flags; 3513 sc->sc_if_flags = ifp->if_flags; 3514 if ((iffchange & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) { 3515 needreset = true; 3516 goto ec; 3517 } 3518 3519 /* iff related updates */ 3520 if ((iffchange & IFF_PROMISC) != 0) 3521 wm_set_filter(sc); 3522 3523 wm_set_vlan(sc); 3524 3525 ec: 3526 /* Check for ec_capenable. */ 3527 ecchange = ec->ec_capenable ^ sc->sc_ec_capenable; 3528 sc->sc_ec_capenable = ec->ec_capenable; 3529 if ((ecchange & ~ETHERCAP_EEE) != 0) { 3530 needreset = true; 3531 goto out; 3532 } 3533 3534 /* ec related updates */ 3535 wm_set_eee(sc); 3536 3537 out: 3538 if (needreset) 3539 rc = ENETRESET; 3540 WM_CORE_UNLOCK(sc); 3541 3542 return rc; 3543 } 3544 3545 static bool 3546 wm_phy_need_linkdown_discard(struct wm_softc *sc) 3547 { 3548 3549 switch (sc->sc_phytype) { 3550 case WMPHY_82577: /* ihphy */ 3551 case WMPHY_82578: /* atphy */ 3552 case WMPHY_82579: /* ihphy */ 3553 case WMPHY_I217: /* ihphy */ 3554 case WMPHY_82580: /* ihphy */ 3555 case WMPHY_I350: /* ihphy */ 3556 return true; 3557 default: 3558 return false; 3559 } 3560 } 3561 3562 static void 3563 wm_set_linkdown_discard(struct wm_softc *sc) 3564 { 3565 3566 for (int i = 0; i < sc->sc_nqueues; i++) { 3567 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 3568 3569 mutex_enter(txq->txq_lock); 3570 txq->txq_flags |= WM_TXQ_LINKDOWN_DISCARD; 3571 mutex_exit(txq->txq_lock); 3572 } 3573 } 3574 3575 static void 3576 wm_clear_linkdown_discard(struct wm_softc *sc) 3577 { 3578 3579 for (int i = 0; i < sc->sc_nqueues; i++) { 3580 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 3581 3582 mutex_enter(txq->txq_lock); 3583 txq->txq_flags &= ~WM_TXQ_LINKDOWN_DISCARD; 3584 mutex_exit(txq->txq_lock); 3585 } 3586 } 3587 3588 /* 3589 * wm_ioctl: [ifnet interface function] 3590 * 3591 * Handle control requests from the operator. 3592 */ 3593 static int 3594 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data) 3595 { 3596 struct wm_softc *sc = ifp->if_softc; 3597 struct ifreq *ifr = (struct ifreq *)data; 3598 struct ifaddr *ifa = (struct ifaddr *)data; 3599 struct sockaddr_dl *sdl; 3600 int s, error; 3601 3602 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 3603 device_xname(sc->sc_dev), __func__)); 3604 3605 #ifndef WM_MPSAFE 3606 s = splnet(); 3607 #endif 3608 switch (cmd) { 3609 case SIOCSIFMEDIA: 3610 WM_CORE_LOCK(sc); 3611 /* Flow control requires full-duplex mode. */ 3612 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO || 3613 (ifr->ifr_media & IFM_FDX) == 0) 3614 ifr->ifr_media &= ~IFM_ETH_FMASK; 3615 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) { 3616 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) { 3617 /* We can do both TXPAUSE and RXPAUSE. */ 3618 ifr->ifr_media |= 3619 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 3620 } 3621 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK; 3622 } 3623 WM_CORE_UNLOCK(sc); 3624 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 3625 if (error == 0 && wm_phy_need_linkdown_discard(sc)) { 3626 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_NONE) 3627 wm_set_linkdown_discard(sc); 3628 else 3629 wm_clear_linkdown_discard(sc); 3630 } 3631 break; 3632 case SIOCINITIFADDR: 3633 WM_CORE_LOCK(sc); 3634 if (ifa->ifa_addr->sa_family == AF_LINK) { 3635 sdl = satosdl(ifp->if_dl->ifa_addr); 3636 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len, 3637 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen); 3638 /* Unicast address is the first multicast entry */ 3639 wm_set_filter(sc); 3640 error = 0; 3641 WM_CORE_UNLOCK(sc); 3642 break; 3643 } 3644 WM_CORE_UNLOCK(sc); 3645 if (((ifp->if_flags & IFF_UP) == 0) && wm_phy_need_linkdown_discard(sc)) 3646 wm_clear_linkdown_discard(sc); 3647 /*FALLTHROUGH*/ 3648 default: 3649 if (cmd == SIOCSIFFLAGS && wm_phy_need_linkdown_discard(sc)) { 3650 if (((ifp->if_flags & IFF_UP) == 0) && ((ifr->ifr_flags & IFF_UP) != 0)) { 3651 wm_clear_linkdown_discard(sc); 3652 } else if (((ifp->if_flags & IFF_UP) != 0) && ((ifr->ifr_flags & IFF_UP) == 0)) { 3653 wm_set_linkdown_discard(sc); 3654 } 3655 } 3656 #ifdef WM_MPSAFE 3657 s = splnet(); 3658 #endif 3659 /* It may call wm_start, so unlock here */ 3660 error = ether_ioctl(ifp, cmd, data); 3661 #ifdef WM_MPSAFE 3662 splx(s); 3663 #endif 3664 if (error != ENETRESET) 3665 break; 3666 3667 error = 0; 3668 3669 if (cmd == SIOCSIFCAP) 3670 error = (*ifp->if_init)(ifp); 3671 else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) 3672 ; 3673 else if (ifp->if_flags & IFF_RUNNING) { 3674 /* 3675 * Multicast list has changed; set the hardware filter 3676 * accordingly. 3677 */ 3678 WM_CORE_LOCK(sc); 3679 wm_set_filter(sc); 3680 WM_CORE_UNLOCK(sc); 3681 } 3682 break; 3683 } 3684 3685 #ifndef WM_MPSAFE 3686 splx(s); 3687 #endif 3688 return error; 3689 } 3690 3691 /* MAC address related */ 3692 3693 /* 3694 * Get the offset of MAC address and return it. 3695 * If error occured, use offset 0. 3696 */ 3697 static uint16_t 3698 wm_check_alt_mac_addr(struct wm_softc *sc) 3699 { 3700 uint16_t myea[ETHER_ADDR_LEN / 2]; 3701 uint16_t offset = NVM_OFF_MACADDR; 3702 3703 /* Try to read alternative MAC address pointer */ 3704 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0) 3705 return 0; 3706 3707 /* Check pointer if it's valid or not. */ 3708 if ((offset == 0x0000) || (offset == 0xffff)) 3709 return 0; 3710 3711 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid); 3712 /* 3713 * Check whether alternative MAC address is valid or not. 3714 * Some cards have non 0xffff pointer but those don't use 3715 * alternative MAC address in reality. 3716 * 3717 * Check whether the broadcast bit is set or not. 3718 */ 3719 if (wm_nvm_read(sc, offset, 1, myea) == 0) 3720 if (((myea[0] & 0xff) & 0x01) == 0) 3721 return offset; /* Found */ 3722 3723 /* Not found */ 3724 return 0; 3725 } 3726 3727 static int 3728 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr) 3729 { 3730 uint16_t myea[ETHER_ADDR_LEN / 2]; 3731 uint16_t offset = NVM_OFF_MACADDR; 3732 int do_invert = 0; 3733 3734 switch (sc->sc_type) { 3735 case WM_T_82580: 3736 case WM_T_I350: 3737 case WM_T_I354: 3738 /* EEPROM Top Level Partitioning */ 3739 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0; 3740 break; 3741 case WM_T_82571: 3742 case WM_T_82575: 3743 case WM_T_82576: 3744 case WM_T_80003: 3745 case WM_T_I210: 3746 case WM_T_I211: 3747 offset = wm_check_alt_mac_addr(sc); 3748 if (offset == 0) 3749 if ((sc->sc_funcid & 0x01) == 1) 3750 do_invert = 1; 3751 break; 3752 default: 3753 if ((sc->sc_funcid & 0x01) == 1) 3754 do_invert = 1; 3755 break; 3756 } 3757 3758 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0) 3759 goto bad; 3760 3761 enaddr[0] = myea[0] & 0xff; 3762 enaddr[1] = myea[0] >> 8; 3763 enaddr[2] = myea[1] & 0xff; 3764 enaddr[3] = myea[1] >> 8; 3765 enaddr[4] = myea[2] & 0xff; 3766 enaddr[5] = myea[2] >> 8; 3767 3768 /* 3769 * Toggle the LSB of the MAC address on the second port 3770 * of some dual port cards. 3771 */ 3772 if (do_invert != 0) 3773 enaddr[5] ^= 1; 3774 3775 return 0; 3776 3777 bad: 3778 return -1; 3779 } 3780 3781 /* 3782 * wm_set_ral: 3783 * 3784 * Set an entery in the receive address list. 3785 */ 3786 static void 3787 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx) 3788 { 3789 uint32_t ral_lo, ral_hi, addrl, addrh; 3790 uint32_t wlock_mac; 3791 int rv; 3792 3793 if (enaddr != NULL) { 3794 ral_lo = (uint32_t)enaddr[0] | ((uint32_t)enaddr[1] << 8) | 3795 ((uint32_t)enaddr[2] << 16) | ((uint32_t)enaddr[3] << 24); 3796 ral_hi = (uint32_t)enaddr[4] | ((uint32_t)enaddr[5] << 8); 3797 ral_hi |= RAL_AV; 3798 } else { 3799 ral_lo = 0; 3800 ral_hi = 0; 3801 } 3802 3803 switch (sc->sc_type) { 3804 case WM_T_82542_2_0: 3805 case WM_T_82542_2_1: 3806 case WM_T_82543: 3807 CSR_WRITE(sc, WMREG_RAL(idx), ral_lo); 3808 CSR_WRITE_FLUSH(sc); 3809 CSR_WRITE(sc, WMREG_RAH(idx), ral_hi); 3810 CSR_WRITE_FLUSH(sc); 3811 break; 3812 case WM_T_PCH2: 3813 case WM_T_PCH_LPT: 3814 case WM_T_PCH_SPT: 3815 case WM_T_PCH_CNP: 3816 if (idx == 0) { 3817 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo); 3818 CSR_WRITE_FLUSH(sc); 3819 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi); 3820 CSR_WRITE_FLUSH(sc); 3821 return; 3822 } 3823 if (sc->sc_type != WM_T_PCH2) { 3824 wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), 3825 FWSM_WLOCK_MAC); 3826 addrl = WMREG_SHRAL(idx - 1); 3827 addrh = WMREG_SHRAH(idx - 1); 3828 } else { 3829 wlock_mac = 0; 3830 addrl = WMREG_PCH_LPT_SHRAL(idx - 1); 3831 addrh = WMREG_PCH_LPT_SHRAH(idx - 1); 3832 } 3833 3834 if ((wlock_mac == 0) || (idx <= wlock_mac)) { 3835 rv = wm_get_swflag_ich8lan(sc); 3836 if (rv != 0) 3837 return; 3838 CSR_WRITE(sc, addrl, ral_lo); 3839 CSR_WRITE_FLUSH(sc); 3840 CSR_WRITE(sc, addrh, ral_hi); 3841 CSR_WRITE_FLUSH(sc); 3842 wm_put_swflag_ich8lan(sc); 3843 } 3844 3845 break; 3846 default: 3847 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo); 3848 CSR_WRITE_FLUSH(sc); 3849 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi); 3850 CSR_WRITE_FLUSH(sc); 3851 break; 3852 } 3853 } 3854 3855 /* 3856 * wm_mchash: 3857 * 3858 * Compute the hash of the multicast address for the 4096-bit 3859 * multicast filter. 3860 */ 3861 static uint32_t 3862 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr) 3863 { 3864 static const int lo_shift[4] = { 4, 3, 2, 0 }; 3865 static const int hi_shift[4] = { 4, 5, 6, 8 }; 3866 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 }; 3867 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 }; 3868 uint32_t hash; 3869 3870 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 3871 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 3872 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 3873 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){ 3874 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) | 3875 (((uint16_t)enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]); 3876 return (hash & 0x3ff); 3877 } 3878 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) | 3879 (((uint16_t)enaddr[5]) << hi_shift[sc->sc_mchash_type]); 3880 3881 return (hash & 0xfff); 3882 } 3883 3884 /* 3885 * 3886 * 3887 */ 3888 static int 3889 wm_rar_count(struct wm_softc *sc) 3890 { 3891 int size; 3892 3893 switch (sc->sc_type) { 3894 case WM_T_ICH8: 3895 size = WM_RAL_TABSIZE_ICH8 -1; 3896 break; 3897 case WM_T_ICH9: 3898 case WM_T_ICH10: 3899 case WM_T_PCH: 3900 size = WM_RAL_TABSIZE_ICH8; 3901 break; 3902 case WM_T_PCH2: 3903 size = WM_RAL_TABSIZE_PCH2; 3904 break; 3905 case WM_T_PCH_LPT: 3906 case WM_T_PCH_SPT: 3907 case WM_T_PCH_CNP: 3908 size = WM_RAL_TABSIZE_PCH_LPT; 3909 break; 3910 case WM_T_82575: 3911 case WM_T_I210: 3912 case WM_T_I211: 3913 size = WM_RAL_TABSIZE_82575; 3914 break; 3915 case WM_T_82576: 3916 case WM_T_82580: 3917 size = WM_RAL_TABSIZE_82576; 3918 break; 3919 case WM_T_I350: 3920 case WM_T_I354: 3921 size = WM_RAL_TABSIZE_I350; 3922 break; 3923 default: 3924 size = WM_RAL_TABSIZE; 3925 } 3926 3927 return size; 3928 } 3929 3930 /* 3931 * wm_set_filter: 3932 * 3933 * Set up the receive filter. 3934 */ 3935 static void 3936 wm_set_filter(struct wm_softc *sc) 3937 { 3938 struct ethercom *ec = &sc->sc_ethercom; 3939 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3940 struct ether_multi *enm; 3941 struct ether_multistep step; 3942 bus_addr_t mta_reg; 3943 uint32_t hash, reg, bit; 3944 int i, size, ralmax, rv; 3945 3946 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 3947 device_xname(sc->sc_dev), __func__)); 3948 3949 if (sc->sc_type >= WM_T_82544) 3950 mta_reg = WMREG_CORDOVA_MTA; 3951 else 3952 mta_reg = WMREG_MTA; 3953 3954 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE); 3955 3956 if (ifp->if_flags & IFF_BROADCAST) 3957 sc->sc_rctl |= RCTL_BAM; 3958 if (ifp->if_flags & IFF_PROMISC) { 3959 sc->sc_rctl |= RCTL_UPE; 3960 ETHER_LOCK(ec); 3961 ec->ec_flags |= ETHER_F_ALLMULTI; 3962 ETHER_UNLOCK(ec); 3963 goto allmulti; 3964 } 3965 3966 /* 3967 * Set the station address in the first RAL slot, and 3968 * clear the remaining slots. 3969 */ 3970 size = wm_rar_count(sc); 3971 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0); 3972 3973 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT) 3974 || (sc->sc_type == WM_T_PCH_CNP)) { 3975 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC); 3976 switch (i) { 3977 case 0: 3978 /* We can use all entries */ 3979 ralmax = size; 3980 break; 3981 case 1: 3982 /* Only RAR[0] */ 3983 ralmax = 1; 3984 break; 3985 default: 3986 /* Available SHRA + RAR[0] */ 3987 ralmax = i + 1; 3988 } 3989 } else 3990 ralmax = size; 3991 for (i = 1; i < size; i++) { 3992 if (i < ralmax) 3993 wm_set_ral(sc, NULL, i); 3994 } 3995 3996 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 3997 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 3998 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 3999 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)) 4000 size = WM_ICH8_MC_TABSIZE; 4001 else 4002 size = WM_MC_TABSIZE; 4003 /* Clear out the multicast table. */ 4004 for (i = 0; i < size; i++) { 4005 CSR_WRITE(sc, mta_reg + (i << 2), 0); 4006 CSR_WRITE_FLUSH(sc); 4007 } 4008 4009 ETHER_LOCK(ec); 4010 ETHER_FIRST_MULTI(step, ec, enm); 4011 while (enm != NULL) { 4012 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 4013 ec->ec_flags |= ETHER_F_ALLMULTI; 4014 ETHER_UNLOCK(ec); 4015 /* 4016 * We must listen to a range of multicast addresses. 4017 * For now, just accept all multicasts, rather than 4018 * trying to set only those filter bits needed to match 4019 * the range. (At this time, the only use of address 4020 * ranges is for IP multicast routing, for which the 4021 * range is big enough to require all bits set.) 4022 */ 4023 goto allmulti; 4024 } 4025 4026 hash = wm_mchash(sc, enm->enm_addrlo); 4027 4028 reg = (hash >> 5); 4029 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 4030 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 4031 || (sc->sc_type == WM_T_PCH2) 4032 || (sc->sc_type == WM_T_PCH_LPT) 4033 || (sc->sc_type == WM_T_PCH_SPT) 4034 || (sc->sc_type == WM_T_PCH_CNP)) 4035 reg &= 0x1f; 4036 else 4037 reg &= 0x7f; 4038 bit = hash & 0x1f; 4039 4040 hash = CSR_READ(sc, mta_reg + (reg << 2)); 4041 hash |= 1U << bit; 4042 4043 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) { 4044 /* 4045 * 82544 Errata 9: Certain register cannot be written 4046 * with particular alignments in PCI-X bus operation 4047 * (FCAH, MTA and VFTA). 4048 */ 4049 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2)); 4050 CSR_WRITE(sc, mta_reg + (reg << 2), hash); 4051 CSR_WRITE_FLUSH(sc); 4052 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit); 4053 CSR_WRITE_FLUSH(sc); 4054 } else { 4055 CSR_WRITE(sc, mta_reg + (reg << 2), hash); 4056 CSR_WRITE_FLUSH(sc); 4057 } 4058 4059 ETHER_NEXT_MULTI(step, enm); 4060 } 4061 ec->ec_flags &= ~ETHER_F_ALLMULTI; 4062 ETHER_UNLOCK(ec); 4063 4064 goto setit; 4065 4066 allmulti: 4067 sc->sc_rctl |= RCTL_MPE; 4068 4069 setit: 4070 if (sc->sc_type >= WM_T_PCH2) { 4071 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0) 4072 && (ifp->if_mtu > ETHERMTU)) 4073 rv = wm_lv_jumbo_workaround_ich8lan(sc, true); 4074 else 4075 rv = wm_lv_jumbo_workaround_ich8lan(sc, false); 4076 if (rv != 0) 4077 device_printf(sc->sc_dev, 4078 "Failed to do workaround for jumbo frame.\n"); 4079 } 4080 4081 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl); 4082 } 4083 4084 /* Reset and init related */ 4085 4086 static void 4087 wm_set_vlan(struct wm_softc *sc) 4088 { 4089 4090 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4091 device_xname(sc->sc_dev), __func__)); 4092 4093 /* Deal with VLAN enables. */ 4094 if (VLAN_ATTACHED(&sc->sc_ethercom)) 4095 sc->sc_ctrl |= CTRL_VME; 4096 else 4097 sc->sc_ctrl &= ~CTRL_VME; 4098 4099 /* Write the control registers. */ 4100 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 4101 } 4102 4103 static void 4104 wm_set_pcie_completion_timeout(struct wm_softc *sc) 4105 { 4106 uint32_t gcr; 4107 pcireg_t ctrl2; 4108 4109 gcr = CSR_READ(sc, WMREG_GCR); 4110 4111 /* Only take action if timeout value is defaulted to 0 */ 4112 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0) 4113 goto out; 4114 4115 if ((gcr & GCR_CAP_VER2) == 0) { 4116 gcr |= GCR_CMPL_TMOUT_10MS; 4117 goto out; 4118 } 4119 4120 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 4121 sc->sc_pcixe_capoff + PCIE_DCSR2); 4122 ctrl2 |= WM_PCIE_DCSR2_16MS; 4123 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 4124 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2); 4125 4126 out: 4127 /* Disable completion timeout resend */ 4128 gcr &= ~GCR_CMPL_TMOUT_RESEND; 4129 4130 CSR_WRITE(sc, WMREG_GCR, gcr); 4131 } 4132 4133 void 4134 wm_get_auto_rd_done(struct wm_softc *sc) 4135 { 4136 int i; 4137 4138 /* wait for eeprom to reload */ 4139 switch (sc->sc_type) { 4140 case WM_T_82571: 4141 case WM_T_82572: 4142 case WM_T_82573: 4143 case WM_T_82574: 4144 case WM_T_82583: 4145 case WM_T_82575: 4146 case WM_T_82576: 4147 case WM_T_82580: 4148 case WM_T_I350: 4149 case WM_T_I354: 4150 case WM_T_I210: 4151 case WM_T_I211: 4152 case WM_T_80003: 4153 case WM_T_ICH8: 4154 case WM_T_ICH9: 4155 for (i = 0; i < 10; i++) { 4156 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD) 4157 break; 4158 delay(1000); 4159 } 4160 if (i == 10) { 4161 log(LOG_ERR, "%s: auto read from eeprom failed to " 4162 "complete\n", device_xname(sc->sc_dev)); 4163 } 4164 break; 4165 default: 4166 break; 4167 } 4168 } 4169 4170 void 4171 wm_lan_init_done(struct wm_softc *sc) 4172 { 4173 uint32_t reg = 0; 4174 int i; 4175 4176 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4177 device_xname(sc->sc_dev), __func__)); 4178 4179 /* Wait for eeprom to reload */ 4180 switch (sc->sc_type) { 4181 case WM_T_ICH10: 4182 case WM_T_PCH: 4183 case WM_T_PCH2: 4184 case WM_T_PCH_LPT: 4185 case WM_T_PCH_SPT: 4186 case WM_T_PCH_CNP: 4187 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) { 4188 reg = CSR_READ(sc, WMREG_STATUS); 4189 if ((reg & STATUS_LAN_INIT_DONE) != 0) 4190 break; 4191 delay(100); 4192 } 4193 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) { 4194 log(LOG_ERR, "%s: %s: lan_init_done failed to " 4195 "complete\n", device_xname(sc->sc_dev), __func__); 4196 } 4197 break; 4198 default: 4199 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 4200 __func__); 4201 break; 4202 } 4203 4204 reg &= ~STATUS_LAN_INIT_DONE; 4205 CSR_WRITE(sc, WMREG_STATUS, reg); 4206 } 4207 4208 void 4209 wm_get_cfg_done(struct wm_softc *sc) 4210 { 4211 int mask; 4212 uint32_t reg; 4213 int i; 4214 4215 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4216 device_xname(sc->sc_dev), __func__)); 4217 4218 /* Wait for eeprom to reload */ 4219 switch (sc->sc_type) { 4220 case WM_T_82542_2_0: 4221 case WM_T_82542_2_1: 4222 /* null */ 4223 break; 4224 case WM_T_82543: 4225 case WM_T_82544: 4226 case WM_T_82540: 4227 case WM_T_82545: 4228 case WM_T_82545_3: 4229 case WM_T_82546: 4230 case WM_T_82546_3: 4231 case WM_T_82541: 4232 case WM_T_82541_2: 4233 case WM_T_82547: 4234 case WM_T_82547_2: 4235 case WM_T_82573: 4236 case WM_T_82574: 4237 case WM_T_82583: 4238 /* generic */ 4239 delay(10*1000); 4240 break; 4241 case WM_T_80003: 4242 case WM_T_82571: 4243 case WM_T_82572: 4244 case WM_T_82575: 4245 case WM_T_82576: 4246 case WM_T_82580: 4247 case WM_T_I350: 4248 case WM_T_I354: 4249 case WM_T_I210: 4250 case WM_T_I211: 4251 if (sc->sc_type == WM_T_82571) { 4252 /* Only 82571 shares port 0 */ 4253 mask = EEMNGCTL_CFGDONE_0; 4254 } else 4255 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid; 4256 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) { 4257 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask) 4258 break; 4259 delay(1000); 4260 } 4261 if (i >= WM_PHY_CFG_TIMEOUT) 4262 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s failed\n", 4263 device_xname(sc->sc_dev), __func__)); 4264 break; 4265 case WM_T_ICH8: 4266 case WM_T_ICH9: 4267 case WM_T_ICH10: 4268 case WM_T_PCH: 4269 case WM_T_PCH2: 4270 case WM_T_PCH_LPT: 4271 case WM_T_PCH_SPT: 4272 case WM_T_PCH_CNP: 4273 delay(10*1000); 4274 if (sc->sc_type >= WM_T_ICH10) 4275 wm_lan_init_done(sc); 4276 else 4277 wm_get_auto_rd_done(sc); 4278 4279 /* Clear PHY Reset Asserted bit */ 4280 reg = CSR_READ(sc, WMREG_STATUS); 4281 if ((reg & STATUS_PHYRA) != 0) 4282 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA); 4283 break; 4284 default: 4285 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 4286 __func__); 4287 break; 4288 } 4289 } 4290 4291 int 4292 wm_phy_post_reset(struct wm_softc *sc) 4293 { 4294 device_t dev = sc->sc_dev; 4295 uint16_t reg; 4296 int rv = 0; 4297 4298 /* This function is only for ICH8 and newer. */ 4299 if (sc->sc_type < WM_T_ICH8) 4300 return 0; 4301 4302 if (wm_phy_resetisblocked(sc)) { 4303 /* XXX */ 4304 device_printf(dev, "PHY is blocked\n"); 4305 return -1; 4306 } 4307 4308 /* Allow time for h/w to get to quiescent state after reset */ 4309 delay(10*1000); 4310 4311 /* Perform any necessary post-reset workarounds */ 4312 if (sc->sc_type == WM_T_PCH) 4313 rv = wm_hv_phy_workarounds_ich8lan(sc); 4314 else if (sc->sc_type == WM_T_PCH2) 4315 rv = wm_lv_phy_workarounds_ich8lan(sc); 4316 if (rv != 0) 4317 return rv; 4318 4319 /* Clear the host wakeup bit after lcd reset */ 4320 if (sc->sc_type >= WM_T_PCH) { 4321 wm_gmii_hv_readreg(dev, 2, BM_PORT_GEN_CFG, ®); 4322 reg &= ~BM_WUC_HOST_WU_BIT; 4323 wm_gmii_hv_writereg(dev, 2, BM_PORT_GEN_CFG, reg); 4324 } 4325 4326 /* Configure the LCD with the extended configuration region in NVM */ 4327 if ((rv = wm_init_lcd_from_nvm(sc)) != 0) 4328 return rv; 4329 4330 /* Configure the LCD with the OEM bits in NVM */ 4331 rv = wm_oem_bits_config_ich8lan(sc, true); 4332 4333 if (sc->sc_type == WM_T_PCH2) { 4334 /* Ungate automatic PHY configuration on non-managed 82579 */ 4335 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) { 4336 delay(10 * 1000); 4337 wm_gate_hw_phy_config_ich8lan(sc, false); 4338 } 4339 /* Set EEE LPI Update Timer to 200usec */ 4340 rv = sc->phy.acquire(sc); 4341 if (rv) 4342 return rv; 4343 rv = wm_write_emi_reg_locked(dev, 4344 I82579_LPI_UPDATE_TIMER, 0x1387); 4345 sc->phy.release(sc); 4346 } 4347 4348 return rv; 4349 } 4350 4351 /* Only for PCH and newer */ 4352 static int 4353 wm_write_smbus_addr(struct wm_softc *sc) 4354 { 4355 uint32_t strap, freq; 4356 uint16_t phy_data; 4357 int rv; 4358 4359 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4360 device_xname(sc->sc_dev), __func__)); 4361 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP); 4362 4363 strap = CSR_READ(sc, WMREG_STRAP); 4364 freq = __SHIFTOUT(strap, STRAP_FREQ); 4365 4366 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_SMB_ADDR, &phy_data); 4367 if (rv != 0) 4368 return -1; 4369 4370 phy_data &= ~HV_SMB_ADDR_ADDR; 4371 phy_data |= __SHIFTOUT(strap, STRAP_SMBUSADDR); 4372 phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; 4373 4374 if (sc->sc_phytype == WMPHY_I217) { 4375 /* Restore SMBus frequency */ 4376 if (freq --) { 4377 phy_data &= ~(HV_SMB_ADDR_FREQ_LOW 4378 | HV_SMB_ADDR_FREQ_HIGH); 4379 phy_data |= __SHIFTIN((freq & 0x01) != 0, 4380 HV_SMB_ADDR_FREQ_LOW); 4381 phy_data |= __SHIFTIN((freq & 0x02) != 0, 4382 HV_SMB_ADDR_FREQ_HIGH); 4383 } else 4384 DPRINTF(sc, WM_DEBUG_INIT, 4385 ("%s: %s Unsupported SMB frequency in PHY\n", 4386 device_xname(sc->sc_dev), __func__)); 4387 } 4388 4389 return wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_SMB_ADDR, 4390 phy_data); 4391 } 4392 4393 static int 4394 wm_init_lcd_from_nvm(struct wm_softc *sc) 4395 { 4396 uint32_t extcnfctr, sw_cfg_mask, cnf_size, word_addr, i, reg; 4397 uint16_t phy_page = 0; 4398 int rv = 0; 4399 4400 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4401 device_xname(sc->sc_dev), __func__)); 4402 4403 switch (sc->sc_type) { 4404 case WM_T_ICH8: 4405 if ((sc->sc_phytype == WMPHY_UNKNOWN) 4406 || (sc->sc_phytype != WMPHY_IGP_3)) 4407 return 0; 4408 4409 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_AMT) 4410 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_LAN)) { 4411 sw_cfg_mask = FEXTNVM_SW_CONFIG; 4412 break; 4413 } 4414 /* FALLTHROUGH */ 4415 case WM_T_PCH: 4416 case WM_T_PCH2: 4417 case WM_T_PCH_LPT: 4418 case WM_T_PCH_SPT: 4419 case WM_T_PCH_CNP: 4420 sw_cfg_mask = FEXTNVM_SW_CONFIG_ICH8M; 4421 break; 4422 default: 4423 return 0; 4424 } 4425 4426 if ((rv = sc->phy.acquire(sc)) != 0) 4427 return rv; 4428 4429 reg = CSR_READ(sc, WMREG_FEXTNVM); 4430 if ((reg & sw_cfg_mask) == 0) 4431 goto release; 4432 4433 /* 4434 * Make sure HW does not configure LCD from PHY extended configuration 4435 * before SW configuration 4436 */ 4437 extcnfctr = CSR_READ(sc, WMREG_EXTCNFCTR); 4438 if ((sc->sc_type < WM_T_PCH2) 4439 && ((extcnfctr & EXTCNFCTR_PCIE_WRITE_ENABLE) != 0)) 4440 goto release; 4441 4442 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: Configure LCD by software\n", 4443 device_xname(sc->sc_dev), __func__)); 4444 /* word_addr is in DWORD */ 4445 word_addr = __SHIFTOUT(extcnfctr, EXTCNFCTR_EXT_CNF_POINTER) << 1; 4446 4447 reg = CSR_READ(sc, WMREG_EXTCNFSIZE); 4448 cnf_size = __SHIFTOUT(reg, EXTCNFSIZE_LENGTH); 4449 if (cnf_size == 0) 4450 goto release; 4451 4452 if (((sc->sc_type == WM_T_PCH) 4453 && ((extcnfctr & EXTCNFCTR_OEM_WRITE_ENABLE) == 0)) 4454 || (sc->sc_type > WM_T_PCH)) { 4455 /* 4456 * HW configures the SMBus address and LEDs when the OEM and 4457 * LCD Write Enable bits are set in the NVM. When both NVM bits 4458 * are cleared, SW will configure them instead. 4459 */ 4460 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: Configure SMBus and LED\n", 4461 device_xname(sc->sc_dev), __func__)); 4462 if ((rv = wm_write_smbus_addr(sc)) != 0) 4463 goto release; 4464 4465 reg = CSR_READ(sc, WMREG_LEDCTL); 4466 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_LED_CONFIG, 4467 (uint16_t)reg); 4468 if (rv != 0) 4469 goto release; 4470 } 4471 4472 /* Configure LCD from extended configuration region. */ 4473 for (i = 0; i < cnf_size; i++) { 4474 uint16_t reg_data, reg_addr; 4475 4476 if (wm_nvm_read(sc, (word_addr + i * 2), 1, ®_data) != 0) 4477 goto release; 4478 4479 if (wm_nvm_read(sc, (word_addr + i * 2 + 1), 1, ®_addr) !=0) 4480 goto release; 4481 4482 if (reg_addr == IGPHY_PAGE_SELECT) 4483 phy_page = reg_data; 4484 4485 reg_addr &= IGPHY_MAXREGADDR; 4486 reg_addr |= phy_page; 4487 4488 KASSERT(sc->phy.writereg_locked != NULL); 4489 rv = sc->phy.writereg_locked(sc->sc_dev, 1, reg_addr, 4490 reg_data); 4491 } 4492 4493 release: 4494 sc->phy.release(sc); 4495 return rv; 4496 } 4497 4498 /* 4499 * wm_oem_bits_config_ich8lan - SW-based LCD Configuration 4500 * @sc: pointer to the HW structure 4501 * @d0_state: boolean if entering d0 or d3 device state 4502 * 4503 * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are 4504 * collectively called OEM bits. The OEM Write Enable bit and SW Config bit 4505 * in NVM determines whether HW should configure LPLU and Gbe Disable. 4506 */ 4507 int 4508 wm_oem_bits_config_ich8lan(struct wm_softc *sc, bool d0_state) 4509 { 4510 uint32_t mac_reg; 4511 uint16_t oem_reg; 4512 int rv; 4513 4514 if (sc->sc_type < WM_T_PCH) 4515 return 0; 4516 4517 rv = sc->phy.acquire(sc); 4518 if (rv != 0) 4519 return rv; 4520 4521 if (sc->sc_type == WM_T_PCH) { 4522 mac_reg = CSR_READ(sc, WMREG_EXTCNFCTR); 4523 if ((mac_reg & EXTCNFCTR_OEM_WRITE_ENABLE) != 0) 4524 goto release; 4525 } 4526 4527 mac_reg = CSR_READ(sc, WMREG_FEXTNVM); 4528 if ((mac_reg & FEXTNVM_SW_CONFIG_ICH8M) == 0) 4529 goto release; 4530 4531 mac_reg = CSR_READ(sc, WMREG_PHY_CTRL); 4532 4533 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 1, HV_OEM_BITS, &oem_reg); 4534 if (rv != 0) 4535 goto release; 4536 oem_reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU); 4537 4538 if (d0_state) { 4539 if ((mac_reg & PHY_CTRL_GBE_DIS) != 0) 4540 oem_reg |= HV_OEM_BITS_A1KDIS; 4541 if ((mac_reg & PHY_CTRL_D0A_LPLU) != 0) 4542 oem_reg |= HV_OEM_BITS_LPLU; 4543 } else { 4544 if ((mac_reg & (PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS)) 4545 != 0) 4546 oem_reg |= HV_OEM_BITS_A1KDIS; 4547 if ((mac_reg & (PHY_CTRL_D0A_LPLU | PHY_CTRL_NOND0A_LPLU)) 4548 != 0) 4549 oem_reg |= HV_OEM_BITS_LPLU; 4550 } 4551 4552 /* Set Restart auto-neg to activate the bits */ 4553 if ((d0_state || (sc->sc_type != WM_T_PCH)) 4554 && (wm_phy_resetisblocked(sc) == false)) 4555 oem_reg |= HV_OEM_BITS_ANEGNOW; 4556 4557 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_OEM_BITS, oem_reg); 4558 4559 release: 4560 sc->phy.release(sc); 4561 4562 return rv; 4563 } 4564 4565 /* Init hardware bits */ 4566 void 4567 wm_initialize_hardware_bits(struct wm_softc *sc) 4568 { 4569 uint32_t tarc0, tarc1, reg; 4570 4571 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4572 device_xname(sc->sc_dev), __func__)); 4573 4574 /* For 82571 variant, 80003 and ICHs */ 4575 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583)) 4576 || (sc->sc_type >= WM_T_80003)) { 4577 4578 /* Transmit Descriptor Control 0 */ 4579 reg = CSR_READ(sc, WMREG_TXDCTL(0)); 4580 reg |= TXDCTL_COUNT_DESC; 4581 CSR_WRITE(sc, WMREG_TXDCTL(0), reg); 4582 4583 /* Transmit Descriptor Control 1 */ 4584 reg = CSR_READ(sc, WMREG_TXDCTL(1)); 4585 reg |= TXDCTL_COUNT_DESC; 4586 CSR_WRITE(sc, WMREG_TXDCTL(1), reg); 4587 4588 /* TARC0 */ 4589 tarc0 = CSR_READ(sc, WMREG_TARC0); 4590 switch (sc->sc_type) { 4591 case WM_T_82571: 4592 case WM_T_82572: 4593 case WM_T_82573: 4594 case WM_T_82574: 4595 case WM_T_82583: 4596 case WM_T_80003: 4597 /* Clear bits 30..27 */ 4598 tarc0 &= ~__BITS(30, 27); 4599 break; 4600 default: 4601 break; 4602 } 4603 4604 switch (sc->sc_type) { 4605 case WM_T_82571: 4606 case WM_T_82572: 4607 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */ 4608 4609 tarc1 = CSR_READ(sc, WMREG_TARC1); 4610 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */ 4611 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */ 4612 /* 8257[12] Errata No.7 */ 4613 tarc1 |= __BIT(22); /* TARC1 bits 22 */ 4614 4615 /* TARC1 bit 28 */ 4616 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 4617 tarc1 &= ~__BIT(28); 4618 else 4619 tarc1 |= __BIT(28); 4620 CSR_WRITE(sc, WMREG_TARC1, tarc1); 4621 4622 /* 4623 * 8257[12] Errata No.13 4624 * Disable Dyamic Clock Gating. 4625 */ 4626 reg = CSR_READ(sc, WMREG_CTRL_EXT); 4627 reg &= ~CTRL_EXT_DMA_DYN_CLK; 4628 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 4629 break; 4630 case WM_T_82573: 4631 case WM_T_82574: 4632 case WM_T_82583: 4633 if ((sc->sc_type == WM_T_82574) 4634 || (sc->sc_type == WM_T_82583)) 4635 tarc0 |= __BIT(26); /* TARC0 bit 26 */ 4636 4637 /* Extended Device Control */ 4638 reg = CSR_READ(sc, WMREG_CTRL_EXT); 4639 reg &= ~__BIT(23); /* Clear bit 23 */ 4640 reg |= __BIT(22); /* Set bit 22 */ 4641 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 4642 4643 /* Device Control */ 4644 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */ 4645 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 4646 4647 /* PCIe Control Register */ 4648 /* 4649 * 82573 Errata (unknown). 4650 * 4651 * 82574 Errata 25 and 82583 Errata 12 4652 * "Dropped Rx Packets": 4653 * NVM Image Version 2.1.4 and newer has no this bug. 4654 */ 4655 reg = CSR_READ(sc, WMREG_GCR); 4656 reg |= GCR_L1_ACT_WITHOUT_L0S_RX; 4657 CSR_WRITE(sc, WMREG_GCR, reg); 4658 4659 if ((sc->sc_type == WM_T_82574) 4660 || (sc->sc_type == WM_T_82583)) { 4661 /* 4662 * Document says this bit must be set for 4663 * proper operation. 4664 */ 4665 reg = CSR_READ(sc, WMREG_GCR); 4666 reg |= __BIT(22); 4667 CSR_WRITE(sc, WMREG_GCR, reg); 4668 4669 /* 4670 * Apply workaround for hardware errata 4671 * documented in errata docs Fixes issue where 4672 * some error prone or unreliable PCIe 4673 * completions are occurring, particularly 4674 * with ASPM enabled. Without fix, issue can 4675 * cause Tx timeouts. 4676 */ 4677 reg = CSR_READ(sc, WMREG_GCR2); 4678 reg |= __BIT(0); 4679 CSR_WRITE(sc, WMREG_GCR2, reg); 4680 } 4681 break; 4682 case WM_T_80003: 4683 /* TARC0 */ 4684 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER) 4685 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 4686 tarc0 &= ~__BIT(20); /* Clear bits 20 */ 4687 4688 /* TARC1 bit 28 */ 4689 tarc1 = CSR_READ(sc, WMREG_TARC1); 4690 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 4691 tarc1 &= ~__BIT(28); 4692 else 4693 tarc1 |= __BIT(28); 4694 CSR_WRITE(sc, WMREG_TARC1, tarc1); 4695 break; 4696 case WM_T_ICH8: 4697 case WM_T_ICH9: 4698 case WM_T_ICH10: 4699 case WM_T_PCH: 4700 case WM_T_PCH2: 4701 case WM_T_PCH_LPT: 4702 case WM_T_PCH_SPT: 4703 case WM_T_PCH_CNP: 4704 /* TARC0 */ 4705 if (sc->sc_type == WM_T_ICH8) { 4706 /* Set TARC0 bits 29 and 28 */ 4707 tarc0 |= __BITS(29, 28); 4708 } else if (sc->sc_type == WM_T_PCH_SPT) { 4709 tarc0 |= __BIT(29); 4710 /* 4711 * Drop bit 28. From Linux. 4712 * See I218/I219 spec update 4713 * "5. Buffer Overrun While the I219 is 4714 * Processing DMA Transactions" 4715 */ 4716 tarc0 &= ~__BIT(28); 4717 } 4718 /* Set TARC0 bits 23,24,26,27 */ 4719 tarc0 |= __BITS(27, 26) | __BITS(24, 23); 4720 4721 /* CTRL_EXT */ 4722 reg = CSR_READ(sc, WMREG_CTRL_EXT); 4723 reg |= __BIT(22); /* Set bit 22 */ 4724 /* 4725 * Enable PHY low-power state when MAC is at D3 4726 * w/o WoL 4727 */ 4728 if (sc->sc_type >= WM_T_PCH) 4729 reg |= CTRL_EXT_PHYPDEN; 4730 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 4731 4732 /* TARC1 */ 4733 tarc1 = CSR_READ(sc, WMREG_TARC1); 4734 /* bit 28 */ 4735 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 4736 tarc1 &= ~__BIT(28); 4737 else 4738 tarc1 |= __BIT(28); 4739 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30); 4740 CSR_WRITE(sc, WMREG_TARC1, tarc1); 4741 4742 /* Device Status */ 4743 if (sc->sc_type == WM_T_ICH8) { 4744 reg = CSR_READ(sc, WMREG_STATUS); 4745 reg &= ~__BIT(31); 4746 CSR_WRITE(sc, WMREG_STATUS, reg); 4747 4748 } 4749 4750 /* IOSFPC */ 4751 if (sc->sc_type == WM_T_PCH_SPT) { 4752 reg = CSR_READ(sc, WMREG_IOSFPC); 4753 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */ 4754 CSR_WRITE(sc, WMREG_IOSFPC, reg); 4755 } 4756 /* 4757 * Work-around descriptor data corruption issue during 4758 * NFS v2 UDP traffic, just disable the NFS filtering 4759 * capability. 4760 */ 4761 reg = CSR_READ(sc, WMREG_RFCTL); 4762 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS; 4763 CSR_WRITE(sc, WMREG_RFCTL, reg); 4764 break; 4765 default: 4766 break; 4767 } 4768 CSR_WRITE(sc, WMREG_TARC0, tarc0); 4769 4770 switch (sc->sc_type) { 4771 /* 4772 * 8257[12] Errata No.52, 82573 Errata No.43 and some others. 4773 * Avoid RSS Hash Value bug. 4774 */ 4775 case WM_T_82571: 4776 case WM_T_82572: 4777 case WM_T_82573: 4778 case WM_T_80003: 4779 case WM_T_ICH8: 4780 reg = CSR_READ(sc, WMREG_RFCTL); 4781 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS; 4782 CSR_WRITE(sc, WMREG_RFCTL, reg); 4783 break; 4784 case WM_T_82574: 4785 /* Use extened Rx descriptor. */ 4786 reg = CSR_READ(sc, WMREG_RFCTL); 4787 reg |= WMREG_RFCTL_EXSTEN; 4788 CSR_WRITE(sc, WMREG_RFCTL, reg); 4789 break; 4790 default: 4791 break; 4792 } 4793 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) { 4794 /* 4795 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24, 4796 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11: 4797 * "Certain Malformed IPv6 Extension Headers are Not Processed 4798 * Correctly by the Device" 4799 * 4800 * I354(C2000) Errata AVR53: 4801 * "Malformed IPv6 Extension Headers May Result in LAN Device 4802 * Hang" 4803 */ 4804 reg = CSR_READ(sc, WMREG_RFCTL); 4805 reg |= WMREG_RFCTL_IPV6EXDIS; 4806 CSR_WRITE(sc, WMREG_RFCTL, reg); 4807 } 4808 } 4809 4810 static uint32_t 4811 wm_rxpbs_adjust_82580(uint32_t val) 4812 { 4813 uint32_t rv = 0; 4814 4815 if (val < __arraycount(wm_82580_rxpbs_table)) 4816 rv = wm_82580_rxpbs_table[val]; 4817 4818 return rv; 4819 } 4820 4821 /* 4822 * wm_reset_phy: 4823 * 4824 * generic PHY reset function. 4825 * Same as e1000_phy_hw_reset_generic() 4826 */ 4827 static int 4828 wm_reset_phy(struct wm_softc *sc) 4829 { 4830 uint32_t reg; 4831 4832 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4833 device_xname(sc->sc_dev), __func__)); 4834 if (wm_phy_resetisblocked(sc)) 4835 return -1; 4836 4837 sc->phy.acquire(sc); 4838 4839 reg = CSR_READ(sc, WMREG_CTRL); 4840 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET); 4841 CSR_WRITE_FLUSH(sc); 4842 4843 delay(sc->phy.reset_delay_us); 4844 4845 CSR_WRITE(sc, WMREG_CTRL, reg); 4846 CSR_WRITE_FLUSH(sc); 4847 4848 delay(150); 4849 4850 sc->phy.release(sc); 4851 4852 wm_get_cfg_done(sc); 4853 wm_phy_post_reset(sc); 4854 4855 return 0; 4856 } 4857 4858 /* 4859 * wm_flush_desc_rings - remove all descriptors from the descriptor rings. 4860 * 4861 * In i219, the descriptor rings must be emptied before resetting the HW 4862 * or before changing the device state to D3 during runtime (runtime PM). 4863 * 4864 * Failure to do this will cause the HW to enter a unit hang state which can 4865 * only be released by PCI reset on the device. 4866 * 4867 * I219 does not use multiqueue, so it is enough to check sc->sc_queue[0] only. 4868 */ 4869 static void 4870 wm_flush_desc_rings(struct wm_softc *sc) 4871 { 4872 pcireg_t preg; 4873 uint32_t reg; 4874 struct wm_txqueue *txq; 4875 wiseman_txdesc_t *txd; 4876 int nexttx; 4877 uint32_t rctl; 4878 4879 /* First, disable MULR fix in FEXTNVM11 */ 4880 reg = CSR_READ(sc, WMREG_FEXTNVM11); 4881 reg |= FEXTNVM11_DIS_MULRFIX; 4882 CSR_WRITE(sc, WMREG_FEXTNVM11, reg); 4883 4884 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS); 4885 reg = CSR_READ(sc, WMREG_TDLEN(0)); 4886 if (((preg & DESCRING_STATUS_FLUSH_REQ) == 0) || (reg == 0)) 4887 return; 4888 4889 /* 4890 * Remove all descriptors from the tx_ring. 4891 * 4892 * We want to clear all pending descriptors from the TX ring. Zeroing 4893 * happens when the HW reads the regs. We assign the ring itself as 4894 * the data of the next descriptor. We don't care about the data we are 4895 * about to reset the HW. 4896 */ 4897 #ifdef WM_DEBUG 4898 device_printf(sc->sc_dev, "Need TX flush (reg = %08x)\n", preg); 4899 #endif 4900 reg = CSR_READ(sc, WMREG_TCTL); 4901 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN); 4902 4903 txq = &sc->sc_queue[0].wmq_txq; 4904 nexttx = txq->txq_next; 4905 txd = &txq->txq_descs[nexttx]; 4906 wm_set_dma_addr(&txd->wtx_addr, txq->txq_desc_dma); 4907 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS | 512); 4908 txd->wtx_fields.wtxu_status = 0; 4909 txd->wtx_fields.wtxu_options = 0; 4910 txd->wtx_fields.wtxu_vlan = 0; 4911 4912 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0, 4913 BUS_SPACE_BARRIER_WRITE); 4914 4915 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 4916 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next); 4917 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0, 4918 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 4919 delay(250); 4920 4921 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS); 4922 if ((preg & DESCRING_STATUS_FLUSH_REQ) == 0) 4923 return; 4924 4925 /* 4926 * Mark all descriptors in the RX ring as consumed and disable the 4927 * rx ring. 4928 */ 4929 #ifdef WM_DEBUG 4930 device_printf(sc->sc_dev, "Need RX flush (reg = %08x)\n", preg); 4931 #endif 4932 rctl = CSR_READ(sc, WMREG_RCTL); 4933 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN); 4934 CSR_WRITE_FLUSH(sc); 4935 delay(150); 4936 4937 reg = CSR_READ(sc, WMREG_RXDCTL(0)); 4938 /* Zero the lower 14 bits (prefetch and host thresholds) */ 4939 reg &= 0xffffc000; 4940 /* 4941 * Update thresholds: prefetch threshold to 31, host threshold 4942 * to 1 and make sure the granularity is "descriptors" and not 4943 * "cache lines" 4944 */ 4945 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN); 4946 CSR_WRITE(sc, WMREG_RXDCTL(0), reg); 4947 4948 /* Momentarily enable the RX ring for the changes to take effect */ 4949 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN); 4950 CSR_WRITE_FLUSH(sc); 4951 delay(150); 4952 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN); 4953 } 4954 4955 /* 4956 * wm_reset: 4957 * 4958 * Reset the i82542 chip. 4959 */ 4960 static void 4961 wm_reset(struct wm_softc *sc) 4962 { 4963 int phy_reset = 0; 4964 int i, error = 0; 4965 uint32_t reg; 4966 uint16_t kmreg; 4967 int rv; 4968 4969 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4970 device_xname(sc->sc_dev), __func__)); 4971 KASSERT(sc->sc_type != 0); 4972 4973 /* 4974 * Allocate on-chip memory according to the MTU size. 4975 * The Packet Buffer Allocation register must be written 4976 * before the chip is reset. 4977 */ 4978 switch (sc->sc_type) { 4979 case WM_T_82547: 4980 case WM_T_82547_2: 4981 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ? 4982 PBA_22K : PBA_30K; 4983 for (i = 0; i < sc->sc_nqueues; i++) { 4984 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 4985 txq->txq_fifo_head = 0; 4986 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT; 4987 txq->txq_fifo_size = 4988 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT; 4989 txq->txq_fifo_stall = 0; 4990 } 4991 break; 4992 case WM_T_82571: 4993 case WM_T_82572: 4994 case WM_T_82575: /* XXX need special handing for jumbo frames */ 4995 case WM_T_80003: 4996 sc->sc_pba = PBA_32K; 4997 break; 4998 case WM_T_82573: 4999 sc->sc_pba = PBA_12K; 5000 break; 5001 case WM_T_82574: 5002 case WM_T_82583: 5003 sc->sc_pba = PBA_20K; 5004 break; 5005 case WM_T_82576: 5006 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS); 5007 sc->sc_pba &= RXPBS_SIZE_MASK_82576; 5008 break; 5009 case WM_T_82580: 5010 case WM_T_I350: 5011 case WM_T_I354: 5012 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS)); 5013 break; 5014 case WM_T_I210: 5015 case WM_T_I211: 5016 sc->sc_pba = PBA_34K; 5017 break; 5018 case WM_T_ICH8: 5019 /* Workaround for a bit corruption issue in FIFO memory */ 5020 sc->sc_pba = PBA_8K; 5021 CSR_WRITE(sc, WMREG_PBS, PBA_16K); 5022 break; 5023 case WM_T_ICH9: 5024 case WM_T_ICH10: 5025 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ? 5026 PBA_14K : PBA_10K; 5027 break; 5028 case WM_T_PCH: 5029 case WM_T_PCH2: /* XXX 14K? */ 5030 case WM_T_PCH_LPT: 5031 case WM_T_PCH_SPT: 5032 case WM_T_PCH_CNP: 5033 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 1500 ? 5034 PBA_12K : PBA_26K; 5035 break; 5036 default: 5037 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ? 5038 PBA_40K : PBA_48K; 5039 break; 5040 } 5041 /* 5042 * Only old or non-multiqueue devices have the PBA register 5043 * XXX Need special handling for 82575. 5044 */ 5045 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0) 5046 || (sc->sc_type == WM_T_82575)) 5047 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba); 5048 5049 /* Prevent the PCI-E bus from sticking */ 5050 if (sc->sc_flags & WM_F_PCIE) { 5051 int timeout = 800; 5052 5053 sc->sc_ctrl |= CTRL_GIO_M_DIS; 5054 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 5055 5056 while (timeout--) { 5057 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA) 5058 == 0) 5059 break; 5060 delay(100); 5061 } 5062 if (timeout == 0) 5063 device_printf(sc->sc_dev, 5064 "failed to disable busmastering\n"); 5065 } 5066 5067 /* Set the completion timeout for interface */ 5068 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 5069 || (sc->sc_type == WM_T_82580) 5070 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 5071 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 5072 wm_set_pcie_completion_timeout(sc); 5073 5074 /* Clear interrupt */ 5075 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 5076 if (wm_is_using_msix(sc)) { 5077 if (sc->sc_type != WM_T_82574) { 5078 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 5079 CSR_WRITE(sc, WMREG_EIAC, 0); 5080 } else 5081 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 5082 } 5083 5084 /* Stop the transmit and receive processes. */ 5085 CSR_WRITE(sc, WMREG_RCTL, 0); 5086 sc->sc_rctl &= ~RCTL_EN; 5087 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP); 5088 CSR_WRITE_FLUSH(sc); 5089 5090 /* XXX set_tbi_sbp_82543() */ 5091 5092 delay(10*1000); 5093 5094 /* Must acquire the MDIO ownership before MAC reset */ 5095 switch (sc->sc_type) { 5096 case WM_T_82573: 5097 case WM_T_82574: 5098 case WM_T_82583: 5099 error = wm_get_hw_semaphore_82573(sc); 5100 break; 5101 default: 5102 break; 5103 } 5104 5105 /* 5106 * 82541 Errata 29? & 82547 Errata 28? 5107 * See also the description about PHY_RST bit in CTRL register 5108 * in 8254x_GBe_SDM.pdf. 5109 */ 5110 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) { 5111 CSR_WRITE(sc, WMREG_CTRL, 5112 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET); 5113 CSR_WRITE_FLUSH(sc); 5114 delay(5000); 5115 } 5116 5117 switch (sc->sc_type) { 5118 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */ 5119 case WM_T_82541: 5120 case WM_T_82541_2: 5121 case WM_T_82547: 5122 case WM_T_82547_2: 5123 /* 5124 * On some chipsets, a reset through a memory-mapped write 5125 * cycle can cause the chip to reset before completing the 5126 * write cycle. This causes major headache that can be avoided 5127 * by issuing the reset via indirect register writes through 5128 * I/O space. 5129 * 5130 * So, if we successfully mapped the I/O BAR at attach time, 5131 * use that. Otherwise, try our luck with a memory-mapped 5132 * reset. 5133 */ 5134 if (sc->sc_flags & WM_F_IOH_VALID) 5135 wm_io_write(sc, WMREG_CTRL, CTRL_RST); 5136 else 5137 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST); 5138 break; 5139 case WM_T_82545_3: 5140 case WM_T_82546_3: 5141 /* Use the shadow control register on these chips. */ 5142 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST); 5143 break; 5144 case WM_T_80003: 5145 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST; 5146 sc->phy.acquire(sc); 5147 CSR_WRITE(sc, WMREG_CTRL, reg); 5148 sc->phy.release(sc); 5149 break; 5150 case WM_T_ICH8: 5151 case WM_T_ICH9: 5152 case WM_T_ICH10: 5153 case WM_T_PCH: 5154 case WM_T_PCH2: 5155 case WM_T_PCH_LPT: 5156 case WM_T_PCH_SPT: 5157 case WM_T_PCH_CNP: 5158 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST; 5159 if (wm_phy_resetisblocked(sc) == false) { 5160 /* 5161 * Gate automatic PHY configuration by hardware on 5162 * non-managed 82579 5163 */ 5164 if ((sc->sc_type == WM_T_PCH2) 5165 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) 5166 == 0)) 5167 wm_gate_hw_phy_config_ich8lan(sc, true); 5168 5169 reg |= CTRL_PHY_RESET; 5170 phy_reset = 1; 5171 } else 5172 device_printf(sc->sc_dev, "XXX reset is blocked!!!\n"); 5173 sc->phy.acquire(sc); 5174 CSR_WRITE(sc, WMREG_CTRL, reg); 5175 /* Don't insert a completion barrier when reset */ 5176 delay(20*1000); 5177 mutex_exit(sc->sc_ich_phymtx); 5178 break; 5179 case WM_T_82580: 5180 case WM_T_I350: 5181 case WM_T_I354: 5182 case WM_T_I210: 5183 case WM_T_I211: 5184 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST); 5185 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII) 5186 CSR_WRITE_FLUSH(sc); 5187 delay(5000); 5188 break; 5189 case WM_T_82542_2_0: 5190 case WM_T_82542_2_1: 5191 case WM_T_82543: 5192 case WM_T_82540: 5193 case WM_T_82545: 5194 case WM_T_82546: 5195 case WM_T_82571: 5196 case WM_T_82572: 5197 case WM_T_82573: 5198 case WM_T_82574: 5199 case WM_T_82575: 5200 case WM_T_82576: 5201 case WM_T_82583: 5202 default: 5203 /* Everything else can safely use the documented method. */ 5204 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST); 5205 break; 5206 } 5207 5208 /* Must release the MDIO ownership after MAC reset */ 5209 switch (sc->sc_type) { 5210 case WM_T_82573: 5211 case WM_T_82574: 5212 case WM_T_82583: 5213 if (error == 0) 5214 wm_put_hw_semaphore_82573(sc); 5215 break; 5216 default: 5217 break; 5218 } 5219 5220 /* Set Phy Config Counter to 50msec */ 5221 if (sc->sc_type == WM_T_PCH2) { 5222 reg = CSR_READ(sc, WMREG_FEXTNVM3); 5223 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK; 5224 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS; 5225 CSR_WRITE(sc, WMREG_FEXTNVM3, reg); 5226 } 5227 5228 if (phy_reset != 0) 5229 wm_get_cfg_done(sc); 5230 5231 /* Reload EEPROM */ 5232 switch (sc->sc_type) { 5233 case WM_T_82542_2_0: 5234 case WM_T_82542_2_1: 5235 case WM_T_82543: 5236 case WM_T_82544: 5237 delay(10); 5238 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST; 5239 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5240 CSR_WRITE_FLUSH(sc); 5241 delay(2000); 5242 break; 5243 case WM_T_82540: 5244 case WM_T_82545: 5245 case WM_T_82545_3: 5246 case WM_T_82546: 5247 case WM_T_82546_3: 5248 delay(5*1000); 5249 /* XXX Disable HW ARPs on ASF enabled adapters */ 5250 break; 5251 case WM_T_82541: 5252 case WM_T_82541_2: 5253 case WM_T_82547: 5254 case WM_T_82547_2: 5255 delay(20000); 5256 /* XXX Disable HW ARPs on ASF enabled adapters */ 5257 break; 5258 case WM_T_82571: 5259 case WM_T_82572: 5260 case WM_T_82573: 5261 case WM_T_82574: 5262 case WM_T_82583: 5263 if (sc->sc_flags & WM_F_EEPROM_FLASH) { 5264 delay(10); 5265 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST; 5266 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5267 CSR_WRITE_FLUSH(sc); 5268 } 5269 /* check EECD_EE_AUTORD */ 5270 wm_get_auto_rd_done(sc); 5271 /* 5272 * Phy configuration from NVM just starts after EECD_AUTO_RD 5273 * is set. 5274 */ 5275 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574) 5276 || (sc->sc_type == WM_T_82583)) 5277 delay(25*1000); 5278 break; 5279 case WM_T_82575: 5280 case WM_T_82576: 5281 case WM_T_82580: 5282 case WM_T_I350: 5283 case WM_T_I354: 5284 case WM_T_I210: 5285 case WM_T_I211: 5286 case WM_T_80003: 5287 /* check EECD_EE_AUTORD */ 5288 wm_get_auto_rd_done(sc); 5289 break; 5290 case WM_T_ICH8: 5291 case WM_T_ICH9: 5292 case WM_T_ICH10: 5293 case WM_T_PCH: 5294 case WM_T_PCH2: 5295 case WM_T_PCH_LPT: 5296 case WM_T_PCH_SPT: 5297 case WM_T_PCH_CNP: 5298 break; 5299 default: 5300 panic("%s: unknown type\n", __func__); 5301 } 5302 5303 /* Check whether EEPROM is present or not */ 5304 switch (sc->sc_type) { 5305 case WM_T_82575: 5306 case WM_T_82576: 5307 case WM_T_82580: 5308 case WM_T_I350: 5309 case WM_T_I354: 5310 case WM_T_ICH8: 5311 case WM_T_ICH9: 5312 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) { 5313 /* Not found */ 5314 sc->sc_flags |= WM_F_EEPROM_INVALID; 5315 if (sc->sc_type == WM_T_82575) 5316 wm_reset_init_script_82575(sc); 5317 } 5318 break; 5319 default: 5320 break; 5321 } 5322 5323 if (phy_reset != 0) 5324 wm_phy_post_reset(sc); 5325 5326 if ((sc->sc_type == WM_T_82580) 5327 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) { 5328 /* Clear global device reset status bit */ 5329 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET); 5330 } 5331 5332 /* Clear any pending interrupt events. */ 5333 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 5334 reg = CSR_READ(sc, WMREG_ICR); 5335 if (wm_is_using_msix(sc)) { 5336 if (sc->sc_type != WM_T_82574) { 5337 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 5338 CSR_WRITE(sc, WMREG_EIAC, 0); 5339 } else 5340 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 5341 } 5342 5343 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 5344 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 5345 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 5346 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){ 5347 reg = CSR_READ(sc, WMREG_KABGTXD); 5348 reg |= KABGTXD_BGSQLBIAS; 5349 CSR_WRITE(sc, WMREG_KABGTXD, reg); 5350 } 5351 5352 /* Reload sc_ctrl */ 5353 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 5354 5355 wm_set_eee(sc); 5356 5357 /* 5358 * For PCH, this write will make sure that any noise will be detected 5359 * as a CRC error and be dropped rather than show up as a bad packet 5360 * to the DMA engine 5361 */ 5362 if (sc->sc_type == WM_T_PCH) 5363 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565); 5364 5365 if (sc->sc_type >= WM_T_82544) 5366 CSR_WRITE(sc, WMREG_WUC, 0); 5367 5368 if (sc->sc_type < WM_T_82575) 5369 wm_disable_aspm(sc); /* Workaround for some chips */ 5370 5371 wm_reset_mdicnfg_82580(sc); 5372 5373 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0) 5374 wm_pll_workaround_i210(sc); 5375 5376 if (sc->sc_type == WM_T_80003) { 5377 /* Default to TRUE to enable the MDIC W/A */ 5378 sc->sc_flags |= WM_F_80003_MDIC_WA; 5379 5380 rv = wm_kmrn_readreg(sc, 5381 KUMCTRLSTA_OFFSET >> KUMCTRLSTA_OFFSET_SHIFT, &kmreg); 5382 if (rv == 0) { 5383 if ((kmreg & KUMCTRLSTA_OPMODE_MASK) 5384 == KUMCTRLSTA_OPMODE_INBAND_MDIO) 5385 sc->sc_flags &= ~WM_F_80003_MDIC_WA; 5386 else 5387 sc->sc_flags |= WM_F_80003_MDIC_WA; 5388 } 5389 } 5390 } 5391 5392 /* 5393 * wm_add_rxbuf: 5394 * 5395 * Add a receive buffer to the indiciated descriptor. 5396 */ 5397 static int 5398 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx) 5399 { 5400 struct wm_softc *sc = rxq->rxq_sc; 5401 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx]; 5402 struct mbuf *m; 5403 int error; 5404 5405 KASSERT(mutex_owned(rxq->rxq_lock)); 5406 5407 MGETHDR(m, M_DONTWAIT, MT_DATA); 5408 if (m == NULL) 5409 return ENOBUFS; 5410 5411 MCLGET(m, M_DONTWAIT); 5412 if ((m->m_flags & M_EXT) == 0) { 5413 m_freem(m); 5414 return ENOBUFS; 5415 } 5416 5417 if (rxs->rxs_mbuf != NULL) 5418 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 5419 5420 rxs->rxs_mbuf = m; 5421 5422 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; 5423 /* 5424 * Cannot use bus_dmamap_load_mbuf() here because m_data may be 5425 * sc_align_tweak'd between bus_dmamap_load() and bus_dmamap_sync(). 5426 */ 5427 error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, m->m_ext.ext_buf, 5428 m->m_ext.ext_size, NULL, BUS_DMA_READ | BUS_DMA_NOWAIT); 5429 if (error) { 5430 /* XXX XXX XXX */ 5431 aprint_error_dev(sc->sc_dev, 5432 "unable to load rx DMA map %d, error = %d\n", idx, error); 5433 panic("wm_add_rxbuf"); 5434 } 5435 5436 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 5437 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 5438 5439 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 5440 if ((sc->sc_rctl & RCTL_EN) != 0) 5441 wm_init_rxdesc(rxq, idx); 5442 } else 5443 wm_init_rxdesc(rxq, idx); 5444 5445 return 0; 5446 } 5447 5448 /* 5449 * wm_rxdrain: 5450 * 5451 * Drain the receive queue. 5452 */ 5453 static void 5454 wm_rxdrain(struct wm_rxqueue *rxq) 5455 { 5456 struct wm_softc *sc = rxq->rxq_sc; 5457 struct wm_rxsoft *rxs; 5458 int i; 5459 5460 KASSERT(mutex_owned(rxq->rxq_lock)); 5461 5462 for (i = 0; i < WM_NRXDESC; i++) { 5463 rxs = &rxq->rxq_soft[i]; 5464 if (rxs->rxs_mbuf != NULL) { 5465 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 5466 m_freem(rxs->rxs_mbuf); 5467 rxs->rxs_mbuf = NULL; 5468 } 5469 } 5470 } 5471 5472 /* 5473 * Setup registers for RSS. 5474 * 5475 * XXX not yet VMDq support 5476 */ 5477 static void 5478 wm_init_rss(struct wm_softc *sc) 5479 { 5480 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS]; 5481 int i; 5482 5483 CTASSERT(sizeof(rss_key) == RSS_KEYSIZE); 5484 5485 for (i = 0; i < RETA_NUM_ENTRIES; i++) { 5486 unsigned int qid, reta_ent; 5487 5488 qid = i % sc->sc_nqueues; 5489 switch (sc->sc_type) { 5490 case WM_T_82574: 5491 reta_ent = __SHIFTIN(qid, 5492 RETA_ENT_QINDEX_MASK_82574); 5493 break; 5494 case WM_T_82575: 5495 reta_ent = __SHIFTIN(qid, 5496 RETA_ENT_QINDEX1_MASK_82575); 5497 break; 5498 default: 5499 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK); 5500 break; 5501 } 5502 5503 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i)); 5504 reta_reg &= ~RETA_ENTRY_MASK_Q(i); 5505 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i)); 5506 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg); 5507 } 5508 5509 rss_getkey((uint8_t *)rss_key); 5510 for (i = 0; i < RSSRK_NUM_REGS; i++) 5511 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]); 5512 5513 if (sc->sc_type == WM_T_82574) 5514 mrqc = MRQC_ENABLE_RSS_MQ_82574; 5515 else 5516 mrqc = MRQC_ENABLE_RSS_MQ; 5517 5518 /* 5519 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata. 5520 * See IPV6EXDIS bit in wm_initialize_hardware_bits(). 5521 */ 5522 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP); 5523 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP); 5524 #if 0 5525 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP); 5526 mrqc |= MRQC_RSS_FIELD_IPV6_UDP_EX; 5527 #endif 5528 mrqc |= MRQC_RSS_FIELD_IPV6_TCP_EX; 5529 5530 CSR_WRITE(sc, WMREG_MRQC, mrqc); 5531 } 5532 5533 /* 5534 * Adjust TX and RX queue numbers which the system actulally uses. 5535 * 5536 * The numbers are affected by below parameters. 5537 * - The nubmer of hardware queues 5538 * - The number of MSI-X vectors (= "nvectors" argument) 5539 * - ncpu 5540 */ 5541 static void 5542 wm_adjust_qnum(struct wm_softc *sc, int nvectors) 5543 { 5544 int hw_ntxqueues, hw_nrxqueues, hw_nqueues; 5545 5546 if (nvectors < 2) { 5547 sc->sc_nqueues = 1; 5548 return; 5549 } 5550 5551 switch (sc->sc_type) { 5552 case WM_T_82572: 5553 hw_ntxqueues = 2; 5554 hw_nrxqueues = 2; 5555 break; 5556 case WM_T_82574: 5557 hw_ntxqueues = 2; 5558 hw_nrxqueues = 2; 5559 break; 5560 case WM_T_82575: 5561 hw_ntxqueues = 4; 5562 hw_nrxqueues = 4; 5563 break; 5564 case WM_T_82576: 5565 hw_ntxqueues = 16; 5566 hw_nrxqueues = 16; 5567 break; 5568 case WM_T_82580: 5569 case WM_T_I350: 5570 case WM_T_I354: 5571 hw_ntxqueues = 8; 5572 hw_nrxqueues = 8; 5573 break; 5574 case WM_T_I210: 5575 hw_ntxqueues = 4; 5576 hw_nrxqueues = 4; 5577 break; 5578 case WM_T_I211: 5579 hw_ntxqueues = 2; 5580 hw_nrxqueues = 2; 5581 break; 5582 /* 5583 * As below ethernet controllers does not support MSI-X, 5584 * this driver let them not use multiqueue. 5585 * - WM_T_80003 5586 * - WM_T_ICH8 5587 * - WM_T_ICH9 5588 * - WM_T_ICH10 5589 * - WM_T_PCH 5590 * - WM_T_PCH2 5591 * - WM_T_PCH_LPT 5592 */ 5593 default: 5594 hw_ntxqueues = 1; 5595 hw_nrxqueues = 1; 5596 break; 5597 } 5598 5599 hw_nqueues = uimin(hw_ntxqueues, hw_nrxqueues); 5600 5601 /* 5602 * As queues more than MSI-X vectors cannot improve scaling, we limit 5603 * the number of queues used actually. 5604 */ 5605 if (nvectors < hw_nqueues + 1) 5606 sc->sc_nqueues = nvectors - 1; 5607 else 5608 sc->sc_nqueues = hw_nqueues; 5609 5610 /* 5611 * As queues more then cpus cannot improve scaling, we limit 5612 * the number of queues used actually. 5613 */ 5614 if (ncpu < sc->sc_nqueues) 5615 sc->sc_nqueues = ncpu; 5616 } 5617 5618 static inline bool 5619 wm_is_using_msix(struct wm_softc *sc) 5620 { 5621 5622 return (sc->sc_nintrs > 1); 5623 } 5624 5625 static inline bool 5626 wm_is_using_multiqueue(struct wm_softc *sc) 5627 { 5628 5629 return (sc->sc_nqueues > 1); 5630 } 5631 5632 static int 5633 wm_softint_establish_queue(struct wm_softc *sc, int qidx, int intr_idx) 5634 { 5635 struct wm_queue *wmq = &sc->sc_queue[qidx]; 5636 5637 wmq->wmq_id = qidx; 5638 wmq->wmq_intr_idx = intr_idx; 5639 wmq->wmq_si = softint_establish(SOFTINT_NET | WM_SOFTINT_FLAGS, 5640 wm_handle_queue, wmq); 5641 if (wmq->wmq_si != NULL) 5642 return 0; 5643 5644 aprint_error_dev(sc->sc_dev, "unable to establish queue[%d] handler\n", 5645 wmq->wmq_id); 5646 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[wmq->wmq_intr_idx]); 5647 sc->sc_ihs[wmq->wmq_intr_idx] = NULL; 5648 return ENOMEM; 5649 } 5650 5651 /* 5652 * Both single interrupt MSI and INTx can use this function. 5653 */ 5654 static int 5655 wm_setup_legacy(struct wm_softc *sc) 5656 { 5657 pci_chipset_tag_t pc = sc->sc_pc; 5658 const char *intrstr = NULL; 5659 char intrbuf[PCI_INTRSTR_LEN]; 5660 int error; 5661 5662 error = wm_alloc_txrx_queues(sc); 5663 if (error) { 5664 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n", 5665 error); 5666 return ENOMEM; 5667 } 5668 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf, 5669 sizeof(intrbuf)); 5670 #ifdef WM_MPSAFE 5671 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true); 5672 #endif 5673 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0], 5674 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev)); 5675 if (sc->sc_ihs[0] == NULL) { 5676 aprint_error_dev(sc->sc_dev,"unable to establish %s\n", 5677 (pci_intr_type(pc, sc->sc_intrs[0]) 5678 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx"); 5679 return ENOMEM; 5680 } 5681 5682 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr); 5683 sc->sc_nintrs = 1; 5684 5685 return wm_softint_establish_queue(sc, 0, 0); 5686 } 5687 5688 static int 5689 wm_setup_msix(struct wm_softc *sc) 5690 { 5691 void *vih; 5692 kcpuset_t *affinity; 5693 int qidx, error, intr_idx, txrx_established; 5694 pci_chipset_tag_t pc = sc->sc_pc; 5695 const char *intrstr = NULL; 5696 char intrbuf[PCI_INTRSTR_LEN]; 5697 char intr_xname[INTRDEVNAMEBUF]; 5698 5699 if (sc->sc_nqueues < ncpu) { 5700 /* 5701 * To avoid other devices' interrupts, the affinity of Tx/Rx 5702 * interrupts start from CPU#1. 5703 */ 5704 sc->sc_affinity_offset = 1; 5705 } else { 5706 /* 5707 * In this case, this device use all CPUs. So, we unify 5708 * affinitied cpu_index to msix vector number for readability. 5709 */ 5710 sc->sc_affinity_offset = 0; 5711 } 5712 5713 error = wm_alloc_txrx_queues(sc); 5714 if (error) { 5715 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n", 5716 error); 5717 return ENOMEM; 5718 } 5719 5720 kcpuset_create(&affinity, false); 5721 intr_idx = 0; 5722 5723 /* 5724 * TX and RX 5725 */ 5726 txrx_established = 0; 5727 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { 5728 struct wm_queue *wmq = &sc->sc_queue[qidx]; 5729 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu; 5730 5731 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 5732 sizeof(intrbuf)); 5733 #ifdef WM_MPSAFE 5734 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], 5735 PCI_INTR_MPSAFE, true); 5736 #endif 5737 memset(intr_xname, 0, sizeof(intr_xname)); 5738 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d", 5739 device_xname(sc->sc_dev), qidx); 5740 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 5741 IPL_NET, wm_txrxintr_msix, wmq, intr_xname); 5742 if (vih == NULL) { 5743 aprint_error_dev(sc->sc_dev, 5744 "unable to establish MSI-X(for TX and RX)%s%s\n", 5745 intrstr ? " at " : "", 5746 intrstr ? intrstr : ""); 5747 5748 goto fail; 5749 } 5750 kcpuset_zero(affinity); 5751 /* Round-robin affinity */ 5752 kcpuset_set(affinity, affinity_to); 5753 error = interrupt_distribute(vih, affinity, NULL); 5754 if (error == 0) { 5755 aprint_normal_dev(sc->sc_dev, 5756 "for TX and RX interrupting at %s affinity to %u\n", 5757 intrstr, affinity_to); 5758 } else { 5759 aprint_normal_dev(sc->sc_dev, 5760 "for TX and RX interrupting at %s\n", intrstr); 5761 } 5762 sc->sc_ihs[intr_idx] = vih; 5763 if (wm_softint_establish_queue(sc, qidx, intr_idx) != 0) 5764 goto fail; 5765 txrx_established++; 5766 intr_idx++; 5767 } 5768 5769 /* LINK */ 5770 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 5771 sizeof(intrbuf)); 5772 #ifdef WM_MPSAFE 5773 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true); 5774 #endif 5775 memset(intr_xname, 0, sizeof(intr_xname)); 5776 snprintf(intr_xname, sizeof(intr_xname), "%sLINK", 5777 device_xname(sc->sc_dev)); 5778 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 5779 IPL_NET, wm_linkintr_msix, sc, intr_xname); 5780 if (vih == NULL) { 5781 aprint_error_dev(sc->sc_dev, 5782 "unable to establish MSI-X(for LINK)%s%s\n", 5783 intrstr ? " at " : "", 5784 intrstr ? intrstr : ""); 5785 5786 goto fail; 5787 } 5788 /* Keep default affinity to LINK interrupt */ 5789 aprint_normal_dev(sc->sc_dev, 5790 "for LINK interrupting at %s\n", intrstr); 5791 sc->sc_ihs[intr_idx] = vih; 5792 sc->sc_link_intr_idx = intr_idx; 5793 5794 sc->sc_nintrs = sc->sc_nqueues + 1; 5795 kcpuset_destroy(affinity); 5796 return 0; 5797 5798 fail: 5799 for (qidx = 0; qidx < txrx_established; qidx++) { 5800 struct wm_queue *wmq = &sc->sc_queue[qidx]; 5801 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]); 5802 sc->sc_ihs[wmq->wmq_intr_idx] = NULL; 5803 } 5804 5805 kcpuset_destroy(affinity); 5806 return ENOMEM; 5807 } 5808 5809 static void 5810 wm_unset_stopping_flags(struct wm_softc *sc) 5811 { 5812 int i; 5813 5814 KASSERT(WM_CORE_LOCKED(sc)); 5815 5816 /* Must unset stopping flags in ascending order. */ 5817 for (i = 0; i < sc->sc_nqueues; i++) { 5818 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 5819 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 5820 5821 mutex_enter(txq->txq_lock); 5822 txq->txq_stopping = false; 5823 mutex_exit(txq->txq_lock); 5824 5825 mutex_enter(rxq->rxq_lock); 5826 rxq->rxq_stopping = false; 5827 mutex_exit(rxq->rxq_lock); 5828 } 5829 5830 sc->sc_core_stopping = false; 5831 } 5832 5833 static void 5834 wm_set_stopping_flags(struct wm_softc *sc) 5835 { 5836 int i; 5837 5838 KASSERT(WM_CORE_LOCKED(sc)); 5839 5840 sc->sc_core_stopping = true; 5841 5842 /* Must set stopping flags in ascending order. */ 5843 for (i = 0; i < sc->sc_nqueues; i++) { 5844 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 5845 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 5846 5847 mutex_enter(rxq->rxq_lock); 5848 rxq->rxq_stopping = true; 5849 mutex_exit(rxq->rxq_lock); 5850 5851 mutex_enter(txq->txq_lock); 5852 txq->txq_stopping = true; 5853 mutex_exit(txq->txq_lock); 5854 } 5855 } 5856 5857 /* 5858 * Write interrupt interval value to ITR or EITR 5859 */ 5860 static void 5861 wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq) 5862 { 5863 5864 if (!wmq->wmq_set_itr) 5865 return; 5866 5867 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 5868 uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK); 5869 5870 /* 5871 * 82575 doesn't have CNT_INGR field. 5872 * So, overwrite counter field by software. 5873 */ 5874 if (sc->sc_type == WM_T_82575) 5875 eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575); 5876 else 5877 eitr |= EITR_CNT_INGR; 5878 5879 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx), eitr); 5880 } else if (sc->sc_type == WM_T_82574 && wm_is_using_msix(sc)) { 5881 /* 5882 * 82574 has both ITR and EITR. SET EITR when we use 5883 * the multi queue function with MSI-X. 5884 */ 5885 CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx), 5886 wmq->wmq_itr & EITR_ITR_INT_MASK_82574); 5887 } else { 5888 KASSERT(wmq->wmq_id == 0); 5889 CSR_WRITE(sc, WMREG_ITR, wmq->wmq_itr); 5890 } 5891 5892 wmq->wmq_set_itr = false; 5893 } 5894 5895 /* 5896 * TODO 5897 * Below dynamic calculation of itr is almost the same as linux igb, 5898 * however it does not fit to wm(4). So, we will have been disable AIM 5899 * until we will find appropriate calculation of itr. 5900 */ 5901 /* 5902 * calculate interrupt interval value to be going to write register in 5903 * wm_itrs_writereg(). This function does not write ITR/EITR register. 5904 */ 5905 static void 5906 wm_itrs_calculate(struct wm_softc *sc, struct wm_queue *wmq) 5907 { 5908 #ifdef NOTYET 5909 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 5910 struct wm_txqueue *txq = &wmq->wmq_txq; 5911 uint32_t avg_size = 0; 5912 uint32_t new_itr; 5913 5914 if (rxq->rxq_packets) 5915 avg_size = rxq->rxq_bytes / rxq->rxq_packets; 5916 if (txq->txq_packets) 5917 avg_size = uimax(avg_size, txq->txq_bytes / txq->txq_packets); 5918 5919 if (avg_size == 0) { 5920 new_itr = 450; /* restore default value */ 5921 goto out; 5922 } 5923 5924 /* Add 24 bytes to size to account for CRC, preamble, and gap */ 5925 avg_size += 24; 5926 5927 /* Don't starve jumbo frames */ 5928 avg_size = uimin(avg_size, 3000); 5929 5930 /* Give a little boost to mid-size frames */ 5931 if ((avg_size > 300) && (avg_size < 1200)) 5932 new_itr = avg_size / 3; 5933 else 5934 new_itr = avg_size / 2; 5935 5936 out: 5937 /* 5938 * The usage of 82574 and 82575 EITR is different from otther NEWQUEUE 5939 * controllers. See sc->sc_itr_init setting in wm_init_locked(). 5940 */ 5941 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0 || sc->sc_type != WM_T_82575) 5942 new_itr *= 4; 5943 5944 if (new_itr != wmq->wmq_itr) { 5945 wmq->wmq_itr = new_itr; 5946 wmq->wmq_set_itr = true; 5947 } else 5948 wmq->wmq_set_itr = false; 5949 5950 rxq->rxq_packets = 0; 5951 rxq->rxq_bytes = 0; 5952 txq->txq_packets = 0; 5953 txq->txq_bytes = 0; 5954 #endif 5955 } 5956 5957 static void 5958 wm_init_sysctls(struct wm_softc *sc) 5959 { 5960 struct sysctllog **log; 5961 const struct sysctlnode *rnode, *qnode, *cnode; 5962 int i, rv; 5963 const char *dvname; 5964 5965 log = &sc->sc_sysctllog; 5966 dvname = device_xname(sc->sc_dev); 5967 5968 rv = sysctl_createv(log, 0, NULL, &rnode, 5969 0, CTLTYPE_NODE, dvname, 5970 SYSCTL_DESCR("wm information and settings"), 5971 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL); 5972 if (rv != 0) 5973 goto err; 5974 5975 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE, 5976 CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"), 5977 NULL, 0, &sc->sc_txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL); 5978 if (rv != 0) 5979 goto teardown; 5980 5981 for (i = 0; i < sc->sc_nqueues; i++) { 5982 struct wm_queue *wmq = &sc->sc_queue[i]; 5983 struct wm_txqueue *txq = &wmq->wmq_txq; 5984 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 5985 5986 snprintf(sc->sc_queue[i].sysctlname, 5987 sizeof(sc->sc_queue[i].sysctlname), "q%d", i); 5988 5989 if (sysctl_createv(log, 0, &rnode, &qnode, 5990 0, CTLTYPE_NODE, 5991 sc->sc_queue[i].sysctlname, SYSCTL_DESCR("Queue Name"), 5992 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) 5993 break; 5994 if (sysctl_createv(log, 0, &qnode, &cnode, 5995 CTLFLAG_READONLY, CTLTYPE_INT, 5996 "txq_free", SYSCTL_DESCR("TX queue free"), 5997 NULL, 0, &txq->txq_free, 5998 0, CTL_CREATE, CTL_EOL) != 0) 5999 break; 6000 if (sysctl_createv(log, 0, &qnode, &cnode, 6001 CTLFLAG_READONLY, CTLTYPE_INT, 6002 "txq_next", SYSCTL_DESCR("TX queue next"), 6003 NULL, 0, &txq->txq_next, 6004 0, CTL_CREATE, CTL_EOL) != 0) 6005 break; 6006 6007 if (sysctl_createv(log, 0, &qnode, &cnode, 6008 CTLFLAG_READONLY, CTLTYPE_INT, 6009 "rxq_ptr", SYSCTL_DESCR("RX queue pointer"), 6010 NULL, 0, &rxq->rxq_ptr, 6011 0, CTL_CREATE, CTL_EOL) != 0) 6012 break; 6013 } 6014 6015 #ifdef WM_DEBUG 6016 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE, 6017 CTLTYPE_INT, "debug_flags", 6018 SYSCTL_DESCR( 6019 "Debug flags:\n" \ 6020 "\t0x01 LINK\n" \ 6021 "\t0x02 TX\n" \ 6022 "\t0x04 RX\n" \ 6023 "\t0x08 GMII\n" \ 6024 "\t0x10 MANAGE\n" \ 6025 "\t0x20 NVM\n" \ 6026 "\t0x40 INIT\n" \ 6027 "\t0x80 LOCK"), 6028 wm_sysctl_debug, 0, (void *)sc, 0, CTL_CREATE, CTL_EOL); 6029 if (rv != 0) 6030 goto teardown; 6031 #endif 6032 6033 return; 6034 6035 teardown: 6036 sysctl_teardown(log); 6037 err: 6038 sc->sc_sysctllog = NULL; 6039 device_printf(sc->sc_dev, "%s: sysctl_createv failed, rv = %d\n", 6040 __func__, rv); 6041 } 6042 6043 /* 6044 * wm_init: [ifnet interface function] 6045 * 6046 * Initialize the interface. 6047 */ 6048 static int 6049 wm_init(struct ifnet *ifp) 6050 { 6051 struct wm_softc *sc = ifp->if_softc; 6052 int ret; 6053 6054 WM_CORE_LOCK(sc); 6055 ret = wm_init_locked(ifp); 6056 WM_CORE_UNLOCK(sc); 6057 6058 return ret; 6059 } 6060 6061 static int 6062 wm_init_locked(struct ifnet *ifp) 6063 { 6064 struct wm_softc *sc = ifp->if_softc; 6065 struct ethercom *ec = &sc->sc_ethercom; 6066 int i, j, trynum, error = 0; 6067 uint32_t reg, sfp_mask = 0; 6068 6069 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 6070 device_xname(sc->sc_dev), __func__)); 6071 KASSERT(WM_CORE_LOCKED(sc)); 6072 6073 /* 6074 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set. 6075 * There is a small but measurable benefit to avoiding the adjusment 6076 * of the descriptor so that the headers are aligned, for normal mtu, 6077 * on such platforms. One possibility is that the DMA itself is 6078 * slightly more efficient if the front of the entire packet (instead 6079 * of the front of the headers) is aligned. 6080 * 6081 * Note we must always set align_tweak to 0 if we are using 6082 * jumbo frames. 6083 */ 6084 #ifdef __NO_STRICT_ALIGNMENT 6085 sc->sc_align_tweak = 0; 6086 #else 6087 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2)) 6088 sc->sc_align_tweak = 0; 6089 else 6090 sc->sc_align_tweak = 2; 6091 #endif /* __NO_STRICT_ALIGNMENT */ 6092 6093 /* Cancel any pending I/O. */ 6094 wm_stop_locked(ifp, false, false); 6095 6096 /* Update statistics before reset */ 6097 if_statadd2(ifp, if_collisions, CSR_READ(sc, WMREG_COLC), 6098 if_ierrors, CSR_READ(sc, WMREG_RXERRC)); 6099 6100 /* >= PCH_SPT hardware workaround before reset. */ 6101 if (sc->sc_type >= WM_T_PCH_SPT) 6102 wm_flush_desc_rings(sc); 6103 6104 /* Reset the chip to a known state. */ 6105 wm_reset(sc); 6106 6107 /* 6108 * AMT based hardware can now take control from firmware 6109 * Do this after reset. 6110 */ 6111 if ((sc->sc_flags & WM_F_HAS_AMT) != 0) 6112 wm_get_hw_control(sc); 6113 6114 if ((sc->sc_type >= WM_T_PCH_SPT) && 6115 pci_intr_type(sc->sc_pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_INTX) 6116 wm_legacy_irq_quirk_spt(sc); 6117 6118 /* Init hardware bits */ 6119 wm_initialize_hardware_bits(sc); 6120 6121 /* Reset the PHY. */ 6122 if (sc->sc_flags & WM_F_HAS_MII) 6123 wm_gmii_reset(sc); 6124 6125 if (sc->sc_type >= WM_T_ICH8) { 6126 reg = CSR_READ(sc, WMREG_GCR); 6127 /* 6128 * ICH8 No-snoop bits are opposite polarity. Set to snoop by 6129 * default after reset. 6130 */ 6131 if (sc->sc_type == WM_T_ICH8) 6132 reg |= GCR_NO_SNOOP_ALL; 6133 else 6134 reg &= ~GCR_NO_SNOOP_ALL; 6135 CSR_WRITE(sc, WMREG_GCR, reg); 6136 } 6137 6138 if ((sc->sc_type >= WM_T_ICH8) 6139 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER) 6140 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3)) { 6141 6142 reg = CSR_READ(sc, WMREG_CTRL_EXT); 6143 reg |= CTRL_EXT_RO_DIS; 6144 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 6145 } 6146 6147 /* Calculate (E)ITR value */ 6148 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0 && sc->sc_type != WM_T_82575) { 6149 /* 6150 * For NEWQUEUE's EITR (except for 82575). 6151 * 82575's EITR should be set same throttling value as other 6152 * old controllers' ITR because the interrupt/sec calculation 6153 * is the same, that is, 1,000,000,000 / (N * 256). 6154 * 6155 * 82574's EITR should be set same throttling value as ITR. 6156 * 6157 * For N interrupts/sec, set this value to: 6158 * 1,000,000 / N in contrast to ITR throttoling value. 6159 */ 6160 sc->sc_itr_init = 450; 6161 } else if (sc->sc_type >= WM_T_82543) { 6162 /* 6163 * Set up the interrupt throttling register (units of 256ns) 6164 * Note that a footnote in Intel's documentation says this 6165 * ticker runs at 1/4 the rate when the chip is in 100Mbit 6166 * or 10Mbit mode. Empirically, it appears to be the case 6167 * that that is also true for the 1024ns units of the other 6168 * interrupt-related timer registers -- so, really, we ought 6169 * to divide this value by 4 when the link speed is low. 6170 * 6171 * XXX implement this division at link speed change! 6172 */ 6173 6174 /* 6175 * For N interrupts/sec, set this value to: 6176 * 1,000,000,000 / (N * 256). Note that we set the 6177 * absolute and packet timer values to this value 6178 * divided by 4 to get "simple timer" behavior. 6179 */ 6180 sc->sc_itr_init = 1500; /* 2604 ints/sec */ 6181 } 6182 6183 error = wm_init_txrx_queues(sc); 6184 if (error) 6185 goto out; 6186 6187 if (((sc->sc_flags & WM_F_SGMII) == 0) && 6188 (sc->sc_mediatype == WM_MEDIATYPE_SERDES) && 6189 (sc->sc_type >= WM_T_82575)) 6190 wm_serdes_power_up_link_82575(sc); 6191 6192 /* Clear out the VLAN table -- we don't use it (yet). */ 6193 CSR_WRITE(sc, WMREG_VET, 0); 6194 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 6195 trynum = 10; /* Due to hw errata */ 6196 else 6197 trynum = 1; 6198 for (i = 0; i < WM_VLAN_TABSIZE; i++) 6199 for (j = 0; j < trynum; j++) 6200 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0); 6201 6202 /* 6203 * Set up flow-control parameters. 6204 * 6205 * XXX Values could probably stand some tuning. 6206 */ 6207 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9) 6208 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH) 6209 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT) 6210 && (sc->sc_type != WM_T_PCH_SPT) && (sc->sc_type != WM_T_PCH_CNP)){ 6211 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST); 6212 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST); 6213 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL); 6214 } 6215 6216 sc->sc_fcrtl = FCRTL_DFLT; 6217 if (sc->sc_type < WM_T_82543) { 6218 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT); 6219 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl); 6220 } else { 6221 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT); 6222 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl); 6223 } 6224 6225 if (sc->sc_type == WM_T_80003) 6226 CSR_WRITE(sc, WMREG_FCTTV, 0xffff); 6227 else 6228 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT); 6229 6230 /* Writes the control register. */ 6231 wm_set_vlan(sc); 6232 6233 if (sc->sc_flags & WM_F_HAS_MII) { 6234 uint16_t kmreg; 6235 6236 switch (sc->sc_type) { 6237 case WM_T_80003: 6238 case WM_T_ICH8: 6239 case WM_T_ICH9: 6240 case WM_T_ICH10: 6241 case WM_T_PCH: 6242 case WM_T_PCH2: 6243 case WM_T_PCH_LPT: 6244 case WM_T_PCH_SPT: 6245 case WM_T_PCH_CNP: 6246 /* 6247 * Set the mac to wait the maximum time between each 6248 * iteration and increase the max iterations when 6249 * polling the phy; this fixes erroneous timeouts at 6250 * 10Mbps. 6251 */ 6252 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS, 6253 0xFFFF); 6254 wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM, 6255 &kmreg); 6256 kmreg |= 0x3F; 6257 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM, 6258 kmreg); 6259 break; 6260 default: 6261 break; 6262 } 6263 6264 if (sc->sc_type == WM_T_80003) { 6265 reg = CSR_READ(sc, WMREG_CTRL_EXT); 6266 reg &= ~CTRL_EXT_LINK_MODE_MASK; 6267 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 6268 6269 /* Bypass RX and TX FIFO's */ 6270 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL, 6271 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 6272 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS); 6273 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL, 6274 KUMCTRLSTA_INB_CTRL_DIS_PADDING | 6275 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT); 6276 } 6277 } 6278 #if 0 6279 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext); 6280 #endif 6281 6282 /* Set up checksum offload parameters. */ 6283 reg = CSR_READ(sc, WMREG_RXCSUM); 6284 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL); 6285 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx) 6286 reg |= RXCSUM_IPOFL; 6287 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx)) 6288 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL; 6289 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx)) 6290 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL; 6291 CSR_WRITE(sc, WMREG_RXCSUM, reg); 6292 6293 /* Set registers about MSI-X */ 6294 if (wm_is_using_msix(sc)) { 6295 uint32_t ivar, qintr_idx; 6296 struct wm_queue *wmq; 6297 unsigned int qid; 6298 6299 if (sc->sc_type == WM_T_82575) { 6300 /* Interrupt control */ 6301 reg = CSR_READ(sc, WMREG_CTRL_EXT); 6302 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR; 6303 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 6304 6305 /* TX and RX */ 6306 for (i = 0; i < sc->sc_nqueues; i++) { 6307 wmq = &sc->sc_queue[i]; 6308 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx), 6309 EITR_TX_QUEUE(wmq->wmq_id) 6310 | EITR_RX_QUEUE(wmq->wmq_id)); 6311 } 6312 /* Link status */ 6313 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx), 6314 EITR_OTHER); 6315 } else if (sc->sc_type == WM_T_82574) { 6316 /* Interrupt control */ 6317 reg = CSR_READ(sc, WMREG_CTRL_EXT); 6318 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME; 6319 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 6320 6321 /* 6322 * Workaround issue with spurious interrupts 6323 * in MSI-X mode. 6324 * At wm_initialize_hardware_bits(), sc_nintrs has not 6325 * initialized yet. So re-initialize WMREG_RFCTL here. 6326 */ 6327 reg = CSR_READ(sc, WMREG_RFCTL); 6328 reg |= WMREG_RFCTL_ACKDIS; 6329 CSR_WRITE(sc, WMREG_RFCTL, reg); 6330 6331 ivar = 0; 6332 /* TX and RX */ 6333 for (i = 0; i < sc->sc_nqueues; i++) { 6334 wmq = &sc->sc_queue[i]; 6335 qid = wmq->wmq_id; 6336 qintr_idx = wmq->wmq_intr_idx; 6337 6338 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx), 6339 IVAR_TX_MASK_Q_82574(qid)); 6340 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx), 6341 IVAR_RX_MASK_Q_82574(qid)); 6342 } 6343 /* Link status */ 6344 ivar |= __SHIFTIN((IVAR_VALID_82574 6345 | sc->sc_link_intr_idx), IVAR_OTHER_MASK); 6346 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB); 6347 } else { 6348 /* Interrupt control */ 6349 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX 6350 | GPIE_EIAME | GPIE_PBA); 6351 6352 switch (sc->sc_type) { 6353 case WM_T_82580: 6354 case WM_T_I350: 6355 case WM_T_I354: 6356 case WM_T_I210: 6357 case WM_T_I211: 6358 /* TX and RX */ 6359 for (i = 0; i < sc->sc_nqueues; i++) { 6360 wmq = &sc->sc_queue[i]; 6361 qid = wmq->wmq_id; 6362 qintr_idx = wmq->wmq_intr_idx; 6363 6364 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid)); 6365 ivar &= ~IVAR_TX_MASK_Q(qid); 6366 ivar |= __SHIFTIN((qintr_idx 6367 | IVAR_VALID), 6368 IVAR_TX_MASK_Q(qid)); 6369 ivar &= ~IVAR_RX_MASK_Q(qid); 6370 ivar |= __SHIFTIN((qintr_idx 6371 | IVAR_VALID), 6372 IVAR_RX_MASK_Q(qid)); 6373 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar); 6374 } 6375 break; 6376 case WM_T_82576: 6377 /* TX and RX */ 6378 for (i = 0; i < sc->sc_nqueues; i++) { 6379 wmq = &sc->sc_queue[i]; 6380 qid = wmq->wmq_id; 6381 qintr_idx = wmq->wmq_intr_idx; 6382 6383 ivar = CSR_READ(sc, 6384 WMREG_IVAR_Q_82576(qid)); 6385 ivar &= ~IVAR_TX_MASK_Q_82576(qid); 6386 ivar |= __SHIFTIN((qintr_idx 6387 | IVAR_VALID), 6388 IVAR_TX_MASK_Q_82576(qid)); 6389 ivar &= ~IVAR_RX_MASK_Q_82576(qid); 6390 ivar |= __SHIFTIN((qintr_idx 6391 | IVAR_VALID), 6392 IVAR_RX_MASK_Q_82576(qid)); 6393 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid), 6394 ivar); 6395 } 6396 break; 6397 default: 6398 break; 6399 } 6400 6401 /* Link status */ 6402 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID), 6403 IVAR_MISC_OTHER); 6404 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar); 6405 } 6406 6407 if (wm_is_using_multiqueue(sc)) { 6408 wm_init_rss(sc); 6409 6410 /* 6411 ** NOTE: Receive Full-Packet Checksum Offload 6412 ** is mutually exclusive with Multiqueue. However 6413 ** this is not the same as TCP/IP checksums which 6414 ** still work. 6415 */ 6416 reg = CSR_READ(sc, WMREG_RXCSUM); 6417 reg |= RXCSUM_PCSD; 6418 CSR_WRITE(sc, WMREG_RXCSUM, reg); 6419 } 6420 } 6421 6422 /* Set up the interrupt registers. */ 6423 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 6424 6425 /* Enable SFP module insertion interrupt if it's required */ 6426 if ((sc->sc_flags & WM_F_SFP) != 0) { 6427 sc->sc_ctrl |= CTRL_EXTLINK_EN; 6428 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 6429 sfp_mask = ICR_GPI(0); 6430 } 6431 6432 if (wm_is_using_msix(sc)) { 6433 uint32_t mask; 6434 struct wm_queue *wmq; 6435 6436 switch (sc->sc_type) { 6437 case WM_T_82574: 6438 mask = 0; 6439 for (i = 0; i < sc->sc_nqueues; i++) { 6440 wmq = &sc->sc_queue[i]; 6441 mask |= ICR_TXQ(wmq->wmq_id); 6442 mask |= ICR_RXQ(wmq->wmq_id); 6443 } 6444 mask |= ICR_OTHER; 6445 CSR_WRITE(sc, WMREG_EIAC_82574, mask); 6446 CSR_WRITE(sc, WMREG_IMS, mask | ICR_LSC); 6447 break; 6448 default: 6449 if (sc->sc_type == WM_T_82575) { 6450 mask = 0; 6451 for (i = 0; i < sc->sc_nqueues; i++) { 6452 wmq = &sc->sc_queue[i]; 6453 mask |= EITR_TX_QUEUE(wmq->wmq_id); 6454 mask |= EITR_RX_QUEUE(wmq->wmq_id); 6455 } 6456 mask |= EITR_OTHER; 6457 } else { 6458 mask = 0; 6459 for (i = 0; i < sc->sc_nqueues; i++) { 6460 wmq = &sc->sc_queue[i]; 6461 mask |= 1 << wmq->wmq_intr_idx; 6462 } 6463 mask |= 1 << sc->sc_link_intr_idx; 6464 } 6465 CSR_WRITE(sc, WMREG_EIAC, mask); 6466 CSR_WRITE(sc, WMREG_EIAM, mask); 6467 CSR_WRITE(sc, WMREG_EIMS, mask); 6468 6469 /* For other interrupts */ 6470 CSR_WRITE(sc, WMREG_IMS, ICR_LSC | sfp_mask); 6471 break; 6472 } 6473 } else { 6474 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 | 6475 ICR_RXO | ICR_RXT0 | sfp_mask; 6476 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr); 6477 } 6478 6479 /* Set up the inter-packet gap. */ 6480 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg); 6481 6482 if (sc->sc_type >= WM_T_82543) { 6483 for (int qidx = 0; qidx < sc->sc_nqueues; qidx++) { 6484 struct wm_queue *wmq = &sc->sc_queue[qidx]; 6485 wm_itrs_writereg(sc, wmq); 6486 } 6487 /* 6488 * Link interrupts occur much less than TX 6489 * interrupts and RX interrupts. So, we don't 6490 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like 6491 * FreeBSD's if_igb. 6492 */ 6493 } 6494 6495 /* Set the VLAN ethernetype. */ 6496 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN); 6497 6498 /* 6499 * Set up the transmit control register; we start out with 6500 * a collision distance suitable for FDX, but update it whe 6501 * we resolve the media type. 6502 */ 6503 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC 6504 | TCTL_CT(TX_COLLISION_THRESHOLD) 6505 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 6506 if (sc->sc_type >= WM_T_82571) 6507 sc->sc_tctl |= TCTL_MULR; 6508 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 6509 6510 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 6511 /* Write TDT after TCTL.EN is set. See the document. */ 6512 CSR_WRITE(sc, WMREG_TDT(0), 0); 6513 } 6514 6515 if (sc->sc_type == WM_T_80003) { 6516 reg = CSR_READ(sc, WMREG_TCTL_EXT); 6517 reg &= ~TCTL_EXT_GCEX_MASK; 6518 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; 6519 CSR_WRITE(sc, WMREG_TCTL_EXT, reg); 6520 } 6521 6522 /* Set the media. */ 6523 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0) 6524 goto out; 6525 6526 /* Configure for OS presence */ 6527 wm_init_manageability(sc); 6528 6529 /* 6530 * Set up the receive control register; we actually program the 6531 * register when we set the receive filter. Use multicast address 6532 * offset type 0. 6533 * 6534 * Only the i82544 has the ability to strip the incoming CRC, so we 6535 * don't enable that feature. 6536 */ 6537 sc->sc_mchash_type = 0; 6538 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF 6539 | __SHIFTIN(sc->sc_mchash_type, RCTL_MO); 6540 6541 /* 82574 use one buffer extended Rx descriptor. */ 6542 if (sc->sc_type == WM_T_82574) 6543 sc->sc_rctl |= RCTL_DTYP_ONEBUF; 6544 6545 if ((sc->sc_flags & WM_F_CRC_STRIP) != 0) 6546 sc->sc_rctl |= RCTL_SECRC; 6547 6548 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0) 6549 && (ifp->if_mtu > ETHERMTU)) { 6550 sc->sc_rctl |= RCTL_LPE; 6551 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 6552 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO); 6553 } 6554 6555 if (MCLBYTES == 2048) 6556 sc->sc_rctl |= RCTL_2k; 6557 else { 6558 if (sc->sc_type >= WM_T_82543) { 6559 switch (MCLBYTES) { 6560 case 4096: 6561 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k; 6562 break; 6563 case 8192: 6564 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k; 6565 break; 6566 case 16384: 6567 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k; 6568 break; 6569 default: 6570 panic("wm_init: MCLBYTES %d unsupported", 6571 MCLBYTES); 6572 break; 6573 } 6574 } else 6575 panic("wm_init: i82542 requires MCLBYTES = 2048"); 6576 } 6577 6578 /* Enable ECC */ 6579 switch (sc->sc_type) { 6580 case WM_T_82571: 6581 reg = CSR_READ(sc, WMREG_PBA_ECC); 6582 reg |= PBA_ECC_CORR_EN; 6583 CSR_WRITE(sc, WMREG_PBA_ECC, reg); 6584 break; 6585 case WM_T_PCH_LPT: 6586 case WM_T_PCH_SPT: 6587 case WM_T_PCH_CNP: 6588 reg = CSR_READ(sc, WMREG_PBECCSTS); 6589 reg |= PBECCSTS_UNCORR_ECC_ENABLE; 6590 CSR_WRITE(sc, WMREG_PBECCSTS, reg); 6591 6592 sc->sc_ctrl |= CTRL_MEHE; 6593 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 6594 break; 6595 default: 6596 break; 6597 } 6598 6599 /* 6600 * Set the receive filter. 6601 * 6602 * For 82575 and 82576, the RX descriptors must be initialized after 6603 * the setting of RCTL.EN in wm_set_filter() 6604 */ 6605 wm_set_filter(sc); 6606 6607 /* On 575 and later set RDT only if RX enabled */ 6608 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 6609 int qidx; 6610 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { 6611 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq; 6612 for (i = 0; i < WM_NRXDESC; i++) { 6613 mutex_enter(rxq->rxq_lock); 6614 wm_init_rxdesc(rxq, i); 6615 mutex_exit(rxq->rxq_lock); 6616 6617 } 6618 } 6619 } 6620 6621 wm_unset_stopping_flags(sc); 6622 6623 /* Start the one second link check clock. */ 6624 callout_schedule(&sc->sc_tick_ch, hz); 6625 6626 /* ...all done! */ 6627 ifp->if_flags |= IFF_RUNNING; 6628 6629 out: 6630 /* Save last flags for the callback */ 6631 sc->sc_if_flags = ifp->if_flags; 6632 sc->sc_ec_capenable = ec->ec_capenable; 6633 if (error) 6634 log(LOG_ERR, "%s: interface not running\n", 6635 device_xname(sc->sc_dev)); 6636 return error; 6637 } 6638 6639 /* 6640 * wm_stop: [ifnet interface function] 6641 * 6642 * Stop transmission on the interface. 6643 */ 6644 static void 6645 wm_stop(struct ifnet *ifp, int disable) 6646 { 6647 struct wm_softc *sc = ifp->if_softc; 6648 6649 ASSERT_SLEEPABLE(); 6650 6651 WM_CORE_LOCK(sc); 6652 wm_stop_locked(ifp, disable ? true : false, true); 6653 WM_CORE_UNLOCK(sc); 6654 6655 /* 6656 * After wm_set_stopping_flags(), it is guaranteed 6657 * wm_handle_queue_work() does not call workqueue_enqueue(). 6658 * However, workqueue_wait() cannot call in wm_stop_locked() 6659 * because it can sleep... 6660 * so, call workqueue_wait() here. 6661 */ 6662 for (int i = 0; i < sc->sc_nqueues; i++) 6663 workqueue_wait(sc->sc_queue_wq, &sc->sc_queue[i].wmq_cookie); 6664 } 6665 6666 static void 6667 wm_stop_locked(struct ifnet *ifp, bool disable, bool wait) 6668 { 6669 struct wm_softc *sc = ifp->if_softc; 6670 struct wm_txsoft *txs; 6671 int i, qidx; 6672 6673 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 6674 device_xname(sc->sc_dev), __func__)); 6675 KASSERT(WM_CORE_LOCKED(sc)); 6676 6677 wm_set_stopping_flags(sc); 6678 6679 if (sc->sc_flags & WM_F_HAS_MII) { 6680 /* Down the MII. */ 6681 mii_down(&sc->sc_mii); 6682 } else { 6683 #if 0 6684 /* Should we clear PHY's status properly? */ 6685 wm_reset(sc); 6686 #endif 6687 } 6688 6689 /* Stop the transmit and receive processes. */ 6690 CSR_WRITE(sc, WMREG_TCTL, 0); 6691 CSR_WRITE(sc, WMREG_RCTL, 0); 6692 sc->sc_rctl &= ~RCTL_EN; 6693 6694 /* 6695 * Clear the interrupt mask to ensure the device cannot assert its 6696 * interrupt line. 6697 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to 6698 * service any currently pending or shared interrupt. 6699 */ 6700 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 6701 sc->sc_icr = 0; 6702 if (wm_is_using_msix(sc)) { 6703 if (sc->sc_type != WM_T_82574) { 6704 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 6705 CSR_WRITE(sc, WMREG_EIAC, 0); 6706 } else 6707 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 6708 } 6709 6710 /* 6711 * Stop callouts after interrupts are disabled; if we have 6712 * to wait for them, we will be releasing the CORE_LOCK 6713 * briefly, which will unblock interrupts on the current CPU. 6714 */ 6715 6716 /* Stop the one second clock. */ 6717 if (wait) 6718 callout_halt(&sc->sc_tick_ch, sc->sc_core_lock); 6719 else 6720 callout_stop(&sc->sc_tick_ch); 6721 6722 /* Stop the 82547 Tx FIFO stall check timer. */ 6723 if (sc->sc_type == WM_T_82547) { 6724 if (wait) 6725 callout_halt(&sc->sc_txfifo_ch, sc->sc_core_lock); 6726 else 6727 callout_stop(&sc->sc_txfifo_ch); 6728 } 6729 6730 /* Release any queued transmit buffers. */ 6731 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { 6732 struct wm_queue *wmq = &sc->sc_queue[qidx]; 6733 struct wm_txqueue *txq = &wmq->wmq_txq; 6734 struct mbuf *m; 6735 6736 mutex_enter(txq->txq_lock); 6737 txq->txq_sending = false; /* Ensure watchdog disabled */ 6738 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 6739 txs = &txq->txq_soft[i]; 6740 if (txs->txs_mbuf != NULL) { 6741 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap); 6742 m_freem(txs->txs_mbuf); 6743 txs->txs_mbuf = NULL; 6744 } 6745 } 6746 /* Drain txq_interq */ 6747 while ((m = pcq_get(txq->txq_interq)) != NULL) 6748 m_freem(m); 6749 mutex_exit(txq->txq_lock); 6750 } 6751 6752 /* Mark the interface as down and cancel the watchdog timer. */ 6753 ifp->if_flags &= ~IFF_RUNNING; 6754 6755 if (disable) { 6756 for (i = 0; i < sc->sc_nqueues; i++) { 6757 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 6758 mutex_enter(rxq->rxq_lock); 6759 wm_rxdrain(rxq); 6760 mutex_exit(rxq->rxq_lock); 6761 } 6762 } 6763 6764 #if 0 /* notyet */ 6765 if (sc->sc_type >= WM_T_82544) 6766 CSR_WRITE(sc, WMREG_WUC, 0); 6767 #endif 6768 } 6769 6770 static void 6771 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0) 6772 { 6773 struct mbuf *m; 6774 int i; 6775 6776 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev)); 6777 for (m = m0, i = 0; m != NULL; m = m->m_next, i++) 6778 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, " 6779 "m_flags = 0x%08x\n", device_xname(sc->sc_dev), 6780 m->m_data, m->m_len, m->m_flags); 6781 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev), 6782 i, i == 1 ? "" : "s"); 6783 } 6784 6785 /* 6786 * wm_82547_txfifo_stall: 6787 * 6788 * Callout used to wait for the 82547 Tx FIFO to drain, 6789 * reset the FIFO pointers, and restart packet transmission. 6790 */ 6791 static void 6792 wm_82547_txfifo_stall(void *arg) 6793 { 6794 struct wm_softc *sc = arg; 6795 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 6796 6797 mutex_enter(txq->txq_lock); 6798 6799 if (txq->txq_stopping) 6800 goto out; 6801 6802 if (txq->txq_fifo_stall) { 6803 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) && 6804 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) && 6805 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) { 6806 /* 6807 * Packets have drained. Stop transmitter, reset 6808 * FIFO pointers, restart transmitter, and kick 6809 * the packet queue. 6810 */ 6811 uint32_t tctl = CSR_READ(sc, WMREG_TCTL); 6812 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN); 6813 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr); 6814 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr); 6815 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr); 6816 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr); 6817 CSR_WRITE(sc, WMREG_TCTL, tctl); 6818 CSR_WRITE_FLUSH(sc); 6819 6820 txq->txq_fifo_head = 0; 6821 txq->txq_fifo_stall = 0; 6822 wm_start_locked(&sc->sc_ethercom.ec_if); 6823 } else { 6824 /* 6825 * Still waiting for packets to drain; try again in 6826 * another tick. 6827 */ 6828 callout_schedule(&sc->sc_txfifo_ch, 1); 6829 } 6830 } 6831 6832 out: 6833 mutex_exit(txq->txq_lock); 6834 } 6835 6836 /* 6837 * wm_82547_txfifo_bugchk: 6838 * 6839 * Check for bug condition in the 82547 Tx FIFO. We need to 6840 * prevent enqueueing a packet that would wrap around the end 6841 * if the Tx FIFO ring buffer, otherwise the chip will croak. 6842 * 6843 * We do this by checking the amount of space before the end 6844 * of the Tx FIFO buffer. If the packet will not fit, we "stall" 6845 * the Tx FIFO, wait for all remaining packets to drain, reset 6846 * the internal FIFO pointers to the beginning, and restart 6847 * transmission on the interface. 6848 */ 6849 #define WM_FIFO_HDR 0x10 6850 #define WM_82547_PAD_LEN 0x3e0 6851 static int 6852 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0) 6853 { 6854 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 6855 int space = txq->txq_fifo_size - txq->txq_fifo_head; 6856 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR); 6857 6858 /* Just return if already stalled. */ 6859 if (txq->txq_fifo_stall) 6860 return 1; 6861 6862 if (sc->sc_mii.mii_media_active & IFM_FDX) { 6863 /* Stall only occurs in half-duplex mode. */ 6864 goto send_packet; 6865 } 6866 6867 if (len >= WM_82547_PAD_LEN + space) { 6868 txq->txq_fifo_stall = 1; 6869 callout_schedule(&sc->sc_txfifo_ch, 1); 6870 return 1; 6871 } 6872 6873 send_packet: 6874 txq->txq_fifo_head += len; 6875 if (txq->txq_fifo_head >= txq->txq_fifo_size) 6876 txq->txq_fifo_head -= txq->txq_fifo_size; 6877 6878 return 0; 6879 } 6880 6881 static int 6882 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq) 6883 { 6884 int error; 6885 6886 /* 6887 * Allocate the control data structures, and create and load the 6888 * DMA map for it. 6889 * 6890 * NOTE: All Tx descriptors must be in the same 4G segment of 6891 * memory. So must Rx descriptors. We simplify by allocating 6892 * both sets within the same 4G segment. 6893 */ 6894 if (sc->sc_type < WM_T_82544) 6895 WM_NTXDESC(txq) = WM_NTXDESC_82542; 6896 else 6897 WM_NTXDESC(txq) = WM_NTXDESC_82544; 6898 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 6899 txq->txq_descsize = sizeof(nq_txdesc_t); 6900 else 6901 txq->txq_descsize = sizeof(wiseman_txdesc_t); 6902 6903 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 6904 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg, 6905 1, &txq->txq_desc_rseg, 0)) != 0) { 6906 aprint_error_dev(sc->sc_dev, 6907 "unable to allocate TX control data, error = %d\n", 6908 error); 6909 goto fail_0; 6910 } 6911 6912 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg, 6913 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq), 6914 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) { 6915 aprint_error_dev(sc->sc_dev, 6916 "unable to map TX control data, error = %d\n", error); 6917 goto fail_1; 6918 } 6919 6920 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1, 6921 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) { 6922 aprint_error_dev(sc->sc_dev, 6923 "unable to create TX control data DMA map, error = %d\n", 6924 error); 6925 goto fail_2; 6926 } 6927 6928 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap, 6929 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) { 6930 aprint_error_dev(sc->sc_dev, 6931 "unable to load TX control data DMA map, error = %d\n", 6932 error); 6933 goto fail_3; 6934 } 6935 6936 return 0; 6937 6938 fail_3: 6939 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap); 6940 fail_2: 6941 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u, 6942 WM_TXDESCS_SIZE(txq)); 6943 fail_1: 6944 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg); 6945 fail_0: 6946 return error; 6947 } 6948 6949 static void 6950 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq) 6951 { 6952 6953 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap); 6954 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap); 6955 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u, 6956 WM_TXDESCS_SIZE(txq)); 6957 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg); 6958 } 6959 6960 static int 6961 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq) 6962 { 6963 int error; 6964 size_t rxq_descs_size; 6965 6966 /* 6967 * Allocate the control data structures, and create and load the 6968 * DMA map for it. 6969 * 6970 * NOTE: All Tx descriptors must be in the same 4G segment of 6971 * memory. So must Rx descriptors. We simplify by allocating 6972 * both sets within the same 4G segment. 6973 */ 6974 rxq->rxq_ndesc = WM_NRXDESC; 6975 if (sc->sc_type == WM_T_82574) 6976 rxq->rxq_descsize = sizeof(ext_rxdesc_t); 6977 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 6978 rxq->rxq_descsize = sizeof(nq_rxdesc_t); 6979 else 6980 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t); 6981 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc; 6982 6983 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size, 6984 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg, 6985 1, &rxq->rxq_desc_rseg, 0)) != 0) { 6986 aprint_error_dev(sc->sc_dev, 6987 "unable to allocate RX control data, error = %d\n", 6988 error); 6989 goto fail_0; 6990 } 6991 6992 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg, 6993 rxq->rxq_desc_rseg, rxq_descs_size, 6994 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) { 6995 aprint_error_dev(sc->sc_dev, 6996 "unable to map RX control data, error = %d\n", error); 6997 goto fail_1; 6998 } 6999 7000 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1, 7001 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) { 7002 aprint_error_dev(sc->sc_dev, 7003 "unable to create RX control data DMA map, error = %d\n", 7004 error); 7005 goto fail_2; 7006 } 7007 7008 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap, 7009 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) { 7010 aprint_error_dev(sc->sc_dev, 7011 "unable to load RX control data DMA map, error = %d\n", 7012 error); 7013 goto fail_3; 7014 } 7015 7016 return 0; 7017 7018 fail_3: 7019 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap); 7020 fail_2: 7021 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u, 7022 rxq_descs_size); 7023 fail_1: 7024 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg); 7025 fail_0: 7026 return error; 7027 } 7028 7029 static void 7030 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq) 7031 { 7032 7033 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap); 7034 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap); 7035 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u, 7036 rxq->rxq_descsize * rxq->rxq_ndesc); 7037 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg); 7038 } 7039 7040 7041 static int 7042 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq) 7043 { 7044 int i, error; 7045 7046 /* Create the transmit buffer DMA maps. */ 7047 WM_TXQUEUELEN(txq) = 7048 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ? 7049 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX; 7050 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7051 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA, 7052 WM_NTXSEGS, WTX_MAX_LEN, 0, 0, 7053 &txq->txq_soft[i].txs_dmamap)) != 0) { 7054 aprint_error_dev(sc->sc_dev, 7055 "unable to create Tx DMA map %d, error = %d\n", 7056 i, error); 7057 goto fail; 7058 } 7059 } 7060 7061 return 0; 7062 7063 fail: 7064 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7065 if (txq->txq_soft[i].txs_dmamap != NULL) 7066 bus_dmamap_destroy(sc->sc_dmat, 7067 txq->txq_soft[i].txs_dmamap); 7068 } 7069 return error; 7070 } 7071 7072 static void 7073 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq) 7074 { 7075 int i; 7076 7077 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7078 if (txq->txq_soft[i].txs_dmamap != NULL) 7079 bus_dmamap_destroy(sc->sc_dmat, 7080 txq->txq_soft[i].txs_dmamap); 7081 } 7082 } 7083 7084 static int 7085 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 7086 { 7087 int i, error; 7088 7089 /* Create the receive buffer DMA maps. */ 7090 for (i = 0; i < rxq->rxq_ndesc; i++) { 7091 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 7092 MCLBYTES, 0, 0, 7093 &rxq->rxq_soft[i].rxs_dmamap)) != 0) { 7094 aprint_error_dev(sc->sc_dev, 7095 "unable to create Rx DMA map %d error = %d\n", 7096 i, error); 7097 goto fail; 7098 } 7099 rxq->rxq_soft[i].rxs_mbuf = NULL; 7100 } 7101 7102 return 0; 7103 7104 fail: 7105 for (i = 0; i < rxq->rxq_ndesc; i++) { 7106 if (rxq->rxq_soft[i].rxs_dmamap != NULL) 7107 bus_dmamap_destroy(sc->sc_dmat, 7108 rxq->rxq_soft[i].rxs_dmamap); 7109 } 7110 return error; 7111 } 7112 7113 static void 7114 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 7115 { 7116 int i; 7117 7118 for (i = 0; i < rxq->rxq_ndesc; i++) { 7119 if (rxq->rxq_soft[i].rxs_dmamap != NULL) 7120 bus_dmamap_destroy(sc->sc_dmat, 7121 rxq->rxq_soft[i].rxs_dmamap); 7122 } 7123 } 7124 7125 /* 7126 * wm_alloc_quques: 7127 * Allocate {tx,rx}descs and {tx,rx} buffers 7128 */ 7129 static int 7130 wm_alloc_txrx_queues(struct wm_softc *sc) 7131 { 7132 int i, error, tx_done, rx_done; 7133 7134 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues, 7135 KM_SLEEP); 7136 if (sc->sc_queue == NULL) { 7137 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n"); 7138 error = ENOMEM; 7139 goto fail_0; 7140 } 7141 7142 /* For transmission */ 7143 error = 0; 7144 tx_done = 0; 7145 for (i = 0; i < sc->sc_nqueues; i++) { 7146 #ifdef WM_EVENT_COUNTERS 7147 int j; 7148 const char *xname; 7149 #endif 7150 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 7151 txq->txq_sc = sc; 7152 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 7153 7154 error = wm_alloc_tx_descs(sc, txq); 7155 if (error) 7156 break; 7157 error = wm_alloc_tx_buffer(sc, txq); 7158 if (error) { 7159 wm_free_tx_descs(sc, txq); 7160 break; 7161 } 7162 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP); 7163 if (txq->txq_interq == NULL) { 7164 wm_free_tx_descs(sc, txq); 7165 wm_free_tx_buffer(sc, txq); 7166 error = ENOMEM; 7167 break; 7168 } 7169 7170 #ifdef WM_EVENT_COUNTERS 7171 xname = device_xname(sc->sc_dev); 7172 7173 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname); 7174 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname); 7175 WM_Q_MISC_EVCNT_ATTACH(txq, fifo_stall, txq, i, xname); 7176 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname); 7177 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname); 7178 WM_Q_MISC_EVCNT_ATTACH(txq, ipsum, txq, i, xname); 7179 WM_Q_MISC_EVCNT_ATTACH(txq, tusum, txq, i, xname); 7180 WM_Q_MISC_EVCNT_ATTACH(txq, tusum6, txq, i, xname); 7181 WM_Q_MISC_EVCNT_ATTACH(txq, tso, txq, i, xname); 7182 WM_Q_MISC_EVCNT_ATTACH(txq, tso6, txq, i, xname); 7183 WM_Q_MISC_EVCNT_ATTACH(txq, tsopain, txq, i, xname); 7184 7185 for (j = 0; j < WM_NTXSEGS; j++) { 7186 snprintf(txq->txq_txseg_evcnt_names[j], 7187 sizeof(txq->txq_txseg_evcnt_names[j]), "txq%02dtxseg%d", i, j); 7188 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], EVCNT_TYPE_MISC, 7189 NULL, xname, txq->txq_txseg_evcnt_names[j]); 7190 } 7191 7192 WM_Q_MISC_EVCNT_ATTACH(txq, pcqdrop, txq, i, xname); 7193 WM_Q_MISC_EVCNT_ATTACH(txq, descdrop, txq, i, xname); 7194 WM_Q_MISC_EVCNT_ATTACH(txq, toomanyseg, txq, i, xname); 7195 WM_Q_MISC_EVCNT_ATTACH(txq, defrag, txq, i, xname); 7196 WM_Q_MISC_EVCNT_ATTACH(txq, underrun, txq, i, xname); 7197 WM_Q_MISC_EVCNT_ATTACH(txq, skipcontext, txq, i, xname); 7198 #endif /* WM_EVENT_COUNTERS */ 7199 7200 tx_done++; 7201 } 7202 if (error) 7203 goto fail_1; 7204 7205 /* For receive */ 7206 error = 0; 7207 rx_done = 0; 7208 for (i = 0; i < sc->sc_nqueues; i++) { 7209 #ifdef WM_EVENT_COUNTERS 7210 const char *xname; 7211 #endif 7212 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 7213 rxq->rxq_sc = sc; 7214 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 7215 7216 error = wm_alloc_rx_descs(sc, rxq); 7217 if (error) 7218 break; 7219 7220 error = wm_alloc_rx_buffer(sc, rxq); 7221 if (error) { 7222 wm_free_rx_descs(sc, rxq); 7223 break; 7224 } 7225 7226 #ifdef WM_EVENT_COUNTERS 7227 xname = device_xname(sc->sc_dev); 7228 7229 WM_Q_INTR_EVCNT_ATTACH(rxq, intr, rxq, i, xname); 7230 WM_Q_INTR_EVCNT_ATTACH(rxq, defer, rxq, i, xname); 7231 7232 WM_Q_MISC_EVCNT_ATTACH(rxq, ipsum, rxq, i, xname); 7233 WM_Q_MISC_EVCNT_ATTACH(rxq, tusum, rxq, i, xname); 7234 #endif /* WM_EVENT_COUNTERS */ 7235 7236 rx_done++; 7237 } 7238 if (error) 7239 goto fail_2; 7240 7241 return 0; 7242 7243 fail_2: 7244 for (i = 0; i < rx_done; i++) { 7245 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 7246 wm_free_rx_buffer(sc, rxq); 7247 wm_free_rx_descs(sc, rxq); 7248 if (rxq->rxq_lock) 7249 mutex_obj_free(rxq->rxq_lock); 7250 } 7251 fail_1: 7252 for (i = 0; i < tx_done; i++) { 7253 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 7254 pcq_destroy(txq->txq_interq); 7255 wm_free_tx_buffer(sc, txq); 7256 wm_free_tx_descs(sc, txq); 7257 if (txq->txq_lock) 7258 mutex_obj_free(txq->txq_lock); 7259 } 7260 7261 kmem_free(sc->sc_queue, 7262 sizeof(struct wm_queue) * sc->sc_nqueues); 7263 fail_0: 7264 return error; 7265 } 7266 7267 /* 7268 * wm_free_quques: 7269 * Free {tx,rx}descs and {tx,rx} buffers 7270 */ 7271 static void 7272 wm_free_txrx_queues(struct wm_softc *sc) 7273 { 7274 int i; 7275 7276 for (i = 0; i < sc->sc_nqueues; i++) { 7277 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 7278 7279 #ifdef WM_EVENT_COUNTERS 7280 WM_Q_EVCNT_DETACH(rxq, intr, rxq, i); 7281 WM_Q_EVCNT_DETACH(rxq, defer, rxq, i); 7282 WM_Q_EVCNT_DETACH(rxq, ipsum, rxq, i); 7283 WM_Q_EVCNT_DETACH(rxq, tusum, rxq, i); 7284 #endif /* WM_EVENT_COUNTERS */ 7285 7286 wm_free_rx_buffer(sc, rxq); 7287 wm_free_rx_descs(sc, rxq); 7288 if (rxq->rxq_lock) 7289 mutex_obj_free(rxq->rxq_lock); 7290 } 7291 7292 for (i = 0; i < sc->sc_nqueues; i++) { 7293 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 7294 struct mbuf *m; 7295 #ifdef WM_EVENT_COUNTERS 7296 int j; 7297 7298 WM_Q_EVCNT_DETACH(txq, txsstall, txq, i); 7299 WM_Q_EVCNT_DETACH(txq, txdstall, txq, i); 7300 WM_Q_EVCNT_DETACH(txq, fifo_stall, txq, i); 7301 WM_Q_EVCNT_DETACH(txq, txdw, txq, i); 7302 WM_Q_EVCNT_DETACH(txq, txqe, txq, i); 7303 WM_Q_EVCNT_DETACH(txq, ipsum, txq, i); 7304 WM_Q_EVCNT_DETACH(txq, tusum, txq, i); 7305 WM_Q_EVCNT_DETACH(txq, tusum6, txq, i); 7306 WM_Q_EVCNT_DETACH(txq, tso, txq, i); 7307 WM_Q_EVCNT_DETACH(txq, tso6, txq, i); 7308 WM_Q_EVCNT_DETACH(txq, tsopain, txq, i); 7309 7310 for (j = 0; j < WM_NTXSEGS; j++) 7311 evcnt_detach(&txq->txq_ev_txseg[j]); 7312 7313 WM_Q_EVCNT_DETACH(txq, pcqdrop, txq, i); 7314 WM_Q_EVCNT_DETACH(txq, descdrop, txq, i); 7315 WM_Q_EVCNT_DETACH(txq, toomanyseg, txq, i); 7316 WM_Q_EVCNT_DETACH(txq, defrag, txq, i); 7317 WM_Q_EVCNT_DETACH(txq, underrun, txq, i); 7318 WM_Q_EVCNT_DETACH(txq, skipcontext, txq, i); 7319 #endif /* WM_EVENT_COUNTERS */ 7320 7321 /* Drain txq_interq */ 7322 while ((m = pcq_get(txq->txq_interq)) != NULL) 7323 m_freem(m); 7324 pcq_destroy(txq->txq_interq); 7325 7326 wm_free_tx_buffer(sc, txq); 7327 wm_free_tx_descs(sc, txq); 7328 if (txq->txq_lock) 7329 mutex_obj_free(txq->txq_lock); 7330 } 7331 7332 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues); 7333 } 7334 7335 static void 7336 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq) 7337 { 7338 7339 KASSERT(mutex_owned(txq->txq_lock)); 7340 7341 /* Initialize the transmit descriptor ring. */ 7342 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq)); 7343 wm_cdtxsync(txq, 0, WM_NTXDESC(txq), 7344 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 7345 txq->txq_free = WM_NTXDESC(txq); 7346 txq->txq_next = 0; 7347 } 7348 7349 static void 7350 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq, 7351 struct wm_txqueue *txq) 7352 { 7353 7354 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 7355 device_xname(sc->sc_dev), __func__)); 7356 KASSERT(mutex_owned(txq->txq_lock)); 7357 7358 if (sc->sc_type < WM_T_82543) { 7359 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0)); 7360 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0)); 7361 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq)); 7362 CSR_WRITE(sc, WMREG_OLD_TDH, 0); 7363 CSR_WRITE(sc, WMREG_OLD_TDT, 0); 7364 CSR_WRITE(sc, WMREG_OLD_TIDV, 128); 7365 } else { 7366 int qid = wmq->wmq_id; 7367 7368 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0)); 7369 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0)); 7370 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq)); 7371 CSR_WRITE(sc, WMREG_TDH(qid), 0); 7372 7373 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 7374 /* 7375 * Don't write TDT before TCTL.EN is set. 7376 * See the document. 7377 */ 7378 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE 7379 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0) 7380 | TXDCTL_WTHRESH(0)); 7381 else { 7382 /* XXX should update with AIM? */ 7383 CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4); 7384 if (sc->sc_type >= WM_T_82540) { 7385 /* Should be the same */ 7386 CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4); 7387 } 7388 7389 CSR_WRITE(sc, WMREG_TDT(qid), 0); 7390 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) | 7391 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0)); 7392 } 7393 } 7394 } 7395 7396 static void 7397 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq) 7398 { 7399 int i; 7400 7401 KASSERT(mutex_owned(txq->txq_lock)); 7402 7403 /* Initialize the transmit job descriptors. */ 7404 for (i = 0; i < WM_TXQUEUELEN(txq); i++) 7405 txq->txq_soft[i].txs_mbuf = NULL; 7406 txq->txq_sfree = WM_TXQUEUELEN(txq); 7407 txq->txq_snext = 0; 7408 txq->txq_sdirty = 0; 7409 } 7410 7411 static void 7412 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq, 7413 struct wm_txqueue *txq) 7414 { 7415 7416 KASSERT(mutex_owned(txq->txq_lock)); 7417 7418 /* 7419 * Set up some register offsets that are different between 7420 * the i82542 and the i82543 and later chips. 7421 */ 7422 if (sc->sc_type < WM_T_82543) 7423 txq->txq_tdt_reg = WMREG_OLD_TDT; 7424 else 7425 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id); 7426 7427 wm_init_tx_descs(sc, txq); 7428 wm_init_tx_regs(sc, wmq, txq); 7429 wm_init_tx_buffer(sc, txq); 7430 7431 txq->txq_flags = 0; /* Clear WM_TXQ_NO_SPACE */ 7432 txq->txq_sending = false; 7433 } 7434 7435 static void 7436 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq, 7437 struct wm_rxqueue *rxq) 7438 { 7439 7440 KASSERT(mutex_owned(rxq->rxq_lock)); 7441 7442 /* 7443 * Initialize the receive descriptor and receive job 7444 * descriptor rings. 7445 */ 7446 if (sc->sc_type < WM_T_82543) { 7447 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0)); 7448 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0)); 7449 CSR_WRITE(sc, WMREG_OLD_RDLEN0, 7450 rxq->rxq_descsize * rxq->rxq_ndesc); 7451 CSR_WRITE(sc, WMREG_OLD_RDH0, 0); 7452 CSR_WRITE(sc, WMREG_OLD_RDT0, 0); 7453 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD); 7454 7455 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0); 7456 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0); 7457 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0); 7458 CSR_WRITE(sc, WMREG_OLD_RDH1, 0); 7459 CSR_WRITE(sc, WMREG_OLD_RDT1, 0); 7460 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0); 7461 } else { 7462 int qid = wmq->wmq_id; 7463 7464 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0)); 7465 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0)); 7466 CSR_WRITE(sc, WMREG_RDLEN(qid), 7467 rxq->rxq_descsize * rxq->rxq_ndesc); 7468 7469 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 7470 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1)) 7471 panic("%s: MCLBYTES %d unsupported for 82575 or higher\n", __func__, MCLBYTES); 7472 7473 /* Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF only. */ 7474 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_ADV_ONEBUF 7475 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT)); 7476 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE 7477 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8) 7478 | RXDCTL_WTHRESH(1)); 7479 CSR_WRITE(sc, WMREG_RDH(qid), 0); 7480 CSR_WRITE(sc, WMREG_RDT(qid), 0); 7481 } else { 7482 CSR_WRITE(sc, WMREG_RDH(qid), 0); 7483 CSR_WRITE(sc, WMREG_RDT(qid), 0); 7484 /* XXX should update with AIM? */ 7485 CSR_WRITE(sc, WMREG_RDTR, 7486 (wmq->wmq_itr / 4) | RDTR_FPD); 7487 /* MUST be same */ 7488 CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4); 7489 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) | 7490 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1)); 7491 } 7492 } 7493 } 7494 7495 static int 7496 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 7497 { 7498 struct wm_rxsoft *rxs; 7499 int error, i; 7500 7501 KASSERT(mutex_owned(rxq->rxq_lock)); 7502 7503 for (i = 0; i < rxq->rxq_ndesc; i++) { 7504 rxs = &rxq->rxq_soft[i]; 7505 if (rxs->rxs_mbuf == NULL) { 7506 if ((error = wm_add_rxbuf(rxq, i)) != 0) { 7507 log(LOG_ERR, "%s: unable to allocate or map " 7508 "rx buffer %d, error = %d\n", 7509 device_xname(sc->sc_dev), i, error); 7510 /* 7511 * XXX Should attempt to run with fewer receive 7512 * XXX buffers instead of just failing. 7513 */ 7514 wm_rxdrain(rxq); 7515 return ENOMEM; 7516 } 7517 } else { 7518 /* 7519 * For 82575 and 82576, the RX descriptors must be 7520 * initialized after the setting of RCTL.EN in 7521 * wm_set_filter() 7522 */ 7523 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0) 7524 wm_init_rxdesc(rxq, i); 7525 } 7526 } 7527 rxq->rxq_ptr = 0; 7528 rxq->rxq_discard = 0; 7529 WM_RXCHAIN_RESET(rxq); 7530 7531 return 0; 7532 } 7533 7534 static int 7535 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq, 7536 struct wm_rxqueue *rxq) 7537 { 7538 7539 KASSERT(mutex_owned(rxq->rxq_lock)); 7540 7541 /* 7542 * Set up some register offsets that are different between 7543 * the i82542 and the i82543 and later chips. 7544 */ 7545 if (sc->sc_type < WM_T_82543) 7546 rxq->rxq_rdt_reg = WMREG_OLD_RDT0; 7547 else 7548 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id); 7549 7550 wm_init_rx_regs(sc, wmq, rxq); 7551 return wm_init_rx_buffer(sc, rxq); 7552 } 7553 7554 /* 7555 * wm_init_quques: 7556 * Initialize {tx,rx}descs and {tx,rx} buffers 7557 */ 7558 static int 7559 wm_init_txrx_queues(struct wm_softc *sc) 7560 { 7561 int i, error = 0; 7562 7563 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 7564 device_xname(sc->sc_dev), __func__)); 7565 7566 for (i = 0; i < sc->sc_nqueues; i++) { 7567 struct wm_queue *wmq = &sc->sc_queue[i]; 7568 struct wm_txqueue *txq = &wmq->wmq_txq; 7569 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 7570 7571 /* 7572 * TODO 7573 * Currently, use constant variable instead of AIM. 7574 * Furthermore, the interrupt interval of multiqueue which use 7575 * polling mode is less than default value. 7576 * More tuning and AIM are required. 7577 */ 7578 if (wm_is_using_multiqueue(sc)) 7579 wmq->wmq_itr = 50; 7580 else 7581 wmq->wmq_itr = sc->sc_itr_init; 7582 wmq->wmq_set_itr = true; 7583 7584 mutex_enter(txq->txq_lock); 7585 wm_init_tx_queue(sc, wmq, txq); 7586 mutex_exit(txq->txq_lock); 7587 7588 mutex_enter(rxq->rxq_lock); 7589 error = wm_init_rx_queue(sc, wmq, rxq); 7590 mutex_exit(rxq->rxq_lock); 7591 if (error) 7592 break; 7593 } 7594 7595 return error; 7596 } 7597 7598 /* 7599 * wm_tx_offload: 7600 * 7601 * Set up TCP/IP checksumming parameters for the 7602 * specified packet. 7603 */ 7604 static void 7605 wm_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq, 7606 struct wm_txsoft *txs, uint32_t *cmdp, uint8_t *fieldsp) 7607 { 7608 struct mbuf *m0 = txs->txs_mbuf; 7609 struct livengood_tcpip_ctxdesc *t; 7610 uint32_t ipcs, tucs, cmd, cmdlen, seg; 7611 uint32_t ipcse; 7612 struct ether_header *eh; 7613 int offset, iphl; 7614 uint8_t fields; 7615 7616 /* 7617 * XXX It would be nice if the mbuf pkthdr had offset 7618 * fields for the protocol headers. 7619 */ 7620 7621 eh = mtod(m0, struct ether_header *); 7622 switch (htons(eh->ether_type)) { 7623 case ETHERTYPE_IP: 7624 case ETHERTYPE_IPV6: 7625 offset = ETHER_HDR_LEN; 7626 break; 7627 7628 case ETHERTYPE_VLAN: 7629 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 7630 break; 7631 7632 default: 7633 /* Don't support this protocol or encapsulation. */ 7634 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0; 7635 txq->txq_last_hw_ipcs = 0; 7636 txq->txq_last_hw_tucs = 0; 7637 *fieldsp = 0; 7638 *cmdp = 0; 7639 return; 7640 } 7641 7642 if ((m0->m_pkthdr.csum_flags & 7643 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) { 7644 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data); 7645 } else 7646 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data); 7647 7648 ipcse = offset + iphl - 1; 7649 7650 cmd = WTX_CMD_DEXT | WTX_DTYP_D; 7651 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE; 7652 seg = 0; 7653 fields = 0; 7654 7655 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) { 7656 int hlen = offset + iphl; 7657 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0; 7658 7659 if (__predict_false(m0->m_len < 7660 (hlen + sizeof(struct tcphdr)))) { 7661 /* 7662 * TCP/IP headers are not in the first mbuf; we need 7663 * to do this the slow and painful way. Let's just 7664 * hope this doesn't happen very often. 7665 */ 7666 struct tcphdr th; 7667 7668 WM_Q_EVCNT_INCR(txq, tsopain); 7669 7670 m_copydata(m0, hlen, sizeof(th), &th); 7671 if (v4) { 7672 struct ip ip; 7673 7674 m_copydata(m0, offset, sizeof(ip), &ip); 7675 ip.ip_len = 0; 7676 m_copyback(m0, 7677 offset + offsetof(struct ip, ip_len), 7678 sizeof(ip.ip_len), &ip.ip_len); 7679 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr, 7680 ip.ip_dst.s_addr, htons(IPPROTO_TCP)); 7681 } else { 7682 struct ip6_hdr ip6; 7683 7684 m_copydata(m0, offset, sizeof(ip6), &ip6); 7685 ip6.ip6_plen = 0; 7686 m_copyback(m0, 7687 offset + offsetof(struct ip6_hdr, ip6_plen), 7688 sizeof(ip6.ip6_plen), &ip6.ip6_plen); 7689 th.th_sum = in6_cksum_phdr(&ip6.ip6_src, 7690 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP)); 7691 } 7692 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum), 7693 sizeof(th.th_sum), &th.th_sum); 7694 7695 hlen += th.th_off << 2; 7696 } else { 7697 /* 7698 * TCP/IP headers are in the first mbuf; we can do 7699 * this the easy way. 7700 */ 7701 struct tcphdr *th; 7702 7703 if (v4) { 7704 struct ip *ip = 7705 (void *)(mtod(m0, char *) + offset); 7706 th = (void *)(mtod(m0, char *) + hlen); 7707 7708 ip->ip_len = 0; 7709 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 7710 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 7711 } else { 7712 struct ip6_hdr *ip6 = 7713 (void *)(mtod(m0, char *) + offset); 7714 th = (void *)(mtod(m0, char *) + hlen); 7715 7716 ip6->ip6_plen = 0; 7717 th->th_sum = in6_cksum_phdr(&ip6->ip6_src, 7718 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP)); 7719 } 7720 hlen += th->th_off << 2; 7721 } 7722 7723 if (v4) { 7724 WM_Q_EVCNT_INCR(txq, tso); 7725 cmdlen |= WTX_TCPIP_CMD_IP; 7726 } else { 7727 WM_Q_EVCNT_INCR(txq, tso6); 7728 ipcse = 0; 7729 } 7730 cmd |= WTX_TCPIP_CMD_TSE; 7731 cmdlen |= WTX_TCPIP_CMD_TSE | 7732 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen); 7733 seg = WTX_TCPIP_SEG_HDRLEN(hlen) | 7734 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz); 7735 } 7736 7737 /* 7738 * NOTE: Even if we're not using the IP or TCP/UDP checksum 7739 * offload feature, if we load the context descriptor, we 7740 * MUST provide valid values for IPCSS and TUCSS fields. 7741 */ 7742 7743 ipcs = WTX_TCPIP_IPCSS(offset) | 7744 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) | 7745 WTX_TCPIP_IPCSE(ipcse); 7746 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) { 7747 WM_Q_EVCNT_INCR(txq, ipsum); 7748 fields |= WTX_IXSM; 7749 } 7750 7751 offset += iphl; 7752 7753 if (m0->m_pkthdr.csum_flags & 7754 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) { 7755 WM_Q_EVCNT_INCR(txq, tusum); 7756 fields |= WTX_TXSM; 7757 tucs = WTX_TCPIP_TUCSS(offset) | 7758 WTX_TCPIP_TUCSO(offset + 7759 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) | 7760 WTX_TCPIP_TUCSE(0) /* Rest of packet */; 7761 } else if ((m0->m_pkthdr.csum_flags & 7762 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) { 7763 WM_Q_EVCNT_INCR(txq, tusum6); 7764 fields |= WTX_TXSM; 7765 tucs = WTX_TCPIP_TUCSS(offset) | 7766 WTX_TCPIP_TUCSO(offset + 7767 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) | 7768 WTX_TCPIP_TUCSE(0) /* Rest of packet */; 7769 } else { 7770 /* Just initialize it to a valid TCP context. */ 7771 tucs = WTX_TCPIP_TUCSS(offset) | 7772 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) | 7773 WTX_TCPIP_TUCSE(0) /* Rest of packet */; 7774 } 7775 7776 *cmdp = cmd; 7777 *fieldsp = fields; 7778 7779 /* 7780 * We don't have to write context descriptor for every packet 7781 * except for 82574. For 82574, we must write context descriptor 7782 * for every packet when we use two descriptor queues. 7783 * 7784 * The 82574L can only remember the *last* context used 7785 * regardless of queue that it was use for. We cannot reuse 7786 * contexts on this hardware platform and must generate a new 7787 * context every time. 82574L hardware spec, section 7.2.6, 7788 * second note. 7789 */ 7790 if (sc->sc_nqueues < 2) { 7791 /* 7792 * Setting up new checksum offload context for every 7793 * frames takes a lot of processing time for hardware. 7794 * This also reduces performance a lot for small sized 7795 * frames so avoid it if driver can use previously 7796 * configured checksum offload context. 7797 * For TSO, in theory we can use the same TSO context only if 7798 * frame is the same type(IP/TCP) and the same MSS. However 7799 * checking whether a frame has the same IP/TCP structure is 7800 * hard thing so just ignore that and always restablish a 7801 * new TSO context. 7802 */ 7803 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) 7804 == 0) { 7805 if (txq->txq_last_hw_cmd == cmd && 7806 txq->txq_last_hw_fields == fields && 7807 txq->txq_last_hw_ipcs == (ipcs & 0xffff) && 7808 txq->txq_last_hw_tucs == (tucs & 0xffff)) { 7809 WM_Q_EVCNT_INCR(txq, skipcontext); 7810 return; 7811 } 7812 } 7813 7814 txq->txq_last_hw_cmd = cmd; 7815 txq->txq_last_hw_fields = fields; 7816 txq->txq_last_hw_ipcs = (ipcs & 0xffff); 7817 txq->txq_last_hw_tucs = (tucs & 0xffff); 7818 } 7819 7820 /* Fill in the context descriptor. */ 7821 t = (struct livengood_tcpip_ctxdesc *) 7822 &txq->txq_descs[txq->txq_next]; 7823 t->tcpip_ipcs = htole32(ipcs); 7824 t->tcpip_tucs = htole32(tucs); 7825 t->tcpip_cmdlen = htole32(cmdlen); 7826 t->tcpip_seg = htole32(seg); 7827 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE); 7828 7829 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 7830 txs->txs_ndesc++; 7831 } 7832 7833 static inline int 7834 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m) 7835 { 7836 struct wm_softc *sc = ifp->if_softc; 7837 u_int cpuid = cpu_index(curcpu()); 7838 7839 /* 7840 * Currently, simple distribute strategy. 7841 * TODO: 7842 * distribute by flowid(RSS has value). 7843 */ 7844 return ((cpuid + ncpu - sc->sc_affinity_offset) % ncpu) % sc->sc_nqueues; 7845 } 7846 7847 static inline bool 7848 wm_linkdown_discard(struct wm_txqueue *txq) 7849 { 7850 7851 if ((txq->txq_flags & WM_TXQ_LINKDOWN_DISCARD) != 0) 7852 return true; 7853 7854 return false; 7855 } 7856 7857 /* 7858 * wm_start: [ifnet interface function] 7859 * 7860 * Start packet transmission on the interface. 7861 */ 7862 static void 7863 wm_start(struct ifnet *ifp) 7864 { 7865 struct wm_softc *sc = ifp->if_softc; 7866 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 7867 7868 #ifdef WM_MPSAFE 7869 KASSERT(if_is_mpsafe(ifp)); 7870 #endif 7871 /* 7872 * if_obytes and if_omcasts are added in if_transmit()@if.c. 7873 */ 7874 7875 mutex_enter(txq->txq_lock); 7876 if (!txq->txq_stopping) 7877 wm_start_locked(ifp); 7878 mutex_exit(txq->txq_lock); 7879 } 7880 7881 static void 7882 wm_start_locked(struct ifnet *ifp) 7883 { 7884 struct wm_softc *sc = ifp->if_softc; 7885 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 7886 7887 wm_send_common_locked(ifp, txq, false); 7888 } 7889 7890 static int 7891 wm_transmit(struct ifnet *ifp, struct mbuf *m) 7892 { 7893 int qid; 7894 struct wm_softc *sc = ifp->if_softc; 7895 struct wm_txqueue *txq; 7896 7897 qid = wm_select_txqueue(ifp, m); 7898 txq = &sc->sc_queue[qid].wmq_txq; 7899 7900 if (__predict_false(!pcq_put(txq->txq_interq, m))) { 7901 m_freem(m); 7902 WM_Q_EVCNT_INCR(txq, pcqdrop); 7903 return ENOBUFS; 7904 } 7905 7906 net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 7907 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len); 7908 if (m->m_flags & M_MCAST) 7909 if_statinc_ref(nsr, if_omcasts); 7910 IF_STAT_PUTREF(ifp); 7911 7912 if (mutex_tryenter(txq->txq_lock)) { 7913 if (!txq->txq_stopping) 7914 wm_transmit_locked(ifp, txq); 7915 mutex_exit(txq->txq_lock); 7916 } 7917 7918 return 0; 7919 } 7920 7921 static void 7922 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq) 7923 { 7924 7925 wm_send_common_locked(ifp, txq, true); 7926 } 7927 7928 static void 7929 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq, 7930 bool is_transmit) 7931 { 7932 struct wm_softc *sc = ifp->if_softc; 7933 struct mbuf *m0; 7934 struct wm_txsoft *txs; 7935 bus_dmamap_t dmamap; 7936 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso; 7937 bus_addr_t curaddr; 7938 bus_size_t seglen, curlen; 7939 uint32_t cksumcmd; 7940 uint8_t cksumfields; 7941 bool remap = true; 7942 7943 KASSERT(mutex_owned(txq->txq_lock)); 7944 7945 if ((ifp->if_flags & IFF_RUNNING) == 0) 7946 return; 7947 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0) 7948 return; 7949 7950 if (__predict_false(wm_linkdown_discard(txq))) { 7951 do { 7952 if (is_transmit) 7953 m0 = pcq_get(txq->txq_interq); 7954 else 7955 IFQ_DEQUEUE(&ifp->if_snd, m0); 7956 /* 7957 * increment successed packet counter as in the case 7958 * which the packet is discarded by link down PHY. 7959 */ 7960 if (m0 != NULL) 7961 if_statinc(ifp, if_opackets); 7962 m_freem(m0); 7963 } while (m0 != NULL); 7964 return; 7965 } 7966 7967 /* Remember the previous number of free descriptors. */ 7968 ofree = txq->txq_free; 7969 7970 /* 7971 * Loop through the send queue, setting up transmit descriptors 7972 * until we drain the queue, or use up all available transmit 7973 * descriptors. 7974 */ 7975 for (;;) { 7976 m0 = NULL; 7977 7978 /* Get a work queue entry. */ 7979 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) { 7980 wm_txeof(txq, UINT_MAX); 7981 if (txq->txq_sfree == 0) { 7982 DPRINTF(sc, WM_DEBUG_TX, 7983 ("%s: TX: no free job descriptors\n", 7984 device_xname(sc->sc_dev))); 7985 WM_Q_EVCNT_INCR(txq, txsstall); 7986 break; 7987 } 7988 } 7989 7990 /* Grab a packet off the queue. */ 7991 if (is_transmit) 7992 m0 = pcq_get(txq->txq_interq); 7993 else 7994 IFQ_DEQUEUE(&ifp->if_snd, m0); 7995 if (m0 == NULL) 7996 break; 7997 7998 DPRINTF(sc, WM_DEBUG_TX, 7999 ("%s: TX: have packet to transmit: %p\n", 8000 device_xname(sc->sc_dev), m0)); 8001 8002 txs = &txq->txq_soft[txq->txq_snext]; 8003 dmamap = txs->txs_dmamap; 8004 8005 use_tso = (m0->m_pkthdr.csum_flags & 8006 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0; 8007 8008 /* 8009 * So says the Linux driver: 8010 * The controller does a simple calculation to make sure 8011 * there is enough room in the FIFO before initiating the 8012 * DMA for each buffer. The calc is: 8013 * 4 = ceil(buffer len / MSS) 8014 * To make sure we don't overrun the FIFO, adjust the max 8015 * buffer len if the MSS drops. 8016 */ 8017 dmamap->dm_maxsegsz = 8018 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN) 8019 ? m0->m_pkthdr.segsz << 2 8020 : WTX_MAX_LEN; 8021 8022 /* 8023 * Load the DMA map. If this fails, the packet either 8024 * didn't fit in the allotted number of segments, or we 8025 * were short on resources. For the too-many-segments 8026 * case, we simply report an error and drop the packet, 8027 * since we can't sanely copy a jumbo packet to a single 8028 * buffer. 8029 */ 8030 retry: 8031 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 8032 BUS_DMA_WRITE | BUS_DMA_NOWAIT); 8033 if (__predict_false(error)) { 8034 if (error == EFBIG) { 8035 if (remap == true) { 8036 struct mbuf *m; 8037 8038 remap = false; 8039 m = m_defrag(m0, M_NOWAIT); 8040 if (m != NULL) { 8041 WM_Q_EVCNT_INCR(txq, defrag); 8042 m0 = m; 8043 goto retry; 8044 } 8045 } 8046 WM_Q_EVCNT_INCR(txq, toomanyseg); 8047 log(LOG_ERR, "%s: Tx packet consumes too many " 8048 "DMA segments, dropping...\n", 8049 device_xname(sc->sc_dev)); 8050 wm_dump_mbuf_chain(sc, m0); 8051 m_freem(m0); 8052 continue; 8053 } 8054 /* Short on resources, just stop for now. */ 8055 DPRINTF(sc, WM_DEBUG_TX, 8056 ("%s: TX: dmamap load failed: %d\n", 8057 device_xname(sc->sc_dev), error)); 8058 break; 8059 } 8060 8061 segs_needed = dmamap->dm_nsegs; 8062 if (use_tso) { 8063 /* For sentinel descriptor; see below. */ 8064 segs_needed++; 8065 } 8066 8067 /* 8068 * Ensure we have enough descriptors free to describe 8069 * the packet. Note, we always reserve one descriptor 8070 * at the end of the ring due to the semantics of the 8071 * TDT register, plus one more in the event we need 8072 * to load offload context. 8073 */ 8074 if (segs_needed > txq->txq_free - 2) { 8075 /* 8076 * Not enough free descriptors to transmit this 8077 * packet. We haven't committed anything yet, 8078 * so just unload the DMA map, put the packet 8079 * pack on the queue, and punt. Notify the upper 8080 * layer that there are no more slots left. 8081 */ 8082 DPRINTF(sc, WM_DEBUG_TX, 8083 ("%s: TX: need %d (%d) descriptors, have %d\n", 8084 device_xname(sc->sc_dev), dmamap->dm_nsegs, 8085 segs_needed, txq->txq_free - 1)); 8086 txq->txq_flags |= WM_TXQ_NO_SPACE; 8087 bus_dmamap_unload(sc->sc_dmat, dmamap); 8088 WM_Q_EVCNT_INCR(txq, txdstall); 8089 break; 8090 } 8091 8092 /* 8093 * Check for 82547 Tx FIFO bug. We need to do this 8094 * once we know we can transmit the packet, since we 8095 * do some internal FIFO space accounting here. 8096 */ 8097 if (sc->sc_type == WM_T_82547 && 8098 wm_82547_txfifo_bugchk(sc, m0)) { 8099 DPRINTF(sc, WM_DEBUG_TX, 8100 ("%s: TX: 82547 Tx FIFO bug detected\n", 8101 device_xname(sc->sc_dev))); 8102 txq->txq_flags |= WM_TXQ_NO_SPACE; 8103 bus_dmamap_unload(sc->sc_dmat, dmamap); 8104 WM_Q_EVCNT_INCR(txq, fifo_stall); 8105 break; 8106 } 8107 8108 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */ 8109 8110 DPRINTF(sc, WM_DEBUG_TX, 8111 ("%s: TX: packet has %d (%d) DMA segments\n", 8112 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed)); 8113 8114 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]); 8115 8116 /* 8117 * Store a pointer to the packet so that we can free it 8118 * later. 8119 * 8120 * Initially, we consider the number of descriptors the 8121 * packet uses the number of DMA segments. This may be 8122 * incremented by 1 if we do checksum offload (a descriptor 8123 * is used to set the checksum context). 8124 */ 8125 txs->txs_mbuf = m0; 8126 txs->txs_firstdesc = txq->txq_next; 8127 txs->txs_ndesc = segs_needed; 8128 8129 /* Set up offload parameters for this packet. */ 8130 if (m0->m_pkthdr.csum_flags & 8131 (M_CSUM_TSOv4 | M_CSUM_TSOv6 | 8132 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 | 8133 M_CSUM_TCPv6 | M_CSUM_UDPv6)) { 8134 wm_tx_offload(sc, txq, txs, &cksumcmd, &cksumfields); 8135 } else { 8136 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0; 8137 txq->txq_last_hw_ipcs = txq->txq_last_hw_tucs = 0; 8138 cksumcmd = 0; 8139 cksumfields = 0; 8140 } 8141 8142 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS; 8143 8144 /* Sync the DMA map. */ 8145 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 8146 BUS_DMASYNC_PREWRITE); 8147 8148 /* Initialize the transmit descriptor. */ 8149 for (nexttx = txq->txq_next, seg = 0; 8150 seg < dmamap->dm_nsegs; seg++) { 8151 for (seglen = dmamap->dm_segs[seg].ds_len, 8152 curaddr = dmamap->dm_segs[seg].ds_addr; 8153 seglen != 0; 8154 curaddr += curlen, seglen -= curlen, 8155 nexttx = WM_NEXTTX(txq, nexttx)) { 8156 curlen = seglen; 8157 8158 /* 8159 * So says the Linux driver: 8160 * Work around for premature descriptor 8161 * write-backs in TSO mode. Append a 8162 * 4-byte sentinel descriptor. 8163 */ 8164 if (use_tso && seg == dmamap->dm_nsegs - 1 && 8165 curlen > 8) 8166 curlen -= 4; 8167 8168 wm_set_dma_addr( 8169 &txq->txq_descs[nexttx].wtx_addr, curaddr); 8170 txq->txq_descs[nexttx].wtx_cmdlen 8171 = htole32(cksumcmd | curlen); 8172 txq->txq_descs[nexttx].wtx_fields.wtxu_status 8173 = 0; 8174 txq->txq_descs[nexttx].wtx_fields.wtxu_options 8175 = cksumfields; 8176 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0; 8177 lasttx = nexttx; 8178 8179 DPRINTF(sc, WM_DEBUG_TX, 8180 ("%s: TX: desc %d: low %#" PRIx64 ", " 8181 "len %#04zx\n", 8182 device_xname(sc->sc_dev), nexttx, 8183 (uint64_t)curaddr, curlen)); 8184 } 8185 } 8186 8187 KASSERT(lasttx != -1); 8188 8189 /* 8190 * Set up the command byte on the last descriptor of 8191 * the packet. If we're in the interrupt delay window, 8192 * delay the interrupt. 8193 */ 8194 txq->txq_descs[lasttx].wtx_cmdlen |= 8195 htole32(WTX_CMD_EOP | WTX_CMD_RS); 8196 8197 /* 8198 * If VLANs are enabled and the packet has a VLAN tag, set 8199 * up the descriptor to encapsulate the packet for us. 8200 * 8201 * This is only valid on the last descriptor of the packet. 8202 */ 8203 if (vlan_has_tag(m0)) { 8204 txq->txq_descs[lasttx].wtx_cmdlen |= 8205 htole32(WTX_CMD_VLE); 8206 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan 8207 = htole16(vlan_get_tag(m0)); 8208 } 8209 8210 txs->txs_lastdesc = lasttx; 8211 8212 DPRINTF(sc, WM_DEBUG_TX, 8213 ("%s: TX: desc %d: cmdlen 0x%08x\n", 8214 device_xname(sc->sc_dev), 8215 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen))); 8216 8217 /* Sync the descriptors we're using. */ 8218 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc, 8219 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 8220 8221 /* Give the packet to the chip. */ 8222 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx); 8223 8224 DPRINTF(sc, WM_DEBUG_TX, 8225 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx)); 8226 8227 DPRINTF(sc, WM_DEBUG_TX, 8228 ("%s: TX: finished transmitting packet, job %d\n", 8229 device_xname(sc->sc_dev), txq->txq_snext)); 8230 8231 /* Advance the tx pointer. */ 8232 txq->txq_free -= txs->txs_ndesc; 8233 txq->txq_next = nexttx; 8234 8235 txq->txq_sfree--; 8236 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext); 8237 8238 /* Pass the packet to any BPF listeners. */ 8239 bpf_mtap(ifp, m0, BPF_D_OUT); 8240 } 8241 8242 if (m0 != NULL) { 8243 txq->txq_flags |= WM_TXQ_NO_SPACE; 8244 WM_Q_EVCNT_INCR(txq, descdrop); 8245 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", 8246 __func__)); 8247 m_freem(m0); 8248 } 8249 8250 if (txq->txq_sfree == 0 || txq->txq_free <= 2) { 8251 /* No more slots; notify upper layer. */ 8252 txq->txq_flags |= WM_TXQ_NO_SPACE; 8253 } 8254 8255 if (txq->txq_free != ofree) { 8256 /* Set a watchdog timer in case the chip flakes out. */ 8257 txq->txq_lastsent = time_uptime; 8258 txq->txq_sending = true; 8259 } 8260 } 8261 8262 /* 8263 * wm_nq_tx_offload: 8264 * 8265 * Set up TCP/IP checksumming parameters for the 8266 * specified packet, for NEWQUEUE devices 8267 */ 8268 static void 8269 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq, 8270 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum) 8271 { 8272 struct mbuf *m0 = txs->txs_mbuf; 8273 uint32_t vl_len, mssidx, cmdc; 8274 struct ether_header *eh; 8275 int offset, iphl; 8276 8277 /* 8278 * XXX It would be nice if the mbuf pkthdr had offset 8279 * fields for the protocol headers. 8280 */ 8281 *cmdlenp = 0; 8282 *fieldsp = 0; 8283 8284 eh = mtod(m0, struct ether_header *); 8285 switch (htons(eh->ether_type)) { 8286 case ETHERTYPE_IP: 8287 case ETHERTYPE_IPV6: 8288 offset = ETHER_HDR_LEN; 8289 break; 8290 8291 case ETHERTYPE_VLAN: 8292 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 8293 break; 8294 8295 default: 8296 /* Don't support this protocol or encapsulation. */ 8297 *do_csum = false; 8298 return; 8299 } 8300 *do_csum = true; 8301 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS; 8302 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT; 8303 8304 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT); 8305 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0); 8306 8307 if ((m0->m_pkthdr.csum_flags & 8308 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) { 8309 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data); 8310 } else { 8311 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data); 8312 } 8313 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT); 8314 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0); 8315 8316 if (vlan_has_tag(m0)) { 8317 vl_len |= ((vlan_get_tag(m0) & NQTXC_VLLEN_VLAN_MASK) 8318 << NQTXC_VLLEN_VLAN_SHIFT); 8319 *cmdlenp |= NQTX_CMD_VLE; 8320 } 8321 8322 mssidx = 0; 8323 8324 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) { 8325 int hlen = offset + iphl; 8326 int tcp_hlen; 8327 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0; 8328 8329 if (__predict_false(m0->m_len < 8330 (hlen + sizeof(struct tcphdr)))) { 8331 /* 8332 * TCP/IP headers are not in the first mbuf; we need 8333 * to do this the slow and painful way. Let's just 8334 * hope this doesn't happen very often. 8335 */ 8336 struct tcphdr th; 8337 8338 WM_Q_EVCNT_INCR(txq, tsopain); 8339 8340 m_copydata(m0, hlen, sizeof(th), &th); 8341 if (v4) { 8342 struct ip ip; 8343 8344 m_copydata(m0, offset, sizeof(ip), &ip); 8345 ip.ip_len = 0; 8346 m_copyback(m0, 8347 offset + offsetof(struct ip, ip_len), 8348 sizeof(ip.ip_len), &ip.ip_len); 8349 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr, 8350 ip.ip_dst.s_addr, htons(IPPROTO_TCP)); 8351 } else { 8352 struct ip6_hdr ip6; 8353 8354 m_copydata(m0, offset, sizeof(ip6), &ip6); 8355 ip6.ip6_plen = 0; 8356 m_copyback(m0, 8357 offset + offsetof(struct ip6_hdr, ip6_plen), 8358 sizeof(ip6.ip6_plen), &ip6.ip6_plen); 8359 th.th_sum = in6_cksum_phdr(&ip6.ip6_src, 8360 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP)); 8361 } 8362 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum), 8363 sizeof(th.th_sum), &th.th_sum); 8364 8365 tcp_hlen = th.th_off << 2; 8366 } else { 8367 /* 8368 * TCP/IP headers are in the first mbuf; we can do 8369 * this the easy way. 8370 */ 8371 struct tcphdr *th; 8372 8373 if (v4) { 8374 struct ip *ip = 8375 (void *)(mtod(m0, char *) + offset); 8376 th = (void *)(mtod(m0, char *) + hlen); 8377 8378 ip->ip_len = 0; 8379 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 8380 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 8381 } else { 8382 struct ip6_hdr *ip6 = 8383 (void *)(mtod(m0, char *) + offset); 8384 th = (void *)(mtod(m0, char *) + hlen); 8385 8386 ip6->ip6_plen = 0; 8387 th->th_sum = in6_cksum_phdr(&ip6->ip6_src, 8388 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP)); 8389 } 8390 tcp_hlen = th->th_off << 2; 8391 } 8392 hlen += tcp_hlen; 8393 *cmdlenp |= NQTX_CMD_TSE; 8394 8395 if (v4) { 8396 WM_Q_EVCNT_INCR(txq, tso); 8397 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM; 8398 } else { 8399 WM_Q_EVCNT_INCR(txq, tso6); 8400 *fieldsp |= NQTXD_FIELDS_TUXSM; 8401 } 8402 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT); 8403 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0); 8404 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT); 8405 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0); 8406 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT); 8407 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0); 8408 } else { 8409 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT); 8410 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0); 8411 } 8412 8413 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) { 8414 *fieldsp |= NQTXD_FIELDS_IXSM; 8415 cmdc |= NQTXC_CMD_IP4; 8416 } 8417 8418 if (m0->m_pkthdr.csum_flags & 8419 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) { 8420 WM_Q_EVCNT_INCR(txq, tusum); 8421 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) 8422 cmdc |= NQTXC_CMD_TCP; 8423 else 8424 cmdc |= NQTXC_CMD_UDP; 8425 8426 cmdc |= NQTXC_CMD_IP4; 8427 *fieldsp |= NQTXD_FIELDS_TUXSM; 8428 } 8429 if (m0->m_pkthdr.csum_flags & 8430 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) { 8431 WM_Q_EVCNT_INCR(txq, tusum6); 8432 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) 8433 cmdc |= NQTXC_CMD_TCP; 8434 else 8435 cmdc |= NQTXC_CMD_UDP; 8436 8437 cmdc |= NQTXC_CMD_IP6; 8438 *fieldsp |= NQTXD_FIELDS_TUXSM; 8439 } 8440 8441 /* 8442 * We don't have to write context descriptor for every packet to 8443 * NEWQUEUE controllers, that is 82575, 82576, 82580, I350, I354, 8444 * I210 and I211. It is enough to write once per a Tx queue for these 8445 * controllers. 8446 * It would be overhead to write context descriptor for every packet, 8447 * however it does not cause problems. 8448 */ 8449 /* Fill in the context descriptor. */ 8450 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len = 8451 htole32(vl_len); 8452 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0; 8453 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd = 8454 htole32(cmdc); 8455 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx = 8456 htole32(mssidx); 8457 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE); 8458 DPRINTF(sc, WM_DEBUG_TX, 8459 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev), 8460 txq->txq_next, 0, vl_len)); 8461 DPRINTF(sc, WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc)); 8462 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 8463 txs->txs_ndesc++; 8464 } 8465 8466 /* 8467 * wm_nq_start: [ifnet interface function] 8468 * 8469 * Start packet transmission on the interface for NEWQUEUE devices 8470 */ 8471 static void 8472 wm_nq_start(struct ifnet *ifp) 8473 { 8474 struct wm_softc *sc = ifp->if_softc; 8475 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 8476 8477 #ifdef WM_MPSAFE 8478 KASSERT(if_is_mpsafe(ifp)); 8479 #endif 8480 /* 8481 * if_obytes and if_omcasts are added in if_transmit()@if.c. 8482 */ 8483 8484 mutex_enter(txq->txq_lock); 8485 if (!txq->txq_stopping) 8486 wm_nq_start_locked(ifp); 8487 mutex_exit(txq->txq_lock); 8488 } 8489 8490 static void 8491 wm_nq_start_locked(struct ifnet *ifp) 8492 { 8493 struct wm_softc *sc = ifp->if_softc; 8494 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 8495 8496 wm_nq_send_common_locked(ifp, txq, false); 8497 } 8498 8499 static int 8500 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m) 8501 { 8502 int qid; 8503 struct wm_softc *sc = ifp->if_softc; 8504 struct wm_txqueue *txq; 8505 8506 qid = wm_select_txqueue(ifp, m); 8507 txq = &sc->sc_queue[qid].wmq_txq; 8508 8509 if (__predict_false(!pcq_put(txq->txq_interq, m))) { 8510 m_freem(m); 8511 WM_Q_EVCNT_INCR(txq, pcqdrop); 8512 return ENOBUFS; 8513 } 8514 8515 net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 8516 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len); 8517 if (m->m_flags & M_MCAST) 8518 if_statinc_ref(nsr, if_omcasts); 8519 IF_STAT_PUTREF(ifp); 8520 8521 /* 8522 * The situations which this mutex_tryenter() fails at running time 8523 * are below two patterns. 8524 * (1) contention with interrupt handler(wm_txrxintr_msix()) 8525 * (2) contention with deferred if_start softint(wm_handle_queue()) 8526 * In the case of (1), the last packet enqueued to txq->txq_interq is 8527 * dequeued by wm_deferred_start_locked(). So, it does not get stuck. 8528 * In the case of (2), the last packet enqueued to txq->txq_interq is 8529 * also dequeued by wm_deferred_start_locked(). So, it does not get 8530 * stuck, either. 8531 */ 8532 if (mutex_tryenter(txq->txq_lock)) { 8533 if (!txq->txq_stopping) 8534 wm_nq_transmit_locked(ifp, txq); 8535 mutex_exit(txq->txq_lock); 8536 } 8537 8538 return 0; 8539 } 8540 8541 static void 8542 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq) 8543 { 8544 8545 wm_nq_send_common_locked(ifp, txq, true); 8546 } 8547 8548 static void 8549 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq, 8550 bool is_transmit) 8551 { 8552 struct wm_softc *sc = ifp->if_softc; 8553 struct mbuf *m0; 8554 struct wm_txsoft *txs; 8555 bus_dmamap_t dmamap; 8556 int error, nexttx, lasttx = -1, seg, segs_needed; 8557 bool do_csum, sent; 8558 bool remap = true; 8559 8560 KASSERT(mutex_owned(txq->txq_lock)); 8561 8562 if ((ifp->if_flags & IFF_RUNNING) == 0) 8563 return; 8564 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0) 8565 return; 8566 8567 if (__predict_false(wm_linkdown_discard(txq))) { 8568 do { 8569 if (is_transmit) 8570 m0 = pcq_get(txq->txq_interq); 8571 else 8572 IFQ_DEQUEUE(&ifp->if_snd, m0); 8573 /* 8574 * increment successed packet counter as in the case 8575 * which the packet is discarded by link down PHY. 8576 */ 8577 if (m0 != NULL) 8578 if_statinc(ifp, if_opackets); 8579 m_freem(m0); 8580 } while (m0 != NULL); 8581 return; 8582 } 8583 8584 sent = false; 8585 8586 /* 8587 * Loop through the send queue, setting up transmit descriptors 8588 * until we drain the queue, or use up all available transmit 8589 * descriptors. 8590 */ 8591 for (;;) { 8592 m0 = NULL; 8593 8594 /* Get a work queue entry. */ 8595 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) { 8596 wm_txeof(txq, UINT_MAX); 8597 if (txq->txq_sfree == 0) { 8598 DPRINTF(sc, WM_DEBUG_TX, 8599 ("%s: TX: no free job descriptors\n", 8600 device_xname(sc->sc_dev))); 8601 WM_Q_EVCNT_INCR(txq, txsstall); 8602 break; 8603 } 8604 } 8605 8606 /* Grab a packet off the queue. */ 8607 if (is_transmit) 8608 m0 = pcq_get(txq->txq_interq); 8609 else 8610 IFQ_DEQUEUE(&ifp->if_snd, m0); 8611 if (m0 == NULL) 8612 break; 8613 8614 DPRINTF(sc, WM_DEBUG_TX, 8615 ("%s: TX: have packet to transmit: %p\n", 8616 device_xname(sc->sc_dev), m0)); 8617 8618 txs = &txq->txq_soft[txq->txq_snext]; 8619 dmamap = txs->txs_dmamap; 8620 8621 /* 8622 * Load the DMA map. If this fails, the packet either 8623 * didn't fit in the allotted number of segments, or we 8624 * were short on resources. For the too-many-segments 8625 * case, we simply report an error and drop the packet, 8626 * since we can't sanely copy a jumbo packet to a single 8627 * buffer. 8628 */ 8629 retry: 8630 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 8631 BUS_DMA_WRITE | BUS_DMA_NOWAIT); 8632 if (__predict_false(error)) { 8633 if (error == EFBIG) { 8634 if (remap == true) { 8635 struct mbuf *m; 8636 8637 remap = false; 8638 m = m_defrag(m0, M_NOWAIT); 8639 if (m != NULL) { 8640 WM_Q_EVCNT_INCR(txq, defrag); 8641 m0 = m; 8642 goto retry; 8643 } 8644 } 8645 WM_Q_EVCNT_INCR(txq, toomanyseg); 8646 log(LOG_ERR, "%s: Tx packet consumes too many " 8647 "DMA segments, dropping...\n", 8648 device_xname(sc->sc_dev)); 8649 wm_dump_mbuf_chain(sc, m0); 8650 m_freem(m0); 8651 continue; 8652 } 8653 /* Short on resources, just stop for now. */ 8654 DPRINTF(sc, WM_DEBUG_TX, 8655 ("%s: TX: dmamap load failed: %d\n", 8656 device_xname(sc->sc_dev), error)); 8657 break; 8658 } 8659 8660 segs_needed = dmamap->dm_nsegs; 8661 8662 /* 8663 * Ensure we have enough descriptors free to describe 8664 * the packet. Note, we always reserve one descriptor 8665 * at the end of the ring due to the semantics of the 8666 * TDT register, plus one more in the event we need 8667 * to load offload context. 8668 */ 8669 if (segs_needed > txq->txq_free - 2) { 8670 /* 8671 * Not enough free descriptors to transmit this 8672 * packet. We haven't committed anything yet, 8673 * so just unload the DMA map, put the packet 8674 * pack on the queue, and punt. Notify the upper 8675 * layer that there are no more slots left. 8676 */ 8677 DPRINTF(sc, WM_DEBUG_TX, 8678 ("%s: TX: need %d (%d) descriptors, have %d\n", 8679 device_xname(sc->sc_dev), dmamap->dm_nsegs, 8680 segs_needed, txq->txq_free - 1)); 8681 txq->txq_flags |= WM_TXQ_NO_SPACE; 8682 bus_dmamap_unload(sc->sc_dmat, dmamap); 8683 WM_Q_EVCNT_INCR(txq, txdstall); 8684 break; 8685 } 8686 8687 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */ 8688 8689 DPRINTF(sc, WM_DEBUG_TX, 8690 ("%s: TX: packet has %d (%d) DMA segments\n", 8691 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed)); 8692 8693 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]); 8694 8695 /* 8696 * Store a pointer to the packet so that we can free it 8697 * later. 8698 * 8699 * Initially, we consider the number of descriptors the 8700 * packet uses the number of DMA segments. This may be 8701 * incremented by 1 if we do checksum offload (a descriptor 8702 * is used to set the checksum context). 8703 */ 8704 txs->txs_mbuf = m0; 8705 txs->txs_firstdesc = txq->txq_next; 8706 txs->txs_ndesc = segs_needed; 8707 8708 /* Set up offload parameters for this packet. */ 8709 uint32_t cmdlen, fields, dcmdlen; 8710 if (m0->m_pkthdr.csum_flags & 8711 (M_CSUM_TSOv4 | M_CSUM_TSOv6 | 8712 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 | 8713 M_CSUM_TCPv6 | M_CSUM_UDPv6)) { 8714 wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields, 8715 &do_csum); 8716 } else { 8717 do_csum = false; 8718 cmdlen = 0; 8719 fields = 0; 8720 } 8721 8722 /* Sync the DMA map. */ 8723 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 8724 BUS_DMASYNC_PREWRITE); 8725 8726 /* Initialize the first transmit descriptor. */ 8727 nexttx = txq->txq_next; 8728 if (!do_csum) { 8729 /* Setup a legacy descriptor */ 8730 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr, 8731 dmamap->dm_segs[0].ds_addr); 8732 txq->txq_descs[nexttx].wtx_cmdlen = 8733 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len); 8734 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0; 8735 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0; 8736 if (vlan_has_tag(m0)) { 8737 txq->txq_descs[nexttx].wtx_cmdlen |= 8738 htole32(WTX_CMD_VLE); 8739 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan = 8740 htole16(vlan_get_tag(m0)); 8741 } else 8742 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0; 8743 8744 dcmdlen = 0; 8745 } else { 8746 /* Setup an advanced data descriptor */ 8747 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr = 8748 htole64(dmamap->dm_segs[0].ds_addr); 8749 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0); 8750 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen = 8751 htole32(dmamap->dm_segs[0].ds_len | cmdlen); 8752 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 8753 htole32(fields); 8754 DPRINTF(sc, WM_DEBUG_TX, 8755 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n", 8756 device_xname(sc->sc_dev), nexttx, 8757 (uint64_t)dmamap->dm_segs[0].ds_addr)); 8758 DPRINTF(sc, WM_DEBUG_TX, 8759 ("\t 0x%08x%08x\n", fields, 8760 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen)); 8761 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT; 8762 } 8763 8764 lasttx = nexttx; 8765 nexttx = WM_NEXTTX(txq, nexttx); 8766 /* 8767 * Fill in the next descriptors. legacy or advanced format 8768 * is the same here 8769 */ 8770 for (seg = 1; seg < dmamap->dm_nsegs; 8771 seg++, nexttx = WM_NEXTTX(txq, nexttx)) { 8772 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr = 8773 htole64(dmamap->dm_segs[seg].ds_addr); 8774 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen = 8775 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len); 8776 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0); 8777 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0; 8778 lasttx = nexttx; 8779 8780 DPRINTF(sc, WM_DEBUG_TX, 8781 ("%s: TX: desc %d: %#" PRIx64 ", len %#04zx\n", 8782 device_xname(sc->sc_dev), nexttx, 8783 (uint64_t)dmamap->dm_segs[seg].ds_addr, 8784 dmamap->dm_segs[seg].ds_len)); 8785 } 8786 8787 KASSERT(lasttx != -1); 8788 8789 /* 8790 * Set up the command byte on the last descriptor of 8791 * the packet. If we're in the interrupt delay window, 8792 * delay the interrupt. 8793 */ 8794 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) == 8795 (NQTX_CMD_EOP | NQTX_CMD_RS)); 8796 txq->txq_descs[lasttx].wtx_cmdlen |= 8797 htole32(WTX_CMD_EOP | WTX_CMD_RS); 8798 8799 txs->txs_lastdesc = lasttx; 8800 8801 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n", 8802 device_xname(sc->sc_dev), 8803 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen))); 8804 8805 /* Sync the descriptors we're using. */ 8806 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc, 8807 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 8808 8809 /* Give the packet to the chip. */ 8810 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx); 8811 sent = true; 8812 8813 DPRINTF(sc, WM_DEBUG_TX, 8814 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx)); 8815 8816 DPRINTF(sc, WM_DEBUG_TX, 8817 ("%s: TX: finished transmitting packet, job %d\n", 8818 device_xname(sc->sc_dev), txq->txq_snext)); 8819 8820 /* Advance the tx pointer. */ 8821 txq->txq_free -= txs->txs_ndesc; 8822 txq->txq_next = nexttx; 8823 8824 txq->txq_sfree--; 8825 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext); 8826 8827 /* Pass the packet to any BPF listeners. */ 8828 bpf_mtap(ifp, m0, BPF_D_OUT); 8829 } 8830 8831 if (m0 != NULL) { 8832 txq->txq_flags |= WM_TXQ_NO_SPACE; 8833 WM_Q_EVCNT_INCR(txq, descdrop); 8834 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", 8835 __func__)); 8836 m_freem(m0); 8837 } 8838 8839 if (txq->txq_sfree == 0 || txq->txq_free <= 2) { 8840 /* No more slots; notify upper layer. */ 8841 txq->txq_flags |= WM_TXQ_NO_SPACE; 8842 } 8843 8844 if (sent) { 8845 /* Set a watchdog timer in case the chip flakes out. */ 8846 txq->txq_lastsent = time_uptime; 8847 txq->txq_sending = true; 8848 } 8849 } 8850 8851 static void 8852 wm_deferred_start_locked(struct wm_txqueue *txq) 8853 { 8854 struct wm_softc *sc = txq->txq_sc; 8855 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 8856 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq); 8857 int qid = wmq->wmq_id; 8858 8859 KASSERT(mutex_owned(txq->txq_lock)); 8860 8861 if (txq->txq_stopping) { 8862 mutex_exit(txq->txq_lock); 8863 return; 8864 } 8865 8866 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 8867 /* XXX need for ALTQ or one CPU system */ 8868 if (qid == 0) 8869 wm_nq_start_locked(ifp); 8870 wm_nq_transmit_locked(ifp, txq); 8871 } else { 8872 /* XXX need for ALTQ or one CPU system */ 8873 if (qid == 0) 8874 wm_start_locked(ifp); 8875 wm_transmit_locked(ifp, txq); 8876 } 8877 } 8878 8879 /* Interrupt */ 8880 8881 /* 8882 * wm_txeof: 8883 * 8884 * Helper; handle transmit interrupts. 8885 */ 8886 static bool 8887 wm_txeof(struct wm_txqueue *txq, u_int limit) 8888 { 8889 struct wm_softc *sc = txq->txq_sc; 8890 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 8891 struct wm_txsoft *txs; 8892 int count = 0; 8893 int i; 8894 uint8_t status; 8895 bool more = false; 8896 8897 KASSERT(mutex_owned(txq->txq_lock)); 8898 8899 if (txq->txq_stopping) 8900 return false; 8901 8902 txq->txq_flags &= ~WM_TXQ_NO_SPACE; 8903 8904 /* 8905 * Go through the Tx list and free mbufs for those 8906 * frames which have been transmitted. 8907 */ 8908 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq); 8909 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) { 8910 if (limit-- == 0) { 8911 more = true; 8912 DPRINTF(sc, WM_DEBUG_TX, 8913 ("%s: TX: loop limited, job %d is not processed\n", 8914 device_xname(sc->sc_dev), i)); 8915 break; 8916 } 8917 8918 txs = &txq->txq_soft[i]; 8919 8920 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: checking job %d\n", 8921 device_xname(sc->sc_dev), i)); 8922 8923 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc, 8924 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 8925 8926 status = 8927 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status; 8928 if ((status & WTX_ST_DD) == 0) { 8929 wm_cdtxsync(txq, txs->txs_lastdesc, 1, 8930 BUS_DMASYNC_PREREAD); 8931 break; 8932 } 8933 8934 count++; 8935 DPRINTF(sc, WM_DEBUG_TX, 8936 ("%s: TX: job %d done: descs %d..%d\n", 8937 device_xname(sc->sc_dev), i, txs->txs_firstdesc, 8938 txs->txs_lastdesc)); 8939 8940 /* 8941 * XXX We should probably be using the statistics 8942 * XXX registers, but I don't know if they exist 8943 * XXX on chips before the i82544. 8944 */ 8945 8946 #ifdef WM_EVENT_COUNTERS 8947 if (status & WTX_ST_TU) 8948 WM_Q_EVCNT_INCR(txq, underrun); 8949 #endif /* WM_EVENT_COUNTERS */ 8950 8951 /* 8952 * 82574 and newer's document says the status field has neither 8953 * EC (Excessive Collision) bit nor LC (Late Collision) bit 8954 * (reserved). Refer "PCIe GbE Controller Open Source Software 8955 * Developer's Manual", 82574 datasheet and newer. 8956 * 8957 * XXX I saw the LC bit was set on I218 even though the media 8958 * was full duplex, so the bit might be used for other 8959 * meaning ...(I have no document). 8960 */ 8961 8962 if (((status & (WTX_ST_EC | WTX_ST_LC)) != 0) 8963 && ((sc->sc_type < WM_T_82574) 8964 || (sc->sc_type == WM_T_80003))) { 8965 if_statinc(ifp, if_oerrors); 8966 if (status & WTX_ST_LC) 8967 log(LOG_WARNING, "%s: late collision\n", 8968 device_xname(sc->sc_dev)); 8969 else if (status & WTX_ST_EC) { 8970 if_statadd(ifp, if_collisions, 8971 TX_COLLISION_THRESHOLD + 1); 8972 log(LOG_WARNING, "%s: excessive collisions\n", 8973 device_xname(sc->sc_dev)); 8974 } 8975 } else 8976 if_statinc(ifp, if_opackets); 8977 8978 txq->txq_packets++; 8979 txq->txq_bytes += txs->txs_mbuf->m_pkthdr.len; 8980 8981 txq->txq_free += txs->txs_ndesc; 8982 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap, 8983 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); 8984 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 8985 m_freem(txs->txs_mbuf); 8986 txs->txs_mbuf = NULL; 8987 } 8988 8989 /* Update the dirty transmit buffer pointer. */ 8990 txq->txq_sdirty = i; 8991 DPRINTF(sc, WM_DEBUG_TX, 8992 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i)); 8993 8994 if (count != 0) 8995 rnd_add_uint32(&sc->rnd_source, count); 8996 8997 /* 8998 * If there are no more pending transmissions, cancel the watchdog 8999 * timer. 9000 */ 9001 if (txq->txq_sfree == WM_TXQUEUELEN(txq)) 9002 txq->txq_sending = false; 9003 9004 return more; 9005 } 9006 9007 static inline uint32_t 9008 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx) 9009 { 9010 struct wm_softc *sc = rxq->rxq_sc; 9011 9012 if (sc->sc_type == WM_T_82574) 9013 return EXTRXC_STATUS( 9014 le32toh(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat)); 9015 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9016 return NQRXC_STATUS( 9017 le32toh(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat)); 9018 else 9019 return rxq->rxq_descs[idx].wrx_status; 9020 } 9021 9022 static inline uint32_t 9023 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx) 9024 { 9025 struct wm_softc *sc = rxq->rxq_sc; 9026 9027 if (sc->sc_type == WM_T_82574) 9028 return EXTRXC_ERROR( 9029 le32toh(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat)); 9030 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9031 return NQRXC_ERROR( 9032 le32toh(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat)); 9033 else 9034 return rxq->rxq_descs[idx].wrx_errors; 9035 } 9036 9037 static inline uint16_t 9038 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx) 9039 { 9040 struct wm_softc *sc = rxq->rxq_sc; 9041 9042 if (sc->sc_type == WM_T_82574) 9043 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan; 9044 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9045 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan; 9046 else 9047 return rxq->rxq_descs[idx].wrx_special; 9048 } 9049 9050 static inline int 9051 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx) 9052 { 9053 struct wm_softc *sc = rxq->rxq_sc; 9054 9055 if (sc->sc_type == WM_T_82574) 9056 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen; 9057 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9058 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen; 9059 else 9060 return rxq->rxq_descs[idx].wrx_len; 9061 } 9062 9063 #ifdef WM_DEBUG 9064 static inline uint32_t 9065 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx) 9066 { 9067 struct wm_softc *sc = rxq->rxq_sc; 9068 9069 if (sc->sc_type == WM_T_82574) 9070 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash; 9071 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9072 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash; 9073 else 9074 return 0; 9075 } 9076 9077 static inline uint8_t 9078 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx) 9079 { 9080 struct wm_softc *sc = rxq->rxq_sc; 9081 9082 if (sc->sc_type == WM_T_82574) 9083 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq); 9084 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9085 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc); 9086 else 9087 return 0; 9088 } 9089 #endif /* WM_DEBUG */ 9090 9091 static inline bool 9092 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status, 9093 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit) 9094 { 9095 9096 if (sc->sc_type == WM_T_82574) 9097 return (status & ext_bit) != 0; 9098 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9099 return (status & nq_bit) != 0; 9100 else 9101 return (status & legacy_bit) != 0; 9102 } 9103 9104 static inline bool 9105 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error, 9106 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit) 9107 { 9108 9109 if (sc->sc_type == WM_T_82574) 9110 return (error & ext_bit) != 0; 9111 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9112 return (error & nq_bit) != 0; 9113 else 9114 return (error & legacy_bit) != 0; 9115 } 9116 9117 static inline bool 9118 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status) 9119 { 9120 9121 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status, 9122 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP)) 9123 return true; 9124 else 9125 return false; 9126 } 9127 9128 static inline bool 9129 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors) 9130 { 9131 struct wm_softc *sc = rxq->rxq_sc; 9132 9133 /* XXX missing error bit for newqueue? */ 9134 if (wm_rxdesc_is_set_error(sc, errors, 9135 WRX_ER_CE | WRX_ER_SE | WRX_ER_SEQ | WRX_ER_CXE | WRX_ER_RXE, 9136 EXTRXC_ERROR_CE | EXTRXC_ERROR_SE | EXTRXC_ERROR_SEQ 9137 | EXTRXC_ERROR_CXE | EXTRXC_ERROR_RXE, 9138 NQRXC_ERROR_RXE)) { 9139 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE, 9140 EXTRXC_ERROR_SE, 0)) 9141 log(LOG_WARNING, "%s: symbol error\n", 9142 device_xname(sc->sc_dev)); 9143 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ, 9144 EXTRXC_ERROR_SEQ, 0)) 9145 log(LOG_WARNING, "%s: receive sequence error\n", 9146 device_xname(sc->sc_dev)); 9147 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE, 9148 EXTRXC_ERROR_CE, 0)) 9149 log(LOG_WARNING, "%s: CRC error\n", 9150 device_xname(sc->sc_dev)); 9151 return true; 9152 } 9153 9154 return false; 9155 } 9156 9157 static inline bool 9158 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status) 9159 { 9160 struct wm_softc *sc = rxq->rxq_sc; 9161 9162 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD, 9163 NQRXC_STATUS_DD)) { 9164 /* We have processed all of the receive descriptors. */ 9165 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD); 9166 return false; 9167 } 9168 9169 return true; 9170 } 9171 9172 static inline bool 9173 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status, 9174 uint16_t vlantag, struct mbuf *m) 9175 { 9176 9177 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status, 9178 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) { 9179 vlan_set_tag(m, le16toh(vlantag)); 9180 } 9181 9182 return true; 9183 } 9184 9185 static inline void 9186 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status, 9187 uint32_t errors, struct mbuf *m) 9188 { 9189 struct wm_softc *sc = rxq->rxq_sc; 9190 9191 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) { 9192 if (wm_rxdesc_is_set_status(sc, status, 9193 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) { 9194 WM_Q_EVCNT_INCR(rxq, ipsum); 9195 m->m_pkthdr.csum_flags |= M_CSUM_IPv4; 9196 if (wm_rxdesc_is_set_error(sc, errors, 9197 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE)) 9198 m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD; 9199 } 9200 if (wm_rxdesc_is_set_status(sc, status, 9201 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) { 9202 /* 9203 * Note: we don't know if this was TCP or UDP, 9204 * so we just set both bits, and expect the 9205 * upper layers to deal. 9206 */ 9207 WM_Q_EVCNT_INCR(rxq, tusum); 9208 m->m_pkthdr.csum_flags |= 9209 M_CSUM_TCPv4 | M_CSUM_UDPv4 | 9210 M_CSUM_TCPv6 | M_CSUM_UDPv6; 9211 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_TCPE, 9212 EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E)) 9213 m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD; 9214 } 9215 } 9216 } 9217 9218 /* 9219 * wm_rxeof: 9220 * 9221 * Helper; handle receive interrupts. 9222 */ 9223 static bool 9224 wm_rxeof(struct wm_rxqueue *rxq, u_int limit) 9225 { 9226 struct wm_softc *sc = rxq->rxq_sc; 9227 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9228 struct wm_rxsoft *rxs; 9229 struct mbuf *m; 9230 int i, len; 9231 int count = 0; 9232 uint32_t status, errors; 9233 uint16_t vlantag; 9234 bool more = false; 9235 9236 KASSERT(mutex_owned(rxq->rxq_lock)); 9237 9238 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) { 9239 if (limit-- == 0) { 9240 more = true; 9241 DPRINTF(sc, WM_DEBUG_RX, 9242 ("%s: RX: loop limited, descriptor %d is not processed\n", 9243 device_xname(sc->sc_dev), i)); 9244 break; 9245 } 9246 9247 rxs = &rxq->rxq_soft[i]; 9248 9249 DPRINTF(sc, WM_DEBUG_RX, 9250 ("%s: RX: checking descriptor %d\n", 9251 device_xname(sc->sc_dev), i)); 9252 wm_cdrxsync(rxq, i, 9253 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 9254 9255 status = wm_rxdesc_get_status(rxq, i); 9256 errors = wm_rxdesc_get_errors(rxq, i); 9257 len = le16toh(wm_rxdesc_get_pktlen(rxq, i)); 9258 vlantag = wm_rxdesc_get_vlantag(rxq, i); 9259 #ifdef WM_DEBUG 9260 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i)); 9261 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i); 9262 #endif 9263 9264 if (!wm_rxdesc_dd(rxq, i, status)) { 9265 break; 9266 } 9267 9268 count++; 9269 if (__predict_false(rxq->rxq_discard)) { 9270 DPRINTF(sc, WM_DEBUG_RX, 9271 ("%s: RX: discarding contents of descriptor %d\n", 9272 device_xname(sc->sc_dev), i)); 9273 wm_init_rxdesc(rxq, i); 9274 if (wm_rxdesc_is_eop(rxq, status)) { 9275 /* Reset our state. */ 9276 DPRINTF(sc, WM_DEBUG_RX, 9277 ("%s: RX: resetting rxdiscard -> 0\n", 9278 device_xname(sc->sc_dev))); 9279 rxq->rxq_discard = 0; 9280 } 9281 continue; 9282 } 9283 9284 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 9285 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 9286 9287 m = rxs->rxs_mbuf; 9288 9289 /* 9290 * Add a new receive buffer to the ring, unless of 9291 * course the length is zero. Treat the latter as a 9292 * failed mapping. 9293 */ 9294 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) { 9295 /* 9296 * Failed, throw away what we've done so 9297 * far, and discard the rest of the packet. 9298 */ 9299 if_statinc(ifp, if_ierrors); 9300 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 9301 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 9302 wm_init_rxdesc(rxq, i); 9303 if (!wm_rxdesc_is_eop(rxq, status)) 9304 rxq->rxq_discard = 1; 9305 if (rxq->rxq_head != NULL) 9306 m_freem(rxq->rxq_head); 9307 WM_RXCHAIN_RESET(rxq); 9308 DPRINTF(sc, WM_DEBUG_RX, 9309 ("%s: RX: Rx buffer allocation failed, " 9310 "dropping packet%s\n", device_xname(sc->sc_dev), 9311 rxq->rxq_discard ? " (discard)" : "")); 9312 continue; 9313 } 9314 9315 m->m_len = len; 9316 rxq->rxq_len += len; 9317 DPRINTF(sc, WM_DEBUG_RX, 9318 ("%s: RX: buffer at %p len %d\n", 9319 device_xname(sc->sc_dev), m->m_data, len)); 9320 9321 /* If this is not the end of the packet, keep looking. */ 9322 if (!wm_rxdesc_is_eop(rxq, status)) { 9323 WM_RXCHAIN_LINK(rxq, m); 9324 DPRINTF(sc, WM_DEBUG_RX, 9325 ("%s: RX: not yet EOP, rxlen -> %d\n", 9326 device_xname(sc->sc_dev), rxq->rxq_len)); 9327 continue; 9328 } 9329 9330 /* 9331 * Okay, we have the entire packet now. The chip is 9332 * configured to include the FCS except I35[04], I21[01]. 9333 * (not all chips can be configured to strip it), so we need 9334 * to trim it. Those chips have an eratta, the RCTL_SECRC bit 9335 * in RCTL register is always set, so we don't trim it. 9336 * PCH2 and newer chip also not include FCS when jumbo 9337 * frame is used to do workaround an errata. 9338 * May need to adjust length of previous mbuf in the 9339 * chain if the current mbuf is too short. 9340 */ 9341 if ((sc->sc_flags & WM_F_CRC_STRIP) == 0) { 9342 if (m->m_len < ETHER_CRC_LEN) { 9343 rxq->rxq_tail->m_len 9344 -= (ETHER_CRC_LEN - m->m_len); 9345 m->m_len = 0; 9346 } else 9347 m->m_len -= ETHER_CRC_LEN; 9348 len = rxq->rxq_len - ETHER_CRC_LEN; 9349 } else 9350 len = rxq->rxq_len; 9351 9352 WM_RXCHAIN_LINK(rxq, m); 9353 9354 *rxq->rxq_tailp = NULL; 9355 m = rxq->rxq_head; 9356 9357 WM_RXCHAIN_RESET(rxq); 9358 9359 DPRINTF(sc, WM_DEBUG_RX, 9360 ("%s: RX: have entire packet, len -> %d\n", 9361 device_xname(sc->sc_dev), len)); 9362 9363 /* If an error occurred, update stats and drop the packet. */ 9364 if (wm_rxdesc_has_errors(rxq, errors)) { 9365 m_freem(m); 9366 continue; 9367 } 9368 9369 /* No errors. Receive the packet. */ 9370 m_set_rcvif(m, ifp); 9371 m->m_pkthdr.len = len; 9372 /* 9373 * TODO 9374 * should be save rsshash and rsstype to this mbuf. 9375 */ 9376 DPRINTF(sc, WM_DEBUG_RX, 9377 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n", 9378 device_xname(sc->sc_dev), rsstype, rsshash)); 9379 9380 /* 9381 * If VLANs are enabled, VLAN packets have been unwrapped 9382 * for us. Associate the tag with the packet. 9383 */ 9384 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m)) 9385 continue; 9386 9387 /* Set up checksum info for this packet. */ 9388 wm_rxdesc_ensure_checksum(rxq, status, errors, m); 9389 9390 rxq->rxq_packets++; 9391 rxq->rxq_bytes += len; 9392 /* Pass it on. */ 9393 if_percpuq_enqueue(sc->sc_ipq, m); 9394 9395 if (rxq->rxq_stopping) 9396 break; 9397 } 9398 rxq->rxq_ptr = i; 9399 9400 if (count != 0) 9401 rnd_add_uint32(&sc->rnd_source, count); 9402 9403 DPRINTF(sc, WM_DEBUG_RX, 9404 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i)); 9405 9406 return more; 9407 } 9408 9409 /* 9410 * wm_linkintr_gmii: 9411 * 9412 * Helper; handle link interrupts for GMII. 9413 */ 9414 static void 9415 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr) 9416 { 9417 device_t dev = sc->sc_dev; 9418 uint32_t status, reg; 9419 bool link; 9420 int rv; 9421 9422 KASSERT(WM_CORE_LOCKED(sc)); 9423 9424 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(dev), 9425 __func__)); 9426 9427 if ((icr & ICR_LSC) == 0) { 9428 if (icr & ICR_RXSEQ) 9429 DPRINTF(sc, WM_DEBUG_LINK, 9430 ("%s: LINK Receive sequence error\n", 9431 device_xname(dev))); 9432 return; 9433 } 9434 9435 /* Link status changed */ 9436 status = CSR_READ(sc, WMREG_STATUS); 9437 link = status & STATUS_LU; 9438 if (link) { 9439 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n", 9440 device_xname(dev), 9441 (status & STATUS_FD) ? "FDX" : "HDX")); 9442 if (wm_phy_need_linkdown_discard(sc)) 9443 wm_clear_linkdown_discard(sc); 9444 } else { 9445 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 9446 device_xname(dev))); 9447 if (wm_phy_need_linkdown_discard(sc)) 9448 wm_set_linkdown_discard(sc); 9449 } 9450 if ((sc->sc_type == WM_T_ICH8) && (link == false)) 9451 wm_gig_downshift_workaround_ich8lan(sc); 9452 9453 if ((sc->sc_type == WM_T_ICH8) 9454 && (sc->sc_phytype == WMPHY_IGP_3)) { 9455 wm_kmrn_lock_loss_workaround_ich8lan(sc); 9456 } 9457 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n", 9458 device_xname(dev))); 9459 mii_pollstat(&sc->sc_mii); 9460 if (sc->sc_type == WM_T_82543) { 9461 int miistatus, active; 9462 9463 /* 9464 * With 82543, we need to force speed and 9465 * duplex on the MAC equal to what the PHY 9466 * speed and duplex configuration is. 9467 */ 9468 miistatus = sc->sc_mii.mii_media_status; 9469 9470 if (miistatus & IFM_ACTIVE) { 9471 active = sc->sc_mii.mii_media_active; 9472 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD); 9473 switch (IFM_SUBTYPE(active)) { 9474 case IFM_10_T: 9475 sc->sc_ctrl |= CTRL_SPEED_10; 9476 break; 9477 case IFM_100_TX: 9478 sc->sc_ctrl |= CTRL_SPEED_100; 9479 break; 9480 case IFM_1000_T: 9481 sc->sc_ctrl |= CTRL_SPEED_1000; 9482 break; 9483 default: 9484 /* 9485 * Fiber? 9486 * Shoud not enter here. 9487 */ 9488 device_printf(dev, "unknown media (%x)\n", 9489 active); 9490 break; 9491 } 9492 if (active & IFM_FDX) 9493 sc->sc_ctrl |= CTRL_FD; 9494 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9495 } 9496 } else if (sc->sc_type == WM_T_PCH) { 9497 wm_k1_gig_workaround_hv(sc, 9498 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0)); 9499 } 9500 9501 /* 9502 * When connected at 10Mbps half-duplex, some parts are excessively 9503 * aggressive resulting in many collisions. To avoid this, increase 9504 * the IPG and reduce Rx latency in the PHY. 9505 */ 9506 if ((sc->sc_type >= WM_T_PCH2) && (sc->sc_type <= WM_T_PCH_CNP) 9507 && link) { 9508 uint32_t tipg_reg; 9509 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED); 9510 bool fdx; 9511 uint16_t emi_addr, emi_val; 9512 9513 tipg_reg = CSR_READ(sc, WMREG_TIPG); 9514 tipg_reg &= ~TIPG_IPGT_MASK; 9515 fdx = status & STATUS_FD; 9516 9517 if (!fdx && (speed == STATUS_SPEED_10)) { 9518 tipg_reg |= 0xff; 9519 /* Reduce Rx latency in analog PHY */ 9520 emi_val = 0; 9521 } else if ((sc->sc_type >= WM_T_PCH_SPT) && 9522 fdx && speed != STATUS_SPEED_1000) { 9523 tipg_reg |= 0xc; 9524 emi_val = 1; 9525 } else { 9526 /* Roll back the default values */ 9527 tipg_reg |= 0x08; 9528 emi_val = 1; 9529 } 9530 9531 CSR_WRITE(sc, WMREG_TIPG, tipg_reg); 9532 9533 rv = sc->phy.acquire(sc); 9534 if (rv) 9535 return; 9536 9537 if (sc->sc_type == WM_T_PCH2) 9538 emi_addr = I82579_RX_CONFIG; 9539 else 9540 emi_addr = I217_RX_CONFIG; 9541 rv = wm_write_emi_reg_locked(dev, emi_addr, emi_val); 9542 9543 if (sc->sc_type >= WM_T_PCH_LPT) { 9544 uint16_t phy_reg; 9545 9546 sc->phy.readreg_locked(dev, 2, 9547 I217_PLL_CLOCK_GATE_REG, &phy_reg); 9548 phy_reg &= ~I217_PLL_CLOCK_GATE_MASK; 9549 if (speed == STATUS_SPEED_100 9550 || speed == STATUS_SPEED_10) 9551 phy_reg |= 0x3e8; 9552 else 9553 phy_reg |= 0xfa; 9554 sc->phy.writereg_locked(dev, 2, 9555 I217_PLL_CLOCK_GATE_REG, phy_reg); 9556 9557 if (speed == STATUS_SPEED_1000) { 9558 sc->phy.readreg_locked(dev, 2, 9559 HV_PM_CTRL, &phy_reg); 9560 9561 phy_reg |= HV_PM_CTRL_K1_CLK_REQ; 9562 9563 sc->phy.writereg_locked(dev, 2, 9564 HV_PM_CTRL, phy_reg); 9565 } 9566 } 9567 sc->phy.release(sc); 9568 9569 if (rv) 9570 return; 9571 9572 if (sc->sc_type >= WM_T_PCH_SPT) { 9573 uint16_t data, ptr_gap; 9574 9575 if (speed == STATUS_SPEED_1000) { 9576 rv = sc->phy.acquire(sc); 9577 if (rv) 9578 return; 9579 9580 rv = sc->phy.readreg_locked(dev, 2, 9581 I82579_UNKNOWN1, &data); 9582 if (rv) { 9583 sc->phy.release(sc); 9584 return; 9585 } 9586 9587 ptr_gap = (data & (0x3ff << 2)) >> 2; 9588 if (ptr_gap < 0x18) { 9589 data &= ~(0x3ff << 2); 9590 data |= (0x18 << 2); 9591 rv = sc->phy.writereg_locked(dev, 9592 2, I82579_UNKNOWN1, data); 9593 } 9594 sc->phy.release(sc); 9595 if (rv) 9596 return; 9597 } else { 9598 rv = sc->phy.acquire(sc); 9599 if (rv) 9600 return; 9601 9602 rv = sc->phy.writereg_locked(dev, 2, 9603 I82579_UNKNOWN1, 0xc023); 9604 sc->phy.release(sc); 9605 if (rv) 9606 return; 9607 9608 } 9609 } 9610 } 9611 9612 /* 9613 * I217 Packet Loss issue: 9614 * ensure that FEXTNVM4 Beacon Duration is set correctly 9615 * on power up. 9616 * Set the Beacon Duration for I217 to 8 usec 9617 */ 9618 if (sc->sc_type >= WM_T_PCH_LPT) { 9619 reg = CSR_READ(sc, WMREG_FEXTNVM4); 9620 reg &= ~FEXTNVM4_BEACON_DURATION; 9621 reg |= FEXTNVM4_BEACON_DURATION_8US; 9622 CSR_WRITE(sc, WMREG_FEXTNVM4, reg); 9623 } 9624 9625 /* Work-around I218 hang issue */ 9626 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM) || 9627 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V) || 9628 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM3) || 9629 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V3)) 9630 wm_k1_workaround_lpt_lp(sc, link); 9631 9632 if (sc->sc_type >= WM_T_PCH_LPT) { 9633 /* 9634 * Set platform power management values for Latency 9635 * Tolerance Reporting (LTR) 9636 */ 9637 wm_platform_pm_pch_lpt(sc, 9638 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0)); 9639 } 9640 9641 /* Clear link partner's EEE ability */ 9642 sc->eee_lp_ability = 0; 9643 9644 /* FEXTNVM6 K1-off workaround */ 9645 if (sc->sc_type == WM_T_PCH_SPT) { 9646 reg = CSR_READ(sc, WMREG_FEXTNVM6); 9647 if (CSR_READ(sc, WMREG_PCIEANACFG) & FEXTNVM6_K1_OFF_ENABLE) 9648 reg |= FEXTNVM6_K1_OFF_ENABLE; 9649 else 9650 reg &= ~FEXTNVM6_K1_OFF_ENABLE; 9651 CSR_WRITE(sc, WMREG_FEXTNVM6, reg); 9652 } 9653 9654 if (!link) 9655 return; 9656 9657 switch (sc->sc_type) { 9658 case WM_T_PCH2: 9659 wm_k1_workaround_lv(sc); 9660 /* FALLTHROUGH */ 9661 case WM_T_PCH: 9662 if (sc->sc_phytype == WMPHY_82578) 9663 wm_link_stall_workaround_hv(sc); 9664 break; 9665 default: 9666 break; 9667 } 9668 9669 /* Enable/Disable EEE after link up */ 9670 if (sc->sc_phytype > WMPHY_82579) 9671 wm_set_eee_pchlan(sc); 9672 } 9673 9674 /* 9675 * wm_linkintr_tbi: 9676 * 9677 * Helper; handle link interrupts for TBI mode. 9678 */ 9679 static void 9680 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr) 9681 { 9682 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9683 uint32_t status; 9684 9685 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 9686 __func__)); 9687 9688 status = CSR_READ(sc, WMREG_STATUS); 9689 if (icr & ICR_LSC) { 9690 wm_check_for_link(sc); 9691 if (status & STATUS_LU) { 9692 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n", 9693 device_xname(sc->sc_dev), 9694 (status & STATUS_FD) ? "FDX" : "HDX")); 9695 /* 9696 * NOTE: CTRL will update TFCE and RFCE automatically, 9697 * so we should update sc->sc_ctrl 9698 */ 9699 9700 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 9701 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 9702 sc->sc_fcrtl &= ~FCRTL_XONE; 9703 if (status & STATUS_FD) 9704 sc->sc_tctl |= 9705 TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 9706 else 9707 sc->sc_tctl |= 9708 TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 9709 if (sc->sc_ctrl & CTRL_TFCE) 9710 sc->sc_fcrtl |= FCRTL_XONE; 9711 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 9712 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 9713 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl); 9714 sc->sc_tbi_linkup = 1; 9715 if_link_state_change(ifp, LINK_STATE_UP); 9716 } else { 9717 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 9718 device_xname(sc->sc_dev))); 9719 sc->sc_tbi_linkup = 0; 9720 if_link_state_change(ifp, LINK_STATE_DOWN); 9721 } 9722 /* Update LED */ 9723 wm_tbi_serdes_set_linkled(sc); 9724 } else if (icr & ICR_RXSEQ) 9725 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: Receive sequence error\n", 9726 device_xname(sc->sc_dev))); 9727 } 9728 9729 /* 9730 * wm_linkintr_serdes: 9731 * 9732 * Helper; handle link interrupts for TBI mode. 9733 */ 9734 static void 9735 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr) 9736 { 9737 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9738 struct mii_data *mii = &sc->sc_mii; 9739 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 9740 uint32_t pcs_adv, pcs_lpab, reg; 9741 9742 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 9743 __func__)); 9744 9745 if (icr & ICR_LSC) { 9746 /* Check PCS */ 9747 reg = CSR_READ(sc, WMREG_PCS_LSTS); 9748 if ((reg & PCS_LSTS_LINKOK) != 0) { 9749 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up\n", 9750 device_xname(sc->sc_dev))); 9751 mii->mii_media_status |= IFM_ACTIVE; 9752 sc->sc_tbi_linkup = 1; 9753 if_link_state_change(ifp, LINK_STATE_UP); 9754 } else { 9755 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 9756 device_xname(sc->sc_dev))); 9757 mii->mii_media_status |= IFM_NONE; 9758 sc->sc_tbi_linkup = 0; 9759 if_link_state_change(ifp, LINK_STATE_DOWN); 9760 wm_tbi_serdes_set_linkled(sc); 9761 return; 9762 } 9763 mii->mii_media_active |= IFM_1000_SX; 9764 if ((reg & PCS_LSTS_FDX) != 0) 9765 mii->mii_media_active |= IFM_FDX; 9766 else 9767 mii->mii_media_active |= IFM_HDX; 9768 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 9769 /* Check flow */ 9770 reg = CSR_READ(sc, WMREG_PCS_LSTS); 9771 if ((reg & PCS_LSTS_AN_COMP) == 0) { 9772 DPRINTF(sc, WM_DEBUG_LINK, 9773 ("XXX LINKOK but not ACOMP\n")); 9774 return; 9775 } 9776 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV); 9777 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB); 9778 DPRINTF(sc, WM_DEBUG_LINK, 9779 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab)); 9780 if ((pcs_adv & TXCW_SYM_PAUSE) 9781 && (pcs_lpab & TXCW_SYM_PAUSE)) { 9782 mii->mii_media_active |= IFM_FLOW 9783 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 9784 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0) 9785 && (pcs_adv & TXCW_ASYM_PAUSE) 9786 && (pcs_lpab & TXCW_SYM_PAUSE) 9787 && (pcs_lpab & TXCW_ASYM_PAUSE)) 9788 mii->mii_media_active |= IFM_FLOW 9789 | IFM_ETH_TXPAUSE; 9790 else if ((pcs_adv & TXCW_SYM_PAUSE) 9791 && (pcs_adv & TXCW_ASYM_PAUSE) 9792 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0) 9793 && (pcs_lpab & TXCW_ASYM_PAUSE)) 9794 mii->mii_media_active |= IFM_FLOW 9795 | IFM_ETH_RXPAUSE; 9796 } 9797 /* Update LED */ 9798 wm_tbi_serdes_set_linkled(sc); 9799 } else 9800 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: Receive sequence error\n", 9801 device_xname(sc->sc_dev))); 9802 } 9803 9804 /* 9805 * wm_linkintr: 9806 * 9807 * Helper; handle link interrupts. 9808 */ 9809 static void 9810 wm_linkintr(struct wm_softc *sc, uint32_t icr) 9811 { 9812 9813 KASSERT(WM_CORE_LOCKED(sc)); 9814 9815 if (sc->sc_flags & WM_F_HAS_MII) 9816 wm_linkintr_gmii(sc, icr); 9817 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES) 9818 && ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211))) 9819 wm_linkintr_serdes(sc, icr); 9820 else 9821 wm_linkintr_tbi(sc, icr); 9822 } 9823 9824 9825 static inline void 9826 wm_sched_handle_queue(struct wm_softc *sc, struct wm_queue *wmq) 9827 { 9828 9829 if (wmq->wmq_txrx_use_workqueue) 9830 workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie, curcpu()); 9831 else 9832 softint_schedule(wmq->wmq_si); 9833 } 9834 9835 static inline void 9836 wm_legacy_intr_disable(struct wm_softc *sc) 9837 { 9838 9839 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 9840 } 9841 9842 static inline void 9843 wm_legacy_intr_enable(struct wm_softc *sc) 9844 { 9845 9846 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr); 9847 } 9848 9849 /* 9850 * wm_intr_legacy: 9851 * 9852 * Interrupt service routine for INTx and MSI. 9853 */ 9854 static int 9855 wm_intr_legacy(void *arg) 9856 { 9857 struct wm_softc *sc = arg; 9858 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9859 struct wm_queue *wmq = &sc->sc_queue[0]; 9860 struct wm_txqueue *txq = &wmq->wmq_txq; 9861 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 9862 u_int txlimit = sc->sc_tx_intr_process_limit; 9863 u_int rxlimit = sc->sc_rx_intr_process_limit; 9864 uint32_t icr, rndval = 0; 9865 bool more = false; 9866 9867 icr = CSR_READ(sc, WMREG_ICR); 9868 if ((icr & sc->sc_icr) == 0) 9869 return 0; 9870 9871 DPRINTF(sc, WM_DEBUG_TX, 9872 ("%s: INTx: got intr\n",device_xname(sc->sc_dev))); 9873 if (rndval == 0) 9874 rndval = icr; 9875 9876 mutex_enter(rxq->rxq_lock); 9877 9878 if (rxq->rxq_stopping) { 9879 mutex_exit(rxq->rxq_lock); 9880 return 1; 9881 } 9882 9883 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS) 9884 if (icr & (ICR_RXDMT0 | ICR_RXT0)) { 9885 DPRINTF(sc, WM_DEBUG_RX, 9886 ("%s: RX: got Rx intr 0x%08x\n", 9887 device_xname(sc->sc_dev), 9888 icr & (ICR_RXDMT0 | ICR_RXT0))); 9889 WM_Q_EVCNT_INCR(rxq, intr); 9890 } 9891 #endif 9892 /* 9893 * wm_rxeof() does *not* call upper layer functions directly, 9894 * as if_percpuq_enqueue() just call softint_schedule(). 9895 * So, we can call wm_rxeof() in interrupt context. 9896 */ 9897 more = wm_rxeof(rxq, rxlimit); 9898 9899 mutex_exit(rxq->rxq_lock); 9900 mutex_enter(txq->txq_lock); 9901 9902 if (txq->txq_stopping) { 9903 mutex_exit(txq->txq_lock); 9904 return 1; 9905 } 9906 9907 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS) 9908 if (icr & ICR_TXDW) { 9909 DPRINTF(sc, WM_DEBUG_TX, 9910 ("%s: TX: got TXDW interrupt\n", 9911 device_xname(sc->sc_dev))); 9912 WM_Q_EVCNT_INCR(txq, txdw); 9913 } 9914 #endif 9915 more |= wm_txeof(txq, txlimit); 9916 if (!IF_IS_EMPTY(&ifp->if_snd)) 9917 more = true; 9918 9919 mutex_exit(txq->txq_lock); 9920 WM_CORE_LOCK(sc); 9921 9922 if (sc->sc_core_stopping) { 9923 WM_CORE_UNLOCK(sc); 9924 return 1; 9925 } 9926 9927 if (icr & (ICR_LSC | ICR_RXSEQ)) { 9928 WM_EVCNT_INCR(&sc->sc_ev_linkintr); 9929 wm_linkintr(sc, icr); 9930 } 9931 if ((icr & ICR_GPI(0)) != 0) 9932 device_printf(sc->sc_dev, "got module interrupt\n"); 9933 9934 WM_CORE_UNLOCK(sc); 9935 9936 if (icr & ICR_RXO) { 9937 #if defined(WM_DEBUG) 9938 log(LOG_WARNING, "%s: Receive overrun\n", 9939 device_xname(sc->sc_dev)); 9940 #endif /* defined(WM_DEBUG) */ 9941 } 9942 9943 rnd_add_uint32(&sc->rnd_source, rndval); 9944 9945 if (more) { 9946 /* Try to get more packets going. */ 9947 wm_legacy_intr_disable(sc); 9948 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue; 9949 wm_sched_handle_queue(sc, wmq); 9950 } 9951 9952 return 1; 9953 } 9954 9955 static inline void 9956 wm_txrxintr_disable(struct wm_queue *wmq) 9957 { 9958 struct wm_softc *sc = wmq->wmq_txq.txq_sc; 9959 9960 if (__predict_false(!wm_is_using_msix(sc))) { 9961 return wm_legacy_intr_disable(sc); 9962 } 9963 9964 if (sc->sc_type == WM_T_82574) 9965 CSR_WRITE(sc, WMREG_IMC, 9966 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id)); 9967 else if (sc->sc_type == WM_T_82575) 9968 CSR_WRITE(sc, WMREG_EIMC, 9969 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id)); 9970 else 9971 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx); 9972 } 9973 9974 static inline void 9975 wm_txrxintr_enable(struct wm_queue *wmq) 9976 { 9977 struct wm_softc *sc = wmq->wmq_txq.txq_sc; 9978 9979 wm_itrs_calculate(sc, wmq); 9980 9981 if (__predict_false(!wm_is_using_msix(sc))) { 9982 return wm_legacy_intr_enable(sc); 9983 } 9984 9985 /* 9986 * ICR_OTHER which is disabled in wm_linkintr_msix() is enabled here. 9987 * There is no need to care about which of RXQ(0) and RXQ(1) enable 9988 * ICR_OTHER in first, because each RXQ/TXQ interrupt is disabled 9989 * while each wm_handle_queue(wmq) is runnig. 9990 */ 9991 if (sc->sc_type == WM_T_82574) 9992 CSR_WRITE(sc, WMREG_IMS, 9993 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id) | ICR_OTHER); 9994 else if (sc->sc_type == WM_T_82575) 9995 CSR_WRITE(sc, WMREG_EIMS, 9996 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id)); 9997 else 9998 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx); 9999 } 10000 10001 static int 10002 wm_txrxintr_msix(void *arg) 10003 { 10004 struct wm_queue *wmq = arg; 10005 struct wm_txqueue *txq = &wmq->wmq_txq; 10006 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 10007 struct wm_softc *sc = txq->txq_sc; 10008 u_int txlimit = sc->sc_tx_intr_process_limit; 10009 u_int rxlimit = sc->sc_rx_intr_process_limit; 10010 bool txmore; 10011 bool rxmore; 10012 10013 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id); 10014 10015 DPRINTF(sc, WM_DEBUG_TX, 10016 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev))); 10017 10018 wm_txrxintr_disable(wmq); 10019 10020 mutex_enter(txq->txq_lock); 10021 10022 if (txq->txq_stopping) { 10023 mutex_exit(txq->txq_lock); 10024 return 1; 10025 } 10026 10027 WM_Q_EVCNT_INCR(txq, txdw); 10028 txmore = wm_txeof(txq, txlimit); 10029 /* wm_deferred start() is done in wm_handle_queue(). */ 10030 mutex_exit(txq->txq_lock); 10031 10032 DPRINTF(sc, WM_DEBUG_RX, 10033 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev))); 10034 mutex_enter(rxq->rxq_lock); 10035 10036 if (rxq->rxq_stopping) { 10037 mutex_exit(rxq->rxq_lock); 10038 return 1; 10039 } 10040 10041 WM_Q_EVCNT_INCR(rxq, intr); 10042 rxmore = wm_rxeof(rxq, rxlimit); 10043 mutex_exit(rxq->rxq_lock); 10044 10045 wm_itrs_writereg(sc, wmq); 10046 10047 if (txmore || rxmore) { 10048 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue; 10049 wm_sched_handle_queue(sc, wmq); 10050 } else 10051 wm_txrxintr_enable(wmq); 10052 10053 return 1; 10054 } 10055 10056 static void 10057 wm_handle_queue(void *arg) 10058 { 10059 struct wm_queue *wmq = arg; 10060 struct wm_txqueue *txq = &wmq->wmq_txq; 10061 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 10062 struct wm_softc *sc = txq->txq_sc; 10063 u_int txlimit = sc->sc_tx_process_limit; 10064 u_int rxlimit = sc->sc_rx_process_limit; 10065 bool txmore; 10066 bool rxmore; 10067 10068 mutex_enter(txq->txq_lock); 10069 if (txq->txq_stopping) { 10070 mutex_exit(txq->txq_lock); 10071 return; 10072 } 10073 txmore = wm_txeof(txq, txlimit); 10074 wm_deferred_start_locked(txq); 10075 mutex_exit(txq->txq_lock); 10076 10077 mutex_enter(rxq->rxq_lock); 10078 if (rxq->rxq_stopping) { 10079 mutex_exit(rxq->rxq_lock); 10080 return; 10081 } 10082 WM_Q_EVCNT_INCR(rxq, defer); 10083 rxmore = wm_rxeof(rxq, rxlimit); 10084 mutex_exit(rxq->rxq_lock); 10085 10086 if (txmore || rxmore) { 10087 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue; 10088 wm_sched_handle_queue(sc, wmq); 10089 } else 10090 wm_txrxintr_enable(wmq); 10091 } 10092 10093 static void 10094 wm_handle_queue_work(struct work *wk, void *context) 10095 { 10096 struct wm_queue *wmq = container_of(wk, struct wm_queue, wmq_cookie); 10097 10098 /* 10099 * "enqueued flag" is not required here. 10100 */ 10101 wm_handle_queue(wmq); 10102 } 10103 10104 /* 10105 * wm_linkintr_msix: 10106 * 10107 * Interrupt service routine for link status change for MSI-X. 10108 */ 10109 static int 10110 wm_linkintr_msix(void *arg) 10111 { 10112 struct wm_softc *sc = arg; 10113 uint32_t reg; 10114 bool has_rxo; 10115 10116 reg = CSR_READ(sc, WMREG_ICR); 10117 WM_CORE_LOCK(sc); 10118 DPRINTF(sc, WM_DEBUG_LINK, 10119 ("%s: LINK: got link intr. ICR = %08x\n", 10120 device_xname(sc->sc_dev), reg)); 10121 10122 if (sc->sc_core_stopping) 10123 goto out; 10124 10125 if ((reg & ICR_LSC) != 0) { 10126 WM_EVCNT_INCR(&sc->sc_ev_linkintr); 10127 wm_linkintr(sc, ICR_LSC); 10128 } 10129 if ((reg & ICR_GPI(0)) != 0) 10130 device_printf(sc->sc_dev, "got module interrupt\n"); 10131 10132 /* 10133 * XXX 82574 MSI-X mode workaround 10134 * 10135 * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER 10136 * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor 10137 * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1) 10138 * interrupts by writing WMREG_ICS to process receive packets. 10139 */ 10140 if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) { 10141 #if defined(WM_DEBUG) 10142 log(LOG_WARNING, "%s: Receive overrun\n", 10143 device_xname(sc->sc_dev)); 10144 #endif /* defined(WM_DEBUG) */ 10145 10146 has_rxo = true; 10147 /* 10148 * The RXO interrupt is very high rate when receive traffic is 10149 * high rate. We use polling mode for ICR_OTHER like Tx/Rx 10150 * interrupts. ICR_OTHER will be enabled at the end of 10151 * wm_txrxintr_msix() which is kicked by both ICR_RXQ(0) and 10152 * ICR_RXQ(1) interrupts. 10153 */ 10154 CSR_WRITE(sc, WMREG_IMC, ICR_OTHER); 10155 10156 CSR_WRITE(sc, WMREG_ICS, ICR_RXQ(0) | ICR_RXQ(1)); 10157 } 10158 10159 10160 10161 out: 10162 WM_CORE_UNLOCK(sc); 10163 10164 if (sc->sc_type == WM_T_82574) { 10165 if (!has_rxo) 10166 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC); 10167 else 10168 CSR_WRITE(sc, WMREG_IMS, ICR_LSC); 10169 } else if (sc->sc_type == WM_T_82575) 10170 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER); 10171 else 10172 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx); 10173 10174 return 1; 10175 } 10176 10177 /* 10178 * Media related. 10179 * GMII, SGMII, TBI (and SERDES) 10180 */ 10181 10182 /* Common */ 10183 10184 /* 10185 * wm_tbi_serdes_set_linkled: 10186 * 10187 * Update the link LED on TBI and SERDES devices. 10188 */ 10189 static void 10190 wm_tbi_serdes_set_linkled(struct wm_softc *sc) 10191 { 10192 10193 if (sc->sc_tbi_linkup) 10194 sc->sc_ctrl |= CTRL_SWDPIN(0); 10195 else 10196 sc->sc_ctrl &= ~CTRL_SWDPIN(0); 10197 10198 /* 82540 or newer devices are active low */ 10199 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0; 10200 10201 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10202 } 10203 10204 /* GMII related */ 10205 10206 /* 10207 * wm_gmii_reset: 10208 * 10209 * Reset the PHY. 10210 */ 10211 static void 10212 wm_gmii_reset(struct wm_softc *sc) 10213 { 10214 uint32_t reg; 10215 int rv; 10216 10217 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 10218 device_xname(sc->sc_dev), __func__)); 10219 10220 rv = sc->phy.acquire(sc); 10221 if (rv != 0) { 10222 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 10223 __func__); 10224 return; 10225 } 10226 10227 switch (sc->sc_type) { 10228 case WM_T_82542_2_0: 10229 case WM_T_82542_2_1: 10230 /* null */ 10231 break; 10232 case WM_T_82543: 10233 /* 10234 * With 82543, we need to force speed and duplex on the MAC 10235 * equal to what the PHY speed and duplex configuration is. 10236 * In addition, we need to perform a hardware reset on the PHY 10237 * to take it out of reset. 10238 */ 10239 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX; 10240 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10241 10242 /* The PHY reset pin is active-low. */ 10243 reg = CSR_READ(sc, WMREG_CTRL_EXT); 10244 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) | 10245 CTRL_EXT_SWDPIN(4)); 10246 reg |= CTRL_EXT_SWDPIO(4); 10247 10248 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 10249 CSR_WRITE_FLUSH(sc); 10250 delay(10*1000); 10251 10252 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4)); 10253 CSR_WRITE_FLUSH(sc); 10254 delay(150); 10255 #if 0 10256 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4); 10257 #endif 10258 delay(20*1000); /* XXX extra delay to get PHY ID? */ 10259 break; 10260 case WM_T_82544: /* Reset 10000us */ 10261 case WM_T_82540: 10262 case WM_T_82545: 10263 case WM_T_82545_3: 10264 case WM_T_82546: 10265 case WM_T_82546_3: 10266 case WM_T_82541: 10267 case WM_T_82541_2: 10268 case WM_T_82547: 10269 case WM_T_82547_2: 10270 case WM_T_82571: /* Reset 100us */ 10271 case WM_T_82572: 10272 case WM_T_82573: 10273 case WM_T_82574: 10274 case WM_T_82575: 10275 case WM_T_82576: 10276 case WM_T_82580: 10277 case WM_T_I350: 10278 case WM_T_I354: 10279 case WM_T_I210: 10280 case WM_T_I211: 10281 case WM_T_82583: 10282 case WM_T_80003: 10283 /* Generic reset */ 10284 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 10285 CSR_WRITE_FLUSH(sc); 10286 delay(20000); 10287 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10288 CSR_WRITE_FLUSH(sc); 10289 delay(20000); 10290 10291 if ((sc->sc_type == WM_T_82541) 10292 || (sc->sc_type == WM_T_82541_2) 10293 || (sc->sc_type == WM_T_82547) 10294 || (sc->sc_type == WM_T_82547_2)) { 10295 /* Workaround for igp are done in igp_reset() */ 10296 /* XXX add code to set LED after phy reset */ 10297 } 10298 break; 10299 case WM_T_ICH8: 10300 case WM_T_ICH9: 10301 case WM_T_ICH10: 10302 case WM_T_PCH: 10303 case WM_T_PCH2: 10304 case WM_T_PCH_LPT: 10305 case WM_T_PCH_SPT: 10306 case WM_T_PCH_CNP: 10307 /* Generic reset */ 10308 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 10309 CSR_WRITE_FLUSH(sc); 10310 delay(100); 10311 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10312 CSR_WRITE_FLUSH(sc); 10313 delay(150); 10314 break; 10315 default: 10316 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 10317 __func__); 10318 break; 10319 } 10320 10321 sc->phy.release(sc); 10322 10323 /* get_cfg_done */ 10324 wm_get_cfg_done(sc); 10325 10326 /* Extra setup */ 10327 switch (sc->sc_type) { 10328 case WM_T_82542_2_0: 10329 case WM_T_82542_2_1: 10330 case WM_T_82543: 10331 case WM_T_82544: 10332 case WM_T_82540: 10333 case WM_T_82545: 10334 case WM_T_82545_3: 10335 case WM_T_82546: 10336 case WM_T_82546_3: 10337 case WM_T_82541_2: 10338 case WM_T_82547_2: 10339 case WM_T_82571: 10340 case WM_T_82572: 10341 case WM_T_82573: 10342 case WM_T_82574: 10343 case WM_T_82583: 10344 case WM_T_82575: 10345 case WM_T_82576: 10346 case WM_T_82580: 10347 case WM_T_I350: 10348 case WM_T_I354: 10349 case WM_T_I210: 10350 case WM_T_I211: 10351 case WM_T_80003: 10352 /* Null */ 10353 break; 10354 case WM_T_82541: 10355 case WM_T_82547: 10356 /* XXX Configure actively LED after PHY reset */ 10357 break; 10358 case WM_T_ICH8: 10359 case WM_T_ICH9: 10360 case WM_T_ICH10: 10361 case WM_T_PCH: 10362 case WM_T_PCH2: 10363 case WM_T_PCH_LPT: 10364 case WM_T_PCH_SPT: 10365 case WM_T_PCH_CNP: 10366 wm_phy_post_reset(sc); 10367 break; 10368 default: 10369 panic("%s: unknown type\n", __func__); 10370 break; 10371 } 10372 } 10373 10374 /* 10375 * Setup sc_phytype and mii_{read|write}reg. 10376 * 10377 * To identify PHY type, correct read/write function should be selected. 10378 * To select correct read/write function, PCI ID or MAC type are required 10379 * without accessing PHY registers. 10380 * 10381 * On the first call of this function, PHY ID is not known yet. Check 10382 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the 10383 * result might be incorrect. 10384 * 10385 * In the second call, PHY OUI and model is used to identify PHY type. 10386 * It might not be perfect because of the lack of compared entry, but it 10387 * would be better than the first call. 10388 * 10389 * If the detected new result and previous assumption is different, 10390 * diagnous message will be printed. 10391 */ 10392 static void 10393 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui, 10394 uint16_t phy_model) 10395 { 10396 device_t dev = sc->sc_dev; 10397 struct mii_data *mii = &sc->sc_mii; 10398 uint16_t new_phytype = WMPHY_UNKNOWN; 10399 uint16_t doubt_phytype = WMPHY_UNKNOWN; 10400 mii_readreg_t new_readreg; 10401 mii_writereg_t new_writereg; 10402 bool dodiag = true; 10403 10404 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 10405 device_xname(sc->sc_dev), __func__)); 10406 10407 /* 10408 * 1000BASE-T SFP uses SGMII and the first asumed PHY type is always 10409 * incorrect. So don't print diag output when it's 2nd call. 10410 */ 10411 if ((sc->sc_sfptype != 0) && (phy_oui == 0) && (phy_model == 0)) 10412 dodiag = false; 10413 10414 if (mii->mii_readreg == NULL) { 10415 /* 10416 * This is the first call of this function. For ICH and PCH 10417 * variants, it's difficult to determine the PHY access method 10418 * by sc_type, so use the PCI product ID for some devices. 10419 */ 10420 10421 switch (sc->sc_pcidevid) { 10422 case PCI_PRODUCT_INTEL_PCH_M_LM: 10423 case PCI_PRODUCT_INTEL_PCH_M_LC: 10424 /* 82577 */ 10425 new_phytype = WMPHY_82577; 10426 break; 10427 case PCI_PRODUCT_INTEL_PCH_D_DM: 10428 case PCI_PRODUCT_INTEL_PCH_D_DC: 10429 /* 82578 */ 10430 new_phytype = WMPHY_82578; 10431 break; 10432 case PCI_PRODUCT_INTEL_PCH2_LV_LM: 10433 case PCI_PRODUCT_INTEL_PCH2_LV_V: 10434 /* 82579 */ 10435 new_phytype = WMPHY_82579; 10436 break; 10437 case PCI_PRODUCT_INTEL_82801H_82567V_3: 10438 case PCI_PRODUCT_INTEL_82801I_BM: 10439 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */ 10440 case PCI_PRODUCT_INTEL_82801J_R_BM_LM: 10441 case PCI_PRODUCT_INTEL_82801J_R_BM_LF: 10442 case PCI_PRODUCT_INTEL_82801J_D_BM_LM: 10443 case PCI_PRODUCT_INTEL_82801J_D_BM_LF: 10444 case PCI_PRODUCT_INTEL_82801J_R_BM_V: 10445 /* ICH8, 9, 10 with 82567 */ 10446 new_phytype = WMPHY_BM; 10447 break; 10448 default: 10449 break; 10450 } 10451 } else { 10452 /* It's not the first call. Use PHY OUI and model */ 10453 switch (phy_oui) { 10454 case MII_OUI_ATTANSIC: /* XXX ??? */ 10455 switch (phy_model) { 10456 case 0x0004: /* XXX */ 10457 new_phytype = WMPHY_82578; 10458 break; 10459 default: 10460 break; 10461 } 10462 break; 10463 case MII_OUI_xxMARVELL: 10464 switch (phy_model) { 10465 case MII_MODEL_xxMARVELL_I210: 10466 new_phytype = WMPHY_I210; 10467 break; 10468 case MII_MODEL_xxMARVELL_E1011: 10469 case MII_MODEL_xxMARVELL_E1000_3: 10470 case MII_MODEL_xxMARVELL_E1000_5: 10471 case MII_MODEL_xxMARVELL_E1112: 10472 new_phytype = WMPHY_M88; 10473 break; 10474 case MII_MODEL_xxMARVELL_E1149: 10475 new_phytype = WMPHY_BM; 10476 break; 10477 case MII_MODEL_xxMARVELL_E1111: 10478 case MII_MODEL_xxMARVELL_I347: 10479 case MII_MODEL_xxMARVELL_E1512: 10480 case MII_MODEL_xxMARVELL_E1340M: 10481 case MII_MODEL_xxMARVELL_E1543: 10482 new_phytype = WMPHY_M88; 10483 break; 10484 case MII_MODEL_xxMARVELL_I82563: 10485 new_phytype = WMPHY_GG82563; 10486 break; 10487 default: 10488 break; 10489 } 10490 break; 10491 case MII_OUI_INTEL: 10492 switch (phy_model) { 10493 case MII_MODEL_INTEL_I82577: 10494 new_phytype = WMPHY_82577; 10495 break; 10496 case MII_MODEL_INTEL_I82579: 10497 new_phytype = WMPHY_82579; 10498 break; 10499 case MII_MODEL_INTEL_I217: 10500 new_phytype = WMPHY_I217; 10501 break; 10502 case MII_MODEL_INTEL_I82580: 10503 new_phytype = WMPHY_82580; 10504 break; 10505 case MII_MODEL_INTEL_I350: 10506 new_phytype = WMPHY_I350; 10507 break; 10508 break; 10509 default: 10510 break; 10511 } 10512 break; 10513 case MII_OUI_yyINTEL: 10514 switch (phy_model) { 10515 case MII_MODEL_yyINTEL_I82562G: 10516 case MII_MODEL_yyINTEL_I82562EM: 10517 case MII_MODEL_yyINTEL_I82562ET: 10518 new_phytype = WMPHY_IFE; 10519 break; 10520 case MII_MODEL_yyINTEL_IGP01E1000: 10521 new_phytype = WMPHY_IGP; 10522 break; 10523 case MII_MODEL_yyINTEL_I82566: 10524 new_phytype = WMPHY_IGP_3; 10525 break; 10526 default: 10527 break; 10528 } 10529 break; 10530 default: 10531 break; 10532 } 10533 10534 if (dodiag) { 10535 if (new_phytype == WMPHY_UNKNOWN) 10536 aprint_verbose_dev(dev, 10537 "%s: Unknown PHY model. OUI=%06x, " 10538 "model=%04x\n", __func__, phy_oui, 10539 phy_model); 10540 10541 if ((sc->sc_phytype != WMPHY_UNKNOWN) 10542 && (sc->sc_phytype != new_phytype)) { 10543 aprint_error_dev(dev, "Previously assumed PHY " 10544 "type(%u) was incorrect. PHY type from PHY" 10545 "ID = %u\n", sc->sc_phytype, new_phytype); 10546 } 10547 } 10548 } 10549 10550 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */ 10551 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) { 10552 /* SGMII */ 10553 new_readreg = wm_sgmii_readreg; 10554 new_writereg = wm_sgmii_writereg; 10555 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){ 10556 /* BM2 (phyaddr == 1) */ 10557 if ((sc->sc_phytype != WMPHY_UNKNOWN) 10558 && (new_phytype != WMPHY_BM) 10559 && (new_phytype != WMPHY_UNKNOWN)) 10560 doubt_phytype = new_phytype; 10561 new_phytype = WMPHY_BM; 10562 new_readreg = wm_gmii_bm_readreg; 10563 new_writereg = wm_gmii_bm_writereg; 10564 } else if (sc->sc_type >= WM_T_PCH) { 10565 /* All PCH* use _hv_ */ 10566 new_readreg = wm_gmii_hv_readreg; 10567 new_writereg = wm_gmii_hv_writereg; 10568 } else if (sc->sc_type >= WM_T_ICH8) { 10569 /* non-82567 ICH8, 9 and 10 */ 10570 new_readreg = wm_gmii_i82544_readreg; 10571 new_writereg = wm_gmii_i82544_writereg; 10572 } else if (sc->sc_type >= WM_T_80003) { 10573 /* 80003 */ 10574 if ((sc->sc_phytype != WMPHY_UNKNOWN) 10575 && (new_phytype != WMPHY_GG82563) 10576 && (new_phytype != WMPHY_UNKNOWN)) 10577 doubt_phytype = new_phytype; 10578 new_phytype = WMPHY_GG82563; 10579 new_readreg = wm_gmii_i80003_readreg; 10580 new_writereg = wm_gmii_i80003_writereg; 10581 } else if (sc->sc_type >= WM_T_I210) { 10582 /* I210 and I211 */ 10583 if ((sc->sc_phytype != WMPHY_UNKNOWN) 10584 && (new_phytype != WMPHY_I210) 10585 && (new_phytype != WMPHY_UNKNOWN)) 10586 doubt_phytype = new_phytype; 10587 new_phytype = WMPHY_I210; 10588 new_readreg = wm_gmii_gs40g_readreg; 10589 new_writereg = wm_gmii_gs40g_writereg; 10590 } else if (sc->sc_type >= WM_T_82580) { 10591 /* 82580, I350 and I354 */ 10592 new_readreg = wm_gmii_82580_readreg; 10593 new_writereg = wm_gmii_82580_writereg; 10594 } else if (sc->sc_type >= WM_T_82544) { 10595 /* 82544, 0, [56], [17], 8257[1234] and 82583 */ 10596 new_readreg = wm_gmii_i82544_readreg; 10597 new_writereg = wm_gmii_i82544_writereg; 10598 } else { 10599 new_readreg = wm_gmii_i82543_readreg; 10600 new_writereg = wm_gmii_i82543_writereg; 10601 } 10602 10603 if (new_phytype == WMPHY_BM) { 10604 /* All BM use _bm_ */ 10605 new_readreg = wm_gmii_bm_readreg; 10606 new_writereg = wm_gmii_bm_writereg; 10607 } 10608 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_CNP)) { 10609 /* All PCH* use _hv_ */ 10610 new_readreg = wm_gmii_hv_readreg; 10611 new_writereg = wm_gmii_hv_writereg; 10612 } 10613 10614 /* Diag output */ 10615 if (dodiag) { 10616 if (doubt_phytype != WMPHY_UNKNOWN) 10617 aprint_error_dev(dev, "Assumed new PHY type was " 10618 "incorrect. old = %u, new = %u\n", sc->sc_phytype, 10619 new_phytype); 10620 else if ((sc->sc_phytype != WMPHY_UNKNOWN) 10621 && (sc->sc_phytype != new_phytype)) 10622 aprint_error_dev(dev, "Previously assumed PHY type(%u)" 10623 "was incorrect. New PHY type = %u\n", 10624 sc->sc_phytype, new_phytype); 10625 10626 if ((mii->mii_readreg != NULL) && 10627 (new_phytype == WMPHY_UNKNOWN)) 10628 aprint_error_dev(dev, "PHY type is still unknown.\n"); 10629 10630 if ((mii->mii_readreg != NULL) && 10631 (mii->mii_readreg != new_readreg)) 10632 aprint_error_dev(dev, "Previously assumed PHY " 10633 "read/write function was incorrect.\n"); 10634 } 10635 10636 /* Update now */ 10637 sc->sc_phytype = new_phytype; 10638 mii->mii_readreg = new_readreg; 10639 mii->mii_writereg = new_writereg; 10640 if (new_readreg == wm_gmii_hv_readreg) { 10641 sc->phy.readreg_locked = wm_gmii_hv_readreg_locked; 10642 sc->phy.writereg_locked = wm_gmii_hv_writereg_locked; 10643 } else if (new_readreg == wm_sgmii_readreg) { 10644 sc->phy.readreg_locked = wm_sgmii_readreg_locked; 10645 sc->phy.writereg_locked = wm_sgmii_writereg_locked; 10646 } else if (new_readreg == wm_gmii_i82544_readreg) { 10647 sc->phy.readreg_locked = wm_gmii_i82544_readreg_locked; 10648 sc->phy.writereg_locked = wm_gmii_i82544_writereg_locked; 10649 } 10650 } 10651 10652 /* 10653 * wm_get_phy_id_82575: 10654 * 10655 * Return PHY ID. Return -1 if it failed. 10656 */ 10657 static int 10658 wm_get_phy_id_82575(struct wm_softc *sc) 10659 { 10660 uint32_t reg; 10661 int phyid = -1; 10662 10663 /* XXX */ 10664 if ((sc->sc_flags & WM_F_SGMII) == 0) 10665 return -1; 10666 10667 if (wm_sgmii_uses_mdio(sc)) { 10668 switch (sc->sc_type) { 10669 case WM_T_82575: 10670 case WM_T_82576: 10671 reg = CSR_READ(sc, WMREG_MDIC); 10672 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT; 10673 break; 10674 case WM_T_82580: 10675 case WM_T_I350: 10676 case WM_T_I354: 10677 case WM_T_I210: 10678 case WM_T_I211: 10679 reg = CSR_READ(sc, WMREG_MDICNFG); 10680 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT; 10681 break; 10682 default: 10683 return -1; 10684 } 10685 } 10686 10687 return phyid; 10688 } 10689 10690 /* 10691 * wm_gmii_mediainit: 10692 * 10693 * Initialize media for use on 1000BASE-T devices. 10694 */ 10695 static void 10696 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid) 10697 { 10698 device_t dev = sc->sc_dev; 10699 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 10700 struct mii_data *mii = &sc->sc_mii; 10701 10702 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 10703 device_xname(sc->sc_dev), __func__)); 10704 10705 /* We have GMII. */ 10706 sc->sc_flags |= WM_F_HAS_MII; 10707 10708 if (sc->sc_type == WM_T_80003) 10709 sc->sc_tipg = TIPG_1000T_80003_DFLT; 10710 else 10711 sc->sc_tipg = TIPG_1000T_DFLT; 10712 10713 /* 10714 * Let the chip set speed/duplex on its own based on 10715 * signals from the PHY. 10716 * XXXbouyer - I'm not sure this is right for the 80003, 10717 * the em driver only sets CTRL_SLU here - but it seems to work. 10718 */ 10719 sc->sc_ctrl |= CTRL_SLU; 10720 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10721 10722 /* Initialize our media structures and probe the GMII. */ 10723 mii->mii_ifp = ifp; 10724 10725 mii->mii_statchg = wm_gmii_statchg; 10726 10727 /* get PHY control from SMBus to PCIe */ 10728 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2) 10729 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT) 10730 || (sc->sc_type == WM_T_PCH_CNP)) 10731 wm_init_phy_workarounds_pchlan(sc); 10732 10733 wm_gmii_reset(sc); 10734 10735 sc->sc_ethercom.ec_mii = &sc->sc_mii; 10736 ifmedia_init_with_lock(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange, 10737 wm_gmii_mediastatus, sc->sc_core_lock); 10738 10739 /* Setup internal SGMII PHY for SFP */ 10740 wm_sgmii_sfp_preconfig(sc); 10741 10742 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 10743 || (sc->sc_type == WM_T_82580) 10744 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 10745 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) { 10746 if ((sc->sc_flags & WM_F_SGMII) == 0) { 10747 /* Attach only one port */ 10748 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 10749 MII_OFFSET_ANY, MIIF_DOPAUSE); 10750 } else { 10751 int i, id; 10752 uint32_t ctrl_ext; 10753 10754 id = wm_get_phy_id_82575(sc); 10755 if (id != -1) { 10756 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 10757 id, MII_OFFSET_ANY, MIIF_DOPAUSE); 10758 } 10759 if ((id == -1) 10760 || (LIST_FIRST(&mii->mii_phys) == NULL)) { 10761 /* Power on sgmii phy if it is disabled */ 10762 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 10763 CSR_WRITE(sc, WMREG_CTRL_EXT, 10764 ctrl_ext &~ CTRL_EXT_SWDPIN(3)); 10765 CSR_WRITE_FLUSH(sc); 10766 delay(300*1000); /* XXX too long */ 10767 10768 /* 10769 * From 1 to 8. 10770 * 10771 * I2C access fails with I2C register's ERROR 10772 * bit set, so prevent error message while 10773 * scanning. 10774 */ 10775 sc->phy.no_errprint = true; 10776 for (i = 1; i < 8; i++) 10777 mii_attach(sc->sc_dev, &sc->sc_mii, 10778 0xffffffff, i, MII_OFFSET_ANY, 10779 MIIF_DOPAUSE); 10780 sc->phy.no_errprint = false; 10781 10782 /* Restore previous sfp cage power state */ 10783 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 10784 } 10785 } 10786 } else 10787 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 10788 MII_OFFSET_ANY, MIIF_DOPAUSE); 10789 10790 /* 10791 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call 10792 * wm_set_mdio_slow_mode_hv() for a workaround and retry. 10793 */ 10794 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 10795 || (sc->sc_type == WM_T_PCH_SPT) 10796 || (sc->sc_type == WM_T_PCH_CNP)) 10797 && (LIST_FIRST(&mii->mii_phys) == NULL)) { 10798 wm_set_mdio_slow_mode_hv(sc); 10799 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 10800 MII_OFFSET_ANY, MIIF_DOPAUSE); 10801 } 10802 10803 /* 10804 * (For ICH8 variants) 10805 * If PHY detection failed, use BM's r/w function and retry. 10806 */ 10807 if (LIST_FIRST(&mii->mii_phys) == NULL) { 10808 /* if failed, retry with *_bm_* */ 10809 aprint_verbose_dev(dev, "Assumed PHY access function " 10810 "(type = %d) might be incorrect. Use BM and retry.\n", 10811 sc->sc_phytype); 10812 sc->sc_phytype = WMPHY_BM; 10813 mii->mii_readreg = wm_gmii_bm_readreg; 10814 mii->mii_writereg = wm_gmii_bm_writereg; 10815 10816 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 10817 MII_OFFSET_ANY, MIIF_DOPAUSE); 10818 } 10819 10820 if (LIST_FIRST(&mii->mii_phys) == NULL) { 10821 /* Any PHY wasn't find */ 10822 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL); 10823 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE); 10824 sc->sc_phytype = WMPHY_NONE; 10825 } else { 10826 struct mii_softc *child = LIST_FIRST(&mii->mii_phys); 10827 10828 /* 10829 * PHY Found! Check PHY type again by the second call of 10830 * wm_gmii_setup_phytype. 10831 */ 10832 wm_gmii_setup_phytype(sc, child->mii_mpd_oui, 10833 child->mii_mpd_model); 10834 10835 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); 10836 } 10837 } 10838 10839 /* 10840 * wm_gmii_mediachange: [ifmedia interface function] 10841 * 10842 * Set hardware to newly-selected media on a 1000BASE-T device. 10843 */ 10844 static int 10845 wm_gmii_mediachange(struct ifnet *ifp) 10846 { 10847 struct wm_softc *sc = ifp->if_softc; 10848 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 10849 uint32_t reg; 10850 int rc; 10851 10852 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 10853 device_xname(sc->sc_dev), __func__)); 10854 if ((ifp->if_flags & IFF_UP) == 0) 10855 return 0; 10856 10857 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */ 10858 if ((sc->sc_type == WM_T_82580) 10859 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210) 10860 || (sc->sc_type == WM_T_I211)) { 10861 reg = CSR_READ(sc, WMREG_PHPM); 10862 reg &= ~PHPM_GO_LINK_D; 10863 CSR_WRITE(sc, WMREG_PHPM, reg); 10864 } 10865 10866 /* Disable D0 LPLU. */ 10867 wm_lplu_d0_disable(sc); 10868 10869 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD); 10870 sc->sc_ctrl |= CTRL_SLU; 10871 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 10872 || (sc->sc_type > WM_T_82543)) { 10873 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX); 10874 } else { 10875 sc->sc_ctrl &= ~CTRL_ASDE; 10876 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX; 10877 if (ife->ifm_media & IFM_FDX) 10878 sc->sc_ctrl |= CTRL_FD; 10879 switch (IFM_SUBTYPE(ife->ifm_media)) { 10880 case IFM_10_T: 10881 sc->sc_ctrl |= CTRL_SPEED_10; 10882 break; 10883 case IFM_100_TX: 10884 sc->sc_ctrl |= CTRL_SPEED_100; 10885 break; 10886 case IFM_1000_T: 10887 sc->sc_ctrl |= CTRL_SPEED_1000; 10888 break; 10889 case IFM_NONE: 10890 /* There is no specific setting for IFM_NONE */ 10891 break; 10892 default: 10893 panic("wm_gmii_mediachange: bad media 0x%x", 10894 ife->ifm_media); 10895 } 10896 } 10897 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10898 CSR_WRITE_FLUSH(sc); 10899 10900 if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) 10901 wm_serdes_mediachange(ifp); 10902 10903 if (sc->sc_type <= WM_T_82543) 10904 wm_gmii_reset(sc); 10905 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211) 10906 && ((sc->sc_flags & WM_F_SGMII) != 0)) { 10907 /* allow time for SFP cage time to power up phy */ 10908 delay(300 * 1000); 10909 wm_gmii_reset(sc); 10910 } 10911 10912 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO) 10913 return 0; 10914 return rc; 10915 } 10916 10917 /* 10918 * wm_gmii_mediastatus: [ifmedia interface function] 10919 * 10920 * Get the current interface media status on a 1000BASE-T device. 10921 */ 10922 static void 10923 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 10924 { 10925 struct wm_softc *sc = ifp->if_softc; 10926 10927 ether_mediastatus(ifp, ifmr); 10928 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) 10929 | sc->sc_flowflags; 10930 } 10931 10932 #define MDI_IO CTRL_SWDPIN(2) 10933 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */ 10934 #define MDI_CLK CTRL_SWDPIN(3) 10935 10936 static void 10937 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits) 10938 { 10939 uint32_t i, v; 10940 10941 v = CSR_READ(sc, WMREG_CTRL); 10942 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT)); 10943 v |= MDI_DIR | CTRL_SWDPIO(3); 10944 10945 for (i = __BIT(nbits - 1); i != 0; i >>= 1) { 10946 if (data & i) 10947 v |= MDI_IO; 10948 else 10949 v &= ~MDI_IO; 10950 CSR_WRITE(sc, WMREG_CTRL, v); 10951 CSR_WRITE_FLUSH(sc); 10952 delay(10); 10953 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 10954 CSR_WRITE_FLUSH(sc); 10955 delay(10); 10956 CSR_WRITE(sc, WMREG_CTRL, v); 10957 CSR_WRITE_FLUSH(sc); 10958 delay(10); 10959 } 10960 } 10961 10962 static uint16_t 10963 wm_i82543_mii_recvbits(struct wm_softc *sc) 10964 { 10965 uint32_t v, i; 10966 uint16_t data = 0; 10967 10968 v = CSR_READ(sc, WMREG_CTRL); 10969 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT)); 10970 v |= CTRL_SWDPIO(3); 10971 10972 CSR_WRITE(sc, WMREG_CTRL, v); 10973 CSR_WRITE_FLUSH(sc); 10974 delay(10); 10975 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 10976 CSR_WRITE_FLUSH(sc); 10977 delay(10); 10978 CSR_WRITE(sc, WMREG_CTRL, v); 10979 CSR_WRITE_FLUSH(sc); 10980 delay(10); 10981 10982 for (i = 0; i < 16; i++) { 10983 data <<= 1; 10984 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 10985 CSR_WRITE_FLUSH(sc); 10986 delay(10); 10987 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO) 10988 data |= 1; 10989 CSR_WRITE(sc, WMREG_CTRL, v); 10990 CSR_WRITE_FLUSH(sc); 10991 delay(10); 10992 } 10993 10994 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 10995 CSR_WRITE_FLUSH(sc); 10996 delay(10); 10997 CSR_WRITE(sc, WMREG_CTRL, v); 10998 CSR_WRITE_FLUSH(sc); 10999 delay(10); 11000 11001 return data; 11002 } 11003 11004 #undef MDI_IO 11005 #undef MDI_DIR 11006 #undef MDI_CLK 11007 11008 /* 11009 * wm_gmii_i82543_readreg: [mii interface function] 11010 * 11011 * Read a PHY register on the GMII (i82543 version). 11012 */ 11013 static int 11014 wm_gmii_i82543_readreg(device_t dev, int phy, int reg, uint16_t *val) 11015 { 11016 struct wm_softc *sc = device_private(dev); 11017 11018 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32); 11019 wm_i82543_mii_sendbits(sc, reg | (phy << 5) | 11020 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14); 11021 *val = wm_i82543_mii_recvbits(sc) & 0xffff; 11022 11023 DPRINTF(sc, WM_DEBUG_GMII, ("%s: GMII: read phy %d reg %d -> 0x%04hx\n", 11024 device_xname(dev), phy, reg, *val)); 11025 11026 return 0; 11027 } 11028 11029 /* 11030 * wm_gmii_i82543_writereg: [mii interface function] 11031 * 11032 * Write a PHY register on the GMII (i82543 version). 11033 */ 11034 static int 11035 wm_gmii_i82543_writereg(device_t dev, int phy, int reg, uint16_t val) 11036 { 11037 struct wm_softc *sc = device_private(dev); 11038 11039 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32); 11040 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) | 11041 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) | 11042 (MII_COMMAND_START << 30), 32); 11043 11044 return 0; 11045 } 11046 11047 /* 11048 * wm_gmii_mdic_readreg: [mii interface function] 11049 * 11050 * Read a PHY register on the GMII. 11051 */ 11052 static int 11053 wm_gmii_mdic_readreg(device_t dev, int phy, int reg, uint16_t *val) 11054 { 11055 struct wm_softc *sc = device_private(dev); 11056 uint32_t mdic = 0; 11057 int i; 11058 11059 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217) 11060 && (reg > MII_ADDRMASK)) { 11061 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 11062 __func__, sc->sc_phytype, reg); 11063 reg &= MII_ADDRMASK; 11064 } 11065 11066 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) | 11067 MDIC_REGADD(reg)); 11068 11069 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) { 11070 delay(50); 11071 mdic = CSR_READ(sc, WMREG_MDIC); 11072 if (mdic & MDIC_READY) 11073 break; 11074 } 11075 11076 if ((mdic & MDIC_READY) == 0) { 11077 DPRINTF(sc, WM_DEBUG_GMII, 11078 ("%s: MDIC read timed out: phy %d reg %d\n", 11079 device_xname(dev), phy, reg)); 11080 return ETIMEDOUT; 11081 } else if (mdic & MDIC_E) { 11082 /* This is normal if no PHY is present. */ 11083 DPRINTF(sc, WM_DEBUG_GMII, ("%s: MDIC read error: phy %d reg %d\n", 11084 device_xname(sc->sc_dev), phy, reg)); 11085 return -1; 11086 } else 11087 *val = MDIC_DATA(mdic); 11088 11089 /* 11090 * Allow some time after each MDIC transaction to avoid 11091 * reading duplicate data in the next MDIC transaction. 11092 */ 11093 if (sc->sc_type == WM_T_PCH2) 11094 delay(100); 11095 11096 return 0; 11097 } 11098 11099 /* 11100 * wm_gmii_mdic_writereg: [mii interface function] 11101 * 11102 * Write a PHY register on the GMII. 11103 */ 11104 static int 11105 wm_gmii_mdic_writereg(device_t dev, int phy, int reg, uint16_t val) 11106 { 11107 struct wm_softc *sc = device_private(dev); 11108 uint32_t mdic = 0; 11109 int i; 11110 11111 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217) 11112 && (reg > MII_ADDRMASK)) { 11113 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 11114 __func__, sc->sc_phytype, reg); 11115 reg &= MII_ADDRMASK; 11116 } 11117 11118 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) | 11119 MDIC_REGADD(reg) | MDIC_DATA(val)); 11120 11121 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) { 11122 delay(50); 11123 mdic = CSR_READ(sc, WMREG_MDIC); 11124 if (mdic & MDIC_READY) 11125 break; 11126 } 11127 11128 if ((mdic & MDIC_READY) == 0) { 11129 DPRINTF(sc, WM_DEBUG_GMII, 11130 ("%s: MDIC write timed out: phy %d reg %d\n", 11131 device_xname(dev), phy, reg)); 11132 return ETIMEDOUT; 11133 } else if (mdic & MDIC_E) { 11134 DPRINTF(sc, WM_DEBUG_GMII, 11135 ("%s: MDIC write error: phy %d reg %d\n", 11136 device_xname(dev), phy, reg)); 11137 return -1; 11138 } 11139 11140 /* 11141 * Allow some time after each MDIC transaction to avoid 11142 * reading duplicate data in the next MDIC transaction. 11143 */ 11144 if (sc->sc_type == WM_T_PCH2) 11145 delay(100); 11146 11147 return 0; 11148 } 11149 11150 /* 11151 * wm_gmii_i82544_readreg: [mii interface function] 11152 * 11153 * Read a PHY register on the GMII. 11154 */ 11155 static int 11156 wm_gmii_i82544_readreg(device_t dev, int phy, int reg, uint16_t *val) 11157 { 11158 struct wm_softc *sc = device_private(dev); 11159 int rv; 11160 11161 if (sc->phy.acquire(sc)) { 11162 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11163 return -1; 11164 } 11165 11166 rv = wm_gmii_i82544_readreg_locked(dev, phy, reg, val); 11167 11168 sc->phy.release(sc); 11169 11170 return rv; 11171 } 11172 11173 static int 11174 wm_gmii_i82544_readreg_locked(device_t dev, int phy, int reg, uint16_t *val) 11175 { 11176 struct wm_softc *sc = device_private(dev); 11177 int rv; 11178 11179 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 11180 switch (sc->sc_phytype) { 11181 case WMPHY_IGP: 11182 case WMPHY_IGP_2: 11183 case WMPHY_IGP_3: 11184 rv = wm_gmii_mdic_writereg(dev, phy, 11185 IGPHY_PAGE_SELECT, reg); 11186 if (rv != 0) 11187 return rv; 11188 break; 11189 default: 11190 #ifdef WM_DEBUG 11191 device_printf(dev, "%s: PHYTYPE = 0x%x, addr = %02x\n", 11192 __func__, sc->sc_phytype, reg); 11193 #endif 11194 break; 11195 } 11196 } 11197 11198 return wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 11199 } 11200 11201 /* 11202 * wm_gmii_i82544_writereg: [mii interface function] 11203 * 11204 * Write a PHY register on the GMII. 11205 */ 11206 static int 11207 wm_gmii_i82544_writereg(device_t dev, int phy, int reg, uint16_t val) 11208 { 11209 struct wm_softc *sc = device_private(dev); 11210 int rv; 11211 11212 if (sc->phy.acquire(sc)) { 11213 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11214 return -1; 11215 } 11216 11217 rv = wm_gmii_i82544_writereg_locked(dev, phy, reg & MII_ADDRMASK, val); 11218 sc->phy.release(sc); 11219 11220 return rv; 11221 } 11222 11223 static int 11224 wm_gmii_i82544_writereg_locked(device_t dev, int phy, int reg, uint16_t val) 11225 { 11226 struct wm_softc *sc = device_private(dev); 11227 int rv; 11228 11229 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 11230 switch (sc->sc_phytype) { 11231 case WMPHY_IGP: 11232 case WMPHY_IGP_2: 11233 case WMPHY_IGP_3: 11234 rv = wm_gmii_mdic_writereg(dev, phy, 11235 IGPHY_PAGE_SELECT, reg); 11236 if (rv != 0) 11237 return rv; 11238 break; 11239 default: 11240 #ifdef WM_DEBUG 11241 device_printf(dev, "%s: PHYTYPE == 0x%x, addr = %02x", 11242 __func__, sc->sc_phytype, reg); 11243 #endif 11244 break; 11245 } 11246 } 11247 11248 return wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 11249 } 11250 11251 /* 11252 * wm_gmii_i80003_readreg: [mii interface function] 11253 * 11254 * Read a PHY register on the kumeran 11255 * This could be handled by the PHY layer if we didn't have to lock the 11256 * resource ... 11257 */ 11258 static int 11259 wm_gmii_i80003_readreg(device_t dev, int phy, int reg, uint16_t *val) 11260 { 11261 struct wm_softc *sc = device_private(dev); 11262 int page_select; 11263 uint16_t temp, temp2; 11264 int rv = 0; 11265 11266 if (phy != 1) /* Only one PHY on kumeran bus */ 11267 return -1; 11268 11269 if (sc->phy.acquire(sc)) { 11270 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11271 return -1; 11272 } 11273 11274 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG) 11275 page_select = GG82563_PHY_PAGE_SELECT; 11276 else { 11277 /* 11278 * Use Alternative Page Select register to access registers 11279 * 30 and 31. 11280 */ 11281 page_select = GG82563_PHY_PAGE_SELECT_ALT; 11282 } 11283 temp = reg >> GG82563_PAGE_SHIFT; 11284 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0) 11285 goto out; 11286 11287 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) { 11288 /* 11289 * Wait more 200us for a bug of the ready bit in the MDIC 11290 * register. 11291 */ 11292 delay(200); 11293 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2); 11294 if ((rv != 0) || (temp2 != temp)) { 11295 device_printf(dev, "%s failed\n", __func__); 11296 rv = -1; 11297 goto out; 11298 } 11299 delay(200); 11300 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 11301 delay(200); 11302 } else 11303 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 11304 11305 out: 11306 sc->phy.release(sc); 11307 return rv; 11308 } 11309 11310 /* 11311 * wm_gmii_i80003_writereg: [mii interface function] 11312 * 11313 * Write a PHY register on the kumeran. 11314 * This could be handled by the PHY layer if we didn't have to lock the 11315 * resource ... 11316 */ 11317 static int 11318 wm_gmii_i80003_writereg(device_t dev, int phy, int reg, uint16_t val) 11319 { 11320 struct wm_softc *sc = device_private(dev); 11321 int page_select, rv; 11322 uint16_t temp, temp2; 11323 11324 if (phy != 1) /* Only one PHY on kumeran bus */ 11325 return -1; 11326 11327 if (sc->phy.acquire(sc)) { 11328 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11329 return -1; 11330 } 11331 11332 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG) 11333 page_select = GG82563_PHY_PAGE_SELECT; 11334 else { 11335 /* 11336 * Use Alternative Page Select register to access registers 11337 * 30 and 31. 11338 */ 11339 page_select = GG82563_PHY_PAGE_SELECT_ALT; 11340 } 11341 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT; 11342 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0) 11343 goto out; 11344 11345 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) { 11346 /* 11347 * Wait more 200us for a bug of the ready bit in the MDIC 11348 * register. 11349 */ 11350 delay(200); 11351 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2); 11352 if ((rv != 0) || (temp2 != temp)) { 11353 device_printf(dev, "%s failed\n", __func__); 11354 rv = -1; 11355 goto out; 11356 } 11357 delay(200); 11358 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 11359 delay(200); 11360 } else 11361 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 11362 11363 out: 11364 sc->phy.release(sc); 11365 return rv; 11366 } 11367 11368 /* 11369 * wm_gmii_bm_readreg: [mii interface function] 11370 * 11371 * Read a PHY register on the kumeran 11372 * This could be handled by the PHY layer if we didn't have to lock the 11373 * resource ... 11374 */ 11375 static int 11376 wm_gmii_bm_readreg(device_t dev, int phy, int reg, uint16_t *val) 11377 { 11378 struct wm_softc *sc = device_private(dev); 11379 uint16_t page = reg >> BME1000_PAGE_SHIFT; 11380 int rv; 11381 11382 if (sc->phy.acquire(sc)) { 11383 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11384 return -1; 11385 } 11386 11387 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583)) 11388 phy = ((page >= 768) || ((page == 0) && (reg == 25)) 11389 || (reg == 31)) ? 1 : phy; 11390 /* Page 800 works differently than the rest so it has its own func */ 11391 if (page == BM_WUC_PAGE) { 11392 rv = wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false); 11393 goto release; 11394 } 11395 11396 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 11397 if ((phy == 1) && (sc->sc_type != WM_T_82574) 11398 && (sc->sc_type != WM_T_82583)) 11399 rv = wm_gmii_mdic_writereg(dev, phy, 11400 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT); 11401 else 11402 rv = wm_gmii_mdic_writereg(dev, phy, 11403 BME1000_PHY_PAGE_SELECT, page); 11404 if (rv != 0) 11405 goto release; 11406 } 11407 11408 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 11409 11410 release: 11411 sc->phy.release(sc); 11412 return rv; 11413 } 11414 11415 /* 11416 * wm_gmii_bm_writereg: [mii interface function] 11417 * 11418 * Write a PHY register on the kumeran. 11419 * This could be handled by the PHY layer if we didn't have to lock the 11420 * resource ... 11421 */ 11422 static int 11423 wm_gmii_bm_writereg(device_t dev, int phy, int reg, uint16_t val) 11424 { 11425 struct wm_softc *sc = device_private(dev); 11426 uint16_t page = reg >> BME1000_PAGE_SHIFT; 11427 int rv; 11428 11429 if (sc->phy.acquire(sc)) { 11430 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11431 return -1; 11432 } 11433 11434 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583)) 11435 phy = ((page >= 768) || ((page == 0) && (reg == 25)) 11436 || (reg == 31)) ? 1 : phy; 11437 /* Page 800 works differently than the rest so it has its own func */ 11438 if (page == BM_WUC_PAGE) { 11439 rv = wm_access_phy_wakeup_reg_bm(dev, reg, &val, false, false); 11440 goto release; 11441 } 11442 11443 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 11444 if ((phy == 1) && (sc->sc_type != WM_T_82574) 11445 && (sc->sc_type != WM_T_82583)) 11446 rv = wm_gmii_mdic_writereg(dev, phy, 11447 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT); 11448 else 11449 rv = wm_gmii_mdic_writereg(dev, phy, 11450 BME1000_PHY_PAGE_SELECT, page); 11451 if (rv != 0) 11452 goto release; 11453 } 11454 11455 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 11456 11457 release: 11458 sc->phy.release(sc); 11459 return rv; 11460 } 11461 11462 /* 11463 * wm_enable_phy_wakeup_reg_access_bm - enable access to BM wakeup registers 11464 * @dev: pointer to the HW structure 11465 * @phy_reg: pointer to store original contents of BM_WUC_ENABLE_REG 11466 * 11467 * Assumes semaphore already acquired and phy_reg points to a valid memory 11468 * address to store contents of the BM_WUC_ENABLE_REG register. 11469 */ 11470 static int 11471 wm_enable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp) 11472 { 11473 #ifdef WM_DEBUG 11474 struct wm_softc *sc = device_private(dev); 11475 #endif 11476 uint16_t temp; 11477 int rv; 11478 11479 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 11480 device_xname(dev), __func__)); 11481 11482 if (!phy_regp) 11483 return -1; 11484 11485 /* All page select, port ctrl and wakeup registers use phy address 1 */ 11486 11487 /* Select Port Control Registers page */ 11488 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 11489 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT); 11490 if (rv != 0) 11491 return rv; 11492 11493 /* Read WUCE and save it */ 11494 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_ENABLE_REG, phy_regp); 11495 if (rv != 0) 11496 return rv; 11497 11498 /* Enable both PHY wakeup mode and Wakeup register page writes. 11499 * Prevent a power state change by disabling ME and Host PHY wakeup. 11500 */ 11501 temp = *phy_regp; 11502 temp |= BM_WUC_ENABLE_BIT; 11503 temp &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT); 11504 11505 if ((rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, temp)) != 0) 11506 return rv; 11507 11508 /* Select Host Wakeup Registers page - caller now able to write 11509 * registers on the Wakeup registers page 11510 */ 11511 return wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 11512 BM_WUC_PAGE << IGP3_PAGE_SHIFT); 11513 } 11514 11515 /* 11516 * wm_disable_phy_wakeup_reg_access_bm - disable access to BM wakeup regs 11517 * @dev: pointer to the HW structure 11518 * @phy_reg: pointer to original contents of BM_WUC_ENABLE_REG 11519 * 11520 * Restore BM_WUC_ENABLE_REG to its original value. 11521 * 11522 * Assumes semaphore already acquired and *phy_reg is the contents of the 11523 * BM_WUC_ENABLE_REG before register(s) on BM_WUC_PAGE were accessed by 11524 * caller. 11525 */ 11526 static int 11527 wm_disable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp) 11528 { 11529 #ifdef WM_DEBUG 11530 struct wm_softc *sc = device_private(dev); 11531 #endif 11532 11533 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 11534 device_xname(dev), __func__)); 11535 11536 if (!phy_regp) 11537 return -1; 11538 11539 /* Select Port Control Registers page */ 11540 wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 11541 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT); 11542 11543 /* Restore 769.17 to its original value */ 11544 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, *phy_regp); 11545 11546 return 0; 11547 } 11548 11549 /* 11550 * wm_access_phy_wakeup_reg_bm - Read/write BM PHY wakeup register 11551 * @sc: pointer to the HW structure 11552 * @offset: register offset to be read or written 11553 * @val: pointer to the data to read or write 11554 * @rd: determines if operation is read or write 11555 * @page_set: BM_WUC_PAGE already set and access enabled 11556 * 11557 * Read the PHY register at offset and store the retrieved information in 11558 * data, or write data to PHY register at offset. Note the procedure to 11559 * access the PHY wakeup registers is different than reading the other PHY 11560 * registers. It works as such: 11561 * 1) Set 769.17.2 (page 769, register 17, bit 2) = 1 11562 * 2) Set page to 800 for host (801 if we were manageability) 11563 * 3) Write the address using the address opcode (0x11) 11564 * 4) Read or write the data using the data opcode (0x12) 11565 * 5) Restore 769.17.2 to its original value 11566 * 11567 * Steps 1 and 2 are done by wm_enable_phy_wakeup_reg_access_bm() and 11568 * step 5 is done by wm_disable_phy_wakeup_reg_access_bm(). 11569 * 11570 * Assumes semaphore is already acquired. When page_set==TRUE, assumes 11571 * the PHY page is set to BM_WUC_PAGE (i.e. a function in the call stack 11572 * is responsible for calls to wm_[enable|disable]_phy_wakeup_reg_bm()). 11573 */ 11574 static int 11575 wm_access_phy_wakeup_reg_bm(device_t dev, int offset, int16_t *val, int rd, 11576 bool page_set) 11577 { 11578 struct wm_softc *sc = device_private(dev); 11579 uint16_t regnum = BM_PHY_REG_NUM(offset); 11580 uint16_t page = BM_PHY_REG_PAGE(offset); 11581 uint16_t wuce; 11582 int rv = 0; 11583 11584 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 11585 device_xname(dev), __func__)); 11586 /* XXX Gig must be disabled for MDIO accesses to page 800 */ 11587 if ((sc->sc_type == WM_T_PCH) 11588 && ((CSR_READ(sc, WMREG_PHY_CTRL) & PHY_CTRL_GBE_DIS) == 0)) { 11589 device_printf(dev, 11590 "Attempting to access page %d while gig enabled.\n", page); 11591 } 11592 11593 if (!page_set) { 11594 /* Enable access to PHY wakeup registers */ 11595 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce); 11596 if (rv != 0) { 11597 device_printf(dev, 11598 "%s: Could not enable PHY wakeup reg access\n", 11599 __func__); 11600 return rv; 11601 } 11602 } 11603 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s: Accessing PHY page %d reg 0x%x\n", 11604 device_xname(sc->sc_dev), __func__, page, regnum)); 11605 11606 /* 11607 * 2) Access PHY wakeup register. 11608 * See wm_access_phy_wakeup_reg_bm. 11609 */ 11610 11611 /* Write the Wakeup register page offset value using opcode 0x11 */ 11612 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ADDRESS_OPCODE, regnum); 11613 if (rv != 0) 11614 return rv; 11615 11616 if (rd) { 11617 /* Read the Wakeup register page value using opcode 0x12 */ 11618 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_DATA_OPCODE, val); 11619 } else { 11620 /* Write the Wakeup register page value using opcode 0x12 */ 11621 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_DATA_OPCODE, *val); 11622 } 11623 if (rv != 0) 11624 return rv; 11625 11626 if (!page_set) 11627 rv = wm_disable_phy_wakeup_reg_access_bm(dev, &wuce); 11628 11629 return rv; 11630 } 11631 11632 /* 11633 * wm_gmii_hv_readreg: [mii interface function] 11634 * 11635 * Read a PHY register on the kumeran 11636 * This could be handled by the PHY layer if we didn't have to lock the 11637 * resource ... 11638 */ 11639 static int 11640 wm_gmii_hv_readreg(device_t dev, int phy, int reg, uint16_t *val) 11641 { 11642 struct wm_softc *sc = device_private(dev); 11643 int rv; 11644 11645 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 11646 device_xname(dev), __func__)); 11647 if (sc->phy.acquire(sc)) { 11648 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11649 return -1; 11650 } 11651 11652 rv = wm_gmii_hv_readreg_locked(dev, phy, reg, val); 11653 sc->phy.release(sc); 11654 return rv; 11655 } 11656 11657 static int 11658 wm_gmii_hv_readreg_locked(device_t dev, int phy, int reg, uint16_t *val) 11659 { 11660 uint16_t page = BM_PHY_REG_PAGE(reg); 11661 uint16_t regnum = BM_PHY_REG_NUM(reg); 11662 int rv; 11663 11664 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy; 11665 11666 /* Page 800 works differently than the rest so it has its own func */ 11667 if (page == BM_WUC_PAGE) 11668 return wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false); 11669 11670 /* 11671 * Lower than page 768 works differently than the rest so it has its 11672 * own func 11673 */ 11674 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) { 11675 device_printf(dev, "gmii_hv_readreg!!!\n"); 11676 return -1; 11677 } 11678 11679 /* 11680 * XXX I21[789] documents say that the SMBus Address register is at 11681 * PHY address 01, Page 0 (not 768), Register 26. 11682 */ 11683 if (page == HV_INTC_FC_PAGE_START) 11684 page = 0; 11685 11686 if (regnum > BME1000_MAX_MULTI_PAGE_REG) { 11687 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 11688 page << BME1000_PAGE_SHIFT); 11689 if (rv != 0) 11690 return rv; 11691 } 11692 11693 return wm_gmii_mdic_readreg(dev, phy, regnum & MII_ADDRMASK, val); 11694 } 11695 11696 /* 11697 * wm_gmii_hv_writereg: [mii interface function] 11698 * 11699 * Write a PHY register on the kumeran. 11700 * This could be handled by the PHY layer if we didn't have to lock the 11701 * resource ... 11702 */ 11703 static int 11704 wm_gmii_hv_writereg(device_t dev, int phy, int reg, uint16_t val) 11705 { 11706 struct wm_softc *sc = device_private(dev); 11707 int rv; 11708 11709 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 11710 device_xname(dev), __func__)); 11711 11712 if (sc->phy.acquire(sc)) { 11713 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11714 return -1; 11715 } 11716 11717 rv = wm_gmii_hv_writereg_locked(dev, phy, reg, val); 11718 sc->phy.release(sc); 11719 11720 return rv; 11721 } 11722 11723 static int 11724 wm_gmii_hv_writereg_locked(device_t dev, int phy, int reg, uint16_t val) 11725 { 11726 struct wm_softc *sc = device_private(dev); 11727 uint16_t page = BM_PHY_REG_PAGE(reg); 11728 uint16_t regnum = BM_PHY_REG_NUM(reg); 11729 int rv; 11730 11731 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy; 11732 11733 /* Page 800 works differently than the rest so it has its own func */ 11734 if (page == BM_WUC_PAGE) 11735 return wm_access_phy_wakeup_reg_bm(dev, reg, &val, false, 11736 false); 11737 11738 /* 11739 * Lower than page 768 works differently than the rest so it has its 11740 * own func 11741 */ 11742 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) { 11743 device_printf(dev, "gmii_hv_writereg!!!\n"); 11744 return -1; 11745 } 11746 11747 { 11748 /* 11749 * XXX I21[789] documents say that the SMBus Address register 11750 * is at PHY address 01, Page 0 (not 768), Register 26. 11751 */ 11752 if (page == HV_INTC_FC_PAGE_START) 11753 page = 0; 11754 11755 /* 11756 * XXX Workaround MDIO accesses being disabled after entering 11757 * IEEE Power Down (whenever bit 11 of the PHY control 11758 * register is set) 11759 */ 11760 if (sc->sc_phytype == WMPHY_82578) { 11761 struct mii_softc *child; 11762 11763 child = LIST_FIRST(&sc->sc_mii.mii_phys); 11764 if ((child != NULL) && (child->mii_mpd_rev >= 1) 11765 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0) 11766 && ((val & (1 << 11)) != 0)) { 11767 device_printf(dev, "XXX need workaround\n"); 11768 } 11769 } 11770 11771 if (regnum > BME1000_MAX_MULTI_PAGE_REG) { 11772 rv = wm_gmii_mdic_writereg(dev, 1, 11773 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT); 11774 if (rv != 0) 11775 return rv; 11776 } 11777 } 11778 11779 return wm_gmii_mdic_writereg(dev, phy, regnum & MII_ADDRMASK, val); 11780 } 11781 11782 /* 11783 * wm_gmii_82580_readreg: [mii interface function] 11784 * 11785 * Read a PHY register on the 82580 and I350. 11786 * This could be handled by the PHY layer if we didn't have to lock the 11787 * resource ... 11788 */ 11789 static int 11790 wm_gmii_82580_readreg(device_t dev, int phy, int reg, uint16_t *val) 11791 { 11792 struct wm_softc *sc = device_private(dev); 11793 int rv; 11794 11795 if (sc->phy.acquire(sc) != 0) { 11796 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11797 return -1; 11798 } 11799 11800 #ifdef DIAGNOSTIC 11801 if (reg > MII_ADDRMASK) { 11802 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 11803 __func__, sc->sc_phytype, reg); 11804 reg &= MII_ADDRMASK; 11805 } 11806 #endif 11807 rv = wm_gmii_mdic_readreg(dev, phy, reg, val); 11808 11809 sc->phy.release(sc); 11810 return rv; 11811 } 11812 11813 /* 11814 * wm_gmii_82580_writereg: [mii interface function] 11815 * 11816 * Write a PHY register on the 82580 and I350. 11817 * This could be handled by the PHY layer if we didn't have to lock the 11818 * resource ... 11819 */ 11820 static int 11821 wm_gmii_82580_writereg(device_t dev, int phy, int reg, uint16_t val) 11822 { 11823 struct wm_softc *sc = device_private(dev); 11824 int rv; 11825 11826 if (sc->phy.acquire(sc) != 0) { 11827 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11828 return -1; 11829 } 11830 11831 #ifdef DIAGNOSTIC 11832 if (reg > MII_ADDRMASK) { 11833 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 11834 __func__, sc->sc_phytype, reg); 11835 reg &= MII_ADDRMASK; 11836 } 11837 #endif 11838 rv = wm_gmii_mdic_writereg(dev, phy, reg, val); 11839 11840 sc->phy.release(sc); 11841 return rv; 11842 } 11843 11844 /* 11845 * wm_gmii_gs40g_readreg: [mii interface function] 11846 * 11847 * Read a PHY register on the I2100 and I211. 11848 * This could be handled by the PHY layer if we didn't have to lock the 11849 * resource ... 11850 */ 11851 static int 11852 wm_gmii_gs40g_readreg(device_t dev, int phy, int reg, uint16_t *val) 11853 { 11854 struct wm_softc *sc = device_private(dev); 11855 int page, offset; 11856 int rv; 11857 11858 /* Acquire semaphore */ 11859 if (sc->phy.acquire(sc)) { 11860 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11861 return -1; 11862 } 11863 11864 /* Page select */ 11865 page = reg >> GS40G_PAGE_SHIFT; 11866 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page); 11867 if (rv != 0) 11868 goto release; 11869 11870 /* Read reg */ 11871 offset = reg & GS40G_OFFSET_MASK; 11872 rv = wm_gmii_mdic_readreg(dev, phy, offset, val); 11873 11874 release: 11875 sc->phy.release(sc); 11876 return rv; 11877 } 11878 11879 /* 11880 * wm_gmii_gs40g_writereg: [mii interface function] 11881 * 11882 * Write a PHY register on the I210 and I211. 11883 * This could be handled by the PHY layer if we didn't have to lock the 11884 * resource ... 11885 */ 11886 static int 11887 wm_gmii_gs40g_writereg(device_t dev, int phy, int reg, uint16_t val) 11888 { 11889 struct wm_softc *sc = device_private(dev); 11890 uint16_t page; 11891 int offset, rv; 11892 11893 /* Acquire semaphore */ 11894 if (sc->phy.acquire(sc)) { 11895 device_printf(dev, "%s: failed to get semaphore\n", __func__); 11896 return -1; 11897 } 11898 11899 /* Page select */ 11900 page = reg >> GS40G_PAGE_SHIFT; 11901 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page); 11902 if (rv != 0) 11903 goto release; 11904 11905 /* Write reg */ 11906 offset = reg & GS40G_OFFSET_MASK; 11907 rv = wm_gmii_mdic_writereg(dev, phy, offset, val); 11908 11909 release: 11910 /* Release semaphore */ 11911 sc->phy.release(sc); 11912 return rv; 11913 } 11914 11915 /* 11916 * wm_gmii_statchg: [mii interface function] 11917 * 11918 * Callback from MII layer when media changes. 11919 */ 11920 static void 11921 wm_gmii_statchg(struct ifnet *ifp) 11922 { 11923 struct wm_softc *sc = ifp->if_softc; 11924 struct mii_data *mii = &sc->sc_mii; 11925 11926 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE); 11927 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 11928 sc->sc_fcrtl &= ~FCRTL_XONE; 11929 11930 /* Get flow control negotiation result. */ 11931 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO && 11932 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) { 11933 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK; 11934 mii->mii_media_active &= ~IFM_ETH_FMASK; 11935 } 11936 11937 if (sc->sc_flowflags & IFM_FLOW) { 11938 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) { 11939 sc->sc_ctrl |= CTRL_TFCE; 11940 sc->sc_fcrtl |= FCRTL_XONE; 11941 } 11942 if (sc->sc_flowflags & IFM_ETH_RXPAUSE) 11943 sc->sc_ctrl |= CTRL_RFCE; 11944 } 11945 11946 if (mii->mii_media_active & IFM_FDX) { 11947 DPRINTF(sc, WM_DEBUG_LINK, 11948 ("%s: LINK: statchg: FDX\n", ifp->if_xname)); 11949 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 11950 } else { 11951 DPRINTF(sc, WM_DEBUG_LINK, 11952 ("%s: LINK: statchg: HDX\n", ifp->if_xname)); 11953 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 11954 } 11955 11956 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11957 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 11958 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL 11959 : WMREG_FCRTL, sc->sc_fcrtl); 11960 if (sc->sc_type == WM_T_80003) { 11961 switch (IFM_SUBTYPE(mii->mii_media_active)) { 11962 case IFM_1000_T: 11963 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL, 11964 KUMCTRLSTA_HD_CTRL_1000_DEFAULT); 11965 sc->sc_tipg = TIPG_1000T_80003_DFLT; 11966 break; 11967 default: 11968 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL, 11969 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT); 11970 sc->sc_tipg = TIPG_10_100_80003_DFLT; 11971 break; 11972 } 11973 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg); 11974 } 11975 } 11976 11977 /* kumeran related (80003, ICH* and PCH*) */ 11978 11979 /* 11980 * wm_kmrn_readreg: 11981 * 11982 * Read a kumeran register 11983 */ 11984 static int 11985 wm_kmrn_readreg(struct wm_softc *sc, int reg, uint16_t *val) 11986 { 11987 int rv; 11988 11989 if (sc->sc_type == WM_T_80003) 11990 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 11991 else 11992 rv = sc->phy.acquire(sc); 11993 if (rv != 0) { 11994 device_printf(sc->sc_dev, "%s: failed to get semaphore\n", 11995 __func__); 11996 return rv; 11997 } 11998 11999 rv = wm_kmrn_readreg_locked(sc, reg, val); 12000 12001 if (sc->sc_type == WM_T_80003) 12002 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12003 else 12004 sc->phy.release(sc); 12005 12006 return rv; 12007 } 12008 12009 static int 12010 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg, uint16_t *val) 12011 { 12012 12013 CSR_WRITE(sc, WMREG_KUMCTRLSTA, 12014 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | 12015 KUMCTRLSTA_REN); 12016 CSR_WRITE_FLUSH(sc); 12017 delay(2); 12018 12019 *val = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK; 12020 12021 return 0; 12022 } 12023 12024 /* 12025 * wm_kmrn_writereg: 12026 * 12027 * Write a kumeran register 12028 */ 12029 static int 12030 wm_kmrn_writereg(struct wm_softc *sc, int reg, uint16_t val) 12031 { 12032 int rv; 12033 12034 if (sc->sc_type == WM_T_80003) 12035 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12036 else 12037 rv = sc->phy.acquire(sc); 12038 if (rv != 0) { 12039 device_printf(sc->sc_dev, "%s: failed to get semaphore\n", 12040 __func__); 12041 return rv; 12042 } 12043 12044 rv = wm_kmrn_writereg_locked(sc, reg, val); 12045 12046 if (sc->sc_type == WM_T_80003) 12047 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12048 else 12049 sc->phy.release(sc); 12050 12051 return rv; 12052 } 12053 12054 static int 12055 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, uint16_t val) 12056 { 12057 12058 CSR_WRITE(sc, WMREG_KUMCTRLSTA, 12059 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | val); 12060 12061 return 0; 12062 } 12063 12064 /* 12065 * EMI register related (82579, WMPHY_I217(PCH2 and newer)) 12066 * This access method is different from IEEE MMD. 12067 */ 12068 static int 12069 wm_access_emi_reg_locked(device_t dev, int reg, uint16_t *val, bool rd) 12070 { 12071 struct wm_softc *sc = device_private(dev); 12072 int rv; 12073 12074 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_ADDR, reg); 12075 if (rv != 0) 12076 return rv; 12077 12078 if (rd) 12079 rv = sc->phy.readreg_locked(dev, 2, I82579_EMI_DATA, val); 12080 else 12081 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_DATA, *val); 12082 return rv; 12083 } 12084 12085 static int 12086 wm_read_emi_reg_locked(device_t dev, int reg, uint16_t *val) 12087 { 12088 12089 return wm_access_emi_reg_locked(dev, reg, val, true); 12090 } 12091 12092 static int 12093 wm_write_emi_reg_locked(device_t dev, int reg, uint16_t val) 12094 { 12095 12096 return wm_access_emi_reg_locked(dev, reg, &val, false); 12097 } 12098 12099 /* SGMII related */ 12100 12101 /* 12102 * wm_sgmii_uses_mdio 12103 * 12104 * Check whether the transaction is to the internal PHY or the external 12105 * MDIO interface. Return true if it's MDIO. 12106 */ 12107 static bool 12108 wm_sgmii_uses_mdio(struct wm_softc *sc) 12109 { 12110 uint32_t reg; 12111 bool ismdio = false; 12112 12113 switch (sc->sc_type) { 12114 case WM_T_82575: 12115 case WM_T_82576: 12116 reg = CSR_READ(sc, WMREG_MDIC); 12117 ismdio = ((reg & MDIC_DEST) != 0); 12118 break; 12119 case WM_T_82580: 12120 case WM_T_I350: 12121 case WM_T_I354: 12122 case WM_T_I210: 12123 case WM_T_I211: 12124 reg = CSR_READ(sc, WMREG_MDICNFG); 12125 ismdio = ((reg & MDICNFG_DEST) != 0); 12126 break; 12127 default: 12128 break; 12129 } 12130 12131 return ismdio; 12132 } 12133 12134 /* Setup internal SGMII PHY for SFP */ 12135 static void 12136 wm_sgmii_sfp_preconfig(struct wm_softc *sc) 12137 { 12138 uint16_t id1, id2, phyreg; 12139 int i, rv; 12140 12141 if (((sc->sc_flags & WM_F_SGMII) == 0) 12142 || ((sc->sc_flags & WM_F_SFP) == 0)) 12143 return; 12144 12145 for (i = 0; i < MII_NPHY; i++) { 12146 sc->phy.no_errprint = true; 12147 rv = sc->phy.readreg_locked(sc->sc_dev, i, MII_PHYIDR1, &id1); 12148 if (rv != 0) 12149 continue; 12150 rv = sc->phy.readreg_locked(sc->sc_dev, i, MII_PHYIDR2, &id2); 12151 if (rv != 0) 12152 continue; 12153 if (MII_OUI(id1, id2) != MII_OUI_xxMARVELL) 12154 continue; 12155 sc->phy.no_errprint = false; 12156 12157 sc->phy.readreg_locked(sc->sc_dev, i, MAKPHY_ESSR, &phyreg); 12158 phyreg &= ~(ESSR_SER_ANEG_BYPASS | ESSR_HWCFG_MODE); 12159 phyreg |= ESSR_SGMII_WOC_COPPER; 12160 sc->phy.writereg_locked(sc->sc_dev, i, MAKPHY_ESSR, phyreg); 12161 break; 12162 } 12163 12164 } 12165 12166 /* 12167 * wm_sgmii_readreg: [mii interface function] 12168 * 12169 * Read a PHY register on the SGMII 12170 * This could be handled by the PHY layer if we didn't have to lock the 12171 * resource ... 12172 */ 12173 static int 12174 wm_sgmii_readreg(device_t dev, int phy, int reg, uint16_t *val) 12175 { 12176 struct wm_softc *sc = device_private(dev); 12177 int rv; 12178 12179 if (sc->phy.acquire(sc)) { 12180 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12181 return -1; 12182 } 12183 12184 rv = wm_sgmii_readreg_locked(dev, phy, reg, val); 12185 12186 sc->phy.release(sc); 12187 return rv; 12188 } 12189 12190 static int 12191 wm_sgmii_readreg_locked(device_t dev, int phy, int reg, uint16_t *val) 12192 { 12193 struct wm_softc *sc = device_private(dev); 12194 uint32_t i2ccmd; 12195 int i, rv = 0; 12196 12197 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT) 12198 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_READ; 12199 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 12200 12201 /* Poll the ready bit */ 12202 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 12203 delay(50); 12204 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 12205 if (i2ccmd & I2CCMD_READY) 12206 break; 12207 } 12208 if ((i2ccmd & I2CCMD_READY) == 0) { 12209 device_printf(dev, "I2CCMD Read did not complete\n"); 12210 rv = ETIMEDOUT; 12211 } 12212 if ((i2ccmd & I2CCMD_ERROR) != 0) { 12213 if (!sc->phy.no_errprint) 12214 device_printf(dev, "I2CCMD Error bit set\n"); 12215 rv = EIO; 12216 } 12217 12218 *val = (uint16_t)((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00); 12219 12220 return rv; 12221 } 12222 12223 /* 12224 * wm_sgmii_writereg: [mii interface function] 12225 * 12226 * Write a PHY register on the SGMII. 12227 * This could be handled by the PHY layer if we didn't have to lock the 12228 * resource ... 12229 */ 12230 static int 12231 wm_sgmii_writereg(device_t dev, int phy, int reg, uint16_t val) 12232 { 12233 struct wm_softc *sc = device_private(dev); 12234 int rv; 12235 12236 if (sc->phy.acquire(sc) != 0) { 12237 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12238 return -1; 12239 } 12240 12241 rv = wm_sgmii_writereg_locked(dev, phy, reg, val); 12242 12243 sc->phy.release(sc); 12244 12245 return rv; 12246 } 12247 12248 static int 12249 wm_sgmii_writereg_locked(device_t dev, int phy, int reg, uint16_t val) 12250 { 12251 struct wm_softc *sc = device_private(dev); 12252 uint32_t i2ccmd; 12253 uint16_t swapdata; 12254 int rv = 0; 12255 int i; 12256 12257 /* Swap the data bytes for the I2C interface */ 12258 swapdata = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00); 12259 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT) 12260 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_WRITE | swapdata; 12261 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 12262 12263 /* Poll the ready bit */ 12264 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 12265 delay(50); 12266 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 12267 if (i2ccmd & I2CCMD_READY) 12268 break; 12269 } 12270 if ((i2ccmd & I2CCMD_READY) == 0) { 12271 device_printf(dev, "I2CCMD Write did not complete\n"); 12272 rv = ETIMEDOUT; 12273 } 12274 if ((i2ccmd & I2CCMD_ERROR) != 0) { 12275 device_printf(dev, "I2CCMD Error bit set\n"); 12276 rv = EIO; 12277 } 12278 12279 return rv; 12280 } 12281 12282 /* TBI related */ 12283 12284 static bool 12285 wm_tbi_havesignal(struct wm_softc *sc, uint32_t ctrl) 12286 { 12287 bool sig; 12288 12289 sig = ctrl & CTRL_SWDPIN(1); 12290 12291 /* 12292 * On 82543 and 82544, the CTRL_SWDPIN(1) bit will be 0 if the optics 12293 * detect a signal, 1 if they don't. 12294 */ 12295 if ((sc->sc_type == WM_T_82543) || (sc->sc_type == WM_T_82544)) 12296 sig = !sig; 12297 12298 return sig; 12299 } 12300 12301 /* 12302 * wm_tbi_mediainit: 12303 * 12304 * Initialize media for use on 1000BASE-X devices. 12305 */ 12306 static void 12307 wm_tbi_mediainit(struct wm_softc *sc) 12308 { 12309 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 12310 const char *sep = ""; 12311 12312 if (sc->sc_type < WM_T_82543) 12313 sc->sc_tipg = TIPG_WM_DFLT; 12314 else 12315 sc->sc_tipg = TIPG_LG_DFLT; 12316 12317 sc->sc_tbi_serdes_anegticks = 5; 12318 12319 /* Initialize our media structures */ 12320 sc->sc_mii.mii_ifp = ifp; 12321 sc->sc_ethercom.ec_mii = &sc->sc_mii; 12322 12323 ifp->if_baudrate = IF_Gbps(1); 12324 if (((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) 12325 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) { 12326 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK, 12327 wm_serdes_mediachange, wm_serdes_mediastatus, 12328 sc->sc_core_lock); 12329 } else { 12330 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK, 12331 wm_tbi_mediachange, wm_tbi_mediastatus, sc->sc_core_lock); 12332 } 12333 12334 /* 12335 * SWD Pins: 12336 * 12337 * 0 = Link LED (output) 12338 * 1 = Loss Of Signal (input) 12339 */ 12340 sc->sc_ctrl |= CTRL_SWDPIO(0); 12341 12342 /* XXX Perhaps this is only for TBI */ 12343 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES) 12344 sc->sc_ctrl &= ~CTRL_SWDPIO(1); 12345 12346 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) 12347 sc->sc_ctrl &= ~CTRL_LRST; 12348 12349 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12350 12351 #define ADD(ss, mm, dd) \ 12352 do { \ 12353 aprint_normal("%s%s", sep, ss); \ 12354 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \ 12355 sep = ", "; \ 12356 } while (/*CONSTCOND*/0) 12357 12358 aprint_normal_dev(sc->sc_dev, ""); 12359 12360 if (sc->sc_type == WM_T_I354) { 12361 uint32_t status; 12362 12363 status = CSR_READ(sc, WMREG_STATUS); 12364 if (((status & STATUS_2P5_SKU) != 0) 12365 && ((status & STATUS_2P5_SKU_OVER) == 0)) { 12366 ADD("2500baseKX-FDX", IFM_2500_KX | IFM_FDX,ANAR_X_FD); 12367 } else 12368 ADD("1000baseKX-FDX", IFM_1000_KX | IFM_FDX,ANAR_X_FD); 12369 } else if (sc->sc_type == WM_T_82545) { 12370 /* Only 82545 is LX (XXX except SFP) */ 12371 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD); 12372 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD); 12373 } else if (sc->sc_sfptype != 0) { 12374 /* XXX wm(4) fiber/serdes don't use ifm_data */ 12375 switch (sc->sc_sfptype) { 12376 default: 12377 case SFF_SFP_ETH_FLAGS_1000SX: 12378 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD); 12379 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD); 12380 break; 12381 case SFF_SFP_ETH_FLAGS_1000LX: 12382 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD); 12383 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD); 12384 break; 12385 case SFF_SFP_ETH_FLAGS_1000CX: 12386 ADD("1000baseCX", IFM_1000_CX, ANAR_X_HD); 12387 ADD("1000baseCX-FDX", IFM_1000_CX | IFM_FDX, ANAR_X_FD); 12388 break; 12389 case SFF_SFP_ETH_FLAGS_1000T: 12390 ADD("1000baseT", IFM_1000_T, 0); 12391 ADD("1000baseT-FDX", IFM_1000_T | IFM_FDX, 0); 12392 break; 12393 case SFF_SFP_ETH_FLAGS_100FX: 12394 ADD("100baseFX", IFM_100_FX, ANAR_TX); 12395 ADD("100baseFX-FDX", IFM_100_FX | IFM_FDX, ANAR_TX_FD); 12396 break; 12397 } 12398 } else { 12399 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD); 12400 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD); 12401 } 12402 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD); 12403 aprint_normal("\n"); 12404 12405 #undef ADD 12406 12407 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO); 12408 } 12409 12410 /* 12411 * wm_tbi_mediachange: [ifmedia interface function] 12412 * 12413 * Set hardware to newly-selected media on a 1000BASE-X device. 12414 */ 12415 static int 12416 wm_tbi_mediachange(struct ifnet *ifp) 12417 { 12418 struct wm_softc *sc = ifp->if_softc; 12419 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 12420 uint32_t status, ctrl; 12421 bool signal; 12422 int i; 12423 12424 KASSERT(sc->sc_mediatype != WM_MEDIATYPE_COPPER); 12425 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) { 12426 /* XXX need some work for >= 82571 and < 82575 */ 12427 if (sc->sc_type < WM_T_82575) 12428 return 0; 12429 } 12430 12431 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572) 12432 || (sc->sc_type >= WM_T_82575)) 12433 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK); 12434 12435 sc->sc_ctrl &= ~CTRL_LRST; 12436 sc->sc_txcw = TXCW_ANE; 12437 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 12438 sc->sc_txcw |= TXCW_FD | TXCW_HD; 12439 else if (ife->ifm_media & IFM_FDX) 12440 sc->sc_txcw |= TXCW_FD; 12441 else 12442 sc->sc_txcw |= TXCW_HD; 12443 12444 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0) 12445 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE; 12446 12447 DPRINTF(sc, WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n", 12448 device_xname(sc->sc_dev), sc->sc_txcw)); 12449 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 12450 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12451 CSR_WRITE_FLUSH(sc); 12452 delay(1000); 12453 12454 ctrl = CSR_READ(sc, WMREG_CTRL); 12455 signal = wm_tbi_havesignal(sc, ctrl); 12456 12457 DPRINTF(sc, WM_DEBUG_LINK, ("%s: signal = %d\n", device_xname(sc->sc_dev), 12458 signal)); 12459 12460 if (signal) { 12461 /* Have signal; wait for the link to come up. */ 12462 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) { 12463 delay(10000); 12464 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU) 12465 break; 12466 } 12467 12468 DPRINTF(sc, WM_DEBUG_LINK,("%s: i = %d after waiting for link\n", 12469 device_xname(sc->sc_dev), i)); 12470 12471 status = CSR_READ(sc, WMREG_STATUS); 12472 DPRINTF(sc, WM_DEBUG_LINK, 12473 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n", 12474 device_xname(sc->sc_dev), status, STATUS_LU)); 12475 if (status & STATUS_LU) { 12476 /* Link is up. */ 12477 DPRINTF(sc, WM_DEBUG_LINK, 12478 ("%s: LINK: set media -> link up %s\n", 12479 device_xname(sc->sc_dev), 12480 (status & STATUS_FD) ? "FDX" : "HDX")); 12481 12482 /* 12483 * NOTE: CTRL will update TFCE and RFCE automatically, 12484 * so we should update sc->sc_ctrl 12485 */ 12486 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 12487 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 12488 sc->sc_fcrtl &= ~FCRTL_XONE; 12489 if (status & STATUS_FD) 12490 sc->sc_tctl |= 12491 TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 12492 else 12493 sc->sc_tctl |= 12494 TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 12495 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE) 12496 sc->sc_fcrtl |= FCRTL_XONE; 12497 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 12498 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 12499 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl); 12500 sc->sc_tbi_linkup = 1; 12501 } else { 12502 if (i == WM_LINKUP_TIMEOUT) 12503 wm_check_for_link(sc); 12504 /* Link is down. */ 12505 DPRINTF(sc, WM_DEBUG_LINK, 12506 ("%s: LINK: set media -> link down\n", 12507 device_xname(sc->sc_dev))); 12508 sc->sc_tbi_linkup = 0; 12509 } 12510 } else { 12511 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n", 12512 device_xname(sc->sc_dev))); 12513 sc->sc_tbi_linkup = 0; 12514 } 12515 12516 wm_tbi_serdes_set_linkled(sc); 12517 12518 return 0; 12519 } 12520 12521 /* 12522 * wm_tbi_mediastatus: [ifmedia interface function] 12523 * 12524 * Get the current interface media status on a 1000BASE-X device. 12525 */ 12526 static void 12527 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 12528 { 12529 struct wm_softc *sc = ifp->if_softc; 12530 uint32_t ctrl, status; 12531 12532 ifmr->ifm_status = IFM_AVALID; 12533 ifmr->ifm_active = IFM_ETHER; 12534 12535 status = CSR_READ(sc, WMREG_STATUS); 12536 if ((status & STATUS_LU) == 0) { 12537 ifmr->ifm_active |= IFM_NONE; 12538 return; 12539 } 12540 12541 ifmr->ifm_status |= IFM_ACTIVE; 12542 /* Only 82545 is LX */ 12543 if (sc->sc_type == WM_T_82545) 12544 ifmr->ifm_active |= IFM_1000_LX; 12545 else 12546 ifmr->ifm_active |= IFM_1000_SX; 12547 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD) 12548 ifmr->ifm_active |= IFM_FDX; 12549 else 12550 ifmr->ifm_active |= IFM_HDX; 12551 ctrl = CSR_READ(sc, WMREG_CTRL); 12552 if (ctrl & CTRL_RFCE) 12553 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE; 12554 if (ctrl & CTRL_TFCE) 12555 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE; 12556 } 12557 12558 /* XXX TBI only */ 12559 static int 12560 wm_check_for_link(struct wm_softc *sc) 12561 { 12562 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 12563 uint32_t rxcw; 12564 uint32_t ctrl; 12565 uint32_t status; 12566 bool signal; 12567 12568 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s called\n", 12569 device_xname(sc->sc_dev), __func__)); 12570 12571 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) { 12572 /* XXX need some work for >= 82571 */ 12573 if (sc->sc_type >= WM_T_82571) { 12574 sc->sc_tbi_linkup = 1; 12575 return 0; 12576 } 12577 } 12578 12579 rxcw = CSR_READ(sc, WMREG_RXCW); 12580 ctrl = CSR_READ(sc, WMREG_CTRL); 12581 status = CSR_READ(sc, WMREG_STATUS); 12582 signal = wm_tbi_havesignal(sc, ctrl); 12583 12584 DPRINTF(sc, WM_DEBUG_LINK, 12585 ("%s: %s: signal = %d, status_lu = %d, rxcw_c = %d\n", 12586 device_xname(sc->sc_dev), __func__, signal, 12587 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0))); 12588 12589 /* 12590 * SWDPIN LU RXCW 12591 * 0 0 0 12592 * 0 0 1 (should not happen) 12593 * 0 1 0 (should not happen) 12594 * 0 1 1 (should not happen) 12595 * 1 0 0 Disable autonego and force linkup 12596 * 1 0 1 got /C/ but not linkup yet 12597 * 1 1 0 (linkup) 12598 * 1 1 1 If IFM_AUTO, back to autonego 12599 * 12600 */ 12601 if (signal && ((status & STATUS_LU) == 0) && ((rxcw & RXCW_C) == 0)) { 12602 DPRINTF(sc, WM_DEBUG_LINK, 12603 ("%s: %s: force linkup and fullduplex\n", 12604 device_xname(sc->sc_dev), __func__)); 12605 sc->sc_tbi_linkup = 0; 12606 /* Disable auto-negotiation in the TXCW register */ 12607 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE)); 12608 12609 /* 12610 * Force link-up and also force full-duplex. 12611 * 12612 * NOTE: CTRL was updated TFCE and RFCE automatically, 12613 * so we should update sc->sc_ctrl 12614 */ 12615 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD; 12616 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12617 } else if (((status & STATUS_LU) != 0) 12618 && ((rxcw & RXCW_C) != 0) 12619 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) { 12620 sc->sc_tbi_linkup = 1; 12621 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: go back to autonego\n", 12622 device_xname(sc->sc_dev), 12623 __func__)); 12624 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 12625 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU)); 12626 } else if (signal && ((rxcw & RXCW_C) != 0)) { 12627 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: /C/", 12628 device_xname(sc->sc_dev), __func__)); 12629 } else { 12630 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: linkup %08x,%08x,%08x\n", 12631 device_xname(sc->sc_dev), __func__, rxcw, ctrl, 12632 status)); 12633 } 12634 12635 return 0; 12636 } 12637 12638 /* 12639 * wm_tbi_tick: 12640 * 12641 * Check the link on TBI devices. 12642 * This function acts as mii_tick(). 12643 */ 12644 static void 12645 wm_tbi_tick(struct wm_softc *sc) 12646 { 12647 struct mii_data *mii = &sc->sc_mii; 12648 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 12649 uint32_t status; 12650 12651 KASSERT(WM_CORE_LOCKED(sc)); 12652 12653 status = CSR_READ(sc, WMREG_STATUS); 12654 12655 /* XXX is this needed? */ 12656 (void)CSR_READ(sc, WMREG_RXCW); 12657 (void)CSR_READ(sc, WMREG_CTRL); 12658 12659 /* set link status */ 12660 if ((status & STATUS_LU) == 0) { 12661 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: checklink -> down\n", 12662 device_xname(sc->sc_dev))); 12663 sc->sc_tbi_linkup = 0; 12664 } else if (sc->sc_tbi_linkup == 0) { 12665 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: checklink -> up %s\n", 12666 device_xname(sc->sc_dev), 12667 (status & STATUS_FD) ? "FDX" : "HDX")); 12668 sc->sc_tbi_linkup = 1; 12669 sc->sc_tbi_serdes_ticks = 0; 12670 } 12671 12672 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0) 12673 goto setled; 12674 12675 if ((status & STATUS_LU) == 0) { 12676 sc->sc_tbi_linkup = 0; 12677 /* If the timer expired, retry autonegotiation */ 12678 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 12679 && (++sc->sc_tbi_serdes_ticks 12680 >= sc->sc_tbi_serdes_anegticks)) { 12681 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: EXPIRE\n", 12682 device_xname(sc->sc_dev), __func__)); 12683 sc->sc_tbi_serdes_ticks = 0; 12684 /* 12685 * Reset the link, and let autonegotiation do 12686 * its thing 12687 */ 12688 sc->sc_ctrl |= CTRL_LRST; 12689 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12690 CSR_WRITE_FLUSH(sc); 12691 delay(1000); 12692 sc->sc_ctrl &= ~CTRL_LRST; 12693 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12694 CSR_WRITE_FLUSH(sc); 12695 delay(1000); 12696 CSR_WRITE(sc, WMREG_TXCW, 12697 sc->sc_txcw & ~TXCW_ANE); 12698 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 12699 } 12700 } 12701 12702 setled: 12703 wm_tbi_serdes_set_linkled(sc); 12704 } 12705 12706 /* SERDES related */ 12707 static void 12708 wm_serdes_power_up_link_82575(struct wm_softc *sc) 12709 { 12710 uint32_t reg; 12711 12712 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES) 12713 && ((sc->sc_flags & WM_F_SGMII) == 0)) 12714 return; 12715 12716 /* Enable PCS to turn on link */ 12717 reg = CSR_READ(sc, WMREG_PCS_CFG); 12718 reg |= PCS_CFG_PCS_EN; 12719 CSR_WRITE(sc, WMREG_PCS_CFG, reg); 12720 12721 /* Power up the laser */ 12722 reg = CSR_READ(sc, WMREG_CTRL_EXT); 12723 reg &= ~CTRL_EXT_SWDPIN(3); 12724 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 12725 12726 /* Flush the write to verify completion */ 12727 CSR_WRITE_FLUSH(sc); 12728 delay(1000); 12729 } 12730 12731 static int 12732 wm_serdes_mediachange(struct ifnet *ifp) 12733 { 12734 struct wm_softc *sc = ifp->if_softc; 12735 bool pcs_autoneg = true; /* XXX */ 12736 uint32_t ctrl_ext, pcs_lctl, reg; 12737 12738 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES) 12739 && ((sc->sc_flags & WM_F_SGMII) == 0)) 12740 return 0; 12741 12742 /* XXX Currently, this function is not called on 8257[12] */ 12743 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572) 12744 || (sc->sc_type >= WM_T_82575)) 12745 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK); 12746 12747 /* Power on the sfp cage if present */ 12748 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 12749 ctrl_ext &= ~CTRL_EXT_SWDPIN(3); 12750 ctrl_ext |= CTRL_EXT_I2C_ENA; 12751 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 12752 12753 sc->sc_ctrl |= CTRL_SLU; 12754 12755 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) { 12756 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1); 12757 12758 reg = CSR_READ(sc, WMREG_CONNSW); 12759 reg |= CONNSW_ENRGSRC; 12760 CSR_WRITE(sc, WMREG_CONNSW, reg); 12761 } 12762 12763 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL); 12764 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) { 12765 case CTRL_EXT_LINK_MODE_SGMII: 12766 /* SGMII mode lets the phy handle forcing speed/duplex */ 12767 pcs_autoneg = true; 12768 /* Autoneg time out should be disabled for SGMII mode */ 12769 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT; 12770 break; 12771 case CTRL_EXT_LINK_MODE_1000KX: 12772 pcs_autoneg = false; 12773 /* FALLTHROUGH */ 12774 default: 12775 if ((sc->sc_type == WM_T_82575) 12776 || (sc->sc_type == WM_T_82576)) { 12777 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0) 12778 pcs_autoneg = false; 12779 } 12780 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD 12781 | CTRL_FRCFDX; 12782 12783 /* Set speed of 1000/Full if speed/duplex is forced */ 12784 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL; 12785 } 12786 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12787 12788 pcs_lctl &= ~(PCS_LCTL_AN_ENABLE | PCS_LCTL_FLV_LINK_UP | 12789 PCS_LCTL_FSD | PCS_LCTL_FORCE_LINK); 12790 12791 if (pcs_autoneg) { 12792 /* Set PCS register for autoneg */ 12793 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART; 12794 12795 /* Disable force flow control for autoneg */ 12796 pcs_lctl &= ~PCS_LCTL_FORCE_FC; 12797 12798 /* Configure flow control advertisement for autoneg */ 12799 reg = CSR_READ(sc, WMREG_PCS_ANADV); 12800 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE); 12801 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE; 12802 CSR_WRITE(sc, WMREG_PCS_ANADV, reg); 12803 } else 12804 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC; 12805 12806 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl); 12807 12808 return 0; 12809 } 12810 12811 static void 12812 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 12813 { 12814 struct wm_softc *sc = ifp->if_softc; 12815 struct mii_data *mii = &sc->sc_mii; 12816 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 12817 uint32_t pcs_adv, pcs_lpab, reg; 12818 12819 ifmr->ifm_status = IFM_AVALID; 12820 ifmr->ifm_active = IFM_ETHER; 12821 12822 /* Check PCS */ 12823 reg = CSR_READ(sc, WMREG_PCS_LSTS); 12824 if ((reg & PCS_LSTS_LINKOK) == 0) { 12825 ifmr->ifm_active |= IFM_NONE; 12826 sc->sc_tbi_linkup = 0; 12827 goto setled; 12828 } 12829 12830 sc->sc_tbi_linkup = 1; 12831 ifmr->ifm_status |= IFM_ACTIVE; 12832 if (sc->sc_type == WM_T_I354) { 12833 uint32_t status; 12834 12835 status = CSR_READ(sc, WMREG_STATUS); 12836 if (((status & STATUS_2P5_SKU) != 0) 12837 && ((status & STATUS_2P5_SKU_OVER) == 0)) { 12838 ifmr->ifm_active |= IFM_2500_KX; 12839 } else 12840 ifmr->ifm_active |= IFM_1000_KX; 12841 } else { 12842 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) { 12843 case PCS_LSTS_SPEED_10: 12844 ifmr->ifm_active |= IFM_10_T; /* XXX */ 12845 break; 12846 case PCS_LSTS_SPEED_100: 12847 ifmr->ifm_active |= IFM_100_FX; /* XXX */ 12848 break; 12849 case PCS_LSTS_SPEED_1000: 12850 ifmr->ifm_active |= IFM_1000_SX; /* XXX */ 12851 break; 12852 default: 12853 device_printf(sc->sc_dev, "Unknown speed\n"); 12854 ifmr->ifm_active |= IFM_1000_SX; /* XXX */ 12855 break; 12856 } 12857 } 12858 ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active); 12859 if ((reg & PCS_LSTS_FDX) != 0) 12860 ifmr->ifm_active |= IFM_FDX; 12861 else 12862 ifmr->ifm_active |= IFM_HDX; 12863 mii->mii_media_active &= ~IFM_ETH_FMASK; 12864 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 12865 /* Check flow */ 12866 reg = CSR_READ(sc, WMREG_PCS_LSTS); 12867 if ((reg & PCS_LSTS_AN_COMP) == 0) { 12868 DPRINTF(sc, WM_DEBUG_LINK, ("XXX LINKOK but not ACOMP\n")); 12869 goto setled; 12870 } 12871 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV); 12872 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB); 12873 DPRINTF(sc, WM_DEBUG_LINK, 12874 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab)); 12875 if ((pcs_adv & TXCW_SYM_PAUSE) 12876 && (pcs_lpab & TXCW_SYM_PAUSE)) { 12877 mii->mii_media_active |= IFM_FLOW 12878 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 12879 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0) 12880 && (pcs_adv & TXCW_ASYM_PAUSE) 12881 && (pcs_lpab & TXCW_SYM_PAUSE) 12882 && (pcs_lpab & TXCW_ASYM_PAUSE)) { 12883 mii->mii_media_active |= IFM_FLOW 12884 | IFM_ETH_TXPAUSE; 12885 } else if ((pcs_adv & TXCW_SYM_PAUSE) 12886 && (pcs_adv & TXCW_ASYM_PAUSE) 12887 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0) 12888 && (pcs_lpab & TXCW_ASYM_PAUSE)) { 12889 mii->mii_media_active |= IFM_FLOW 12890 | IFM_ETH_RXPAUSE; 12891 } 12892 } 12893 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) 12894 | (mii->mii_media_active & IFM_ETH_FMASK); 12895 setled: 12896 wm_tbi_serdes_set_linkled(sc); 12897 } 12898 12899 /* 12900 * wm_serdes_tick: 12901 * 12902 * Check the link on serdes devices. 12903 */ 12904 static void 12905 wm_serdes_tick(struct wm_softc *sc) 12906 { 12907 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 12908 struct mii_data *mii = &sc->sc_mii; 12909 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 12910 uint32_t reg; 12911 12912 KASSERT(WM_CORE_LOCKED(sc)); 12913 12914 mii->mii_media_status = IFM_AVALID; 12915 mii->mii_media_active = IFM_ETHER; 12916 12917 /* Check PCS */ 12918 reg = CSR_READ(sc, WMREG_PCS_LSTS); 12919 if ((reg & PCS_LSTS_LINKOK) != 0) { 12920 mii->mii_media_status |= IFM_ACTIVE; 12921 sc->sc_tbi_linkup = 1; 12922 sc->sc_tbi_serdes_ticks = 0; 12923 mii->mii_media_active |= IFM_1000_SX; /* XXX */ 12924 if ((reg & PCS_LSTS_FDX) != 0) 12925 mii->mii_media_active |= IFM_FDX; 12926 else 12927 mii->mii_media_active |= IFM_HDX; 12928 } else { 12929 mii->mii_media_status |= IFM_NONE; 12930 sc->sc_tbi_linkup = 0; 12931 /* If the timer expired, retry autonegotiation */ 12932 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 12933 && (++sc->sc_tbi_serdes_ticks 12934 >= sc->sc_tbi_serdes_anegticks)) { 12935 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: EXPIRE\n", 12936 device_xname(sc->sc_dev), __func__)); 12937 sc->sc_tbi_serdes_ticks = 0; 12938 /* XXX */ 12939 wm_serdes_mediachange(ifp); 12940 } 12941 } 12942 12943 wm_tbi_serdes_set_linkled(sc); 12944 } 12945 12946 /* SFP related */ 12947 12948 static int 12949 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data) 12950 { 12951 uint32_t i2ccmd; 12952 int i; 12953 12954 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ; 12955 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 12956 12957 /* Poll the ready bit */ 12958 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 12959 delay(50); 12960 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 12961 if (i2ccmd & I2CCMD_READY) 12962 break; 12963 } 12964 if ((i2ccmd & I2CCMD_READY) == 0) 12965 return -1; 12966 if ((i2ccmd & I2CCMD_ERROR) != 0) 12967 return -1; 12968 12969 *data = i2ccmd & 0x00ff; 12970 12971 return 0; 12972 } 12973 12974 static uint32_t 12975 wm_sfp_get_media_type(struct wm_softc *sc) 12976 { 12977 uint32_t ctrl_ext; 12978 uint8_t val = 0; 12979 int timeout = 3; 12980 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN; 12981 int rv = -1; 12982 12983 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 12984 ctrl_ext &= ~CTRL_EXT_SWDPIN(3); 12985 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA); 12986 CSR_WRITE_FLUSH(sc); 12987 12988 /* Read SFP module data */ 12989 while (timeout) { 12990 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val); 12991 if (rv == 0) 12992 break; 12993 delay(100*1000); /* XXX too big */ 12994 timeout--; 12995 } 12996 if (rv != 0) 12997 goto out; 12998 12999 switch (val) { 13000 case SFF_SFP_ID_SFF: 13001 aprint_normal_dev(sc->sc_dev, 13002 "Module/Connector soldered to board\n"); 13003 break; 13004 case SFF_SFP_ID_SFP: 13005 sc->sc_flags |= WM_F_SFP; 13006 break; 13007 case SFF_SFP_ID_UNKNOWN: 13008 goto out; 13009 default: 13010 break; 13011 } 13012 13013 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val); 13014 if (rv != 0) 13015 goto out; 13016 13017 sc->sc_sfptype = val; 13018 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0) 13019 mediatype = WM_MEDIATYPE_SERDES; 13020 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0) { 13021 sc->sc_flags |= WM_F_SGMII; 13022 mediatype = WM_MEDIATYPE_COPPER; 13023 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0) { 13024 sc->sc_flags |= WM_F_SGMII; 13025 mediatype = WM_MEDIATYPE_SERDES; 13026 } else { 13027 device_printf(sc->sc_dev, "%s: unknown media type? (0x%hhx)\n", 13028 __func__, sc->sc_sfptype); 13029 sc->sc_sfptype = 0; /* XXX unknown */ 13030 } 13031 13032 out: 13033 /* Restore I2C interface setting */ 13034 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 13035 13036 return mediatype; 13037 } 13038 13039 /* 13040 * NVM related. 13041 * Microwire, SPI (w/wo EERD) and Flash. 13042 */ 13043 13044 /* Both spi and uwire */ 13045 13046 /* 13047 * wm_eeprom_sendbits: 13048 * 13049 * Send a series of bits to the EEPROM. 13050 */ 13051 static void 13052 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits) 13053 { 13054 uint32_t reg; 13055 int x; 13056 13057 reg = CSR_READ(sc, WMREG_EECD); 13058 13059 for (x = nbits; x > 0; x--) { 13060 if (bits & (1U << (x - 1))) 13061 reg |= EECD_DI; 13062 else 13063 reg &= ~EECD_DI; 13064 CSR_WRITE(sc, WMREG_EECD, reg); 13065 CSR_WRITE_FLUSH(sc); 13066 delay(2); 13067 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK); 13068 CSR_WRITE_FLUSH(sc); 13069 delay(2); 13070 CSR_WRITE(sc, WMREG_EECD, reg); 13071 CSR_WRITE_FLUSH(sc); 13072 delay(2); 13073 } 13074 } 13075 13076 /* 13077 * wm_eeprom_recvbits: 13078 * 13079 * Receive a series of bits from the EEPROM. 13080 */ 13081 static void 13082 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits) 13083 { 13084 uint32_t reg, val; 13085 int x; 13086 13087 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI; 13088 13089 val = 0; 13090 for (x = nbits; x > 0; x--) { 13091 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK); 13092 CSR_WRITE_FLUSH(sc); 13093 delay(2); 13094 if (CSR_READ(sc, WMREG_EECD) & EECD_DO) 13095 val |= (1U << (x - 1)); 13096 CSR_WRITE(sc, WMREG_EECD, reg); 13097 CSR_WRITE_FLUSH(sc); 13098 delay(2); 13099 } 13100 *valp = val; 13101 } 13102 13103 /* Microwire */ 13104 13105 /* 13106 * wm_nvm_read_uwire: 13107 * 13108 * Read a word from the EEPROM using the MicroWire protocol. 13109 */ 13110 static int 13111 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 13112 { 13113 uint32_t reg, val; 13114 int i; 13115 13116 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13117 device_xname(sc->sc_dev), __func__)); 13118 13119 if (sc->nvm.acquire(sc) != 0) 13120 return -1; 13121 13122 for (i = 0; i < wordcnt; i++) { 13123 /* Clear SK and DI. */ 13124 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI); 13125 CSR_WRITE(sc, WMREG_EECD, reg); 13126 13127 /* 13128 * XXX: workaround for a bug in qemu-0.12.x and prior 13129 * and Xen. 13130 * 13131 * We use this workaround only for 82540 because qemu's 13132 * e1000 act as 82540. 13133 */ 13134 if (sc->sc_type == WM_T_82540) { 13135 reg |= EECD_SK; 13136 CSR_WRITE(sc, WMREG_EECD, reg); 13137 reg &= ~EECD_SK; 13138 CSR_WRITE(sc, WMREG_EECD, reg); 13139 CSR_WRITE_FLUSH(sc); 13140 delay(2); 13141 } 13142 /* XXX: end of workaround */ 13143 13144 /* Set CHIP SELECT. */ 13145 reg |= EECD_CS; 13146 CSR_WRITE(sc, WMREG_EECD, reg); 13147 CSR_WRITE_FLUSH(sc); 13148 delay(2); 13149 13150 /* Shift in the READ command. */ 13151 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3); 13152 13153 /* Shift in address. */ 13154 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits); 13155 13156 /* Shift out the data. */ 13157 wm_eeprom_recvbits(sc, &val, 16); 13158 data[i] = val & 0xffff; 13159 13160 /* Clear CHIP SELECT. */ 13161 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS; 13162 CSR_WRITE(sc, WMREG_EECD, reg); 13163 CSR_WRITE_FLUSH(sc); 13164 delay(2); 13165 } 13166 13167 sc->nvm.release(sc); 13168 return 0; 13169 } 13170 13171 /* SPI */ 13172 13173 /* 13174 * Set SPI and FLASH related information from the EECD register. 13175 * For 82541 and 82547, the word size is taken from EEPROM. 13176 */ 13177 static int 13178 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc) 13179 { 13180 int size; 13181 uint32_t reg; 13182 uint16_t data; 13183 13184 reg = CSR_READ(sc, WMREG_EECD); 13185 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8; 13186 13187 /* Read the size of NVM from EECD by default */ 13188 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK); 13189 switch (sc->sc_type) { 13190 case WM_T_82541: 13191 case WM_T_82541_2: 13192 case WM_T_82547: 13193 case WM_T_82547_2: 13194 /* Set dummy value to access EEPROM */ 13195 sc->sc_nvm_wordsize = 64; 13196 if (wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data) != 0) { 13197 aprint_error_dev(sc->sc_dev, 13198 "%s: failed to read EEPROM size\n", __func__); 13199 } 13200 reg = data; 13201 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK); 13202 if (size == 0) 13203 size = 6; /* 64 word size */ 13204 else 13205 size += NVM_WORD_SIZE_BASE_SHIFT + 1; 13206 break; 13207 case WM_T_80003: 13208 case WM_T_82571: 13209 case WM_T_82572: 13210 case WM_T_82573: /* SPI case */ 13211 case WM_T_82574: /* SPI case */ 13212 case WM_T_82583: /* SPI case */ 13213 size += NVM_WORD_SIZE_BASE_SHIFT; 13214 if (size > 14) 13215 size = 14; 13216 break; 13217 case WM_T_82575: 13218 case WM_T_82576: 13219 case WM_T_82580: 13220 case WM_T_I350: 13221 case WM_T_I354: 13222 case WM_T_I210: 13223 case WM_T_I211: 13224 size += NVM_WORD_SIZE_BASE_SHIFT; 13225 if (size > 15) 13226 size = 15; 13227 break; 13228 default: 13229 aprint_error_dev(sc->sc_dev, 13230 "%s: unknown device(%d)?\n", __func__, sc->sc_type); 13231 return -1; 13232 break; 13233 } 13234 13235 sc->sc_nvm_wordsize = 1 << size; 13236 13237 return 0; 13238 } 13239 13240 /* 13241 * wm_nvm_ready_spi: 13242 * 13243 * Wait for a SPI EEPROM to be ready for commands. 13244 */ 13245 static int 13246 wm_nvm_ready_spi(struct wm_softc *sc) 13247 { 13248 uint32_t val; 13249 int usec; 13250 13251 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13252 device_xname(sc->sc_dev), __func__)); 13253 13254 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) { 13255 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8); 13256 wm_eeprom_recvbits(sc, &val, 8); 13257 if ((val & SPI_SR_RDY) == 0) 13258 break; 13259 } 13260 if (usec >= SPI_MAX_RETRIES) { 13261 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n"); 13262 return -1; 13263 } 13264 return 0; 13265 } 13266 13267 /* 13268 * wm_nvm_read_spi: 13269 * 13270 * Read a work from the EEPROM using the SPI protocol. 13271 */ 13272 static int 13273 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 13274 { 13275 uint32_t reg, val; 13276 int i; 13277 uint8_t opc; 13278 int rv = 0; 13279 13280 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13281 device_xname(sc->sc_dev), __func__)); 13282 13283 if (sc->nvm.acquire(sc) != 0) 13284 return -1; 13285 13286 /* Clear SK and CS. */ 13287 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS); 13288 CSR_WRITE(sc, WMREG_EECD, reg); 13289 CSR_WRITE_FLUSH(sc); 13290 delay(2); 13291 13292 if ((rv = wm_nvm_ready_spi(sc)) != 0) 13293 goto out; 13294 13295 /* Toggle CS to flush commands. */ 13296 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS); 13297 CSR_WRITE_FLUSH(sc); 13298 delay(2); 13299 CSR_WRITE(sc, WMREG_EECD, reg); 13300 CSR_WRITE_FLUSH(sc); 13301 delay(2); 13302 13303 opc = SPI_OPC_READ; 13304 if (sc->sc_nvm_addrbits == 8 && word >= 128) 13305 opc |= SPI_OPC_A8; 13306 13307 wm_eeprom_sendbits(sc, opc, 8); 13308 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits); 13309 13310 for (i = 0; i < wordcnt; i++) { 13311 wm_eeprom_recvbits(sc, &val, 16); 13312 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8); 13313 } 13314 13315 /* Raise CS and clear SK. */ 13316 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS; 13317 CSR_WRITE(sc, WMREG_EECD, reg); 13318 CSR_WRITE_FLUSH(sc); 13319 delay(2); 13320 13321 out: 13322 sc->nvm.release(sc); 13323 return rv; 13324 } 13325 13326 /* Using with EERD */ 13327 13328 static int 13329 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw) 13330 { 13331 uint32_t attempts = 100000; 13332 uint32_t i, reg = 0; 13333 int32_t done = -1; 13334 13335 for (i = 0; i < attempts; i++) { 13336 reg = CSR_READ(sc, rw); 13337 13338 if (reg & EERD_DONE) { 13339 done = 0; 13340 break; 13341 } 13342 delay(5); 13343 } 13344 13345 return done; 13346 } 13347 13348 static int 13349 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt, uint16_t *data) 13350 { 13351 int i, eerd = 0; 13352 int rv = 0; 13353 13354 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13355 device_xname(sc->sc_dev), __func__)); 13356 13357 if (sc->nvm.acquire(sc) != 0) 13358 return -1; 13359 13360 for (i = 0; i < wordcnt; i++) { 13361 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START; 13362 CSR_WRITE(sc, WMREG_EERD, eerd); 13363 rv = wm_poll_eerd_eewr_done(sc, WMREG_EERD); 13364 if (rv != 0) { 13365 aprint_error_dev(sc->sc_dev, "EERD polling failed: " 13366 "offset=%d. wordcnt=%d\n", offset, wordcnt); 13367 break; 13368 } 13369 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT); 13370 } 13371 13372 sc->nvm.release(sc); 13373 return rv; 13374 } 13375 13376 /* Flash */ 13377 13378 static int 13379 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank) 13380 { 13381 uint32_t eecd; 13382 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1; 13383 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t); 13384 uint32_t nvm_dword = 0; 13385 uint8_t sig_byte = 0; 13386 int rv; 13387 13388 switch (sc->sc_type) { 13389 case WM_T_PCH_SPT: 13390 case WM_T_PCH_CNP: 13391 bank1_offset = sc->sc_ich8_flash_bank_size * 2; 13392 act_offset = ICH_NVM_SIG_WORD * 2; 13393 13394 /* Set bank to 0 in case flash read fails. */ 13395 *bank = 0; 13396 13397 /* Check bank 0 */ 13398 rv = wm_read_ich8_dword(sc, act_offset, &nvm_dword); 13399 if (rv != 0) 13400 return rv; 13401 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8); 13402 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 13403 *bank = 0; 13404 return 0; 13405 } 13406 13407 /* Check bank 1 */ 13408 rv = wm_read_ich8_dword(sc, act_offset + bank1_offset, 13409 &nvm_dword); 13410 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8); 13411 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 13412 *bank = 1; 13413 return 0; 13414 } 13415 aprint_error_dev(sc->sc_dev, 13416 "%s: no valid NVM bank present (%u)\n", __func__, *bank); 13417 return -1; 13418 case WM_T_ICH8: 13419 case WM_T_ICH9: 13420 eecd = CSR_READ(sc, WMREG_EECD); 13421 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) { 13422 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0; 13423 return 0; 13424 } 13425 /* FALLTHROUGH */ 13426 default: 13427 /* Default to 0 */ 13428 *bank = 0; 13429 13430 /* Check bank 0 */ 13431 wm_read_ich8_byte(sc, act_offset, &sig_byte); 13432 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 13433 *bank = 0; 13434 return 0; 13435 } 13436 13437 /* Check bank 1 */ 13438 wm_read_ich8_byte(sc, act_offset + bank1_offset, 13439 &sig_byte); 13440 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 13441 *bank = 1; 13442 return 0; 13443 } 13444 } 13445 13446 DPRINTF(sc, WM_DEBUG_NVM, ("%s: No valid NVM bank present\n", 13447 device_xname(sc->sc_dev))); 13448 return -1; 13449 } 13450 13451 /****************************************************************************** 13452 * This function does initial flash setup so that a new read/write/erase cycle 13453 * can be started. 13454 * 13455 * sc - The pointer to the hw structure 13456 ****************************************************************************/ 13457 static int32_t 13458 wm_ich8_cycle_init(struct wm_softc *sc) 13459 { 13460 uint16_t hsfsts; 13461 int32_t error = 1; 13462 int32_t i = 0; 13463 13464 if (sc->sc_type >= WM_T_PCH_SPT) 13465 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) & 0xffffUL; 13466 else 13467 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 13468 13469 /* May be check the Flash Des Valid bit in Hw status */ 13470 if ((hsfsts & HSFSTS_FLDVAL) == 0) 13471 return error; 13472 13473 /* Clear FCERR in Hw status by writing 1 */ 13474 /* Clear DAEL in Hw status by writing a 1 */ 13475 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL; 13476 13477 if (sc->sc_type >= WM_T_PCH_SPT) 13478 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, hsfsts & 0xffffUL); 13479 else 13480 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 13481 13482 /* 13483 * Either we should have a hardware SPI cycle in progress bit to check 13484 * against, in order to start a new cycle or FDONE bit should be 13485 * changed in the hardware so that it is 1 after hardware reset, which 13486 * can then be used as an indication whether a cycle is in progress or 13487 * has been completed .. we should also have some software semaphore 13488 * mechanism to guard FDONE or the cycle in progress bit so that two 13489 * threads access to those bits can be sequentiallized or a way so that 13490 * 2 threads don't start the cycle at the same time 13491 */ 13492 13493 if ((hsfsts & HSFSTS_FLINPRO) == 0) { 13494 /* 13495 * There is no cycle running at present, so we can start a 13496 * cycle 13497 */ 13498 13499 /* Begin by setting Flash Cycle Done. */ 13500 hsfsts |= HSFSTS_DONE; 13501 if (sc->sc_type >= WM_T_PCH_SPT) 13502 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 13503 hsfsts & 0xffffUL); 13504 else 13505 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 13506 error = 0; 13507 } else { 13508 /* 13509 * Otherwise poll for sometime so the current cycle has a 13510 * chance to end before giving up. 13511 */ 13512 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) { 13513 if (sc->sc_type >= WM_T_PCH_SPT) 13514 hsfsts = ICH8_FLASH_READ32(sc, 13515 ICH_FLASH_HSFSTS) & 0xffffUL; 13516 else 13517 hsfsts = ICH8_FLASH_READ16(sc, 13518 ICH_FLASH_HSFSTS); 13519 if ((hsfsts & HSFSTS_FLINPRO) == 0) { 13520 error = 0; 13521 break; 13522 } 13523 delay(1); 13524 } 13525 if (error == 0) { 13526 /* 13527 * Successful in waiting for previous cycle to timeout, 13528 * now set the Flash Cycle Done. 13529 */ 13530 hsfsts |= HSFSTS_DONE; 13531 if (sc->sc_type >= WM_T_PCH_SPT) 13532 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 13533 hsfsts & 0xffffUL); 13534 else 13535 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, 13536 hsfsts); 13537 } 13538 } 13539 return error; 13540 } 13541 13542 /****************************************************************************** 13543 * This function starts a flash cycle and waits for its completion 13544 * 13545 * sc - The pointer to the hw structure 13546 ****************************************************************************/ 13547 static int32_t 13548 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout) 13549 { 13550 uint16_t hsflctl; 13551 uint16_t hsfsts; 13552 int32_t error = 1; 13553 uint32_t i = 0; 13554 13555 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */ 13556 if (sc->sc_type >= WM_T_PCH_SPT) 13557 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) >> 16; 13558 else 13559 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL); 13560 hsflctl |= HSFCTL_GO; 13561 if (sc->sc_type >= WM_T_PCH_SPT) 13562 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 13563 (uint32_t)hsflctl << 16); 13564 else 13565 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl); 13566 13567 /* Wait till FDONE bit is set to 1 */ 13568 do { 13569 if (sc->sc_type >= WM_T_PCH_SPT) 13570 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) 13571 & 0xffffUL; 13572 else 13573 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 13574 if (hsfsts & HSFSTS_DONE) 13575 break; 13576 delay(1); 13577 i++; 13578 } while (i < timeout); 13579 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0) 13580 error = 0; 13581 13582 return error; 13583 } 13584 13585 /****************************************************************************** 13586 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers. 13587 * 13588 * sc - The pointer to the hw structure 13589 * index - The index of the byte or word to read. 13590 * size - Size of data to read, 1=byte 2=word, 4=dword 13591 * data - Pointer to the word to store the value read. 13592 *****************************************************************************/ 13593 static int32_t 13594 wm_read_ich8_data(struct wm_softc *sc, uint32_t index, 13595 uint32_t size, uint32_t *data) 13596 { 13597 uint16_t hsfsts; 13598 uint16_t hsflctl; 13599 uint32_t flash_linear_address; 13600 uint32_t flash_data = 0; 13601 int32_t error = 1; 13602 int32_t count = 0; 13603 13604 if (size < 1 || size > 4 || data == 0x0 || 13605 index > ICH_FLASH_LINEAR_ADDR_MASK) 13606 return error; 13607 13608 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) + 13609 sc->sc_ich8_flash_base; 13610 13611 do { 13612 delay(1); 13613 /* Steps */ 13614 error = wm_ich8_cycle_init(sc); 13615 if (error) 13616 break; 13617 13618 if (sc->sc_type >= WM_T_PCH_SPT) 13619 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) 13620 >> 16; 13621 else 13622 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL); 13623 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ 13624 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT) 13625 & HSFCTL_BCOUNT_MASK; 13626 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT; 13627 if (sc->sc_type >= WM_T_PCH_SPT) { 13628 /* 13629 * In SPT, This register is in Lan memory space, not 13630 * flash. Therefore, only 32 bit access is supported. 13631 */ 13632 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 13633 (uint32_t)hsflctl << 16); 13634 } else 13635 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl); 13636 13637 /* 13638 * Write the last 24 bits of index into Flash Linear address 13639 * field in Flash Address 13640 */ 13641 /* TODO: TBD maybe check the index against the size of flash */ 13642 13643 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address); 13644 13645 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT); 13646 13647 /* 13648 * Check if FCERR is set to 1, if set to 1, clear it and try 13649 * the whole sequence a few more times, else read in (shift in) 13650 * the Flash Data0, the order is least significant byte first 13651 * msb to lsb 13652 */ 13653 if (error == 0) { 13654 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0); 13655 if (size == 1) 13656 *data = (uint8_t)(flash_data & 0x000000FF); 13657 else if (size == 2) 13658 *data = (uint16_t)(flash_data & 0x0000FFFF); 13659 else if (size == 4) 13660 *data = (uint32_t)flash_data; 13661 break; 13662 } else { 13663 /* 13664 * If we've gotten here, then things are probably 13665 * completely hosed, but if the error condition is 13666 * detected, it won't hurt to give it another try... 13667 * ICH_FLASH_CYCLE_REPEAT_COUNT times. 13668 */ 13669 if (sc->sc_type >= WM_T_PCH_SPT) 13670 hsfsts = ICH8_FLASH_READ32(sc, 13671 ICH_FLASH_HSFSTS) & 0xffffUL; 13672 else 13673 hsfsts = ICH8_FLASH_READ16(sc, 13674 ICH_FLASH_HSFSTS); 13675 13676 if (hsfsts & HSFSTS_ERR) { 13677 /* Repeat for some time before giving up. */ 13678 continue; 13679 } else if ((hsfsts & HSFSTS_DONE) == 0) 13680 break; 13681 } 13682 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT); 13683 13684 return error; 13685 } 13686 13687 /****************************************************************************** 13688 * Reads a single byte from the NVM using the ICH8 flash access registers. 13689 * 13690 * sc - pointer to wm_hw structure 13691 * index - The index of the byte to read. 13692 * data - Pointer to a byte to store the value read. 13693 *****************************************************************************/ 13694 static int32_t 13695 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data) 13696 { 13697 int32_t status; 13698 uint32_t word = 0; 13699 13700 status = wm_read_ich8_data(sc, index, 1, &word); 13701 if (status == 0) 13702 *data = (uint8_t)word; 13703 else 13704 *data = 0; 13705 13706 return status; 13707 } 13708 13709 /****************************************************************************** 13710 * Reads a word from the NVM using the ICH8 flash access registers. 13711 * 13712 * sc - pointer to wm_hw structure 13713 * index - The starting byte index of the word to read. 13714 * data - Pointer to a word to store the value read. 13715 *****************************************************************************/ 13716 static int32_t 13717 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data) 13718 { 13719 int32_t status; 13720 uint32_t word = 0; 13721 13722 status = wm_read_ich8_data(sc, index, 2, &word); 13723 if (status == 0) 13724 *data = (uint16_t)word; 13725 else 13726 *data = 0; 13727 13728 return status; 13729 } 13730 13731 /****************************************************************************** 13732 * Reads a dword from the NVM using the ICH8 flash access registers. 13733 * 13734 * sc - pointer to wm_hw structure 13735 * index - The starting byte index of the word to read. 13736 * data - Pointer to a word to store the value read. 13737 *****************************************************************************/ 13738 static int32_t 13739 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data) 13740 { 13741 int32_t status; 13742 13743 status = wm_read_ich8_data(sc, index, 4, data); 13744 return status; 13745 } 13746 13747 /****************************************************************************** 13748 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access 13749 * register. 13750 * 13751 * sc - Struct containing variables accessed by shared code 13752 * offset - offset of word in the EEPROM to read 13753 * data - word read from the EEPROM 13754 * words - number of words to read 13755 *****************************************************************************/ 13756 static int 13757 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data) 13758 { 13759 int32_t rv = 0; 13760 uint32_t flash_bank = 0; 13761 uint32_t act_offset = 0; 13762 uint32_t bank_offset = 0; 13763 uint16_t word = 0; 13764 uint16_t i = 0; 13765 13766 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13767 device_xname(sc->sc_dev), __func__)); 13768 13769 if (sc->nvm.acquire(sc) != 0) 13770 return -1; 13771 13772 /* 13773 * We need to know which is the valid flash bank. In the event 13774 * that we didn't allocate eeprom_shadow_ram, we may not be 13775 * managing flash_bank. So it cannot be trusted and needs 13776 * to be updated with each read. 13777 */ 13778 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank); 13779 if (rv) { 13780 DPRINTF(sc, WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n", 13781 device_xname(sc->sc_dev))); 13782 flash_bank = 0; 13783 } 13784 13785 /* 13786 * Adjust offset appropriately if we're on bank 1 - adjust for word 13787 * size 13788 */ 13789 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2); 13790 13791 for (i = 0; i < words; i++) { 13792 /* The NVM part needs a byte offset, hence * 2 */ 13793 act_offset = bank_offset + ((offset + i) * 2); 13794 rv = wm_read_ich8_word(sc, act_offset, &word); 13795 if (rv) { 13796 aprint_error_dev(sc->sc_dev, 13797 "%s: failed to read NVM\n", __func__); 13798 break; 13799 } 13800 data[i] = word; 13801 } 13802 13803 sc->nvm.release(sc); 13804 return rv; 13805 } 13806 13807 /****************************************************************************** 13808 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access 13809 * register. 13810 * 13811 * sc - Struct containing variables accessed by shared code 13812 * offset - offset of word in the EEPROM to read 13813 * data - word read from the EEPROM 13814 * words - number of words to read 13815 *****************************************************************************/ 13816 static int 13817 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data) 13818 { 13819 int32_t rv = 0; 13820 uint32_t flash_bank = 0; 13821 uint32_t act_offset = 0; 13822 uint32_t bank_offset = 0; 13823 uint32_t dword = 0; 13824 uint16_t i = 0; 13825 13826 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13827 device_xname(sc->sc_dev), __func__)); 13828 13829 if (sc->nvm.acquire(sc) != 0) 13830 return -1; 13831 13832 /* 13833 * We need to know which is the valid flash bank. In the event 13834 * that we didn't allocate eeprom_shadow_ram, we may not be 13835 * managing flash_bank. So it cannot be trusted and needs 13836 * to be updated with each read. 13837 */ 13838 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank); 13839 if (rv) { 13840 DPRINTF(sc, WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n", 13841 device_xname(sc->sc_dev))); 13842 flash_bank = 0; 13843 } 13844 13845 /* 13846 * Adjust offset appropriately if we're on bank 1 - adjust for word 13847 * size 13848 */ 13849 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2); 13850 13851 for (i = 0; i < words; i++) { 13852 /* The NVM part needs a byte offset, hence * 2 */ 13853 act_offset = bank_offset + ((offset + i) * 2); 13854 /* but we must read dword aligned, so mask ... */ 13855 rv = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword); 13856 if (rv) { 13857 aprint_error_dev(sc->sc_dev, 13858 "%s: failed to read NVM\n", __func__); 13859 break; 13860 } 13861 /* ... and pick out low or high word */ 13862 if ((act_offset & 0x2) == 0) 13863 data[i] = (uint16_t)(dword & 0xFFFF); 13864 else 13865 data[i] = (uint16_t)((dword >> 16) & 0xFFFF); 13866 } 13867 13868 sc->nvm.release(sc); 13869 return rv; 13870 } 13871 13872 /* iNVM */ 13873 13874 static int 13875 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data) 13876 { 13877 int32_t rv = 0; 13878 uint32_t invm_dword; 13879 uint16_t i; 13880 uint8_t record_type, word_address; 13881 13882 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13883 device_xname(sc->sc_dev), __func__)); 13884 13885 for (i = 0; i < INVM_SIZE; i++) { 13886 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i)); 13887 /* Get record type */ 13888 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword); 13889 if (record_type == INVM_UNINITIALIZED_STRUCTURE) 13890 break; 13891 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE) 13892 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS; 13893 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE) 13894 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS; 13895 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) { 13896 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword); 13897 if (word_address == address) { 13898 *data = INVM_DWORD_TO_WORD_DATA(invm_dword); 13899 rv = 0; 13900 break; 13901 } 13902 } 13903 } 13904 13905 return rv; 13906 } 13907 13908 static int 13909 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data) 13910 { 13911 int rv = 0; 13912 int i; 13913 13914 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 13915 device_xname(sc->sc_dev), __func__)); 13916 13917 if (sc->nvm.acquire(sc) != 0) 13918 return -1; 13919 13920 for (i = 0; i < words; i++) { 13921 switch (offset + i) { 13922 case NVM_OFF_MACADDR: 13923 case NVM_OFF_MACADDR1: 13924 case NVM_OFF_MACADDR2: 13925 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]); 13926 if (rv != 0) { 13927 data[i] = 0xffff; 13928 rv = -1; 13929 } 13930 break; 13931 case NVM_OFF_CFG1: /* == INVM_AUTOLOAD */ 13932 rv = wm_nvm_read_word_invm(sc, offset, data); 13933 if (rv != 0) { 13934 *data = INVM_DEFAULT_AL; 13935 rv = 0; 13936 } 13937 break; 13938 case NVM_OFF_CFG2: 13939 rv = wm_nvm_read_word_invm(sc, offset, data); 13940 if (rv != 0) { 13941 *data = NVM_INIT_CTRL_2_DEFAULT_I211; 13942 rv = 0; 13943 } 13944 break; 13945 case NVM_OFF_CFG4: 13946 rv = wm_nvm_read_word_invm(sc, offset, data); 13947 if (rv != 0) { 13948 *data = NVM_INIT_CTRL_4_DEFAULT_I211; 13949 rv = 0; 13950 } 13951 break; 13952 case NVM_OFF_LED_1_CFG: 13953 rv = wm_nvm_read_word_invm(sc, offset, data); 13954 if (rv != 0) { 13955 *data = NVM_LED_1_CFG_DEFAULT_I211; 13956 rv = 0; 13957 } 13958 break; 13959 case NVM_OFF_LED_0_2_CFG: 13960 rv = wm_nvm_read_word_invm(sc, offset, data); 13961 if (rv != 0) { 13962 *data = NVM_LED_0_2_CFG_DEFAULT_I211; 13963 rv = 0; 13964 } 13965 break; 13966 case NVM_OFF_ID_LED_SETTINGS: 13967 rv = wm_nvm_read_word_invm(sc, offset, data); 13968 if (rv != 0) { 13969 *data = ID_LED_RESERVED_FFFF; 13970 rv = 0; 13971 } 13972 break; 13973 default: 13974 DPRINTF(sc, WM_DEBUG_NVM, 13975 ("NVM word 0x%02x is not mapped.\n", offset)); 13976 *data = NVM_RESERVED_WORD; 13977 break; 13978 } 13979 } 13980 13981 sc->nvm.release(sc); 13982 return rv; 13983 } 13984 13985 /* Lock, detecting NVM type, validate checksum, version and read */ 13986 13987 static int 13988 wm_nvm_is_onboard_eeprom(struct wm_softc *sc) 13989 { 13990 uint32_t eecd = 0; 13991 13992 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574 13993 || sc->sc_type == WM_T_82583) { 13994 eecd = CSR_READ(sc, WMREG_EECD); 13995 13996 /* Isolate bits 15 & 16 */ 13997 eecd = ((eecd >> 15) & 0x03); 13998 13999 /* If both bits are set, device is Flash type */ 14000 if (eecd == 0x03) 14001 return 0; 14002 } 14003 return 1; 14004 } 14005 14006 static int 14007 wm_nvm_flash_presence_i210(struct wm_softc *sc) 14008 { 14009 uint32_t eec; 14010 14011 eec = CSR_READ(sc, WMREG_EEC); 14012 if ((eec & EEC_FLASH_DETECTED) != 0) 14013 return 1; 14014 14015 return 0; 14016 } 14017 14018 /* 14019 * wm_nvm_validate_checksum 14020 * 14021 * The checksum is defined as the sum of the first 64 (16 bit) words. 14022 */ 14023 static int 14024 wm_nvm_validate_checksum(struct wm_softc *sc) 14025 { 14026 uint16_t checksum; 14027 uint16_t eeprom_data; 14028 #ifdef WM_DEBUG 14029 uint16_t csum_wordaddr, valid_checksum; 14030 #endif 14031 int i; 14032 14033 checksum = 0; 14034 14035 /* Don't check for I211 */ 14036 if (sc->sc_type == WM_T_I211) 14037 return 0; 14038 14039 #ifdef WM_DEBUG 14040 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT) 14041 || (sc->sc_type == WM_T_PCH_CNP)) { 14042 csum_wordaddr = NVM_OFF_COMPAT; 14043 valid_checksum = NVM_COMPAT_VALID_CHECKSUM; 14044 } else { 14045 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1; 14046 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM; 14047 } 14048 14049 /* Dump EEPROM image for debug */ 14050 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 14051 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 14052 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) { 14053 /* XXX PCH_SPT? */ 14054 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data); 14055 if ((eeprom_data & valid_checksum) == 0) 14056 DPRINTF(sc, WM_DEBUG_NVM, 14057 ("%s: NVM need to be updated (%04x != %04x)\n", 14058 device_xname(sc->sc_dev), eeprom_data, 14059 valid_checksum)); 14060 } 14061 14062 if ((sc->sc_debug & WM_DEBUG_NVM) != 0) { 14063 printf("%s: NVM dump:\n", device_xname(sc->sc_dev)); 14064 for (i = 0; i < NVM_SIZE; i++) { 14065 if (wm_nvm_read(sc, i, 1, &eeprom_data)) 14066 printf("XXXX "); 14067 else 14068 printf("%04hx ", eeprom_data); 14069 if (i % 8 == 7) 14070 printf("\n"); 14071 } 14072 } 14073 14074 #endif /* WM_DEBUG */ 14075 14076 for (i = 0; i < NVM_SIZE; i++) { 14077 if (wm_nvm_read(sc, i, 1, &eeprom_data)) 14078 return 1; 14079 checksum += eeprom_data; 14080 } 14081 14082 if (checksum != (uint16_t) NVM_CHECKSUM) { 14083 #ifdef WM_DEBUG 14084 printf("%s: NVM checksum mismatch (%04x != %04x)\n", 14085 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM); 14086 #endif 14087 } 14088 14089 return 0; 14090 } 14091 14092 static void 14093 wm_nvm_version_invm(struct wm_softc *sc) 14094 { 14095 uint32_t dword; 14096 14097 /* 14098 * Linux's code to decode version is very strange, so we don't 14099 * obey that algorithm and just use word 61 as the document. 14100 * Perhaps it's not perfect though... 14101 * 14102 * Example: 14103 * 14104 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6) 14105 */ 14106 dword = CSR_READ(sc, WM_INVM_DATA_REG(61)); 14107 dword = __SHIFTOUT(dword, INVM_VER_1); 14108 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR); 14109 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR); 14110 } 14111 14112 static void 14113 wm_nvm_version(struct wm_softc *sc) 14114 { 14115 uint16_t major, minor, build, patch; 14116 uint16_t uid0, uid1; 14117 uint16_t nvm_data; 14118 uint16_t off; 14119 bool check_version = false; 14120 bool check_optionrom = false; 14121 bool have_build = false; 14122 bool have_uid = true; 14123 14124 /* 14125 * Version format: 14126 * 14127 * XYYZ 14128 * X0YZ 14129 * X0YY 14130 * 14131 * Example: 14132 * 14133 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10) 14134 * 82571 0x50a6 5.10.6? 14135 * 82572 0x506a 5.6.10? 14136 * 82572EI 0x5069 5.6.9? 14137 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4) 14138 * 0x2013 2.1.3? 14139 * 82583 0x10a0 1.10.0? (document says it's default value) 14140 * ICH8+82567 0x0040 0.4.0? 14141 * ICH9+82566 0x1040 1.4.0? 14142 *ICH10+82567 0x0043 0.4.3? 14143 * PCH+82577 0x00c1 0.12.1? 14144 * PCH2+82579 0x00d3 0.13.3? 14145 * 0x00d4 0.13.4? 14146 * LPT+I218 0x0023 0.2.3? 14147 * SPT+I219 0x0084 0.8.4? 14148 * CNP+I219 0x0054 0.5.4? 14149 */ 14150 14151 /* 14152 * XXX 14153 * Qemu's e1000e emulation (82574L)'s SPI has only 64 words. 14154 * I've never seen on real 82574 hardware with such small SPI ROM. 14155 */ 14156 if ((sc->sc_nvm_wordsize < NVM_OFF_IMAGE_UID1) 14157 || (wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1) != 0)) 14158 have_uid = false; 14159 14160 switch (sc->sc_type) { 14161 case WM_T_82571: 14162 case WM_T_82572: 14163 case WM_T_82574: 14164 case WM_T_82583: 14165 check_version = true; 14166 check_optionrom = true; 14167 have_build = true; 14168 break; 14169 case WM_T_ICH8: 14170 case WM_T_ICH9: 14171 case WM_T_ICH10: 14172 case WM_T_PCH: 14173 case WM_T_PCH2: 14174 case WM_T_PCH_LPT: 14175 case WM_T_PCH_SPT: 14176 case WM_T_PCH_CNP: 14177 check_version = true; 14178 have_build = true; 14179 have_uid = false; 14180 break; 14181 case WM_T_82575: 14182 case WM_T_82576: 14183 case WM_T_82580: 14184 if (have_uid && (uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID) 14185 check_version = true; 14186 break; 14187 case WM_T_I211: 14188 wm_nvm_version_invm(sc); 14189 have_uid = false; 14190 goto printver; 14191 case WM_T_I210: 14192 if (!wm_nvm_flash_presence_i210(sc)) { 14193 wm_nvm_version_invm(sc); 14194 have_uid = false; 14195 goto printver; 14196 } 14197 /* FALLTHROUGH */ 14198 case WM_T_I350: 14199 case WM_T_I354: 14200 check_version = true; 14201 check_optionrom = true; 14202 break; 14203 default: 14204 return; 14205 } 14206 if (check_version 14207 && (wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data) == 0)) { 14208 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT; 14209 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) { 14210 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT; 14211 build = nvm_data & NVM_BUILD_MASK; 14212 have_build = true; 14213 } else 14214 minor = nvm_data & 0x00ff; 14215 14216 /* Decimal */ 14217 minor = (minor / 16) * 10 + (minor % 16); 14218 sc->sc_nvm_ver_major = major; 14219 sc->sc_nvm_ver_minor = minor; 14220 14221 printver: 14222 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major, 14223 sc->sc_nvm_ver_minor); 14224 if (have_build) { 14225 sc->sc_nvm_ver_build = build; 14226 aprint_verbose(".%d", build); 14227 } 14228 } 14229 14230 /* Assume the Option ROM area is at avove NVM_SIZE */ 14231 if ((sc->sc_nvm_wordsize > NVM_SIZE) && check_optionrom 14232 && (wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off) == 0)) { 14233 /* Option ROM Version */ 14234 if ((off != 0x0000) && (off != 0xffff)) { 14235 int rv; 14236 14237 off += NVM_COMBO_VER_OFF; 14238 rv = wm_nvm_read(sc, off + 1, 1, &uid1); 14239 rv |= wm_nvm_read(sc, off, 1, &uid0); 14240 if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff) 14241 && (uid1 != 0) && (uid1 != 0xffff)) { 14242 /* 16bits */ 14243 major = uid0 >> 8; 14244 build = (uid0 << 8) | (uid1 >> 8); 14245 patch = uid1 & 0x00ff; 14246 aprint_verbose(", option ROM Version %d.%d.%d", 14247 major, build, patch); 14248 } 14249 } 14250 } 14251 14252 if (have_uid && (wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0) == 0)) 14253 aprint_verbose(", Image Unique ID %08x", 14254 ((uint32_t)uid1 << 16) | uid0); 14255 } 14256 14257 /* 14258 * wm_nvm_read: 14259 * 14260 * Read data from the serial EEPROM. 14261 */ 14262 static int 14263 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 14264 { 14265 int rv; 14266 14267 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14268 device_xname(sc->sc_dev), __func__)); 14269 14270 if (sc->sc_flags & WM_F_EEPROM_INVALID) 14271 return -1; 14272 14273 rv = sc->nvm.read(sc, word, wordcnt, data); 14274 14275 return rv; 14276 } 14277 14278 /* 14279 * Hardware semaphores. 14280 * Very complexed... 14281 */ 14282 14283 static int 14284 wm_get_null(struct wm_softc *sc) 14285 { 14286 14287 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14288 device_xname(sc->sc_dev), __func__)); 14289 return 0; 14290 } 14291 14292 static void 14293 wm_put_null(struct wm_softc *sc) 14294 { 14295 14296 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14297 device_xname(sc->sc_dev), __func__)); 14298 return; 14299 } 14300 14301 static int 14302 wm_get_eecd(struct wm_softc *sc) 14303 { 14304 uint32_t reg; 14305 int x; 14306 14307 DPRINTF(sc, WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n", 14308 device_xname(sc->sc_dev), __func__)); 14309 14310 reg = CSR_READ(sc, WMREG_EECD); 14311 14312 /* Request EEPROM access. */ 14313 reg |= EECD_EE_REQ; 14314 CSR_WRITE(sc, WMREG_EECD, reg); 14315 14316 /* ..and wait for it to be granted. */ 14317 for (x = 0; x < 1000; x++) { 14318 reg = CSR_READ(sc, WMREG_EECD); 14319 if (reg & EECD_EE_GNT) 14320 break; 14321 delay(5); 14322 } 14323 if ((reg & EECD_EE_GNT) == 0) { 14324 aprint_error_dev(sc->sc_dev, 14325 "could not acquire EEPROM GNT\n"); 14326 reg &= ~EECD_EE_REQ; 14327 CSR_WRITE(sc, WMREG_EECD, reg); 14328 return -1; 14329 } 14330 14331 return 0; 14332 } 14333 14334 static void 14335 wm_nvm_eec_clock_raise(struct wm_softc *sc, uint32_t *eecd) 14336 { 14337 14338 *eecd |= EECD_SK; 14339 CSR_WRITE(sc, WMREG_EECD, *eecd); 14340 CSR_WRITE_FLUSH(sc); 14341 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) 14342 delay(1); 14343 else 14344 delay(50); 14345 } 14346 14347 static void 14348 wm_nvm_eec_clock_lower(struct wm_softc *sc, uint32_t *eecd) 14349 { 14350 14351 *eecd &= ~EECD_SK; 14352 CSR_WRITE(sc, WMREG_EECD, *eecd); 14353 CSR_WRITE_FLUSH(sc); 14354 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) 14355 delay(1); 14356 else 14357 delay(50); 14358 } 14359 14360 static void 14361 wm_put_eecd(struct wm_softc *sc) 14362 { 14363 uint32_t reg; 14364 14365 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14366 device_xname(sc->sc_dev), __func__)); 14367 14368 /* Stop nvm */ 14369 reg = CSR_READ(sc, WMREG_EECD); 14370 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) { 14371 /* Pull CS high */ 14372 reg |= EECD_CS; 14373 wm_nvm_eec_clock_lower(sc, ®); 14374 } else { 14375 /* CS on Microwire is active-high */ 14376 reg &= ~(EECD_CS | EECD_DI); 14377 CSR_WRITE(sc, WMREG_EECD, reg); 14378 wm_nvm_eec_clock_raise(sc, ®); 14379 wm_nvm_eec_clock_lower(sc, ®); 14380 } 14381 14382 reg = CSR_READ(sc, WMREG_EECD); 14383 reg &= ~EECD_EE_REQ; 14384 CSR_WRITE(sc, WMREG_EECD, reg); 14385 14386 return; 14387 } 14388 14389 /* 14390 * Get hardware semaphore. 14391 * Same as e1000_get_hw_semaphore_generic() 14392 */ 14393 static int 14394 wm_get_swsm_semaphore(struct wm_softc *sc) 14395 { 14396 int32_t timeout; 14397 uint32_t swsm; 14398 14399 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14400 device_xname(sc->sc_dev), __func__)); 14401 KASSERT(sc->sc_nvm_wordsize > 0); 14402 14403 retry: 14404 /* Get the SW semaphore. */ 14405 timeout = sc->sc_nvm_wordsize + 1; 14406 while (timeout) { 14407 swsm = CSR_READ(sc, WMREG_SWSM); 14408 14409 if ((swsm & SWSM_SMBI) == 0) 14410 break; 14411 14412 delay(50); 14413 timeout--; 14414 } 14415 14416 if (timeout == 0) { 14417 if ((sc->sc_flags & WM_F_WA_I210_CLSEM) != 0) { 14418 /* 14419 * In rare circumstances, the SW semaphore may already 14420 * be held unintentionally. Clear the semaphore once 14421 * before giving up. 14422 */ 14423 sc->sc_flags &= ~WM_F_WA_I210_CLSEM; 14424 wm_put_swsm_semaphore(sc); 14425 goto retry; 14426 } 14427 aprint_error_dev(sc->sc_dev, 14428 "could not acquire SWSM SMBI\n"); 14429 return 1; 14430 } 14431 14432 /* Get the FW semaphore. */ 14433 timeout = sc->sc_nvm_wordsize + 1; 14434 while (timeout) { 14435 swsm = CSR_READ(sc, WMREG_SWSM); 14436 swsm |= SWSM_SWESMBI; 14437 CSR_WRITE(sc, WMREG_SWSM, swsm); 14438 /* If we managed to set the bit we got the semaphore. */ 14439 swsm = CSR_READ(sc, WMREG_SWSM); 14440 if (swsm & SWSM_SWESMBI) 14441 break; 14442 14443 delay(50); 14444 timeout--; 14445 } 14446 14447 if (timeout == 0) { 14448 aprint_error_dev(sc->sc_dev, 14449 "could not acquire SWSM SWESMBI\n"); 14450 /* Release semaphores */ 14451 wm_put_swsm_semaphore(sc); 14452 return 1; 14453 } 14454 return 0; 14455 } 14456 14457 /* 14458 * Put hardware semaphore. 14459 * Same as e1000_put_hw_semaphore_generic() 14460 */ 14461 static void 14462 wm_put_swsm_semaphore(struct wm_softc *sc) 14463 { 14464 uint32_t swsm; 14465 14466 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14467 device_xname(sc->sc_dev), __func__)); 14468 14469 swsm = CSR_READ(sc, WMREG_SWSM); 14470 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI); 14471 CSR_WRITE(sc, WMREG_SWSM, swsm); 14472 } 14473 14474 /* 14475 * Get SW/FW semaphore. 14476 * Same as e1000_acquire_swfw_sync_{80003es2lan,82575}(). 14477 */ 14478 static int 14479 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask) 14480 { 14481 uint32_t swfw_sync; 14482 uint32_t swmask = mask << SWFW_SOFT_SHIFT; 14483 uint32_t fwmask = mask << SWFW_FIRM_SHIFT; 14484 int timeout; 14485 14486 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14487 device_xname(sc->sc_dev), __func__)); 14488 14489 if (sc->sc_type == WM_T_80003) 14490 timeout = 50; 14491 else 14492 timeout = 200; 14493 14494 while (timeout) { 14495 if (wm_get_swsm_semaphore(sc)) { 14496 aprint_error_dev(sc->sc_dev, 14497 "%s: failed to get semaphore\n", 14498 __func__); 14499 return 1; 14500 } 14501 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC); 14502 if ((swfw_sync & (swmask | fwmask)) == 0) { 14503 swfw_sync |= swmask; 14504 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync); 14505 wm_put_swsm_semaphore(sc); 14506 return 0; 14507 } 14508 wm_put_swsm_semaphore(sc); 14509 delay(5000); 14510 timeout--; 14511 } 14512 device_printf(sc->sc_dev, 14513 "failed to get swfw semaphore mask 0x%x swfw 0x%x\n", 14514 mask, swfw_sync); 14515 return 1; 14516 } 14517 14518 static void 14519 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask) 14520 { 14521 uint32_t swfw_sync; 14522 14523 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14524 device_xname(sc->sc_dev), __func__)); 14525 14526 while (wm_get_swsm_semaphore(sc) != 0) 14527 continue; 14528 14529 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC); 14530 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT); 14531 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync); 14532 14533 wm_put_swsm_semaphore(sc); 14534 } 14535 14536 static int 14537 wm_get_nvm_80003(struct wm_softc *sc) 14538 { 14539 int rv; 14540 14541 DPRINTF(sc, WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n", 14542 device_xname(sc->sc_dev), __func__)); 14543 14544 if ((rv = wm_get_swfw_semaphore(sc, SWFW_EEP_SM)) != 0) { 14545 aprint_error_dev(sc->sc_dev, 14546 "%s: failed to get semaphore(SWFW)\n", __func__); 14547 return rv; 14548 } 14549 14550 if (((sc->sc_flags & WM_F_LOCK_EECD) != 0) 14551 && (rv = wm_get_eecd(sc)) != 0) { 14552 aprint_error_dev(sc->sc_dev, 14553 "%s: failed to get semaphore(EECD)\n", __func__); 14554 wm_put_swfw_semaphore(sc, SWFW_EEP_SM); 14555 return rv; 14556 } 14557 14558 return 0; 14559 } 14560 14561 static void 14562 wm_put_nvm_80003(struct wm_softc *sc) 14563 { 14564 14565 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14566 device_xname(sc->sc_dev), __func__)); 14567 14568 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0) 14569 wm_put_eecd(sc); 14570 wm_put_swfw_semaphore(sc, SWFW_EEP_SM); 14571 } 14572 14573 static int 14574 wm_get_nvm_82571(struct wm_softc *sc) 14575 { 14576 int rv; 14577 14578 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14579 device_xname(sc->sc_dev), __func__)); 14580 14581 if ((rv = wm_get_swsm_semaphore(sc)) != 0) 14582 return rv; 14583 14584 switch (sc->sc_type) { 14585 case WM_T_82573: 14586 break; 14587 default: 14588 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0) 14589 rv = wm_get_eecd(sc); 14590 break; 14591 } 14592 14593 if (rv != 0) { 14594 aprint_error_dev(sc->sc_dev, 14595 "%s: failed to get semaphore\n", 14596 __func__); 14597 wm_put_swsm_semaphore(sc); 14598 } 14599 14600 return rv; 14601 } 14602 14603 static void 14604 wm_put_nvm_82571(struct wm_softc *sc) 14605 { 14606 14607 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14608 device_xname(sc->sc_dev), __func__)); 14609 14610 switch (sc->sc_type) { 14611 case WM_T_82573: 14612 break; 14613 default: 14614 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0) 14615 wm_put_eecd(sc); 14616 break; 14617 } 14618 14619 wm_put_swsm_semaphore(sc); 14620 } 14621 14622 static int 14623 wm_get_phy_82575(struct wm_softc *sc) 14624 { 14625 14626 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14627 device_xname(sc->sc_dev), __func__)); 14628 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 14629 } 14630 14631 static void 14632 wm_put_phy_82575(struct wm_softc *sc) 14633 { 14634 14635 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14636 device_xname(sc->sc_dev), __func__)); 14637 wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 14638 } 14639 14640 static int 14641 wm_get_swfwhw_semaphore(struct wm_softc *sc) 14642 { 14643 uint32_t ext_ctrl; 14644 int timeout = 200; 14645 14646 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14647 device_xname(sc->sc_dev), __func__)); 14648 14649 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */ 14650 for (timeout = 0; timeout < 200; timeout++) { 14651 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 14652 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP; 14653 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 14654 14655 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 14656 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) 14657 return 0; 14658 delay(5000); 14659 } 14660 device_printf(sc->sc_dev, 14661 "failed to get swfwhw semaphore ext_ctrl 0x%x\n", ext_ctrl); 14662 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */ 14663 return 1; 14664 } 14665 14666 static void 14667 wm_put_swfwhw_semaphore(struct wm_softc *sc) 14668 { 14669 uint32_t ext_ctrl; 14670 14671 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14672 device_xname(sc->sc_dev), __func__)); 14673 14674 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 14675 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 14676 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 14677 14678 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */ 14679 } 14680 14681 static int 14682 wm_get_swflag_ich8lan(struct wm_softc *sc) 14683 { 14684 uint32_t ext_ctrl; 14685 int timeout; 14686 14687 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14688 device_xname(sc->sc_dev), __func__)); 14689 mutex_enter(sc->sc_ich_phymtx); 14690 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) { 14691 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 14692 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0) 14693 break; 14694 delay(1000); 14695 } 14696 if (timeout >= WM_PHY_CFG_TIMEOUT) { 14697 device_printf(sc->sc_dev, 14698 "SW has already locked the resource\n"); 14699 goto out; 14700 } 14701 14702 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP; 14703 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 14704 for (timeout = 0; timeout < 1000; timeout++) { 14705 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 14706 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) 14707 break; 14708 delay(1000); 14709 } 14710 if (timeout >= 1000) { 14711 device_printf(sc->sc_dev, "failed to acquire semaphore\n"); 14712 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 14713 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 14714 goto out; 14715 } 14716 return 0; 14717 14718 out: 14719 mutex_exit(sc->sc_ich_phymtx); 14720 return 1; 14721 } 14722 14723 static void 14724 wm_put_swflag_ich8lan(struct wm_softc *sc) 14725 { 14726 uint32_t ext_ctrl; 14727 14728 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14729 device_xname(sc->sc_dev), __func__)); 14730 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 14731 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) { 14732 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 14733 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 14734 } else { 14735 device_printf(sc->sc_dev, "Semaphore unexpectedly released\n"); 14736 } 14737 14738 mutex_exit(sc->sc_ich_phymtx); 14739 } 14740 14741 static int 14742 wm_get_nvm_ich8lan(struct wm_softc *sc) 14743 { 14744 14745 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14746 device_xname(sc->sc_dev), __func__)); 14747 mutex_enter(sc->sc_ich_nvmmtx); 14748 14749 return 0; 14750 } 14751 14752 static void 14753 wm_put_nvm_ich8lan(struct wm_softc *sc) 14754 { 14755 14756 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14757 device_xname(sc->sc_dev), __func__)); 14758 mutex_exit(sc->sc_ich_nvmmtx); 14759 } 14760 14761 static int 14762 wm_get_hw_semaphore_82573(struct wm_softc *sc) 14763 { 14764 int i = 0; 14765 uint32_t reg; 14766 14767 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14768 device_xname(sc->sc_dev), __func__)); 14769 14770 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 14771 do { 14772 CSR_WRITE(sc, WMREG_EXTCNFCTR, 14773 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP); 14774 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 14775 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0) 14776 break; 14777 delay(2*1000); 14778 i++; 14779 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT); 14780 14781 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) { 14782 wm_put_hw_semaphore_82573(sc); 14783 log(LOG_ERR, "%s: Driver can't access the PHY\n", 14784 device_xname(sc->sc_dev)); 14785 return -1; 14786 } 14787 14788 return 0; 14789 } 14790 14791 static void 14792 wm_put_hw_semaphore_82573(struct wm_softc *sc) 14793 { 14794 uint32_t reg; 14795 14796 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14797 device_xname(sc->sc_dev), __func__)); 14798 14799 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 14800 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 14801 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg); 14802 } 14803 14804 /* 14805 * Management mode and power management related subroutines. 14806 * BMC, AMT, suspend/resume and EEE. 14807 */ 14808 14809 #ifdef WM_WOL 14810 static int 14811 wm_check_mng_mode(struct wm_softc *sc) 14812 { 14813 int rv; 14814 14815 switch (sc->sc_type) { 14816 case WM_T_ICH8: 14817 case WM_T_ICH9: 14818 case WM_T_ICH10: 14819 case WM_T_PCH: 14820 case WM_T_PCH2: 14821 case WM_T_PCH_LPT: 14822 case WM_T_PCH_SPT: 14823 case WM_T_PCH_CNP: 14824 rv = wm_check_mng_mode_ich8lan(sc); 14825 break; 14826 case WM_T_82574: 14827 case WM_T_82583: 14828 rv = wm_check_mng_mode_82574(sc); 14829 break; 14830 case WM_T_82571: 14831 case WM_T_82572: 14832 case WM_T_82573: 14833 case WM_T_80003: 14834 rv = wm_check_mng_mode_generic(sc); 14835 break; 14836 default: 14837 /* Noting to do */ 14838 rv = 0; 14839 break; 14840 } 14841 14842 return rv; 14843 } 14844 14845 static int 14846 wm_check_mng_mode_ich8lan(struct wm_softc *sc) 14847 { 14848 uint32_t fwsm; 14849 14850 fwsm = CSR_READ(sc, WMREG_FWSM); 14851 14852 if (((fwsm & FWSM_FW_VALID) != 0) 14853 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE)) 14854 return 1; 14855 14856 return 0; 14857 } 14858 14859 static int 14860 wm_check_mng_mode_82574(struct wm_softc *sc) 14861 { 14862 uint16_t data; 14863 14864 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data); 14865 14866 if ((data & NVM_CFG2_MNGM_MASK) != 0) 14867 return 1; 14868 14869 return 0; 14870 } 14871 14872 static int 14873 wm_check_mng_mode_generic(struct wm_softc *sc) 14874 { 14875 uint32_t fwsm; 14876 14877 fwsm = CSR_READ(sc, WMREG_FWSM); 14878 14879 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE) 14880 return 1; 14881 14882 return 0; 14883 } 14884 #endif /* WM_WOL */ 14885 14886 static int 14887 wm_enable_mng_pass_thru(struct wm_softc *sc) 14888 { 14889 uint32_t manc, fwsm, factps; 14890 14891 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0) 14892 return 0; 14893 14894 manc = CSR_READ(sc, WMREG_MANC); 14895 14896 DPRINTF(sc, WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n", 14897 device_xname(sc->sc_dev), manc)); 14898 if ((manc & MANC_RECV_TCO_EN) == 0) 14899 return 0; 14900 14901 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) { 14902 fwsm = CSR_READ(sc, WMREG_FWSM); 14903 factps = CSR_READ(sc, WMREG_FACTPS); 14904 if (((factps & FACTPS_MNGCG) == 0) 14905 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE)) 14906 return 1; 14907 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){ 14908 uint16_t data; 14909 14910 factps = CSR_READ(sc, WMREG_FACTPS); 14911 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data); 14912 DPRINTF(sc, WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n", 14913 device_xname(sc->sc_dev), factps, data)); 14914 if (((factps & FACTPS_MNGCG) == 0) 14915 && ((data & NVM_CFG2_MNGM_MASK) 14916 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT))) 14917 return 1; 14918 } else if (((manc & MANC_SMBUS_EN) != 0) 14919 && ((manc & MANC_ASF_EN) == 0)) 14920 return 1; 14921 14922 return 0; 14923 } 14924 14925 static bool 14926 wm_phy_resetisblocked(struct wm_softc *sc) 14927 { 14928 bool blocked = false; 14929 uint32_t reg; 14930 int i = 0; 14931 14932 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 14933 device_xname(sc->sc_dev), __func__)); 14934 14935 switch (sc->sc_type) { 14936 case WM_T_ICH8: 14937 case WM_T_ICH9: 14938 case WM_T_ICH10: 14939 case WM_T_PCH: 14940 case WM_T_PCH2: 14941 case WM_T_PCH_LPT: 14942 case WM_T_PCH_SPT: 14943 case WM_T_PCH_CNP: 14944 do { 14945 reg = CSR_READ(sc, WMREG_FWSM); 14946 if ((reg & FWSM_RSPCIPHY) == 0) { 14947 blocked = true; 14948 delay(10*1000); 14949 continue; 14950 } 14951 blocked = false; 14952 } while (blocked && (i++ < 30)); 14953 return blocked; 14954 break; 14955 case WM_T_82571: 14956 case WM_T_82572: 14957 case WM_T_82573: 14958 case WM_T_82574: 14959 case WM_T_82583: 14960 case WM_T_80003: 14961 reg = CSR_READ(sc, WMREG_MANC); 14962 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0) 14963 return true; 14964 else 14965 return false; 14966 break; 14967 default: 14968 /* No problem */ 14969 break; 14970 } 14971 14972 return false; 14973 } 14974 14975 static void 14976 wm_get_hw_control(struct wm_softc *sc) 14977 { 14978 uint32_t reg; 14979 14980 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14981 device_xname(sc->sc_dev), __func__)); 14982 14983 if (sc->sc_type == WM_T_82573) { 14984 reg = CSR_READ(sc, WMREG_SWSM); 14985 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD); 14986 } else if (sc->sc_type >= WM_T_82571) { 14987 reg = CSR_READ(sc, WMREG_CTRL_EXT); 14988 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD); 14989 } 14990 } 14991 14992 static void 14993 wm_release_hw_control(struct wm_softc *sc) 14994 { 14995 uint32_t reg; 14996 14997 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 14998 device_xname(sc->sc_dev), __func__)); 14999 15000 if (sc->sc_type == WM_T_82573) { 15001 reg = CSR_READ(sc, WMREG_SWSM); 15002 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD); 15003 } else if (sc->sc_type >= WM_T_82571) { 15004 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15005 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD); 15006 } 15007 } 15008 15009 static void 15010 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate) 15011 { 15012 uint32_t reg; 15013 15014 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15015 device_xname(sc->sc_dev), __func__)); 15016 15017 if (sc->sc_type < WM_T_PCH2) 15018 return; 15019 15020 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 15021 15022 if (gate) 15023 reg |= EXTCNFCTR_GATE_PHY_CFG; 15024 else 15025 reg &= ~EXTCNFCTR_GATE_PHY_CFG; 15026 15027 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg); 15028 } 15029 15030 static int 15031 wm_init_phy_workarounds_pchlan(struct wm_softc *sc) 15032 { 15033 uint32_t fwsm, reg; 15034 int rv = 0; 15035 15036 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15037 device_xname(sc->sc_dev), __func__)); 15038 15039 /* Gate automatic PHY configuration by hardware on non-managed 82579 */ 15040 wm_gate_hw_phy_config_ich8lan(sc, true); 15041 15042 /* Disable ULP */ 15043 wm_ulp_disable(sc); 15044 15045 /* Acquire PHY semaphore */ 15046 rv = sc->phy.acquire(sc); 15047 if (rv != 0) { 15048 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: failed\n", 15049 device_xname(sc->sc_dev), __func__)); 15050 return -1; 15051 } 15052 15053 /* The MAC-PHY interconnect may be in SMBus mode. If the PHY is 15054 * inaccessible and resetting the PHY is not blocked, toggle the 15055 * LANPHYPC Value bit to force the interconnect to PCIe mode. 15056 */ 15057 fwsm = CSR_READ(sc, WMREG_FWSM); 15058 switch (sc->sc_type) { 15059 case WM_T_PCH_LPT: 15060 case WM_T_PCH_SPT: 15061 case WM_T_PCH_CNP: 15062 if (wm_phy_is_accessible_pchlan(sc)) 15063 break; 15064 15065 /* Before toggling LANPHYPC, see if PHY is accessible by 15066 * forcing MAC to SMBus mode first. 15067 */ 15068 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15069 reg |= CTRL_EXT_FORCE_SMBUS; 15070 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 15071 #if 0 15072 /* XXX Isn't this required??? */ 15073 CSR_WRITE_FLUSH(sc); 15074 #endif 15075 /* Wait 50 milliseconds for MAC to finish any retries 15076 * that it might be trying to perform from previous 15077 * attempts to acknowledge any phy read requests. 15078 */ 15079 delay(50 * 1000); 15080 /* FALLTHROUGH */ 15081 case WM_T_PCH2: 15082 if (wm_phy_is_accessible_pchlan(sc) == true) 15083 break; 15084 /* FALLTHROUGH */ 15085 case WM_T_PCH: 15086 if (sc->sc_type == WM_T_PCH) 15087 if ((fwsm & FWSM_FW_VALID) != 0) 15088 break; 15089 15090 if (wm_phy_resetisblocked(sc) == true) { 15091 device_printf(sc->sc_dev, "XXX reset is blocked(3)\n"); 15092 break; 15093 } 15094 15095 /* Toggle LANPHYPC Value bit */ 15096 wm_toggle_lanphypc_pch_lpt(sc); 15097 15098 if (sc->sc_type >= WM_T_PCH_LPT) { 15099 if (wm_phy_is_accessible_pchlan(sc) == true) 15100 break; 15101 15102 /* Toggling LANPHYPC brings the PHY out of SMBus mode 15103 * so ensure that the MAC is also out of SMBus mode 15104 */ 15105 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15106 reg &= ~CTRL_EXT_FORCE_SMBUS; 15107 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 15108 15109 if (wm_phy_is_accessible_pchlan(sc) == true) 15110 break; 15111 rv = -1; 15112 } 15113 break; 15114 default: 15115 break; 15116 } 15117 15118 /* Release semaphore */ 15119 sc->phy.release(sc); 15120 15121 if (rv == 0) { 15122 /* Check to see if able to reset PHY. Print error if not */ 15123 if (wm_phy_resetisblocked(sc)) { 15124 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n"); 15125 goto out; 15126 } 15127 15128 /* Reset the PHY before any access to it. Doing so, ensures 15129 * that the PHY is in a known good state before we read/write 15130 * PHY registers. The generic reset is sufficient here, 15131 * because we haven't determined the PHY type yet. 15132 */ 15133 if (wm_reset_phy(sc) != 0) 15134 goto out; 15135 15136 /* On a successful reset, possibly need to wait for the PHY 15137 * to quiesce to an accessible state before returning control 15138 * to the calling function. If the PHY does not quiesce, then 15139 * return E1000E_BLK_PHY_RESET, as this is the condition that 15140 * the PHY is in. 15141 */ 15142 if (wm_phy_resetisblocked(sc)) 15143 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n"); 15144 } 15145 15146 out: 15147 /* Ungate automatic PHY configuration on non-managed 82579 */ 15148 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) { 15149 delay(10*1000); 15150 wm_gate_hw_phy_config_ich8lan(sc, false); 15151 } 15152 15153 return 0; 15154 } 15155 15156 static void 15157 wm_init_manageability(struct wm_softc *sc) 15158 { 15159 15160 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15161 device_xname(sc->sc_dev), __func__)); 15162 if (sc->sc_flags & WM_F_HAS_MANAGE) { 15163 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H); 15164 uint32_t manc = CSR_READ(sc, WMREG_MANC); 15165 15166 /* Disable hardware interception of ARP */ 15167 manc &= ~MANC_ARP_EN; 15168 15169 /* Enable receiving management packets to the host */ 15170 if (sc->sc_type >= WM_T_82571) { 15171 manc |= MANC_EN_MNG2HOST; 15172 manc2h |= MANC2H_PORT_623 | MANC2H_PORT_624; 15173 CSR_WRITE(sc, WMREG_MANC2H, manc2h); 15174 } 15175 15176 CSR_WRITE(sc, WMREG_MANC, manc); 15177 } 15178 } 15179 15180 static void 15181 wm_release_manageability(struct wm_softc *sc) 15182 { 15183 15184 if (sc->sc_flags & WM_F_HAS_MANAGE) { 15185 uint32_t manc = CSR_READ(sc, WMREG_MANC); 15186 15187 manc |= MANC_ARP_EN; 15188 if (sc->sc_type >= WM_T_82571) 15189 manc &= ~MANC_EN_MNG2HOST; 15190 15191 CSR_WRITE(sc, WMREG_MANC, manc); 15192 } 15193 } 15194 15195 static void 15196 wm_get_wakeup(struct wm_softc *sc) 15197 { 15198 15199 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */ 15200 switch (sc->sc_type) { 15201 case WM_T_82573: 15202 case WM_T_82583: 15203 sc->sc_flags |= WM_F_HAS_AMT; 15204 /* FALLTHROUGH */ 15205 case WM_T_80003: 15206 case WM_T_82575: 15207 case WM_T_82576: 15208 case WM_T_82580: 15209 case WM_T_I350: 15210 case WM_T_I354: 15211 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0) 15212 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID; 15213 /* FALLTHROUGH */ 15214 case WM_T_82541: 15215 case WM_T_82541_2: 15216 case WM_T_82547: 15217 case WM_T_82547_2: 15218 case WM_T_82571: 15219 case WM_T_82572: 15220 case WM_T_82574: 15221 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES; 15222 break; 15223 case WM_T_ICH8: 15224 case WM_T_ICH9: 15225 case WM_T_ICH10: 15226 case WM_T_PCH: 15227 case WM_T_PCH2: 15228 case WM_T_PCH_LPT: 15229 case WM_T_PCH_SPT: 15230 case WM_T_PCH_CNP: 15231 sc->sc_flags |= WM_F_HAS_AMT; 15232 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES; 15233 break; 15234 default: 15235 break; 15236 } 15237 15238 /* 1: HAS_MANAGE */ 15239 if (wm_enable_mng_pass_thru(sc) != 0) 15240 sc->sc_flags |= WM_F_HAS_MANAGE; 15241 15242 /* 15243 * Note that the WOL flags is set after the resetting of the eeprom 15244 * stuff 15245 */ 15246 } 15247 15248 /* 15249 * Unconfigure Ultra Low Power mode. 15250 * Only for I217 and newer (see below). 15251 */ 15252 static int 15253 wm_ulp_disable(struct wm_softc *sc) 15254 { 15255 uint32_t reg; 15256 uint16_t phyreg; 15257 int i = 0, rv = 0; 15258 15259 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15260 device_xname(sc->sc_dev), __func__)); 15261 /* Exclude old devices */ 15262 if ((sc->sc_type < WM_T_PCH_LPT) 15263 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM) 15264 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V) 15265 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2) 15266 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2)) 15267 return 0; 15268 15269 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) { 15270 /* Request ME un-configure ULP mode in the PHY */ 15271 reg = CSR_READ(sc, WMREG_H2ME); 15272 reg &= ~H2ME_ULP; 15273 reg |= H2ME_ENFORCE_SETTINGS; 15274 CSR_WRITE(sc, WMREG_H2ME, reg); 15275 15276 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */ 15277 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) { 15278 if (i++ == 30) { 15279 device_printf(sc->sc_dev, "%s timed out\n", 15280 __func__); 15281 return -1; 15282 } 15283 delay(10 * 1000); 15284 } 15285 reg = CSR_READ(sc, WMREG_H2ME); 15286 reg &= ~H2ME_ENFORCE_SETTINGS; 15287 CSR_WRITE(sc, WMREG_H2ME, reg); 15288 15289 return 0; 15290 } 15291 15292 /* Acquire semaphore */ 15293 rv = sc->phy.acquire(sc); 15294 if (rv != 0) { 15295 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: failed\n", 15296 device_xname(sc->sc_dev), __func__)); 15297 return -1; 15298 } 15299 15300 /* Toggle LANPHYPC */ 15301 wm_toggle_lanphypc_pch_lpt(sc); 15302 15303 /* Unforce SMBus mode in PHY */ 15304 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL, &phyreg); 15305 if (rv != 0) { 15306 uint32_t reg2; 15307 15308 aprint_debug_dev(sc->sc_dev, "%s: Force SMBus first.\n", 15309 __func__); 15310 reg2 = CSR_READ(sc, WMREG_CTRL_EXT); 15311 reg2 |= CTRL_EXT_FORCE_SMBUS; 15312 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2); 15313 delay(50 * 1000); 15314 15315 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL, 15316 &phyreg); 15317 if (rv != 0) 15318 goto release; 15319 } 15320 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS; 15321 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, phyreg); 15322 15323 /* Unforce SMBus mode in MAC */ 15324 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15325 reg &= ~CTRL_EXT_FORCE_SMBUS; 15326 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 15327 15328 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL, &phyreg); 15329 if (rv != 0) 15330 goto release; 15331 phyreg |= HV_PM_CTRL_K1_ENA; 15332 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, phyreg); 15333 15334 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, 15335 &phyreg); 15336 if (rv != 0) 15337 goto release; 15338 phyreg &= ~(I218_ULP_CONFIG1_IND 15339 | I218_ULP_CONFIG1_STICKY_ULP 15340 | I218_ULP_CONFIG1_RESET_TO_SMBUS 15341 | I218_ULP_CONFIG1_WOL_HOST 15342 | I218_ULP_CONFIG1_INBAND_EXIT 15343 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC 15344 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST 15345 | I218_ULP_CONFIG1_DIS_SMB_PERST); 15346 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg); 15347 phyreg |= I218_ULP_CONFIG1_START; 15348 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg); 15349 15350 reg = CSR_READ(sc, WMREG_FEXTNVM7); 15351 reg &= ~FEXTNVM7_DIS_SMB_PERST; 15352 CSR_WRITE(sc, WMREG_FEXTNVM7, reg); 15353 15354 release: 15355 /* Release semaphore */ 15356 sc->phy.release(sc); 15357 wm_gmii_reset(sc); 15358 delay(50 * 1000); 15359 15360 return rv; 15361 } 15362 15363 /* WOL in the newer chipset interfaces (pchlan) */ 15364 static int 15365 wm_enable_phy_wakeup(struct wm_softc *sc) 15366 { 15367 device_t dev = sc->sc_dev; 15368 uint32_t mreg, moff; 15369 uint16_t wuce, wuc, wufc, preg; 15370 int i, rv; 15371 15372 KASSERT(sc->sc_type >= WM_T_PCH); 15373 15374 /* Copy MAC RARs to PHY RARs */ 15375 wm_copy_rx_addrs_to_phy_ich8lan(sc); 15376 15377 /* Activate PHY wakeup */ 15378 rv = sc->phy.acquire(sc); 15379 if (rv != 0) { 15380 device_printf(dev, "%s: failed to acquire semaphore\n", 15381 __func__); 15382 return rv; 15383 } 15384 15385 /* 15386 * Enable access to PHY wakeup registers. 15387 * BM_MTA, BM_RCTL, BM_WUFC and BM_WUC are in BM_WUC_PAGE. 15388 */ 15389 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce); 15390 if (rv != 0) { 15391 device_printf(dev, 15392 "%s: Could not enable PHY wakeup reg access\n", __func__); 15393 goto release; 15394 } 15395 15396 /* Copy MAC MTA to PHY MTA */ 15397 for (i = 0; i < WM_ICH8_MC_TABSIZE; i++) { 15398 uint16_t lo, hi; 15399 15400 mreg = CSR_READ(sc, WMREG_CORDOVA_MTA + (i * 4)); 15401 lo = (uint16_t)(mreg & 0xffff); 15402 hi = (uint16_t)((mreg >> 16) & 0xffff); 15403 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i), &lo, 0, true); 15404 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i) + 1, &hi, 0, true); 15405 } 15406 15407 /* Configure PHY Rx Control register */ 15408 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 1, true); 15409 mreg = CSR_READ(sc, WMREG_RCTL); 15410 if (mreg & RCTL_UPE) 15411 preg |= BM_RCTL_UPE; 15412 if (mreg & RCTL_MPE) 15413 preg |= BM_RCTL_MPE; 15414 preg &= ~(BM_RCTL_MO_MASK); 15415 moff = __SHIFTOUT(mreg, RCTL_MO); 15416 if (moff != 0) 15417 preg |= moff << BM_RCTL_MO_SHIFT; 15418 if (mreg & RCTL_BAM) 15419 preg |= BM_RCTL_BAM; 15420 if (mreg & RCTL_PMCF) 15421 preg |= BM_RCTL_PMCF; 15422 mreg = CSR_READ(sc, WMREG_CTRL); 15423 if (mreg & CTRL_RFCE) 15424 preg |= BM_RCTL_RFCE; 15425 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 0, true); 15426 15427 wuc = WUC_APME | WUC_PME_EN; 15428 wufc = WUFC_MAG; 15429 /* Enable PHY wakeup in MAC register */ 15430 CSR_WRITE(sc, WMREG_WUC, 15431 WUC_PHY_WAKE | WUC_PME_STATUS | WUC_APMPME | wuc); 15432 CSR_WRITE(sc, WMREG_WUFC, wufc); 15433 15434 /* Configure and enable PHY wakeup in PHY registers */ 15435 wm_access_phy_wakeup_reg_bm(dev, BM_WUC, &wuc, 0, true); 15436 wm_access_phy_wakeup_reg_bm(dev, BM_WUFC, &wufc, 0, true); 15437 15438 wuce |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT; 15439 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce); 15440 15441 release: 15442 sc->phy.release(sc); 15443 15444 return 0; 15445 } 15446 15447 /* Power down workaround on D3 */ 15448 static void 15449 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc) 15450 { 15451 uint32_t reg; 15452 uint16_t phyreg; 15453 int i; 15454 15455 for (i = 0; i < 2; i++) { 15456 /* Disable link */ 15457 reg = CSR_READ(sc, WMREG_PHY_CTRL); 15458 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; 15459 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 15460 15461 /* 15462 * Call gig speed drop workaround on Gig disable before 15463 * accessing any PHY registers 15464 */ 15465 if (sc->sc_type == WM_T_ICH8) 15466 wm_gig_downshift_workaround_ich8lan(sc); 15467 15468 /* Write VR power-down enable */ 15469 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg); 15470 phyreg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; 15471 phyreg |= IGP3_VR_CTRL_MODE_SHUTDOWN; 15472 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, phyreg); 15473 15474 /* Read it back and test */ 15475 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg); 15476 phyreg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; 15477 if ((phyreg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0)) 15478 break; 15479 15480 /* Issue PHY reset and repeat at most one more time */ 15481 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 15482 } 15483 } 15484 15485 /* 15486 * wm_suspend_workarounds_ich8lan - workarounds needed during S0->Sx 15487 * @sc: pointer to the HW structure 15488 * 15489 * During S0 to Sx transition, it is possible the link remains at gig 15490 * instead of negotiating to a lower speed. Before going to Sx, set 15491 * 'Gig Disable' to force link speed negotiation to a lower speed based on 15492 * the LPLU setting in the NVM or custom setting. For PCH and newer parts, 15493 * the OEM bits PHY register (LED, GbE disable and LPLU configurations) also 15494 * needs to be written. 15495 * Parts that support (and are linked to a partner which support) EEE in 15496 * 100Mbps should disable LPLU since 100Mbps w/ EEE requires less power 15497 * than 10Mbps w/o EEE. 15498 */ 15499 static void 15500 wm_suspend_workarounds_ich8lan(struct wm_softc *sc) 15501 { 15502 device_t dev = sc->sc_dev; 15503 struct ethercom *ec = &sc->sc_ethercom; 15504 uint32_t phy_ctrl; 15505 int rv; 15506 15507 phy_ctrl = CSR_READ(sc, WMREG_PHY_CTRL); 15508 phy_ctrl |= PHY_CTRL_GBE_DIS; 15509 15510 KASSERT((sc->sc_type >= WM_T_ICH8) && (sc->sc_type <= WM_T_PCH_CNP)); 15511 15512 if (sc->sc_phytype == WMPHY_I217) { 15513 uint16_t devid = sc->sc_pcidevid; 15514 15515 if ((devid == PCI_PRODUCT_INTEL_I218_LM) || 15516 (devid == PCI_PRODUCT_INTEL_I218_V) || 15517 (devid == PCI_PRODUCT_INTEL_I218_LM3) || 15518 (devid == PCI_PRODUCT_INTEL_I218_V3) || 15519 (sc->sc_type >= WM_T_PCH_SPT)) 15520 CSR_WRITE(sc, WMREG_FEXTNVM6, 15521 CSR_READ(sc, WMREG_FEXTNVM6) 15522 & ~FEXTNVM6_REQ_PLL_CLK); 15523 15524 if (sc->phy.acquire(sc) != 0) 15525 goto out; 15526 15527 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) { 15528 uint16_t eee_advert; 15529 15530 rv = wm_read_emi_reg_locked(dev, 15531 I217_EEE_ADVERTISEMENT, &eee_advert); 15532 if (rv) 15533 goto release; 15534 15535 /* 15536 * Disable LPLU if both link partners support 100BaseT 15537 * EEE and 100Full is advertised on both ends of the 15538 * link, and enable Auto Enable LPI since there will 15539 * be no driver to enable LPI while in Sx. 15540 */ 15541 if ((eee_advert & AN_EEEADVERT_100_TX) && 15542 (sc->eee_lp_ability & AN_EEEADVERT_100_TX)) { 15543 uint16_t anar, phy_reg; 15544 15545 sc->phy.readreg_locked(dev, 2, MII_ANAR, 15546 &anar); 15547 if (anar & ANAR_TX_FD) { 15548 phy_ctrl &= ~(PHY_CTRL_D0A_LPLU | 15549 PHY_CTRL_NOND0A_LPLU); 15550 15551 /* Set Auto Enable LPI after link up */ 15552 sc->phy.readreg_locked(dev, 2, 15553 I217_LPI_GPIO_CTRL, &phy_reg); 15554 phy_reg |= I217_LPI_GPIO_CTRL_AUTO_EN_LPI; 15555 sc->phy.writereg_locked(dev, 2, 15556 I217_LPI_GPIO_CTRL, phy_reg); 15557 } 15558 } 15559 } 15560 15561 /* 15562 * For i217 Intel Rapid Start Technology support, 15563 * when the system is going into Sx and no manageability engine 15564 * is present, the driver must configure proxy to reset only on 15565 * power good. LPI (Low Power Idle) state must also reset only 15566 * on power good, as well as the MTA (Multicast table array). 15567 * The SMBus release must also be disabled on LCD reset. 15568 */ 15569 15570 /* 15571 * Enable MTA to reset for Intel Rapid Start Technology 15572 * Support 15573 */ 15574 15575 release: 15576 sc->phy.release(sc); 15577 } 15578 out: 15579 CSR_WRITE(sc, WMREG_PHY_CTRL, phy_ctrl); 15580 15581 if (sc->sc_type == WM_T_ICH8) 15582 wm_gig_downshift_workaround_ich8lan(sc); 15583 15584 if (sc->sc_type >= WM_T_PCH) { 15585 wm_oem_bits_config_ich8lan(sc, false); 15586 15587 /* Reset PHY to activate OEM bits on 82577/8 */ 15588 if (sc->sc_type == WM_T_PCH) 15589 wm_reset_phy(sc); 15590 15591 if (sc->phy.acquire(sc) != 0) 15592 return; 15593 wm_write_smbus_addr(sc); 15594 sc->phy.release(sc); 15595 } 15596 } 15597 15598 /* 15599 * wm_resume_workarounds_pchlan - workarounds needed during Sx->S0 15600 * @sc: pointer to the HW structure 15601 * 15602 * During Sx to S0 transitions on non-managed devices or managed devices 15603 * on which PHY resets are not blocked, if the PHY registers cannot be 15604 * accessed properly by the s/w toggle the LANPHYPC value to power cycle 15605 * the PHY. 15606 * On i217, setup Intel Rapid Start Technology. 15607 */ 15608 static int 15609 wm_resume_workarounds_pchlan(struct wm_softc *sc) 15610 { 15611 device_t dev = sc->sc_dev; 15612 int rv; 15613 15614 if (sc->sc_type < WM_T_PCH2) 15615 return 0; 15616 15617 rv = wm_init_phy_workarounds_pchlan(sc); 15618 if (rv != 0) 15619 return -1; 15620 15621 /* For i217 Intel Rapid Start Technology support when the system 15622 * is transitioning from Sx and no manageability engine is present 15623 * configure SMBus to restore on reset, disable proxy, and enable 15624 * the reset on MTA (Multicast table array). 15625 */ 15626 if (sc->sc_phytype == WMPHY_I217) { 15627 uint16_t phy_reg; 15628 15629 if (sc->phy.acquire(sc) != 0) 15630 return -1; 15631 15632 /* Clear Auto Enable LPI after link up */ 15633 sc->phy.readreg_locked(dev, 1, I217_LPI_GPIO_CTRL, &phy_reg); 15634 phy_reg &= ~I217_LPI_GPIO_CTRL_AUTO_EN_LPI; 15635 sc->phy.writereg_locked(dev, 1, I217_LPI_GPIO_CTRL, phy_reg); 15636 15637 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) { 15638 /* Restore clear on SMB if no manageability engine 15639 * is present 15640 */ 15641 rv = sc->phy.readreg_locked(dev, 1, I217_MEMPWR, 15642 &phy_reg); 15643 if (rv != 0) 15644 goto release; 15645 phy_reg |= I217_MEMPWR_DISABLE_SMB_RELEASE; 15646 sc->phy.writereg_locked(dev, 1, I217_MEMPWR, phy_reg); 15647 15648 /* Disable Proxy */ 15649 sc->phy.writereg_locked(dev, 1, I217_PROXY_CTRL, 0); 15650 } 15651 /* Enable reset on MTA */ 15652 sc->phy.readreg_locked(dev, 1, I217_CFGREG, &phy_reg); 15653 if (rv != 0) 15654 goto release; 15655 phy_reg &= ~I217_CGFREG_ENABLE_MTA_RESET; 15656 sc->phy.writereg_locked(dev, 1, I217_CFGREG, phy_reg); 15657 15658 release: 15659 sc->phy.release(sc); 15660 return rv; 15661 } 15662 15663 return 0; 15664 } 15665 15666 static void 15667 wm_enable_wakeup(struct wm_softc *sc) 15668 { 15669 uint32_t reg, pmreg; 15670 pcireg_t pmode; 15671 int rv = 0; 15672 15673 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15674 device_xname(sc->sc_dev), __func__)); 15675 15676 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT, 15677 &pmreg, NULL) == 0) 15678 return; 15679 15680 if ((sc->sc_flags & WM_F_WOL) == 0) 15681 goto pme; 15682 15683 /* Advertise the wakeup capability */ 15684 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2) 15685 | CTRL_SWDPIN(3)); 15686 15687 /* Keep the laser running on fiber adapters */ 15688 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER) 15689 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) { 15690 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15691 reg |= CTRL_EXT_SWDPIN(3); 15692 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 15693 } 15694 15695 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) || 15696 (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) || 15697 (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) || 15698 (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)) 15699 wm_suspend_workarounds_ich8lan(sc); 15700 15701 #if 0 /* For the multicast packet */ 15702 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG; 15703 reg |= WUFC_MC; 15704 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE); 15705 #endif 15706 15707 if (sc->sc_type >= WM_T_PCH) { 15708 rv = wm_enable_phy_wakeup(sc); 15709 if (rv != 0) 15710 goto pme; 15711 } else { 15712 /* Enable wakeup by the MAC */ 15713 CSR_WRITE(sc, WMREG_WUC, WUC_APME | WUC_PME_EN); 15714 CSR_WRITE(sc, WMREG_WUFC, WUFC_MAG); 15715 } 15716 15717 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 15718 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 15719 || (sc->sc_type == WM_T_PCH2)) 15720 && (sc->sc_phytype == WMPHY_IGP_3)) 15721 wm_igp3_phy_powerdown_workaround_ich8lan(sc); 15722 15723 pme: 15724 /* Request PME */ 15725 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR); 15726 pmode |= PCI_PMCSR_PME_STS; /* in case it's already set (W1C) */ 15727 if ((rv == 0) && (sc->sc_flags & WM_F_WOL) != 0) { 15728 /* For WOL */ 15729 pmode |= PCI_PMCSR_PME_EN; 15730 } else { 15731 /* Disable WOL */ 15732 pmode &= ~PCI_PMCSR_PME_EN; 15733 } 15734 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode); 15735 } 15736 15737 /* Disable ASPM L0s and/or L1 for workaround */ 15738 static void 15739 wm_disable_aspm(struct wm_softc *sc) 15740 { 15741 pcireg_t reg, mask = 0; 15742 unsigned const char *str = ""; 15743 15744 /* 15745 * Only for PCIe device which has PCIe capability in the PCI config 15746 * space. 15747 */ 15748 if (((sc->sc_flags & WM_F_PCIE) == 0) || (sc->sc_pcixe_capoff == 0)) 15749 return; 15750 15751 switch (sc->sc_type) { 15752 case WM_T_82571: 15753 case WM_T_82572: 15754 /* 15755 * 8257[12] Errata 13: Device Does Not Support PCIe Active 15756 * State Power management L1 State (ASPM L1). 15757 */ 15758 mask = PCIE_LCSR_ASPM_L1; 15759 str = "L1 is"; 15760 break; 15761 case WM_T_82573: 15762 case WM_T_82574: 15763 case WM_T_82583: 15764 /* 15765 * The 82573 disappears when PCIe ASPM L0s is enabled. 15766 * 15767 * The 82574 and 82583 does not support PCIe ASPM L0s with 15768 * some chipset. The document of 82574 and 82583 says that 15769 * disabling L0s with some specific chipset is sufficient, 15770 * but we follow as of the Intel em driver does. 15771 * 15772 * References: 15773 * Errata 8 of the Specification Update of i82573. 15774 * Errata 20 of the Specification Update of i82574. 15775 * Errata 9 of the Specification Update of i82583. 15776 */ 15777 mask = PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S; 15778 str = "L0s and L1 are"; 15779 break; 15780 default: 15781 return; 15782 } 15783 15784 reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 15785 sc->sc_pcixe_capoff + PCIE_LCSR); 15786 reg &= ~mask; 15787 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 15788 sc->sc_pcixe_capoff + PCIE_LCSR, reg); 15789 15790 /* Print only in wm_attach() */ 15791 if ((sc->sc_flags & WM_F_ATTACHED) == 0) 15792 aprint_verbose_dev(sc->sc_dev, 15793 "ASPM %s disabled to workaround the errata.\n", str); 15794 } 15795 15796 /* LPLU */ 15797 15798 static void 15799 wm_lplu_d0_disable(struct wm_softc *sc) 15800 { 15801 struct mii_data *mii = &sc->sc_mii; 15802 uint32_t reg; 15803 uint16_t phyval; 15804 15805 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15806 device_xname(sc->sc_dev), __func__)); 15807 15808 if (sc->sc_phytype == WMPHY_IFE) 15809 return; 15810 15811 switch (sc->sc_type) { 15812 case WM_T_82571: 15813 case WM_T_82572: 15814 case WM_T_82573: 15815 case WM_T_82575: 15816 case WM_T_82576: 15817 mii->mii_readreg(sc->sc_dev, 1, IGPHY_POWER_MGMT, &phyval); 15818 phyval &= ~PMR_D0_LPLU; 15819 mii->mii_writereg(sc->sc_dev, 1, IGPHY_POWER_MGMT, phyval); 15820 break; 15821 case WM_T_82580: 15822 case WM_T_I350: 15823 case WM_T_I210: 15824 case WM_T_I211: 15825 reg = CSR_READ(sc, WMREG_PHPM); 15826 reg &= ~PHPM_D0A_LPLU; 15827 CSR_WRITE(sc, WMREG_PHPM, reg); 15828 break; 15829 case WM_T_82574: 15830 case WM_T_82583: 15831 case WM_T_ICH8: 15832 case WM_T_ICH9: 15833 case WM_T_ICH10: 15834 reg = CSR_READ(sc, WMREG_PHY_CTRL); 15835 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU); 15836 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 15837 CSR_WRITE_FLUSH(sc); 15838 break; 15839 case WM_T_PCH: 15840 case WM_T_PCH2: 15841 case WM_T_PCH_LPT: 15842 case WM_T_PCH_SPT: 15843 case WM_T_PCH_CNP: 15844 wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS, &phyval); 15845 phyval &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU); 15846 if (wm_phy_resetisblocked(sc) == false) 15847 phyval |= HV_OEM_BITS_ANEGNOW; 15848 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, phyval); 15849 break; 15850 default: 15851 break; 15852 } 15853 } 15854 15855 /* EEE */ 15856 15857 static int 15858 wm_set_eee_i350(struct wm_softc *sc) 15859 { 15860 struct ethercom *ec = &sc->sc_ethercom; 15861 uint32_t ipcnfg, eeer; 15862 uint32_t ipcnfg_mask 15863 = IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN | IPCNFG_10BASE_TE; 15864 uint32_t eeer_mask = EEER_TX_LPI_EN | EEER_RX_LPI_EN | EEER_LPI_FC; 15865 15866 KASSERT(sc->sc_mediatype == WM_MEDIATYPE_COPPER); 15867 15868 ipcnfg = CSR_READ(sc, WMREG_IPCNFG); 15869 eeer = CSR_READ(sc, WMREG_EEER); 15870 15871 /* Enable or disable per user setting */ 15872 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) { 15873 ipcnfg |= ipcnfg_mask; 15874 eeer |= eeer_mask; 15875 } else { 15876 ipcnfg &= ~ipcnfg_mask; 15877 eeer &= ~eeer_mask; 15878 } 15879 15880 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg); 15881 CSR_WRITE(sc, WMREG_EEER, eeer); 15882 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */ 15883 CSR_READ(sc, WMREG_EEER); /* XXX flush? */ 15884 15885 return 0; 15886 } 15887 15888 static int 15889 wm_set_eee_pchlan(struct wm_softc *sc) 15890 { 15891 device_t dev = sc->sc_dev; 15892 struct ethercom *ec = &sc->sc_ethercom; 15893 uint16_t lpa, pcs_status, adv_addr, adv, lpi_ctrl, data; 15894 int rv = 0; 15895 15896 switch (sc->sc_phytype) { 15897 case WMPHY_82579: 15898 lpa = I82579_EEE_LP_ABILITY; 15899 pcs_status = I82579_EEE_PCS_STATUS; 15900 adv_addr = I82579_EEE_ADVERTISEMENT; 15901 break; 15902 case WMPHY_I217: 15903 lpa = I217_EEE_LP_ABILITY; 15904 pcs_status = I217_EEE_PCS_STATUS; 15905 adv_addr = I217_EEE_ADVERTISEMENT; 15906 break; 15907 default: 15908 return 0; 15909 } 15910 15911 if (sc->phy.acquire(sc)) { 15912 device_printf(dev, "%s: failed to get semaphore\n", __func__); 15913 return 0; 15914 } 15915 15916 rv = sc->phy.readreg_locked(dev, 1, I82579_LPI_CTRL, &lpi_ctrl); 15917 if (rv != 0) 15918 goto release; 15919 15920 /* Clear bits that enable EEE in various speeds */ 15921 lpi_ctrl &= ~I82579_LPI_CTRL_ENABLE; 15922 15923 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) { 15924 /* Save off link partner's EEE ability */ 15925 rv = wm_read_emi_reg_locked(dev, lpa, &sc->eee_lp_ability); 15926 if (rv != 0) 15927 goto release; 15928 15929 /* Read EEE advertisement */ 15930 if ((rv = wm_read_emi_reg_locked(dev, adv_addr, &adv)) != 0) 15931 goto release; 15932 15933 /* 15934 * Enable EEE only for speeds in which the link partner is 15935 * EEE capable and for which we advertise EEE. 15936 */ 15937 if (adv & sc->eee_lp_ability & AN_EEEADVERT_1000_T) 15938 lpi_ctrl |= I82579_LPI_CTRL_EN_1000; 15939 if (adv & sc->eee_lp_ability & AN_EEEADVERT_100_TX) { 15940 sc->phy.readreg_locked(dev, 2, MII_ANLPAR, &data); 15941 if ((data & ANLPAR_TX_FD) != 0) 15942 lpi_ctrl |= I82579_LPI_CTRL_EN_100; 15943 else { 15944 /* 15945 * EEE is not supported in 100Half, so ignore 15946 * partner's EEE in 100 ability if full-duplex 15947 * is not advertised. 15948 */ 15949 sc->eee_lp_ability 15950 &= ~AN_EEEADVERT_100_TX; 15951 } 15952 } 15953 } 15954 15955 if (sc->sc_phytype == WMPHY_82579) { 15956 rv = wm_read_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, &data); 15957 if (rv != 0) 15958 goto release; 15959 15960 data &= ~I82579_LPI_PLL_SHUT_100; 15961 rv = wm_write_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, data); 15962 } 15963 15964 /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */ 15965 if ((rv = wm_read_emi_reg_locked(dev, pcs_status, &data)) != 0) 15966 goto release; 15967 15968 rv = sc->phy.writereg_locked(dev, 1, I82579_LPI_CTRL, lpi_ctrl); 15969 release: 15970 sc->phy.release(sc); 15971 15972 return rv; 15973 } 15974 15975 static int 15976 wm_set_eee(struct wm_softc *sc) 15977 { 15978 struct ethercom *ec = &sc->sc_ethercom; 15979 15980 if ((ec->ec_capabilities & ETHERCAP_EEE) == 0) 15981 return 0; 15982 15983 if (sc->sc_type == WM_T_I354) { 15984 /* I354 uses an external PHY */ 15985 return 0; /* not yet */ 15986 } else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211)) 15987 return wm_set_eee_i350(sc); 15988 else if (sc->sc_type >= WM_T_PCH2) 15989 return wm_set_eee_pchlan(sc); 15990 15991 return 0; 15992 } 15993 15994 /* 15995 * Workarounds (mainly PHY related). 15996 * Basically, PHY's workarounds are in the PHY drivers. 15997 */ 15998 15999 /* Work-around for 82566 Kumeran PCS lock loss */ 16000 static int 16001 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc) 16002 { 16003 struct mii_data *mii = &sc->sc_mii; 16004 uint32_t status = CSR_READ(sc, WMREG_STATUS); 16005 int i, reg, rv; 16006 uint16_t phyreg; 16007 16008 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16009 device_xname(sc->sc_dev), __func__)); 16010 16011 /* If the link is not up, do nothing */ 16012 if ((status & STATUS_LU) == 0) 16013 return 0; 16014 16015 /* Nothing to do if the link is other than 1Gbps */ 16016 if (__SHIFTOUT(status, STATUS_SPEED) != STATUS_SPEED_1000) 16017 return 0; 16018 16019 for (i = 0; i < 10; i++) { 16020 /* read twice */ 16021 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg); 16022 if (rv != 0) 16023 return rv; 16024 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg); 16025 if (rv != 0) 16026 return rv; 16027 16028 if ((phyreg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0) 16029 goto out; /* GOOD! */ 16030 16031 /* Reset the PHY */ 16032 wm_reset_phy(sc); 16033 delay(5*1000); 16034 } 16035 16036 /* Disable GigE link negotiation */ 16037 reg = CSR_READ(sc, WMREG_PHY_CTRL); 16038 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; 16039 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 16040 16041 /* 16042 * Call gig speed drop workaround on Gig disable before accessing 16043 * any PHY registers. 16044 */ 16045 wm_gig_downshift_workaround_ich8lan(sc); 16046 16047 out: 16048 return 0; 16049 } 16050 16051 /* 16052 * wm_gig_downshift_workaround_ich8lan - WoL from S5 stops working 16053 * @sc: pointer to the HW structure 16054 * 16055 * Steps to take when dropping from 1Gb/s (eg. link cable removal (LSC), 16056 * LPLU, Gig disable, MDIC PHY reset): 16057 * 1) Set Kumeran Near-end loopback 16058 * 2) Clear Kumeran Near-end loopback 16059 * Should only be called for ICH8[m] devices with any 1G Phy. 16060 */ 16061 static void 16062 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc) 16063 { 16064 uint16_t kmreg; 16065 16066 /* Only for igp3 */ 16067 if (sc->sc_phytype == WMPHY_IGP_3) { 16068 if (wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG, &kmreg) != 0) 16069 return; 16070 kmreg |= KUMCTRLSTA_DIAG_NELPBK; 16071 if (wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg) != 0) 16072 return; 16073 kmreg &= ~KUMCTRLSTA_DIAG_NELPBK; 16074 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg); 16075 } 16076 } 16077 16078 /* 16079 * Workaround for pch's PHYs 16080 * XXX should be moved to new PHY driver? 16081 */ 16082 static int 16083 wm_hv_phy_workarounds_ich8lan(struct wm_softc *sc) 16084 { 16085 device_t dev = sc->sc_dev; 16086 struct mii_data *mii = &sc->sc_mii; 16087 struct mii_softc *child; 16088 uint16_t phy_data, phyrev = 0; 16089 int phytype = sc->sc_phytype; 16090 int rv; 16091 16092 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16093 device_xname(dev), __func__)); 16094 KASSERT(sc->sc_type == WM_T_PCH); 16095 16096 /* Set MDIO slow mode before any other MDIO access */ 16097 if (phytype == WMPHY_82577) 16098 if ((rv = wm_set_mdio_slow_mode_hv(sc)) != 0) 16099 return rv; 16100 16101 child = LIST_FIRST(&mii->mii_phys); 16102 if (child != NULL) 16103 phyrev = child->mii_mpd_rev; 16104 16105 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/ 16106 if ((child != NULL) && 16107 (((phytype == WMPHY_82577) && ((phyrev == 1) || (phyrev == 2))) || 16108 ((phytype == WMPHY_82578) && (phyrev == 1)))) { 16109 /* Disable generation of early preamble (0x4431) */ 16110 rv = mii->mii_readreg(dev, 2, BM_RATE_ADAPTATION_CTRL, 16111 &phy_data); 16112 if (rv != 0) 16113 return rv; 16114 phy_data &= ~(BM_RATE_ADAPTATION_CTRL_RX_RXDV_PRE | 16115 BM_RATE_ADAPTATION_CTRL_RX_CRS_PRE); 16116 rv = mii->mii_writereg(dev, 2, BM_RATE_ADAPTATION_CTRL, 16117 phy_data); 16118 if (rv != 0) 16119 return rv; 16120 16121 /* Preamble tuning for SSC */ 16122 rv = mii->mii_writereg(dev, 2, HV_KMRN_FIFO_CTRLSTA, 0xa204); 16123 if (rv != 0) 16124 return rv; 16125 } 16126 16127 /* 82578 */ 16128 if (phytype == WMPHY_82578) { 16129 /* 16130 * Return registers to default by doing a soft reset then 16131 * writing 0x3140 to the control register 16132 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1 16133 */ 16134 if ((child != NULL) && (phyrev < 2)) { 16135 PHY_RESET(child); 16136 rv = mii->mii_writereg(dev, 2, MII_BMCR, 0x3140); 16137 if (rv != 0) 16138 return rv; 16139 } 16140 } 16141 16142 /* Select page 0 */ 16143 if ((rv = sc->phy.acquire(sc)) != 0) 16144 return rv; 16145 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 0); 16146 sc->phy.release(sc); 16147 if (rv != 0) 16148 return rv; 16149 16150 /* 16151 * Configure the K1 Si workaround during phy reset assuming there is 16152 * link so that it disables K1 if link is in 1Gbps. 16153 */ 16154 if ((rv = wm_k1_gig_workaround_hv(sc, 1)) != 0) 16155 return rv; 16156 16157 /* Workaround for link disconnects on a busy hub in half duplex */ 16158 rv = sc->phy.acquire(sc); 16159 if (rv) 16160 return rv; 16161 rv = sc->phy.readreg_locked(dev, 2, BM_PORT_GEN_CFG, &phy_data); 16162 if (rv) 16163 goto release; 16164 rv = sc->phy.writereg_locked(dev, 2, BM_PORT_GEN_CFG, 16165 phy_data & 0x00ff); 16166 if (rv) 16167 goto release; 16168 16169 /* Set MSE higher to enable link to stay up when noise is high */ 16170 rv = wm_write_emi_reg_locked(dev, I82577_MSE_THRESHOLD, 0x0034); 16171 release: 16172 sc->phy.release(sc); 16173 16174 return rv; 16175 } 16176 16177 /* 16178 * wm_copy_rx_addrs_to_phy_ich8lan - Copy Rx addresses from MAC to PHY 16179 * @sc: pointer to the HW structure 16180 */ 16181 static void 16182 wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *sc) 16183 { 16184 16185 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16186 device_xname(sc->sc_dev), __func__)); 16187 16188 if (sc->phy.acquire(sc) != 0) 16189 return; 16190 16191 wm_copy_rx_addrs_to_phy_ich8lan_locked(sc); 16192 16193 sc->phy.release(sc); 16194 } 16195 16196 static void 16197 wm_copy_rx_addrs_to_phy_ich8lan_locked(struct wm_softc *sc) 16198 { 16199 device_t dev = sc->sc_dev; 16200 uint32_t mac_reg; 16201 uint16_t i, wuce; 16202 int count; 16203 16204 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16205 device_xname(dev), __func__)); 16206 16207 if (wm_enable_phy_wakeup_reg_access_bm(dev, &wuce) != 0) 16208 return; 16209 16210 /* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */ 16211 count = wm_rar_count(sc); 16212 for (i = 0; i < count; i++) { 16213 uint16_t lo, hi; 16214 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAL(i)); 16215 lo = (uint16_t)(mac_reg & 0xffff); 16216 hi = (uint16_t)((mac_reg >> 16) & 0xffff); 16217 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_L(i), &lo, 0, true); 16218 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_M(i), &hi, 0, true); 16219 16220 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAH(i)); 16221 lo = (uint16_t)(mac_reg & 0xffff); 16222 hi = (uint16_t)((mac_reg & RAL_AV) >> 16); 16223 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_H(i), &lo, 0, true); 16224 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_CTRL(i), &hi, 0, true); 16225 } 16226 16227 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce); 16228 } 16229 16230 /* 16231 * wm_lv_jumbo_workaround_ich8lan - required for jumbo frame operation 16232 * with 82579 PHY 16233 * @enable: flag to enable/disable workaround when enabling/disabling jumbos 16234 */ 16235 static int 16236 wm_lv_jumbo_workaround_ich8lan(struct wm_softc *sc, bool enable) 16237 { 16238 device_t dev = sc->sc_dev; 16239 int rar_count; 16240 int rv; 16241 uint32_t mac_reg; 16242 uint16_t dft_ctrl, data; 16243 uint16_t i; 16244 16245 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16246 device_xname(dev), __func__)); 16247 16248 if (sc->sc_type < WM_T_PCH2) 16249 return 0; 16250 16251 /* Acquire PHY semaphore */ 16252 rv = sc->phy.acquire(sc); 16253 if (rv != 0) 16254 return rv; 16255 16256 /* Disable Rx path while enabling/disabling workaround */ 16257 rv = sc->phy.readreg_locked(dev, 2, I82579_DFT_CTRL, &dft_ctrl); 16258 if (rv != 0) 16259 goto out; 16260 rv = sc->phy.writereg_locked(dev, 2, I82579_DFT_CTRL, 16261 dft_ctrl | (1 << 14)); 16262 if (rv != 0) 16263 goto out; 16264 16265 if (enable) { 16266 /* Write Rx addresses (rar_entry_count for RAL/H, and 16267 * SHRAL/H) and initial CRC values to the MAC 16268 */ 16269 rar_count = wm_rar_count(sc); 16270 for (i = 0; i < rar_count; i++) { 16271 uint8_t mac_addr[ETHER_ADDR_LEN] = {0}; 16272 uint32_t addr_high, addr_low; 16273 16274 addr_high = CSR_READ(sc, WMREG_CORDOVA_RAH(i)); 16275 if (!(addr_high & RAL_AV)) 16276 continue; 16277 addr_low = CSR_READ(sc, WMREG_CORDOVA_RAL(i)); 16278 mac_addr[0] = (addr_low & 0xFF); 16279 mac_addr[1] = ((addr_low >> 8) & 0xFF); 16280 mac_addr[2] = ((addr_low >> 16) & 0xFF); 16281 mac_addr[3] = ((addr_low >> 24) & 0xFF); 16282 mac_addr[4] = (addr_high & 0xFF); 16283 mac_addr[5] = ((addr_high >> 8) & 0xFF); 16284 16285 CSR_WRITE(sc, WMREG_PCH_RAICC(i), 16286 ~ether_crc32_le(mac_addr, ETHER_ADDR_LEN)); 16287 } 16288 16289 /* Write Rx addresses to the PHY */ 16290 wm_copy_rx_addrs_to_phy_ich8lan_locked(sc); 16291 } 16292 16293 /* 16294 * If enable == 16295 * true: Enable jumbo frame workaround in the MAC. 16296 * false: Write MAC register values back to h/w defaults. 16297 */ 16298 mac_reg = CSR_READ(sc, WMREG_FFLT_DBG); 16299 if (enable) { 16300 mac_reg &= ~(1 << 14); 16301 mac_reg |= (7 << 15); 16302 } else 16303 mac_reg &= ~(0xf << 14); 16304 CSR_WRITE(sc, WMREG_FFLT_DBG, mac_reg); 16305 16306 mac_reg = CSR_READ(sc, WMREG_RCTL); 16307 if (enable) { 16308 mac_reg |= RCTL_SECRC; 16309 sc->sc_rctl |= RCTL_SECRC; 16310 sc->sc_flags |= WM_F_CRC_STRIP; 16311 } else { 16312 mac_reg &= ~RCTL_SECRC; 16313 sc->sc_rctl &= ~RCTL_SECRC; 16314 sc->sc_flags &= ~WM_F_CRC_STRIP; 16315 } 16316 CSR_WRITE(sc, WMREG_RCTL, mac_reg); 16317 16318 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_CTRL, &data); 16319 if (rv != 0) 16320 goto out; 16321 if (enable) 16322 data |= 1 << 0; 16323 else 16324 data &= ~(1 << 0); 16325 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_CTRL, data); 16326 if (rv != 0) 16327 goto out; 16328 16329 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_HD_CTRL, &data); 16330 if (rv != 0) 16331 goto out; 16332 /* 16333 * XXX FreeBSD and Linux do the same thing that they set the same value 16334 * on both the enable case and the disable case. Is it correct? 16335 */ 16336 data &= ~(0xf << 8); 16337 data |= (0xb << 8); 16338 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_HD_CTRL, data); 16339 if (rv != 0) 16340 goto out; 16341 16342 /* 16343 * If enable == 16344 * true: Enable jumbo frame workaround in the PHY. 16345 * false: Write PHY register values back to h/w defaults. 16346 */ 16347 rv = sc->phy.readreg_locked(dev, 2, BME1000_REG(769, 23), &data); 16348 if (rv != 0) 16349 goto out; 16350 data &= ~(0x7F << 5); 16351 if (enable) 16352 data |= (0x37 << 5); 16353 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(769, 23), data); 16354 if (rv != 0) 16355 goto out; 16356 16357 rv = sc->phy.readreg_locked(dev, 2, BME1000_REG(769, 16), &data); 16358 if (rv != 0) 16359 goto out; 16360 if (enable) 16361 data &= ~(1 << 13); 16362 else 16363 data |= (1 << 13); 16364 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(769, 16), data); 16365 if (rv != 0) 16366 goto out; 16367 16368 rv = sc->phy.readreg_locked(dev, 2, I82579_UNKNOWN1, &data); 16369 if (rv != 0) 16370 goto out; 16371 data &= ~(0x3FF << 2); 16372 if (enable) 16373 data |= (I82579_TX_PTR_GAP << 2); 16374 else 16375 data |= (0x8 << 2); 16376 rv = sc->phy.writereg_locked(dev, 2, I82579_UNKNOWN1, data); 16377 if (rv != 0) 16378 goto out; 16379 16380 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(776, 23), 16381 enable ? 0xf100 : 0x7e00); 16382 if (rv != 0) 16383 goto out; 16384 16385 rv = sc->phy.readreg_locked(dev, 2, HV_PM_CTRL, &data); 16386 if (rv != 0) 16387 goto out; 16388 if (enable) 16389 data |= 1 << 10; 16390 else 16391 data &= ~(1 << 10); 16392 rv = sc->phy.writereg_locked(dev, 2, HV_PM_CTRL, data); 16393 if (rv != 0) 16394 goto out; 16395 16396 /* Re-enable Rx path after enabling/disabling workaround */ 16397 rv = sc->phy.writereg_locked(dev, 2, I82579_DFT_CTRL, 16398 dft_ctrl & ~(1 << 14)); 16399 16400 out: 16401 sc->phy.release(sc); 16402 16403 return rv; 16404 } 16405 16406 /* 16407 * wm_lv_phy_workarounds_ich8lan - A series of Phy workarounds to be 16408 * done after every PHY reset. 16409 */ 16410 static int 16411 wm_lv_phy_workarounds_ich8lan(struct wm_softc *sc) 16412 { 16413 device_t dev = sc->sc_dev; 16414 int rv; 16415 16416 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16417 device_xname(dev), __func__)); 16418 KASSERT(sc->sc_type == WM_T_PCH2); 16419 16420 /* Set MDIO slow mode before any other MDIO access */ 16421 rv = wm_set_mdio_slow_mode_hv(sc); 16422 if (rv != 0) 16423 return rv; 16424 16425 rv = sc->phy.acquire(sc); 16426 if (rv != 0) 16427 return rv; 16428 /* Set MSE higher to enable link to stay up when noise is high */ 16429 rv = wm_write_emi_reg_locked(dev, I82579_MSE_THRESHOLD, 0x0034); 16430 if (rv != 0) 16431 goto release; 16432 /* Drop link after 5 times MSE threshold was reached */ 16433 rv = wm_write_emi_reg_locked(dev, I82579_MSE_LINK_DOWN, 0x0005); 16434 release: 16435 sc->phy.release(sc); 16436 16437 return rv; 16438 } 16439 16440 /** 16441 * wm_k1_workaround_lpt_lp - K1 workaround on Lynxpoint-LP 16442 * @link: link up bool flag 16443 * 16444 * When K1 is enabled for 1Gbps, the MAC can miss 2 DMA completion indications 16445 * preventing further DMA write requests. Workaround the issue by disabling 16446 * the de-assertion of the clock request when in 1Gpbs mode. 16447 * Also, set appropriate Tx re-transmission timeouts for 10 and 100Half link 16448 * speeds in order to avoid Tx hangs. 16449 **/ 16450 static int 16451 wm_k1_workaround_lpt_lp(struct wm_softc *sc, bool link) 16452 { 16453 uint32_t fextnvm6 = CSR_READ(sc, WMREG_FEXTNVM6); 16454 uint32_t status = CSR_READ(sc, WMREG_STATUS); 16455 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED); 16456 uint16_t phyreg; 16457 16458 if (link && (speed == STATUS_SPEED_1000)) { 16459 sc->phy.acquire(sc); 16460 int rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, 16461 &phyreg); 16462 if (rv != 0) 16463 goto release; 16464 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, 16465 phyreg & ~KUMCTRLSTA_K1_ENABLE); 16466 if (rv != 0) 16467 goto release; 16468 delay(20); 16469 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6 | FEXTNVM6_REQ_PLL_CLK); 16470 16471 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, 16472 &phyreg); 16473 release: 16474 sc->phy.release(sc); 16475 return rv; 16476 } 16477 16478 fextnvm6 &= ~FEXTNVM6_REQ_PLL_CLK; 16479 16480 struct mii_softc *child = LIST_FIRST(&sc->sc_mii.mii_phys); 16481 if (((child != NULL) && (child->mii_mpd_rev > 5)) 16482 || !link 16483 || ((speed == STATUS_SPEED_100) && (status & STATUS_FD))) 16484 goto update_fextnvm6; 16485 16486 wm_gmii_hv_readreg(sc->sc_dev, 2, I217_INBAND_CTRL, &phyreg); 16487 16488 /* Clear link status transmit timeout */ 16489 phyreg &= ~I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_MASK; 16490 if (speed == STATUS_SPEED_100) { 16491 /* Set inband Tx timeout to 5x10us for 100Half */ 16492 phyreg |= 5 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT; 16493 16494 /* Do not extend the K1 entry latency for 100Half */ 16495 fextnvm6 &= ~FEXTNVM6_ENABLE_K1_ENTRY_CONDITION; 16496 } else { 16497 /* Set inband Tx timeout to 50x10us for 10Full/Half */ 16498 phyreg |= 50 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT; 16499 16500 /* Extend the K1 entry latency for 10 Mbps */ 16501 fextnvm6 |= FEXTNVM6_ENABLE_K1_ENTRY_CONDITION; 16502 } 16503 16504 wm_gmii_hv_writereg(sc->sc_dev, 2, I217_INBAND_CTRL, phyreg); 16505 16506 update_fextnvm6: 16507 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6); 16508 return 0; 16509 } 16510 16511 /* 16512 * wm_k1_gig_workaround_hv - K1 Si workaround 16513 * @sc: pointer to the HW structure 16514 * @link: link up bool flag 16515 * 16516 * If K1 is enabled for 1Gbps, the MAC might stall when transitioning 16517 * from a lower speed. This workaround disables K1 whenever link is at 1Gig 16518 * If link is down, the function will restore the default K1 setting located 16519 * in the NVM. 16520 */ 16521 static int 16522 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link) 16523 { 16524 int k1_enable = sc->sc_nvm_k1_enabled; 16525 16526 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16527 device_xname(sc->sc_dev), __func__)); 16528 16529 if (sc->phy.acquire(sc) != 0) 16530 return -1; 16531 16532 if (link) { 16533 k1_enable = 0; 16534 16535 /* Link stall fix for link up */ 16536 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 16537 0x0100); 16538 } else { 16539 /* Link stall fix for link down */ 16540 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 16541 0x4100); 16542 } 16543 16544 wm_configure_k1_ich8lan(sc, k1_enable); 16545 sc->phy.release(sc); 16546 16547 return 0; 16548 } 16549 16550 /* 16551 * wm_k1_workaround_lv - K1 Si workaround 16552 * @sc: pointer to the HW structure 16553 * 16554 * Workaround to set the K1 beacon duration for 82579 parts in 10Mbps 16555 * Disable K1 for 1000 and 100 speeds 16556 */ 16557 static int 16558 wm_k1_workaround_lv(struct wm_softc *sc) 16559 { 16560 uint32_t reg; 16561 uint16_t phyreg; 16562 int rv; 16563 16564 if (sc->sc_type != WM_T_PCH2) 16565 return 0; 16566 16567 /* Set K1 beacon duration based on 10Mbps speed */ 16568 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, HV_M_STATUS, &phyreg); 16569 if (rv != 0) 16570 return rv; 16571 16572 if ((phyreg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) 16573 == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { 16574 if (phyreg & 16575 (HV_M_STATUS_SPEED_1000 | HV_M_STATUS_SPEED_100)) { 16576 /* LV 1G/100 Packet drop issue wa */ 16577 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_PM_CTRL, 16578 &phyreg); 16579 if (rv != 0) 16580 return rv; 16581 phyreg &= ~HV_PM_CTRL_K1_ENA; 16582 rv = wm_gmii_hv_writereg(sc->sc_dev, 1, HV_PM_CTRL, 16583 phyreg); 16584 if (rv != 0) 16585 return rv; 16586 } else { 16587 /* For 10Mbps */ 16588 reg = CSR_READ(sc, WMREG_FEXTNVM4); 16589 reg &= ~FEXTNVM4_BEACON_DURATION; 16590 reg |= FEXTNVM4_BEACON_DURATION_16US; 16591 CSR_WRITE(sc, WMREG_FEXTNVM4, reg); 16592 } 16593 } 16594 16595 return 0; 16596 } 16597 16598 /* 16599 * wm_link_stall_workaround_hv - Si workaround 16600 * @sc: pointer to the HW structure 16601 * 16602 * This function works around a Si bug where the link partner can get 16603 * a link up indication before the PHY does. If small packets are sent 16604 * by the link partner they can be placed in the packet buffer without 16605 * being properly accounted for by the PHY and will stall preventing 16606 * further packets from being received. The workaround is to clear the 16607 * packet buffer after the PHY detects link up. 16608 */ 16609 static int 16610 wm_link_stall_workaround_hv(struct wm_softc *sc) 16611 { 16612 uint16_t phyreg; 16613 16614 if (sc->sc_phytype != WMPHY_82578) 16615 return 0; 16616 16617 /* Do not apply workaround if in PHY loopback bit 14 set */ 16618 wm_gmii_hv_readreg(sc->sc_dev, 2, MII_BMCR, &phyreg); 16619 if ((phyreg & BMCR_LOOP) != 0) 16620 return 0; 16621 16622 /* Check if link is up and at 1Gbps */ 16623 wm_gmii_hv_readreg(sc->sc_dev, 2, BM_CS_STATUS, &phyreg); 16624 phyreg &= BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED 16625 | BM_CS_STATUS_SPEED_MASK; 16626 if (phyreg != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED 16627 | BM_CS_STATUS_SPEED_1000)) 16628 return 0; 16629 16630 delay(200 * 1000); /* XXX too big */ 16631 16632 /* Flush the packets in the fifo buffer */ 16633 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL, 16634 HV_MUX_DATA_CTRL_GEN_TO_MAC | HV_MUX_DATA_CTRL_FORCE_SPEED); 16635 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL, 16636 HV_MUX_DATA_CTRL_GEN_TO_MAC); 16637 16638 return 0; 16639 } 16640 16641 static int 16642 wm_set_mdio_slow_mode_hv(struct wm_softc *sc) 16643 { 16644 int rv; 16645 uint16_t reg; 16646 16647 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, ®); 16648 if (rv != 0) 16649 return rv; 16650 16651 return wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, 16652 reg | HV_KMRN_MDIO_SLOW); 16653 } 16654 16655 /* 16656 * wm_configure_k1_ich8lan - Configure K1 power state 16657 * @sc: pointer to the HW structure 16658 * @enable: K1 state to configure 16659 * 16660 * Configure the K1 power state based on the provided parameter. 16661 * Assumes semaphore already acquired. 16662 */ 16663 static void 16664 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable) 16665 { 16666 uint32_t ctrl, ctrl_ext, tmp; 16667 uint16_t kmreg; 16668 int rv; 16669 16670 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP); 16671 16672 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, &kmreg); 16673 if (rv != 0) 16674 return; 16675 16676 if (k1_enable) 16677 kmreg |= KUMCTRLSTA_K1_ENABLE; 16678 else 16679 kmreg &= ~KUMCTRLSTA_K1_ENABLE; 16680 16681 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmreg); 16682 if (rv != 0) 16683 return; 16684 16685 delay(20); 16686 16687 ctrl = CSR_READ(sc, WMREG_CTRL); 16688 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 16689 16690 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100); 16691 tmp |= CTRL_FRCSPD; 16692 16693 CSR_WRITE(sc, WMREG_CTRL, tmp); 16694 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS); 16695 CSR_WRITE_FLUSH(sc); 16696 delay(20); 16697 16698 CSR_WRITE(sc, WMREG_CTRL, ctrl); 16699 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 16700 CSR_WRITE_FLUSH(sc); 16701 delay(20); 16702 16703 return; 16704 } 16705 16706 /* special case - for 82575 - need to do manual init ... */ 16707 static void 16708 wm_reset_init_script_82575(struct wm_softc *sc) 16709 { 16710 /* 16711 * Remark: this is untested code - we have no board without EEPROM 16712 * same setup as mentioned int the FreeBSD driver for the i82575 16713 */ 16714 16715 /* SerDes configuration via SERDESCTRL */ 16716 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c); 16717 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78); 16718 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23); 16719 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15); 16720 16721 /* CCM configuration via CCMCTL register */ 16722 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00); 16723 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00); 16724 16725 /* PCIe lanes configuration */ 16726 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec); 16727 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf); 16728 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05); 16729 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81); 16730 16731 /* PCIe PLL Configuration */ 16732 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47); 16733 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00); 16734 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00); 16735 } 16736 16737 static void 16738 wm_reset_mdicnfg_82580(struct wm_softc *sc) 16739 { 16740 uint32_t reg; 16741 uint16_t nvmword; 16742 int rv; 16743 16744 if (sc->sc_type != WM_T_82580) 16745 return; 16746 if ((sc->sc_flags & WM_F_SGMII) == 0) 16747 return; 16748 16749 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) 16750 + NVM_OFF_CFG3_PORTA, 1, &nvmword); 16751 if (rv != 0) { 16752 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n", 16753 __func__); 16754 return; 16755 } 16756 16757 reg = CSR_READ(sc, WMREG_MDICNFG); 16758 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO) 16759 reg |= MDICNFG_DEST; 16760 if (nvmword & NVM_CFG3_PORTA_COM_MDIO) 16761 reg |= MDICNFG_COM_MDIO; 16762 CSR_WRITE(sc, WMREG_MDICNFG, reg); 16763 } 16764 16765 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff)) 16766 16767 static bool 16768 wm_phy_is_accessible_pchlan(struct wm_softc *sc) 16769 { 16770 uint32_t reg; 16771 uint16_t id1, id2; 16772 int i, rv; 16773 16774 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16775 device_xname(sc->sc_dev), __func__)); 16776 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP); 16777 16778 id1 = id2 = 0xffff; 16779 for (i = 0; i < 2; i++) { 16780 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1, 16781 &id1); 16782 if ((rv != 0) || MII_INVALIDID(id1)) 16783 continue; 16784 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2, 16785 &id2); 16786 if ((rv != 0) || MII_INVALIDID(id2)) 16787 continue; 16788 break; 16789 } 16790 if ((rv == 0) && !MII_INVALIDID(id1) && !MII_INVALIDID(id2)) 16791 goto out; 16792 16793 /* 16794 * In case the PHY needs to be in mdio slow mode, 16795 * set slow mode and try to get the PHY id again. 16796 */ 16797 rv = 0; 16798 if (sc->sc_type < WM_T_PCH_LPT) { 16799 sc->phy.release(sc); 16800 wm_set_mdio_slow_mode_hv(sc); 16801 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR1, &id1); 16802 rv |= wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR2, &id2); 16803 sc->phy.acquire(sc); 16804 } 16805 if ((rv != 0) || MII_INVALIDID(id1) || MII_INVALIDID(id2)) { 16806 device_printf(sc->sc_dev, "XXX return with false\n"); 16807 return false; 16808 } 16809 out: 16810 if (sc->sc_type >= WM_T_PCH_LPT) { 16811 /* Only unforce SMBus if ME is not active */ 16812 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) { 16813 uint16_t phyreg; 16814 16815 /* Unforce SMBus mode in PHY */ 16816 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, 16817 CV_SMB_CTRL, &phyreg); 16818 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS; 16819 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, 16820 CV_SMB_CTRL, phyreg); 16821 16822 /* Unforce SMBus mode in MAC */ 16823 reg = CSR_READ(sc, WMREG_CTRL_EXT); 16824 reg &= ~CTRL_EXT_FORCE_SMBUS; 16825 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 16826 } 16827 } 16828 return true; 16829 } 16830 16831 static void 16832 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc) 16833 { 16834 uint32_t reg; 16835 int i; 16836 16837 /* Set PHY Config Counter to 50msec */ 16838 reg = CSR_READ(sc, WMREG_FEXTNVM3); 16839 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK; 16840 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS; 16841 CSR_WRITE(sc, WMREG_FEXTNVM3, reg); 16842 16843 /* Toggle LANPHYPC */ 16844 reg = CSR_READ(sc, WMREG_CTRL); 16845 reg |= CTRL_LANPHYPC_OVERRIDE; 16846 reg &= ~CTRL_LANPHYPC_VALUE; 16847 CSR_WRITE(sc, WMREG_CTRL, reg); 16848 CSR_WRITE_FLUSH(sc); 16849 delay(1000); 16850 reg &= ~CTRL_LANPHYPC_OVERRIDE; 16851 CSR_WRITE(sc, WMREG_CTRL, reg); 16852 CSR_WRITE_FLUSH(sc); 16853 16854 if (sc->sc_type < WM_T_PCH_LPT) 16855 delay(50 * 1000); 16856 else { 16857 i = 20; 16858 16859 do { 16860 delay(5 * 1000); 16861 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0) 16862 && i--); 16863 16864 delay(30 * 1000); 16865 } 16866 } 16867 16868 static int 16869 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link) 16870 { 16871 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ) 16872 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND; 16873 uint32_t rxa; 16874 uint16_t scale = 0, lat_enc = 0; 16875 int32_t obff_hwm = 0; 16876 int64_t lat_ns, value; 16877 16878 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16879 device_xname(sc->sc_dev), __func__)); 16880 16881 if (link) { 16882 uint16_t max_snoop, max_nosnoop, max_ltr_enc; 16883 uint32_t status; 16884 uint16_t speed; 16885 pcireg_t preg; 16886 16887 status = CSR_READ(sc, WMREG_STATUS); 16888 switch (__SHIFTOUT(status, STATUS_SPEED)) { 16889 case STATUS_SPEED_10: 16890 speed = 10; 16891 break; 16892 case STATUS_SPEED_100: 16893 speed = 100; 16894 break; 16895 case STATUS_SPEED_1000: 16896 speed = 1000; 16897 break; 16898 default: 16899 device_printf(sc->sc_dev, "Unknown speed " 16900 "(status = %08x)\n", status); 16901 return -1; 16902 } 16903 16904 /* Rx Packet Buffer Allocation size (KB) */ 16905 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK; 16906 16907 /* 16908 * Determine the maximum latency tolerated by the device. 16909 * 16910 * Per the PCIe spec, the tolerated latencies are encoded as 16911 * a 3-bit encoded scale (only 0-5 are valid) multiplied by 16912 * a 10-bit value (0-1023) to provide a range from 1 ns to 16913 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns, 16914 * 1=2^5ns, 2=2^10ns,...5=2^25ns. 16915 */ 16916 lat_ns = ((int64_t)rxa * 1024 - 16917 (2 * ((int64_t)sc->sc_ethercom.ec_if.if_mtu 16918 + ETHER_HDR_LEN))) * 8 * 1000; 16919 if (lat_ns < 0) 16920 lat_ns = 0; 16921 else 16922 lat_ns /= speed; 16923 value = lat_ns; 16924 16925 while (value > LTRV_VALUE) { 16926 scale ++; 16927 value = howmany(value, __BIT(5)); 16928 } 16929 if (scale > LTRV_SCALE_MAX) { 16930 device_printf(sc->sc_dev, 16931 "Invalid LTR latency scale %d\n", scale); 16932 return -1; 16933 } 16934 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value); 16935 16936 /* Determine the maximum latency tolerated by the platform */ 16937 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 16938 WM_PCI_LTR_CAP_LPT); 16939 max_snoop = preg & 0xffff; 16940 max_nosnoop = preg >> 16; 16941 16942 max_ltr_enc = MAX(max_snoop, max_nosnoop); 16943 16944 if (lat_enc > max_ltr_enc) { 16945 lat_enc = max_ltr_enc; 16946 lat_ns = __SHIFTOUT(lat_enc, PCI_LTR_MAXSNOOPLAT_VAL) 16947 * PCI_LTR_SCALETONS( 16948 __SHIFTOUT(lat_enc, 16949 PCI_LTR_MAXSNOOPLAT_SCALE)); 16950 } 16951 16952 if (lat_ns) { 16953 lat_ns *= speed * 1000; 16954 lat_ns /= 8; 16955 lat_ns /= 1000000000; 16956 obff_hwm = (int32_t)(rxa - lat_ns); 16957 } 16958 if ((obff_hwm < 0) || (obff_hwm > SVT_OFF_HWM)) { 16959 device_printf(sc->sc_dev, "Invalid high water mark %d" 16960 "(rxa = %d, lat_ns = %d)\n", 16961 obff_hwm, (int32_t)rxa, (int32_t)lat_ns); 16962 return -1; 16963 } 16964 } 16965 /* Snoop and No-Snoop latencies the same */ 16966 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP); 16967 CSR_WRITE(sc, WMREG_LTRV, reg); 16968 16969 /* Set OBFF high water mark */ 16970 reg = CSR_READ(sc, WMREG_SVT) & ~SVT_OFF_HWM; 16971 reg |= obff_hwm; 16972 CSR_WRITE(sc, WMREG_SVT, reg); 16973 16974 /* Enable OBFF */ 16975 reg = CSR_READ(sc, WMREG_SVCR); 16976 reg |= SVCR_OFF_EN | SVCR_OFF_MASKINT; 16977 CSR_WRITE(sc, WMREG_SVCR, reg); 16978 16979 return 0; 16980 } 16981 16982 /* 16983 * I210 Errata 25 and I211 Errata 10 16984 * Slow System Clock. 16985 * 16986 * Note that this function is called on both FLASH and iNVM case on NetBSD. 16987 */ 16988 static int 16989 wm_pll_workaround_i210(struct wm_softc *sc) 16990 { 16991 uint32_t mdicnfg, wuc; 16992 uint32_t reg; 16993 pcireg_t pcireg; 16994 uint32_t pmreg; 16995 uint16_t nvmword, tmp_nvmword; 16996 uint16_t phyval; 16997 bool wa_done = false; 16998 int i, rv = 0; 16999 17000 /* Get Power Management cap offset */ 17001 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT, 17002 &pmreg, NULL) == 0) 17003 return -1; 17004 17005 /* Save WUC and MDICNFG registers */ 17006 wuc = CSR_READ(sc, WMREG_WUC); 17007 mdicnfg = CSR_READ(sc, WMREG_MDICNFG); 17008 17009 reg = mdicnfg & ~MDICNFG_DEST; 17010 CSR_WRITE(sc, WMREG_MDICNFG, reg); 17011 17012 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0) { 17013 /* 17014 * The default value of the Initialization Control Word 1 17015 * is the same on both I210's FLASH_HW and I21[01]'s iNVM. 17016 */ 17017 nvmword = INVM_DEFAULT_AL; 17018 } 17019 tmp_nvmword = nvmword | INVM_PLL_WO_VAL; 17020 17021 for (i = 0; i < WM_MAX_PLL_TRIES; i++) { 17022 wm_gmii_gs40g_readreg(sc->sc_dev, 1, 17023 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG, &phyval); 17024 17025 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) { 17026 rv = 0; 17027 break; /* OK */ 17028 } else 17029 rv = -1; 17030 17031 wa_done = true; 17032 /* Directly reset the internal PHY */ 17033 reg = CSR_READ(sc, WMREG_CTRL); 17034 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET); 17035 17036 reg = CSR_READ(sc, WMREG_CTRL_EXT); 17037 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE; 17038 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 17039 17040 CSR_WRITE(sc, WMREG_WUC, 0); 17041 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16); 17042 CSR_WRITE(sc, WMREG_EEARBC_I210, reg); 17043 17044 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 17045 pmreg + PCI_PMCSR); 17046 pcireg |= PCI_PMCSR_STATE_D3; 17047 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 17048 pmreg + PCI_PMCSR, pcireg); 17049 delay(1000); 17050 pcireg &= ~PCI_PMCSR_STATE_D3; 17051 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 17052 pmreg + PCI_PMCSR, pcireg); 17053 17054 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16); 17055 CSR_WRITE(sc, WMREG_EEARBC_I210, reg); 17056 17057 /* Restore WUC register */ 17058 CSR_WRITE(sc, WMREG_WUC, wuc); 17059 } 17060 17061 /* Restore MDICNFG setting */ 17062 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg); 17063 if (wa_done) 17064 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n"); 17065 return rv; 17066 } 17067 17068 static void 17069 wm_legacy_irq_quirk_spt(struct wm_softc *sc) 17070 { 17071 uint32_t reg; 17072 17073 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17074 device_xname(sc->sc_dev), __func__)); 17075 KASSERT((sc->sc_type == WM_T_PCH_SPT) 17076 || (sc->sc_type == WM_T_PCH_CNP)); 17077 17078 reg = CSR_READ(sc, WMREG_FEXTNVM7); 17079 reg |= FEXTNVM7_SIDE_CLK_UNGATE; 17080 CSR_WRITE(sc, WMREG_FEXTNVM7, reg); 17081 17082 reg = CSR_READ(sc, WMREG_FEXTNVM9); 17083 reg |= FEXTNVM9_IOSFSB_CLKGATE_DIS | FEXTNVM9_IOSFSB_CLKREQ_DIS; 17084 CSR_WRITE(sc, WMREG_FEXTNVM9, reg); 17085 } 17086 17087 /* Sysctl function */ 17088 #ifdef WM_DEBUG 17089 static int 17090 wm_sysctl_debug(SYSCTLFN_ARGS) 17091 { 17092 struct sysctlnode node = *rnode; 17093 struct wm_softc *sc = (struct wm_softc *)node.sysctl_data; 17094 uint32_t dflags; 17095 int error; 17096 17097 dflags = sc->sc_debug; 17098 node.sysctl_data = &dflags; 17099 error = sysctl_lookup(SYSCTLFN_CALL(&node)); 17100 17101 if (error || newp == NULL) 17102 return error; 17103 17104 sc->sc_debug = dflags; 17105 17106 return 0; 17107 } 17108 #endif 17109