1 /* $NetBSD: if_wm.c,v 1.781 2023/05/11 07:47:14 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.781 2023/05/11 07:47:14 msaitoh Exp $"); 86 87 #ifdef _KERNEL_OPT 88 #include "opt_if_wm.h" 89 #endif 90 91 #include <sys/param.h> 92 93 #include <sys/atomic.h> 94 #include <sys/callout.h> 95 #include <sys/cpu.h> 96 #include <sys/device.h> 97 #include <sys/errno.h> 98 #include <sys/interrupt.h> 99 #include <sys/ioctl.h> 100 #include <sys/kernel.h> 101 #include <sys/kmem.h> 102 #include <sys/mbuf.h> 103 #include <sys/pcq.h> 104 #include <sys/queue.h> 105 #include <sys/rndsource.h> 106 #include <sys/socket.h> 107 #include <sys/sysctl.h> 108 #include <sys/syslog.h> 109 #include <sys/systm.h> 110 #include <sys/workqueue.h> 111 112 #include <net/if.h> 113 #include <net/if_dl.h> 114 #include <net/if_media.h> 115 #include <net/if_ether.h> 116 117 #include <net/bpf.h> 118 119 #include <net/rss_config.h> 120 121 #include <netinet/in.h> /* XXX for struct ip */ 122 #include <netinet/in_systm.h> /* XXX for struct ip */ 123 #include <netinet/ip.h> /* XXX for struct ip */ 124 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */ 125 #include <netinet/tcp.h> /* XXX for struct tcphdr */ 126 127 #include <sys/bus.h> 128 #include <sys/intr.h> 129 #include <machine/endian.h> 130 131 #include <dev/mii/mii.h> 132 #include <dev/mii/mdio.h> 133 #include <dev/mii/miivar.h> 134 #include <dev/mii/miidevs.h> 135 #include <dev/mii/mii_bitbang.h> 136 #include <dev/mii/ikphyreg.h> 137 #include <dev/mii/igphyreg.h> 138 #include <dev/mii/igphyvar.h> 139 #include <dev/mii/inbmphyreg.h> 140 #include <dev/mii/ihphyreg.h> 141 #include <dev/mii/makphyreg.h> 142 143 #include <dev/pci/pcireg.h> 144 #include <dev/pci/pcivar.h> 145 #include <dev/pci/pcidevs.h> 146 147 #include <dev/pci/if_wmreg.h> 148 #include <dev/pci/if_wmvar.h> 149 150 #ifdef WM_DEBUG 151 #define WM_DEBUG_LINK __BIT(0) 152 #define WM_DEBUG_TX __BIT(1) 153 #define WM_DEBUG_RX __BIT(2) 154 #define WM_DEBUG_GMII __BIT(3) 155 #define WM_DEBUG_MANAGE __BIT(4) 156 #define WM_DEBUG_NVM __BIT(5) 157 #define WM_DEBUG_INIT __BIT(6) 158 #define WM_DEBUG_LOCK __BIT(7) 159 160 #if 0 161 #define WM_DEBUG_DEFAULT WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | \ 162 WM_DEBUG_GMII | WM_DEBUG_MANAGE | WM_DEBUG_NVM | WM_DEBUG_INIT | \ 163 WM_DEBUG_LOCK 164 #endif 165 166 #define DPRINTF(sc, x, y) \ 167 do { \ 168 if ((sc)->sc_debug & (x)) \ 169 printf y; \ 170 } while (0) 171 #else 172 #define DPRINTF(sc, x, y) __nothing 173 #endif /* WM_DEBUG */ 174 175 #define WM_WORKQUEUE_PRI PRI_SOFTNET 176 177 /* 178 * This device driver's max interrupt numbers. 179 */ 180 #define WM_MAX_NQUEUEINTR 16 181 #define WM_MAX_NINTR (WM_MAX_NQUEUEINTR + 1) 182 183 #ifndef WM_DISABLE_MSI 184 #define WM_DISABLE_MSI 0 185 #endif 186 #ifndef WM_DISABLE_MSIX 187 #define WM_DISABLE_MSIX 0 188 #endif 189 190 int wm_disable_msi = WM_DISABLE_MSI; 191 int wm_disable_msix = WM_DISABLE_MSIX; 192 193 #ifndef WM_WATCHDOG_TIMEOUT 194 #define WM_WATCHDOG_TIMEOUT 5 195 #endif 196 static int wm_watchdog_timeout = WM_WATCHDOG_TIMEOUT; 197 198 /* 199 * Transmit descriptor list size. Due to errata, we can only have 200 * 256 hardware descriptors in the ring on < 82544, but we use 4096 201 * on >= 82544. We tell the upper layers that they can queue a lot 202 * of packets, and we go ahead and manage up to 64 (16 for the i82547) 203 * of them at a time. 204 * 205 * We allow up to 64 DMA segments per packet. Pathological packet 206 * chains containing many small mbufs have been observed in zero-copy 207 * situations with jumbo frames. If a mbuf chain has more than 64 DMA segments, 208 * m_defrag() is called to reduce it. 209 */ 210 #define WM_NTXSEGS 64 211 #define WM_IFQUEUELEN 256 212 #define WM_TXQUEUELEN_MAX 64 213 #define WM_TXQUEUELEN_MAX_82547 16 214 #define WM_TXQUEUELEN(txq) ((txq)->txq_num) 215 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1) 216 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8) 217 #define WM_NTXDESC_82542 256 218 #define WM_NTXDESC_82544 4096 219 #define WM_NTXDESC(txq) ((txq)->txq_ndesc) 220 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1) 221 #define WM_TXDESCS_SIZE(txq) (WM_NTXDESC(txq) * (txq)->txq_descsize) 222 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq)) 223 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq)) 224 225 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */ 226 227 #define WM_TXINTERQSIZE 256 228 229 #ifndef WM_TX_PROCESS_LIMIT_DEFAULT 230 #define WM_TX_PROCESS_LIMIT_DEFAULT 100U 231 #endif 232 #ifndef WM_TX_INTR_PROCESS_LIMIT_DEFAULT 233 #define WM_TX_INTR_PROCESS_LIMIT_DEFAULT 0U 234 #endif 235 236 /* 237 * Receive descriptor list size. We have one Rx buffer for normal 238 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized 239 * packet. We allocate 256 receive descriptors, each with a 2k 240 * buffer (MCLBYTES), which gives us room for 50 jumbo packets. 241 */ 242 #define WM_NRXDESC 256U 243 #define WM_NRXDESC_MASK (WM_NRXDESC - 1) 244 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK) 245 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK) 246 247 #ifndef WM_RX_PROCESS_LIMIT_DEFAULT 248 #define WM_RX_PROCESS_LIMIT_DEFAULT 100U 249 #endif 250 #ifndef WM_RX_INTR_PROCESS_LIMIT_DEFAULT 251 #define WM_RX_INTR_PROCESS_LIMIT_DEFAULT 0U 252 #endif 253 254 typedef union txdescs { 255 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544]; 256 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544]; 257 } txdescs_t; 258 259 typedef union rxdescs { 260 wiseman_rxdesc_t sctxu_rxdescs[WM_NRXDESC]; 261 ext_rxdesc_t sctxu_ext_rxdescs[WM_NRXDESC]; /* 82574 only */ 262 nq_rxdesc_t sctxu_nq_rxdescs[WM_NRXDESC]; /* 82575 and newer */ 263 } rxdescs_t; 264 265 #define WM_CDTXOFF(txq, x) ((txq)->txq_descsize * (x)) 266 #define WM_CDRXOFF(rxq, x) ((rxq)->rxq_descsize * (x)) 267 268 /* 269 * Software state for transmit jobs. 270 */ 271 struct wm_txsoft { 272 struct mbuf *txs_mbuf; /* head of our mbuf chain */ 273 bus_dmamap_t txs_dmamap; /* our DMA map */ 274 int txs_firstdesc; /* first descriptor in packet */ 275 int txs_lastdesc; /* last descriptor in packet */ 276 int txs_ndesc; /* # of descriptors used */ 277 }; 278 279 /* 280 * Software state for receive buffers. Each descriptor gets a 2k (MCLBYTES) 281 * buffer and a DMA map. For packets which fill more than one buffer, we chain 282 * them together. 283 */ 284 struct wm_rxsoft { 285 struct mbuf *rxs_mbuf; /* head of our mbuf chain */ 286 bus_dmamap_t rxs_dmamap; /* our DMA map */ 287 }; 288 289 #define WM_LINKUP_TIMEOUT 50 290 291 static uint16_t swfwphysem[] = { 292 SWFW_PHY0_SM, 293 SWFW_PHY1_SM, 294 SWFW_PHY2_SM, 295 SWFW_PHY3_SM 296 }; 297 298 static const uint32_t wm_82580_rxpbs_table[] = { 299 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140 300 }; 301 302 struct wm_softc; 303 304 #if defined(_LP64) && !defined(WM_DISABLE_EVENT_COUNTERS) 305 #if !defined(WM_EVENT_COUNTERS) 306 #define WM_EVENT_COUNTERS 1 307 #endif 308 #endif 309 310 #ifdef WM_EVENT_COUNTERS 311 #define WM_Q_EVCNT_DEFINE(qname, evname) \ 312 char qname##_##evname##_evcnt_name[sizeof("qname##XX##evname")]; \ 313 struct evcnt qname##_ev_##evname 314 315 #define WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, evtype) \ 316 do { \ 317 snprintf((q)->qname##_##evname##_evcnt_name, \ 318 sizeof((q)->qname##_##evname##_evcnt_name), \ 319 "%s%02d%s", #qname, (qnum), #evname); \ 320 evcnt_attach_dynamic(&(q)->qname##_ev_##evname, \ 321 (evtype), NULL, (xname), \ 322 (q)->qname##_##evname##_evcnt_name); \ 323 } while (0) 324 325 #define WM_Q_MISC_EVCNT_ATTACH(qname, evname, q, qnum, xname) \ 326 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_MISC) 327 328 #define WM_Q_INTR_EVCNT_ATTACH(qname, evname, q, qnum, xname) \ 329 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_INTR) 330 331 #define WM_Q_EVCNT_DETACH(qname, evname, q, qnum) \ 332 evcnt_detach(&(q)->qname##_ev_##evname) 333 #endif /* WM_EVENT_COUNTERS */ 334 335 struct wm_txqueue { 336 kmutex_t *txq_lock; /* lock for tx operations */ 337 338 struct wm_softc *txq_sc; /* shortcut (skip struct wm_queue) */ 339 340 /* Software state for the transmit descriptors. */ 341 int txq_num; /* must be a power of two */ 342 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX]; 343 344 /* TX control data structures. */ 345 int txq_ndesc; /* must be a power of two */ 346 size_t txq_descsize; /* a tx descriptor size */ 347 txdescs_t *txq_descs_u; 348 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */ 349 bus_dma_segment_t txq_desc_seg; /* control data segment */ 350 int txq_desc_rseg; /* real number of control segment */ 351 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr 352 #define txq_descs txq_descs_u->sctxu_txdescs 353 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs 354 355 bus_addr_t txq_tdt_reg; /* offset of TDT register */ 356 357 int txq_free; /* number of free Tx descriptors */ 358 int txq_next; /* next ready Tx descriptor */ 359 360 int txq_sfree; /* number of free Tx jobs */ 361 int txq_snext; /* next free Tx job */ 362 int txq_sdirty; /* dirty Tx jobs */ 363 364 /* These 4 variables are used only on the 82547. */ 365 int txq_fifo_size; /* Tx FIFO size */ 366 int txq_fifo_head; /* current head of FIFO */ 367 uint32_t txq_fifo_addr; /* internal address of start of FIFO */ 368 int txq_fifo_stall; /* Tx FIFO is stalled */ 369 370 /* 371 * When ncpu > number of Tx queues, a Tx queue is shared by multiple 372 * CPUs. This queue intermediate them without block. 373 */ 374 pcq_t *txq_interq; 375 376 /* 377 * NEWQUEUE devices must use not ifp->if_flags but txq->txq_flags 378 * to manage Tx H/W queue's busy flag. 379 */ 380 int txq_flags; /* flags for H/W queue, see below */ 381 #define WM_TXQ_NO_SPACE 0x1 382 #define WM_TXQ_LINKDOWN_DISCARD 0x2 383 384 bool txq_stopping; 385 386 bool txq_sending; 387 time_t txq_lastsent; 388 389 /* Checksum flags used for previous packet */ 390 uint32_t txq_last_hw_cmd; 391 uint8_t txq_last_hw_fields; 392 uint16_t txq_last_hw_ipcs; 393 uint16_t txq_last_hw_tucs; 394 395 uint32_t txq_packets; /* for AIM */ 396 uint32_t txq_bytes; /* for AIM */ 397 #ifdef WM_EVENT_COUNTERS 398 /* TX event counters */ 399 WM_Q_EVCNT_DEFINE(txq, txsstall); /* Stalled due to no txs */ 400 WM_Q_EVCNT_DEFINE(txq, txdstall); /* Stalled due to no txd */ 401 WM_Q_EVCNT_DEFINE(txq, fifo_stall); /* FIFO stalls (82547) */ 402 WM_Q_EVCNT_DEFINE(txq, txdw); /* Tx descriptor interrupts */ 403 WM_Q_EVCNT_DEFINE(txq, txqe); /* Tx queue empty interrupts */ 404 /* XXX not used? */ 405 406 WM_Q_EVCNT_DEFINE(txq, ipsum); /* IP checksums comp. */ 407 WM_Q_EVCNT_DEFINE(txq, tusum); /* TCP/UDP cksums comp. */ 408 WM_Q_EVCNT_DEFINE(txq, tusum6); /* TCP/UDP v6 cksums comp. */ 409 WM_Q_EVCNT_DEFINE(txq, tso); /* TCP seg offload (IPv4) */ 410 WM_Q_EVCNT_DEFINE(txq, tso6); /* TCP seg offload (IPv6) */ 411 WM_Q_EVCNT_DEFINE(txq, tsopain); /* Painful header manip. for TSO */ 412 WM_Q_EVCNT_DEFINE(txq, pcqdrop); /* Pkt dropped in pcq */ 413 WM_Q_EVCNT_DEFINE(txq, descdrop); /* Pkt dropped in MAC desc ring */ 414 /* other than toomanyseg */ 415 416 WM_Q_EVCNT_DEFINE(txq, toomanyseg); /* Pkt dropped(toomany DMA segs) */ 417 WM_Q_EVCNT_DEFINE(txq, defrag); /* m_defrag() */ 418 WM_Q_EVCNT_DEFINE(txq, underrun); /* Tx underrun */ 419 WM_Q_EVCNT_DEFINE(txq, skipcontext); /* Tx skip wrong cksum context */ 420 421 char txq_txseg_evcnt_names[WM_NTXSEGS][sizeof("txqXXtxsegXXX")]; 422 struct evcnt txq_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */ 423 #endif /* WM_EVENT_COUNTERS */ 424 }; 425 426 struct wm_rxqueue { 427 kmutex_t *rxq_lock; /* lock for rx operations */ 428 429 struct wm_softc *rxq_sc; /* shortcut (skip struct wm_queue) */ 430 431 /* Software state for the receive descriptors. */ 432 struct wm_rxsoft rxq_soft[WM_NRXDESC]; 433 434 /* RX control data structures. */ 435 int rxq_ndesc; /* must be a power of two */ 436 size_t rxq_descsize; /* a rx descriptor size */ 437 rxdescs_t *rxq_descs_u; 438 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */ 439 bus_dma_segment_t rxq_desc_seg; /* control data segment */ 440 int rxq_desc_rseg; /* real number of control segment */ 441 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr 442 #define rxq_descs rxq_descs_u->sctxu_rxdescs 443 #define rxq_ext_descs rxq_descs_u->sctxu_ext_rxdescs 444 #define rxq_nq_descs rxq_descs_u->sctxu_nq_rxdescs 445 446 bus_addr_t rxq_rdt_reg; /* offset of RDT register */ 447 448 int rxq_ptr; /* next ready Rx desc/queue ent */ 449 int rxq_discard; 450 int rxq_len; 451 struct mbuf *rxq_head; 452 struct mbuf *rxq_tail; 453 struct mbuf **rxq_tailp; 454 455 bool rxq_stopping; 456 457 uint32_t rxq_packets; /* for AIM */ 458 uint32_t rxq_bytes; /* for AIM */ 459 #ifdef WM_EVENT_COUNTERS 460 /* RX event counters */ 461 WM_Q_EVCNT_DEFINE(rxq, intr); /* Interrupts */ 462 WM_Q_EVCNT_DEFINE(rxq, defer); /* Rx deferred processing */ 463 464 WM_Q_EVCNT_DEFINE(rxq, ipsum); /* IP checksums checked */ 465 WM_Q_EVCNT_DEFINE(rxq, tusum); /* TCP/UDP cksums checked */ 466 #endif 467 }; 468 469 struct wm_queue { 470 int wmq_id; /* index of TX/RX queues */ 471 int wmq_intr_idx; /* index of MSI-X tables */ 472 473 uint32_t wmq_itr; /* interrupt interval per queue. */ 474 bool wmq_set_itr; 475 476 struct wm_txqueue wmq_txq; 477 struct wm_rxqueue wmq_rxq; 478 char sysctlname[32]; /* Name for sysctl */ 479 480 bool wmq_txrx_use_workqueue; 481 bool wmq_wq_enqueued; 482 struct work wmq_cookie; 483 void *wmq_si; 484 }; 485 486 struct wm_phyop { 487 int (*acquire)(struct wm_softc *) __attribute__((warn_unused_result)); 488 void (*release)(struct wm_softc *); 489 int (*readreg_locked)(device_t, int, int, uint16_t *); 490 int (*writereg_locked)(device_t, int, int, uint16_t); 491 int reset_delay_us; 492 bool no_errprint; 493 }; 494 495 struct wm_nvmop { 496 int (*acquire)(struct wm_softc *) __attribute__((warn_unused_result)); 497 void (*release)(struct wm_softc *); 498 int (*read)(struct wm_softc *, int, int, uint16_t *); 499 }; 500 501 /* 502 * Software state per device. 503 */ 504 struct wm_softc { 505 device_t sc_dev; /* generic device information */ 506 bus_space_tag_t sc_st; /* bus space tag */ 507 bus_space_handle_t sc_sh; /* bus space handle */ 508 bus_size_t sc_ss; /* bus space size */ 509 bus_space_tag_t sc_iot; /* I/O space tag */ 510 bus_space_handle_t sc_ioh; /* I/O space handle */ 511 bus_size_t sc_ios; /* I/O space size */ 512 bus_space_tag_t sc_flasht; /* flash registers space tag */ 513 bus_space_handle_t sc_flashh; /* flash registers space handle */ 514 bus_size_t sc_flashs; /* flash registers space size */ 515 off_t sc_flashreg_offset; /* 516 * offset to flash registers from 517 * start of BAR 518 */ 519 bus_dma_tag_t sc_dmat; /* bus DMA tag */ 520 521 struct ethercom sc_ethercom; /* Ethernet common data */ 522 struct mii_data sc_mii; /* MII/media information */ 523 524 pci_chipset_tag_t sc_pc; 525 pcitag_t sc_pcitag; 526 int sc_bus_speed; /* PCI/PCIX bus speed */ 527 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */ 528 529 uint16_t sc_pcidevid; /* PCI device ID */ 530 wm_chip_type sc_type; /* MAC type */ 531 int sc_rev; /* MAC revision */ 532 wm_phy_type sc_phytype; /* PHY type */ 533 uint8_t sc_sfptype; /* SFP type */ 534 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/ 535 #define WM_MEDIATYPE_UNKNOWN 0x00 536 #define WM_MEDIATYPE_FIBER 0x01 537 #define WM_MEDIATYPE_COPPER 0x02 538 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */ 539 int sc_funcid; /* unit number of the chip (0 to 3) */ 540 int sc_flags; /* flags; see below */ 541 u_short sc_if_flags; /* last if_flags */ 542 int sc_ec_capenable; /* last ec_capenable */ 543 int sc_flowflags; /* 802.3x flow control flags */ 544 uint16_t eee_lp_ability; /* EEE link partner's ability */ 545 int sc_align_tweak; 546 547 void *sc_ihs[WM_MAX_NINTR]; /* 548 * interrupt cookie. 549 * - legacy and msi use sc_ihs[0] only 550 * - msix use sc_ihs[0] to sc_ihs[nintrs-1] 551 */ 552 pci_intr_handle_t *sc_intrs; /* 553 * legacy and msi use sc_intrs[0] only 554 * msix use sc_intrs[0] to sc_ihs[nintrs-1] 555 */ 556 int sc_nintrs; /* number of interrupts */ 557 558 int sc_link_intr_idx; /* index of MSI-X tables */ 559 560 callout_t sc_tick_ch; /* tick callout */ 561 bool sc_core_stopping; 562 563 int sc_nvm_ver_major; 564 int sc_nvm_ver_minor; 565 int sc_nvm_ver_build; 566 int sc_nvm_addrbits; /* NVM address bits */ 567 unsigned int sc_nvm_wordsize; /* NVM word size */ 568 int sc_ich8_flash_base; 569 int sc_ich8_flash_bank_size; 570 int sc_nvm_k1_enabled; 571 572 int sc_nqueues; 573 struct wm_queue *sc_queue; 574 u_int sc_tx_process_limit; /* Tx proc. repeat limit in softint */ 575 u_int sc_tx_intr_process_limit; /* Tx proc. repeat limit in H/W intr */ 576 u_int sc_rx_process_limit; /* Rx proc. repeat limit in softint */ 577 u_int sc_rx_intr_process_limit; /* Rx proc. repeat limit in H/W intr */ 578 struct workqueue *sc_queue_wq; 579 bool sc_txrx_use_workqueue; 580 581 int sc_affinity_offset; 582 583 #ifdef WM_EVENT_COUNTERS 584 /* Event counters. */ 585 struct evcnt sc_ev_linkintr; /* Link interrupts */ 586 587 /* >= WM_T_82542_2_1 */ 588 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */ 589 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */ 590 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */ 591 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */ 592 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */ 593 594 struct evcnt sc_ev_crcerrs; /* CRC Error */ 595 struct evcnt sc_ev_algnerrc; /* Alignment Error */ 596 struct evcnt sc_ev_symerrc; /* Symbol Error */ 597 struct evcnt sc_ev_rxerrc; /* Receive Error */ 598 struct evcnt sc_ev_mpc; /* Missed Packets */ 599 struct evcnt sc_ev_scc; /* Single Collision */ 600 struct evcnt sc_ev_ecol; /* Excessive Collision */ 601 struct evcnt sc_ev_mcc; /* Multiple Collision */ 602 struct evcnt sc_ev_latecol; /* Late Collision */ 603 struct evcnt sc_ev_colc; /* Collision */ 604 struct evcnt sc_ev_cbtmpc; /* Circuit Breaker Tx Mng. Packet */ 605 struct evcnt sc_ev_dc; /* Defer */ 606 struct evcnt sc_ev_tncrs; /* Tx-No CRS */ 607 struct evcnt sc_ev_sec; /* Sequence Error */ 608 609 /* Old */ 610 struct evcnt sc_ev_cexterr; /* Carrier Extension Error */ 611 /* New */ 612 struct evcnt sc_ev_htdpmc; /* Host Tx Discarded Pkts by MAC */ 613 614 struct evcnt sc_ev_rlec; /* Receive Length Error */ 615 struct evcnt sc_ev_cbrdpc; /* Circuit Breaker Rx Dropped Packet */ 616 struct evcnt sc_ev_prc64; /* Packets Rx (64 bytes) */ 617 struct evcnt sc_ev_prc127; /* Packets Rx (65-127 bytes) */ 618 struct evcnt sc_ev_prc255; /* Packets Rx (128-255 bytes) */ 619 struct evcnt sc_ev_prc511; /* Packets Rx (256-511 bytes) */ 620 struct evcnt sc_ev_prc1023; /* Packets Rx (512-1023 bytes) */ 621 struct evcnt sc_ev_prc1522; /* Packets Rx (1024-1522 bytes) */ 622 struct evcnt sc_ev_gprc; /* Good Packets Rx */ 623 struct evcnt sc_ev_bprc; /* Broadcast Packets Rx */ 624 struct evcnt sc_ev_mprc; /* Multicast Packets Rx */ 625 struct evcnt sc_ev_gptc; /* Good Packets Tx */ 626 struct evcnt sc_ev_gorc; /* Good Octets Rx */ 627 struct evcnt sc_ev_gotc; /* Good Octets Tx */ 628 struct evcnt sc_ev_rnbc; /* Rx No Buffers */ 629 struct evcnt sc_ev_ruc; /* Rx Undersize */ 630 struct evcnt sc_ev_rfc; /* Rx Fragment */ 631 struct evcnt sc_ev_roc; /* Rx Oversize */ 632 struct evcnt sc_ev_rjc; /* Rx Jabber */ 633 struct evcnt sc_ev_mgtprc; /* Management Packets RX */ 634 struct evcnt sc_ev_mgtpdc; /* Management Packets Dropped */ 635 struct evcnt sc_ev_mgtptc; /* Management Packets TX */ 636 struct evcnt sc_ev_tor; /* Total Octets Rx */ 637 struct evcnt sc_ev_tot; /* Total Octets Tx */ 638 struct evcnt sc_ev_tpr; /* Total Packets Rx */ 639 struct evcnt sc_ev_tpt; /* Total Packets Tx */ 640 struct evcnt sc_ev_ptc64; /* Packets Tx (64 bytes) */ 641 struct evcnt sc_ev_ptc127; /* Packets Tx (65-127 bytes) */ 642 struct evcnt sc_ev_ptc255; /* Packets Tx (128-255 bytes) */ 643 struct evcnt sc_ev_ptc511; /* Packets Tx (256-511 bytes) */ 644 struct evcnt sc_ev_ptc1023; /* Packets Tx (512-1023 bytes) */ 645 struct evcnt sc_ev_ptc1522; /* Packets Tx (1024-1522 Bytes) */ 646 struct evcnt sc_ev_mptc; /* Multicast Packets Tx */ 647 struct evcnt sc_ev_bptc; /* Broadcast Packets Tx */ 648 struct evcnt sc_ev_tsctc; /* TCP Segmentation Context Tx */ 649 650 /* Old */ 651 struct evcnt sc_ev_tsctfc; /* TCP Segmentation Context Tx Fail */ 652 /* New */ 653 struct evcnt sc_ev_cbrmpc; /* Circuit Breaker Rx Mng. Packet */ 654 655 struct evcnt sc_ev_iac; /* Interrupt Assertion */ 656 657 /* Old */ 658 struct evcnt sc_ev_icrxptc; /* Intr. Cause Rx Pkt Timer Expire */ 659 struct evcnt sc_ev_icrxatc; /* Intr. Cause Rx Abs Timer Expire */ 660 struct evcnt sc_ev_ictxptc; /* Intr. Cause Tx Pkt Timer Expire */ 661 struct evcnt sc_ev_ictxatc; /* Intr. Cause Tx Abs Timer Expire */ 662 struct evcnt sc_ev_ictxqec; /* Intr. Cause Tx Queue Empty */ 663 struct evcnt sc_ev_ictxqmtc; /* Intr. Cause Tx Queue Min Thresh */ 664 /* 665 * sc_ev_rxdmtc is shared with both "Intr. cause" and 666 * non "Intr. cause" register. 667 */ 668 struct evcnt sc_ev_rxdmtc; /* (Intr. Cause) Rx Desc Min Thresh */ 669 struct evcnt sc_ev_icrxoc; /* Intr. Cause Receiver Overrun */ 670 /* New */ 671 struct evcnt sc_ev_rpthc; /* Rx Packets To Host */ 672 struct evcnt sc_ev_debug1; /* Debug Counter 1 */ 673 struct evcnt sc_ev_debug2; /* Debug Counter 2 */ 674 struct evcnt sc_ev_debug3; /* Debug Counter 3 */ 675 struct evcnt sc_ev_hgptc; /* Host Good Packets TX */ 676 struct evcnt sc_ev_debug4; /* Debug Counter 4 */ 677 struct evcnt sc_ev_htcbdpc; /* Host Tx Circuit Breaker Drp. Pkts */ 678 struct evcnt sc_ev_hgorc; /* Host Good Octets Rx */ 679 struct evcnt sc_ev_hgotc; /* Host Good Octets Tx */ 680 struct evcnt sc_ev_lenerrs; /* Length Error */ 681 struct evcnt sc_ev_tlpic; /* EEE Tx LPI */ 682 struct evcnt sc_ev_rlpic; /* EEE Rx LPI */ 683 struct evcnt sc_ev_b2ogprc; /* BMC2OS pkts received by host */ 684 struct evcnt sc_ev_o2bspc; /* OS2BMC pkts transmitted by host */ 685 struct evcnt sc_ev_b2ospc; /* BMC2OS pkts sent by BMC */ 686 struct evcnt sc_ev_o2bgptc; /* OS2BMC pkts received by BMC */ 687 struct evcnt sc_ev_scvpc; /* SerDes/SGMII Code Violation Pkt. */ 688 struct evcnt sc_ev_hrmpc; /* Header Redirection Missed Packet */ 689 #endif /* WM_EVENT_COUNTERS */ 690 691 struct sysctllog *sc_sysctllog; 692 693 /* This variable are used only on the 82547. */ 694 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */ 695 696 uint32_t sc_ctrl; /* prototype CTRL register */ 697 #if 0 698 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */ 699 #endif 700 uint32_t sc_icr; /* prototype interrupt bits */ 701 uint32_t sc_itr_init; /* prototype intr throttling reg */ 702 uint32_t sc_tctl; /* prototype TCTL register */ 703 uint32_t sc_rctl; /* prototype RCTL register */ 704 uint32_t sc_txcw; /* prototype TXCW register */ 705 uint32_t sc_tipg; /* prototype TIPG register */ 706 uint32_t sc_fcrtl; /* prototype FCRTL register */ 707 uint32_t sc_pba; /* prototype PBA register */ 708 709 int sc_tbi_linkup; /* TBI link status */ 710 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */ 711 int sc_tbi_serdes_ticks; /* tbi ticks */ 712 713 int sc_mchash_type; /* multicast filter offset */ 714 715 krndsource_t rnd_source; /* random source */ 716 717 struct if_percpuq *sc_ipq; /* softint-based input queues */ 718 719 kmutex_t *sc_core_lock; /* lock for softc operations */ 720 kmutex_t *sc_ich_phymtx; /* 721 * 82574/82583/ICH/PCH specific PHY 722 * mutex. For 82574/82583, the mutex 723 * is used for both PHY and NVM. 724 */ 725 kmutex_t *sc_ich_nvmmtx; /* ICH/PCH specific NVM mutex */ 726 727 struct wm_phyop phy; 728 struct wm_nvmop nvm; 729 730 struct workqueue *sc_reset_wq; 731 struct work sc_reset_work; 732 volatile unsigned sc_reset_pending; 733 734 bool sc_dying; 735 736 #ifdef WM_DEBUG 737 uint32_t sc_debug; 738 bool sc_trigger_reset; 739 #endif 740 }; 741 742 #define WM_RXCHAIN_RESET(rxq) \ 743 do { \ 744 (rxq)->rxq_tailp = &(rxq)->rxq_head; \ 745 *(rxq)->rxq_tailp = NULL; \ 746 (rxq)->rxq_len = 0; \ 747 } while (/*CONSTCOND*/0) 748 749 #define WM_RXCHAIN_LINK(rxq, m) \ 750 do { \ 751 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \ 752 (rxq)->rxq_tailp = &(m)->m_next; \ 753 } while (/*CONSTCOND*/0) 754 755 #ifdef WM_EVENT_COUNTERS 756 #ifdef __HAVE_ATOMIC64_LOADSTORE 757 #define WM_EVCNT_INCR(ev) \ 758 atomic_store_relaxed(&((ev)->ev_count), \ 759 atomic_load_relaxed(&(ev)->ev_count) + 1) 760 #define WM_EVCNT_STORE(ev, val) \ 761 atomic_store_relaxed(&((ev)->ev_count), (val)) 762 #define WM_EVCNT_ADD(ev, val) \ 763 atomic_store_relaxed(&((ev)->ev_count), \ 764 atomic_load_relaxed(&(ev)->ev_count) + (val)) 765 #else 766 #define WM_EVCNT_INCR(ev) \ 767 ((ev)->ev_count)++ 768 #define WM_EVCNT_STORE(ev, val) \ 769 ((ev)->ev_count = (val)) 770 #define WM_EVCNT_ADD(ev, val) \ 771 (ev)->ev_count += (val) 772 #endif 773 774 #define WM_Q_EVCNT_INCR(qname, evname) \ 775 WM_EVCNT_INCR(&(qname)->qname##_ev_##evname) 776 #define WM_Q_EVCNT_STORE(qname, evname, val) \ 777 WM_EVCNT_STORE(&(qname)->qname##_ev_##evname, (val)) 778 #define WM_Q_EVCNT_ADD(qname, evname, val) \ 779 WM_EVCNT_ADD(&(qname)->qname##_ev_##evname, (val)) 780 #else /* !WM_EVENT_COUNTERS */ 781 #define WM_EVCNT_INCR(ev) /* nothing */ 782 #define WM_EVCNT_STORE(ev, val) /* nothing */ 783 #define WM_EVCNT_ADD(ev, val) /* nothing */ 784 785 #define WM_Q_EVCNT_INCR(qname, evname) /* nothing */ 786 #define WM_Q_EVCNT_STORE(qname, evname, val) /* nothing */ 787 #define WM_Q_EVCNT_ADD(qname, evname, val) /* nothing */ 788 #endif /* !WM_EVENT_COUNTERS */ 789 790 #define CSR_READ(sc, reg) \ 791 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 792 #define CSR_WRITE(sc, reg, val) \ 793 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 794 #define CSR_WRITE_FLUSH(sc) \ 795 (void)CSR_READ((sc), WMREG_STATUS) 796 797 #define ICH8_FLASH_READ32(sc, reg) \ 798 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, \ 799 (reg) + sc->sc_flashreg_offset) 800 #define ICH8_FLASH_WRITE32(sc, reg, data) \ 801 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, \ 802 (reg) + sc->sc_flashreg_offset, (data)) 803 804 #define ICH8_FLASH_READ16(sc, reg) \ 805 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, \ 806 (reg) + sc->sc_flashreg_offset) 807 #define ICH8_FLASH_WRITE16(sc, reg, data) \ 808 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, \ 809 (reg) + sc->sc_flashreg_offset, (data)) 810 811 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((txq), (x))) 812 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((rxq), (x))) 813 814 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU) 815 #define WM_CDTXADDR_HI(txq, x) \ 816 (sizeof(bus_addr_t) == 8 ? \ 817 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0) 818 819 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU) 820 #define WM_CDRXADDR_HI(rxq, x) \ 821 (sizeof(bus_addr_t) == 8 ? \ 822 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0) 823 824 /* 825 * Register read/write functions. 826 * Other than CSR_{READ|WRITE}(). 827 */ 828 #if 0 829 static inline uint32_t wm_io_read(struct wm_softc *, int); 830 #endif 831 static inline void wm_io_write(struct wm_softc *, int, uint32_t); 832 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t, 833 uint32_t, uint32_t); 834 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t); 835 836 /* 837 * Descriptor sync/init functions. 838 */ 839 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int); 840 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int); 841 static inline void wm_init_rxdesc(struct wm_rxqueue *, int); 842 843 /* 844 * Device driver interface functions and commonly used functions. 845 * match, attach, detach, init, start, stop, ioctl, watchdog and so on. 846 */ 847 static const struct wm_product *wm_lookup(const struct pci_attach_args *); 848 static int wm_match(device_t, cfdata_t, void *); 849 static void wm_attach(device_t, device_t, void *); 850 static int wm_detach(device_t, int); 851 static bool wm_suspend(device_t, const pmf_qual_t *); 852 static bool wm_resume(device_t, const pmf_qual_t *); 853 static bool wm_watchdog(struct ifnet *); 854 static void wm_watchdog_txq(struct ifnet *, struct wm_txqueue *, 855 uint16_t *); 856 static void wm_watchdog_txq_locked(struct ifnet *, struct wm_txqueue *, 857 uint16_t *); 858 static void wm_tick(void *); 859 static int wm_ifflags_cb(struct ethercom *); 860 static int wm_ioctl(struct ifnet *, u_long, void *); 861 /* MAC address related */ 862 static uint16_t wm_check_alt_mac_addr(struct wm_softc *); 863 static int wm_read_mac_addr(struct wm_softc *, uint8_t *); 864 static void wm_set_ral(struct wm_softc *, const uint8_t *, int); 865 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *); 866 static int wm_rar_count(struct wm_softc *); 867 static void wm_set_filter(struct wm_softc *); 868 /* Reset and init related */ 869 static void wm_set_vlan(struct wm_softc *); 870 static void wm_set_pcie_completion_timeout(struct wm_softc *); 871 static void wm_get_auto_rd_done(struct wm_softc *); 872 static void wm_lan_init_done(struct wm_softc *); 873 static void wm_get_cfg_done(struct wm_softc *); 874 static int wm_phy_post_reset(struct wm_softc *); 875 static int wm_write_smbus_addr(struct wm_softc *); 876 static int wm_init_lcd_from_nvm(struct wm_softc *); 877 static int wm_oem_bits_config_ich8lan(struct wm_softc *, bool); 878 static void wm_initialize_hardware_bits(struct wm_softc *); 879 static uint32_t wm_rxpbs_adjust_82580(uint32_t); 880 static int wm_reset_phy(struct wm_softc *); 881 static void wm_flush_desc_rings(struct wm_softc *); 882 static void wm_reset(struct wm_softc *); 883 static int wm_add_rxbuf(struct wm_rxqueue *, int); 884 static void wm_rxdrain(struct wm_rxqueue *); 885 static void wm_init_rss(struct wm_softc *); 886 static void wm_adjust_qnum(struct wm_softc *, int); 887 static inline bool wm_is_using_msix(struct wm_softc *); 888 static inline bool wm_is_using_multiqueue(struct wm_softc *); 889 static int wm_softint_establish_queue(struct wm_softc *, int, int); 890 static int wm_setup_legacy(struct wm_softc *); 891 static int wm_setup_msix(struct wm_softc *); 892 static int wm_init(struct ifnet *); 893 static int wm_init_locked(struct ifnet *); 894 static void wm_init_sysctls(struct wm_softc *); 895 static void wm_update_stats(struct wm_softc *); 896 static void wm_clear_evcnt(struct wm_softc *); 897 static void wm_unset_stopping_flags(struct wm_softc *); 898 static void wm_set_stopping_flags(struct wm_softc *); 899 static void wm_stop(struct ifnet *, int); 900 static void wm_stop_locked(struct ifnet *, bool, bool); 901 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *); 902 static void wm_82547_txfifo_stall(void *); 903 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *); 904 static void wm_itrs_writereg(struct wm_softc *, struct wm_queue *); 905 /* DMA related */ 906 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *); 907 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *); 908 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *); 909 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *, 910 struct wm_txqueue *); 911 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *); 912 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *); 913 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *, 914 struct wm_rxqueue *); 915 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *); 916 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *); 917 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *); 918 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 919 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 920 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 921 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *, 922 struct wm_txqueue *); 923 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *, 924 struct wm_rxqueue *); 925 static int wm_alloc_txrx_queues(struct wm_softc *); 926 static void wm_free_txrx_queues(struct wm_softc *); 927 static int wm_init_txrx_queues(struct wm_softc *); 928 /* Start */ 929 static void wm_tx_offload(struct wm_softc *, struct wm_txqueue *, 930 struct wm_txsoft *, uint32_t *, uint8_t *); 931 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *); 932 static void wm_start(struct ifnet *); 933 static void wm_start_locked(struct ifnet *); 934 static int wm_transmit(struct ifnet *, struct mbuf *); 935 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *); 936 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *, 937 bool); 938 static void wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *, 939 struct wm_txsoft *, uint32_t *, uint32_t *, bool *); 940 static void wm_nq_start(struct ifnet *); 941 static void wm_nq_start_locked(struct ifnet *); 942 static int wm_nq_transmit(struct ifnet *, struct mbuf *); 943 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *); 944 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *, 945 bool); 946 static void wm_deferred_start_locked(struct wm_txqueue *); 947 static void wm_handle_queue(void *); 948 static void wm_handle_queue_work(struct work *, void *); 949 static void wm_handle_reset_work(struct work *, void *); 950 /* Interrupt */ 951 static bool wm_txeof(struct wm_txqueue *, u_int); 952 static bool wm_rxeof(struct wm_rxqueue *, u_int); 953 static void wm_linkintr_gmii(struct wm_softc *, uint32_t); 954 static void wm_linkintr_tbi(struct wm_softc *, uint32_t); 955 static void wm_linkintr_serdes(struct wm_softc *, uint32_t); 956 static void wm_linkintr(struct wm_softc *, uint32_t); 957 static int wm_intr_legacy(void *); 958 static inline void wm_txrxintr_disable(struct wm_queue *); 959 static inline void wm_txrxintr_enable(struct wm_queue *); 960 static void wm_itrs_calculate(struct wm_softc *, struct wm_queue *); 961 static int wm_txrxintr_msix(void *); 962 static int wm_linkintr_msix(void *); 963 964 /* 965 * Media related. 966 * GMII, SGMII, TBI, SERDES and SFP. 967 */ 968 /* Common */ 969 static void wm_tbi_serdes_set_linkled(struct wm_softc *); 970 /* GMII related */ 971 static void wm_gmii_reset(struct wm_softc *); 972 static void wm_gmii_setup_phytype(struct wm_softc *, uint32_t, uint16_t); 973 static int wm_get_phy_id_82575(struct wm_softc *); 974 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t); 975 static int wm_gmii_mediachange(struct ifnet *); 976 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *); 977 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int); 978 static uint16_t wm_i82543_mii_recvbits(struct wm_softc *); 979 static int wm_gmii_i82543_readreg(device_t, int, int, uint16_t *); 980 static int wm_gmii_i82543_writereg(device_t, int, int, uint16_t); 981 static int wm_gmii_mdic_readreg(device_t, int, int, uint16_t *); 982 static int wm_gmii_mdic_writereg(device_t, int, int, uint16_t); 983 static int wm_gmii_i82544_readreg(device_t, int, int, uint16_t *); 984 static int wm_gmii_i82544_readreg_locked(device_t, int, int, uint16_t *); 985 static int wm_gmii_i82544_writereg(device_t, int, int, uint16_t); 986 static int wm_gmii_i82544_writereg_locked(device_t, int, int, uint16_t); 987 static int wm_gmii_i80003_readreg(device_t, int, int, uint16_t *); 988 static int wm_gmii_i80003_writereg(device_t, int, int, uint16_t); 989 static int wm_gmii_bm_readreg(device_t, int, int, uint16_t *); 990 static int wm_gmii_bm_writereg(device_t, int, int, uint16_t); 991 static int wm_enable_phy_wakeup_reg_access_bm(device_t, uint16_t *); 992 static int wm_disable_phy_wakeup_reg_access_bm(device_t, uint16_t *); 993 static int wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int, 994 bool); 995 static int wm_gmii_hv_readreg(device_t, int, int, uint16_t *); 996 static int wm_gmii_hv_readreg_locked(device_t, int, int, uint16_t *); 997 static int wm_gmii_hv_writereg(device_t, int, int, uint16_t); 998 static int wm_gmii_hv_writereg_locked(device_t, int, int, uint16_t); 999 static int wm_gmii_82580_readreg(device_t, int, int, uint16_t *); 1000 static int wm_gmii_82580_writereg(device_t, int, int, uint16_t); 1001 static int wm_gmii_gs40g_readreg(device_t, int, int, uint16_t *); 1002 static int wm_gmii_gs40g_writereg(device_t, int, int, uint16_t); 1003 static void wm_gmii_statchg(struct ifnet *); 1004 /* 1005 * kumeran related (80003, ICH* and PCH*). 1006 * These functions are not for accessing MII registers but for accessing 1007 * kumeran specific registers. 1008 */ 1009 static int wm_kmrn_readreg(struct wm_softc *, int, uint16_t *); 1010 static int wm_kmrn_readreg_locked(struct wm_softc *, int, uint16_t *); 1011 static int wm_kmrn_writereg(struct wm_softc *, int, uint16_t); 1012 static int wm_kmrn_writereg_locked(struct wm_softc *, int, uint16_t); 1013 /* EMI register related */ 1014 static int wm_access_emi_reg_locked(device_t, int, uint16_t *, bool); 1015 static int wm_read_emi_reg_locked(device_t, int, uint16_t *); 1016 static int wm_write_emi_reg_locked(device_t, int, uint16_t); 1017 /* SGMII */ 1018 static bool wm_sgmii_uses_mdio(struct wm_softc *); 1019 static void wm_sgmii_sfp_preconfig(struct wm_softc *); 1020 static int wm_sgmii_readreg(device_t, int, int, uint16_t *); 1021 static int wm_sgmii_readreg_locked(device_t, int, int, uint16_t *); 1022 static int wm_sgmii_writereg(device_t, int, int, uint16_t); 1023 static int wm_sgmii_writereg_locked(device_t, int, int, uint16_t); 1024 /* TBI related */ 1025 static bool wm_tbi_havesignal(struct wm_softc *, uint32_t); 1026 static void wm_tbi_mediainit(struct wm_softc *); 1027 static int wm_tbi_mediachange(struct ifnet *); 1028 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *); 1029 static int wm_check_for_link(struct wm_softc *); 1030 static void wm_tbi_tick(struct wm_softc *); 1031 /* SERDES related */ 1032 static void wm_serdes_power_up_link_82575(struct wm_softc *); 1033 static int wm_serdes_mediachange(struct ifnet *); 1034 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *); 1035 static void wm_serdes_tick(struct wm_softc *); 1036 /* SFP related */ 1037 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *); 1038 static uint32_t wm_sfp_get_media_type(struct wm_softc *); 1039 1040 /* 1041 * NVM related. 1042 * Microwire, SPI (w/wo EERD) and Flash. 1043 */ 1044 /* Misc functions */ 1045 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int); 1046 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int); 1047 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *); 1048 /* Microwire */ 1049 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *); 1050 /* SPI */ 1051 static int wm_nvm_ready_spi(struct wm_softc *); 1052 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *); 1053 /* Using with EERD */ 1054 static int wm_poll_eerd_eewr_done(struct wm_softc *, int); 1055 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *); 1056 /* Flash */ 1057 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *, 1058 unsigned int *); 1059 static int32_t wm_ich8_cycle_init(struct wm_softc *); 1060 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t); 1061 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t, 1062 uint32_t *); 1063 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *); 1064 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *); 1065 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *); 1066 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *); 1067 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *); 1068 /* iNVM */ 1069 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *); 1070 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *); 1071 /* Lock, detecting NVM type, validate checksum and read */ 1072 static int wm_nvm_is_onboard_eeprom(struct wm_softc *); 1073 static int wm_nvm_flash_presence_i210(struct wm_softc *); 1074 static int wm_nvm_validate_checksum(struct wm_softc *); 1075 static void wm_nvm_version_invm(struct wm_softc *); 1076 static void wm_nvm_version(struct wm_softc *); 1077 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *); 1078 1079 /* 1080 * Hardware semaphores. 1081 * Very complexed... 1082 */ 1083 static int wm_get_null(struct wm_softc *); 1084 static void wm_put_null(struct wm_softc *); 1085 static int wm_get_eecd(struct wm_softc *); 1086 static void wm_put_eecd(struct wm_softc *); 1087 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */ 1088 static void wm_put_swsm_semaphore(struct wm_softc *); 1089 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t); 1090 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t); 1091 static int wm_get_nvm_80003(struct wm_softc *); 1092 static void wm_put_nvm_80003(struct wm_softc *); 1093 static int wm_get_nvm_82571(struct wm_softc *); 1094 static void wm_put_nvm_82571(struct wm_softc *); 1095 static int wm_get_phy_82575(struct wm_softc *); 1096 static void wm_put_phy_82575(struct wm_softc *); 1097 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */ 1098 static void wm_put_swfwhw_semaphore(struct wm_softc *); 1099 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */ 1100 static void wm_put_swflag_ich8lan(struct wm_softc *); 1101 static int wm_get_nvm_ich8lan(struct wm_softc *); 1102 static void wm_put_nvm_ich8lan(struct wm_softc *); 1103 static int wm_get_hw_semaphore_82573(struct wm_softc *); 1104 static void wm_put_hw_semaphore_82573(struct wm_softc *); 1105 1106 /* 1107 * Management mode and power management related subroutines. 1108 * BMC, AMT, suspend/resume and EEE. 1109 */ 1110 #if 0 1111 static int wm_check_mng_mode(struct wm_softc *); 1112 static int wm_check_mng_mode_ich8lan(struct wm_softc *); 1113 static int wm_check_mng_mode_82574(struct wm_softc *); 1114 static int wm_check_mng_mode_generic(struct wm_softc *); 1115 #endif 1116 static int wm_enable_mng_pass_thru(struct wm_softc *); 1117 static bool wm_phy_resetisblocked(struct wm_softc *); 1118 static void wm_get_hw_control(struct wm_softc *); 1119 static void wm_release_hw_control(struct wm_softc *); 1120 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool); 1121 static int wm_init_phy_workarounds_pchlan(struct wm_softc *); 1122 static void wm_init_manageability(struct wm_softc *); 1123 static void wm_release_manageability(struct wm_softc *); 1124 static void wm_get_wakeup(struct wm_softc *); 1125 static int wm_ulp_disable(struct wm_softc *); 1126 static int wm_enable_phy_wakeup(struct wm_softc *); 1127 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *); 1128 static void wm_suspend_workarounds_ich8lan(struct wm_softc *); 1129 static int wm_resume_workarounds_pchlan(struct wm_softc *); 1130 static void wm_enable_wakeup(struct wm_softc *); 1131 static void wm_disable_aspm(struct wm_softc *); 1132 /* LPLU (Low Power Link Up) */ 1133 static void wm_lplu_d0_disable(struct wm_softc *); 1134 /* EEE */ 1135 static int wm_set_eee_i350(struct wm_softc *); 1136 static int wm_set_eee_pchlan(struct wm_softc *); 1137 static int wm_set_eee(struct wm_softc *); 1138 1139 /* 1140 * Workarounds (mainly PHY related). 1141 * Basically, PHY's workarounds are in the PHY drivers. 1142 */ 1143 static int wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *); 1144 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *); 1145 static int wm_hv_phy_workarounds_ich8lan(struct wm_softc *); 1146 static void wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *); 1147 static void wm_copy_rx_addrs_to_phy_ich8lan_locked(struct wm_softc *); 1148 static int wm_lv_jumbo_workaround_ich8lan(struct wm_softc *, bool); 1149 static int wm_lv_phy_workarounds_ich8lan(struct wm_softc *); 1150 static int wm_k1_workaround_lpt_lp(struct wm_softc *, bool); 1151 static int wm_k1_gig_workaround_hv(struct wm_softc *, int); 1152 static int wm_k1_workaround_lv(struct wm_softc *); 1153 static int wm_link_stall_workaround_hv(struct wm_softc *); 1154 static int wm_set_mdio_slow_mode_hv(struct wm_softc *); 1155 static int wm_set_mdio_slow_mode_hv_locked(struct wm_softc *); 1156 static void wm_configure_k1_ich8lan(struct wm_softc *, int); 1157 static void wm_reset_init_script_82575(struct wm_softc *); 1158 static void wm_reset_mdicnfg_82580(struct wm_softc *); 1159 static bool wm_phy_is_accessible_pchlan(struct wm_softc *); 1160 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *); 1161 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool); 1162 static int wm_pll_workaround_i210(struct wm_softc *); 1163 static void wm_legacy_irq_quirk_spt(struct wm_softc *); 1164 static bool wm_phy_need_linkdown_discard(struct wm_softc *); 1165 static void wm_set_linkdown_discard(struct wm_softc *); 1166 static void wm_clear_linkdown_discard(struct wm_softc *); 1167 1168 static int wm_sysctl_tdh_handler(SYSCTLFN_PROTO); 1169 static int wm_sysctl_tdt_handler(SYSCTLFN_PROTO); 1170 #ifdef WM_DEBUG 1171 static int wm_sysctl_debug(SYSCTLFN_PROTO); 1172 #endif 1173 1174 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc), 1175 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); 1176 1177 /* 1178 * Devices supported by this driver. 1179 */ 1180 static const struct wm_product { 1181 pci_vendor_id_t wmp_vendor; 1182 pci_product_id_t wmp_product; 1183 const char *wmp_name; 1184 wm_chip_type wmp_type; 1185 uint32_t wmp_flags; 1186 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN 1187 #define WMP_F_FIBER WM_MEDIATYPE_FIBER 1188 #define WMP_F_COPPER WM_MEDIATYPE_COPPER 1189 #define WMP_F_SERDES WM_MEDIATYPE_SERDES 1190 #define WMP_MEDIATYPE(x) ((x) & 0x03) 1191 } wm_products[] = { 1192 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542, 1193 "Intel i82542 1000BASE-X Ethernet", 1194 WM_T_82542_2_1, WMP_F_FIBER }, 1195 1196 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER, 1197 "Intel i82543GC 1000BASE-X Ethernet", 1198 WM_T_82543, WMP_F_FIBER }, 1199 1200 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER, 1201 "Intel i82543GC 1000BASE-T Ethernet", 1202 WM_T_82543, WMP_F_COPPER }, 1203 1204 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER, 1205 "Intel i82544EI 1000BASE-T Ethernet", 1206 WM_T_82544, WMP_F_COPPER }, 1207 1208 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER, 1209 "Intel i82544EI 1000BASE-X Ethernet", 1210 WM_T_82544, WMP_F_FIBER }, 1211 1212 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER, 1213 "Intel i82544GC 1000BASE-T Ethernet", 1214 WM_T_82544, WMP_F_COPPER }, 1215 1216 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM, 1217 "Intel i82544GC (LOM) 1000BASE-T Ethernet", 1218 WM_T_82544, WMP_F_COPPER }, 1219 1220 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM, 1221 "Intel i82540EM 1000BASE-T Ethernet", 1222 WM_T_82540, WMP_F_COPPER }, 1223 1224 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM, 1225 "Intel i82540EM (LOM) 1000BASE-T Ethernet", 1226 WM_T_82540, WMP_F_COPPER }, 1227 1228 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM, 1229 "Intel i82540EP 1000BASE-T Ethernet", 1230 WM_T_82540, WMP_F_COPPER }, 1231 1232 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP, 1233 "Intel i82540EP 1000BASE-T Ethernet", 1234 WM_T_82540, WMP_F_COPPER }, 1235 1236 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP, 1237 "Intel i82540EP 1000BASE-T Ethernet", 1238 WM_T_82540, WMP_F_COPPER }, 1239 1240 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER, 1241 "Intel i82545EM 1000BASE-T Ethernet", 1242 WM_T_82545, WMP_F_COPPER }, 1243 1244 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER, 1245 "Intel i82545GM 1000BASE-T Ethernet", 1246 WM_T_82545_3, WMP_F_COPPER }, 1247 1248 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER, 1249 "Intel i82545GM 1000BASE-X Ethernet", 1250 WM_T_82545_3, WMP_F_FIBER }, 1251 1252 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES, 1253 "Intel i82545GM Gigabit Ethernet (SERDES)", 1254 WM_T_82545_3, WMP_F_SERDES }, 1255 1256 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER, 1257 "Intel i82546EB 1000BASE-T Ethernet", 1258 WM_T_82546, WMP_F_COPPER }, 1259 1260 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD, 1261 "Intel i82546EB 1000BASE-T Ethernet", 1262 WM_T_82546, WMP_F_COPPER }, 1263 1264 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER, 1265 "Intel i82545EM 1000BASE-X Ethernet", 1266 WM_T_82545, WMP_F_FIBER }, 1267 1268 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER, 1269 "Intel i82546EB 1000BASE-X Ethernet", 1270 WM_T_82546, WMP_F_FIBER }, 1271 1272 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER, 1273 "Intel i82546GB 1000BASE-T Ethernet", 1274 WM_T_82546_3, WMP_F_COPPER }, 1275 1276 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER, 1277 "Intel i82546GB 1000BASE-X Ethernet", 1278 WM_T_82546_3, WMP_F_FIBER }, 1279 1280 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES, 1281 "Intel i82546GB Gigabit Ethernet (SERDES)", 1282 WM_T_82546_3, WMP_F_SERDES }, 1283 1284 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER, 1285 "i82546GB quad-port Gigabit Ethernet", 1286 WM_T_82546_3, WMP_F_COPPER }, 1287 1288 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3, 1289 "i82546GB quad-port Gigabit Ethernet (KSP3)", 1290 WM_T_82546_3, WMP_F_COPPER }, 1291 1292 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE, 1293 "Intel PRO/1000MT (82546GB)", 1294 WM_T_82546_3, WMP_F_COPPER }, 1295 1296 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI, 1297 "Intel i82541EI 1000BASE-T Ethernet", 1298 WM_T_82541, WMP_F_COPPER }, 1299 1300 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM, 1301 "Intel i82541ER (LOM) 1000BASE-T Ethernet", 1302 WM_T_82541, WMP_F_COPPER }, 1303 1304 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE, 1305 "Intel i82541EI Mobile 1000BASE-T Ethernet", 1306 WM_T_82541, WMP_F_COPPER }, 1307 1308 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER, 1309 "Intel i82541ER 1000BASE-T Ethernet", 1310 WM_T_82541_2, WMP_F_COPPER }, 1311 1312 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI, 1313 "Intel i82541GI 1000BASE-T Ethernet", 1314 WM_T_82541_2, WMP_F_COPPER }, 1315 1316 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE, 1317 "Intel i82541GI Mobile 1000BASE-T Ethernet", 1318 WM_T_82541_2, WMP_F_COPPER }, 1319 1320 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI, 1321 "Intel i82541PI 1000BASE-T Ethernet", 1322 WM_T_82541_2, WMP_F_COPPER }, 1323 1324 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI, 1325 "Intel i82547EI 1000BASE-T Ethernet", 1326 WM_T_82547, WMP_F_COPPER }, 1327 1328 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE, 1329 "Intel i82547EI Mobile 1000BASE-T Ethernet", 1330 WM_T_82547, WMP_F_COPPER }, 1331 1332 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI, 1333 "Intel i82547GI 1000BASE-T Ethernet", 1334 WM_T_82547_2, WMP_F_COPPER }, 1335 1336 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER, 1337 "Intel PRO/1000 PT (82571EB)", 1338 WM_T_82571, WMP_F_COPPER }, 1339 1340 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER, 1341 "Intel PRO/1000 PF (82571EB)", 1342 WM_T_82571, WMP_F_FIBER }, 1343 1344 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES, 1345 "Intel PRO/1000 PB (82571EB)", 1346 WM_T_82571, WMP_F_SERDES }, 1347 1348 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER, 1349 "Intel PRO/1000 QT (82571EB)", 1350 WM_T_82571, WMP_F_COPPER }, 1351 1352 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER, 1353 "Intel PRO/1000 PT Quad Port Server Adapter", 1354 WM_T_82571, WMP_F_COPPER }, 1355 1356 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER, 1357 "Intel Gigabit PT Quad Port Server ExpressModule", 1358 WM_T_82571, WMP_F_COPPER }, 1359 1360 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES, 1361 "Intel 82571EB Dual Gigabit Ethernet (SERDES)", 1362 WM_T_82571, WMP_F_SERDES }, 1363 1364 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES, 1365 "Intel 82571EB Quad Gigabit Ethernet (SERDES)", 1366 WM_T_82571, WMP_F_SERDES }, 1367 1368 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER, 1369 "Intel 82571EB Quad 1000baseX Ethernet", 1370 WM_T_82571, WMP_F_FIBER }, 1371 1372 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER, 1373 "Intel i82572EI 1000baseT Ethernet", 1374 WM_T_82572, WMP_F_COPPER }, 1375 1376 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER, 1377 "Intel i82572EI 1000baseX Ethernet", 1378 WM_T_82572, WMP_F_FIBER }, 1379 1380 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES, 1381 "Intel i82572EI Gigabit Ethernet (SERDES)", 1382 WM_T_82572, WMP_F_SERDES }, 1383 1384 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI, 1385 "Intel i82572EI 1000baseT Ethernet", 1386 WM_T_82572, WMP_F_COPPER }, 1387 1388 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E, 1389 "Intel i82573E", 1390 WM_T_82573, WMP_F_COPPER }, 1391 1392 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT, 1393 "Intel i82573E IAMT", 1394 WM_T_82573, WMP_F_COPPER }, 1395 1396 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L, 1397 "Intel i82573L Gigabit Ethernet", 1398 WM_T_82573, WMP_F_COPPER }, 1399 1400 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L, 1401 "Intel i82574L", 1402 WM_T_82574, WMP_F_COPPER }, 1403 1404 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA, 1405 "Intel i82574L", 1406 WM_T_82574, WMP_F_COPPER }, 1407 1408 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V, 1409 "Intel i82583V", 1410 WM_T_82583, WMP_F_COPPER }, 1411 1412 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT, 1413 "i80003 dual 1000baseT Ethernet", 1414 WM_T_80003, WMP_F_COPPER }, 1415 1416 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT, 1417 "i80003 dual 1000baseX Ethernet", 1418 WM_T_80003, WMP_F_COPPER }, 1419 1420 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT, 1421 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)", 1422 WM_T_80003, WMP_F_SERDES }, 1423 1424 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT, 1425 "Intel i80003 1000baseT Ethernet", 1426 WM_T_80003, WMP_F_COPPER }, 1427 1428 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT, 1429 "Intel i80003 Gigabit Ethernet (SERDES)", 1430 WM_T_80003, WMP_F_SERDES }, 1431 1432 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT, 1433 "Intel i82801H (M_AMT) LAN Controller", 1434 WM_T_ICH8, WMP_F_COPPER }, 1435 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT, 1436 "Intel i82801H (AMT) LAN Controller", 1437 WM_T_ICH8, WMP_F_COPPER }, 1438 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN, 1439 "Intel i82801H LAN Controller", 1440 WM_T_ICH8, WMP_F_COPPER }, 1441 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN, 1442 "Intel i82801H (IFE) 10/100 LAN Controller", 1443 WM_T_ICH8, WMP_F_COPPER }, 1444 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN, 1445 "Intel i82801H (M) LAN Controller", 1446 WM_T_ICH8, WMP_F_COPPER }, 1447 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT, 1448 "Intel i82801H IFE (GT) 10/100 LAN Controller", 1449 WM_T_ICH8, WMP_F_COPPER }, 1450 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G, 1451 "Intel i82801H IFE (G) 10/100 LAN Controller", 1452 WM_T_ICH8, WMP_F_COPPER }, 1453 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3, 1454 "82567V-3 LAN Controller", 1455 WM_T_ICH8, WMP_F_COPPER }, 1456 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT, 1457 "82801I (AMT) LAN Controller", 1458 WM_T_ICH9, WMP_F_COPPER }, 1459 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE, 1460 "82801I 10/100 LAN Controller", 1461 WM_T_ICH9, WMP_F_COPPER }, 1462 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G, 1463 "82801I (G) 10/100 LAN Controller", 1464 WM_T_ICH9, WMP_F_COPPER }, 1465 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT, 1466 "82801I (GT) 10/100 LAN Controller", 1467 WM_T_ICH9, WMP_F_COPPER }, 1468 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C, 1469 "82801I (C) LAN Controller", 1470 WM_T_ICH9, WMP_F_COPPER }, 1471 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M, 1472 "82801I mobile LAN Controller", 1473 WM_T_ICH9, WMP_F_COPPER }, 1474 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V, 1475 "82801I mobile (V) LAN Controller", 1476 WM_T_ICH9, WMP_F_COPPER }, 1477 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT, 1478 "82801I mobile (AMT) LAN Controller", 1479 WM_T_ICH9, WMP_F_COPPER }, 1480 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM, 1481 "82567LM-4 LAN Controller", 1482 WM_T_ICH9, WMP_F_COPPER }, 1483 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM, 1484 "82567LM-2 LAN Controller", 1485 WM_T_ICH10, WMP_F_COPPER }, 1486 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF, 1487 "82567LF-2 LAN Controller", 1488 WM_T_ICH10, WMP_F_COPPER }, 1489 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM, 1490 "82567LM-3 LAN Controller", 1491 WM_T_ICH10, WMP_F_COPPER }, 1492 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF, 1493 "82567LF-3 LAN Controller", 1494 WM_T_ICH10, WMP_F_COPPER }, 1495 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V, 1496 "82567V-2 LAN Controller", 1497 WM_T_ICH10, WMP_F_COPPER }, 1498 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V, 1499 "82567V-3? LAN Controller", 1500 WM_T_ICH10, WMP_F_COPPER }, 1501 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE, 1502 "HANKSVILLE LAN Controller", 1503 WM_T_ICH10, WMP_F_COPPER }, 1504 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM, 1505 "PCH LAN (82577LM) Controller", 1506 WM_T_PCH, WMP_F_COPPER }, 1507 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC, 1508 "PCH LAN (82577LC) Controller", 1509 WM_T_PCH, WMP_F_COPPER }, 1510 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM, 1511 "PCH LAN (82578DM) Controller", 1512 WM_T_PCH, WMP_F_COPPER }, 1513 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC, 1514 "PCH LAN (82578DC) Controller", 1515 WM_T_PCH, WMP_F_COPPER }, 1516 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM, 1517 "PCH2 LAN (82579LM) Controller", 1518 WM_T_PCH2, WMP_F_COPPER }, 1519 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V, 1520 "PCH2 LAN (82579V) Controller", 1521 WM_T_PCH2, WMP_F_COPPER }, 1522 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER, 1523 "82575EB dual-1000baseT Ethernet", 1524 WM_T_82575, WMP_F_COPPER }, 1525 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES, 1526 "82575EB dual-1000baseX Ethernet (SERDES)", 1527 WM_T_82575, WMP_F_SERDES }, 1528 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER, 1529 "82575GB quad-1000baseT Ethernet", 1530 WM_T_82575, WMP_F_COPPER }, 1531 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM, 1532 "82575GB quad-1000baseT Ethernet (PM)", 1533 WM_T_82575, WMP_F_COPPER }, 1534 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER, 1535 "82576 1000BaseT Ethernet", 1536 WM_T_82576, WMP_F_COPPER }, 1537 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER, 1538 "82576 1000BaseX Ethernet", 1539 WM_T_82576, WMP_F_FIBER }, 1540 1541 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES, 1542 "82576 gigabit Ethernet (SERDES)", 1543 WM_T_82576, WMP_F_SERDES }, 1544 1545 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER, 1546 "82576 quad-1000BaseT Ethernet", 1547 WM_T_82576, WMP_F_COPPER }, 1548 1549 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2, 1550 "82576 Gigabit ET2 Quad Port Server Adapter", 1551 WM_T_82576, WMP_F_COPPER }, 1552 1553 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS, 1554 "82576 gigabit Ethernet", 1555 WM_T_82576, WMP_F_COPPER }, 1556 1557 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES, 1558 "82576 gigabit Ethernet (SERDES)", 1559 WM_T_82576, WMP_F_SERDES }, 1560 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD, 1561 "82576 quad-gigabit Ethernet (SERDES)", 1562 WM_T_82576, WMP_F_SERDES }, 1563 1564 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER, 1565 "82580 1000BaseT Ethernet", 1566 WM_T_82580, WMP_F_COPPER }, 1567 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER, 1568 "82580 1000BaseX Ethernet", 1569 WM_T_82580, WMP_F_FIBER }, 1570 1571 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES, 1572 "82580 1000BaseT Ethernet (SERDES)", 1573 WM_T_82580, WMP_F_SERDES }, 1574 1575 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII, 1576 "82580 gigabit Ethernet (SGMII)", 1577 WM_T_82580, WMP_F_COPPER }, 1578 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL, 1579 "82580 dual-1000BaseT Ethernet", 1580 WM_T_82580, WMP_F_COPPER }, 1581 1582 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER, 1583 "82580 quad-1000BaseX Ethernet", 1584 WM_T_82580, WMP_F_FIBER }, 1585 1586 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII, 1587 "DH89XXCC Gigabit Ethernet (SGMII)", 1588 WM_T_82580, WMP_F_COPPER }, 1589 1590 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES, 1591 "DH89XXCC Gigabit Ethernet (SERDES)", 1592 WM_T_82580, WMP_F_SERDES }, 1593 1594 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE, 1595 "DH89XXCC 1000BASE-KX Ethernet", 1596 WM_T_82580, WMP_F_SERDES }, 1597 1598 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP, 1599 "DH89XXCC Gigabit Ethernet (SFP)", 1600 WM_T_82580, WMP_F_SERDES }, 1601 1602 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER, 1603 "I350 Gigabit Network Connection", 1604 WM_T_I350, WMP_F_COPPER }, 1605 1606 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER, 1607 "I350 Gigabit Fiber Network Connection", 1608 WM_T_I350, WMP_F_FIBER }, 1609 1610 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES, 1611 "I350 Gigabit Backplane Connection", 1612 WM_T_I350, WMP_F_SERDES }, 1613 1614 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4, 1615 "I350 Quad Port Gigabit Ethernet", 1616 WM_T_I350, WMP_F_SERDES }, 1617 1618 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII, 1619 "I350 Gigabit Connection", 1620 WM_T_I350, WMP_F_COPPER }, 1621 1622 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX, 1623 "I354 Gigabit Ethernet (KX)", 1624 WM_T_I354, WMP_F_SERDES }, 1625 1626 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII, 1627 "I354 Gigabit Ethernet (SGMII)", 1628 WM_T_I354, WMP_F_COPPER }, 1629 1630 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE, 1631 "I354 Gigabit Ethernet (2.5G)", 1632 WM_T_I354, WMP_F_COPPER }, 1633 1634 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1, 1635 "I210-T1 Ethernet Server Adapter", 1636 WM_T_I210, WMP_F_COPPER }, 1637 1638 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1, 1639 "I210 Ethernet (Copper OEM)", 1640 WM_T_I210, WMP_F_COPPER }, 1641 1642 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT, 1643 "I210 Ethernet (Copper IT)", 1644 WM_T_I210, WMP_F_COPPER }, 1645 1646 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF, 1647 "I210 Ethernet (Copper, FLASH less)", 1648 WM_T_I210, WMP_F_COPPER }, 1649 1650 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER, 1651 "I210 Gigabit Ethernet (Fiber)", 1652 WM_T_I210, WMP_F_FIBER }, 1653 1654 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES, 1655 "I210 Gigabit Ethernet (SERDES)", 1656 WM_T_I210, WMP_F_SERDES }, 1657 1658 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF, 1659 "I210 Gigabit Ethernet (SERDES, FLASH less)", 1660 WM_T_I210, WMP_F_SERDES }, 1661 1662 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII, 1663 "I210 Gigabit Ethernet (SGMII)", 1664 WM_T_I210, WMP_F_COPPER }, 1665 1666 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII_WOF, 1667 "I210 Gigabit Ethernet (SGMII, FLASH less)", 1668 WM_T_I210, WMP_F_COPPER }, 1669 1670 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER, 1671 "I211 Ethernet (COPPER)", 1672 WM_T_I211, WMP_F_COPPER }, 1673 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V, 1674 "I217 V Ethernet Connection", 1675 WM_T_PCH_LPT, WMP_F_COPPER }, 1676 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM, 1677 "I217 LM Ethernet Connection", 1678 WM_T_PCH_LPT, WMP_F_COPPER }, 1679 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V, 1680 "I218 V Ethernet Connection", 1681 WM_T_PCH_LPT, WMP_F_COPPER }, 1682 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2, 1683 "I218 V Ethernet Connection", 1684 WM_T_PCH_LPT, WMP_F_COPPER }, 1685 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3, 1686 "I218 V Ethernet Connection", 1687 WM_T_PCH_LPT, WMP_F_COPPER }, 1688 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM, 1689 "I218 LM Ethernet Connection", 1690 WM_T_PCH_LPT, WMP_F_COPPER }, 1691 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2, 1692 "I218 LM Ethernet Connection", 1693 WM_T_PCH_LPT, WMP_F_COPPER }, 1694 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3, 1695 "I218 LM Ethernet Connection", 1696 WM_T_PCH_LPT, WMP_F_COPPER }, 1697 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM, 1698 "I219 LM Ethernet Connection", 1699 WM_T_PCH_SPT, WMP_F_COPPER }, 1700 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2, 1701 "I219 LM (2) Ethernet Connection", 1702 WM_T_PCH_SPT, WMP_F_COPPER }, 1703 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3, 1704 "I219 LM (3) Ethernet Connection", 1705 WM_T_PCH_SPT, WMP_F_COPPER }, 1706 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4, 1707 "I219 LM (4) Ethernet Connection", 1708 WM_T_PCH_SPT, WMP_F_COPPER }, 1709 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5, 1710 "I219 LM (5) Ethernet Connection", 1711 WM_T_PCH_SPT, WMP_F_COPPER }, 1712 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM6, 1713 "I219 LM (6) Ethernet Connection", 1714 WM_T_PCH_CNP, WMP_F_COPPER }, 1715 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM7, 1716 "I219 LM (7) Ethernet Connection", 1717 WM_T_PCH_CNP, WMP_F_COPPER }, 1718 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM8, 1719 "I219 LM (8) Ethernet Connection", 1720 WM_T_PCH_CNP, WMP_F_COPPER }, 1721 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM9, 1722 "I219 LM (9) Ethernet Connection", 1723 WM_T_PCH_CNP, WMP_F_COPPER }, 1724 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM10, 1725 "I219 LM (10) Ethernet Connection", 1726 WM_T_PCH_CNP, WMP_F_COPPER }, 1727 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM11, 1728 "I219 LM (11) Ethernet Connection", 1729 WM_T_PCH_CNP, WMP_F_COPPER }, 1730 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM12, 1731 "I219 LM (12) Ethernet Connection", 1732 WM_T_PCH_SPT, WMP_F_COPPER }, 1733 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM13, 1734 "I219 LM (13) Ethernet Connection", 1735 WM_T_PCH_CNP, WMP_F_COPPER }, 1736 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM14, 1737 "I219 LM (14) Ethernet Connection", 1738 WM_T_PCH_CNP, WMP_F_COPPER }, 1739 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM15, 1740 "I219 LM (15) Ethernet Connection", 1741 WM_T_PCH_CNP, WMP_F_COPPER }, 1742 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM16, 1743 "I219 LM (16) Ethernet Connection", 1744 WM_T_PCH_CNP, WMP_F_COPPER }, 1745 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM17, 1746 "I219 LM (17) Ethernet Connection", 1747 WM_T_PCH_CNP, WMP_F_COPPER }, 1748 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM18, 1749 "I219 LM (18) Ethernet Connection", 1750 WM_T_PCH_CNP, WMP_F_COPPER }, 1751 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM19, 1752 "I219 LM (19) Ethernet Connection", 1753 WM_T_PCH_CNP, WMP_F_COPPER }, 1754 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V, 1755 "I219 V Ethernet Connection", 1756 WM_T_PCH_SPT, WMP_F_COPPER }, 1757 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2, 1758 "I219 V (2) Ethernet Connection", 1759 WM_T_PCH_SPT, WMP_F_COPPER }, 1760 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4, 1761 "I219 V (4) Ethernet Connection", 1762 WM_T_PCH_SPT, WMP_F_COPPER }, 1763 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5, 1764 "I219 V (5) Ethernet Connection", 1765 WM_T_PCH_SPT, WMP_F_COPPER }, 1766 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V6, 1767 "I219 V (6) Ethernet Connection", 1768 WM_T_PCH_CNP, WMP_F_COPPER }, 1769 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V7, 1770 "I219 V (7) Ethernet Connection", 1771 WM_T_PCH_CNP, WMP_F_COPPER }, 1772 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V8, 1773 "I219 V (8) Ethernet Connection", 1774 WM_T_PCH_CNP, WMP_F_COPPER }, 1775 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V9, 1776 "I219 V (9) Ethernet Connection", 1777 WM_T_PCH_CNP, WMP_F_COPPER }, 1778 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V10, 1779 "I219 V (10) Ethernet Connection", 1780 WM_T_PCH_CNP, WMP_F_COPPER }, 1781 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V11, 1782 "I219 V (11) Ethernet Connection", 1783 WM_T_PCH_CNP, WMP_F_COPPER }, 1784 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V12, 1785 "I219 V (12) Ethernet Connection", 1786 WM_T_PCH_SPT, WMP_F_COPPER }, 1787 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V13, 1788 "I219 V (13) Ethernet Connection", 1789 WM_T_PCH_CNP, WMP_F_COPPER }, 1790 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V14, 1791 "I219 V (14) Ethernet Connection", 1792 WM_T_PCH_CNP, WMP_F_COPPER }, 1793 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V15, 1794 "I219 V (15) Ethernet Connection", 1795 WM_T_PCH_CNP, WMP_F_COPPER }, 1796 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V16, 1797 "I219 V (16) Ethernet Connection", 1798 WM_T_PCH_CNP, WMP_F_COPPER }, 1799 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V17, 1800 "I219 V (17) Ethernet Connection", 1801 WM_T_PCH_CNP, WMP_F_COPPER }, 1802 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V18, 1803 "I219 V (18) Ethernet Connection", 1804 WM_T_PCH_CNP, WMP_F_COPPER }, 1805 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V19, 1806 "I219 V (19) Ethernet Connection", 1807 WM_T_PCH_CNP, WMP_F_COPPER }, 1808 { 0, 0, 1809 NULL, 1810 0, 0 }, 1811 }; 1812 1813 /* 1814 * Register read/write functions. 1815 * Other than CSR_{READ|WRITE}(). 1816 */ 1817 1818 #if 0 /* Not currently used */ 1819 static inline uint32_t 1820 wm_io_read(struct wm_softc *sc, int reg) 1821 { 1822 1823 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg); 1824 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4)); 1825 } 1826 #endif 1827 1828 static inline void 1829 wm_io_write(struct wm_softc *sc, int reg, uint32_t val) 1830 { 1831 1832 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg); 1833 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val); 1834 } 1835 1836 static inline void 1837 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off, 1838 uint32_t data) 1839 { 1840 uint32_t regval; 1841 int i; 1842 1843 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT); 1844 1845 CSR_WRITE(sc, reg, regval); 1846 1847 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) { 1848 delay(5); 1849 if (CSR_READ(sc, reg) & SCTL_CTL_READY) 1850 break; 1851 } 1852 if (i == SCTL_CTL_POLL_TIMEOUT) { 1853 aprint_error("%s: WARNING:" 1854 " i82575 reg 0x%08x setup did not indicate ready\n", 1855 device_xname(sc->sc_dev), reg); 1856 } 1857 } 1858 1859 static inline void 1860 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v) 1861 { 1862 wa->wa_low = htole32(BUS_ADDR_LO32(v)); 1863 wa->wa_high = htole32(BUS_ADDR_HI32(v)); 1864 } 1865 1866 /* 1867 * Descriptor sync/init functions. 1868 */ 1869 static inline void 1870 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops) 1871 { 1872 struct wm_softc *sc = txq->txq_sc; 1873 1874 /* If it will wrap around, sync to the end of the ring. */ 1875 if ((start + num) > WM_NTXDESC(txq)) { 1876 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap, 1877 WM_CDTXOFF(txq, start), txq->txq_descsize * 1878 (WM_NTXDESC(txq) - start), ops); 1879 num -= (WM_NTXDESC(txq) - start); 1880 start = 0; 1881 } 1882 1883 /* Now sync whatever is left. */ 1884 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap, 1885 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops); 1886 } 1887 1888 static inline void 1889 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops) 1890 { 1891 struct wm_softc *sc = rxq->rxq_sc; 1892 1893 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap, 1894 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops); 1895 } 1896 1897 static inline void 1898 wm_init_rxdesc(struct wm_rxqueue *rxq, int start) 1899 { 1900 struct wm_softc *sc = rxq->rxq_sc; 1901 struct wm_rxsoft *rxs = &rxq->rxq_soft[start]; 1902 struct mbuf *m = rxs->rxs_mbuf; 1903 1904 /* 1905 * Note: We scoot the packet forward 2 bytes in the buffer 1906 * so that the payload after the Ethernet header is aligned 1907 * to a 4-byte boundary. 1908 1909 * XXX BRAINDAMAGE ALERT! 1910 * The stupid chip uses the same size for every buffer, which 1911 * is set in the Receive Control register. We are using the 2K 1912 * size option, but what we REALLY want is (2K - 2)! For this 1913 * reason, we can't "scoot" packets longer than the standard 1914 * Ethernet MTU. On strict-alignment platforms, if the total 1915 * size exceeds (2K - 2) we set align_tweak to 0 and let 1916 * the upper layer copy the headers. 1917 */ 1918 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak; 1919 1920 if (sc->sc_type == WM_T_82574) { 1921 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start]; 1922 rxd->erx_data.erxd_addr = 1923 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1924 rxd->erx_data.erxd_dd = 0; 1925 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 1926 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start]; 1927 1928 rxd->nqrx_data.nrxd_paddr = 1929 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1930 /* Currently, split header is not supported. */ 1931 rxd->nqrx_data.nrxd_haddr = 0; 1932 } else { 1933 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start]; 1934 1935 wm_set_dma_addr(&rxd->wrx_addr, 1936 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1937 rxd->wrx_len = 0; 1938 rxd->wrx_cksum = 0; 1939 rxd->wrx_status = 0; 1940 rxd->wrx_errors = 0; 1941 rxd->wrx_special = 0; 1942 } 1943 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1944 1945 CSR_WRITE(sc, rxq->rxq_rdt_reg, start); 1946 } 1947 1948 /* 1949 * Device driver interface functions and commonly used functions. 1950 * match, attach, detach, init, start, stop, ioctl, watchdog and so on. 1951 */ 1952 1953 /* Lookup supported device table */ 1954 static const struct wm_product * 1955 wm_lookup(const struct pci_attach_args *pa) 1956 { 1957 const struct wm_product *wmp; 1958 1959 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) { 1960 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor && 1961 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product) 1962 return wmp; 1963 } 1964 return NULL; 1965 } 1966 1967 /* The match function (ca_match) */ 1968 static int 1969 wm_match(device_t parent, cfdata_t cf, void *aux) 1970 { 1971 struct pci_attach_args *pa = aux; 1972 1973 if (wm_lookup(pa) != NULL) 1974 return 1; 1975 1976 return 0; 1977 } 1978 1979 /* The attach function (ca_attach) */ 1980 static void 1981 wm_attach(device_t parent, device_t self, void *aux) 1982 { 1983 struct wm_softc *sc = device_private(self); 1984 struct pci_attach_args *pa = aux; 1985 prop_dictionary_t dict; 1986 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1987 pci_chipset_tag_t pc = pa->pa_pc; 1988 int counts[PCI_INTR_TYPE_SIZE]; 1989 pci_intr_type_t max_type; 1990 const char *eetype, *xname; 1991 bus_space_tag_t memt; 1992 bus_space_handle_t memh; 1993 bus_size_t memsize; 1994 int memh_valid; 1995 int i, error; 1996 const struct wm_product *wmp; 1997 prop_data_t ea; 1998 prop_number_t pn; 1999 uint8_t enaddr[ETHER_ADDR_LEN]; 2000 char buf[256]; 2001 char wqname[MAXCOMLEN]; 2002 uint16_t cfg1, cfg2, swdpin, nvmword; 2003 pcireg_t preg, memtype; 2004 uint16_t eeprom_data, apme_mask; 2005 bool force_clear_smbi; 2006 uint32_t link_mode; 2007 uint32_t reg; 2008 2009 #if defined(WM_DEBUG) && defined(WM_DEBUG_DEFAULT) 2010 sc->sc_debug = WM_DEBUG_DEFAULT; 2011 #endif 2012 sc->sc_dev = self; 2013 callout_init(&sc->sc_tick_ch, CALLOUT_MPSAFE); 2014 callout_setfunc(&sc->sc_tick_ch, wm_tick, sc); 2015 sc->sc_core_stopping = false; 2016 2017 wmp = wm_lookup(pa); 2018 #ifdef DIAGNOSTIC 2019 if (wmp == NULL) { 2020 printf("\n"); 2021 panic("wm_attach: impossible"); 2022 } 2023 #endif 2024 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags); 2025 2026 sc->sc_pc = pa->pa_pc; 2027 sc->sc_pcitag = pa->pa_tag; 2028 2029 if (pci_dma64_available(pa)) { 2030 aprint_verbose(", 64-bit DMA"); 2031 sc->sc_dmat = pa->pa_dmat64; 2032 } else { 2033 aprint_verbose(", 32-bit DMA"); 2034 sc->sc_dmat = pa->pa_dmat; 2035 } 2036 2037 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id); 2038 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG)); 2039 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1); 2040 2041 sc->sc_type = wmp->wmp_type; 2042 2043 /* Set default function pointers */ 2044 sc->phy.acquire = sc->nvm.acquire = wm_get_null; 2045 sc->phy.release = sc->nvm.release = wm_put_null; 2046 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000; 2047 2048 if (sc->sc_type < WM_T_82543) { 2049 if (sc->sc_rev < 2) { 2050 aprint_error_dev(sc->sc_dev, 2051 "i82542 must be at least rev. 2\n"); 2052 return; 2053 } 2054 if (sc->sc_rev < 3) 2055 sc->sc_type = WM_T_82542_2_0; 2056 } 2057 2058 /* 2059 * Disable MSI for Errata: 2060 * "Message Signaled Interrupt Feature May Corrupt Write Transactions" 2061 * 2062 * 82544: Errata 25 2063 * 82540: Errata 6 (easy to reproduce device timeout) 2064 * 82545: Errata 4 (easy to reproduce device timeout) 2065 * 82546: Errata 26 (easy to reproduce device timeout) 2066 * 82541: Errata 7 (easy to reproduce device timeout) 2067 * 2068 * "Byte Enables 2 and 3 are not set on MSI writes" 2069 * 2070 * 82571 & 82572: Errata 63 2071 */ 2072 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571) 2073 || (sc->sc_type == WM_T_82572)) 2074 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY; 2075 2076 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 2077 || (sc->sc_type == WM_T_82580) 2078 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 2079 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 2080 sc->sc_flags |= WM_F_NEWQUEUE; 2081 2082 /* Set device properties (mactype) */ 2083 dict = device_properties(sc->sc_dev); 2084 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type); 2085 2086 /* 2087 * Map the device. All devices support memory-mapped acccess, 2088 * and it is really required for normal operation. 2089 */ 2090 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA); 2091 switch (memtype) { 2092 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: 2093 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: 2094 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA, 2095 memtype, 0, &memt, &memh, NULL, &memsize) == 0); 2096 break; 2097 default: 2098 memh_valid = 0; 2099 break; 2100 } 2101 2102 if (memh_valid) { 2103 sc->sc_st = memt; 2104 sc->sc_sh = memh; 2105 sc->sc_ss = memsize; 2106 } else { 2107 aprint_error_dev(sc->sc_dev, 2108 "unable to map device registers\n"); 2109 return; 2110 } 2111 2112 /* 2113 * In addition, i82544 and later support I/O mapped indirect 2114 * register access. It is not desirable (nor supported in 2115 * this driver) to use it for normal operation, though it is 2116 * required to work around bugs in some chip versions. 2117 */ 2118 switch (sc->sc_type) { 2119 case WM_T_82544: 2120 case WM_T_82541: 2121 case WM_T_82541_2: 2122 case WM_T_82547: 2123 case WM_T_82547_2: 2124 /* First we have to find the I/O BAR. */ 2125 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) { 2126 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i); 2127 if (memtype == PCI_MAPREG_TYPE_IO) 2128 break; 2129 if (PCI_MAPREG_MEM_TYPE(memtype) == 2130 PCI_MAPREG_MEM_TYPE_64BIT) 2131 i += 4; /* skip high bits, too */ 2132 } 2133 if (i < PCI_MAPREG_END) { 2134 /* 2135 * We found PCI_MAPREG_TYPE_IO. Note that 82580 2136 * (and newer?) chip has no PCI_MAPREG_TYPE_IO. 2137 * It's no problem because newer chips has no this 2138 * bug. 2139 * 2140 * The i8254x doesn't apparently respond when the 2141 * I/O BAR is 0, which looks somewhat like it's not 2142 * been configured. 2143 */ 2144 preg = pci_conf_read(pc, pa->pa_tag, i); 2145 if (PCI_MAPREG_MEM_ADDR(preg) == 0) { 2146 aprint_error_dev(sc->sc_dev, 2147 "WARNING: I/O BAR at zero.\n"); 2148 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO, 2149 0, &sc->sc_iot, &sc->sc_ioh, NULL, &sc->sc_ios) 2150 == 0) { 2151 sc->sc_flags |= WM_F_IOH_VALID; 2152 } else 2153 aprint_error_dev(sc->sc_dev, 2154 "WARNING: unable to map I/O space\n"); 2155 } 2156 break; 2157 default: 2158 break; 2159 } 2160 2161 /* Enable bus mastering. Disable MWI on the i82542 2.0. */ 2162 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 2163 preg |= PCI_COMMAND_MASTER_ENABLE; 2164 if (sc->sc_type < WM_T_82542_2_1) 2165 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE; 2166 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg); 2167 2168 /* Power up chip */ 2169 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self, NULL)) 2170 && error != EOPNOTSUPP) { 2171 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error); 2172 return; 2173 } 2174 2175 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag)); 2176 /* 2177 * Don't use MSI-X if we can use only one queue to save interrupt 2178 * resource. 2179 */ 2180 if (sc->sc_nqueues > 1) { 2181 max_type = PCI_INTR_TYPE_MSIX; 2182 /* 2183 * 82583 has a MSI-X capability in the PCI configuration space 2184 * but it doesn't support it. At least the document doesn't 2185 * say anything about MSI-X. 2186 */ 2187 counts[PCI_INTR_TYPE_MSIX] 2188 = (sc->sc_type == WM_T_82583) ? 0 : sc->sc_nqueues + 1; 2189 } else { 2190 max_type = PCI_INTR_TYPE_MSI; 2191 counts[PCI_INTR_TYPE_MSIX] = 0; 2192 } 2193 2194 /* Allocation settings */ 2195 counts[PCI_INTR_TYPE_MSI] = 1; 2196 counts[PCI_INTR_TYPE_INTX] = 1; 2197 /* overridden by disable flags */ 2198 if (wm_disable_msi != 0) { 2199 counts[PCI_INTR_TYPE_MSI] = 0; 2200 if (wm_disable_msix != 0) { 2201 max_type = PCI_INTR_TYPE_INTX; 2202 counts[PCI_INTR_TYPE_MSIX] = 0; 2203 } 2204 } else if (wm_disable_msix != 0) { 2205 max_type = PCI_INTR_TYPE_MSI; 2206 counts[PCI_INTR_TYPE_MSIX] = 0; 2207 } 2208 2209 alloc_retry: 2210 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) { 2211 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n"); 2212 return; 2213 } 2214 2215 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) { 2216 error = wm_setup_msix(sc); 2217 if (error) { 2218 pci_intr_release(pc, sc->sc_intrs, 2219 counts[PCI_INTR_TYPE_MSIX]); 2220 2221 /* Setup for MSI: Disable MSI-X */ 2222 max_type = PCI_INTR_TYPE_MSI; 2223 counts[PCI_INTR_TYPE_MSI] = 1; 2224 counts[PCI_INTR_TYPE_INTX] = 1; 2225 goto alloc_retry; 2226 } 2227 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) { 2228 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */ 2229 error = wm_setup_legacy(sc); 2230 if (error) { 2231 pci_intr_release(sc->sc_pc, sc->sc_intrs, 2232 counts[PCI_INTR_TYPE_MSI]); 2233 2234 /* The next try is for INTx: Disable MSI */ 2235 max_type = PCI_INTR_TYPE_INTX; 2236 counts[PCI_INTR_TYPE_INTX] = 1; 2237 goto alloc_retry; 2238 } 2239 } else { 2240 wm_adjust_qnum(sc, 0); /* Must not use multiqueue */ 2241 error = wm_setup_legacy(sc); 2242 if (error) { 2243 pci_intr_release(sc->sc_pc, sc->sc_intrs, 2244 counts[PCI_INTR_TYPE_INTX]); 2245 return; 2246 } 2247 } 2248 2249 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(sc->sc_dev)); 2250 error = workqueue_create(&sc->sc_queue_wq, wqname, 2251 wm_handle_queue_work, sc, WM_WORKQUEUE_PRI, IPL_NET, 2252 WQ_PERCPU | WQ_MPSAFE); 2253 if (error) { 2254 aprint_error_dev(sc->sc_dev, 2255 "unable to create TxRx workqueue\n"); 2256 goto out; 2257 } 2258 2259 snprintf(wqname, sizeof(wqname), "%sReset", device_xname(sc->sc_dev)); 2260 error = workqueue_create(&sc->sc_reset_wq, wqname, 2261 wm_handle_reset_work, sc, WM_WORKQUEUE_PRI, IPL_SOFTCLOCK, 2262 WQ_MPSAFE); 2263 if (error) { 2264 workqueue_destroy(sc->sc_queue_wq); 2265 aprint_error_dev(sc->sc_dev, 2266 "unable to create reset workqueue\n"); 2267 goto out; 2268 } 2269 2270 /* 2271 * Check the function ID (unit number of the chip). 2272 */ 2273 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3) 2274 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003) 2275 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 2276 || (sc->sc_type == WM_T_82580) 2277 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 2278 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS) 2279 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK; 2280 else 2281 sc->sc_funcid = 0; 2282 2283 /* 2284 * Determine a few things about the bus we're connected to. 2285 */ 2286 if (sc->sc_type < WM_T_82543) { 2287 /* We don't really know the bus characteristics here. */ 2288 sc->sc_bus_speed = 33; 2289 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) { 2290 /* 2291 * CSA (Communication Streaming Architecture) is about as fast 2292 * a 32-bit 66MHz PCI Bus. 2293 */ 2294 sc->sc_flags |= WM_F_CSA; 2295 sc->sc_bus_speed = 66; 2296 aprint_verbose_dev(sc->sc_dev, 2297 "Communication Streaming Architecture\n"); 2298 if (sc->sc_type == WM_T_82547) { 2299 callout_init(&sc->sc_txfifo_ch, CALLOUT_MPSAFE); 2300 callout_setfunc(&sc->sc_txfifo_ch, 2301 wm_82547_txfifo_stall, sc); 2302 aprint_verbose_dev(sc->sc_dev, 2303 "using 82547 Tx FIFO stall work-around\n"); 2304 } 2305 } else if (sc->sc_type >= WM_T_82571) { 2306 sc->sc_flags |= WM_F_PCIE; 2307 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9) 2308 && (sc->sc_type != WM_T_ICH10) 2309 && (sc->sc_type != WM_T_PCH) 2310 && (sc->sc_type != WM_T_PCH2) 2311 && (sc->sc_type != WM_T_PCH_LPT) 2312 && (sc->sc_type != WM_T_PCH_SPT) 2313 && (sc->sc_type != WM_T_PCH_CNP)) { 2314 /* ICH* and PCH* have no PCIe capability registers */ 2315 if (pci_get_capability(pa->pa_pc, pa->pa_tag, 2316 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff, 2317 NULL) == 0) 2318 aprint_error_dev(sc->sc_dev, 2319 "unable to find PCIe capability\n"); 2320 } 2321 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n"); 2322 } else { 2323 reg = CSR_READ(sc, WMREG_STATUS); 2324 if (reg & STATUS_BUS64) 2325 sc->sc_flags |= WM_F_BUS64; 2326 if ((reg & STATUS_PCIX_MODE) != 0) { 2327 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb; 2328 2329 sc->sc_flags |= WM_F_PCIX; 2330 if (pci_get_capability(pa->pa_pc, pa->pa_tag, 2331 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0) 2332 aprint_error_dev(sc->sc_dev, 2333 "unable to find PCIX capability\n"); 2334 else if (sc->sc_type != WM_T_82545_3 && 2335 sc->sc_type != WM_T_82546_3) { 2336 /* 2337 * Work around a problem caused by the BIOS 2338 * setting the max memory read byte count 2339 * incorrectly. 2340 */ 2341 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag, 2342 sc->sc_pcixe_capoff + PCIX_CMD); 2343 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag, 2344 sc->sc_pcixe_capoff + PCIX_STATUS); 2345 2346 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >> 2347 PCIX_CMD_BYTECNT_SHIFT; 2348 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >> 2349 PCIX_STATUS_MAXB_SHIFT; 2350 if (bytecnt > maxb) { 2351 aprint_verbose_dev(sc->sc_dev, 2352 "resetting PCI-X MMRBC: %d -> %d\n", 2353 512 << bytecnt, 512 << maxb); 2354 pcix_cmd = (pcix_cmd & 2355 ~PCIX_CMD_BYTECNT_MASK) | 2356 (maxb << PCIX_CMD_BYTECNT_SHIFT); 2357 pci_conf_write(pa->pa_pc, pa->pa_tag, 2358 sc->sc_pcixe_capoff + PCIX_CMD, 2359 pcix_cmd); 2360 } 2361 } 2362 } 2363 /* 2364 * The quad port adapter is special; it has a PCIX-PCIX 2365 * bridge on the board, and can run the secondary bus at 2366 * a higher speed. 2367 */ 2368 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) { 2369 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120 2370 : 66; 2371 } else if (sc->sc_flags & WM_F_PCIX) { 2372 switch (reg & STATUS_PCIXSPD_MASK) { 2373 case STATUS_PCIXSPD_50_66: 2374 sc->sc_bus_speed = 66; 2375 break; 2376 case STATUS_PCIXSPD_66_100: 2377 sc->sc_bus_speed = 100; 2378 break; 2379 case STATUS_PCIXSPD_100_133: 2380 sc->sc_bus_speed = 133; 2381 break; 2382 default: 2383 aprint_error_dev(sc->sc_dev, 2384 "unknown PCIXSPD %d; assuming 66MHz\n", 2385 reg & STATUS_PCIXSPD_MASK); 2386 sc->sc_bus_speed = 66; 2387 break; 2388 } 2389 } else 2390 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33; 2391 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n", 2392 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed, 2393 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI"); 2394 } 2395 2396 /* clear interesting stat counters */ 2397 CSR_READ(sc, WMREG_COLC); 2398 CSR_READ(sc, WMREG_RXERRC); 2399 2400 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583) 2401 || (sc->sc_type >= WM_T_ICH8)) 2402 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 2403 if (sc->sc_type >= WM_T_ICH8) 2404 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 2405 2406 /* Set PHY, NVM mutex related stuff */ 2407 switch (sc->sc_type) { 2408 case WM_T_82542_2_0: 2409 case WM_T_82542_2_1: 2410 case WM_T_82543: 2411 case WM_T_82544: 2412 /* Microwire */ 2413 sc->nvm.read = wm_nvm_read_uwire; 2414 sc->sc_nvm_wordsize = 64; 2415 sc->sc_nvm_addrbits = 6; 2416 break; 2417 case WM_T_82540: 2418 case WM_T_82545: 2419 case WM_T_82545_3: 2420 case WM_T_82546: 2421 case WM_T_82546_3: 2422 /* Microwire */ 2423 sc->nvm.read = wm_nvm_read_uwire; 2424 reg = CSR_READ(sc, WMREG_EECD); 2425 if (reg & EECD_EE_SIZE) { 2426 sc->sc_nvm_wordsize = 256; 2427 sc->sc_nvm_addrbits = 8; 2428 } else { 2429 sc->sc_nvm_wordsize = 64; 2430 sc->sc_nvm_addrbits = 6; 2431 } 2432 sc->sc_flags |= WM_F_LOCK_EECD; 2433 sc->nvm.acquire = wm_get_eecd; 2434 sc->nvm.release = wm_put_eecd; 2435 break; 2436 case WM_T_82541: 2437 case WM_T_82541_2: 2438 case WM_T_82547: 2439 case WM_T_82547_2: 2440 reg = CSR_READ(sc, WMREG_EECD); 2441 /* 2442 * wm_nvm_set_addrbits_size_eecd() accesses SPI in it only 2443 * on 8254[17], so set flags and functios before calling it. 2444 */ 2445 sc->sc_flags |= WM_F_LOCK_EECD; 2446 sc->nvm.acquire = wm_get_eecd; 2447 sc->nvm.release = wm_put_eecd; 2448 if (reg & EECD_EE_TYPE) { 2449 /* SPI */ 2450 sc->nvm.read = wm_nvm_read_spi; 2451 sc->sc_flags |= WM_F_EEPROM_SPI; 2452 wm_nvm_set_addrbits_size_eecd(sc); 2453 } else { 2454 /* Microwire */ 2455 sc->nvm.read = wm_nvm_read_uwire; 2456 if ((reg & EECD_EE_ABITS) != 0) { 2457 sc->sc_nvm_wordsize = 256; 2458 sc->sc_nvm_addrbits = 8; 2459 } else { 2460 sc->sc_nvm_wordsize = 64; 2461 sc->sc_nvm_addrbits = 6; 2462 } 2463 } 2464 break; 2465 case WM_T_82571: 2466 case WM_T_82572: 2467 /* SPI */ 2468 sc->nvm.read = wm_nvm_read_eerd; 2469 /* Not use WM_F_LOCK_EECD because we use EERD */ 2470 sc->sc_flags |= WM_F_EEPROM_SPI; 2471 wm_nvm_set_addrbits_size_eecd(sc); 2472 sc->phy.acquire = wm_get_swsm_semaphore; 2473 sc->phy.release = wm_put_swsm_semaphore; 2474 sc->nvm.acquire = wm_get_nvm_82571; 2475 sc->nvm.release = wm_put_nvm_82571; 2476 break; 2477 case WM_T_82573: 2478 case WM_T_82574: 2479 case WM_T_82583: 2480 sc->nvm.read = wm_nvm_read_eerd; 2481 /* Not use WM_F_LOCK_EECD because we use EERD */ 2482 if (sc->sc_type == WM_T_82573) { 2483 sc->phy.acquire = wm_get_swsm_semaphore; 2484 sc->phy.release = wm_put_swsm_semaphore; 2485 sc->nvm.acquire = wm_get_nvm_82571; 2486 sc->nvm.release = wm_put_nvm_82571; 2487 } else { 2488 /* Both PHY and NVM use the same semaphore. */ 2489 sc->phy.acquire = sc->nvm.acquire 2490 = wm_get_swfwhw_semaphore; 2491 sc->phy.release = sc->nvm.release 2492 = wm_put_swfwhw_semaphore; 2493 } 2494 if (wm_nvm_is_onboard_eeprom(sc) == 0) { 2495 sc->sc_flags |= WM_F_EEPROM_FLASH; 2496 sc->sc_nvm_wordsize = 2048; 2497 } else { 2498 /* SPI */ 2499 sc->sc_flags |= WM_F_EEPROM_SPI; 2500 wm_nvm_set_addrbits_size_eecd(sc); 2501 } 2502 break; 2503 case WM_T_82575: 2504 case WM_T_82576: 2505 case WM_T_82580: 2506 case WM_T_I350: 2507 case WM_T_I354: 2508 case WM_T_80003: 2509 /* SPI */ 2510 sc->sc_flags |= WM_F_EEPROM_SPI; 2511 wm_nvm_set_addrbits_size_eecd(sc); 2512 if ((sc->sc_type == WM_T_80003) 2513 || (sc->sc_nvm_wordsize < (1 << 15))) { 2514 sc->nvm.read = wm_nvm_read_eerd; 2515 /* Don't use WM_F_LOCK_EECD because we use EERD */ 2516 } else { 2517 sc->nvm.read = wm_nvm_read_spi; 2518 sc->sc_flags |= WM_F_LOCK_EECD; 2519 } 2520 sc->phy.acquire = wm_get_phy_82575; 2521 sc->phy.release = wm_put_phy_82575; 2522 sc->nvm.acquire = wm_get_nvm_80003; 2523 sc->nvm.release = wm_put_nvm_80003; 2524 break; 2525 case WM_T_ICH8: 2526 case WM_T_ICH9: 2527 case WM_T_ICH10: 2528 case WM_T_PCH: 2529 case WM_T_PCH2: 2530 case WM_T_PCH_LPT: 2531 sc->nvm.read = wm_nvm_read_ich8; 2532 /* FLASH */ 2533 sc->sc_flags |= WM_F_EEPROM_FLASH; 2534 sc->sc_nvm_wordsize = 2048; 2535 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH); 2536 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0, 2537 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) { 2538 aprint_error_dev(sc->sc_dev, 2539 "can't map FLASH registers\n"); 2540 goto out; 2541 } 2542 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG); 2543 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) * 2544 ICH_FLASH_SECTOR_SIZE; 2545 sc->sc_ich8_flash_bank_size = 2546 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1; 2547 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK); 2548 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE; 2549 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t); 2550 sc->sc_flashreg_offset = 0; 2551 sc->phy.acquire = wm_get_swflag_ich8lan; 2552 sc->phy.release = wm_put_swflag_ich8lan; 2553 sc->nvm.acquire = wm_get_nvm_ich8lan; 2554 sc->nvm.release = wm_put_nvm_ich8lan; 2555 break; 2556 case WM_T_PCH_SPT: 2557 case WM_T_PCH_CNP: 2558 sc->nvm.read = wm_nvm_read_spt; 2559 /* SPT has no GFPREG; flash registers mapped through BAR0 */ 2560 sc->sc_flags |= WM_F_EEPROM_FLASH; 2561 sc->sc_flasht = sc->sc_st; 2562 sc->sc_flashh = sc->sc_sh; 2563 sc->sc_ich8_flash_base = 0; 2564 sc->sc_nvm_wordsize = 2565 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1) 2566 * NVM_SIZE_MULTIPLIER; 2567 /* It is size in bytes, we want words */ 2568 sc->sc_nvm_wordsize /= 2; 2569 /* Assume 2 banks */ 2570 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2; 2571 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET; 2572 sc->phy.acquire = wm_get_swflag_ich8lan; 2573 sc->phy.release = wm_put_swflag_ich8lan; 2574 sc->nvm.acquire = wm_get_nvm_ich8lan; 2575 sc->nvm.release = wm_put_nvm_ich8lan; 2576 break; 2577 case WM_T_I210: 2578 case WM_T_I211: 2579 /* Allow a single clear of the SW semaphore on I210 and newer*/ 2580 sc->sc_flags |= WM_F_WA_I210_CLSEM; 2581 if (wm_nvm_flash_presence_i210(sc)) { 2582 sc->nvm.read = wm_nvm_read_eerd; 2583 /* Don't use WM_F_LOCK_EECD because we use EERD */ 2584 sc->sc_flags |= WM_F_EEPROM_FLASH_HW; 2585 wm_nvm_set_addrbits_size_eecd(sc); 2586 } else { 2587 sc->nvm.read = wm_nvm_read_invm; 2588 sc->sc_flags |= WM_F_EEPROM_INVM; 2589 sc->sc_nvm_wordsize = INVM_SIZE; 2590 } 2591 sc->phy.acquire = wm_get_phy_82575; 2592 sc->phy.release = wm_put_phy_82575; 2593 sc->nvm.acquire = wm_get_nvm_80003; 2594 sc->nvm.release = wm_put_nvm_80003; 2595 break; 2596 default: 2597 break; 2598 } 2599 2600 /* Ensure the SMBI bit is clear before first NVM or PHY access */ 2601 switch (sc->sc_type) { 2602 case WM_T_82571: 2603 case WM_T_82572: 2604 reg = CSR_READ(sc, WMREG_SWSM2); 2605 if ((reg & SWSM2_LOCK) == 0) { 2606 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK); 2607 force_clear_smbi = true; 2608 } else 2609 force_clear_smbi = false; 2610 break; 2611 case WM_T_82573: 2612 case WM_T_82574: 2613 case WM_T_82583: 2614 force_clear_smbi = true; 2615 break; 2616 default: 2617 force_clear_smbi = false; 2618 break; 2619 } 2620 if (force_clear_smbi) { 2621 reg = CSR_READ(sc, WMREG_SWSM); 2622 if ((reg & SWSM_SMBI) != 0) 2623 aprint_error_dev(sc->sc_dev, 2624 "Please update the Bootagent\n"); 2625 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI); 2626 } 2627 2628 /* 2629 * Defer printing the EEPROM type until after verifying the checksum 2630 * This allows the EEPROM type to be printed correctly in the case 2631 * that no EEPROM is attached. 2632 */ 2633 /* 2634 * Validate the EEPROM checksum. If the checksum fails, flag 2635 * this for later, so we can fail future reads from the EEPROM. 2636 */ 2637 if (wm_nvm_validate_checksum(sc)) { 2638 /* 2639 * Read twice again because some PCI-e parts fail the 2640 * first check due to the link being in sleep state. 2641 */ 2642 if (wm_nvm_validate_checksum(sc)) 2643 sc->sc_flags |= WM_F_EEPROM_INVALID; 2644 } 2645 2646 if (sc->sc_flags & WM_F_EEPROM_INVALID) 2647 aprint_verbose_dev(sc->sc_dev, "No EEPROM"); 2648 else { 2649 aprint_verbose_dev(sc->sc_dev, "%u words ", 2650 sc->sc_nvm_wordsize); 2651 if (sc->sc_flags & WM_F_EEPROM_INVM) 2652 aprint_verbose("iNVM"); 2653 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW) 2654 aprint_verbose("FLASH(HW)"); 2655 else if (sc->sc_flags & WM_F_EEPROM_FLASH) 2656 aprint_verbose("FLASH"); 2657 else { 2658 if (sc->sc_flags & WM_F_EEPROM_SPI) 2659 eetype = "SPI"; 2660 else 2661 eetype = "MicroWire"; 2662 aprint_verbose("(%d address bits) %s EEPROM", 2663 sc->sc_nvm_addrbits, eetype); 2664 } 2665 } 2666 wm_nvm_version(sc); 2667 aprint_verbose("\n"); 2668 2669 /* 2670 * XXX The first call of wm_gmii_setup_phytype. The result might be 2671 * incorrect. 2672 */ 2673 wm_gmii_setup_phytype(sc, 0, 0); 2674 2675 /* Check for WM_F_WOL on some chips before wm_reset() */ 2676 switch (sc->sc_type) { 2677 case WM_T_ICH8: 2678 case WM_T_ICH9: 2679 case WM_T_ICH10: 2680 case WM_T_PCH: 2681 case WM_T_PCH2: 2682 case WM_T_PCH_LPT: 2683 case WM_T_PCH_SPT: 2684 case WM_T_PCH_CNP: 2685 apme_mask = WUC_APME; 2686 eeprom_data = CSR_READ(sc, WMREG_WUC); 2687 if ((eeprom_data & apme_mask) != 0) 2688 sc->sc_flags |= WM_F_WOL; 2689 break; 2690 default: 2691 break; 2692 } 2693 2694 /* Reset the chip to a known state. */ 2695 wm_reset(sc); 2696 2697 /* 2698 * Check for I21[01] PLL workaround. 2699 * 2700 * Three cases: 2701 * a) Chip is I211. 2702 * b) Chip is I210 and it uses INVM (not FLASH). 2703 * c) Chip is I210 (and it uses FLASH) and the NVM image version < 3.25 2704 */ 2705 if (sc->sc_type == WM_T_I211) 2706 sc->sc_flags |= WM_F_PLL_WA_I210; 2707 if (sc->sc_type == WM_T_I210) { 2708 if (!wm_nvm_flash_presence_i210(sc)) 2709 sc->sc_flags |= WM_F_PLL_WA_I210; 2710 else if ((sc->sc_nvm_ver_major < 3) 2711 || ((sc->sc_nvm_ver_major == 3) 2712 && (sc->sc_nvm_ver_minor < 25))) { 2713 aprint_verbose_dev(sc->sc_dev, 2714 "ROM image version %d.%d is older than 3.25\n", 2715 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor); 2716 sc->sc_flags |= WM_F_PLL_WA_I210; 2717 } 2718 } 2719 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0) 2720 wm_pll_workaround_i210(sc); 2721 2722 wm_get_wakeup(sc); 2723 2724 /* Non-AMT based hardware can now take control from firmware */ 2725 if ((sc->sc_flags & WM_F_HAS_AMT) == 0) 2726 wm_get_hw_control(sc); 2727 2728 /* 2729 * Read the Ethernet address from the EEPROM, if not first found 2730 * in device properties. 2731 */ 2732 ea = prop_dictionary_get(dict, "mac-address"); 2733 if (ea != NULL) { 2734 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA); 2735 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN); 2736 memcpy(enaddr, prop_data_value(ea), ETHER_ADDR_LEN); 2737 } else { 2738 if (wm_read_mac_addr(sc, enaddr) != 0) { 2739 aprint_error_dev(sc->sc_dev, 2740 "unable to read Ethernet address\n"); 2741 goto out; 2742 } 2743 } 2744 2745 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n", 2746 ether_sprintf(enaddr)); 2747 2748 /* 2749 * Read the config info from the EEPROM, and set up various 2750 * bits in the control registers based on their contents. 2751 */ 2752 pn = prop_dictionary_get(dict, "i82543-cfg1"); 2753 if (pn != NULL) { 2754 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2755 cfg1 = (uint16_t) prop_number_signed_value(pn); 2756 } else { 2757 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) { 2758 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n"); 2759 goto out; 2760 } 2761 } 2762 2763 pn = prop_dictionary_get(dict, "i82543-cfg2"); 2764 if (pn != NULL) { 2765 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2766 cfg2 = (uint16_t) prop_number_signed_value(pn); 2767 } else { 2768 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) { 2769 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n"); 2770 goto out; 2771 } 2772 } 2773 2774 /* check for WM_F_WOL */ 2775 switch (sc->sc_type) { 2776 case WM_T_82542_2_0: 2777 case WM_T_82542_2_1: 2778 case WM_T_82543: 2779 /* dummy? */ 2780 eeprom_data = 0; 2781 apme_mask = NVM_CFG3_APME; 2782 break; 2783 case WM_T_82544: 2784 apme_mask = NVM_CFG2_82544_APM_EN; 2785 eeprom_data = cfg2; 2786 break; 2787 case WM_T_82546: 2788 case WM_T_82546_3: 2789 case WM_T_82571: 2790 case WM_T_82572: 2791 case WM_T_82573: 2792 case WM_T_82574: 2793 case WM_T_82583: 2794 case WM_T_80003: 2795 case WM_T_82575: 2796 case WM_T_82576: 2797 apme_mask = NVM_CFG3_APME; 2798 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB 2799 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data); 2800 break; 2801 case WM_T_82580: 2802 case WM_T_I350: 2803 case WM_T_I354: 2804 case WM_T_I210: 2805 case WM_T_I211: 2806 apme_mask = NVM_CFG3_APME; 2807 wm_nvm_read(sc, 2808 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA, 2809 1, &eeprom_data); 2810 break; 2811 case WM_T_ICH8: 2812 case WM_T_ICH9: 2813 case WM_T_ICH10: 2814 case WM_T_PCH: 2815 case WM_T_PCH2: 2816 case WM_T_PCH_LPT: 2817 case WM_T_PCH_SPT: 2818 case WM_T_PCH_CNP: 2819 /* Already checked before wm_reset () */ 2820 apme_mask = eeprom_data = 0; 2821 break; 2822 default: /* XXX 82540 */ 2823 apme_mask = NVM_CFG3_APME; 2824 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &eeprom_data); 2825 break; 2826 } 2827 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */ 2828 if ((eeprom_data & apme_mask) != 0) 2829 sc->sc_flags |= WM_F_WOL; 2830 2831 /* 2832 * We have the eeprom settings, now apply the special cases 2833 * where the eeprom may be wrong or the board won't support 2834 * wake on lan on a particular port 2835 */ 2836 switch (sc->sc_pcidevid) { 2837 case PCI_PRODUCT_INTEL_82546GB_PCIE: 2838 sc->sc_flags &= ~WM_F_WOL; 2839 break; 2840 case PCI_PRODUCT_INTEL_82546EB_FIBER: 2841 case PCI_PRODUCT_INTEL_82546GB_FIBER: 2842 /* Wake events only supported on port A for dual fiber 2843 * regardless of eeprom setting */ 2844 if (sc->sc_funcid == 1) 2845 sc->sc_flags &= ~WM_F_WOL; 2846 break; 2847 case PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3: 2848 /* If quad port adapter, disable WoL on all but port A */ 2849 if (sc->sc_funcid != 0) 2850 sc->sc_flags &= ~WM_F_WOL; 2851 break; 2852 case PCI_PRODUCT_INTEL_82571EB_FIBER: 2853 /* Wake events only supported on port A for dual fiber 2854 * regardless of eeprom setting */ 2855 if (sc->sc_funcid == 1) 2856 sc->sc_flags &= ~WM_F_WOL; 2857 break; 2858 case PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER: 2859 case PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER: 2860 case PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER: 2861 /* If quad port adapter, disable WoL on all but port A */ 2862 if (sc->sc_funcid != 0) 2863 sc->sc_flags &= ~WM_F_WOL; 2864 break; 2865 } 2866 2867 if (sc->sc_type >= WM_T_82575) { 2868 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) { 2869 aprint_debug_dev(sc->sc_dev, "COMPAT = %hx\n", 2870 nvmword); 2871 if ((sc->sc_type == WM_T_82575) || 2872 (sc->sc_type == WM_T_82576)) { 2873 /* Check NVM for autonegotiation */ 2874 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) 2875 != 0) 2876 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO; 2877 } 2878 if ((sc->sc_type == WM_T_82575) || 2879 (sc->sc_type == WM_T_I350)) { 2880 if (nvmword & NVM_COMPAT_MAS_EN(sc->sc_funcid)) 2881 sc->sc_flags |= WM_F_MAS; 2882 } 2883 } 2884 } 2885 2886 /* 2887 * XXX need special handling for some multiple port cards 2888 * to disable a paticular port. 2889 */ 2890 2891 if (sc->sc_type >= WM_T_82544) { 2892 pn = prop_dictionary_get(dict, "i82543-swdpin"); 2893 if (pn != NULL) { 2894 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2895 swdpin = (uint16_t) prop_number_signed_value(pn); 2896 } else { 2897 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) { 2898 aprint_error_dev(sc->sc_dev, 2899 "unable to read SWDPIN\n"); 2900 goto out; 2901 } 2902 } 2903 } 2904 2905 if (cfg1 & NVM_CFG1_ILOS) 2906 sc->sc_ctrl |= CTRL_ILOS; 2907 2908 /* 2909 * XXX 2910 * This code isn't correct because pin 2 and 3 are located 2911 * in different position on newer chips. Check all datasheet. 2912 * 2913 * Until resolve this problem, check if a chip < 82580 2914 */ 2915 if (sc->sc_type <= WM_T_82580) { 2916 if (sc->sc_type >= WM_T_82544) { 2917 sc->sc_ctrl |= 2918 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) << 2919 CTRL_SWDPIO_SHIFT; 2920 sc->sc_ctrl |= 2921 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) << 2922 CTRL_SWDPINS_SHIFT; 2923 } else { 2924 sc->sc_ctrl |= 2925 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) << 2926 CTRL_SWDPIO_SHIFT; 2927 } 2928 } 2929 2930 if ((sc->sc_type >= WM_T_82580) && (sc->sc_type <= WM_T_I211)) { 2931 wm_nvm_read(sc, 2932 NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + NVM_OFF_CFG3_PORTA, 2933 1, &nvmword); 2934 if (nvmword & NVM_CFG3_ILOS) 2935 sc->sc_ctrl |= CTRL_ILOS; 2936 } 2937 2938 #if 0 2939 if (sc->sc_type >= WM_T_82544) { 2940 if (cfg1 & NVM_CFG1_IPS0) 2941 sc->sc_ctrl_ext |= CTRL_EXT_IPS; 2942 if (cfg1 & NVM_CFG1_IPS1) 2943 sc->sc_ctrl_ext |= CTRL_EXT_IPS1; 2944 sc->sc_ctrl_ext |= 2945 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) << 2946 CTRL_EXT_SWDPIO_SHIFT; 2947 sc->sc_ctrl_ext |= 2948 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) << 2949 CTRL_EXT_SWDPINS_SHIFT; 2950 } else { 2951 sc->sc_ctrl_ext |= 2952 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) << 2953 CTRL_EXT_SWDPIO_SHIFT; 2954 } 2955 #endif 2956 2957 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 2958 #if 0 2959 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext); 2960 #endif 2961 2962 if (sc->sc_type == WM_T_PCH) { 2963 uint16_t val; 2964 2965 /* Save the NVM K1 bit setting */ 2966 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val); 2967 2968 if ((val & NVM_K1_CONFIG_ENABLE) != 0) 2969 sc->sc_nvm_k1_enabled = 1; 2970 else 2971 sc->sc_nvm_k1_enabled = 0; 2972 } 2973 2974 /* Determine if we're GMII, TBI, SERDES or SGMII mode */ 2975 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9 2976 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH 2977 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT 2978 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_PCH_CNP 2979 || sc->sc_type == WM_T_82573 2980 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) { 2981 /* Copper only */ 2982 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 2983 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350) 2984 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210) 2985 || (sc->sc_type ==WM_T_I211)) { 2986 reg = CSR_READ(sc, WMREG_CTRL_EXT); 2987 link_mode = reg & CTRL_EXT_LINK_MODE_MASK; 2988 switch (link_mode) { 2989 case CTRL_EXT_LINK_MODE_1000KX: 2990 aprint_normal_dev(sc->sc_dev, "1000KX\n"); 2991 sc->sc_mediatype = WM_MEDIATYPE_SERDES; 2992 break; 2993 case CTRL_EXT_LINK_MODE_SGMII: 2994 if (wm_sgmii_uses_mdio(sc)) { 2995 aprint_normal_dev(sc->sc_dev, 2996 "SGMII(MDIO)\n"); 2997 sc->sc_flags |= WM_F_SGMII; 2998 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2999 break; 3000 } 3001 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n"); 3002 /*FALLTHROUGH*/ 3003 case CTRL_EXT_LINK_MODE_PCIE_SERDES: 3004 sc->sc_mediatype = wm_sfp_get_media_type(sc); 3005 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) { 3006 if (link_mode 3007 == CTRL_EXT_LINK_MODE_SGMII) { 3008 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 3009 sc->sc_flags |= WM_F_SGMII; 3010 aprint_verbose_dev(sc->sc_dev, 3011 "SGMII\n"); 3012 } else { 3013 sc->sc_mediatype = WM_MEDIATYPE_SERDES; 3014 aprint_verbose_dev(sc->sc_dev, 3015 "SERDES\n"); 3016 } 3017 break; 3018 } 3019 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) 3020 aprint_normal_dev(sc->sc_dev, "SERDES(SFP)\n"); 3021 else if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) { 3022 aprint_normal_dev(sc->sc_dev, "SGMII(SFP)\n"); 3023 sc->sc_flags |= WM_F_SGMII; 3024 } 3025 /* Do not change link mode for 100BaseFX */ 3026 if (sc->sc_sfptype == SFF_SFP_ETH_FLAGS_100FX) 3027 break; 3028 3029 /* Change current link mode setting */ 3030 reg &= ~CTRL_EXT_LINK_MODE_MASK; 3031 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) 3032 reg |= CTRL_EXT_LINK_MODE_SGMII; 3033 else 3034 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES; 3035 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3036 break; 3037 case CTRL_EXT_LINK_MODE_GMII: 3038 default: 3039 aprint_normal_dev(sc->sc_dev, "Copper\n"); 3040 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 3041 break; 3042 } 3043 3044 reg &= ~CTRL_EXT_I2C_ENA; 3045 if ((sc->sc_flags & WM_F_SGMII) != 0) 3046 reg |= CTRL_EXT_I2C_ENA; 3047 else 3048 reg &= ~CTRL_EXT_I2C_ENA; 3049 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3050 if ((sc->sc_flags & WM_F_SGMII) != 0) { 3051 if (!wm_sgmii_uses_mdio(sc)) 3052 wm_gmii_setup_phytype(sc, 0, 0); 3053 wm_reset_mdicnfg_82580(sc); 3054 } 3055 } else if (sc->sc_type < WM_T_82543 || 3056 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) { 3057 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) { 3058 aprint_error_dev(sc->sc_dev, 3059 "WARNING: TBIMODE set on 1000BASE-T product!\n"); 3060 sc->sc_mediatype = WM_MEDIATYPE_FIBER; 3061 } 3062 } else { 3063 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) { 3064 aprint_error_dev(sc->sc_dev, 3065 "WARNING: TBIMODE clear on 1000BASE-X product!\n"); 3066 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 3067 } 3068 } 3069 3070 if (sc->sc_type >= WM_T_PCH2) 3071 sc->sc_flags |= WM_F_EEE; 3072 else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211) 3073 && (sc->sc_mediatype == WM_MEDIATYPE_COPPER)) { 3074 /* XXX: Need special handling for I354. (not yet) */ 3075 if (sc->sc_type != WM_T_I354) 3076 sc->sc_flags |= WM_F_EEE; 3077 } 3078 3079 /* 3080 * The I350 has a bug where it always strips the CRC whether 3081 * asked to or not. So ask for stripped CRC here and cope in rxeof 3082 */ 3083 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 3084 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 3085 sc->sc_flags |= WM_F_CRC_STRIP; 3086 3087 /* Set device properties (macflags) */ 3088 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags); 3089 3090 if (sc->sc_flags != 0) { 3091 snprintb(buf, sizeof(buf), WM_FLAGS, sc->sc_flags); 3092 aprint_verbose_dev(sc->sc_dev, "%s\n", buf); 3093 } 3094 3095 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 3096 3097 /* Initialize the media structures accordingly. */ 3098 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) 3099 wm_gmii_mediainit(sc, wmp->wmp_product); 3100 else 3101 wm_tbi_mediainit(sc); /* All others */ 3102 3103 ifp = &sc->sc_ethercom.ec_if; 3104 xname = device_xname(sc->sc_dev); 3105 strlcpy(ifp->if_xname, xname, IFNAMSIZ); 3106 ifp->if_softc = sc; 3107 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 3108 ifp->if_extflags = IFEF_MPSAFE; 3109 ifp->if_ioctl = wm_ioctl; 3110 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 3111 ifp->if_start = wm_nq_start; 3112 /* 3113 * When the number of CPUs is one and the controller can use 3114 * MSI-X, wm(4) use MSI-X but *does not* use multiqueue. 3115 * That is, wm(4) use two interrupts, one is used for Tx/Rx 3116 * and the other is used for link status changing. 3117 * In this situation, wm_nq_transmit() is disadvantageous 3118 * because of wm_select_txqueue() and pcq(9) overhead. 3119 */ 3120 if (wm_is_using_multiqueue(sc)) 3121 ifp->if_transmit = wm_nq_transmit; 3122 } else { 3123 ifp->if_start = wm_start; 3124 /* 3125 * wm_transmit() has the same disadvantages as wm_nq_transmit() 3126 * described above. 3127 */ 3128 if (wm_is_using_multiqueue(sc)) 3129 ifp->if_transmit = wm_transmit; 3130 } 3131 /* wm(4) doest not use ifp->if_watchdog, use wm_tick as watchdog. */ 3132 ifp->if_init = wm_init; 3133 ifp->if_stop = wm_stop; 3134 IFQ_SET_MAXLEN(&ifp->if_snd, uimax(WM_IFQUEUELEN, IFQ_MAXLEN)); 3135 IFQ_SET_READY(&ifp->if_snd); 3136 3137 /* Check for jumbo frame */ 3138 switch (sc->sc_type) { 3139 case WM_T_82573: 3140 /* XXX limited to 9234 if ASPM is disabled */ 3141 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword); 3142 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0) 3143 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3144 break; 3145 case WM_T_82571: 3146 case WM_T_82572: 3147 case WM_T_82574: 3148 case WM_T_82583: 3149 case WM_T_82575: 3150 case WM_T_82576: 3151 case WM_T_82580: 3152 case WM_T_I350: 3153 case WM_T_I354: 3154 case WM_T_I210: 3155 case WM_T_I211: 3156 case WM_T_80003: 3157 case WM_T_ICH9: 3158 case WM_T_ICH10: 3159 case WM_T_PCH2: /* PCH2 supports 9K frame size */ 3160 case WM_T_PCH_LPT: 3161 case WM_T_PCH_SPT: 3162 case WM_T_PCH_CNP: 3163 /* XXX limited to 9234 */ 3164 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3165 break; 3166 case WM_T_PCH: 3167 /* XXX limited to 4096 */ 3168 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3169 break; 3170 case WM_T_82542_2_0: 3171 case WM_T_82542_2_1: 3172 case WM_T_ICH8: 3173 /* No support for jumbo frame */ 3174 break; 3175 default: 3176 /* ETHER_MAX_LEN_JUMBO */ 3177 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 3178 break; 3179 } 3180 3181 /* If we're a i82543 or greater, we can support VLANs. */ 3182 if (sc->sc_type >= WM_T_82543) { 3183 sc->sc_ethercom.ec_capabilities |= 3184 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING; 3185 sc->sc_ethercom.ec_capenable |= ETHERCAP_VLAN_HWTAGGING; 3186 } 3187 3188 if ((sc->sc_flags & WM_F_EEE) != 0) 3189 sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE; 3190 3191 /* 3192 * We can perform TCPv4 and UDPv4 checksums in-bound. Only 3193 * on i82543 and later. 3194 */ 3195 if (sc->sc_type >= WM_T_82543) { 3196 ifp->if_capabilities |= 3197 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx | 3198 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx | 3199 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx | 3200 IFCAP_CSUM_TCPv6_Tx | 3201 IFCAP_CSUM_UDPv6_Tx; 3202 } 3203 3204 /* 3205 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL. 3206 * 3207 * 82541GI (8086:1076) ... no 3208 * 82572EI (8086:10b9) ... yes 3209 */ 3210 if (sc->sc_type >= WM_T_82571) { 3211 ifp->if_capabilities |= 3212 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx; 3213 } 3214 3215 /* 3216 * If we're a i82544 or greater (except i82547), we can do 3217 * TCP segmentation offload. 3218 */ 3219 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) 3220 ifp->if_capabilities |= IFCAP_TSOv4; 3221 3222 if (sc->sc_type >= WM_T_82571) 3223 ifp->if_capabilities |= IFCAP_TSOv6; 3224 3225 sc->sc_tx_process_limit = WM_TX_PROCESS_LIMIT_DEFAULT; 3226 sc->sc_tx_intr_process_limit = WM_TX_INTR_PROCESS_LIMIT_DEFAULT; 3227 sc->sc_rx_process_limit = WM_RX_PROCESS_LIMIT_DEFAULT; 3228 sc->sc_rx_intr_process_limit = WM_RX_INTR_PROCESS_LIMIT_DEFAULT; 3229 3230 /* Attach the interface. */ 3231 if_initialize(ifp); 3232 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if); 3233 ether_ifattach(ifp, enaddr); 3234 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb); 3235 if_register(ifp); 3236 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET, 3237 RND_FLAG_DEFAULT); 3238 3239 #ifdef WM_EVENT_COUNTERS 3240 /* Attach event counters. */ 3241 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR, 3242 NULL, xname, "linkintr"); 3243 3244 evcnt_attach_dynamic(&sc->sc_ev_crcerrs, EVCNT_TYPE_MISC, 3245 NULL, xname, "CRC Error"); 3246 evcnt_attach_dynamic(&sc->sc_ev_symerrc, EVCNT_TYPE_MISC, 3247 NULL, xname, "Symbol Error"); 3248 evcnt_attach_dynamic(&sc->sc_ev_mpc, EVCNT_TYPE_MISC, 3249 NULL, xname, "Missed Packets"); 3250 evcnt_attach_dynamic(&sc->sc_ev_colc, EVCNT_TYPE_MISC, 3251 NULL, xname, "Collision"); 3252 evcnt_attach_dynamic(&sc->sc_ev_sec, EVCNT_TYPE_MISC, 3253 NULL, xname, "Sequence Error"); 3254 evcnt_attach_dynamic(&sc->sc_ev_rlec, EVCNT_TYPE_MISC, 3255 NULL, xname, "Receive Length Error"); 3256 3257 if (sc->sc_type >= WM_T_82543) { 3258 evcnt_attach_dynamic(&sc->sc_ev_algnerrc, EVCNT_TYPE_MISC, 3259 NULL, xname, "Alignment Error"); 3260 evcnt_attach_dynamic(&sc->sc_ev_rxerrc, EVCNT_TYPE_MISC, 3261 NULL, xname, "Receive Error"); 3262 /* XXX Does 82575 have HTDPMC? */ 3263 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 3264 evcnt_attach_dynamic(&sc->sc_ev_cexterr, 3265 EVCNT_TYPE_MISC, NULL, xname, 3266 "Carrier Extension Error"); 3267 else 3268 evcnt_attach_dynamic(&sc->sc_ev_htdpmc, 3269 EVCNT_TYPE_MISC, NULL, xname, 3270 "Host Transmit Discarded Packets by MAC"); 3271 3272 evcnt_attach_dynamic(&sc->sc_ev_tncrs, EVCNT_TYPE_MISC, 3273 NULL, xname, "Tx with No CRS"); 3274 evcnt_attach_dynamic(&sc->sc_ev_tsctc, EVCNT_TYPE_MISC, 3275 NULL, xname, "TCP Segmentation Context Tx"); 3276 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 3277 evcnt_attach_dynamic(&sc->sc_ev_tsctfc, 3278 EVCNT_TYPE_MISC, NULL, xname, 3279 "TCP Segmentation Context Tx Fail"); 3280 else { 3281 /* XXX Is the circuit breaker only for 82576? */ 3282 evcnt_attach_dynamic(&sc->sc_ev_cbrdpc, 3283 EVCNT_TYPE_MISC, NULL, xname, 3284 "Circuit Breaker Rx Dropped Packet"); 3285 evcnt_attach_dynamic(&sc->sc_ev_cbrmpc, 3286 EVCNT_TYPE_MISC, NULL, xname, 3287 "Circuit Breaker Rx Manageability Packet"); 3288 } 3289 } 3290 3291 if (sc->sc_type >= WM_T_82542_2_1) { 3292 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC, 3293 NULL, xname, "tx_xoff"); 3294 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC, 3295 NULL, xname, "tx_xon"); 3296 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC, 3297 NULL, xname, "rx_xoff"); 3298 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC, 3299 NULL, xname, "rx_xon"); 3300 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC, 3301 NULL, xname, "rx_macctl"); 3302 } 3303 3304 evcnt_attach_dynamic(&sc->sc_ev_scc, EVCNT_TYPE_MISC, 3305 NULL, xname, "Single Collision"); 3306 evcnt_attach_dynamic(&sc->sc_ev_ecol, EVCNT_TYPE_MISC, 3307 NULL, xname, "Excessive Collisions"); 3308 evcnt_attach_dynamic(&sc->sc_ev_mcc, EVCNT_TYPE_MISC, 3309 NULL, xname, "Multiple Collision"); 3310 evcnt_attach_dynamic(&sc->sc_ev_latecol, EVCNT_TYPE_MISC, 3311 NULL, xname, "Late Collisions"); 3312 3313 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) 3314 evcnt_attach_dynamic(&sc->sc_ev_cbtmpc, EVCNT_TYPE_MISC, 3315 NULL, xname, "Circuit Breaker Tx Manageability Packet"); 3316 3317 evcnt_attach_dynamic(&sc->sc_ev_dc, EVCNT_TYPE_MISC, 3318 NULL, xname, "Defer"); 3319 evcnt_attach_dynamic(&sc->sc_ev_prc64, EVCNT_TYPE_MISC, 3320 NULL, xname, "Packets Rx (64 bytes)"); 3321 evcnt_attach_dynamic(&sc->sc_ev_prc127, EVCNT_TYPE_MISC, 3322 NULL, xname, "Packets Rx (65-127 bytes)"); 3323 evcnt_attach_dynamic(&sc->sc_ev_prc255, EVCNT_TYPE_MISC, 3324 NULL, xname, "Packets Rx (128-255 bytes)"); 3325 evcnt_attach_dynamic(&sc->sc_ev_prc511, EVCNT_TYPE_MISC, 3326 NULL, xname, "Packets Rx (256-511 bytes)"); 3327 evcnt_attach_dynamic(&sc->sc_ev_prc1023, EVCNT_TYPE_MISC, 3328 NULL, xname, "Packets Rx (512-1023 bytes)"); 3329 evcnt_attach_dynamic(&sc->sc_ev_prc1522, EVCNT_TYPE_MISC, 3330 NULL, xname, "Packets Rx (1024-1522 bytes)"); 3331 evcnt_attach_dynamic(&sc->sc_ev_gprc, EVCNT_TYPE_MISC, 3332 NULL, xname, "Good Packets Rx"); 3333 evcnt_attach_dynamic(&sc->sc_ev_bprc, EVCNT_TYPE_MISC, 3334 NULL, xname, "Broadcast Packets Rx"); 3335 evcnt_attach_dynamic(&sc->sc_ev_mprc, EVCNT_TYPE_MISC, 3336 NULL, xname, "Multicast Packets Rx"); 3337 evcnt_attach_dynamic(&sc->sc_ev_gptc, EVCNT_TYPE_MISC, 3338 NULL, xname, "Good Packets Tx"); 3339 evcnt_attach_dynamic(&sc->sc_ev_gorc, EVCNT_TYPE_MISC, 3340 NULL, xname, "Good Octets Rx"); 3341 evcnt_attach_dynamic(&sc->sc_ev_gotc, EVCNT_TYPE_MISC, 3342 NULL, xname, "Good Octets Tx"); 3343 evcnt_attach_dynamic(&sc->sc_ev_rnbc, EVCNT_TYPE_MISC, 3344 NULL, xname, "Rx No Buffers"); 3345 evcnt_attach_dynamic(&sc->sc_ev_ruc, EVCNT_TYPE_MISC, 3346 NULL, xname, "Rx Undersize"); 3347 evcnt_attach_dynamic(&sc->sc_ev_rfc, EVCNT_TYPE_MISC, 3348 NULL, xname, "Rx Fragment"); 3349 evcnt_attach_dynamic(&sc->sc_ev_roc, EVCNT_TYPE_MISC, 3350 NULL, xname, "Rx Oversize"); 3351 evcnt_attach_dynamic(&sc->sc_ev_rjc, EVCNT_TYPE_MISC, 3352 NULL, xname, "Rx Jabber"); 3353 if (sc->sc_type >= WM_T_82540) { 3354 evcnt_attach_dynamic(&sc->sc_ev_mgtprc, EVCNT_TYPE_MISC, 3355 NULL, xname, "Management Packets RX"); 3356 evcnt_attach_dynamic(&sc->sc_ev_mgtpdc, EVCNT_TYPE_MISC, 3357 NULL, xname, "Management Packets Dropped"); 3358 evcnt_attach_dynamic(&sc->sc_ev_mgtptc, EVCNT_TYPE_MISC, 3359 NULL, xname, "Management Packets TX"); 3360 } 3361 evcnt_attach_dynamic(&sc->sc_ev_tor, EVCNT_TYPE_MISC, 3362 NULL, xname, "Total Octets Rx"); 3363 evcnt_attach_dynamic(&sc->sc_ev_tot, EVCNT_TYPE_MISC, 3364 NULL, xname, "Total Octets Tx"); 3365 evcnt_attach_dynamic(&sc->sc_ev_tpr, EVCNT_TYPE_MISC, 3366 NULL, xname, "Total Packets Rx"); 3367 evcnt_attach_dynamic(&sc->sc_ev_tpt, EVCNT_TYPE_MISC, 3368 NULL, xname, "Total Packets Tx"); 3369 evcnt_attach_dynamic(&sc->sc_ev_ptc64, EVCNT_TYPE_MISC, 3370 NULL, xname, "Packets Tx (64 bytes)"); 3371 evcnt_attach_dynamic(&sc->sc_ev_ptc127, EVCNT_TYPE_MISC, 3372 NULL, xname, "Packets Tx (65-127 bytes)"); 3373 evcnt_attach_dynamic(&sc->sc_ev_ptc255, EVCNT_TYPE_MISC, 3374 NULL, xname, "Packets Tx (128-255 bytes)"); 3375 evcnt_attach_dynamic(&sc->sc_ev_ptc511, EVCNT_TYPE_MISC, 3376 NULL, xname, "Packets Tx (256-511 bytes)"); 3377 evcnt_attach_dynamic(&sc->sc_ev_ptc1023, EVCNT_TYPE_MISC, 3378 NULL, xname, "Packets Tx (512-1023 bytes)"); 3379 evcnt_attach_dynamic(&sc->sc_ev_ptc1522, EVCNT_TYPE_MISC, 3380 NULL, xname, "Packets Tx (1024-1522 Bytes)"); 3381 evcnt_attach_dynamic(&sc->sc_ev_mptc, EVCNT_TYPE_MISC, 3382 NULL, xname, "Multicast Packets Tx"); 3383 evcnt_attach_dynamic(&sc->sc_ev_bptc, EVCNT_TYPE_MISC, 3384 NULL, xname, "Broadcast Packets Tx"); 3385 evcnt_attach_dynamic(&sc->sc_ev_iac, EVCNT_TYPE_MISC, 3386 NULL, xname, "Interrupt Assertion"); 3387 if (sc->sc_type < WM_T_82575) { 3388 evcnt_attach_dynamic(&sc->sc_ev_icrxptc, EVCNT_TYPE_MISC, 3389 NULL, xname, "Intr. Cause Rx Pkt Timer Expire"); 3390 evcnt_attach_dynamic(&sc->sc_ev_icrxatc, EVCNT_TYPE_MISC, 3391 NULL, xname, "Intr. Cause Rx Abs Timer Expire"); 3392 evcnt_attach_dynamic(&sc->sc_ev_ictxptc, EVCNT_TYPE_MISC, 3393 NULL, xname, "Intr. Cause Tx Pkt Timer Expire"); 3394 evcnt_attach_dynamic(&sc->sc_ev_ictxatc, EVCNT_TYPE_MISC, 3395 NULL, xname, "Intr. Cause Tx Abs Timer Expire"); 3396 evcnt_attach_dynamic(&sc->sc_ev_ictxqec, EVCNT_TYPE_MISC, 3397 NULL, xname, "Intr. Cause Tx Queue Empty"); 3398 evcnt_attach_dynamic(&sc->sc_ev_ictxqmtc, EVCNT_TYPE_MISC, 3399 NULL, xname, "Intr. Cause Tx Queue Min Thresh"); 3400 evcnt_attach_dynamic(&sc->sc_ev_rxdmtc, EVCNT_TYPE_MISC, 3401 NULL, xname, "Intr. Cause Rx Desc Min Thresh"); 3402 3403 /* XXX 82575 document says it has ICRXOC. Is that right? */ 3404 evcnt_attach_dynamic(&sc->sc_ev_icrxoc, EVCNT_TYPE_MISC, 3405 NULL, xname, "Interrupt Cause Receiver Overrun"); 3406 } else if (!WM_IS_ICHPCH(sc)) { 3407 /* 3408 * For 82575 and newer. 3409 * 3410 * On 80003, ICHs and PCHs, it seems all of the following 3411 * registers are zero. 3412 */ 3413 evcnt_attach_dynamic(&sc->sc_ev_rpthc, EVCNT_TYPE_MISC, 3414 NULL, xname, "Rx Packets To Host"); 3415 evcnt_attach_dynamic(&sc->sc_ev_debug1, EVCNT_TYPE_MISC, 3416 NULL, xname, "Debug Counter 1"); 3417 evcnt_attach_dynamic(&sc->sc_ev_debug2, EVCNT_TYPE_MISC, 3418 NULL, xname, "Debug Counter 2"); 3419 evcnt_attach_dynamic(&sc->sc_ev_debug3, EVCNT_TYPE_MISC, 3420 NULL, xname, "Debug Counter 3"); 3421 3422 /* 3423 * 82575 datasheet says 0x4118 is for TXQEC(Tx Queue Empty). 3424 * I think it's wrong. The real count I observed is the same 3425 * as GPTC(Good Packets Tx) and TPT(Total Packets Tx). 3426 * It's HGPTC(Host Good Packets Tx) which is described in 3427 * 82576's datasheet. 3428 */ 3429 evcnt_attach_dynamic(&sc->sc_ev_hgptc, EVCNT_TYPE_MISC, 3430 NULL, xname, "Host Good Packets TX"); 3431 3432 evcnt_attach_dynamic(&sc->sc_ev_debug4, EVCNT_TYPE_MISC, 3433 NULL, xname, "Debug Counter 4"); 3434 evcnt_attach_dynamic(&sc->sc_ev_rxdmtc, EVCNT_TYPE_MISC, 3435 NULL, xname, "Rx Desc Min Thresh"); 3436 /* XXX Is the circuit breaker only for 82576? */ 3437 evcnt_attach_dynamic(&sc->sc_ev_htcbdpc, EVCNT_TYPE_MISC, 3438 NULL, xname, "Host Tx Circuit Breaker Dropped Packets"); 3439 3440 evcnt_attach_dynamic(&sc->sc_ev_hgorc, EVCNT_TYPE_MISC, 3441 NULL, xname, "Host Good Octets Rx"); 3442 evcnt_attach_dynamic(&sc->sc_ev_hgotc, EVCNT_TYPE_MISC, 3443 NULL, xname, "Host Good Octets Tx"); 3444 evcnt_attach_dynamic(&sc->sc_ev_lenerrs, EVCNT_TYPE_MISC, 3445 NULL, xname, "Length Errors"); 3446 } 3447 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) { 3448 evcnt_attach_dynamic(&sc->sc_ev_tlpic, EVCNT_TYPE_MISC, 3449 NULL, xname, "EEE Tx LPI"); 3450 evcnt_attach_dynamic(&sc->sc_ev_rlpic, EVCNT_TYPE_MISC, 3451 NULL, xname, "EEE Rx LPI"); 3452 evcnt_attach_dynamic(&sc->sc_ev_b2ogprc, EVCNT_TYPE_MISC, 3453 NULL, xname, "BMC2OS Packets received by host"); 3454 evcnt_attach_dynamic(&sc->sc_ev_o2bspc, EVCNT_TYPE_MISC, 3455 NULL, xname, "OS2BMC Packets transmitted by host"); 3456 evcnt_attach_dynamic(&sc->sc_ev_b2ospc, EVCNT_TYPE_MISC, 3457 NULL, xname, "BMC2OS Packets sent by BMC"); 3458 evcnt_attach_dynamic(&sc->sc_ev_o2bgptc, EVCNT_TYPE_MISC, 3459 NULL, xname, "OS2BMC Packets received by BMC"); 3460 evcnt_attach_dynamic(&sc->sc_ev_scvpc, EVCNT_TYPE_MISC, 3461 NULL, xname, "SerDes/SGMII Code Violation Packet"); 3462 evcnt_attach_dynamic(&sc->sc_ev_hrmpc, EVCNT_TYPE_MISC, 3463 NULL, xname, "Header Redirection Missed Packet"); 3464 } 3465 #endif /* WM_EVENT_COUNTERS */ 3466 3467 sc->sc_txrx_use_workqueue = false; 3468 3469 if (wm_phy_need_linkdown_discard(sc)) { 3470 DPRINTF(sc, WM_DEBUG_LINK, 3471 ("%s: %s: Set linkdown discard flag\n", 3472 device_xname(sc->sc_dev), __func__)); 3473 wm_set_linkdown_discard(sc); 3474 } 3475 3476 wm_init_sysctls(sc); 3477 3478 if (pmf_device_register(self, wm_suspend, wm_resume)) 3479 pmf_class_network_register(self, ifp); 3480 else 3481 aprint_error_dev(self, "couldn't establish power handler\n"); 3482 3483 sc->sc_flags |= WM_F_ATTACHED; 3484 out: 3485 return; 3486 } 3487 3488 /* The detach function (ca_detach) */ 3489 static int 3490 wm_detach(device_t self, int flags __unused) 3491 { 3492 struct wm_softc *sc = device_private(self); 3493 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3494 int i; 3495 3496 if ((sc->sc_flags & WM_F_ATTACHED) == 0) 3497 return 0; 3498 3499 /* Stop the interface. Callouts are stopped in it. */ 3500 IFNET_LOCK(ifp); 3501 sc->sc_dying = true; 3502 wm_stop(ifp, 1); 3503 IFNET_UNLOCK(ifp); 3504 3505 pmf_device_deregister(self); 3506 3507 sysctl_teardown(&sc->sc_sysctllog); 3508 3509 #ifdef WM_EVENT_COUNTERS 3510 evcnt_detach(&sc->sc_ev_linkintr); 3511 3512 evcnt_detach(&sc->sc_ev_crcerrs); 3513 evcnt_detach(&sc->sc_ev_symerrc); 3514 evcnt_detach(&sc->sc_ev_mpc); 3515 evcnt_detach(&sc->sc_ev_colc); 3516 evcnt_detach(&sc->sc_ev_sec); 3517 evcnt_detach(&sc->sc_ev_rlec); 3518 3519 if (sc->sc_type >= WM_T_82543) { 3520 evcnt_detach(&sc->sc_ev_algnerrc); 3521 evcnt_detach(&sc->sc_ev_rxerrc); 3522 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 3523 evcnt_detach(&sc->sc_ev_cexterr); 3524 else 3525 evcnt_detach(&sc->sc_ev_htdpmc); 3526 3527 evcnt_detach(&sc->sc_ev_tncrs); 3528 evcnt_detach(&sc->sc_ev_tsctc); 3529 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 3530 evcnt_detach(&sc->sc_ev_tsctfc); 3531 else { 3532 evcnt_detach(&sc->sc_ev_cbrdpc); 3533 evcnt_detach(&sc->sc_ev_cbrmpc); 3534 } 3535 } 3536 3537 if (sc->sc_type >= WM_T_82542_2_1) { 3538 evcnt_detach(&sc->sc_ev_tx_xoff); 3539 evcnt_detach(&sc->sc_ev_tx_xon); 3540 evcnt_detach(&sc->sc_ev_rx_xoff); 3541 evcnt_detach(&sc->sc_ev_rx_xon); 3542 evcnt_detach(&sc->sc_ev_rx_macctl); 3543 } 3544 3545 evcnt_detach(&sc->sc_ev_scc); 3546 evcnt_detach(&sc->sc_ev_ecol); 3547 evcnt_detach(&sc->sc_ev_mcc); 3548 evcnt_detach(&sc->sc_ev_latecol); 3549 3550 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) 3551 evcnt_detach(&sc->sc_ev_cbtmpc); 3552 3553 evcnt_detach(&sc->sc_ev_dc); 3554 evcnt_detach(&sc->sc_ev_prc64); 3555 evcnt_detach(&sc->sc_ev_prc127); 3556 evcnt_detach(&sc->sc_ev_prc255); 3557 evcnt_detach(&sc->sc_ev_prc511); 3558 evcnt_detach(&sc->sc_ev_prc1023); 3559 evcnt_detach(&sc->sc_ev_prc1522); 3560 evcnt_detach(&sc->sc_ev_gprc); 3561 evcnt_detach(&sc->sc_ev_bprc); 3562 evcnt_detach(&sc->sc_ev_mprc); 3563 evcnt_detach(&sc->sc_ev_gptc); 3564 evcnt_detach(&sc->sc_ev_gorc); 3565 evcnt_detach(&sc->sc_ev_gotc); 3566 evcnt_detach(&sc->sc_ev_rnbc); 3567 evcnt_detach(&sc->sc_ev_ruc); 3568 evcnt_detach(&sc->sc_ev_rfc); 3569 evcnt_detach(&sc->sc_ev_roc); 3570 evcnt_detach(&sc->sc_ev_rjc); 3571 if (sc->sc_type >= WM_T_82540) { 3572 evcnt_detach(&sc->sc_ev_mgtprc); 3573 evcnt_detach(&sc->sc_ev_mgtpdc); 3574 evcnt_detach(&sc->sc_ev_mgtptc); 3575 } 3576 evcnt_detach(&sc->sc_ev_tor); 3577 evcnt_detach(&sc->sc_ev_tot); 3578 evcnt_detach(&sc->sc_ev_tpr); 3579 evcnt_detach(&sc->sc_ev_tpt); 3580 evcnt_detach(&sc->sc_ev_ptc64); 3581 evcnt_detach(&sc->sc_ev_ptc127); 3582 evcnt_detach(&sc->sc_ev_ptc255); 3583 evcnt_detach(&sc->sc_ev_ptc511); 3584 evcnt_detach(&sc->sc_ev_ptc1023); 3585 evcnt_detach(&sc->sc_ev_ptc1522); 3586 evcnt_detach(&sc->sc_ev_mptc); 3587 evcnt_detach(&sc->sc_ev_bptc); 3588 evcnt_detach(&sc->sc_ev_iac); 3589 if (sc->sc_type < WM_T_82575) { 3590 evcnt_detach(&sc->sc_ev_icrxptc); 3591 evcnt_detach(&sc->sc_ev_icrxatc); 3592 evcnt_detach(&sc->sc_ev_ictxptc); 3593 evcnt_detach(&sc->sc_ev_ictxatc); 3594 evcnt_detach(&sc->sc_ev_ictxqec); 3595 evcnt_detach(&sc->sc_ev_ictxqmtc); 3596 evcnt_detach(&sc->sc_ev_rxdmtc); 3597 evcnt_detach(&sc->sc_ev_icrxoc); 3598 } else if (!WM_IS_ICHPCH(sc)) { 3599 evcnt_detach(&sc->sc_ev_rpthc); 3600 evcnt_detach(&sc->sc_ev_debug1); 3601 evcnt_detach(&sc->sc_ev_debug2); 3602 evcnt_detach(&sc->sc_ev_debug3); 3603 evcnt_detach(&sc->sc_ev_hgptc); 3604 evcnt_detach(&sc->sc_ev_debug4); 3605 evcnt_detach(&sc->sc_ev_rxdmtc); 3606 evcnt_detach(&sc->sc_ev_htcbdpc); 3607 3608 evcnt_detach(&sc->sc_ev_hgorc); 3609 evcnt_detach(&sc->sc_ev_hgotc); 3610 evcnt_detach(&sc->sc_ev_lenerrs); 3611 } 3612 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) { 3613 evcnt_detach(&sc->sc_ev_tlpic); 3614 evcnt_detach(&sc->sc_ev_rlpic); 3615 evcnt_detach(&sc->sc_ev_b2ogprc); 3616 evcnt_detach(&sc->sc_ev_o2bspc); 3617 evcnt_detach(&sc->sc_ev_b2ospc); 3618 evcnt_detach(&sc->sc_ev_o2bgptc); 3619 evcnt_detach(&sc->sc_ev_scvpc); 3620 evcnt_detach(&sc->sc_ev_hrmpc); 3621 } 3622 #endif /* WM_EVENT_COUNTERS */ 3623 3624 rnd_detach_source(&sc->rnd_source); 3625 3626 /* Tell the firmware about the release */ 3627 mutex_enter(sc->sc_core_lock); 3628 wm_release_manageability(sc); 3629 wm_release_hw_control(sc); 3630 wm_enable_wakeup(sc); 3631 mutex_exit(sc->sc_core_lock); 3632 3633 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY); 3634 3635 ether_ifdetach(ifp); 3636 if_detach(ifp); 3637 if_percpuq_destroy(sc->sc_ipq); 3638 3639 /* Delete all remaining media. */ 3640 ifmedia_fini(&sc->sc_mii.mii_media); 3641 3642 /* Unload RX dmamaps and free mbufs */ 3643 for (i = 0; i < sc->sc_nqueues; i++) { 3644 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 3645 mutex_enter(rxq->rxq_lock); 3646 wm_rxdrain(rxq); 3647 mutex_exit(rxq->rxq_lock); 3648 } 3649 /* Must unlock here */ 3650 3651 /* Disestablish the interrupt handler */ 3652 for (i = 0; i < sc->sc_nintrs; i++) { 3653 if (sc->sc_ihs[i] != NULL) { 3654 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 3655 sc->sc_ihs[i] = NULL; 3656 } 3657 } 3658 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs); 3659 3660 /* wm_stop() ensured that the workqueues are stopped. */ 3661 workqueue_destroy(sc->sc_queue_wq); 3662 workqueue_destroy(sc->sc_reset_wq); 3663 3664 for (i = 0; i < sc->sc_nqueues; i++) 3665 softint_disestablish(sc->sc_queue[i].wmq_si); 3666 3667 wm_free_txrx_queues(sc); 3668 3669 /* Unmap the registers */ 3670 if (sc->sc_ss) { 3671 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss); 3672 sc->sc_ss = 0; 3673 } 3674 if (sc->sc_ios) { 3675 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 3676 sc->sc_ios = 0; 3677 } 3678 if (sc->sc_flashs) { 3679 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs); 3680 sc->sc_flashs = 0; 3681 } 3682 3683 if (sc->sc_core_lock) 3684 mutex_obj_free(sc->sc_core_lock); 3685 if (sc->sc_ich_phymtx) 3686 mutex_obj_free(sc->sc_ich_phymtx); 3687 if (sc->sc_ich_nvmmtx) 3688 mutex_obj_free(sc->sc_ich_nvmmtx); 3689 3690 return 0; 3691 } 3692 3693 static bool 3694 wm_suspend(device_t self, const pmf_qual_t *qual) 3695 { 3696 struct wm_softc *sc = device_private(self); 3697 3698 wm_release_manageability(sc); 3699 wm_release_hw_control(sc); 3700 wm_enable_wakeup(sc); 3701 3702 return true; 3703 } 3704 3705 static bool 3706 wm_resume(device_t self, const pmf_qual_t *qual) 3707 { 3708 struct wm_softc *sc = device_private(self); 3709 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3710 pcireg_t reg; 3711 char buf[256]; 3712 3713 reg = CSR_READ(sc, WMREG_WUS); 3714 if (reg != 0) { 3715 snprintb(buf, sizeof(buf), WUS_FLAGS, reg); 3716 device_printf(sc->sc_dev, "wakeup status %s\n", buf); 3717 CSR_WRITE(sc, WMREG_WUS, 0xffffffff); /* W1C */ 3718 } 3719 3720 if (sc->sc_type >= WM_T_PCH2) 3721 wm_resume_workarounds_pchlan(sc); 3722 IFNET_LOCK(ifp); 3723 if ((ifp->if_flags & IFF_UP) == 0) { 3724 /* >= PCH_SPT hardware workaround before reset. */ 3725 if (sc->sc_type >= WM_T_PCH_SPT) 3726 wm_flush_desc_rings(sc); 3727 3728 wm_reset(sc); 3729 /* Non-AMT based hardware can now take control from firmware */ 3730 if ((sc->sc_flags & WM_F_HAS_AMT) == 0) 3731 wm_get_hw_control(sc); 3732 wm_init_manageability(sc); 3733 } else { 3734 /* 3735 * We called pmf_class_network_register(), so if_init() is 3736 * automatically called when IFF_UP. wm_reset(), 3737 * wm_get_hw_control() and wm_init_manageability() are called 3738 * via wm_init(). 3739 */ 3740 } 3741 IFNET_UNLOCK(ifp); 3742 3743 return true; 3744 } 3745 3746 /* 3747 * wm_watchdog: 3748 * 3749 * Watchdog checker. 3750 */ 3751 static bool 3752 wm_watchdog(struct ifnet *ifp) 3753 { 3754 int qid; 3755 struct wm_softc *sc = ifp->if_softc; 3756 uint16_t hang_queue = 0; /* Max queue number of wm(4) is 82576's 16. */ 3757 3758 for (qid = 0; qid < sc->sc_nqueues; qid++) { 3759 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq; 3760 3761 wm_watchdog_txq(ifp, txq, &hang_queue); 3762 } 3763 3764 #ifdef WM_DEBUG 3765 if (sc->sc_trigger_reset) { 3766 /* debug operation, no need for atomicity or reliability */ 3767 sc->sc_trigger_reset = 0; 3768 hang_queue++; 3769 } 3770 #endif 3771 3772 if (hang_queue == 0) 3773 return true; 3774 3775 if (atomic_swap_uint(&sc->sc_reset_pending, 1) == 0) 3776 workqueue_enqueue(sc->sc_reset_wq, &sc->sc_reset_work, NULL); 3777 3778 return false; 3779 } 3780 3781 /* 3782 * Perform an interface watchdog reset. 3783 */ 3784 static void 3785 wm_handle_reset_work(struct work *work, void *arg) 3786 { 3787 struct wm_softc * const sc = arg; 3788 struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 3789 3790 /* Don't want ioctl operations to happen */ 3791 IFNET_LOCK(ifp); 3792 3793 /* reset the interface. */ 3794 wm_init(ifp); 3795 3796 IFNET_UNLOCK(ifp); 3797 3798 /* 3799 * There are still some upper layer processing which call 3800 * ifp->if_start(). e.g. ALTQ or one CPU system 3801 */ 3802 /* Try to get more packets going. */ 3803 ifp->if_start(ifp); 3804 3805 atomic_store_relaxed(&sc->sc_reset_pending, 0); 3806 } 3807 3808 3809 static void 3810 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq, uint16_t *hang) 3811 { 3812 3813 mutex_enter(txq->txq_lock); 3814 if (txq->txq_sending && 3815 time_uptime - txq->txq_lastsent > wm_watchdog_timeout) 3816 wm_watchdog_txq_locked(ifp, txq, hang); 3817 3818 mutex_exit(txq->txq_lock); 3819 } 3820 3821 static void 3822 wm_watchdog_txq_locked(struct ifnet *ifp, struct wm_txqueue *txq, 3823 uint16_t *hang) 3824 { 3825 struct wm_softc *sc = ifp->if_softc; 3826 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq); 3827 3828 KASSERT(mutex_owned(txq->txq_lock)); 3829 3830 /* 3831 * Since we're using delayed interrupts, sweep up 3832 * before we report an error. 3833 */ 3834 wm_txeof(txq, UINT_MAX); 3835 3836 if (txq->txq_sending) 3837 *hang |= __BIT(wmq->wmq_id); 3838 3839 if (txq->txq_free == WM_NTXDESC(txq)) { 3840 log(LOG_ERR, "%s: device timeout (lost interrupt)\n", 3841 device_xname(sc->sc_dev)); 3842 } else { 3843 #ifdef WM_DEBUG 3844 int i, j; 3845 struct wm_txsoft *txs; 3846 #endif 3847 log(LOG_ERR, 3848 "%s: device timeout (txfree %d txsfree %d txnext %d)\n", 3849 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree, 3850 txq->txq_next); 3851 if_statinc(ifp, if_oerrors); 3852 #ifdef WM_DEBUG 3853 for (i = txq->txq_sdirty; i != txq->txq_snext; 3854 i = WM_NEXTTXS(txq, i)) { 3855 txs = &txq->txq_soft[i]; 3856 printf("txs %d tx %d -> %d\n", 3857 i, txs->txs_firstdesc, txs->txs_lastdesc); 3858 for (j = txs->txs_firstdesc; ; j = WM_NEXTTX(txq, j)) { 3859 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 3860 printf("\tdesc %d: 0x%" PRIx64 "\n", j, 3861 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr); 3862 printf("\t %#08x%08x\n", 3863 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields, 3864 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen); 3865 } else { 3866 printf("\tdesc %d: 0x%" PRIx64 "\n", j, 3867 (uint64_t)txq->txq_descs[j].wtx_addr.wa_high << 32 | 3868 txq->txq_descs[j].wtx_addr.wa_low); 3869 printf("\t %#04x%02x%02x%08x\n", 3870 txq->txq_descs[j].wtx_fields.wtxu_vlan, 3871 txq->txq_descs[j].wtx_fields.wtxu_options, 3872 txq->txq_descs[j].wtx_fields.wtxu_status, 3873 txq->txq_descs[j].wtx_cmdlen); 3874 } 3875 if (j == txs->txs_lastdesc) 3876 break; 3877 } 3878 } 3879 #endif 3880 } 3881 } 3882 3883 /* 3884 * wm_tick: 3885 * 3886 * One second timer, used to check link status, sweep up 3887 * completed transmit jobs, etc. 3888 */ 3889 static void 3890 wm_tick(void *arg) 3891 { 3892 struct wm_softc *sc = arg; 3893 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3894 3895 mutex_enter(sc->sc_core_lock); 3896 3897 if (sc->sc_core_stopping) { 3898 mutex_exit(sc->sc_core_lock); 3899 return; 3900 } 3901 3902 wm_update_stats(sc); 3903 3904 if (sc->sc_flags & WM_F_HAS_MII) 3905 mii_tick(&sc->sc_mii); 3906 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211) 3907 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 3908 wm_serdes_tick(sc); 3909 else 3910 wm_tbi_tick(sc); 3911 3912 mutex_exit(sc->sc_core_lock); 3913 3914 if (wm_watchdog(ifp)) 3915 callout_schedule(&sc->sc_tick_ch, hz); 3916 } 3917 3918 static int 3919 wm_ifflags_cb(struct ethercom *ec) 3920 { 3921 struct ifnet *ifp = &ec->ec_if; 3922 struct wm_softc *sc = ifp->if_softc; 3923 u_short iffchange; 3924 int ecchange; 3925 bool needreset = false; 3926 int rc = 0; 3927 3928 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 3929 device_xname(sc->sc_dev), __func__)); 3930 3931 KASSERT(IFNET_LOCKED(ifp)); 3932 3933 mutex_enter(sc->sc_core_lock); 3934 3935 /* 3936 * Check for if_flags. 3937 * Main usage is to prevent linkdown when opening bpf. 3938 */ 3939 iffchange = ifp->if_flags ^ sc->sc_if_flags; 3940 sc->sc_if_flags = ifp->if_flags; 3941 if ((iffchange & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) { 3942 needreset = true; 3943 goto ec; 3944 } 3945 3946 /* iff related updates */ 3947 if ((iffchange & IFF_PROMISC) != 0) 3948 wm_set_filter(sc); 3949 3950 wm_set_vlan(sc); 3951 3952 ec: 3953 /* Check for ec_capenable. */ 3954 ecchange = ec->ec_capenable ^ sc->sc_ec_capenable; 3955 sc->sc_ec_capenable = ec->ec_capenable; 3956 if ((ecchange & ~ETHERCAP_EEE) != 0) { 3957 needreset = true; 3958 goto out; 3959 } 3960 3961 /* ec related updates */ 3962 wm_set_eee(sc); 3963 3964 out: 3965 if (needreset) 3966 rc = ENETRESET; 3967 mutex_exit(sc->sc_core_lock); 3968 3969 return rc; 3970 } 3971 3972 static bool 3973 wm_phy_need_linkdown_discard(struct wm_softc *sc) 3974 { 3975 3976 switch (sc->sc_phytype) { 3977 case WMPHY_82577: /* ihphy */ 3978 case WMPHY_82578: /* atphy */ 3979 case WMPHY_82579: /* ihphy */ 3980 case WMPHY_I217: /* ihphy */ 3981 case WMPHY_82580: /* ihphy */ 3982 case WMPHY_I350: /* ihphy */ 3983 return true; 3984 default: 3985 return false; 3986 } 3987 } 3988 3989 static void 3990 wm_set_linkdown_discard(struct wm_softc *sc) 3991 { 3992 3993 for (int i = 0; i < sc->sc_nqueues; i++) { 3994 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 3995 3996 mutex_enter(txq->txq_lock); 3997 txq->txq_flags |= WM_TXQ_LINKDOWN_DISCARD; 3998 mutex_exit(txq->txq_lock); 3999 } 4000 } 4001 4002 static void 4003 wm_clear_linkdown_discard(struct wm_softc *sc) 4004 { 4005 4006 for (int i = 0; i < sc->sc_nqueues; i++) { 4007 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 4008 4009 mutex_enter(txq->txq_lock); 4010 txq->txq_flags &= ~WM_TXQ_LINKDOWN_DISCARD; 4011 mutex_exit(txq->txq_lock); 4012 } 4013 } 4014 4015 /* 4016 * wm_ioctl: [ifnet interface function] 4017 * 4018 * Handle control requests from the operator. 4019 */ 4020 static int 4021 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data) 4022 { 4023 struct wm_softc *sc = ifp->if_softc; 4024 struct ifreq *ifr = (struct ifreq *)data; 4025 struct ifaddr *ifa = (struct ifaddr *)data; 4026 struct sockaddr_dl *sdl; 4027 int error; 4028 4029 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4030 device_xname(sc->sc_dev), __func__)); 4031 4032 switch (cmd) { 4033 case SIOCADDMULTI: 4034 case SIOCDELMULTI: 4035 break; 4036 default: 4037 KASSERT(IFNET_LOCKED(ifp)); 4038 } 4039 4040 if (cmd == SIOCZIFDATA) { 4041 /* 4042 * Special handling for SIOCZIFDATA. 4043 * Copying and clearing the if_data structure is done with 4044 * ether_ioctl() below. 4045 */ 4046 mutex_enter(sc->sc_core_lock); 4047 wm_update_stats(sc); 4048 wm_clear_evcnt(sc); 4049 mutex_exit(sc->sc_core_lock); 4050 } 4051 4052 switch (cmd) { 4053 case SIOCSIFMEDIA: 4054 mutex_enter(sc->sc_core_lock); 4055 /* Flow control requires full-duplex mode. */ 4056 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO || 4057 (ifr->ifr_media & IFM_FDX) == 0) 4058 ifr->ifr_media &= ~IFM_ETH_FMASK; 4059 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) { 4060 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) { 4061 /* We can do both TXPAUSE and RXPAUSE. */ 4062 ifr->ifr_media |= 4063 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 4064 } 4065 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK; 4066 } 4067 mutex_exit(sc->sc_core_lock); 4068 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 4069 if (error == 0 && wm_phy_need_linkdown_discard(sc)) { 4070 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_NONE) { 4071 DPRINTF(sc, WM_DEBUG_LINK, 4072 ("%s: %s: Set linkdown discard flag\n", 4073 device_xname(sc->sc_dev), __func__)); 4074 wm_set_linkdown_discard(sc); 4075 } 4076 } 4077 break; 4078 case SIOCINITIFADDR: 4079 mutex_enter(sc->sc_core_lock); 4080 if (ifa->ifa_addr->sa_family == AF_LINK) { 4081 sdl = satosdl(ifp->if_dl->ifa_addr); 4082 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len, 4083 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen); 4084 /* Unicast address is the first multicast entry */ 4085 wm_set_filter(sc); 4086 error = 0; 4087 mutex_exit(sc->sc_core_lock); 4088 break; 4089 } 4090 mutex_exit(sc->sc_core_lock); 4091 /*FALLTHROUGH*/ 4092 default: 4093 if (cmd == SIOCSIFFLAGS && wm_phy_need_linkdown_discard(sc)) { 4094 if (((ifp->if_flags & IFF_UP) != 0) && 4095 ((ifr->ifr_flags & IFF_UP) == 0)) { 4096 DPRINTF(sc, WM_DEBUG_LINK, 4097 ("%s: %s: Set linkdown discard flag\n", 4098 device_xname(sc->sc_dev), __func__)); 4099 wm_set_linkdown_discard(sc); 4100 } 4101 } 4102 const int s = splnet(); 4103 /* It may call wm_start, so unlock here */ 4104 error = ether_ioctl(ifp, cmd, data); 4105 splx(s); 4106 if (error != ENETRESET) 4107 break; 4108 4109 error = 0; 4110 4111 if (cmd == SIOCSIFCAP) 4112 error = if_init(ifp); 4113 else if (cmd == SIOCADDMULTI || cmd == SIOCDELMULTI) { 4114 mutex_enter(sc->sc_core_lock); 4115 if (sc->sc_if_flags & IFF_RUNNING) { 4116 /* 4117 * Multicast list has changed; set the 4118 * hardware filter accordingly. 4119 */ 4120 wm_set_filter(sc); 4121 } 4122 mutex_exit(sc->sc_core_lock); 4123 } 4124 break; 4125 } 4126 4127 return error; 4128 } 4129 4130 /* MAC address related */ 4131 4132 /* 4133 * Get the offset of MAC address and return it. 4134 * If error occured, use offset 0. 4135 */ 4136 static uint16_t 4137 wm_check_alt_mac_addr(struct wm_softc *sc) 4138 { 4139 uint16_t myea[ETHER_ADDR_LEN / 2]; 4140 uint16_t offset = NVM_OFF_MACADDR; 4141 4142 /* Try to read alternative MAC address pointer */ 4143 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0) 4144 return 0; 4145 4146 /* Check pointer if it's valid or not. */ 4147 if ((offset == 0x0000) || (offset == 0xffff)) 4148 return 0; 4149 4150 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid); 4151 /* 4152 * Check whether alternative MAC address is valid or not. 4153 * Some cards have non 0xffff pointer but those don't use 4154 * alternative MAC address in reality. 4155 * 4156 * Check whether the broadcast bit is set or not. 4157 */ 4158 if (wm_nvm_read(sc, offset, 1, myea) == 0) 4159 if (((myea[0] & 0xff) & 0x01) == 0) 4160 return offset; /* Found */ 4161 4162 /* Not found */ 4163 return 0; 4164 } 4165 4166 static int 4167 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr) 4168 { 4169 uint16_t myea[ETHER_ADDR_LEN / 2]; 4170 uint16_t offset = NVM_OFF_MACADDR; 4171 int do_invert = 0; 4172 4173 switch (sc->sc_type) { 4174 case WM_T_82580: 4175 case WM_T_I350: 4176 case WM_T_I354: 4177 /* EEPROM Top Level Partitioning */ 4178 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0; 4179 break; 4180 case WM_T_82571: 4181 case WM_T_82575: 4182 case WM_T_82576: 4183 case WM_T_80003: 4184 case WM_T_I210: 4185 case WM_T_I211: 4186 offset = wm_check_alt_mac_addr(sc); 4187 if (offset == 0) 4188 if ((sc->sc_funcid & 0x01) == 1) 4189 do_invert = 1; 4190 break; 4191 default: 4192 if ((sc->sc_funcid & 0x01) == 1) 4193 do_invert = 1; 4194 break; 4195 } 4196 4197 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0) 4198 goto bad; 4199 4200 enaddr[0] = myea[0] & 0xff; 4201 enaddr[1] = myea[0] >> 8; 4202 enaddr[2] = myea[1] & 0xff; 4203 enaddr[3] = myea[1] >> 8; 4204 enaddr[4] = myea[2] & 0xff; 4205 enaddr[5] = myea[2] >> 8; 4206 4207 /* 4208 * Toggle the LSB of the MAC address on the second port 4209 * of some dual port cards. 4210 */ 4211 if (do_invert != 0) 4212 enaddr[5] ^= 1; 4213 4214 return 0; 4215 4216 bad: 4217 return -1; 4218 } 4219 4220 /* 4221 * wm_set_ral: 4222 * 4223 * Set an entery in the receive address list. 4224 */ 4225 static void 4226 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx) 4227 { 4228 uint32_t ral_lo, ral_hi, addrl, addrh; 4229 uint32_t wlock_mac; 4230 int rv; 4231 4232 if (enaddr != NULL) { 4233 ral_lo = (uint32_t)enaddr[0] | ((uint32_t)enaddr[1] << 8) | 4234 ((uint32_t)enaddr[2] << 16) | ((uint32_t)enaddr[3] << 24); 4235 ral_hi = (uint32_t)enaddr[4] | ((uint32_t)enaddr[5] << 8); 4236 ral_hi |= RAL_AV; 4237 } else { 4238 ral_lo = 0; 4239 ral_hi = 0; 4240 } 4241 4242 switch (sc->sc_type) { 4243 case WM_T_82542_2_0: 4244 case WM_T_82542_2_1: 4245 case WM_T_82543: 4246 CSR_WRITE(sc, WMREG_RAL(idx), ral_lo); 4247 CSR_WRITE_FLUSH(sc); 4248 CSR_WRITE(sc, WMREG_RAH(idx), ral_hi); 4249 CSR_WRITE_FLUSH(sc); 4250 break; 4251 case WM_T_PCH2: 4252 case WM_T_PCH_LPT: 4253 case WM_T_PCH_SPT: 4254 case WM_T_PCH_CNP: 4255 if (idx == 0) { 4256 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo); 4257 CSR_WRITE_FLUSH(sc); 4258 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi); 4259 CSR_WRITE_FLUSH(sc); 4260 return; 4261 } 4262 if (sc->sc_type != WM_T_PCH2) { 4263 wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), 4264 FWSM_WLOCK_MAC); 4265 addrl = WMREG_SHRAL(idx - 1); 4266 addrh = WMREG_SHRAH(idx - 1); 4267 } else { 4268 wlock_mac = 0; 4269 addrl = WMREG_PCH_LPT_SHRAL(idx - 1); 4270 addrh = WMREG_PCH_LPT_SHRAH(idx - 1); 4271 } 4272 4273 if ((wlock_mac == 0) || (idx <= wlock_mac)) { 4274 rv = wm_get_swflag_ich8lan(sc); 4275 if (rv != 0) 4276 return; 4277 CSR_WRITE(sc, addrl, ral_lo); 4278 CSR_WRITE_FLUSH(sc); 4279 CSR_WRITE(sc, addrh, ral_hi); 4280 CSR_WRITE_FLUSH(sc); 4281 wm_put_swflag_ich8lan(sc); 4282 } 4283 4284 break; 4285 default: 4286 CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo); 4287 CSR_WRITE_FLUSH(sc); 4288 CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi); 4289 CSR_WRITE_FLUSH(sc); 4290 break; 4291 } 4292 } 4293 4294 /* 4295 * wm_mchash: 4296 * 4297 * Compute the hash of the multicast address for the 4096-bit 4298 * multicast filter. 4299 */ 4300 static uint32_t 4301 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr) 4302 { 4303 static const int lo_shift[4] = { 4, 3, 2, 0 }; 4304 static const int hi_shift[4] = { 4, 5, 6, 8 }; 4305 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 }; 4306 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 }; 4307 uint32_t hash; 4308 4309 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 4310 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 4311 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 4312 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){ 4313 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) | 4314 (((uint16_t)enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]); 4315 return (hash & 0x3ff); 4316 } 4317 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) | 4318 (((uint16_t)enaddr[5]) << hi_shift[sc->sc_mchash_type]); 4319 4320 return (hash & 0xfff); 4321 } 4322 4323 /* 4324 * 4325 * 4326 */ 4327 static int 4328 wm_rar_count(struct wm_softc *sc) 4329 { 4330 int size; 4331 4332 switch (sc->sc_type) { 4333 case WM_T_ICH8: 4334 size = WM_RAL_TABSIZE_ICH8 -1; 4335 break; 4336 case WM_T_ICH9: 4337 case WM_T_ICH10: 4338 case WM_T_PCH: 4339 size = WM_RAL_TABSIZE_ICH8; 4340 break; 4341 case WM_T_PCH2: 4342 size = WM_RAL_TABSIZE_PCH2; 4343 break; 4344 case WM_T_PCH_LPT: 4345 case WM_T_PCH_SPT: 4346 case WM_T_PCH_CNP: 4347 size = WM_RAL_TABSIZE_PCH_LPT; 4348 break; 4349 case WM_T_82575: 4350 case WM_T_I210: 4351 case WM_T_I211: 4352 size = WM_RAL_TABSIZE_82575; 4353 break; 4354 case WM_T_82576: 4355 case WM_T_82580: 4356 size = WM_RAL_TABSIZE_82576; 4357 break; 4358 case WM_T_I350: 4359 case WM_T_I354: 4360 size = WM_RAL_TABSIZE_I350; 4361 break; 4362 default: 4363 size = WM_RAL_TABSIZE; 4364 } 4365 4366 return size; 4367 } 4368 4369 /* 4370 * wm_set_filter: 4371 * 4372 * Set up the receive filter. 4373 */ 4374 static void 4375 wm_set_filter(struct wm_softc *sc) 4376 { 4377 struct ethercom *ec = &sc->sc_ethercom; 4378 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4379 struct ether_multi *enm; 4380 struct ether_multistep step; 4381 bus_addr_t mta_reg; 4382 uint32_t hash, reg, bit; 4383 int i, size, ralmax, rv; 4384 4385 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4386 device_xname(sc->sc_dev), __func__)); 4387 KASSERT(mutex_owned(sc->sc_core_lock)); 4388 4389 if (sc->sc_type >= WM_T_82544) 4390 mta_reg = WMREG_CORDOVA_MTA; 4391 else 4392 mta_reg = WMREG_MTA; 4393 4394 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE); 4395 4396 if (sc->sc_if_flags & IFF_BROADCAST) 4397 sc->sc_rctl |= RCTL_BAM; 4398 if (sc->sc_if_flags & IFF_PROMISC) { 4399 sc->sc_rctl |= RCTL_UPE; 4400 ETHER_LOCK(ec); 4401 ec->ec_flags |= ETHER_F_ALLMULTI; 4402 ETHER_UNLOCK(ec); 4403 goto allmulti; 4404 } 4405 4406 /* 4407 * Set the station address in the first RAL slot, and 4408 * clear the remaining slots. 4409 */ 4410 size = wm_rar_count(sc); 4411 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0); 4412 4413 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT) 4414 || (sc->sc_type == WM_T_PCH_CNP)) { 4415 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC); 4416 switch (i) { 4417 case 0: 4418 /* We can use all entries */ 4419 ralmax = size; 4420 break; 4421 case 1: 4422 /* Only RAR[0] */ 4423 ralmax = 1; 4424 break; 4425 default: 4426 /* Available SHRA + RAR[0] */ 4427 ralmax = i + 1; 4428 } 4429 } else 4430 ralmax = size; 4431 for (i = 1; i < size; i++) { 4432 if (i < ralmax) 4433 wm_set_ral(sc, NULL, i); 4434 } 4435 4436 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 4437 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 4438 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 4439 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)) 4440 size = WM_ICH8_MC_TABSIZE; 4441 else 4442 size = WM_MC_TABSIZE; 4443 /* Clear out the multicast table. */ 4444 for (i = 0; i < size; i++) { 4445 CSR_WRITE(sc, mta_reg + (i << 2), 0); 4446 CSR_WRITE_FLUSH(sc); 4447 } 4448 4449 ETHER_LOCK(ec); 4450 ETHER_FIRST_MULTI(step, ec, enm); 4451 while (enm != NULL) { 4452 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 4453 ec->ec_flags |= ETHER_F_ALLMULTI; 4454 ETHER_UNLOCK(ec); 4455 /* 4456 * We must listen to a range of multicast addresses. 4457 * For now, just accept all multicasts, rather than 4458 * trying to set only those filter bits needed to match 4459 * the range. (At this time, the only use of address 4460 * ranges is for IP multicast routing, for which the 4461 * range is big enough to require all bits set.) 4462 */ 4463 goto allmulti; 4464 } 4465 4466 hash = wm_mchash(sc, enm->enm_addrlo); 4467 4468 reg = (hash >> 5); 4469 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 4470 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 4471 || (sc->sc_type == WM_T_PCH2) 4472 || (sc->sc_type == WM_T_PCH_LPT) 4473 || (sc->sc_type == WM_T_PCH_SPT) 4474 || (sc->sc_type == WM_T_PCH_CNP)) 4475 reg &= 0x1f; 4476 else 4477 reg &= 0x7f; 4478 bit = hash & 0x1f; 4479 4480 hash = CSR_READ(sc, mta_reg + (reg << 2)); 4481 hash |= 1U << bit; 4482 4483 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) { 4484 /* 4485 * 82544 Errata 9: Certain register cannot be written 4486 * with particular alignments in PCI-X bus operation 4487 * (FCAH, MTA and VFTA). 4488 */ 4489 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2)); 4490 CSR_WRITE(sc, mta_reg + (reg << 2), hash); 4491 CSR_WRITE_FLUSH(sc); 4492 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit); 4493 CSR_WRITE_FLUSH(sc); 4494 } else { 4495 CSR_WRITE(sc, mta_reg + (reg << 2), hash); 4496 CSR_WRITE_FLUSH(sc); 4497 } 4498 4499 ETHER_NEXT_MULTI(step, enm); 4500 } 4501 ec->ec_flags &= ~ETHER_F_ALLMULTI; 4502 ETHER_UNLOCK(ec); 4503 4504 goto setit; 4505 4506 allmulti: 4507 sc->sc_rctl |= RCTL_MPE; 4508 4509 setit: 4510 if (sc->sc_type >= WM_T_PCH2) { 4511 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0) 4512 && (ifp->if_mtu > ETHERMTU)) 4513 rv = wm_lv_jumbo_workaround_ich8lan(sc, true); 4514 else 4515 rv = wm_lv_jumbo_workaround_ich8lan(sc, false); 4516 if (rv != 0) 4517 device_printf(sc->sc_dev, 4518 "Failed to do workaround for jumbo frame.\n"); 4519 } 4520 4521 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl); 4522 } 4523 4524 /* Reset and init related */ 4525 4526 static void 4527 wm_set_vlan(struct wm_softc *sc) 4528 { 4529 4530 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4531 device_xname(sc->sc_dev), __func__)); 4532 4533 /* Deal with VLAN enables. */ 4534 if (VLAN_ATTACHED(&sc->sc_ethercom)) 4535 sc->sc_ctrl |= CTRL_VME; 4536 else 4537 sc->sc_ctrl &= ~CTRL_VME; 4538 4539 /* Write the control registers. */ 4540 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 4541 } 4542 4543 static void 4544 wm_set_pcie_completion_timeout(struct wm_softc *sc) 4545 { 4546 uint32_t gcr; 4547 pcireg_t ctrl2; 4548 4549 gcr = CSR_READ(sc, WMREG_GCR); 4550 4551 /* Only take action if timeout value is defaulted to 0 */ 4552 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0) 4553 goto out; 4554 4555 if ((gcr & GCR_CAP_VER2) == 0) { 4556 gcr |= GCR_CMPL_TMOUT_10MS; 4557 goto out; 4558 } 4559 4560 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 4561 sc->sc_pcixe_capoff + PCIE_DCSR2); 4562 ctrl2 |= WM_PCIE_DCSR2_16MS; 4563 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 4564 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2); 4565 4566 out: 4567 /* Disable completion timeout resend */ 4568 gcr &= ~GCR_CMPL_TMOUT_RESEND; 4569 4570 CSR_WRITE(sc, WMREG_GCR, gcr); 4571 } 4572 4573 void 4574 wm_get_auto_rd_done(struct wm_softc *sc) 4575 { 4576 int i; 4577 4578 /* wait for eeprom to reload */ 4579 switch (sc->sc_type) { 4580 case WM_T_82571: 4581 case WM_T_82572: 4582 case WM_T_82573: 4583 case WM_T_82574: 4584 case WM_T_82583: 4585 case WM_T_82575: 4586 case WM_T_82576: 4587 case WM_T_82580: 4588 case WM_T_I350: 4589 case WM_T_I354: 4590 case WM_T_I210: 4591 case WM_T_I211: 4592 case WM_T_80003: 4593 case WM_T_ICH8: 4594 case WM_T_ICH9: 4595 for (i = 0; i < 10; i++) { 4596 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD) 4597 break; 4598 delay(1000); 4599 } 4600 if (i == 10) { 4601 log(LOG_ERR, "%s: auto read from eeprom failed to " 4602 "complete\n", device_xname(sc->sc_dev)); 4603 } 4604 break; 4605 default: 4606 break; 4607 } 4608 } 4609 4610 void 4611 wm_lan_init_done(struct wm_softc *sc) 4612 { 4613 uint32_t reg = 0; 4614 int i; 4615 4616 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4617 device_xname(sc->sc_dev), __func__)); 4618 4619 /* Wait for eeprom to reload */ 4620 switch (sc->sc_type) { 4621 case WM_T_ICH10: 4622 case WM_T_PCH: 4623 case WM_T_PCH2: 4624 case WM_T_PCH_LPT: 4625 case WM_T_PCH_SPT: 4626 case WM_T_PCH_CNP: 4627 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) { 4628 reg = CSR_READ(sc, WMREG_STATUS); 4629 if ((reg & STATUS_LAN_INIT_DONE) != 0) 4630 break; 4631 delay(100); 4632 } 4633 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) { 4634 log(LOG_ERR, "%s: %s: lan_init_done failed to " 4635 "complete\n", device_xname(sc->sc_dev), __func__); 4636 } 4637 break; 4638 default: 4639 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 4640 __func__); 4641 break; 4642 } 4643 4644 reg &= ~STATUS_LAN_INIT_DONE; 4645 CSR_WRITE(sc, WMREG_STATUS, reg); 4646 } 4647 4648 void 4649 wm_get_cfg_done(struct wm_softc *sc) 4650 { 4651 int mask; 4652 uint32_t reg; 4653 int i; 4654 4655 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4656 device_xname(sc->sc_dev), __func__)); 4657 4658 /* Wait for eeprom to reload */ 4659 switch (sc->sc_type) { 4660 case WM_T_82542_2_0: 4661 case WM_T_82542_2_1: 4662 /* null */ 4663 break; 4664 case WM_T_82543: 4665 case WM_T_82544: 4666 case WM_T_82540: 4667 case WM_T_82545: 4668 case WM_T_82545_3: 4669 case WM_T_82546: 4670 case WM_T_82546_3: 4671 case WM_T_82541: 4672 case WM_T_82541_2: 4673 case WM_T_82547: 4674 case WM_T_82547_2: 4675 case WM_T_82573: 4676 case WM_T_82574: 4677 case WM_T_82583: 4678 /* generic */ 4679 delay(10*1000); 4680 break; 4681 case WM_T_80003: 4682 case WM_T_82571: 4683 case WM_T_82572: 4684 case WM_T_82575: 4685 case WM_T_82576: 4686 case WM_T_82580: 4687 case WM_T_I350: 4688 case WM_T_I354: 4689 case WM_T_I210: 4690 case WM_T_I211: 4691 if (sc->sc_type == WM_T_82571) { 4692 /* Only 82571 shares port 0 */ 4693 mask = EEMNGCTL_CFGDONE_0; 4694 } else 4695 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid; 4696 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) { 4697 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask) 4698 break; 4699 delay(1000); 4700 } 4701 if (i >= WM_PHY_CFG_TIMEOUT) 4702 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s failed\n", 4703 device_xname(sc->sc_dev), __func__)); 4704 break; 4705 case WM_T_ICH8: 4706 case WM_T_ICH9: 4707 case WM_T_ICH10: 4708 case WM_T_PCH: 4709 case WM_T_PCH2: 4710 case WM_T_PCH_LPT: 4711 case WM_T_PCH_SPT: 4712 case WM_T_PCH_CNP: 4713 delay(10*1000); 4714 if (sc->sc_type >= WM_T_ICH10) 4715 wm_lan_init_done(sc); 4716 else 4717 wm_get_auto_rd_done(sc); 4718 4719 /* Clear PHY Reset Asserted bit */ 4720 reg = CSR_READ(sc, WMREG_STATUS); 4721 if ((reg & STATUS_PHYRA) != 0) 4722 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA); 4723 break; 4724 default: 4725 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 4726 __func__); 4727 break; 4728 } 4729 } 4730 4731 int 4732 wm_phy_post_reset(struct wm_softc *sc) 4733 { 4734 device_t dev = sc->sc_dev; 4735 uint16_t reg; 4736 int rv = 0; 4737 4738 /* This function is only for ICH8 and newer. */ 4739 if (sc->sc_type < WM_T_ICH8) 4740 return 0; 4741 4742 if (wm_phy_resetisblocked(sc)) { 4743 /* XXX */ 4744 device_printf(dev, "PHY is blocked\n"); 4745 return -1; 4746 } 4747 4748 /* Allow time for h/w to get to quiescent state after reset */ 4749 delay(10*1000); 4750 4751 /* Perform any necessary post-reset workarounds */ 4752 if (sc->sc_type == WM_T_PCH) 4753 rv = wm_hv_phy_workarounds_ich8lan(sc); 4754 else if (sc->sc_type == WM_T_PCH2) 4755 rv = wm_lv_phy_workarounds_ich8lan(sc); 4756 if (rv != 0) 4757 return rv; 4758 4759 /* Clear the host wakeup bit after lcd reset */ 4760 if (sc->sc_type >= WM_T_PCH) { 4761 wm_gmii_hv_readreg(dev, 2, BM_PORT_GEN_CFG, ®); 4762 reg &= ~BM_WUC_HOST_WU_BIT; 4763 wm_gmii_hv_writereg(dev, 2, BM_PORT_GEN_CFG, reg); 4764 } 4765 4766 /* Configure the LCD with the extended configuration region in NVM */ 4767 if ((rv = wm_init_lcd_from_nvm(sc)) != 0) 4768 return rv; 4769 4770 /* Configure the LCD with the OEM bits in NVM */ 4771 rv = wm_oem_bits_config_ich8lan(sc, true); 4772 4773 if (sc->sc_type == WM_T_PCH2) { 4774 /* Ungate automatic PHY configuration on non-managed 82579 */ 4775 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) { 4776 delay(10 * 1000); 4777 wm_gate_hw_phy_config_ich8lan(sc, false); 4778 } 4779 /* Set EEE LPI Update Timer to 200usec */ 4780 rv = sc->phy.acquire(sc); 4781 if (rv) 4782 return rv; 4783 rv = wm_write_emi_reg_locked(dev, 4784 I82579_LPI_UPDATE_TIMER, 0x1387); 4785 sc->phy.release(sc); 4786 } 4787 4788 return rv; 4789 } 4790 4791 /* Only for PCH and newer */ 4792 static int 4793 wm_write_smbus_addr(struct wm_softc *sc) 4794 { 4795 uint32_t strap, freq; 4796 uint16_t phy_data; 4797 int rv; 4798 4799 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4800 device_xname(sc->sc_dev), __func__)); 4801 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP); 4802 4803 strap = CSR_READ(sc, WMREG_STRAP); 4804 freq = __SHIFTOUT(strap, STRAP_FREQ); 4805 4806 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_SMB_ADDR, &phy_data); 4807 if (rv != 0) 4808 return rv; 4809 4810 phy_data &= ~HV_SMB_ADDR_ADDR; 4811 phy_data |= __SHIFTOUT(strap, STRAP_SMBUSADDR); 4812 phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; 4813 4814 if (sc->sc_phytype == WMPHY_I217) { 4815 /* Restore SMBus frequency */ 4816 if (freq --) { 4817 phy_data &= ~(HV_SMB_ADDR_FREQ_LOW 4818 | HV_SMB_ADDR_FREQ_HIGH); 4819 phy_data |= __SHIFTIN((freq & 0x01) != 0, 4820 HV_SMB_ADDR_FREQ_LOW); 4821 phy_data |= __SHIFTIN((freq & 0x02) != 0, 4822 HV_SMB_ADDR_FREQ_HIGH); 4823 } else 4824 DPRINTF(sc, WM_DEBUG_INIT, 4825 ("%s: %s Unsupported SMB frequency in PHY\n", 4826 device_xname(sc->sc_dev), __func__)); 4827 } 4828 4829 return wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_SMB_ADDR, 4830 phy_data); 4831 } 4832 4833 static int 4834 wm_init_lcd_from_nvm(struct wm_softc *sc) 4835 { 4836 uint32_t extcnfctr, sw_cfg_mask, cnf_size, word_addr, i, reg; 4837 uint16_t phy_page = 0; 4838 int rv = 0; 4839 4840 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 4841 device_xname(sc->sc_dev), __func__)); 4842 4843 switch (sc->sc_type) { 4844 case WM_T_ICH8: 4845 if ((sc->sc_phytype == WMPHY_UNKNOWN) 4846 || (sc->sc_phytype != WMPHY_IGP_3)) 4847 return 0; 4848 4849 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_AMT) 4850 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82801H_LAN)) { 4851 sw_cfg_mask = FEXTNVM_SW_CONFIG; 4852 break; 4853 } 4854 /* FALLTHROUGH */ 4855 case WM_T_PCH: 4856 case WM_T_PCH2: 4857 case WM_T_PCH_LPT: 4858 case WM_T_PCH_SPT: 4859 case WM_T_PCH_CNP: 4860 sw_cfg_mask = FEXTNVM_SW_CONFIG_ICH8M; 4861 break; 4862 default: 4863 return 0; 4864 } 4865 4866 if ((rv = sc->phy.acquire(sc)) != 0) 4867 return rv; 4868 4869 reg = CSR_READ(sc, WMREG_FEXTNVM); 4870 if ((reg & sw_cfg_mask) == 0) 4871 goto release; 4872 4873 /* 4874 * Make sure HW does not configure LCD from PHY extended configuration 4875 * before SW configuration 4876 */ 4877 extcnfctr = CSR_READ(sc, WMREG_EXTCNFCTR); 4878 if ((sc->sc_type < WM_T_PCH2) 4879 && ((extcnfctr & EXTCNFCTR_PCIE_WRITE_ENABLE) != 0)) 4880 goto release; 4881 4882 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: Configure LCD by software\n", 4883 device_xname(sc->sc_dev), __func__)); 4884 /* word_addr is in DWORD */ 4885 word_addr = __SHIFTOUT(extcnfctr, EXTCNFCTR_EXT_CNF_POINTER) << 1; 4886 4887 reg = CSR_READ(sc, WMREG_EXTCNFSIZE); 4888 cnf_size = __SHIFTOUT(reg, EXTCNFSIZE_LENGTH); 4889 if (cnf_size == 0) 4890 goto release; 4891 4892 if (((sc->sc_type == WM_T_PCH) 4893 && ((extcnfctr & EXTCNFCTR_OEM_WRITE_ENABLE) == 0)) 4894 || (sc->sc_type > WM_T_PCH)) { 4895 /* 4896 * HW configures the SMBus address and LEDs when the OEM and 4897 * LCD Write Enable bits are set in the NVM. When both NVM bits 4898 * are cleared, SW will configure them instead. 4899 */ 4900 DPRINTF(sc, WM_DEBUG_INIT, 4901 ("%s: %s: Configure SMBus and LED\n", 4902 device_xname(sc->sc_dev), __func__)); 4903 if ((rv = wm_write_smbus_addr(sc)) != 0) 4904 goto release; 4905 4906 reg = CSR_READ(sc, WMREG_LEDCTL); 4907 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_LED_CONFIG, 4908 (uint16_t)reg); 4909 if (rv != 0) 4910 goto release; 4911 } 4912 4913 /* Configure LCD from extended configuration region. */ 4914 for (i = 0; i < cnf_size; i++) { 4915 uint16_t reg_data, reg_addr; 4916 4917 if (wm_nvm_read(sc, (word_addr + i * 2), 1, ®_data) != 0) 4918 goto release; 4919 4920 if (wm_nvm_read(sc, (word_addr + i * 2 + 1), 1, ®_addr) !=0) 4921 goto release; 4922 4923 if (reg_addr == IGPHY_PAGE_SELECT) 4924 phy_page = reg_data; 4925 4926 reg_addr &= IGPHY_MAXREGADDR; 4927 reg_addr |= phy_page; 4928 4929 KASSERT(sc->phy.writereg_locked != NULL); 4930 rv = sc->phy.writereg_locked(sc->sc_dev, 1, reg_addr, 4931 reg_data); 4932 } 4933 4934 release: 4935 sc->phy.release(sc); 4936 return rv; 4937 } 4938 4939 /* 4940 * wm_oem_bits_config_ich8lan - SW-based LCD Configuration 4941 * @sc: pointer to the HW structure 4942 * @d0_state: boolean if entering d0 or d3 device state 4943 * 4944 * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are 4945 * collectively called OEM bits. The OEM Write Enable bit and SW Config bit 4946 * in NVM determines whether HW should configure LPLU and Gbe Disable. 4947 */ 4948 int 4949 wm_oem_bits_config_ich8lan(struct wm_softc *sc, bool d0_state) 4950 { 4951 uint32_t mac_reg; 4952 uint16_t oem_reg; 4953 int rv; 4954 4955 if (sc->sc_type < WM_T_PCH) 4956 return 0; 4957 4958 rv = sc->phy.acquire(sc); 4959 if (rv != 0) 4960 return rv; 4961 4962 if (sc->sc_type == WM_T_PCH) { 4963 mac_reg = CSR_READ(sc, WMREG_EXTCNFCTR); 4964 if ((mac_reg & EXTCNFCTR_OEM_WRITE_ENABLE) != 0) 4965 goto release; 4966 } 4967 4968 mac_reg = CSR_READ(sc, WMREG_FEXTNVM); 4969 if ((mac_reg & FEXTNVM_SW_CONFIG_ICH8M) == 0) 4970 goto release; 4971 4972 mac_reg = CSR_READ(sc, WMREG_PHY_CTRL); 4973 4974 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 1, HV_OEM_BITS, &oem_reg); 4975 if (rv != 0) 4976 goto release; 4977 oem_reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU); 4978 4979 if (d0_state) { 4980 if ((mac_reg & PHY_CTRL_GBE_DIS) != 0) 4981 oem_reg |= HV_OEM_BITS_A1KDIS; 4982 if ((mac_reg & PHY_CTRL_D0A_LPLU) != 0) 4983 oem_reg |= HV_OEM_BITS_LPLU; 4984 } else { 4985 if ((mac_reg & (PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS)) 4986 != 0) 4987 oem_reg |= HV_OEM_BITS_A1KDIS; 4988 if ((mac_reg & (PHY_CTRL_D0A_LPLU | PHY_CTRL_NOND0A_LPLU)) 4989 != 0) 4990 oem_reg |= HV_OEM_BITS_LPLU; 4991 } 4992 4993 /* Set Restart auto-neg to activate the bits */ 4994 if ((d0_state || (sc->sc_type != WM_T_PCH)) 4995 && (wm_phy_resetisblocked(sc) == false)) 4996 oem_reg |= HV_OEM_BITS_ANEGNOW; 4997 4998 rv = wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_OEM_BITS, oem_reg); 4999 5000 release: 5001 sc->phy.release(sc); 5002 5003 return rv; 5004 } 5005 5006 /* Init hardware bits */ 5007 void 5008 wm_initialize_hardware_bits(struct wm_softc *sc) 5009 { 5010 uint32_t tarc0, tarc1, reg; 5011 5012 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 5013 device_xname(sc->sc_dev), __func__)); 5014 5015 /* For 82571 variant, 80003 and ICHs */ 5016 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583)) 5017 || WM_IS_ICHPCH(sc)) { 5018 5019 /* Transmit Descriptor Control 0 */ 5020 reg = CSR_READ(sc, WMREG_TXDCTL(0)); 5021 reg |= TXDCTL_COUNT_DESC; 5022 CSR_WRITE(sc, WMREG_TXDCTL(0), reg); 5023 5024 /* Transmit Descriptor Control 1 */ 5025 reg = CSR_READ(sc, WMREG_TXDCTL(1)); 5026 reg |= TXDCTL_COUNT_DESC; 5027 CSR_WRITE(sc, WMREG_TXDCTL(1), reg); 5028 5029 /* TARC0 */ 5030 tarc0 = CSR_READ(sc, WMREG_TARC0); 5031 switch (sc->sc_type) { 5032 case WM_T_82571: 5033 case WM_T_82572: 5034 case WM_T_82573: 5035 case WM_T_82574: 5036 case WM_T_82583: 5037 case WM_T_80003: 5038 /* Clear bits 30..27 */ 5039 tarc0 &= ~__BITS(30, 27); 5040 break; 5041 default: 5042 break; 5043 } 5044 5045 switch (sc->sc_type) { 5046 case WM_T_82571: 5047 case WM_T_82572: 5048 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */ 5049 5050 tarc1 = CSR_READ(sc, WMREG_TARC1); 5051 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */ 5052 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */ 5053 /* 8257[12] Errata No.7 */ 5054 tarc1 |= __BIT(22); /* TARC1 bits 22 */ 5055 5056 /* TARC1 bit 28 */ 5057 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 5058 tarc1 &= ~__BIT(28); 5059 else 5060 tarc1 |= __BIT(28); 5061 CSR_WRITE(sc, WMREG_TARC1, tarc1); 5062 5063 /* 5064 * 8257[12] Errata No.13 5065 * Disable Dyamic Clock Gating. 5066 */ 5067 reg = CSR_READ(sc, WMREG_CTRL_EXT); 5068 reg &= ~CTRL_EXT_DMA_DYN_CLK; 5069 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5070 break; 5071 case WM_T_82573: 5072 case WM_T_82574: 5073 case WM_T_82583: 5074 if ((sc->sc_type == WM_T_82574) 5075 || (sc->sc_type == WM_T_82583)) 5076 tarc0 |= __BIT(26); /* TARC0 bit 26 */ 5077 5078 /* Extended Device Control */ 5079 reg = CSR_READ(sc, WMREG_CTRL_EXT); 5080 reg &= ~__BIT(23); /* Clear bit 23 */ 5081 reg |= __BIT(22); /* Set bit 22 */ 5082 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5083 5084 /* Device Control */ 5085 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */ 5086 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 5087 5088 /* PCIe Control Register */ 5089 /* 5090 * 82573 Errata (unknown). 5091 * 5092 * 82574 Errata 25 and 82583 Errata 12 5093 * "Dropped Rx Packets": 5094 * NVM Image Version 2.1.4 and newer has no this bug. 5095 */ 5096 reg = CSR_READ(sc, WMREG_GCR); 5097 reg |= GCR_L1_ACT_WITHOUT_L0S_RX; 5098 CSR_WRITE(sc, WMREG_GCR, reg); 5099 5100 if ((sc->sc_type == WM_T_82574) 5101 || (sc->sc_type == WM_T_82583)) { 5102 /* 5103 * Document says this bit must be set for 5104 * proper operation. 5105 */ 5106 reg = CSR_READ(sc, WMREG_GCR); 5107 reg |= __BIT(22); 5108 CSR_WRITE(sc, WMREG_GCR, reg); 5109 5110 /* 5111 * Apply workaround for hardware errata 5112 * documented in errata docs Fixes issue where 5113 * some error prone or unreliable PCIe 5114 * completions are occurring, particularly 5115 * with ASPM enabled. Without fix, issue can 5116 * cause Tx timeouts. 5117 */ 5118 reg = CSR_READ(sc, WMREG_GCR2); 5119 reg |= __BIT(0); 5120 CSR_WRITE(sc, WMREG_GCR2, reg); 5121 } 5122 break; 5123 case WM_T_80003: 5124 /* TARC0 */ 5125 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER) 5126 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 5127 tarc0 &= ~__BIT(20); /* Clear bits 20 */ 5128 5129 /* TARC1 bit 28 */ 5130 tarc1 = CSR_READ(sc, WMREG_TARC1); 5131 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 5132 tarc1 &= ~__BIT(28); 5133 else 5134 tarc1 |= __BIT(28); 5135 CSR_WRITE(sc, WMREG_TARC1, tarc1); 5136 break; 5137 case WM_T_ICH8: 5138 case WM_T_ICH9: 5139 case WM_T_ICH10: 5140 case WM_T_PCH: 5141 case WM_T_PCH2: 5142 case WM_T_PCH_LPT: 5143 case WM_T_PCH_SPT: 5144 case WM_T_PCH_CNP: 5145 /* TARC0 */ 5146 if (sc->sc_type == WM_T_ICH8) { 5147 /* Set TARC0 bits 29 and 28 */ 5148 tarc0 |= __BITS(29, 28); 5149 } else if (sc->sc_type == WM_T_PCH_SPT) { 5150 tarc0 |= __BIT(29); 5151 /* 5152 * Drop bit 28. From Linux. 5153 * See I218/I219 spec update 5154 * "5. Buffer Overrun While the I219 is 5155 * Processing DMA Transactions" 5156 */ 5157 tarc0 &= ~__BIT(28); 5158 } 5159 /* Set TARC0 bits 23,24,26,27 */ 5160 tarc0 |= __BITS(27, 26) | __BITS(24, 23); 5161 5162 /* CTRL_EXT */ 5163 reg = CSR_READ(sc, WMREG_CTRL_EXT); 5164 reg |= __BIT(22); /* Set bit 22 */ 5165 /* 5166 * Enable PHY low-power state when MAC is at D3 5167 * w/o WoL 5168 */ 5169 if (sc->sc_type >= WM_T_PCH) 5170 reg |= CTRL_EXT_PHYPDEN; 5171 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5172 5173 /* TARC1 */ 5174 tarc1 = CSR_READ(sc, WMREG_TARC1); 5175 /* bit 28 */ 5176 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 5177 tarc1 &= ~__BIT(28); 5178 else 5179 tarc1 |= __BIT(28); 5180 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30); 5181 CSR_WRITE(sc, WMREG_TARC1, tarc1); 5182 5183 /* Device Status */ 5184 if (sc->sc_type == WM_T_ICH8) { 5185 reg = CSR_READ(sc, WMREG_STATUS); 5186 reg &= ~__BIT(31); 5187 CSR_WRITE(sc, WMREG_STATUS, reg); 5188 5189 } 5190 5191 /* IOSFPC */ 5192 if (sc->sc_type == WM_T_PCH_SPT) { 5193 reg = CSR_READ(sc, WMREG_IOSFPC); 5194 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */ 5195 CSR_WRITE(sc, WMREG_IOSFPC, reg); 5196 } 5197 /* 5198 * Work-around descriptor data corruption issue during 5199 * NFS v2 UDP traffic, just disable the NFS filtering 5200 * capability. 5201 */ 5202 reg = CSR_READ(sc, WMREG_RFCTL); 5203 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS; 5204 CSR_WRITE(sc, WMREG_RFCTL, reg); 5205 break; 5206 default: 5207 break; 5208 } 5209 CSR_WRITE(sc, WMREG_TARC0, tarc0); 5210 5211 switch (sc->sc_type) { 5212 case WM_T_82571: 5213 case WM_T_82572: 5214 case WM_T_82573: 5215 case WM_T_80003: 5216 case WM_T_ICH8: 5217 /* 5218 * 8257[12] Errata No.52, 82573 Errata No.43 and some 5219 * others to avoid RSS Hash Value bug. 5220 */ 5221 reg = CSR_READ(sc, WMREG_RFCTL); 5222 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS; 5223 CSR_WRITE(sc, WMREG_RFCTL, reg); 5224 break; 5225 case WM_T_82574: 5226 /* Use extened Rx descriptor. */ 5227 reg = CSR_READ(sc, WMREG_RFCTL); 5228 reg |= WMREG_RFCTL_EXSTEN; 5229 CSR_WRITE(sc, WMREG_RFCTL, reg); 5230 break; 5231 default: 5232 break; 5233 } 5234 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) { 5235 /* 5236 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24, 5237 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11: 5238 * "Certain Malformed IPv6 Extension Headers are Not Processed 5239 * Correctly by the Device" 5240 * 5241 * I354(C2000) Errata AVR53: 5242 * "Malformed IPv6 Extension Headers May Result in LAN Device 5243 * Hang" 5244 */ 5245 reg = CSR_READ(sc, WMREG_RFCTL); 5246 reg |= WMREG_RFCTL_IPV6EXDIS; 5247 CSR_WRITE(sc, WMREG_RFCTL, reg); 5248 } 5249 } 5250 5251 static uint32_t 5252 wm_rxpbs_adjust_82580(uint32_t val) 5253 { 5254 uint32_t rv = 0; 5255 5256 if (val < __arraycount(wm_82580_rxpbs_table)) 5257 rv = wm_82580_rxpbs_table[val]; 5258 5259 return rv; 5260 } 5261 5262 /* 5263 * wm_reset_phy: 5264 * 5265 * generic PHY reset function. 5266 * Same as e1000_phy_hw_reset_generic() 5267 */ 5268 static int 5269 wm_reset_phy(struct wm_softc *sc) 5270 { 5271 uint32_t reg; 5272 int rv; 5273 5274 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 5275 device_xname(sc->sc_dev), __func__)); 5276 if (wm_phy_resetisblocked(sc)) 5277 return -1; 5278 5279 rv = sc->phy.acquire(sc); 5280 if (rv) { 5281 device_printf(sc->sc_dev, "%s: failed to acquire phy: %d\n", 5282 __func__, rv); 5283 return rv; 5284 } 5285 5286 reg = CSR_READ(sc, WMREG_CTRL); 5287 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET); 5288 CSR_WRITE_FLUSH(sc); 5289 5290 delay(sc->phy.reset_delay_us); 5291 5292 CSR_WRITE(sc, WMREG_CTRL, reg); 5293 CSR_WRITE_FLUSH(sc); 5294 5295 delay(150); 5296 5297 sc->phy.release(sc); 5298 5299 wm_get_cfg_done(sc); 5300 wm_phy_post_reset(sc); 5301 5302 return 0; 5303 } 5304 5305 /* 5306 * wm_flush_desc_rings - remove all descriptors from the descriptor rings. 5307 * 5308 * In i219, the descriptor rings must be emptied before resetting the HW 5309 * or before changing the device state to D3 during runtime (runtime PM). 5310 * 5311 * Failure to do this will cause the HW to enter a unit hang state which can 5312 * only be released by PCI reset on the device. 5313 * 5314 * I219 does not use multiqueue, so it is enough to check sc->sc_queue[0] only. 5315 */ 5316 static void 5317 wm_flush_desc_rings(struct wm_softc *sc) 5318 { 5319 pcireg_t preg; 5320 uint32_t reg; 5321 struct wm_txqueue *txq; 5322 wiseman_txdesc_t *txd; 5323 int nexttx; 5324 uint32_t rctl; 5325 5326 KASSERT(IFNET_LOCKED(&sc->sc_ethercom.ec_if)); 5327 5328 /* First, disable MULR fix in FEXTNVM11 */ 5329 reg = CSR_READ(sc, WMREG_FEXTNVM11); 5330 reg |= FEXTNVM11_DIS_MULRFIX; 5331 CSR_WRITE(sc, WMREG_FEXTNVM11, reg); 5332 5333 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS); 5334 reg = CSR_READ(sc, WMREG_TDLEN(0)); 5335 if (((preg & DESCRING_STATUS_FLUSH_REQ) == 0) || (reg == 0)) 5336 return; 5337 5338 /* 5339 * Remove all descriptors from the tx_ring. 5340 * 5341 * We want to clear all pending descriptors from the TX ring. Zeroing 5342 * happens when the HW reads the regs. We assign the ring itself as 5343 * the data of the next descriptor. We don't care about the data we are 5344 * about to reset the HW. 5345 */ 5346 #ifdef WM_DEBUG 5347 device_printf(sc->sc_dev, "Need TX flush (reg = %08x)\n", preg); 5348 #endif 5349 reg = CSR_READ(sc, WMREG_TCTL); 5350 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN); 5351 5352 txq = &sc->sc_queue[0].wmq_txq; 5353 nexttx = txq->txq_next; 5354 txd = &txq->txq_descs[nexttx]; 5355 wm_set_dma_addr(&txd->wtx_addr, txq->txq_desc_dma); 5356 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS | 512); 5357 txd->wtx_fields.wtxu_status = 0; 5358 txd->wtx_fields.wtxu_options = 0; 5359 txd->wtx_fields.wtxu_vlan = 0; 5360 5361 wm_cdtxsync(txq, 0, WM_NTXDESC(txq), 5362 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 5363 5364 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 5365 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next); 5366 CSR_WRITE_FLUSH(sc); 5367 delay(250); 5368 5369 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS); 5370 if ((preg & DESCRING_STATUS_FLUSH_REQ) == 0) 5371 return; 5372 5373 /* 5374 * Mark all descriptors in the RX ring as consumed and disable the 5375 * rx ring. 5376 */ 5377 #ifdef WM_DEBUG 5378 device_printf(sc->sc_dev, "Need RX flush (reg = %08x)\n", preg); 5379 #endif 5380 rctl = CSR_READ(sc, WMREG_RCTL); 5381 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN); 5382 CSR_WRITE_FLUSH(sc); 5383 delay(150); 5384 5385 reg = CSR_READ(sc, WMREG_RXDCTL(0)); 5386 /* Zero the lower 14 bits (prefetch and host thresholds) */ 5387 reg &= 0xffffc000; 5388 /* 5389 * Update thresholds: prefetch threshold to 31, host threshold 5390 * to 1 and make sure the granularity is "descriptors" and not 5391 * "cache lines" 5392 */ 5393 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN); 5394 CSR_WRITE(sc, WMREG_RXDCTL(0), reg); 5395 5396 /* Momentarily enable the RX ring for the changes to take effect */ 5397 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN); 5398 CSR_WRITE_FLUSH(sc); 5399 delay(150); 5400 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN); 5401 } 5402 5403 /* 5404 * wm_reset: 5405 * 5406 * Reset the i82542 chip. 5407 */ 5408 static void 5409 wm_reset(struct wm_softc *sc) 5410 { 5411 int phy_reset = 0; 5412 int i, error = 0; 5413 uint32_t reg; 5414 uint16_t kmreg; 5415 int rv; 5416 5417 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 5418 device_xname(sc->sc_dev), __func__)); 5419 KASSERT(sc->sc_type != 0); 5420 5421 /* 5422 * Allocate on-chip memory according to the MTU size. 5423 * The Packet Buffer Allocation register must be written 5424 * before the chip is reset. 5425 */ 5426 switch (sc->sc_type) { 5427 case WM_T_82547: 5428 case WM_T_82547_2: 5429 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ? 5430 PBA_22K : PBA_30K; 5431 for (i = 0; i < sc->sc_nqueues; i++) { 5432 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 5433 txq->txq_fifo_head = 0; 5434 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT; 5435 txq->txq_fifo_size = 5436 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT; 5437 txq->txq_fifo_stall = 0; 5438 } 5439 break; 5440 case WM_T_82571: 5441 case WM_T_82572: 5442 case WM_T_82575: /* XXX need special handing for jumbo frames */ 5443 case WM_T_80003: 5444 sc->sc_pba = PBA_32K; 5445 break; 5446 case WM_T_82573: 5447 sc->sc_pba = PBA_12K; 5448 break; 5449 case WM_T_82574: 5450 case WM_T_82583: 5451 sc->sc_pba = PBA_20K; 5452 break; 5453 case WM_T_82576: 5454 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS); 5455 sc->sc_pba &= RXPBS_SIZE_MASK_82576; 5456 break; 5457 case WM_T_82580: 5458 case WM_T_I350: 5459 case WM_T_I354: 5460 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS)); 5461 break; 5462 case WM_T_I210: 5463 case WM_T_I211: 5464 sc->sc_pba = PBA_34K; 5465 break; 5466 case WM_T_ICH8: 5467 /* Workaround for a bit corruption issue in FIFO memory */ 5468 sc->sc_pba = PBA_8K; 5469 CSR_WRITE(sc, WMREG_PBS, PBA_16K); 5470 break; 5471 case WM_T_ICH9: 5472 case WM_T_ICH10: 5473 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ? 5474 PBA_14K : PBA_10K; 5475 break; 5476 case WM_T_PCH: 5477 case WM_T_PCH2: /* XXX 14K? */ 5478 case WM_T_PCH_LPT: 5479 case WM_T_PCH_SPT: 5480 case WM_T_PCH_CNP: 5481 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 1500 ? 5482 PBA_12K : PBA_26K; 5483 break; 5484 default: 5485 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ? 5486 PBA_40K : PBA_48K; 5487 break; 5488 } 5489 /* 5490 * Only old or non-multiqueue devices have the PBA register 5491 * XXX Need special handling for 82575. 5492 */ 5493 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0) 5494 || (sc->sc_type == WM_T_82575)) 5495 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba); 5496 5497 /* Prevent the PCI-E bus from sticking */ 5498 if (sc->sc_flags & WM_F_PCIE) { 5499 int timeout = 800; 5500 5501 sc->sc_ctrl |= CTRL_GIO_M_DIS; 5502 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 5503 5504 while (timeout--) { 5505 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA) 5506 == 0) 5507 break; 5508 delay(100); 5509 } 5510 if (timeout == 0) 5511 device_printf(sc->sc_dev, 5512 "failed to disable bus mastering\n"); 5513 } 5514 5515 /* Set the completion timeout for interface */ 5516 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 5517 || (sc->sc_type == WM_T_82580) 5518 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 5519 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 5520 wm_set_pcie_completion_timeout(sc); 5521 5522 /* Clear interrupt */ 5523 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 5524 if (wm_is_using_msix(sc)) { 5525 if (sc->sc_type != WM_T_82574) { 5526 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 5527 CSR_WRITE(sc, WMREG_EIAC, 0); 5528 } else 5529 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 5530 } 5531 5532 /* Stop the transmit and receive processes. */ 5533 CSR_WRITE(sc, WMREG_RCTL, 0); 5534 sc->sc_rctl &= ~RCTL_EN; 5535 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP); 5536 CSR_WRITE_FLUSH(sc); 5537 5538 /* XXX set_tbi_sbp_82543() */ 5539 5540 delay(10*1000); 5541 5542 /* Must acquire the MDIO ownership before MAC reset */ 5543 switch (sc->sc_type) { 5544 case WM_T_82573: 5545 case WM_T_82574: 5546 case WM_T_82583: 5547 error = wm_get_hw_semaphore_82573(sc); 5548 break; 5549 default: 5550 break; 5551 } 5552 5553 /* 5554 * 82541 Errata 29? & 82547 Errata 28? 5555 * See also the description about PHY_RST bit in CTRL register 5556 * in 8254x_GBe_SDM.pdf. 5557 */ 5558 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) { 5559 CSR_WRITE(sc, WMREG_CTRL, 5560 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET); 5561 CSR_WRITE_FLUSH(sc); 5562 delay(5000); 5563 } 5564 5565 switch (sc->sc_type) { 5566 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */ 5567 case WM_T_82541: 5568 case WM_T_82541_2: 5569 case WM_T_82547: 5570 case WM_T_82547_2: 5571 /* 5572 * On some chipsets, a reset through a memory-mapped write 5573 * cycle can cause the chip to reset before completing the 5574 * write cycle. This causes major headache that can be avoided 5575 * by issuing the reset via indirect register writes through 5576 * I/O space. 5577 * 5578 * So, if we successfully mapped the I/O BAR at attach time, 5579 * use that. Otherwise, try our luck with a memory-mapped 5580 * reset. 5581 */ 5582 if (sc->sc_flags & WM_F_IOH_VALID) 5583 wm_io_write(sc, WMREG_CTRL, CTRL_RST); 5584 else 5585 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST); 5586 break; 5587 case WM_T_82545_3: 5588 case WM_T_82546_3: 5589 /* Use the shadow control register on these chips. */ 5590 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST); 5591 break; 5592 case WM_T_80003: 5593 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST; 5594 if (sc->phy.acquire(sc) != 0) 5595 break; 5596 CSR_WRITE(sc, WMREG_CTRL, reg); 5597 sc->phy.release(sc); 5598 break; 5599 case WM_T_ICH8: 5600 case WM_T_ICH9: 5601 case WM_T_ICH10: 5602 case WM_T_PCH: 5603 case WM_T_PCH2: 5604 case WM_T_PCH_LPT: 5605 case WM_T_PCH_SPT: 5606 case WM_T_PCH_CNP: 5607 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST; 5608 if (wm_phy_resetisblocked(sc) == false) { 5609 /* 5610 * Gate automatic PHY configuration by hardware on 5611 * non-managed 82579 5612 */ 5613 if ((sc->sc_type == WM_T_PCH2) 5614 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) 5615 == 0)) 5616 wm_gate_hw_phy_config_ich8lan(sc, true); 5617 5618 reg |= CTRL_PHY_RESET; 5619 phy_reset = 1; 5620 } else 5621 device_printf(sc->sc_dev, "XXX reset is blocked!!!\n"); 5622 if (sc->phy.acquire(sc) != 0) 5623 break; 5624 CSR_WRITE(sc, WMREG_CTRL, reg); 5625 /* Don't insert a completion barrier when reset */ 5626 delay(20*1000); 5627 /* 5628 * The EXTCNFCTR_MDIO_SW_OWNERSHIP bit is cleared by the reset, 5629 * so don't use sc->phy.release(sc). Release sc_ich_phymtx 5630 * only. See also wm_get_swflag_ich8lan(). 5631 */ 5632 mutex_exit(sc->sc_ich_phymtx); 5633 break; 5634 case WM_T_82580: 5635 case WM_T_I350: 5636 case WM_T_I354: 5637 case WM_T_I210: 5638 case WM_T_I211: 5639 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST); 5640 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII) 5641 CSR_WRITE_FLUSH(sc); 5642 delay(5000); 5643 break; 5644 case WM_T_82542_2_0: 5645 case WM_T_82542_2_1: 5646 case WM_T_82543: 5647 case WM_T_82540: 5648 case WM_T_82545: 5649 case WM_T_82546: 5650 case WM_T_82571: 5651 case WM_T_82572: 5652 case WM_T_82573: 5653 case WM_T_82574: 5654 case WM_T_82575: 5655 case WM_T_82576: 5656 case WM_T_82583: 5657 default: 5658 /* Everything else can safely use the documented method. */ 5659 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST); 5660 break; 5661 } 5662 5663 /* Must release the MDIO ownership after MAC reset */ 5664 switch (sc->sc_type) { 5665 case WM_T_82573: 5666 case WM_T_82574: 5667 case WM_T_82583: 5668 if (error == 0) 5669 wm_put_hw_semaphore_82573(sc); 5670 break; 5671 default: 5672 break; 5673 } 5674 5675 /* Set Phy Config Counter to 50msec */ 5676 if (sc->sc_type == WM_T_PCH2) { 5677 reg = CSR_READ(sc, WMREG_FEXTNVM3); 5678 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK; 5679 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS; 5680 CSR_WRITE(sc, WMREG_FEXTNVM3, reg); 5681 } 5682 5683 if (phy_reset != 0) 5684 wm_get_cfg_done(sc); 5685 5686 /* Reload EEPROM */ 5687 switch (sc->sc_type) { 5688 case WM_T_82542_2_0: 5689 case WM_T_82542_2_1: 5690 case WM_T_82543: 5691 case WM_T_82544: 5692 delay(10); 5693 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST; 5694 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5695 CSR_WRITE_FLUSH(sc); 5696 delay(2000); 5697 break; 5698 case WM_T_82540: 5699 case WM_T_82545: 5700 case WM_T_82545_3: 5701 case WM_T_82546: 5702 case WM_T_82546_3: 5703 delay(5*1000); 5704 /* XXX Disable HW ARPs on ASF enabled adapters */ 5705 break; 5706 case WM_T_82541: 5707 case WM_T_82541_2: 5708 case WM_T_82547: 5709 case WM_T_82547_2: 5710 delay(20000); 5711 /* XXX Disable HW ARPs on ASF enabled adapters */ 5712 break; 5713 case WM_T_82571: 5714 case WM_T_82572: 5715 case WM_T_82573: 5716 case WM_T_82574: 5717 case WM_T_82583: 5718 if (sc->sc_flags & WM_F_EEPROM_FLASH) { 5719 delay(10); 5720 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST; 5721 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 5722 CSR_WRITE_FLUSH(sc); 5723 } 5724 /* check EECD_EE_AUTORD */ 5725 wm_get_auto_rd_done(sc); 5726 /* 5727 * Phy configuration from NVM just starts after EECD_AUTO_RD 5728 * is set. 5729 */ 5730 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574) 5731 || (sc->sc_type == WM_T_82583)) 5732 delay(25*1000); 5733 break; 5734 case WM_T_82575: 5735 case WM_T_82576: 5736 case WM_T_82580: 5737 case WM_T_I350: 5738 case WM_T_I354: 5739 case WM_T_I210: 5740 case WM_T_I211: 5741 case WM_T_80003: 5742 /* check EECD_EE_AUTORD */ 5743 wm_get_auto_rd_done(sc); 5744 break; 5745 case WM_T_ICH8: 5746 case WM_T_ICH9: 5747 case WM_T_ICH10: 5748 case WM_T_PCH: 5749 case WM_T_PCH2: 5750 case WM_T_PCH_LPT: 5751 case WM_T_PCH_SPT: 5752 case WM_T_PCH_CNP: 5753 break; 5754 default: 5755 panic("%s: unknown type\n", __func__); 5756 } 5757 5758 /* Check whether EEPROM is present or not */ 5759 switch (sc->sc_type) { 5760 case WM_T_82575: 5761 case WM_T_82576: 5762 case WM_T_82580: 5763 case WM_T_I350: 5764 case WM_T_I354: 5765 case WM_T_ICH8: 5766 case WM_T_ICH9: 5767 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) { 5768 /* Not found */ 5769 sc->sc_flags |= WM_F_EEPROM_INVALID; 5770 if (sc->sc_type == WM_T_82575) 5771 wm_reset_init_script_82575(sc); 5772 } 5773 break; 5774 default: 5775 break; 5776 } 5777 5778 if (phy_reset != 0) 5779 wm_phy_post_reset(sc); 5780 5781 if ((sc->sc_type == WM_T_82580) 5782 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) { 5783 /* Clear global device reset status bit */ 5784 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET); 5785 } 5786 5787 /* Clear any pending interrupt events. */ 5788 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 5789 reg = CSR_READ(sc, WMREG_ICR); 5790 if (wm_is_using_msix(sc)) { 5791 if (sc->sc_type != WM_T_82574) { 5792 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 5793 CSR_WRITE(sc, WMREG_EIAC, 0); 5794 } else 5795 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 5796 } 5797 5798 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 5799 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 5800 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 5801 || (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)){ 5802 reg = CSR_READ(sc, WMREG_KABGTXD); 5803 reg |= KABGTXD_BGSQLBIAS; 5804 CSR_WRITE(sc, WMREG_KABGTXD, reg); 5805 } 5806 5807 /* Reload sc_ctrl */ 5808 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 5809 5810 wm_set_eee(sc); 5811 5812 /* 5813 * For PCH, this write will make sure that any noise will be detected 5814 * as a CRC error and be dropped rather than show up as a bad packet 5815 * to the DMA engine 5816 */ 5817 if (sc->sc_type == WM_T_PCH) 5818 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565); 5819 5820 if (sc->sc_type >= WM_T_82544) 5821 CSR_WRITE(sc, WMREG_WUC, 0); 5822 5823 if (sc->sc_type < WM_T_82575) 5824 wm_disable_aspm(sc); /* Workaround for some chips */ 5825 5826 wm_reset_mdicnfg_82580(sc); 5827 5828 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0) 5829 wm_pll_workaround_i210(sc); 5830 5831 if (sc->sc_type == WM_T_80003) { 5832 /* Default to TRUE to enable the MDIC W/A */ 5833 sc->sc_flags |= WM_F_80003_MDIC_WA; 5834 5835 rv = wm_kmrn_readreg(sc, 5836 KUMCTRLSTA_OFFSET >> KUMCTRLSTA_OFFSET_SHIFT, &kmreg); 5837 if (rv == 0) { 5838 if ((kmreg & KUMCTRLSTA_OPMODE_MASK) 5839 == KUMCTRLSTA_OPMODE_INBAND_MDIO) 5840 sc->sc_flags &= ~WM_F_80003_MDIC_WA; 5841 else 5842 sc->sc_flags |= WM_F_80003_MDIC_WA; 5843 } 5844 } 5845 } 5846 5847 /* 5848 * wm_add_rxbuf: 5849 * 5850 * Add a receive buffer to the indiciated descriptor. 5851 */ 5852 static int 5853 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx) 5854 { 5855 struct wm_softc *sc = rxq->rxq_sc; 5856 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx]; 5857 struct mbuf *m; 5858 int error; 5859 5860 KASSERT(mutex_owned(rxq->rxq_lock)); 5861 5862 MGETHDR(m, M_DONTWAIT, MT_DATA); 5863 if (m == NULL) 5864 return ENOBUFS; 5865 5866 MCLGET(m, M_DONTWAIT); 5867 if ((m->m_flags & M_EXT) == 0) { 5868 m_freem(m); 5869 return ENOBUFS; 5870 } 5871 5872 if (rxs->rxs_mbuf != NULL) 5873 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 5874 5875 rxs->rxs_mbuf = m; 5876 5877 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; 5878 /* 5879 * Cannot use bus_dmamap_load_mbuf() here because m_data may be 5880 * sc_align_tweak'd between bus_dmamap_load() and bus_dmamap_sync(). 5881 */ 5882 error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, m->m_ext.ext_buf, 5883 m->m_ext.ext_size, NULL, BUS_DMA_READ | BUS_DMA_NOWAIT); 5884 if (error) { 5885 /* XXX XXX XXX */ 5886 aprint_error_dev(sc->sc_dev, 5887 "unable to load rx DMA map %d, error = %d\n", idx, error); 5888 panic("wm_add_rxbuf"); 5889 } 5890 5891 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 5892 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 5893 5894 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 5895 if ((sc->sc_rctl & RCTL_EN) != 0) 5896 wm_init_rxdesc(rxq, idx); 5897 } else 5898 wm_init_rxdesc(rxq, idx); 5899 5900 return 0; 5901 } 5902 5903 /* 5904 * wm_rxdrain: 5905 * 5906 * Drain the receive queue. 5907 */ 5908 static void 5909 wm_rxdrain(struct wm_rxqueue *rxq) 5910 { 5911 struct wm_softc *sc = rxq->rxq_sc; 5912 struct wm_rxsoft *rxs; 5913 int i; 5914 5915 KASSERT(mutex_owned(rxq->rxq_lock)); 5916 5917 for (i = 0; i < WM_NRXDESC; i++) { 5918 rxs = &rxq->rxq_soft[i]; 5919 if (rxs->rxs_mbuf != NULL) { 5920 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 5921 m_freem(rxs->rxs_mbuf); 5922 rxs->rxs_mbuf = NULL; 5923 } 5924 } 5925 } 5926 5927 /* 5928 * Setup registers for RSS. 5929 * 5930 * XXX not yet VMDq support 5931 */ 5932 static void 5933 wm_init_rss(struct wm_softc *sc) 5934 { 5935 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS]; 5936 int i; 5937 5938 CTASSERT(sizeof(rss_key) == RSS_KEYSIZE); 5939 5940 for (i = 0; i < RETA_NUM_ENTRIES; i++) { 5941 unsigned int qid, reta_ent; 5942 5943 qid = i % sc->sc_nqueues; 5944 switch (sc->sc_type) { 5945 case WM_T_82574: 5946 reta_ent = __SHIFTIN(qid, 5947 RETA_ENT_QINDEX_MASK_82574); 5948 break; 5949 case WM_T_82575: 5950 reta_ent = __SHIFTIN(qid, 5951 RETA_ENT_QINDEX1_MASK_82575); 5952 break; 5953 default: 5954 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK); 5955 break; 5956 } 5957 5958 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i)); 5959 reta_reg &= ~RETA_ENTRY_MASK_Q(i); 5960 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i)); 5961 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg); 5962 } 5963 5964 rss_getkey((uint8_t *)rss_key); 5965 for (i = 0; i < RSSRK_NUM_REGS; i++) 5966 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]); 5967 5968 if (sc->sc_type == WM_T_82574) 5969 mrqc = MRQC_ENABLE_RSS_MQ_82574; 5970 else 5971 mrqc = MRQC_ENABLE_RSS_MQ; 5972 5973 /* 5974 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata. 5975 * See IPV6EXDIS bit in wm_initialize_hardware_bits(). 5976 */ 5977 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP); 5978 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP); 5979 #if 0 5980 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP); 5981 mrqc |= MRQC_RSS_FIELD_IPV6_UDP_EX; 5982 #endif 5983 mrqc |= MRQC_RSS_FIELD_IPV6_TCP_EX; 5984 5985 CSR_WRITE(sc, WMREG_MRQC, mrqc); 5986 } 5987 5988 /* 5989 * Adjust TX and RX queue numbers which the system actulally uses. 5990 * 5991 * The numbers are affected by below parameters. 5992 * - The nubmer of hardware queues 5993 * - The number of MSI-X vectors (= "nvectors" argument) 5994 * - ncpu 5995 */ 5996 static void 5997 wm_adjust_qnum(struct wm_softc *sc, int nvectors) 5998 { 5999 int hw_ntxqueues, hw_nrxqueues, hw_nqueues; 6000 6001 if (nvectors < 2) { 6002 sc->sc_nqueues = 1; 6003 return; 6004 } 6005 6006 switch (sc->sc_type) { 6007 case WM_T_82572: 6008 hw_ntxqueues = 2; 6009 hw_nrxqueues = 2; 6010 break; 6011 case WM_T_82574: 6012 hw_ntxqueues = 2; 6013 hw_nrxqueues = 2; 6014 break; 6015 case WM_T_82575: 6016 hw_ntxqueues = 4; 6017 hw_nrxqueues = 4; 6018 break; 6019 case WM_T_82576: 6020 hw_ntxqueues = 16; 6021 hw_nrxqueues = 16; 6022 break; 6023 case WM_T_82580: 6024 case WM_T_I350: 6025 case WM_T_I354: 6026 hw_ntxqueues = 8; 6027 hw_nrxqueues = 8; 6028 break; 6029 case WM_T_I210: 6030 hw_ntxqueues = 4; 6031 hw_nrxqueues = 4; 6032 break; 6033 case WM_T_I211: 6034 hw_ntxqueues = 2; 6035 hw_nrxqueues = 2; 6036 break; 6037 /* 6038 * The below Ethernet controllers do not support MSI-X; 6039 * this driver doesn't let them use multiqueue. 6040 * - WM_T_80003 6041 * - WM_T_ICH8 6042 * - WM_T_ICH9 6043 * - WM_T_ICH10 6044 * - WM_T_PCH 6045 * - WM_T_PCH2 6046 * - WM_T_PCH_LPT 6047 */ 6048 default: 6049 hw_ntxqueues = 1; 6050 hw_nrxqueues = 1; 6051 break; 6052 } 6053 6054 hw_nqueues = uimin(hw_ntxqueues, hw_nrxqueues); 6055 6056 /* 6057 * As queues more than MSI-X vectors cannot improve scaling, we limit 6058 * the number of queues used actually. 6059 */ 6060 if (nvectors < hw_nqueues + 1) 6061 sc->sc_nqueues = nvectors - 1; 6062 else 6063 sc->sc_nqueues = hw_nqueues; 6064 6065 /* 6066 * As queues more than CPUs cannot improve scaling, we limit 6067 * the number of queues used actually. 6068 */ 6069 if (ncpu < sc->sc_nqueues) 6070 sc->sc_nqueues = ncpu; 6071 } 6072 6073 static inline bool 6074 wm_is_using_msix(struct wm_softc *sc) 6075 { 6076 6077 return (sc->sc_nintrs > 1); 6078 } 6079 6080 static inline bool 6081 wm_is_using_multiqueue(struct wm_softc *sc) 6082 { 6083 6084 return (sc->sc_nqueues > 1); 6085 } 6086 6087 static int 6088 wm_softint_establish_queue(struct wm_softc *sc, int qidx, int intr_idx) 6089 { 6090 struct wm_queue *wmq = &sc->sc_queue[qidx]; 6091 6092 wmq->wmq_id = qidx; 6093 wmq->wmq_intr_idx = intr_idx; 6094 wmq->wmq_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE, 6095 wm_handle_queue, wmq); 6096 if (wmq->wmq_si != NULL) 6097 return 0; 6098 6099 aprint_error_dev(sc->sc_dev, "unable to establish queue[%d] handler\n", 6100 wmq->wmq_id); 6101 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[wmq->wmq_intr_idx]); 6102 sc->sc_ihs[wmq->wmq_intr_idx] = NULL; 6103 return ENOMEM; 6104 } 6105 6106 /* 6107 * Both single interrupt MSI and INTx can use this function. 6108 */ 6109 static int 6110 wm_setup_legacy(struct wm_softc *sc) 6111 { 6112 pci_chipset_tag_t pc = sc->sc_pc; 6113 const char *intrstr = NULL; 6114 char intrbuf[PCI_INTRSTR_LEN]; 6115 int error; 6116 6117 error = wm_alloc_txrx_queues(sc); 6118 if (error) { 6119 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n", 6120 error); 6121 return ENOMEM; 6122 } 6123 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf, 6124 sizeof(intrbuf)); 6125 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true); 6126 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0], 6127 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev)); 6128 if (sc->sc_ihs[0] == NULL) { 6129 aprint_error_dev(sc->sc_dev,"unable to establish %s\n", 6130 (pci_intr_type(pc, sc->sc_intrs[0]) 6131 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx"); 6132 return ENOMEM; 6133 } 6134 6135 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr); 6136 sc->sc_nintrs = 1; 6137 6138 return wm_softint_establish_queue(sc, 0, 0); 6139 } 6140 6141 static int 6142 wm_setup_msix(struct wm_softc *sc) 6143 { 6144 void *vih; 6145 kcpuset_t *affinity; 6146 int qidx, error, intr_idx, txrx_established; 6147 pci_chipset_tag_t pc = sc->sc_pc; 6148 const char *intrstr = NULL; 6149 char intrbuf[PCI_INTRSTR_LEN]; 6150 char intr_xname[INTRDEVNAMEBUF]; 6151 6152 if (sc->sc_nqueues < ncpu) { 6153 /* 6154 * To avoid other devices' interrupts, the affinity of Tx/Rx 6155 * interrupts start from CPU#1. 6156 */ 6157 sc->sc_affinity_offset = 1; 6158 } else { 6159 /* 6160 * In this case, this device use all CPUs. So, we unify 6161 * affinitied cpu_index to msix vector number for readability. 6162 */ 6163 sc->sc_affinity_offset = 0; 6164 } 6165 6166 error = wm_alloc_txrx_queues(sc); 6167 if (error) { 6168 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n", 6169 error); 6170 return ENOMEM; 6171 } 6172 6173 kcpuset_create(&affinity, false); 6174 intr_idx = 0; 6175 6176 /* 6177 * TX and RX 6178 */ 6179 txrx_established = 0; 6180 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { 6181 struct wm_queue *wmq = &sc->sc_queue[qidx]; 6182 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu; 6183 6184 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 6185 sizeof(intrbuf)); 6186 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], 6187 PCI_INTR_MPSAFE, true); 6188 memset(intr_xname, 0, sizeof(intr_xname)); 6189 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d", 6190 device_xname(sc->sc_dev), qidx); 6191 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 6192 IPL_NET, wm_txrxintr_msix, wmq, intr_xname); 6193 if (vih == NULL) { 6194 aprint_error_dev(sc->sc_dev, 6195 "unable to establish MSI-X(for TX and RX)%s%s\n", 6196 intrstr ? " at " : "", 6197 intrstr ? intrstr : ""); 6198 6199 goto fail; 6200 } 6201 kcpuset_zero(affinity); 6202 /* Round-robin affinity */ 6203 kcpuset_set(affinity, affinity_to); 6204 error = interrupt_distribute(vih, affinity, NULL); 6205 if (error == 0) { 6206 aprint_normal_dev(sc->sc_dev, 6207 "for TX and RX interrupting at %s affinity to %u\n", 6208 intrstr, affinity_to); 6209 } else { 6210 aprint_normal_dev(sc->sc_dev, 6211 "for TX and RX interrupting at %s\n", intrstr); 6212 } 6213 sc->sc_ihs[intr_idx] = vih; 6214 if (wm_softint_establish_queue(sc, qidx, intr_idx) != 0) 6215 goto fail; 6216 txrx_established++; 6217 intr_idx++; 6218 } 6219 6220 /* LINK */ 6221 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 6222 sizeof(intrbuf)); 6223 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true); 6224 memset(intr_xname, 0, sizeof(intr_xname)); 6225 snprintf(intr_xname, sizeof(intr_xname), "%sLINK", 6226 device_xname(sc->sc_dev)); 6227 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 6228 IPL_NET, wm_linkintr_msix, sc, intr_xname); 6229 if (vih == NULL) { 6230 aprint_error_dev(sc->sc_dev, 6231 "unable to establish MSI-X(for LINK)%s%s\n", 6232 intrstr ? " at " : "", 6233 intrstr ? intrstr : ""); 6234 6235 goto fail; 6236 } 6237 /* Keep default affinity to LINK interrupt */ 6238 aprint_normal_dev(sc->sc_dev, 6239 "for LINK interrupting at %s\n", intrstr); 6240 sc->sc_ihs[intr_idx] = vih; 6241 sc->sc_link_intr_idx = intr_idx; 6242 6243 sc->sc_nintrs = sc->sc_nqueues + 1; 6244 kcpuset_destroy(affinity); 6245 return 0; 6246 6247 fail: 6248 for (qidx = 0; qidx < txrx_established; qidx++) { 6249 struct wm_queue *wmq = &sc->sc_queue[qidx]; 6250 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]); 6251 sc->sc_ihs[wmq->wmq_intr_idx] = NULL; 6252 } 6253 6254 kcpuset_destroy(affinity); 6255 return ENOMEM; 6256 } 6257 6258 static void 6259 wm_unset_stopping_flags(struct wm_softc *sc) 6260 { 6261 int i; 6262 6263 KASSERT(mutex_owned(sc->sc_core_lock)); 6264 6265 /* Must unset stopping flags in ascending order. */ 6266 for (i = 0; i < sc->sc_nqueues; i++) { 6267 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 6268 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 6269 6270 mutex_enter(txq->txq_lock); 6271 txq->txq_stopping = false; 6272 mutex_exit(txq->txq_lock); 6273 6274 mutex_enter(rxq->rxq_lock); 6275 rxq->rxq_stopping = false; 6276 mutex_exit(rxq->rxq_lock); 6277 } 6278 6279 sc->sc_core_stopping = false; 6280 } 6281 6282 static void 6283 wm_set_stopping_flags(struct wm_softc *sc) 6284 { 6285 int i; 6286 6287 KASSERT(mutex_owned(sc->sc_core_lock)); 6288 6289 sc->sc_core_stopping = true; 6290 6291 /* Must set stopping flags in ascending order. */ 6292 for (i = 0; i < sc->sc_nqueues; i++) { 6293 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 6294 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 6295 6296 mutex_enter(rxq->rxq_lock); 6297 rxq->rxq_stopping = true; 6298 mutex_exit(rxq->rxq_lock); 6299 6300 mutex_enter(txq->txq_lock); 6301 txq->txq_stopping = true; 6302 mutex_exit(txq->txq_lock); 6303 } 6304 } 6305 6306 /* 6307 * Write interrupt interval value to ITR or EITR 6308 */ 6309 static void 6310 wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq) 6311 { 6312 6313 if (!wmq->wmq_set_itr) 6314 return; 6315 6316 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 6317 uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK); 6318 6319 /* 6320 * 82575 doesn't have CNT_INGR field. 6321 * So, overwrite counter field by software. 6322 */ 6323 if (sc->sc_type == WM_T_82575) 6324 eitr |= __SHIFTIN(wmq->wmq_itr, 6325 EITR_COUNTER_MASK_82575); 6326 else 6327 eitr |= EITR_CNT_INGR; 6328 6329 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx), eitr); 6330 } else if (sc->sc_type == WM_T_82574 && wm_is_using_msix(sc)) { 6331 /* 6332 * 82574 has both ITR and EITR. SET EITR when we use 6333 * the multi queue function with MSI-X. 6334 */ 6335 CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx), 6336 wmq->wmq_itr & EITR_ITR_INT_MASK_82574); 6337 } else { 6338 KASSERT(wmq->wmq_id == 0); 6339 CSR_WRITE(sc, WMREG_ITR, wmq->wmq_itr); 6340 } 6341 6342 wmq->wmq_set_itr = false; 6343 } 6344 6345 /* 6346 * TODO 6347 * Below dynamic calculation of itr is almost the same as Linux igb, 6348 * however it does not fit to wm(4). So, we will have been disable AIM 6349 * until we will find appropriate calculation of itr. 6350 */ 6351 /* 6352 * Calculate interrupt interval value to be going to write register in 6353 * wm_itrs_writereg(). This function does not write ITR/EITR register. 6354 */ 6355 static void 6356 wm_itrs_calculate(struct wm_softc *sc, struct wm_queue *wmq) 6357 { 6358 #ifdef NOTYET 6359 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 6360 struct wm_txqueue *txq = &wmq->wmq_txq; 6361 uint32_t avg_size = 0; 6362 uint32_t new_itr; 6363 6364 if (rxq->rxq_packets) 6365 avg_size = rxq->rxq_bytes / rxq->rxq_packets; 6366 if (txq->txq_packets) 6367 avg_size = uimax(avg_size, txq->txq_bytes / txq->txq_packets); 6368 6369 if (avg_size == 0) { 6370 new_itr = 450; /* restore default value */ 6371 goto out; 6372 } 6373 6374 /* Add 24 bytes to size to account for CRC, preamble, and gap */ 6375 avg_size += 24; 6376 6377 /* Don't starve jumbo frames */ 6378 avg_size = uimin(avg_size, 3000); 6379 6380 /* Give a little boost to mid-size frames */ 6381 if ((avg_size > 300) && (avg_size < 1200)) 6382 new_itr = avg_size / 3; 6383 else 6384 new_itr = avg_size / 2; 6385 6386 out: 6387 /* 6388 * The usage of 82574 and 82575 EITR is different from otther NEWQUEUE 6389 * controllers. See sc->sc_itr_init setting in wm_init_locked(). 6390 */ 6391 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0 || sc->sc_type != WM_T_82575) 6392 new_itr *= 4; 6393 6394 if (new_itr != wmq->wmq_itr) { 6395 wmq->wmq_itr = new_itr; 6396 wmq->wmq_set_itr = true; 6397 } else 6398 wmq->wmq_set_itr = false; 6399 6400 rxq->rxq_packets = 0; 6401 rxq->rxq_bytes = 0; 6402 txq->txq_packets = 0; 6403 txq->txq_bytes = 0; 6404 #endif 6405 } 6406 6407 static void 6408 wm_init_sysctls(struct wm_softc *sc) 6409 { 6410 struct sysctllog **log; 6411 const struct sysctlnode *rnode, *qnode, *cnode; 6412 int i, rv; 6413 const char *dvname; 6414 6415 log = &sc->sc_sysctllog; 6416 dvname = device_xname(sc->sc_dev); 6417 6418 rv = sysctl_createv(log, 0, NULL, &rnode, 6419 0, CTLTYPE_NODE, dvname, 6420 SYSCTL_DESCR("wm information and settings"), 6421 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL); 6422 if (rv != 0) 6423 goto err; 6424 6425 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE, 6426 CTLTYPE_BOOL, "txrx_workqueue", 6427 SYSCTL_DESCR("Use workqueue for packet processing"), 6428 NULL, 0, &sc->sc_txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL); 6429 if (rv != 0) 6430 goto teardown; 6431 6432 for (i = 0; i < sc->sc_nqueues; i++) { 6433 struct wm_queue *wmq = &sc->sc_queue[i]; 6434 struct wm_txqueue *txq = &wmq->wmq_txq; 6435 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 6436 6437 snprintf(sc->sc_queue[i].sysctlname, 6438 sizeof(sc->sc_queue[i].sysctlname), "q%d", i); 6439 6440 if (sysctl_createv(log, 0, &rnode, &qnode, 6441 0, CTLTYPE_NODE, 6442 sc->sc_queue[i].sysctlname, SYSCTL_DESCR("Queue Name"), 6443 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) 6444 break; 6445 6446 if (sysctl_createv(log, 0, &qnode, &cnode, 6447 CTLFLAG_READONLY, CTLTYPE_INT, 6448 "txq_free", SYSCTL_DESCR("TX queue free"), 6449 NULL, 0, &txq->txq_free, 6450 0, CTL_CREATE, CTL_EOL) != 0) 6451 break; 6452 if (sysctl_createv(log, 0, &qnode, &cnode, 6453 CTLFLAG_READONLY, CTLTYPE_INT, 6454 "txd_head", SYSCTL_DESCR("TX descriptor head"), 6455 wm_sysctl_tdh_handler, 0, (void *)txq, 6456 0, CTL_CREATE, CTL_EOL) != 0) 6457 break; 6458 if (sysctl_createv(log, 0, &qnode, &cnode, 6459 CTLFLAG_READONLY, CTLTYPE_INT, 6460 "txd_tail", SYSCTL_DESCR("TX descriptor tail"), 6461 wm_sysctl_tdt_handler, 0, (void *)txq, 6462 0, CTL_CREATE, CTL_EOL) != 0) 6463 break; 6464 if (sysctl_createv(log, 0, &qnode, &cnode, 6465 CTLFLAG_READONLY, CTLTYPE_INT, 6466 "txq_next", SYSCTL_DESCR("TX queue next"), 6467 NULL, 0, &txq->txq_next, 6468 0, CTL_CREATE, CTL_EOL) != 0) 6469 break; 6470 if (sysctl_createv(log, 0, &qnode, &cnode, 6471 CTLFLAG_READONLY, CTLTYPE_INT, 6472 "txq_sfree", SYSCTL_DESCR("TX queue sfree"), 6473 NULL, 0, &txq->txq_sfree, 6474 0, CTL_CREATE, CTL_EOL) != 0) 6475 break; 6476 if (sysctl_createv(log, 0, &qnode, &cnode, 6477 CTLFLAG_READONLY, CTLTYPE_INT, 6478 "txq_snext", SYSCTL_DESCR("TX queue snext"), 6479 NULL, 0, &txq->txq_snext, 6480 0, CTL_CREATE, CTL_EOL) != 0) 6481 break; 6482 if (sysctl_createv(log, 0, &qnode, &cnode, 6483 CTLFLAG_READONLY, CTLTYPE_INT, 6484 "txq_sdirty", SYSCTL_DESCR("TX queue sdirty"), 6485 NULL, 0, &txq->txq_sdirty, 6486 0, CTL_CREATE, CTL_EOL) != 0) 6487 break; 6488 if (sysctl_createv(log, 0, &qnode, &cnode, 6489 CTLFLAG_READONLY, CTLTYPE_INT, 6490 "txq_flags", SYSCTL_DESCR("TX queue flags"), 6491 NULL, 0, &txq->txq_flags, 6492 0, CTL_CREATE, CTL_EOL) != 0) 6493 break; 6494 if (sysctl_createv(log, 0, &qnode, &cnode, 6495 CTLFLAG_READONLY, CTLTYPE_BOOL, 6496 "txq_stopping", SYSCTL_DESCR("TX queue stopping"), 6497 NULL, 0, &txq->txq_stopping, 6498 0, CTL_CREATE, CTL_EOL) != 0) 6499 break; 6500 if (sysctl_createv(log, 0, &qnode, &cnode, 6501 CTLFLAG_READONLY, CTLTYPE_BOOL, 6502 "txq_sending", SYSCTL_DESCR("TX queue sending"), 6503 NULL, 0, &txq->txq_sending, 6504 0, CTL_CREATE, CTL_EOL) != 0) 6505 break; 6506 6507 if (sysctl_createv(log, 0, &qnode, &cnode, 6508 CTLFLAG_READONLY, CTLTYPE_INT, 6509 "rxq_ptr", SYSCTL_DESCR("RX queue pointer"), 6510 NULL, 0, &rxq->rxq_ptr, 6511 0, CTL_CREATE, CTL_EOL) != 0) 6512 break; 6513 } 6514 6515 #ifdef WM_DEBUG 6516 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE, 6517 CTLTYPE_INT, "debug_flags", 6518 SYSCTL_DESCR( 6519 "Debug flags:\n" \ 6520 "\t0x01 LINK\n" \ 6521 "\t0x02 TX\n" \ 6522 "\t0x04 RX\n" \ 6523 "\t0x08 GMII\n" \ 6524 "\t0x10 MANAGE\n" \ 6525 "\t0x20 NVM\n" \ 6526 "\t0x40 INIT\n" \ 6527 "\t0x80 LOCK"), 6528 wm_sysctl_debug, 0, (void *)sc, 0, CTL_CREATE, CTL_EOL); 6529 if (rv != 0) 6530 goto teardown; 6531 rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE, 6532 CTLTYPE_BOOL, "trigger_reset", 6533 SYSCTL_DESCR("Trigger an interface reset"), 6534 NULL, 0, &sc->sc_trigger_reset, 0, CTL_CREATE, CTL_EOL); 6535 if (rv != 0) 6536 goto teardown; 6537 #endif 6538 6539 return; 6540 6541 teardown: 6542 sysctl_teardown(log); 6543 err: 6544 sc->sc_sysctllog = NULL; 6545 device_printf(sc->sc_dev, "%s: sysctl_createv failed, rv = %d\n", 6546 __func__, rv); 6547 } 6548 6549 static void 6550 wm_update_stats(struct wm_softc *sc) 6551 { 6552 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6553 uint64_t crcerrs, algnerrc, symerrc, mpc, colc, sec, rlec, rxerrc, 6554 cexterr; 6555 6556 crcerrs = CSR_READ(sc, WMREG_CRCERRS); 6557 symerrc = CSR_READ(sc, WMREG_SYMERRC); 6558 mpc = CSR_READ(sc, WMREG_MPC); 6559 colc = CSR_READ(sc, WMREG_COLC); 6560 sec = CSR_READ(sc, WMREG_SEC); 6561 rlec = CSR_READ(sc, WMREG_RLEC); 6562 6563 WM_EVCNT_ADD(&sc->sc_ev_crcerrs, crcerrs); 6564 WM_EVCNT_ADD(&sc->sc_ev_symerrc, symerrc); 6565 WM_EVCNT_ADD(&sc->sc_ev_mpc, mpc); 6566 WM_EVCNT_ADD(&sc->sc_ev_colc, colc); 6567 WM_EVCNT_ADD(&sc->sc_ev_sec, sec); 6568 WM_EVCNT_ADD(&sc->sc_ev_rlec, rlec); 6569 6570 if (sc->sc_type >= WM_T_82543) { 6571 algnerrc = CSR_READ(sc, WMREG_ALGNERRC); 6572 rxerrc = CSR_READ(sc, WMREG_RXERRC); 6573 WM_EVCNT_ADD(&sc->sc_ev_algnerrc, algnerrc); 6574 WM_EVCNT_ADD(&sc->sc_ev_rxerrc, rxerrc); 6575 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) { 6576 cexterr = CSR_READ(sc, WMREG_CEXTERR); 6577 WM_EVCNT_ADD(&sc->sc_ev_cexterr, cexterr); 6578 } else { 6579 cexterr = 0; 6580 /* Excessive collision + Link down */ 6581 WM_EVCNT_ADD(&sc->sc_ev_htdpmc, 6582 CSR_READ(sc, WMREG_HTDPMC)); 6583 } 6584 6585 WM_EVCNT_ADD(&sc->sc_ev_tncrs, CSR_READ(sc, WMREG_TNCRS)); 6586 WM_EVCNT_ADD(&sc->sc_ev_tsctc, CSR_READ(sc, WMREG_TSCTC)); 6587 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 6588 WM_EVCNT_ADD(&sc->sc_ev_tsctfc, 6589 CSR_READ(sc, WMREG_TSCTFC)); 6590 else { 6591 WM_EVCNT_ADD(&sc->sc_ev_cbrmpc, 6592 CSR_READ(sc, WMREG_CBRMPC)); 6593 } 6594 } else 6595 algnerrc = rxerrc = cexterr = 0; 6596 6597 if (sc->sc_type >= WM_T_82542_2_1) { 6598 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC)); 6599 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC)); 6600 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC)); 6601 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC)); 6602 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC)); 6603 } 6604 6605 WM_EVCNT_ADD(&sc->sc_ev_scc, CSR_READ(sc, WMREG_SCC)); 6606 WM_EVCNT_ADD(&sc->sc_ev_ecol, CSR_READ(sc, WMREG_ECOL)); 6607 WM_EVCNT_ADD(&sc->sc_ev_mcc, CSR_READ(sc, WMREG_MCC)); 6608 WM_EVCNT_ADD(&sc->sc_ev_latecol, CSR_READ(sc, WMREG_LATECOL)); 6609 6610 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) { 6611 WM_EVCNT_ADD(&sc->sc_ev_cbtmpc, CSR_READ(sc, WMREG_CBTMPC)); 6612 } 6613 6614 WM_EVCNT_ADD(&sc->sc_ev_dc, CSR_READ(sc, WMREG_DC)); 6615 WM_EVCNT_ADD(&sc->sc_ev_prc64, CSR_READ(sc, WMREG_PRC64)); 6616 WM_EVCNT_ADD(&sc->sc_ev_prc127, CSR_READ(sc, WMREG_PRC127)); 6617 WM_EVCNT_ADD(&sc->sc_ev_prc255, CSR_READ(sc, WMREG_PRC255)); 6618 WM_EVCNT_ADD(&sc->sc_ev_prc511, CSR_READ(sc, WMREG_PRC511)); 6619 WM_EVCNT_ADD(&sc->sc_ev_prc1023, CSR_READ(sc, WMREG_PRC1023)); 6620 WM_EVCNT_ADD(&sc->sc_ev_prc1522, CSR_READ(sc, WMREG_PRC1522)); 6621 WM_EVCNT_ADD(&sc->sc_ev_gprc, CSR_READ(sc, WMREG_GPRC)); 6622 WM_EVCNT_ADD(&sc->sc_ev_bprc, CSR_READ(sc, WMREG_BPRC)); 6623 WM_EVCNT_ADD(&sc->sc_ev_mprc, CSR_READ(sc, WMREG_MPRC)); 6624 WM_EVCNT_ADD(&sc->sc_ev_gptc, CSR_READ(sc, WMREG_GPTC)); 6625 6626 WM_EVCNT_ADD(&sc->sc_ev_gorc, 6627 CSR_READ(sc, WMREG_GORCL) + 6628 ((uint64_t)CSR_READ(sc, WMREG_GORCH) << 32)); 6629 WM_EVCNT_ADD(&sc->sc_ev_gotc, 6630 CSR_READ(sc, WMREG_GOTCL) + 6631 ((uint64_t)CSR_READ(sc, WMREG_GOTCH) << 32)); 6632 6633 WM_EVCNT_ADD(&sc->sc_ev_rnbc, CSR_READ(sc, WMREG_RNBC)); 6634 WM_EVCNT_ADD(&sc->sc_ev_ruc, CSR_READ(sc, WMREG_RUC)); 6635 WM_EVCNT_ADD(&sc->sc_ev_rfc, CSR_READ(sc, WMREG_RFC)); 6636 WM_EVCNT_ADD(&sc->sc_ev_roc, CSR_READ(sc, WMREG_ROC)); 6637 WM_EVCNT_ADD(&sc->sc_ev_rjc, CSR_READ(sc, WMREG_RJC)); 6638 6639 if (sc->sc_type >= WM_T_82540) { 6640 WM_EVCNT_ADD(&sc->sc_ev_mgtprc, CSR_READ(sc, WMREG_MGTPRC)); 6641 WM_EVCNT_ADD(&sc->sc_ev_mgtpdc, CSR_READ(sc, WMREG_MGTPDC)); 6642 WM_EVCNT_ADD(&sc->sc_ev_mgtptc, CSR_READ(sc, WMREG_MGTPTC)); 6643 } 6644 6645 /* 6646 * The TOR(L) register includes: 6647 * - Error 6648 * - Flow control 6649 * - Broadcast rejected (This note is described in 82574 and newer 6650 * datasheets. What does "broadcast rejected" mean?) 6651 */ 6652 WM_EVCNT_ADD(&sc->sc_ev_tor, 6653 CSR_READ(sc, WMREG_TORL) + 6654 ((uint64_t)CSR_READ(sc, WMREG_TORH) << 32)); 6655 WM_EVCNT_ADD(&sc->sc_ev_tot, 6656 CSR_READ(sc, WMREG_TOTL) + 6657 ((uint64_t)CSR_READ(sc, WMREG_TOTH) << 32)); 6658 6659 WM_EVCNT_ADD(&sc->sc_ev_tpr, CSR_READ(sc, WMREG_TPR)); 6660 WM_EVCNT_ADD(&sc->sc_ev_tpt, CSR_READ(sc, WMREG_TPT)); 6661 WM_EVCNT_ADD(&sc->sc_ev_ptc64, CSR_READ(sc, WMREG_PTC64)); 6662 WM_EVCNT_ADD(&sc->sc_ev_ptc127, CSR_READ(sc, WMREG_PTC127)); 6663 WM_EVCNT_ADD(&sc->sc_ev_ptc255, CSR_READ(sc, WMREG_PTC255)); 6664 WM_EVCNT_ADD(&sc->sc_ev_ptc511, CSR_READ(sc, WMREG_PTC511)); 6665 WM_EVCNT_ADD(&sc->sc_ev_ptc1023, CSR_READ(sc, WMREG_PTC1023)); 6666 WM_EVCNT_ADD(&sc->sc_ev_ptc1522, CSR_READ(sc, WMREG_PTC1522)); 6667 WM_EVCNT_ADD(&sc->sc_ev_mptc, CSR_READ(sc, WMREG_MPTC)); 6668 WM_EVCNT_ADD(&sc->sc_ev_bptc, CSR_READ(sc, WMREG_BPTC)); 6669 WM_EVCNT_ADD(&sc->sc_ev_iac, CSR_READ(sc, WMREG_IAC)); 6670 if (sc->sc_type < WM_T_82575) { 6671 WM_EVCNT_ADD(&sc->sc_ev_icrxptc, CSR_READ(sc, WMREG_ICRXPTC)); 6672 WM_EVCNT_ADD(&sc->sc_ev_icrxatc, CSR_READ(sc, WMREG_ICRXATC)); 6673 WM_EVCNT_ADD(&sc->sc_ev_ictxptc, CSR_READ(sc, WMREG_ICTXPTC)); 6674 WM_EVCNT_ADD(&sc->sc_ev_ictxatc, CSR_READ(sc, WMREG_ICTXATC)); 6675 WM_EVCNT_ADD(&sc->sc_ev_ictxqec, CSR_READ(sc, WMREG_ICTXQEC)); 6676 WM_EVCNT_ADD(&sc->sc_ev_ictxqmtc, 6677 CSR_READ(sc, WMREG_ICTXQMTC)); 6678 WM_EVCNT_ADD(&sc->sc_ev_rxdmtc, 6679 CSR_READ(sc, WMREG_ICRXDMTC)); 6680 WM_EVCNT_ADD(&sc->sc_ev_icrxoc, CSR_READ(sc, WMREG_ICRXOC)); 6681 } else if (!WM_IS_ICHPCH(sc)) { 6682 WM_EVCNT_ADD(&sc->sc_ev_rpthc, CSR_READ(sc, WMREG_RPTHC)); 6683 WM_EVCNT_ADD(&sc->sc_ev_debug1, CSR_READ(sc, WMREG_DEBUG1)); 6684 WM_EVCNT_ADD(&sc->sc_ev_debug2, CSR_READ(sc, WMREG_DEBUG2)); 6685 WM_EVCNT_ADD(&sc->sc_ev_debug3, CSR_READ(sc, WMREG_DEBUG3)); 6686 WM_EVCNT_ADD(&sc->sc_ev_hgptc, CSR_READ(sc, WMREG_HGPTC)); 6687 WM_EVCNT_ADD(&sc->sc_ev_debug4, CSR_READ(sc, WMREG_DEBUG4)); 6688 WM_EVCNT_ADD(&sc->sc_ev_rxdmtc, CSR_READ(sc, WMREG_RXDMTC)); 6689 WM_EVCNT_ADD(&sc->sc_ev_htcbdpc, CSR_READ(sc, WMREG_HTCBDPC)); 6690 6691 WM_EVCNT_ADD(&sc->sc_ev_hgorc, 6692 CSR_READ(sc, WMREG_HGORCL) + 6693 ((uint64_t)CSR_READ(sc, WMREG_HGORCH) << 32)); 6694 WM_EVCNT_ADD(&sc->sc_ev_hgotc, 6695 CSR_READ(sc, WMREG_HGOTCL) + 6696 ((uint64_t)CSR_READ(sc, WMREG_HGOTCH) << 32)); 6697 WM_EVCNT_ADD(&sc->sc_ev_lenerrs, CSR_READ(sc, WMREG_LENERRS)); 6698 } 6699 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) { 6700 WM_EVCNT_ADD(&sc->sc_ev_tlpic, CSR_READ(sc, WMREG_TLPIC)); 6701 WM_EVCNT_ADD(&sc->sc_ev_rlpic, CSR_READ(sc, WMREG_RLPIC)); 6702 if ((CSR_READ(sc, WMREG_MANC) & MANC_EN_BMC2OS) != 0) { 6703 WM_EVCNT_ADD(&sc->sc_ev_b2ogprc, 6704 CSR_READ(sc, WMREG_B2OGPRC)); 6705 WM_EVCNT_ADD(&sc->sc_ev_o2bspc, 6706 CSR_READ(sc, WMREG_O2BSPC)); 6707 WM_EVCNT_ADD(&sc->sc_ev_b2ospc, 6708 CSR_READ(sc, WMREG_B2OSPC)); 6709 WM_EVCNT_ADD(&sc->sc_ev_o2bgptc, 6710 CSR_READ(sc, WMREG_O2BGPTC)); 6711 } 6712 WM_EVCNT_ADD(&sc->sc_ev_scvpc, CSR_READ(sc, WMREG_SCVPC)); 6713 WM_EVCNT_ADD(&sc->sc_ev_hrmpc, CSR_READ(sc, WMREG_HRMPC)); 6714 } 6715 net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 6716 if_statadd_ref(nsr, if_collisions, colc); 6717 if_statadd_ref(nsr, if_ierrors, 6718 crcerrs + algnerrc + symerrc + rxerrc + sec + cexterr + rlec); 6719 /* 6720 * WMREG_RNBC is incremented when there are no available buffers in 6721 * host memory. It does not mean the number of dropped packets, because 6722 * an Ethernet controller can receive packets in such case if there is 6723 * space in the phy's FIFO. 6724 * 6725 * If you want to know the nubmer of WMREG_RMBC, you should use such as 6726 * own EVCNT instead of if_iqdrops. 6727 */ 6728 if_statadd_ref(nsr, if_iqdrops, mpc); 6729 IF_STAT_PUTREF(ifp); 6730 } 6731 6732 void 6733 wm_clear_evcnt(struct wm_softc *sc) 6734 { 6735 #ifdef WM_EVENT_COUNTERS 6736 int i; 6737 6738 /* RX queues */ 6739 for (i = 0; i < sc->sc_nqueues; i++) { 6740 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 6741 6742 WM_Q_EVCNT_STORE(rxq, intr, 0); 6743 WM_Q_EVCNT_STORE(rxq, defer, 0); 6744 WM_Q_EVCNT_STORE(rxq, ipsum, 0); 6745 WM_Q_EVCNT_STORE(rxq, tusum, 0); 6746 } 6747 6748 /* TX queues */ 6749 for (i = 0; i < sc->sc_nqueues; i++) { 6750 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 6751 int j; 6752 6753 WM_Q_EVCNT_STORE(txq, txsstall, 0); 6754 WM_Q_EVCNT_STORE(txq, txdstall, 0); 6755 WM_Q_EVCNT_STORE(txq, fifo_stall, 0); 6756 WM_Q_EVCNT_STORE(txq, txdw, 0); 6757 WM_Q_EVCNT_STORE(txq, txqe, 0); 6758 WM_Q_EVCNT_STORE(txq, ipsum, 0); 6759 WM_Q_EVCNT_STORE(txq, tusum, 0); 6760 WM_Q_EVCNT_STORE(txq, tusum6, 0); 6761 WM_Q_EVCNT_STORE(txq, tso, 0); 6762 WM_Q_EVCNT_STORE(txq, tso6, 0); 6763 WM_Q_EVCNT_STORE(txq, tsopain, 0); 6764 6765 for (j = 0; j < WM_NTXSEGS; j++) 6766 WM_EVCNT_STORE(&txq->txq_ev_txseg[j], 0); 6767 6768 WM_Q_EVCNT_STORE(txq, pcqdrop, 0); 6769 WM_Q_EVCNT_STORE(txq, descdrop, 0); 6770 WM_Q_EVCNT_STORE(txq, toomanyseg, 0); 6771 WM_Q_EVCNT_STORE(txq, defrag, 0); 6772 if (sc->sc_type <= WM_T_82544) 6773 WM_Q_EVCNT_STORE(txq, underrun, 0); 6774 WM_Q_EVCNT_STORE(txq, skipcontext, 0); 6775 } 6776 6777 /* Miscs */ 6778 WM_EVCNT_STORE(&sc->sc_ev_linkintr, 0); 6779 6780 WM_EVCNT_STORE(&sc->sc_ev_crcerrs, 0); 6781 WM_EVCNT_STORE(&sc->sc_ev_symerrc, 0); 6782 WM_EVCNT_STORE(&sc->sc_ev_mpc, 0); 6783 WM_EVCNT_STORE(&sc->sc_ev_colc, 0); 6784 WM_EVCNT_STORE(&sc->sc_ev_sec, 0); 6785 WM_EVCNT_STORE(&sc->sc_ev_rlec, 0); 6786 6787 if (sc->sc_type >= WM_T_82543) { 6788 WM_EVCNT_STORE(&sc->sc_ev_algnerrc, 0); 6789 WM_EVCNT_STORE(&sc->sc_ev_rxerrc, 0); 6790 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 6791 WM_EVCNT_STORE(&sc->sc_ev_cexterr, 0); 6792 else 6793 WM_EVCNT_STORE(&sc->sc_ev_htdpmc, 0); 6794 6795 WM_EVCNT_STORE(&sc->sc_ev_tncrs, 0); 6796 WM_EVCNT_STORE(&sc->sc_ev_tsctc, 0); 6797 if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) 6798 WM_EVCNT_STORE(&sc->sc_ev_tsctfc, 0); 6799 else { 6800 WM_EVCNT_STORE(&sc->sc_ev_cbrdpc, 0); 6801 WM_EVCNT_STORE(&sc->sc_ev_cbrmpc, 0); 6802 } 6803 } 6804 6805 if (sc->sc_type >= WM_T_82542_2_1) { 6806 WM_EVCNT_STORE(&sc->sc_ev_tx_xoff, 0); 6807 WM_EVCNT_STORE(&sc->sc_ev_tx_xon, 0); 6808 WM_EVCNT_STORE(&sc->sc_ev_rx_xoff, 0); 6809 WM_EVCNT_STORE(&sc->sc_ev_rx_xon, 0); 6810 WM_EVCNT_STORE(&sc->sc_ev_rx_macctl, 0); 6811 } 6812 6813 WM_EVCNT_STORE(&sc->sc_ev_scc, 0); 6814 WM_EVCNT_STORE(&sc->sc_ev_ecol, 0); 6815 WM_EVCNT_STORE(&sc->sc_ev_mcc, 0); 6816 WM_EVCNT_STORE(&sc->sc_ev_latecol, 0); 6817 6818 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) 6819 WM_EVCNT_STORE(&sc->sc_ev_cbtmpc, 0); 6820 6821 WM_EVCNT_STORE(&sc->sc_ev_dc, 0); 6822 WM_EVCNT_STORE(&sc->sc_ev_prc64, 0); 6823 WM_EVCNT_STORE(&sc->sc_ev_prc127, 0); 6824 WM_EVCNT_STORE(&sc->sc_ev_prc255, 0); 6825 WM_EVCNT_STORE(&sc->sc_ev_prc511, 0); 6826 WM_EVCNT_STORE(&sc->sc_ev_prc1023, 0); 6827 WM_EVCNT_STORE(&sc->sc_ev_prc1522, 0); 6828 WM_EVCNT_STORE(&sc->sc_ev_gprc, 0); 6829 WM_EVCNT_STORE(&sc->sc_ev_bprc, 0); 6830 WM_EVCNT_STORE(&sc->sc_ev_mprc, 0); 6831 WM_EVCNT_STORE(&sc->sc_ev_gptc, 0); 6832 WM_EVCNT_STORE(&sc->sc_ev_gorc, 0); 6833 WM_EVCNT_STORE(&sc->sc_ev_gotc, 0); 6834 WM_EVCNT_STORE(&sc->sc_ev_rnbc, 0); 6835 WM_EVCNT_STORE(&sc->sc_ev_ruc, 0); 6836 WM_EVCNT_STORE(&sc->sc_ev_rfc, 0); 6837 WM_EVCNT_STORE(&sc->sc_ev_roc, 0); 6838 WM_EVCNT_STORE(&sc->sc_ev_rjc, 0); 6839 if (sc->sc_type >= WM_T_82540) { 6840 WM_EVCNT_STORE(&sc->sc_ev_mgtprc, 0); 6841 WM_EVCNT_STORE(&sc->sc_ev_mgtpdc, 0); 6842 WM_EVCNT_STORE(&sc->sc_ev_mgtptc, 0); 6843 } 6844 WM_EVCNT_STORE(&sc->sc_ev_tor, 0); 6845 WM_EVCNT_STORE(&sc->sc_ev_tot, 0); 6846 WM_EVCNT_STORE(&sc->sc_ev_tpr, 0); 6847 WM_EVCNT_STORE(&sc->sc_ev_tpt, 0); 6848 WM_EVCNT_STORE(&sc->sc_ev_ptc64, 0); 6849 WM_EVCNT_STORE(&sc->sc_ev_ptc127, 0); 6850 WM_EVCNT_STORE(&sc->sc_ev_ptc255, 0); 6851 WM_EVCNT_STORE(&sc->sc_ev_ptc511, 0); 6852 WM_EVCNT_STORE(&sc->sc_ev_ptc1023, 0); 6853 WM_EVCNT_STORE(&sc->sc_ev_ptc1522, 0); 6854 WM_EVCNT_STORE(&sc->sc_ev_mptc, 0); 6855 WM_EVCNT_STORE(&sc->sc_ev_bptc, 0); 6856 WM_EVCNT_STORE(&sc->sc_ev_iac, 0); 6857 if (sc->sc_type < WM_T_82575) { 6858 WM_EVCNT_STORE(&sc->sc_ev_icrxptc, 0); 6859 WM_EVCNT_STORE(&sc->sc_ev_icrxatc, 0); 6860 WM_EVCNT_STORE(&sc->sc_ev_ictxptc, 0); 6861 WM_EVCNT_STORE(&sc->sc_ev_ictxatc, 0); 6862 WM_EVCNT_STORE(&sc->sc_ev_ictxqec, 0); 6863 WM_EVCNT_STORE(&sc->sc_ev_ictxqmtc, 0); 6864 WM_EVCNT_STORE(&sc->sc_ev_rxdmtc, 0); 6865 WM_EVCNT_STORE(&sc->sc_ev_icrxoc, 0); 6866 } else if (!WM_IS_ICHPCH(sc)) { 6867 WM_EVCNT_STORE(&sc->sc_ev_rpthc, 0); 6868 WM_EVCNT_STORE(&sc->sc_ev_debug1, 0); 6869 WM_EVCNT_STORE(&sc->sc_ev_debug2, 0); 6870 WM_EVCNT_STORE(&sc->sc_ev_debug3, 0); 6871 WM_EVCNT_STORE(&sc->sc_ev_hgptc, 0); 6872 WM_EVCNT_STORE(&sc->sc_ev_debug4, 0); 6873 WM_EVCNT_STORE(&sc->sc_ev_rxdmtc, 0); 6874 WM_EVCNT_STORE(&sc->sc_ev_htcbdpc, 0); 6875 6876 WM_EVCNT_STORE(&sc->sc_ev_hgorc, 0); 6877 WM_EVCNT_STORE(&sc->sc_ev_hgotc, 0); 6878 WM_EVCNT_STORE(&sc->sc_ev_lenerrs, 0); 6879 } 6880 if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) { 6881 WM_EVCNT_STORE(&sc->sc_ev_tlpic, 0); 6882 WM_EVCNT_STORE(&sc->sc_ev_rlpic, 0); 6883 WM_EVCNT_STORE(&sc->sc_ev_b2ogprc, 0); 6884 WM_EVCNT_STORE(&sc->sc_ev_o2bspc, 0); 6885 WM_EVCNT_STORE(&sc->sc_ev_b2ospc, 0); 6886 WM_EVCNT_STORE(&sc->sc_ev_o2bgptc, 0); 6887 WM_EVCNT_STORE(&sc->sc_ev_scvpc, 0); 6888 WM_EVCNT_STORE(&sc->sc_ev_hrmpc, 0); 6889 } 6890 #endif 6891 } 6892 6893 /* 6894 * wm_init: [ifnet interface function] 6895 * 6896 * Initialize the interface. 6897 */ 6898 static int 6899 wm_init(struct ifnet *ifp) 6900 { 6901 struct wm_softc *sc = ifp->if_softc; 6902 int ret; 6903 6904 KASSERT(IFNET_LOCKED(ifp)); 6905 6906 if (sc->sc_dying) 6907 return ENXIO; 6908 6909 mutex_enter(sc->sc_core_lock); 6910 ret = wm_init_locked(ifp); 6911 mutex_exit(sc->sc_core_lock); 6912 6913 return ret; 6914 } 6915 6916 static int 6917 wm_init_locked(struct ifnet *ifp) 6918 { 6919 struct wm_softc *sc = ifp->if_softc; 6920 struct ethercom *ec = &sc->sc_ethercom; 6921 int i, j, trynum, error = 0; 6922 uint32_t reg, sfp_mask = 0; 6923 6924 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 6925 device_xname(sc->sc_dev), __func__)); 6926 KASSERT(IFNET_LOCKED(ifp)); 6927 KASSERT(mutex_owned(sc->sc_core_lock)); 6928 6929 /* 6930 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set. 6931 * There is a small but measurable benefit to avoiding the adjusment 6932 * of the descriptor so that the headers are aligned, for normal mtu, 6933 * on such platforms. One possibility is that the DMA itself is 6934 * slightly more efficient if the front of the entire packet (instead 6935 * of the front of the headers) is aligned. 6936 * 6937 * Note we must always set align_tweak to 0 if we are using 6938 * jumbo frames. 6939 */ 6940 #ifdef __NO_STRICT_ALIGNMENT 6941 sc->sc_align_tweak = 0; 6942 #else 6943 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2)) 6944 sc->sc_align_tweak = 0; 6945 else 6946 sc->sc_align_tweak = 2; 6947 #endif /* __NO_STRICT_ALIGNMENT */ 6948 6949 /* Cancel any pending I/O. */ 6950 wm_stop_locked(ifp, false, false); 6951 6952 /* Update statistics before reset */ 6953 if_statadd2(ifp, if_collisions, CSR_READ(sc, WMREG_COLC), 6954 if_ierrors, CSR_READ(sc, WMREG_RXERRC)); 6955 6956 /* >= PCH_SPT hardware workaround before reset. */ 6957 if (sc->sc_type >= WM_T_PCH_SPT) 6958 wm_flush_desc_rings(sc); 6959 6960 /* Reset the chip to a known state. */ 6961 wm_reset(sc); 6962 6963 /* 6964 * AMT based hardware can now take control from firmware 6965 * Do this after reset. 6966 */ 6967 if ((sc->sc_flags & WM_F_HAS_AMT) != 0) 6968 wm_get_hw_control(sc); 6969 6970 if ((sc->sc_type >= WM_T_PCH_SPT) && 6971 pci_intr_type(sc->sc_pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_INTX) 6972 wm_legacy_irq_quirk_spt(sc); 6973 6974 /* Init hardware bits */ 6975 wm_initialize_hardware_bits(sc); 6976 6977 /* Reset the PHY. */ 6978 if (sc->sc_flags & WM_F_HAS_MII) 6979 wm_gmii_reset(sc); 6980 6981 if (sc->sc_type >= WM_T_ICH8) { 6982 reg = CSR_READ(sc, WMREG_GCR); 6983 /* 6984 * ICH8 No-snoop bits are opposite polarity. Set to snoop by 6985 * default after reset. 6986 */ 6987 if (sc->sc_type == WM_T_ICH8) 6988 reg |= GCR_NO_SNOOP_ALL; 6989 else 6990 reg &= ~GCR_NO_SNOOP_ALL; 6991 CSR_WRITE(sc, WMREG_GCR, reg); 6992 } 6993 6994 if ((sc->sc_type >= WM_T_ICH8) 6995 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER) 6996 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3)) { 6997 6998 reg = CSR_READ(sc, WMREG_CTRL_EXT); 6999 reg |= CTRL_EXT_RO_DIS; 7000 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 7001 } 7002 7003 /* Calculate (E)ITR value */ 7004 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0 && sc->sc_type != WM_T_82575) { 7005 /* 7006 * For NEWQUEUE's EITR (except for 82575). 7007 * 82575's EITR should be set same throttling value as other 7008 * old controllers' ITR because the interrupt/sec calculation 7009 * is the same, that is, 1,000,000,000 / (N * 256). 7010 * 7011 * 82574's EITR should be set same throttling value as ITR. 7012 * 7013 * For N interrupts/sec, set this value to: 7014 * 1,000,000 / N in contrast to ITR throttling value. 7015 */ 7016 sc->sc_itr_init = 450; 7017 } else if (sc->sc_type >= WM_T_82543) { 7018 /* 7019 * Set up the interrupt throttling register (units of 256ns) 7020 * Note that a footnote in Intel's documentation says this 7021 * ticker runs at 1/4 the rate when the chip is in 100Mbit 7022 * or 10Mbit mode. Empirically, it appears to be the case 7023 * that that is also true for the 1024ns units of the other 7024 * interrupt-related timer registers -- so, really, we ought 7025 * to divide this value by 4 when the link speed is low. 7026 * 7027 * XXX implement this division at link speed change! 7028 */ 7029 7030 /* 7031 * For N interrupts/sec, set this value to: 7032 * 1,000,000,000 / (N * 256). Note that we set the 7033 * absolute and packet timer values to this value 7034 * divided by 4 to get "simple timer" behavior. 7035 */ 7036 sc->sc_itr_init = 1500; /* 2604 ints/sec */ 7037 } 7038 7039 error = wm_init_txrx_queues(sc); 7040 if (error) 7041 goto out; 7042 7043 if (((sc->sc_flags & WM_F_SGMII) == 0) && 7044 (sc->sc_mediatype == WM_MEDIATYPE_SERDES) && 7045 (sc->sc_type >= WM_T_82575)) 7046 wm_serdes_power_up_link_82575(sc); 7047 7048 /* Clear out the VLAN table -- we don't use it (yet). */ 7049 CSR_WRITE(sc, WMREG_VET, 0); 7050 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 7051 trynum = 10; /* Due to hw errata */ 7052 else 7053 trynum = 1; 7054 for (i = 0; i < WM_VLAN_TABSIZE; i++) 7055 for (j = 0; j < trynum; j++) 7056 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0); 7057 7058 /* 7059 * Set up flow-control parameters. 7060 * 7061 * XXX Values could probably stand some tuning. 7062 */ 7063 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9) 7064 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH) 7065 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT) 7066 && (sc->sc_type != WM_T_PCH_SPT) && (sc->sc_type != WM_T_PCH_CNP)){ 7067 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST); 7068 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST); 7069 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL); 7070 } 7071 7072 sc->sc_fcrtl = FCRTL_DFLT; 7073 if (sc->sc_type < WM_T_82543) { 7074 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT); 7075 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl); 7076 } else { 7077 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT); 7078 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl); 7079 } 7080 7081 if (sc->sc_type == WM_T_80003) 7082 CSR_WRITE(sc, WMREG_FCTTV, 0xffff); 7083 else 7084 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT); 7085 7086 /* Writes the control register. */ 7087 wm_set_vlan(sc); 7088 7089 if (sc->sc_flags & WM_F_HAS_MII) { 7090 uint16_t kmreg; 7091 7092 switch (sc->sc_type) { 7093 case WM_T_80003: 7094 case WM_T_ICH8: 7095 case WM_T_ICH9: 7096 case WM_T_ICH10: 7097 case WM_T_PCH: 7098 case WM_T_PCH2: 7099 case WM_T_PCH_LPT: 7100 case WM_T_PCH_SPT: 7101 case WM_T_PCH_CNP: 7102 /* 7103 * Set the mac to wait the maximum time between each 7104 * iteration and increase the max iterations when 7105 * polling the phy; this fixes erroneous timeouts at 7106 * 10Mbps. 7107 */ 7108 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS, 7109 0xFFFF); 7110 wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM, 7111 &kmreg); 7112 kmreg |= 0x3F; 7113 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM, 7114 kmreg); 7115 break; 7116 default: 7117 break; 7118 } 7119 7120 if (sc->sc_type == WM_T_80003) { 7121 reg = CSR_READ(sc, WMREG_CTRL_EXT); 7122 reg &= ~CTRL_EXT_LINK_MODE_MASK; 7123 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 7124 7125 /* Bypass RX and TX FIFOs */ 7126 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL, 7127 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 7128 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS); 7129 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL, 7130 KUMCTRLSTA_INB_CTRL_DIS_PADDING | 7131 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT); 7132 } 7133 } 7134 #if 0 7135 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext); 7136 #endif 7137 7138 /* Set up checksum offload parameters. */ 7139 reg = CSR_READ(sc, WMREG_RXCSUM); 7140 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL); 7141 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx) 7142 reg |= RXCSUM_IPOFL; 7143 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx)) 7144 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL; 7145 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx)) 7146 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL; 7147 CSR_WRITE(sc, WMREG_RXCSUM, reg); 7148 7149 /* Set registers about MSI-X */ 7150 if (wm_is_using_msix(sc)) { 7151 uint32_t ivar, qintr_idx; 7152 struct wm_queue *wmq; 7153 unsigned int qid; 7154 7155 if (sc->sc_type == WM_T_82575) { 7156 /* Interrupt control */ 7157 reg = CSR_READ(sc, WMREG_CTRL_EXT); 7158 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR; 7159 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 7160 7161 /* TX and RX */ 7162 for (i = 0; i < sc->sc_nqueues; i++) { 7163 wmq = &sc->sc_queue[i]; 7164 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx), 7165 EITR_TX_QUEUE(wmq->wmq_id) 7166 | EITR_RX_QUEUE(wmq->wmq_id)); 7167 } 7168 /* Link status */ 7169 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx), 7170 EITR_OTHER); 7171 } else if (sc->sc_type == WM_T_82574) { 7172 /* Interrupt control */ 7173 reg = CSR_READ(sc, WMREG_CTRL_EXT); 7174 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME; 7175 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 7176 7177 /* 7178 * Work around issue with spurious interrupts 7179 * in MSI-X mode. 7180 * At wm_initialize_hardware_bits(), sc_nintrs has not 7181 * initialized yet. So re-initialize WMREG_RFCTL here. 7182 */ 7183 reg = CSR_READ(sc, WMREG_RFCTL); 7184 reg |= WMREG_RFCTL_ACKDIS; 7185 CSR_WRITE(sc, WMREG_RFCTL, reg); 7186 7187 ivar = 0; 7188 /* TX and RX */ 7189 for (i = 0; i < sc->sc_nqueues; i++) { 7190 wmq = &sc->sc_queue[i]; 7191 qid = wmq->wmq_id; 7192 qintr_idx = wmq->wmq_intr_idx; 7193 7194 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx), 7195 IVAR_TX_MASK_Q_82574(qid)); 7196 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx), 7197 IVAR_RX_MASK_Q_82574(qid)); 7198 } 7199 /* Link status */ 7200 ivar |= __SHIFTIN((IVAR_VALID_82574 7201 | sc->sc_link_intr_idx), IVAR_OTHER_MASK); 7202 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB); 7203 } else { 7204 /* Interrupt control */ 7205 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX 7206 | GPIE_EIAME | GPIE_PBA); 7207 7208 switch (sc->sc_type) { 7209 case WM_T_82580: 7210 case WM_T_I350: 7211 case WM_T_I354: 7212 case WM_T_I210: 7213 case WM_T_I211: 7214 /* TX and RX */ 7215 for (i = 0; i < sc->sc_nqueues; i++) { 7216 wmq = &sc->sc_queue[i]; 7217 qid = wmq->wmq_id; 7218 qintr_idx = wmq->wmq_intr_idx; 7219 7220 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid)); 7221 ivar &= ~IVAR_TX_MASK_Q(qid); 7222 ivar |= __SHIFTIN((qintr_idx 7223 | IVAR_VALID), 7224 IVAR_TX_MASK_Q(qid)); 7225 ivar &= ~IVAR_RX_MASK_Q(qid); 7226 ivar |= __SHIFTIN((qintr_idx 7227 | IVAR_VALID), 7228 IVAR_RX_MASK_Q(qid)); 7229 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar); 7230 } 7231 break; 7232 case WM_T_82576: 7233 /* TX and RX */ 7234 for (i = 0; i < sc->sc_nqueues; i++) { 7235 wmq = &sc->sc_queue[i]; 7236 qid = wmq->wmq_id; 7237 qintr_idx = wmq->wmq_intr_idx; 7238 7239 ivar = CSR_READ(sc, 7240 WMREG_IVAR_Q_82576(qid)); 7241 ivar &= ~IVAR_TX_MASK_Q_82576(qid); 7242 ivar |= __SHIFTIN((qintr_idx 7243 | IVAR_VALID), 7244 IVAR_TX_MASK_Q_82576(qid)); 7245 ivar &= ~IVAR_RX_MASK_Q_82576(qid); 7246 ivar |= __SHIFTIN((qintr_idx 7247 | IVAR_VALID), 7248 IVAR_RX_MASK_Q_82576(qid)); 7249 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid), 7250 ivar); 7251 } 7252 break; 7253 default: 7254 break; 7255 } 7256 7257 /* Link status */ 7258 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID), 7259 IVAR_MISC_OTHER); 7260 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar); 7261 } 7262 7263 if (wm_is_using_multiqueue(sc)) { 7264 wm_init_rss(sc); 7265 7266 /* 7267 ** NOTE: Receive Full-Packet Checksum Offload 7268 ** is mutually exclusive with Multiqueue. However 7269 ** this is not the same as TCP/IP checksums which 7270 ** still work. 7271 */ 7272 reg = CSR_READ(sc, WMREG_RXCSUM); 7273 reg |= RXCSUM_PCSD; 7274 CSR_WRITE(sc, WMREG_RXCSUM, reg); 7275 } 7276 } 7277 7278 /* Set up the interrupt registers. */ 7279 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 7280 7281 /* Enable SFP module insertion interrupt if it's required */ 7282 if ((sc->sc_flags & WM_F_SFP) != 0) { 7283 sc->sc_ctrl |= CTRL_EXTLINK_EN; 7284 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7285 sfp_mask = ICR_GPI(0); 7286 } 7287 7288 if (wm_is_using_msix(sc)) { 7289 uint32_t mask; 7290 struct wm_queue *wmq; 7291 7292 switch (sc->sc_type) { 7293 case WM_T_82574: 7294 mask = 0; 7295 for (i = 0; i < sc->sc_nqueues; i++) { 7296 wmq = &sc->sc_queue[i]; 7297 mask |= ICR_TXQ(wmq->wmq_id); 7298 mask |= ICR_RXQ(wmq->wmq_id); 7299 } 7300 mask |= ICR_OTHER; 7301 CSR_WRITE(sc, WMREG_EIAC_82574, mask); 7302 CSR_WRITE(sc, WMREG_IMS, mask | ICR_LSC); 7303 break; 7304 default: 7305 if (sc->sc_type == WM_T_82575) { 7306 mask = 0; 7307 for (i = 0; i < sc->sc_nqueues; i++) { 7308 wmq = &sc->sc_queue[i]; 7309 mask |= EITR_TX_QUEUE(wmq->wmq_id); 7310 mask |= EITR_RX_QUEUE(wmq->wmq_id); 7311 } 7312 mask |= EITR_OTHER; 7313 } else { 7314 mask = 0; 7315 for (i = 0; i < sc->sc_nqueues; i++) { 7316 wmq = &sc->sc_queue[i]; 7317 mask |= 1 << wmq->wmq_intr_idx; 7318 } 7319 mask |= 1 << sc->sc_link_intr_idx; 7320 } 7321 CSR_WRITE(sc, WMREG_EIAC, mask); 7322 CSR_WRITE(sc, WMREG_EIAM, mask); 7323 CSR_WRITE(sc, WMREG_EIMS, mask); 7324 7325 /* For other interrupts */ 7326 CSR_WRITE(sc, WMREG_IMS, ICR_LSC | sfp_mask); 7327 break; 7328 } 7329 } else { 7330 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 | 7331 ICR_RXO | ICR_RXT0 | sfp_mask; 7332 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr); 7333 } 7334 7335 /* Set up the inter-packet gap. */ 7336 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg); 7337 7338 if (sc->sc_type >= WM_T_82543) { 7339 for (int qidx = 0; qidx < sc->sc_nqueues; qidx++) { 7340 struct wm_queue *wmq = &sc->sc_queue[qidx]; 7341 wm_itrs_writereg(sc, wmq); 7342 } 7343 /* 7344 * Link interrupts occur much less than TX 7345 * interrupts and RX interrupts. So, we don't 7346 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like 7347 * FreeBSD's if_igb. 7348 */ 7349 } 7350 7351 /* Set the VLAN EtherType. */ 7352 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN); 7353 7354 /* 7355 * Set up the transmit control register; we start out with 7356 * a collision distance suitable for FDX, but update it when 7357 * we resolve the media type. 7358 */ 7359 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC 7360 | TCTL_CT(TX_COLLISION_THRESHOLD) 7361 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 7362 if (sc->sc_type >= WM_T_82571) 7363 sc->sc_tctl |= TCTL_MULR; 7364 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 7365 7366 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 7367 /* Write TDT after TCTL.EN is set. See the document. */ 7368 CSR_WRITE(sc, WMREG_TDT(0), 0); 7369 } 7370 7371 if (sc->sc_type == WM_T_80003) { 7372 reg = CSR_READ(sc, WMREG_TCTL_EXT); 7373 reg &= ~TCTL_EXT_GCEX_MASK; 7374 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; 7375 CSR_WRITE(sc, WMREG_TCTL_EXT, reg); 7376 } 7377 7378 /* Set the media. */ 7379 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0) 7380 goto out; 7381 7382 /* Configure for OS presence */ 7383 wm_init_manageability(sc); 7384 7385 /* 7386 * Set up the receive control register; we actually program the 7387 * register when we set the receive filter. Use multicast address 7388 * offset type 0. 7389 * 7390 * Only the i82544 has the ability to strip the incoming CRC, so we 7391 * don't enable that feature. 7392 */ 7393 sc->sc_mchash_type = 0; 7394 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF 7395 | __SHIFTIN(sc->sc_mchash_type, RCTL_MO); 7396 7397 /* 82574 use one buffer extended Rx descriptor. */ 7398 if (sc->sc_type == WM_T_82574) 7399 sc->sc_rctl |= RCTL_DTYP_ONEBUF; 7400 7401 if ((sc->sc_flags & WM_F_CRC_STRIP) != 0) 7402 sc->sc_rctl |= RCTL_SECRC; 7403 7404 if (((ec->ec_capabilities & ETHERCAP_JUMBO_MTU) != 0) 7405 && (ifp->if_mtu > ETHERMTU)) { 7406 sc->sc_rctl |= RCTL_LPE; 7407 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 7408 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO); 7409 } 7410 7411 if (MCLBYTES == 2048) 7412 sc->sc_rctl |= RCTL_2k; 7413 else { 7414 if (sc->sc_type >= WM_T_82543) { 7415 switch (MCLBYTES) { 7416 case 4096: 7417 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k; 7418 break; 7419 case 8192: 7420 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k; 7421 break; 7422 case 16384: 7423 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k; 7424 break; 7425 default: 7426 panic("wm_init: MCLBYTES %d unsupported", 7427 MCLBYTES); 7428 break; 7429 } 7430 } else 7431 panic("wm_init: i82542 requires MCLBYTES = 2048"); 7432 } 7433 7434 /* Enable ECC */ 7435 switch (sc->sc_type) { 7436 case WM_T_82571: 7437 reg = CSR_READ(sc, WMREG_PBA_ECC); 7438 reg |= PBA_ECC_CORR_EN; 7439 CSR_WRITE(sc, WMREG_PBA_ECC, reg); 7440 break; 7441 case WM_T_PCH_LPT: 7442 case WM_T_PCH_SPT: 7443 case WM_T_PCH_CNP: 7444 reg = CSR_READ(sc, WMREG_PBECCSTS); 7445 reg |= PBECCSTS_UNCORR_ECC_ENABLE; 7446 CSR_WRITE(sc, WMREG_PBECCSTS, reg); 7447 7448 sc->sc_ctrl |= CTRL_MEHE; 7449 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7450 break; 7451 default: 7452 break; 7453 } 7454 7455 /* 7456 * Set the receive filter. 7457 * 7458 * For 82575 and 82576, the RX descriptors must be initialized after 7459 * the setting of RCTL.EN in wm_set_filter() 7460 */ 7461 wm_set_filter(sc); 7462 7463 /* On 575 and later set RDT only if RX enabled */ 7464 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 7465 int qidx; 7466 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { 7467 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq; 7468 for (i = 0; i < WM_NRXDESC; i++) { 7469 mutex_enter(rxq->rxq_lock); 7470 wm_init_rxdesc(rxq, i); 7471 mutex_exit(rxq->rxq_lock); 7472 7473 } 7474 } 7475 } 7476 7477 wm_unset_stopping_flags(sc); 7478 7479 /* Start the one second link check clock. */ 7480 callout_schedule(&sc->sc_tick_ch, hz); 7481 7482 /* 7483 * ...all done! (IFNET_LOCKED asserted above.) 7484 */ 7485 ifp->if_flags |= IFF_RUNNING; 7486 7487 out: 7488 /* Save last flags for the callback */ 7489 sc->sc_if_flags = ifp->if_flags; 7490 sc->sc_ec_capenable = ec->ec_capenable; 7491 if (error) 7492 log(LOG_ERR, "%s: interface not running\n", 7493 device_xname(sc->sc_dev)); 7494 return error; 7495 } 7496 7497 /* 7498 * wm_stop: [ifnet interface function] 7499 * 7500 * Stop transmission on the interface. 7501 */ 7502 static void 7503 wm_stop(struct ifnet *ifp, int disable) 7504 { 7505 struct wm_softc *sc = ifp->if_softc; 7506 7507 ASSERT_SLEEPABLE(); 7508 KASSERT(IFNET_LOCKED(ifp)); 7509 7510 mutex_enter(sc->sc_core_lock); 7511 wm_stop_locked(ifp, disable ? true : false, true); 7512 mutex_exit(sc->sc_core_lock); 7513 7514 /* 7515 * After wm_set_stopping_flags(), it is guaranteed that 7516 * wm_handle_queue_work() does not call workqueue_enqueue(). 7517 * However, workqueue_wait() cannot call in wm_stop_locked() 7518 * because it can sleep... 7519 * so, call workqueue_wait() here. 7520 */ 7521 for (int i = 0; i < sc->sc_nqueues; i++) 7522 workqueue_wait(sc->sc_queue_wq, &sc->sc_queue[i].wmq_cookie); 7523 workqueue_wait(sc->sc_reset_wq, &sc->sc_reset_work); 7524 } 7525 7526 static void 7527 wm_stop_locked(struct ifnet *ifp, bool disable, bool wait) 7528 { 7529 struct wm_softc *sc = ifp->if_softc; 7530 struct wm_txsoft *txs; 7531 int i, qidx; 7532 7533 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 7534 device_xname(sc->sc_dev), __func__)); 7535 KASSERT(IFNET_LOCKED(ifp)); 7536 KASSERT(mutex_owned(sc->sc_core_lock)); 7537 7538 wm_set_stopping_flags(sc); 7539 7540 if (sc->sc_flags & WM_F_HAS_MII) { 7541 /* Down the MII. */ 7542 mii_down(&sc->sc_mii); 7543 } else { 7544 #if 0 7545 /* Should we clear PHY's status properly? */ 7546 wm_reset(sc); 7547 #endif 7548 } 7549 7550 /* Stop the transmit and receive processes. */ 7551 CSR_WRITE(sc, WMREG_TCTL, 0); 7552 CSR_WRITE(sc, WMREG_RCTL, 0); 7553 sc->sc_rctl &= ~RCTL_EN; 7554 7555 /* 7556 * Clear the interrupt mask to ensure the device cannot assert its 7557 * interrupt line. 7558 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to 7559 * service any currently pending or shared interrupt. 7560 */ 7561 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 7562 sc->sc_icr = 0; 7563 if (wm_is_using_msix(sc)) { 7564 if (sc->sc_type != WM_T_82574) { 7565 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 7566 CSR_WRITE(sc, WMREG_EIAC, 0); 7567 } else 7568 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 7569 } 7570 7571 /* 7572 * Stop callouts after interrupts are disabled; if we have 7573 * to wait for them, we will be releasing the CORE_LOCK 7574 * briefly, which will unblock interrupts on the current CPU. 7575 */ 7576 7577 /* Stop the one second clock. */ 7578 if (wait) 7579 callout_halt(&sc->sc_tick_ch, sc->sc_core_lock); 7580 else 7581 callout_stop(&sc->sc_tick_ch); 7582 7583 /* Stop the 82547 Tx FIFO stall check timer. */ 7584 if (sc->sc_type == WM_T_82547) { 7585 if (wait) 7586 callout_halt(&sc->sc_txfifo_ch, sc->sc_core_lock); 7587 else 7588 callout_stop(&sc->sc_txfifo_ch); 7589 } 7590 7591 /* Release any queued transmit buffers. */ 7592 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { 7593 struct wm_queue *wmq = &sc->sc_queue[qidx]; 7594 struct wm_txqueue *txq = &wmq->wmq_txq; 7595 struct mbuf *m; 7596 7597 mutex_enter(txq->txq_lock); 7598 txq->txq_sending = false; /* Ensure watchdog disabled */ 7599 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7600 txs = &txq->txq_soft[i]; 7601 if (txs->txs_mbuf != NULL) { 7602 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap); 7603 m_freem(txs->txs_mbuf); 7604 txs->txs_mbuf = NULL; 7605 } 7606 } 7607 /* Drain txq_interq */ 7608 while ((m = pcq_get(txq->txq_interq)) != NULL) 7609 m_freem(m); 7610 mutex_exit(txq->txq_lock); 7611 } 7612 7613 /* Mark the interface as down and cancel the watchdog timer. */ 7614 ifp->if_flags &= ~IFF_RUNNING; 7615 sc->sc_if_flags = ifp->if_flags; 7616 7617 if (disable) { 7618 for (i = 0; i < sc->sc_nqueues; i++) { 7619 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 7620 mutex_enter(rxq->rxq_lock); 7621 wm_rxdrain(rxq); 7622 mutex_exit(rxq->rxq_lock); 7623 } 7624 } 7625 7626 #if 0 /* notyet */ 7627 if (sc->sc_type >= WM_T_82544) 7628 CSR_WRITE(sc, WMREG_WUC, 0); 7629 #endif 7630 } 7631 7632 static void 7633 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0) 7634 { 7635 struct mbuf *m; 7636 int i; 7637 7638 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev)); 7639 for (m = m0, i = 0; m != NULL; m = m->m_next, i++) 7640 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, " 7641 "m_flags = 0x%08x\n", device_xname(sc->sc_dev), 7642 m->m_data, m->m_len, m->m_flags); 7643 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev), 7644 i, i == 1 ? "" : "s"); 7645 } 7646 7647 /* 7648 * wm_82547_txfifo_stall: 7649 * 7650 * Callout used to wait for the 82547 Tx FIFO to drain, 7651 * reset the FIFO pointers, and restart packet transmission. 7652 */ 7653 static void 7654 wm_82547_txfifo_stall(void *arg) 7655 { 7656 struct wm_softc *sc = arg; 7657 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 7658 7659 mutex_enter(txq->txq_lock); 7660 7661 if (txq->txq_stopping) 7662 goto out; 7663 7664 if (txq->txq_fifo_stall) { 7665 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) && 7666 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) && 7667 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) { 7668 /* 7669 * Packets have drained. Stop transmitter, reset 7670 * FIFO pointers, restart transmitter, and kick 7671 * the packet queue. 7672 */ 7673 uint32_t tctl = CSR_READ(sc, WMREG_TCTL); 7674 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN); 7675 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr); 7676 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr); 7677 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr); 7678 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr); 7679 CSR_WRITE(sc, WMREG_TCTL, tctl); 7680 CSR_WRITE_FLUSH(sc); 7681 7682 txq->txq_fifo_head = 0; 7683 txq->txq_fifo_stall = 0; 7684 wm_start_locked(&sc->sc_ethercom.ec_if); 7685 } else { 7686 /* 7687 * Still waiting for packets to drain; try again in 7688 * another tick. 7689 */ 7690 callout_schedule(&sc->sc_txfifo_ch, 1); 7691 } 7692 } 7693 7694 out: 7695 mutex_exit(txq->txq_lock); 7696 } 7697 7698 /* 7699 * wm_82547_txfifo_bugchk: 7700 * 7701 * Check for bug condition in the 82547 Tx FIFO. We need to 7702 * prevent enqueueing a packet that would wrap around the end 7703 * if the Tx FIFO ring buffer, otherwise the chip will croak. 7704 * 7705 * We do this by checking the amount of space before the end 7706 * of the Tx FIFO buffer. If the packet will not fit, we "stall" 7707 * the Tx FIFO, wait for all remaining packets to drain, reset 7708 * the internal FIFO pointers to the beginning, and restart 7709 * transmission on the interface. 7710 */ 7711 #define WM_FIFO_HDR 0x10 7712 #define WM_82547_PAD_LEN 0x3e0 7713 static int 7714 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0) 7715 { 7716 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 7717 int space = txq->txq_fifo_size - txq->txq_fifo_head; 7718 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR); 7719 7720 /* Just return if already stalled. */ 7721 if (txq->txq_fifo_stall) 7722 return 1; 7723 7724 if (sc->sc_mii.mii_media_active & IFM_FDX) { 7725 /* Stall only occurs in half-duplex mode. */ 7726 goto send_packet; 7727 } 7728 7729 if (len >= WM_82547_PAD_LEN + space) { 7730 txq->txq_fifo_stall = 1; 7731 callout_schedule(&sc->sc_txfifo_ch, 1); 7732 return 1; 7733 } 7734 7735 send_packet: 7736 txq->txq_fifo_head += len; 7737 if (txq->txq_fifo_head >= txq->txq_fifo_size) 7738 txq->txq_fifo_head -= txq->txq_fifo_size; 7739 7740 return 0; 7741 } 7742 7743 static int 7744 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq) 7745 { 7746 int error; 7747 7748 /* 7749 * Allocate the control data structures, and create and load the 7750 * DMA map for it. 7751 * 7752 * NOTE: All Tx descriptors must be in the same 4G segment of 7753 * memory. So must Rx descriptors. We simplify by allocating 7754 * both sets within the same 4G segment. 7755 */ 7756 if (sc->sc_type < WM_T_82544) 7757 WM_NTXDESC(txq) = WM_NTXDESC_82542; 7758 else 7759 WM_NTXDESC(txq) = WM_NTXDESC_82544; 7760 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 7761 txq->txq_descsize = sizeof(nq_txdesc_t); 7762 else 7763 txq->txq_descsize = sizeof(wiseman_txdesc_t); 7764 7765 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 7766 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg, 7767 1, &txq->txq_desc_rseg, 0)) != 0) { 7768 aprint_error_dev(sc->sc_dev, 7769 "unable to allocate TX control data, error = %d\n", 7770 error); 7771 goto fail_0; 7772 } 7773 7774 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg, 7775 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq), 7776 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) { 7777 aprint_error_dev(sc->sc_dev, 7778 "unable to map TX control data, error = %d\n", error); 7779 goto fail_1; 7780 } 7781 7782 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1, 7783 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) { 7784 aprint_error_dev(sc->sc_dev, 7785 "unable to create TX control data DMA map, error = %d\n", 7786 error); 7787 goto fail_2; 7788 } 7789 7790 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap, 7791 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) { 7792 aprint_error_dev(sc->sc_dev, 7793 "unable to load TX control data DMA map, error = %d\n", 7794 error); 7795 goto fail_3; 7796 } 7797 7798 return 0; 7799 7800 fail_3: 7801 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap); 7802 fail_2: 7803 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u, 7804 WM_TXDESCS_SIZE(txq)); 7805 fail_1: 7806 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg); 7807 fail_0: 7808 return error; 7809 } 7810 7811 static void 7812 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq) 7813 { 7814 7815 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap); 7816 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap); 7817 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u, 7818 WM_TXDESCS_SIZE(txq)); 7819 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg); 7820 } 7821 7822 static int 7823 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq) 7824 { 7825 int error; 7826 size_t rxq_descs_size; 7827 7828 /* 7829 * Allocate the control data structures, and create and load the 7830 * DMA map for it. 7831 * 7832 * NOTE: All Tx descriptors must be in the same 4G segment of 7833 * memory. So must Rx descriptors. We simplify by allocating 7834 * both sets within the same 4G segment. 7835 */ 7836 rxq->rxq_ndesc = WM_NRXDESC; 7837 if (sc->sc_type == WM_T_82574) 7838 rxq->rxq_descsize = sizeof(ext_rxdesc_t); 7839 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 7840 rxq->rxq_descsize = sizeof(nq_rxdesc_t); 7841 else 7842 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t); 7843 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc; 7844 7845 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size, 7846 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg, 7847 1, &rxq->rxq_desc_rseg, 0)) != 0) { 7848 aprint_error_dev(sc->sc_dev, 7849 "unable to allocate RX control data, error = %d\n", 7850 error); 7851 goto fail_0; 7852 } 7853 7854 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg, 7855 rxq->rxq_desc_rseg, rxq_descs_size, 7856 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) { 7857 aprint_error_dev(sc->sc_dev, 7858 "unable to map RX control data, error = %d\n", error); 7859 goto fail_1; 7860 } 7861 7862 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1, 7863 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) { 7864 aprint_error_dev(sc->sc_dev, 7865 "unable to create RX control data DMA map, error = %d\n", 7866 error); 7867 goto fail_2; 7868 } 7869 7870 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap, 7871 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) { 7872 aprint_error_dev(sc->sc_dev, 7873 "unable to load RX control data DMA map, error = %d\n", 7874 error); 7875 goto fail_3; 7876 } 7877 7878 return 0; 7879 7880 fail_3: 7881 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap); 7882 fail_2: 7883 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u, 7884 rxq_descs_size); 7885 fail_1: 7886 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg); 7887 fail_0: 7888 return error; 7889 } 7890 7891 static void 7892 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq) 7893 { 7894 7895 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap); 7896 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap); 7897 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u, 7898 rxq->rxq_descsize * rxq->rxq_ndesc); 7899 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg); 7900 } 7901 7902 7903 static int 7904 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq) 7905 { 7906 int i, error; 7907 7908 /* Create the transmit buffer DMA maps. */ 7909 WM_TXQUEUELEN(txq) = 7910 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ? 7911 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX; 7912 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7913 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA, 7914 WM_NTXSEGS, WTX_MAX_LEN, 0, 0, 7915 &txq->txq_soft[i].txs_dmamap)) != 0) { 7916 aprint_error_dev(sc->sc_dev, 7917 "unable to create Tx DMA map %d, error = %d\n", 7918 i, error); 7919 goto fail; 7920 } 7921 } 7922 7923 return 0; 7924 7925 fail: 7926 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7927 if (txq->txq_soft[i].txs_dmamap != NULL) 7928 bus_dmamap_destroy(sc->sc_dmat, 7929 txq->txq_soft[i].txs_dmamap); 7930 } 7931 return error; 7932 } 7933 7934 static void 7935 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq) 7936 { 7937 int i; 7938 7939 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 7940 if (txq->txq_soft[i].txs_dmamap != NULL) 7941 bus_dmamap_destroy(sc->sc_dmat, 7942 txq->txq_soft[i].txs_dmamap); 7943 } 7944 } 7945 7946 static int 7947 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 7948 { 7949 int i, error; 7950 7951 /* Create the receive buffer DMA maps. */ 7952 for (i = 0; i < rxq->rxq_ndesc; i++) { 7953 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 7954 MCLBYTES, 0, 0, 7955 &rxq->rxq_soft[i].rxs_dmamap)) != 0) { 7956 aprint_error_dev(sc->sc_dev, 7957 "unable to create Rx DMA map %d error = %d\n", 7958 i, error); 7959 goto fail; 7960 } 7961 rxq->rxq_soft[i].rxs_mbuf = NULL; 7962 } 7963 7964 return 0; 7965 7966 fail: 7967 for (i = 0; i < rxq->rxq_ndesc; i++) { 7968 if (rxq->rxq_soft[i].rxs_dmamap != NULL) 7969 bus_dmamap_destroy(sc->sc_dmat, 7970 rxq->rxq_soft[i].rxs_dmamap); 7971 } 7972 return error; 7973 } 7974 7975 static void 7976 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 7977 { 7978 int i; 7979 7980 for (i = 0; i < rxq->rxq_ndesc; i++) { 7981 if (rxq->rxq_soft[i].rxs_dmamap != NULL) 7982 bus_dmamap_destroy(sc->sc_dmat, 7983 rxq->rxq_soft[i].rxs_dmamap); 7984 } 7985 } 7986 7987 /* 7988 * wm_alloc_quques: 7989 * Allocate {tx,rx}descs and {tx,rx} buffers 7990 */ 7991 static int 7992 wm_alloc_txrx_queues(struct wm_softc *sc) 7993 { 7994 int i, error, tx_done, rx_done; 7995 7996 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues, 7997 KM_SLEEP); 7998 if (sc->sc_queue == NULL) { 7999 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n"); 8000 error = ENOMEM; 8001 goto fail_0; 8002 } 8003 8004 /* For transmission */ 8005 error = 0; 8006 tx_done = 0; 8007 for (i = 0; i < sc->sc_nqueues; i++) { 8008 #ifdef WM_EVENT_COUNTERS 8009 int j; 8010 const char *xname; 8011 #endif 8012 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 8013 txq->txq_sc = sc; 8014 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 8015 8016 error = wm_alloc_tx_descs(sc, txq); 8017 if (error) 8018 break; 8019 error = wm_alloc_tx_buffer(sc, txq); 8020 if (error) { 8021 wm_free_tx_descs(sc, txq); 8022 break; 8023 } 8024 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP); 8025 if (txq->txq_interq == NULL) { 8026 wm_free_tx_descs(sc, txq); 8027 wm_free_tx_buffer(sc, txq); 8028 error = ENOMEM; 8029 break; 8030 } 8031 8032 #ifdef WM_EVENT_COUNTERS 8033 xname = device_xname(sc->sc_dev); 8034 8035 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname); 8036 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname); 8037 WM_Q_MISC_EVCNT_ATTACH(txq, fifo_stall, txq, i, xname); 8038 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname); 8039 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname); 8040 WM_Q_MISC_EVCNT_ATTACH(txq, ipsum, txq, i, xname); 8041 WM_Q_MISC_EVCNT_ATTACH(txq, tusum, txq, i, xname); 8042 WM_Q_MISC_EVCNT_ATTACH(txq, tusum6, txq, i, xname); 8043 WM_Q_MISC_EVCNT_ATTACH(txq, tso, txq, i, xname); 8044 WM_Q_MISC_EVCNT_ATTACH(txq, tso6, txq, i, xname); 8045 WM_Q_MISC_EVCNT_ATTACH(txq, tsopain, txq, i, xname); 8046 8047 for (j = 0; j < WM_NTXSEGS; j++) { 8048 snprintf(txq->txq_txseg_evcnt_names[j], 8049 sizeof(txq->txq_txseg_evcnt_names[j]), 8050 "txq%02dtxseg%d", i, j); 8051 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], 8052 EVCNT_TYPE_MISC, 8053 NULL, xname, txq->txq_txseg_evcnt_names[j]); 8054 } 8055 8056 WM_Q_MISC_EVCNT_ATTACH(txq, pcqdrop, txq, i, xname); 8057 WM_Q_MISC_EVCNT_ATTACH(txq, descdrop, txq, i, xname); 8058 WM_Q_MISC_EVCNT_ATTACH(txq, toomanyseg, txq, i, xname); 8059 WM_Q_MISC_EVCNT_ATTACH(txq, defrag, txq, i, xname); 8060 /* Only for 82544 (and earlier?) */ 8061 if (sc->sc_type <= WM_T_82544) 8062 WM_Q_MISC_EVCNT_ATTACH(txq, underrun, txq, i, xname); 8063 WM_Q_MISC_EVCNT_ATTACH(txq, skipcontext, txq, i, xname); 8064 #endif /* WM_EVENT_COUNTERS */ 8065 8066 tx_done++; 8067 } 8068 if (error) 8069 goto fail_1; 8070 8071 /* For receive */ 8072 error = 0; 8073 rx_done = 0; 8074 for (i = 0; i < sc->sc_nqueues; i++) { 8075 #ifdef WM_EVENT_COUNTERS 8076 const char *xname; 8077 #endif 8078 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 8079 rxq->rxq_sc = sc; 8080 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 8081 8082 error = wm_alloc_rx_descs(sc, rxq); 8083 if (error) 8084 break; 8085 8086 error = wm_alloc_rx_buffer(sc, rxq); 8087 if (error) { 8088 wm_free_rx_descs(sc, rxq); 8089 break; 8090 } 8091 8092 #ifdef WM_EVENT_COUNTERS 8093 xname = device_xname(sc->sc_dev); 8094 8095 WM_Q_INTR_EVCNT_ATTACH(rxq, intr, rxq, i, xname); 8096 WM_Q_INTR_EVCNT_ATTACH(rxq, defer, rxq, i, xname); 8097 8098 WM_Q_MISC_EVCNT_ATTACH(rxq, ipsum, rxq, i, xname); 8099 WM_Q_MISC_EVCNT_ATTACH(rxq, tusum, rxq, i, xname); 8100 #endif /* WM_EVENT_COUNTERS */ 8101 8102 rx_done++; 8103 } 8104 if (error) 8105 goto fail_2; 8106 8107 return 0; 8108 8109 fail_2: 8110 for (i = 0; i < rx_done; i++) { 8111 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 8112 wm_free_rx_buffer(sc, rxq); 8113 wm_free_rx_descs(sc, rxq); 8114 if (rxq->rxq_lock) 8115 mutex_obj_free(rxq->rxq_lock); 8116 } 8117 fail_1: 8118 for (i = 0; i < tx_done; i++) { 8119 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 8120 pcq_destroy(txq->txq_interq); 8121 wm_free_tx_buffer(sc, txq); 8122 wm_free_tx_descs(sc, txq); 8123 if (txq->txq_lock) 8124 mutex_obj_free(txq->txq_lock); 8125 } 8126 8127 kmem_free(sc->sc_queue, 8128 sizeof(struct wm_queue) * sc->sc_nqueues); 8129 fail_0: 8130 return error; 8131 } 8132 8133 /* 8134 * wm_free_quques: 8135 * Free {tx,rx}descs and {tx,rx} buffers 8136 */ 8137 static void 8138 wm_free_txrx_queues(struct wm_softc *sc) 8139 { 8140 int i; 8141 8142 for (i = 0; i < sc->sc_nqueues; i++) { 8143 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; 8144 8145 #ifdef WM_EVENT_COUNTERS 8146 WM_Q_EVCNT_DETACH(rxq, intr, rxq, i); 8147 WM_Q_EVCNT_DETACH(rxq, defer, rxq, i); 8148 WM_Q_EVCNT_DETACH(rxq, ipsum, rxq, i); 8149 WM_Q_EVCNT_DETACH(rxq, tusum, rxq, i); 8150 #endif /* WM_EVENT_COUNTERS */ 8151 8152 wm_free_rx_buffer(sc, rxq); 8153 wm_free_rx_descs(sc, rxq); 8154 if (rxq->rxq_lock) 8155 mutex_obj_free(rxq->rxq_lock); 8156 } 8157 8158 for (i = 0; i < sc->sc_nqueues; i++) { 8159 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq; 8160 struct mbuf *m; 8161 #ifdef WM_EVENT_COUNTERS 8162 int j; 8163 8164 WM_Q_EVCNT_DETACH(txq, txsstall, txq, i); 8165 WM_Q_EVCNT_DETACH(txq, txdstall, txq, i); 8166 WM_Q_EVCNT_DETACH(txq, fifo_stall, txq, i); 8167 WM_Q_EVCNT_DETACH(txq, txdw, txq, i); 8168 WM_Q_EVCNT_DETACH(txq, txqe, txq, i); 8169 WM_Q_EVCNT_DETACH(txq, ipsum, txq, i); 8170 WM_Q_EVCNT_DETACH(txq, tusum, txq, i); 8171 WM_Q_EVCNT_DETACH(txq, tusum6, txq, i); 8172 WM_Q_EVCNT_DETACH(txq, tso, txq, i); 8173 WM_Q_EVCNT_DETACH(txq, tso6, txq, i); 8174 WM_Q_EVCNT_DETACH(txq, tsopain, txq, i); 8175 8176 for (j = 0; j < WM_NTXSEGS; j++) 8177 evcnt_detach(&txq->txq_ev_txseg[j]); 8178 8179 WM_Q_EVCNT_DETACH(txq, pcqdrop, txq, i); 8180 WM_Q_EVCNT_DETACH(txq, descdrop, txq, i); 8181 WM_Q_EVCNT_DETACH(txq, toomanyseg, txq, i); 8182 WM_Q_EVCNT_DETACH(txq, defrag, txq, i); 8183 if (sc->sc_type <= WM_T_82544) 8184 WM_Q_EVCNT_DETACH(txq, underrun, txq, i); 8185 WM_Q_EVCNT_DETACH(txq, skipcontext, txq, i); 8186 #endif /* WM_EVENT_COUNTERS */ 8187 8188 /* Drain txq_interq */ 8189 while ((m = pcq_get(txq->txq_interq)) != NULL) 8190 m_freem(m); 8191 pcq_destroy(txq->txq_interq); 8192 8193 wm_free_tx_buffer(sc, txq); 8194 wm_free_tx_descs(sc, txq); 8195 if (txq->txq_lock) 8196 mutex_obj_free(txq->txq_lock); 8197 } 8198 8199 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues); 8200 } 8201 8202 static void 8203 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq) 8204 { 8205 8206 KASSERT(mutex_owned(txq->txq_lock)); 8207 8208 /* Initialize the transmit descriptor ring. */ 8209 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq)); 8210 wm_cdtxsync(txq, 0, WM_NTXDESC(txq), 8211 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 8212 txq->txq_free = WM_NTXDESC(txq); 8213 txq->txq_next = 0; 8214 } 8215 8216 static void 8217 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq, 8218 struct wm_txqueue *txq) 8219 { 8220 8221 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 8222 device_xname(sc->sc_dev), __func__)); 8223 KASSERT(mutex_owned(txq->txq_lock)); 8224 8225 if (sc->sc_type < WM_T_82543) { 8226 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0)); 8227 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0)); 8228 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq)); 8229 CSR_WRITE(sc, WMREG_OLD_TDH, 0); 8230 CSR_WRITE(sc, WMREG_OLD_TDT, 0); 8231 CSR_WRITE(sc, WMREG_OLD_TIDV, 128); 8232 } else { 8233 int qid = wmq->wmq_id; 8234 8235 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0)); 8236 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0)); 8237 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq)); 8238 CSR_WRITE(sc, WMREG_TDH(qid), 0); 8239 8240 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 8241 /* 8242 * Don't write TDT before TCTL.EN is set. 8243 * See the document. 8244 */ 8245 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE 8246 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0) 8247 | TXDCTL_WTHRESH(0)); 8248 else { 8249 /* XXX should update with AIM? */ 8250 CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4); 8251 if (sc->sc_type >= WM_T_82540) { 8252 /* Should be the same */ 8253 CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4); 8254 } 8255 8256 CSR_WRITE(sc, WMREG_TDT(qid), 0); 8257 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) | 8258 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0)); 8259 } 8260 } 8261 } 8262 8263 static void 8264 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq) 8265 { 8266 int i; 8267 8268 KASSERT(mutex_owned(txq->txq_lock)); 8269 8270 /* Initialize the transmit job descriptors. */ 8271 for (i = 0; i < WM_TXQUEUELEN(txq); i++) 8272 txq->txq_soft[i].txs_mbuf = NULL; 8273 txq->txq_sfree = WM_TXQUEUELEN(txq); 8274 txq->txq_snext = 0; 8275 txq->txq_sdirty = 0; 8276 } 8277 8278 static void 8279 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq, 8280 struct wm_txqueue *txq) 8281 { 8282 8283 KASSERT(mutex_owned(txq->txq_lock)); 8284 8285 /* 8286 * Set up some register offsets that are different between 8287 * the i82542 and the i82543 and later chips. 8288 */ 8289 if (sc->sc_type < WM_T_82543) 8290 txq->txq_tdt_reg = WMREG_OLD_TDT; 8291 else 8292 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id); 8293 8294 wm_init_tx_descs(sc, txq); 8295 wm_init_tx_regs(sc, wmq, txq); 8296 wm_init_tx_buffer(sc, txq); 8297 8298 /* Clear other than WM_TXQ_LINKDOWN_DISCARD */ 8299 txq->txq_flags &= WM_TXQ_LINKDOWN_DISCARD; 8300 8301 txq->txq_sending = false; 8302 } 8303 8304 static void 8305 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq, 8306 struct wm_rxqueue *rxq) 8307 { 8308 8309 KASSERT(mutex_owned(rxq->rxq_lock)); 8310 8311 /* 8312 * Initialize the receive descriptor and receive job 8313 * descriptor rings. 8314 */ 8315 if (sc->sc_type < WM_T_82543) { 8316 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0)); 8317 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0)); 8318 CSR_WRITE(sc, WMREG_OLD_RDLEN0, 8319 rxq->rxq_descsize * rxq->rxq_ndesc); 8320 CSR_WRITE(sc, WMREG_OLD_RDH0, 0); 8321 CSR_WRITE(sc, WMREG_OLD_RDT0, 0); 8322 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD); 8323 8324 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0); 8325 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0); 8326 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0); 8327 CSR_WRITE(sc, WMREG_OLD_RDH1, 0); 8328 CSR_WRITE(sc, WMREG_OLD_RDT1, 0); 8329 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0); 8330 } else { 8331 int qid = wmq->wmq_id; 8332 8333 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0)); 8334 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0)); 8335 CSR_WRITE(sc, WMREG_RDLEN(qid), 8336 rxq->rxq_descsize * rxq->rxq_ndesc); 8337 8338 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 8339 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1)) 8340 panic("%s: MCLBYTES %d unsupported for 82575 " 8341 "or higher\n", __func__, MCLBYTES); 8342 8343 /* 8344 * Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF 8345 * only. 8346 */ 8347 CSR_WRITE(sc, WMREG_SRRCTL(qid), 8348 SRRCTL_DESCTYPE_ADV_ONEBUF 8349 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT)); 8350 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE 8351 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8) 8352 | RXDCTL_WTHRESH(1)); 8353 CSR_WRITE(sc, WMREG_RDH(qid), 0); 8354 CSR_WRITE(sc, WMREG_RDT(qid), 0); 8355 } else { 8356 CSR_WRITE(sc, WMREG_RDH(qid), 0); 8357 CSR_WRITE(sc, WMREG_RDT(qid), 0); 8358 /* XXX should update with AIM? */ 8359 CSR_WRITE(sc, WMREG_RDTR, 8360 (wmq->wmq_itr / 4) | RDTR_FPD); 8361 /* MUST be same */ 8362 CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4); 8363 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) | 8364 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1)); 8365 } 8366 } 8367 } 8368 8369 static int 8370 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 8371 { 8372 struct wm_rxsoft *rxs; 8373 int error, i; 8374 8375 KASSERT(mutex_owned(rxq->rxq_lock)); 8376 8377 for (i = 0; i < rxq->rxq_ndesc; i++) { 8378 rxs = &rxq->rxq_soft[i]; 8379 if (rxs->rxs_mbuf == NULL) { 8380 if ((error = wm_add_rxbuf(rxq, i)) != 0) { 8381 log(LOG_ERR, "%s: unable to allocate or map " 8382 "rx buffer %d, error = %d\n", 8383 device_xname(sc->sc_dev), i, error); 8384 /* 8385 * XXX Should attempt to run with fewer receive 8386 * XXX buffers instead of just failing. 8387 */ 8388 wm_rxdrain(rxq); 8389 return ENOMEM; 8390 } 8391 } else { 8392 /* 8393 * For 82575 and 82576, the RX descriptors must be 8394 * initialized after the setting of RCTL.EN in 8395 * wm_set_filter() 8396 */ 8397 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0) 8398 wm_init_rxdesc(rxq, i); 8399 } 8400 } 8401 rxq->rxq_ptr = 0; 8402 rxq->rxq_discard = 0; 8403 WM_RXCHAIN_RESET(rxq); 8404 8405 return 0; 8406 } 8407 8408 static int 8409 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq, 8410 struct wm_rxqueue *rxq) 8411 { 8412 8413 KASSERT(mutex_owned(rxq->rxq_lock)); 8414 8415 /* 8416 * Set up some register offsets that are different between 8417 * the i82542 and the i82543 and later chips. 8418 */ 8419 if (sc->sc_type < WM_T_82543) 8420 rxq->rxq_rdt_reg = WMREG_OLD_RDT0; 8421 else 8422 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id); 8423 8424 wm_init_rx_regs(sc, wmq, rxq); 8425 return wm_init_rx_buffer(sc, rxq); 8426 } 8427 8428 /* 8429 * wm_init_quques: 8430 * Initialize {tx,rx}descs and {tx,rx} buffers 8431 */ 8432 static int 8433 wm_init_txrx_queues(struct wm_softc *sc) 8434 { 8435 int i, error = 0; 8436 8437 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 8438 device_xname(sc->sc_dev), __func__)); 8439 8440 for (i = 0; i < sc->sc_nqueues; i++) { 8441 struct wm_queue *wmq = &sc->sc_queue[i]; 8442 struct wm_txqueue *txq = &wmq->wmq_txq; 8443 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 8444 8445 /* 8446 * TODO 8447 * Currently, use constant variable instead of AIM. 8448 * Furthermore, the interrupt interval of multiqueue which use 8449 * polling mode is less than default value. 8450 * More tuning and AIM are required. 8451 */ 8452 if (wm_is_using_multiqueue(sc)) 8453 wmq->wmq_itr = 50; 8454 else 8455 wmq->wmq_itr = sc->sc_itr_init; 8456 wmq->wmq_set_itr = true; 8457 8458 mutex_enter(txq->txq_lock); 8459 wm_init_tx_queue(sc, wmq, txq); 8460 mutex_exit(txq->txq_lock); 8461 8462 mutex_enter(rxq->rxq_lock); 8463 error = wm_init_rx_queue(sc, wmq, rxq); 8464 mutex_exit(rxq->rxq_lock); 8465 if (error) 8466 break; 8467 } 8468 8469 return error; 8470 } 8471 8472 /* 8473 * wm_tx_offload: 8474 * 8475 * Set up TCP/IP checksumming parameters for the 8476 * specified packet. 8477 */ 8478 static void 8479 wm_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq, 8480 struct wm_txsoft *txs, uint32_t *cmdp, uint8_t *fieldsp) 8481 { 8482 struct mbuf *m0 = txs->txs_mbuf; 8483 struct livengood_tcpip_ctxdesc *t; 8484 uint32_t ipcs, tucs, cmd, cmdlen, seg; 8485 uint32_t ipcse; 8486 struct ether_header *eh; 8487 int offset, iphl; 8488 uint8_t fields; 8489 8490 /* 8491 * XXX It would be nice if the mbuf pkthdr had offset 8492 * fields for the protocol headers. 8493 */ 8494 8495 eh = mtod(m0, struct ether_header *); 8496 switch (htons(eh->ether_type)) { 8497 case ETHERTYPE_IP: 8498 case ETHERTYPE_IPV6: 8499 offset = ETHER_HDR_LEN; 8500 break; 8501 8502 case ETHERTYPE_VLAN: 8503 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 8504 break; 8505 8506 default: 8507 /* Don't support this protocol or encapsulation. */ 8508 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0; 8509 txq->txq_last_hw_ipcs = 0; 8510 txq->txq_last_hw_tucs = 0; 8511 *fieldsp = 0; 8512 *cmdp = 0; 8513 return; 8514 } 8515 8516 if ((m0->m_pkthdr.csum_flags & 8517 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) { 8518 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data); 8519 } else 8520 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data); 8521 8522 ipcse = offset + iphl - 1; 8523 8524 cmd = WTX_CMD_DEXT | WTX_DTYP_D; 8525 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE; 8526 seg = 0; 8527 fields = 0; 8528 8529 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) { 8530 int hlen = offset + iphl; 8531 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0; 8532 8533 if (__predict_false(m0->m_len < 8534 (hlen + sizeof(struct tcphdr)))) { 8535 /* 8536 * TCP/IP headers are not in the first mbuf; we need 8537 * to do this the slow and painful way. Let's just 8538 * hope this doesn't happen very often. 8539 */ 8540 struct tcphdr th; 8541 8542 WM_Q_EVCNT_INCR(txq, tsopain); 8543 8544 m_copydata(m0, hlen, sizeof(th), &th); 8545 if (v4) { 8546 struct ip ip; 8547 8548 m_copydata(m0, offset, sizeof(ip), &ip); 8549 ip.ip_len = 0; 8550 m_copyback(m0, 8551 offset + offsetof(struct ip, ip_len), 8552 sizeof(ip.ip_len), &ip.ip_len); 8553 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr, 8554 ip.ip_dst.s_addr, htons(IPPROTO_TCP)); 8555 } else { 8556 struct ip6_hdr ip6; 8557 8558 m_copydata(m0, offset, sizeof(ip6), &ip6); 8559 ip6.ip6_plen = 0; 8560 m_copyback(m0, 8561 offset + offsetof(struct ip6_hdr, ip6_plen), 8562 sizeof(ip6.ip6_plen), &ip6.ip6_plen); 8563 th.th_sum = in6_cksum_phdr(&ip6.ip6_src, 8564 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP)); 8565 } 8566 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum), 8567 sizeof(th.th_sum), &th.th_sum); 8568 8569 hlen += th.th_off << 2; 8570 } else { 8571 /* 8572 * TCP/IP headers are in the first mbuf; we can do 8573 * this the easy way. 8574 */ 8575 struct tcphdr *th; 8576 8577 if (v4) { 8578 struct ip *ip = 8579 (void *)(mtod(m0, char *) + offset); 8580 th = (void *)(mtod(m0, char *) + hlen); 8581 8582 ip->ip_len = 0; 8583 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 8584 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 8585 } else { 8586 struct ip6_hdr *ip6 = 8587 (void *)(mtod(m0, char *) + offset); 8588 th = (void *)(mtod(m0, char *) + hlen); 8589 8590 ip6->ip6_plen = 0; 8591 th->th_sum = in6_cksum_phdr(&ip6->ip6_src, 8592 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP)); 8593 } 8594 hlen += th->th_off << 2; 8595 } 8596 8597 if (v4) { 8598 WM_Q_EVCNT_INCR(txq, tso); 8599 cmdlen |= WTX_TCPIP_CMD_IP; 8600 } else { 8601 WM_Q_EVCNT_INCR(txq, tso6); 8602 ipcse = 0; 8603 } 8604 cmd |= WTX_TCPIP_CMD_TSE; 8605 cmdlen |= WTX_TCPIP_CMD_TSE | 8606 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen); 8607 seg = WTX_TCPIP_SEG_HDRLEN(hlen) | 8608 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz); 8609 } 8610 8611 /* 8612 * NOTE: Even if we're not using the IP or TCP/UDP checksum 8613 * offload feature, if we load the context descriptor, we 8614 * MUST provide valid values for IPCSS and TUCSS fields. 8615 */ 8616 8617 ipcs = WTX_TCPIP_IPCSS(offset) | 8618 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) | 8619 WTX_TCPIP_IPCSE(ipcse); 8620 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) { 8621 WM_Q_EVCNT_INCR(txq, ipsum); 8622 fields |= WTX_IXSM; 8623 } 8624 8625 offset += iphl; 8626 8627 if (m0->m_pkthdr.csum_flags & 8628 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) { 8629 WM_Q_EVCNT_INCR(txq, tusum); 8630 fields |= WTX_TXSM; 8631 tucs = WTX_TCPIP_TUCSS(offset) | 8632 WTX_TCPIP_TUCSO(offset + 8633 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) | 8634 WTX_TCPIP_TUCSE(0) /* Rest of packet */; 8635 } else if ((m0->m_pkthdr.csum_flags & 8636 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) { 8637 WM_Q_EVCNT_INCR(txq, tusum6); 8638 fields |= WTX_TXSM; 8639 tucs = WTX_TCPIP_TUCSS(offset) | 8640 WTX_TCPIP_TUCSO(offset + 8641 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) | 8642 WTX_TCPIP_TUCSE(0) /* Rest of packet */; 8643 } else { 8644 /* Just initialize it to a valid TCP context. */ 8645 tucs = WTX_TCPIP_TUCSS(offset) | 8646 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) | 8647 WTX_TCPIP_TUCSE(0) /* Rest of packet */; 8648 } 8649 8650 *cmdp = cmd; 8651 *fieldsp = fields; 8652 8653 /* 8654 * We don't have to write context descriptor for every packet 8655 * except for 82574. For 82574, we must write context descriptor 8656 * for every packet when we use two descriptor queues. 8657 * 8658 * The 82574L can only remember the *last* context used 8659 * regardless of queue that it was use for. We cannot reuse 8660 * contexts on this hardware platform and must generate a new 8661 * context every time. 82574L hardware spec, section 7.2.6, 8662 * second note. 8663 */ 8664 if (sc->sc_nqueues < 2) { 8665 /* 8666 * Setting up new checksum offload context for every 8667 * frames takes a lot of processing time for hardware. 8668 * This also reduces performance a lot for small sized 8669 * frames so avoid it if driver can use previously 8670 * configured checksum offload context. 8671 * For TSO, in theory we can use the same TSO context only if 8672 * frame is the same type(IP/TCP) and the same MSS. However 8673 * checking whether a frame has the same IP/TCP structure is a 8674 * hard thing so just ignore that and always restablish a 8675 * new TSO context. 8676 */ 8677 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) 8678 == 0) { 8679 if (txq->txq_last_hw_cmd == cmd && 8680 txq->txq_last_hw_fields == fields && 8681 txq->txq_last_hw_ipcs == (ipcs & 0xffff) && 8682 txq->txq_last_hw_tucs == (tucs & 0xffff)) { 8683 WM_Q_EVCNT_INCR(txq, skipcontext); 8684 return; 8685 } 8686 } 8687 8688 txq->txq_last_hw_cmd = cmd; 8689 txq->txq_last_hw_fields = fields; 8690 txq->txq_last_hw_ipcs = (ipcs & 0xffff); 8691 txq->txq_last_hw_tucs = (tucs & 0xffff); 8692 } 8693 8694 /* Fill in the context descriptor. */ 8695 t = (struct livengood_tcpip_ctxdesc *) 8696 &txq->txq_descs[txq->txq_next]; 8697 t->tcpip_ipcs = htole32(ipcs); 8698 t->tcpip_tucs = htole32(tucs); 8699 t->tcpip_cmdlen = htole32(cmdlen); 8700 t->tcpip_seg = htole32(seg); 8701 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE); 8702 8703 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 8704 txs->txs_ndesc++; 8705 } 8706 8707 static inline int 8708 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m) 8709 { 8710 struct wm_softc *sc = ifp->if_softc; 8711 u_int cpuid = cpu_index(curcpu()); 8712 8713 /* 8714 * Currently, simple distribute strategy. 8715 * TODO: 8716 * distribute by flowid(RSS has value). 8717 */ 8718 return ((cpuid + ncpu - sc->sc_affinity_offset) % ncpu) % sc->sc_nqueues; 8719 } 8720 8721 static inline bool 8722 wm_linkdown_discard(struct wm_txqueue *txq) 8723 { 8724 8725 if ((txq->txq_flags & WM_TXQ_LINKDOWN_DISCARD) != 0) 8726 return true; 8727 8728 return false; 8729 } 8730 8731 /* 8732 * wm_start: [ifnet interface function] 8733 * 8734 * Start packet transmission on the interface. 8735 */ 8736 static void 8737 wm_start(struct ifnet *ifp) 8738 { 8739 struct wm_softc *sc = ifp->if_softc; 8740 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 8741 8742 KASSERT(if_is_mpsafe(ifp)); 8743 /* 8744 * if_obytes and if_omcasts are added in if_transmit()@if.c. 8745 */ 8746 8747 mutex_enter(txq->txq_lock); 8748 if (!txq->txq_stopping) 8749 wm_start_locked(ifp); 8750 mutex_exit(txq->txq_lock); 8751 } 8752 8753 static void 8754 wm_start_locked(struct ifnet *ifp) 8755 { 8756 struct wm_softc *sc = ifp->if_softc; 8757 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 8758 8759 wm_send_common_locked(ifp, txq, false); 8760 } 8761 8762 static int 8763 wm_transmit(struct ifnet *ifp, struct mbuf *m) 8764 { 8765 int qid; 8766 struct wm_softc *sc = ifp->if_softc; 8767 struct wm_txqueue *txq; 8768 8769 qid = wm_select_txqueue(ifp, m); 8770 txq = &sc->sc_queue[qid].wmq_txq; 8771 8772 if (__predict_false(!pcq_put(txq->txq_interq, m))) { 8773 m_freem(m); 8774 WM_Q_EVCNT_INCR(txq, pcqdrop); 8775 return ENOBUFS; 8776 } 8777 8778 net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 8779 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len); 8780 if (m->m_flags & M_MCAST) 8781 if_statinc_ref(nsr, if_omcasts); 8782 IF_STAT_PUTREF(ifp); 8783 8784 if (mutex_tryenter(txq->txq_lock)) { 8785 if (!txq->txq_stopping) 8786 wm_transmit_locked(ifp, txq); 8787 mutex_exit(txq->txq_lock); 8788 } 8789 8790 return 0; 8791 } 8792 8793 static void 8794 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq) 8795 { 8796 8797 wm_send_common_locked(ifp, txq, true); 8798 } 8799 8800 static void 8801 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq, 8802 bool is_transmit) 8803 { 8804 struct wm_softc *sc = ifp->if_softc; 8805 struct mbuf *m0; 8806 struct wm_txsoft *txs; 8807 bus_dmamap_t dmamap; 8808 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso; 8809 bus_addr_t curaddr; 8810 bus_size_t seglen, curlen; 8811 uint32_t cksumcmd; 8812 uint8_t cksumfields; 8813 bool remap = true; 8814 8815 KASSERT(mutex_owned(txq->txq_lock)); 8816 KASSERT(!txq->txq_stopping); 8817 8818 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0) 8819 return; 8820 8821 if (__predict_false(wm_linkdown_discard(txq))) { 8822 do { 8823 if (is_transmit) 8824 m0 = pcq_get(txq->txq_interq); 8825 else 8826 IFQ_DEQUEUE(&ifp->if_snd, m0); 8827 /* 8828 * increment successed packet counter as in the case 8829 * which the packet is discarded by link down PHY. 8830 */ 8831 if (m0 != NULL) { 8832 if_statinc(ifp, if_opackets); 8833 m_freem(m0); 8834 } 8835 } while (m0 != NULL); 8836 return; 8837 } 8838 8839 /* Remember the previous number of free descriptors. */ 8840 ofree = txq->txq_free; 8841 8842 /* 8843 * Loop through the send queue, setting up transmit descriptors 8844 * until we drain the queue, or use up all available transmit 8845 * descriptors. 8846 */ 8847 for (;;) { 8848 m0 = NULL; 8849 8850 /* Get a work queue entry. */ 8851 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) { 8852 wm_txeof(txq, UINT_MAX); 8853 if (txq->txq_sfree == 0) { 8854 DPRINTF(sc, WM_DEBUG_TX, 8855 ("%s: TX: no free job descriptors\n", 8856 device_xname(sc->sc_dev))); 8857 WM_Q_EVCNT_INCR(txq, txsstall); 8858 break; 8859 } 8860 } 8861 8862 /* Grab a packet off the queue. */ 8863 if (is_transmit) 8864 m0 = pcq_get(txq->txq_interq); 8865 else 8866 IFQ_DEQUEUE(&ifp->if_snd, m0); 8867 if (m0 == NULL) 8868 break; 8869 8870 DPRINTF(sc, WM_DEBUG_TX, 8871 ("%s: TX: have packet to transmit: %p\n", 8872 device_xname(sc->sc_dev), m0)); 8873 8874 txs = &txq->txq_soft[txq->txq_snext]; 8875 dmamap = txs->txs_dmamap; 8876 8877 use_tso = (m0->m_pkthdr.csum_flags & 8878 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0; 8879 8880 /* 8881 * So says the Linux driver: 8882 * The controller does a simple calculation to make sure 8883 * there is enough room in the FIFO before initiating the 8884 * DMA for each buffer. The calc is: 8885 * 4 = ceil(buffer len / MSS) 8886 * To make sure we don't overrun the FIFO, adjust the max 8887 * buffer len if the MSS drops. 8888 */ 8889 dmamap->dm_maxsegsz = 8890 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN) 8891 ? m0->m_pkthdr.segsz << 2 8892 : WTX_MAX_LEN; 8893 8894 /* 8895 * Load the DMA map. If this fails, the packet either 8896 * didn't fit in the allotted number of segments, or we 8897 * were short on resources. For the too-many-segments 8898 * case, we simply report an error and drop the packet, 8899 * since we can't sanely copy a jumbo packet to a single 8900 * buffer. 8901 */ 8902 retry: 8903 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 8904 BUS_DMA_WRITE | BUS_DMA_NOWAIT); 8905 if (__predict_false(error)) { 8906 if (error == EFBIG) { 8907 if (remap == true) { 8908 struct mbuf *m; 8909 8910 remap = false; 8911 m = m_defrag(m0, M_NOWAIT); 8912 if (m != NULL) { 8913 WM_Q_EVCNT_INCR(txq, defrag); 8914 m0 = m; 8915 goto retry; 8916 } 8917 } 8918 WM_Q_EVCNT_INCR(txq, toomanyseg); 8919 log(LOG_ERR, "%s: Tx packet consumes too many " 8920 "DMA segments, dropping...\n", 8921 device_xname(sc->sc_dev)); 8922 wm_dump_mbuf_chain(sc, m0); 8923 m_freem(m0); 8924 continue; 8925 } 8926 /* Short on resources, just stop for now. */ 8927 DPRINTF(sc, WM_DEBUG_TX, 8928 ("%s: TX: dmamap load failed: %d\n", 8929 device_xname(sc->sc_dev), error)); 8930 break; 8931 } 8932 8933 segs_needed = dmamap->dm_nsegs; 8934 if (use_tso) { 8935 /* For sentinel descriptor; see below. */ 8936 segs_needed++; 8937 } 8938 8939 /* 8940 * Ensure we have enough descriptors free to describe 8941 * the packet. Note, we always reserve one descriptor 8942 * at the end of the ring due to the semantics of the 8943 * TDT register, plus one more in the event we need 8944 * to load offload context. 8945 */ 8946 if (segs_needed > txq->txq_free - 2) { 8947 /* 8948 * Not enough free descriptors to transmit this 8949 * packet. We haven't committed anything yet, 8950 * so just unload the DMA map, put the packet 8951 * pack on the queue, and punt. Notify the upper 8952 * layer that there are no more slots left. 8953 */ 8954 DPRINTF(sc, WM_DEBUG_TX, 8955 ("%s: TX: need %d (%d) descriptors, have %d\n", 8956 device_xname(sc->sc_dev), dmamap->dm_nsegs, 8957 segs_needed, txq->txq_free - 1)); 8958 txq->txq_flags |= WM_TXQ_NO_SPACE; 8959 bus_dmamap_unload(sc->sc_dmat, dmamap); 8960 WM_Q_EVCNT_INCR(txq, txdstall); 8961 break; 8962 } 8963 8964 /* 8965 * Check for 82547 Tx FIFO bug. We need to do this 8966 * once we know we can transmit the packet, since we 8967 * do some internal FIFO space accounting here. 8968 */ 8969 if (sc->sc_type == WM_T_82547 && 8970 wm_82547_txfifo_bugchk(sc, m0)) { 8971 DPRINTF(sc, WM_DEBUG_TX, 8972 ("%s: TX: 82547 Tx FIFO bug detected\n", 8973 device_xname(sc->sc_dev))); 8974 txq->txq_flags |= WM_TXQ_NO_SPACE; 8975 bus_dmamap_unload(sc->sc_dmat, dmamap); 8976 WM_Q_EVCNT_INCR(txq, fifo_stall); 8977 break; 8978 } 8979 8980 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */ 8981 8982 DPRINTF(sc, WM_DEBUG_TX, 8983 ("%s: TX: packet has %d (%d) DMA segments\n", 8984 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed)); 8985 8986 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]); 8987 8988 /* 8989 * Store a pointer to the packet so that we can free it 8990 * later. 8991 * 8992 * Initially, we consider the number of descriptors the 8993 * packet uses the number of DMA segments. This may be 8994 * incremented by 1 if we do checksum offload (a descriptor 8995 * is used to set the checksum context). 8996 */ 8997 txs->txs_mbuf = m0; 8998 txs->txs_firstdesc = txq->txq_next; 8999 txs->txs_ndesc = segs_needed; 9000 9001 /* Set up offload parameters for this packet. */ 9002 if (m0->m_pkthdr.csum_flags & 9003 (M_CSUM_TSOv4 | M_CSUM_TSOv6 | 9004 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 | 9005 M_CSUM_TCPv6 | M_CSUM_UDPv6)) { 9006 wm_tx_offload(sc, txq, txs, &cksumcmd, &cksumfields); 9007 } else { 9008 txq->txq_last_hw_cmd = txq->txq_last_hw_fields = 0; 9009 txq->txq_last_hw_ipcs = txq->txq_last_hw_tucs = 0; 9010 cksumcmd = 0; 9011 cksumfields = 0; 9012 } 9013 9014 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS; 9015 9016 /* Sync the DMA map. */ 9017 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 9018 BUS_DMASYNC_PREWRITE); 9019 9020 /* Initialize the transmit descriptor. */ 9021 for (nexttx = txq->txq_next, seg = 0; 9022 seg < dmamap->dm_nsegs; seg++) { 9023 for (seglen = dmamap->dm_segs[seg].ds_len, 9024 curaddr = dmamap->dm_segs[seg].ds_addr; 9025 seglen != 0; 9026 curaddr += curlen, seglen -= curlen, 9027 nexttx = WM_NEXTTX(txq, nexttx)) { 9028 curlen = seglen; 9029 9030 /* 9031 * So says the Linux driver: 9032 * Work around for premature descriptor 9033 * write-backs in TSO mode. Append a 9034 * 4-byte sentinel descriptor. 9035 */ 9036 if (use_tso && seg == dmamap->dm_nsegs - 1 && 9037 curlen > 8) 9038 curlen -= 4; 9039 9040 wm_set_dma_addr( 9041 &txq->txq_descs[nexttx].wtx_addr, curaddr); 9042 txq->txq_descs[nexttx].wtx_cmdlen 9043 = htole32(cksumcmd | curlen); 9044 txq->txq_descs[nexttx].wtx_fields.wtxu_status 9045 = 0; 9046 txq->txq_descs[nexttx].wtx_fields.wtxu_options 9047 = cksumfields; 9048 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0; 9049 lasttx = nexttx; 9050 9051 DPRINTF(sc, WM_DEBUG_TX, 9052 ("%s: TX: desc %d: low %#" PRIx64 ", " 9053 "len %#04zx\n", 9054 device_xname(sc->sc_dev), nexttx, 9055 (uint64_t)curaddr, curlen)); 9056 } 9057 } 9058 9059 KASSERT(lasttx != -1); 9060 9061 /* 9062 * Set up the command byte on the last descriptor of 9063 * the packet. If we're in the interrupt delay window, 9064 * delay the interrupt. 9065 */ 9066 txq->txq_descs[lasttx].wtx_cmdlen |= 9067 htole32(WTX_CMD_EOP | WTX_CMD_RS); 9068 9069 /* 9070 * If VLANs are enabled and the packet has a VLAN tag, set 9071 * up the descriptor to encapsulate the packet for us. 9072 * 9073 * This is only valid on the last descriptor of the packet. 9074 */ 9075 if (vlan_has_tag(m0)) { 9076 txq->txq_descs[lasttx].wtx_cmdlen |= 9077 htole32(WTX_CMD_VLE); 9078 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan 9079 = htole16(vlan_get_tag(m0)); 9080 } 9081 9082 txs->txs_lastdesc = lasttx; 9083 9084 DPRINTF(sc, WM_DEBUG_TX, 9085 ("%s: TX: desc %d: cmdlen 0x%08x\n", 9086 device_xname(sc->sc_dev), 9087 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen))); 9088 9089 /* Sync the descriptors we're using. */ 9090 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc, 9091 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 9092 9093 /* Give the packet to the chip. */ 9094 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx); 9095 9096 DPRINTF(sc, WM_DEBUG_TX, 9097 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx)); 9098 9099 DPRINTF(sc, WM_DEBUG_TX, 9100 ("%s: TX: finished transmitting packet, job %d\n", 9101 device_xname(sc->sc_dev), txq->txq_snext)); 9102 9103 /* Advance the tx pointer. */ 9104 txq->txq_free -= txs->txs_ndesc; 9105 txq->txq_next = nexttx; 9106 9107 txq->txq_sfree--; 9108 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext); 9109 9110 /* Pass the packet to any BPF listeners. */ 9111 bpf_mtap(ifp, m0, BPF_D_OUT); 9112 } 9113 9114 if (m0 != NULL) { 9115 txq->txq_flags |= WM_TXQ_NO_SPACE; 9116 WM_Q_EVCNT_INCR(txq, descdrop); 9117 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", 9118 __func__)); 9119 m_freem(m0); 9120 } 9121 9122 if (txq->txq_sfree == 0 || txq->txq_free <= 2) { 9123 /* No more slots; notify upper layer. */ 9124 txq->txq_flags |= WM_TXQ_NO_SPACE; 9125 } 9126 9127 if (txq->txq_free != ofree) { 9128 /* Set a watchdog timer in case the chip flakes out. */ 9129 txq->txq_lastsent = time_uptime; 9130 txq->txq_sending = true; 9131 } 9132 } 9133 9134 /* 9135 * wm_nq_tx_offload: 9136 * 9137 * Set up TCP/IP checksumming parameters for the 9138 * specified packet, for NEWQUEUE devices 9139 */ 9140 static void 9141 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq, 9142 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum) 9143 { 9144 struct mbuf *m0 = txs->txs_mbuf; 9145 uint32_t vl_len, mssidx, cmdc; 9146 struct ether_header *eh; 9147 int offset, iphl; 9148 9149 /* 9150 * XXX It would be nice if the mbuf pkthdr had offset 9151 * fields for the protocol headers. 9152 */ 9153 *cmdlenp = 0; 9154 *fieldsp = 0; 9155 9156 eh = mtod(m0, struct ether_header *); 9157 switch (htons(eh->ether_type)) { 9158 case ETHERTYPE_IP: 9159 case ETHERTYPE_IPV6: 9160 offset = ETHER_HDR_LEN; 9161 break; 9162 9163 case ETHERTYPE_VLAN: 9164 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 9165 break; 9166 9167 default: 9168 /* Don't support this protocol or encapsulation. */ 9169 *do_csum = false; 9170 return; 9171 } 9172 *do_csum = true; 9173 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS; 9174 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT; 9175 9176 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT); 9177 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0); 9178 9179 if ((m0->m_pkthdr.csum_flags & 9180 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) { 9181 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data); 9182 } else { 9183 iphl = M_CSUM_DATA_IPv6_IPHL(m0->m_pkthdr.csum_data); 9184 } 9185 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT); 9186 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0); 9187 9188 if (vlan_has_tag(m0)) { 9189 vl_len |= ((vlan_get_tag(m0) & NQTXC_VLLEN_VLAN_MASK) 9190 << NQTXC_VLLEN_VLAN_SHIFT); 9191 *cmdlenp |= NQTX_CMD_VLE; 9192 } 9193 9194 mssidx = 0; 9195 9196 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) { 9197 int hlen = offset + iphl; 9198 int tcp_hlen; 9199 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0; 9200 9201 if (__predict_false(m0->m_len < 9202 (hlen + sizeof(struct tcphdr)))) { 9203 /* 9204 * TCP/IP headers are not in the first mbuf; we need 9205 * to do this the slow and painful way. Let's just 9206 * hope this doesn't happen very often. 9207 */ 9208 struct tcphdr th; 9209 9210 WM_Q_EVCNT_INCR(txq, tsopain); 9211 9212 m_copydata(m0, hlen, sizeof(th), &th); 9213 if (v4) { 9214 struct ip ip; 9215 9216 m_copydata(m0, offset, sizeof(ip), &ip); 9217 ip.ip_len = 0; 9218 m_copyback(m0, 9219 offset + offsetof(struct ip, ip_len), 9220 sizeof(ip.ip_len), &ip.ip_len); 9221 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr, 9222 ip.ip_dst.s_addr, htons(IPPROTO_TCP)); 9223 } else { 9224 struct ip6_hdr ip6; 9225 9226 m_copydata(m0, offset, sizeof(ip6), &ip6); 9227 ip6.ip6_plen = 0; 9228 m_copyback(m0, 9229 offset + offsetof(struct ip6_hdr, ip6_plen), 9230 sizeof(ip6.ip6_plen), &ip6.ip6_plen); 9231 th.th_sum = in6_cksum_phdr(&ip6.ip6_src, 9232 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP)); 9233 } 9234 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum), 9235 sizeof(th.th_sum), &th.th_sum); 9236 9237 tcp_hlen = th.th_off << 2; 9238 } else { 9239 /* 9240 * TCP/IP headers are in the first mbuf; we can do 9241 * this the easy way. 9242 */ 9243 struct tcphdr *th; 9244 9245 if (v4) { 9246 struct ip *ip = 9247 (void *)(mtod(m0, char *) + offset); 9248 th = (void *)(mtod(m0, char *) + hlen); 9249 9250 ip->ip_len = 0; 9251 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 9252 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 9253 } else { 9254 struct ip6_hdr *ip6 = 9255 (void *)(mtod(m0, char *) + offset); 9256 th = (void *)(mtod(m0, char *) + hlen); 9257 9258 ip6->ip6_plen = 0; 9259 th->th_sum = in6_cksum_phdr(&ip6->ip6_src, 9260 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP)); 9261 } 9262 tcp_hlen = th->th_off << 2; 9263 } 9264 hlen += tcp_hlen; 9265 *cmdlenp |= NQTX_CMD_TSE; 9266 9267 if (v4) { 9268 WM_Q_EVCNT_INCR(txq, tso); 9269 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM; 9270 } else { 9271 WM_Q_EVCNT_INCR(txq, tso6); 9272 *fieldsp |= NQTXD_FIELDS_TUXSM; 9273 } 9274 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT); 9275 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0); 9276 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT); 9277 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0); 9278 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT); 9279 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0); 9280 } else { 9281 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT); 9282 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0); 9283 } 9284 9285 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) { 9286 *fieldsp |= NQTXD_FIELDS_IXSM; 9287 cmdc |= NQTXC_CMD_IP4; 9288 } 9289 9290 if (m0->m_pkthdr.csum_flags & 9291 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) { 9292 WM_Q_EVCNT_INCR(txq, tusum); 9293 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) 9294 cmdc |= NQTXC_CMD_TCP; 9295 else 9296 cmdc |= NQTXC_CMD_UDP; 9297 9298 cmdc |= NQTXC_CMD_IP4; 9299 *fieldsp |= NQTXD_FIELDS_TUXSM; 9300 } 9301 if (m0->m_pkthdr.csum_flags & 9302 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) { 9303 WM_Q_EVCNT_INCR(txq, tusum6); 9304 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) 9305 cmdc |= NQTXC_CMD_TCP; 9306 else 9307 cmdc |= NQTXC_CMD_UDP; 9308 9309 cmdc |= NQTXC_CMD_IP6; 9310 *fieldsp |= NQTXD_FIELDS_TUXSM; 9311 } 9312 9313 /* 9314 * We don't have to write context descriptor for every packet to 9315 * NEWQUEUE controllers, that is 82575, 82576, 82580, I350, I354, 9316 * I210 and I211. It is enough to write once per a Tx queue for these 9317 * controllers. 9318 * It would be overhead to write context descriptor for every packet, 9319 * however it does not cause problems. 9320 */ 9321 /* Fill in the context descriptor. */ 9322 txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_vl_len = 9323 htole32(vl_len); 9324 txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_sn = 0; 9325 txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_cmd = 9326 htole32(cmdc); 9327 txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_mssidx = 9328 htole32(mssidx); 9329 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE); 9330 DPRINTF(sc, WM_DEBUG_TX, 9331 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev), 9332 txq->txq_next, 0, vl_len)); 9333 DPRINTF(sc, WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc)); 9334 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 9335 txs->txs_ndesc++; 9336 } 9337 9338 /* 9339 * wm_nq_start: [ifnet interface function] 9340 * 9341 * Start packet transmission on the interface for NEWQUEUE devices 9342 */ 9343 static void 9344 wm_nq_start(struct ifnet *ifp) 9345 { 9346 struct wm_softc *sc = ifp->if_softc; 9347 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 9348 9349 KASSERT(if_is_mpsafe(ifp)); 9350 /* 9351 * if_obytes and if_omcasts are added in if_transmit()@if.c. 9352 */ 9353 9354 mutex_enter(txq->txq_lock); 9355 if (!txq->txq_stopping) 9356 wm_nq_start_locked(ifp); 9357 mutex_exit(txq->txq_lock); 9358 } 9359 9360 static void 9361 wm_nq_start_locked(struct ifnet *ifp) 9362 { 9363 struct wm_softc *sc = ifp->if_softc; 9364 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq; 9365 9366 wm_nq_send_common_locked(ifp, txq, false); 9367 } 9368 9369 static int 9370 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m) 9371 { 9372 int qid; 9373 struct wm_softc *sc = ifp->if_softc; 9374 struct wm_txqueue *txq; 9375 9376 qid = wm_select_txqueue(ifp, m); 9377 txq = &sc->sc_queue[qid].wmq_txq; 9378 9379 if (__predict_false(!pcq_put(txq->txq_interq, m))) { 9380 m_freem(m); 9381 WM_Q_EVCNT_INCR(txq, pcqdrop); 9382 return ENOBUFS; 9383 } 9384 9385 net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 9386 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len); 9387 if (m->m_flags & M_MCAST) 9388 if_statinc_ref(nsr, if_omcasts); 9389 IF_STAT_PUTREF(ifp); 9390 9391 /* 9392 * The situations which this mutex_tryenter() fails at running time 9393 * are below two patterns. 9394 * (1) contention with interrupt handler(wm_txrxintr_msix()) 9395 * (2) contention with deferred if_start softint(wm_handle_queue()) 9396 * In the case of (1), the last packet enqueued to txq->txq_interq is 9397 * dequeued by wm_deferred_start_locked(). So, it does not get stuck. 9398 * In the case of (2), the last packet enqueued to txq->txq_interq is 9399 * also dequeued by wm_deferred_start_locked(). So, it does not get 9400 * stuck, either. 9401 */ 9402 if (mutex_tryenter(txq->txq_lock)) { 9403 if (!txq->txq_stopping) 9404 wm_nq_transmit_locked(ifp, txq); 9405 mutex_exit(txq->txq_lock); 9406 } 9407 9408 return 0; 9409 } 9410 9411 static void 9412 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq) 9413 { 9414 9415 wm_nq_send_common_locked(ifp, txq, true); 9416 } 9417 9418 static void 9419 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq, 9420 bool is_transmit) 9421 { 9422 struct wm_softc *sc = ifp->if_softc; 9423 struct mbuf *m0; 9424 struct wm_txsoft *txs; 9425 bus_dmamap_t dmamap; 9426 int error, nexttx, lasttx = -1, seg, segs_needed; 9427 bool do_csum, sent; 9428 bool remap = true; 9429 9430 KASSERT(mutex_owned(txq->txq_lock)); 9431 KASSERT(!txq->txq_stopping); 9432 9433 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0) 9434 return; 9435 9436 if (__predict_false(wm_linkdown_discard(txq))) { 9437 do { 9438 if (is_transmit) 9439 m0 = pcq_get(txq->txq_interq); 9440 else 9441 IFQ_DEQUEUE(&ifp->if_snd, m0); 9442 /* 9443 * increment successed packet counter as in the case 9444 * which the packet is discarded by link down PHY. 9445 */ 9446 if (m0 != NULL) { 9447 if_statinc(ifp, if_opackets); 9448 m_freem(m0); 9449 } 9450 } while (m0 != NULL); 9451 return; 9452 } 9453 9454 sent = false; 9455 9456 /* 9457 * Loop through the send queue, setting up transmit descriptors 9458 * until we drain the queue, or use up all available transmit 9459 * descriptors. 9460 */ 9461 for (;;) { 9462 m0 = NULL; 9463 9464 /* Get a work queue entry. */ 9465 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) { 9466 wm_txeof(txq, UINT_MAX); 9467 if (txq->txq_sfree == 0) { 9468 DPRINTF(sc, WM_DEBUG_TX, 9469 ("%s: TX: no free job descriptors\n", 9470 device_xname(sc->sc_dev))); 9471 WM_Q_EVCNT_INCR(txq, txsstall); 9472 break; 9473 } 9474 } 9475 9476 /* Grab a packet off the queue. */ 9477 if (is_transmit) 9478 m0 = pcq_get(txq->txq_interq); 9479 else 9480 IFQ_DEQUEUE(&ifp->if_snd, m0); 9481 if (m0 == NULL) 9482 break; 9483 9484 DPRINTF(sc, WM_DEBUG_TX, 9485 ("%s: TX: have packet to transmit: %p\n", 9486 device_xname(sc->sc_dev), m0)); 9487 9488 txs = &txq->txq_soft[txq->txq_snext]; 9489 dmamap = txs->txs_dmamap; 9490 9491 /* 9492 * Load the DMA map. If this fails, the packet either 9493 * didn't fit in the allotted number of segments, or we 9494 * were short on resources. For the too-many-segments 9495 * case, we simply report an error and drop the packet, 9496 * since we can't sanely copy a jumbo packet to a single 9497 * buffer. 9498 */ 9499 retry: 9500 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 9501 BUS_DMA_WRITE | BUS_DMA_NOWAIT); 9502 if (__predict_false(error)) { 9503 if (error == EFBIG) { 9504 if (remap == true) { 9505 struct mbuf *m; 9506 9507 remap = false; 9508 m = m_defrag(m0, M_NOWAIT); 9509 if (m != NULL) { 9510 WM_Q_EVCNT_INCR(txq, defrag); 9511 m0 = m; 9512 goto retry; 9513 } 9514 } 9515 WM_Q_EVCNT_INCR(txq, toomanyseg); 9516 log(LOG_ERR, "%s: Tx packet consumes too many " 9517 "DMA segments, dropping...\n", 9518 device_xname(sc->sc_dev)); 9519 wm_dump_mbuf_chain(sc, m0); 9520 m_freem(m0); 9521 continue; 9522 } 9523 /* Short on resources, just stop for now. */ 9524 DPRINTF(sc, WM_DEBUG_TX, 9525 ("%s: TX: dmamap load failed: %d\n", 9526 device_xname(sc->sc_dev), error)); 9527 break; 9528 } 9529 9530 segs_needed = dmamap->dm_nsegs; 9531 9532 /* 9533 * Ensure we have enough descriptors free to describe 9534 * the packet. Note, we always reserve one descriptor 9535 * at the end of the ring due to the semantics of the 9536 * TDT register, plus one more in the event we need 9537 * to load offload context. 9538 */ 9539 if (segs_needed > txq->txq_free - 2) { 9540 /* 9541 * Not enough free descriptors to transmit this 9542 * packet. We haven't committed anything yet, 9543 * so just unload the DMA map, put the packet 9544 * pack on the queue, and punt. Notify the upper 9545 * layer that there are no more slots left. 9546 */ 9547 DPRINTF(sc, WM_DEBUG_TX, 9548 ("%s: TX: need %d (%d) descriptors, have %d\n", 9549 device_xname(sc->sc_dev), dmamap->dm_nsegs, 9550 segs_needed, txq->txq_free - 1)); 9551 txq->txq_flags |= WM_TXQ_NO_SPACE; 9552 bus_dmamap_unload(sc->sc_dmat, dmamap); 9553 WM_Q_EVCNT_INCR(txq, txdstall); 9554 break; 9555 } 9556 9557 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */ 9558 9559 DPRINTF(sc, WM_DEBUG_TX, 9560 ("%s: TX: packet has %d (%d) DMA segments\n", 9561 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed)); 9562 9563 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]); 9564 9565 /* 9566 * Store a pointer to the packet so that we can free it 9567 * later. 9568 * 9569 * Initially, we consider the number of descriptors the 9570 * packet uses the number of DMA segments. This may be 9571 * incremented by 1 if we do checksum offload (a descriptor 9572 * is used to set the checksum context). 9573 */ 9574 txs->txs_mbuf = m0; 9575 txs->txs_firstdesc = txq->txq_next; 9576 txs->txs_ndesc = segs_needed; 9577 9578 /* Set up offload parameters for this packet. */ 9579 uint32_t cmdlen, fields, dcmdlen; 9580 if (m0->m_pkthdr.csum_flags & 9581 (M_CSUM_TSOv4 | M_CSUM_TSOv6 | 9582 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 | 9583 M_CSUM_TCPv6 | M_CSUM_UDPv6)) { 9584 wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields, 9585 &do_csum); 9586 } else { 9587 do_csum = false; 9588 cmdlen = 0; 9589 fields = 0; 9590 } 9591 9592 /* Sync the DMA map. */ 9593 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 9594 BUS_DMASYNC_PREWRITE); 9595 9596 /* Initialize the first transmit descriptor. */ 9597 nexttx = txq->txq_next; 9598 if (!do_csum) { 9599 /* Set up a legacy descriptor */ 9600 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr, 9601 dmamap->dm_segs[0].ds_addr); 9602 txq->txq_descs[nexttx].wtx_cmdlen = 9603 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len); 9604 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0; 9605 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0; 9606 if (vlan_has_tag(m0)) { 9607 txq->txq_descs[nexttx].wtx_cmdlen |= 9608 htole32(WTX_CMD_VLE); 9609 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan = 9610 htole16(vlan_get_tag(m0)); 9611 } else 9612 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0; 9613 9614 dcmdlen = 0; 9615 } else { 9616 /* Set up an advanced data descriptor */ 9617 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr = 9618 htole64(dmamap->dm_segs[0].ds_addr); 9619 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0); 9620 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen = 9621 htole32(dmamap->dm_segs[0].ds_len | cmdlen); 9622 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 9623 htole32(fields); 9624 DPRINTF(sc, WM_DEBUG_TX, 9625 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n", 9626 device_xname(sc->sc_dev), nexttx, 9627 (uint64_t)dmamap->dm_segs[0].ds_addr)); 9628 DPRINTF(sc, WM_DEBUG_TX, 9629 ("\t 0x%08x%08x\n", fields, 9630 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen)); 9631 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT; 9632 } 9633 9634 lasttx = nexttx; 9635 nexttx = WM_NEXTTX(txq, nexttx); 9636 /* 9637 * Fill in the next descriptors. Legacy or advanced format 9638 * is the same here. 9639 */ 9640 for (seg = 1; seg < dmamap->dm_nsegs; 9641 seg++, nexttx = WM_NEXTTX(txq, nexttx)) { 9642 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr = 9643 htole64(dmamap->dm_segs[seg].ds_addr); 9644 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen = 9645 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len); 9646 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0); 9647 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0; 9648 lasttx = nexttx; 9649 9650 DPRINTF(sc, WM_DEBUG_TX, 9651 ("%s: TX: desc %d: %#" PRIx64 ", len %#04zx\n", 9652 device_xname(sc->sc_dev), nexttx, 9653 (uint64_t)dmamap->dm_segs[seg].ds_addr, 9654 dmamap->dm_segs[seg].ds_len)); 9655 } 9656 9657 KASSERT(lasttx != -1); 9658 9659 /* 9660 * Set up the command byte on the last descriptor of 9661 * the packet. If we're in the interrupt delay window, 9662 * delay the interrupt. 9663 */ 9664 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) == 9665 (NQTX_CMD_EOP | NQTX_CMD_RS)); 9666 txq->txq_descs[lasttx].wtx_cmdlen |= 9667 htole32(WTX_CMD_EOP | WTX_CMD_RS); 9668 9669 txs->txs_lastdesc = lasttx; 9670 9671 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n", 9672 device_xname(sc->sc_dev), 9673 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen))); 9674 9675 /* Sync the descriptors we're using. */ 9676 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc, 9677 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 9678 9679 /* Give the packet to the chip. */ 9680 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx); 9681 sent = true; 9682 9683 DPRINTF(sc, WM_DEBUG_TX, 9684 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx)); 9685 9686 DPRINTF(sc, WM_DEBUG_TX, 9687 ("%s: TX: finished transmitting packet, job %d\n", 9688 device_xname(sc->sc_dev), txq->txq_snext)); 9689 9690 /* Advance the tx pointer. */ 9691 txq->txq_free -= txs->txs_ndesc; 9692 txq->txq_next = nexttx; 9693 9694 txq->txq_sfree--; 9695 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext); 9696 9697 /* Pass the packet to any BPF listeners. */ 9698 bpf_mtap(ifp, m0, BPF_D_OUT); 9699 } 9700 9701 if (m0 != NULL) { 9702 txq->txq_flags |= WM_TXQ_NO_SPACE; 9703 WM_Q_EVCNT_INCR(txq, descdrop); 9704 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", 9705 __func__)); 9706 m_freem(m0); 9707 } 9708 9709 if (txq->txq_sfree == 0 || txq->txq_free <= 2) { 9710 /* No more slots; notify upper layer. */ 9711 txq->txq_flags |= WM_TXQ_NO_SPACE; 9712 } 9713 9714 if (sent) { 9715 /* Set a watchdog timer in case the chip flakes out. */ 9716 txq->txq_lastsent = time_uptime; 9717 txq->txq_sending = true; 9718 } 9719 } 9720 9721 static void 9722 wm_deferred_start_locked(struct wm_txqueue *txq) 9723 { 9724 struct wm_softc *sc = txq->txq_sc; 9725 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9726 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq); 9727 int qid = wmq->wmq_id; 9728 9729 KASSERT(mutex_owned(txq->txq_lock)); 9730 KASSERT(!txq->txq_stopping); 9731 9732 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 9733 /* XXX need for ALTQ or one CPU system */ 9734 if (qid == 0) 9735 wm_nq_start_locked(ifp); 9736 wm_nq_transmit_locked(ifp, txq); 9737 } else { 9738 /* XXX need for ALTQ or one CPU system */ 9739 if (qid == 0) 9740 wm_start_locked(ifp); 9741 wm_transmit_locked(ifp, txq); 9742 } 9743 } 9744 9745 /* Interrupt */ 9746 9747 /* 9748 * wm_txeof: 9749 * 9750 * Helper; handle transmit interrupts. 9751 */ 9752 static bool 9753 wm_txeof(struct wm_txqueue *txq, u_int limit) 9754 { 9755 struct wm_softc *sc = txq->txq_sc; 9756 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9757 struct wm_txsoft *txs; 9758 int count = 0; 9759 int i; 9760 uint8_t status; 9761 bool more = false; 9762 9763 KASSERT(mutex_owned(txq->txq_lock)); 9764 9765 if (txq->txq_stopping) 9766 return false; 9767 9768 txq->txq_flags &= ~WM_TXQ_NO_SPACE; 9769 9770 /* 9771 * Go through the Tx list and free mbufs for those 9772 * frames which have been transmitted. 9773 */ 9774 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq); 9775 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) { 9776 txs = &txq->txq_soft[i]; 9777 9778 DPRINTF(sc, WM_DEBUG_TX, ("%s: TX: checking job %d\n", 9779 device_xname(sc->sc_dev), i)); 9780 9781 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc, 9782 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 9783 9784 status = 9785 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status; 9786 if ((status & WTX_ST_DD) == 0) { 9787 wm_cdtxsync(txq, txs->txs_lastdesc, 1, 9788 BUS_DMASYNC_PREREAD); 9789 break; 9790 } 9791 9792 if (limit-- == 0) { 9793 more = true; 9794 DPRINTF(sc, WM_DEBUG_TX, 9795 ("%s: TX: loop limited, job %d is not processed\n", 9796 device_xname(sc->sc_dev), i)); 9797 break; 9798 } 9799 9800 count++; 9801 DPRINTF(sc, WM_DEBUG_TX, 9802 ("%s: TX: job %d done: descs %d..%d\n", 9803 device_xname(sc->sc_dev), i, txs->txs_firstdesc, 9804 txs->txs_lastdesc)); 9805 9806 #ifdef WM_EVENT_COUNTERS 9807 if ((status & WTX_ST_TU) && (sc->sc_type <= WM_T_82544)) 9808 WM_Q_EVCNT_INCR(txq, underrun); 9809 #endif /* WM_EVENT_COUNTERS */ 9810 9811 /* 9812 * 82574 and newer's document says the status field has neither 9813 * EC (Excessive Collision) bit nor LC (Late Collision) bit 9814 * (reserved). Refer "PCIe GbE Controller Open Source Software 9815 * Developer's Manual", 82574 datasheet and newer. 9816 * 9817 * XXX I saw the LC bit was set on I218 even though the media 9818 * was full duplex, so the bit might be used for other 9819 * meaning ...(I have no document). 9820 */ 9821 9822 if (((status & (WTX_ST_EC | WTX_ST_LC)) != 0) 9823 && ((sc->sc_type < WM_T_82574) 9824 || (sc->sc_type == WM_T_80003))) { 9825 if_statinc(ifp, if_oerrors); 9826 if (status & WTX_ST_LC) 9827 log(LOG_WARNING, "%s: late collision\n", 9828 device_xname(sc->sc_dev)); 9829 else if (status & WTX_ST_EC) { 9830 if_statadd(ifp, if_collisions, 9831 TX_COLLISION_THRESHOLD + 1); 9832 log(LOG_WARNING, "%s: excessive collisions\n", 9833 device_xname(sc->sc_dev)); 9834 } 9835 } else 9836 if_statinc(ifp, if_opackets); 9837 9838 txq->txq_packets++; 9839 txq->txq_bytes += txs->txs_mbuf->m_pkthdr.len; 9840 9841 txq->txq_free += txs->txs_ndesc; 9842 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap, 9843 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); 9844 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 9845 m_freem(txs->txs_mbuf); 9846 txs->txs_mbuf = NULL; 9847 } 9848 9849 /* Update the dirty transmit buffer pointer. */ 9850 txq->txq_sdirty = i; 9851 DPRINTF(sc, WM_DEBUG_TX, 9852 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i)); 9853 9854 if (count != 0) 9855 rnd_add_uint32(&sc->rnd_source, count); 9856 9857 /* 9858 * If there are no more pending transmissions, cancel the watchdog 9859 * timer. 9860 */ 9861 if (txq->txq_sfree == WM_TXQUEUELEN(txq)) 9862 txq->txq_sending = false; 9863 9864 return more; 9865 } 9866 9867 static inline uint32_t 9868 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx) 9869 { 9870 struct wm_softc *sc = rxq->rxq_sc; 9871 9872 if (sc->sc_type == WM_T_82574) 9873 return EXTRXC_STATUS( 9874 le32toh(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat)); 9875 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9876 return NQRXC_STATUS( 9877 le32toh(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat)); 9878 else 9879 return rxq->rxq_descs[idx].wrx_status; 9880 } 9881 9882 static inline uint32_t 9883 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx) 9884 { 9885 struct wm_softc *sc = rxq->rxq_sc; 9886 9887 if (sc->sc_type == WM_T_82574) 9888 return EXTRXC_ERROR( 9889 le32toh(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat)); 9890 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9891 return NQRXC_ERROR( 9892 le32toh(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat)); 9893 else 9894 return rxq->rxq_descs[idx].wrx_errors; 9895 } 9896 9897 static inline uint16_t 9898 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx) 9899 { 9900 struct wm_softc *sc = rxq->rxq_sc; 9901 9902 if (sc->sc_type == WM_T_82574) 9903 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan; 9904 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9905 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan; 9906 else 9907 return rxq->rxq_descs[idx].wrx_special; 9908 } 9909 9910 static inline int 9911 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx) 9912 { 9913 struct wm_softc *sc = rxq->rxq_sc; 9914 9915 if (sc->sc_type == WM_T_82574) 9916 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen; 9917 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9918 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen; 9919 else 9920 return rxq->rxq_descs[idx].wrx_len; 9921 } 9922 9923 #ifdef WM_DEBUG 9924 static inline uint32_t 9925 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx) 9926 { 9927 struct wm_softc *sc = rxq->rxq_sc; 9928 9929 if (sc->sc_type == WM_T_82574) 9930 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash; 9931 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9932 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash; 9933 else 9934 return 0; 9935 } 9936 9937 static inline uint8_t 9938 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx) 9939 { 9940 struct wm_softc *sc = rxq->rxq_sc; 9941 9942 if (sc->sc_type == WM_T_82574) 9943 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq); 9944 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9945 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc); 9946 else 9947 return 0; 9948 } 9949 #endif /* WM_DEBUG */ 9950 9951 static inline bool 9952 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status, 9953 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit) 9954 { 9955 9956 if (sc->sc_type == WM_T_82574) 9957 return (status & ext_bit) != 0; 9958 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9959 return (status & nq_bit) != 0; 9960 else 9961 return (status & legacy_bit) != 0; 9962 } 9963 9964 static inline bool 9965 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error, 9966 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit) 9967 { 9968 9969 if (sc->sc_type == WM_T_82574) 9970 return (error & ext_bit) != 0; 9971 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 9972 return (error & nq_bit) != 0; 9973 else 9974 return (error & legacy_bit) != 0; 9975 } 9976 9977 static inline bool 9978 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status) 9979 { 9980 9981 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status, 9982 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP)) 9983 return true; 9984 else 9985 return false; 9986 } 9987 9988 static inline bool 9989 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors) 9990 { 9991 struct wm_softc *sc = rxq->rxq_sc; 9992 9993 /* XXX missing error bit for newqueue? */ 9994 if (wm_rxdesc_is_set_error(sc, errors, 9995 WRX_ER_CE | WRX_ER_SE | WRX_ER_SEQ | WRX_ER_CXE | WRX_ER_RXE, 9996 EXTRXC_ERROR_CE | EXTRXC_ERROR_SE | EXTRXC_ERROR_SEQ 9997 | EXTRXC_ERROR_CXE | EXTRXC_ERROR_RXE, 9998 NQRXC_ERROR_RXE)) { 9999 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE, 10000 EXTRXC_ERROR_SE, 0)) 10001 log(LOG_WARNING, "%s: symbol error\n", 10002 device_xname(sc->sc_dev)); 10003 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ, 10004 EXTRXC_ERROR_SEQ, 0)) 10005 log(LOG_WARNING, "%s: receive sequence error\n", 10006 device_xname(sc->sc_dev)); 10007 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE, 10008 EXTRXC_ERROR_CE, 0)) 10009 log(LOG_WARNING, "%s: CRC error\n", 10010 device_xname(sc->sc_dev)); 10011 return true; 10012 } 10013 10014 return false; 10015 } 10016 10017 static inline bool 10018 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status) 10019 { 10020 struct wm_softc *sc = rxq->rxq_sc; 10021 10022 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD, 10023 NQRXC_STATUS_DD)) { 10024 /* We have processed all of the receive descriptors. */ 10025 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD); 10026 return false; 10027 } 10028 10029 return true; 10030 } 10031 10032 static inline bool 10033 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status, 10034 uint16_t vlantag, struct mbuf *m) 10035 { 10036 10037 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status, 10038 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) { 10039 vlan_set_tag(m, le16toh(vlantag)); 10040 } 10041 10042 return true; 10043 } 10044 10045 static inline void 10046 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status, 10047 uint32_t errors, struct mbuf *m) 10048 { 10049 struct wm_softc *sc = rxq->rxq_sc; 10050 10051 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) { 10052 if (wm_rxdesc_is_set_status(sc, status, 10053 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) { 10054 WM_Q_EVCNT_INCR(rxq, ipsum); 10055 m->m_pkthdr.csum_flags |= M_CSUM_IPv4; 10056 if (wm_rxdesc_is_set_error(sc, errors, 10057 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE)) 10058 m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD; 10059 } 10060 if (wm_rxdesc_is_set_status(sc, status, 10061 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) { 10062 /* 10063 * Note: we don't know if this was TCP or UDP, 10064 * so we just set both bits, and expect the 10065 * upper layers to deal. 10066 */ 10067 WM_Q_EVCNT_INCR(rxq, tusum); 10068 m->m_pkthdr.csum_flags |= 10069 M_CSUM_TCPv4 | M_CSUM_UDPv4 | 10070 M_CSUM_TCPv6 | M_CSUM_UDPv6; 10071 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_TCPE, 10072 EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E)) 10073 m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD; 10074 } 10075 } 10076 } 10077 10078 /* 10079 * wm_rxeof: 10080 * 10081 * Helper; handle receive interrupts. 10082 */ 10083 static bool 10084 wm_rxeof(struct wm_rxqueue *rxq, u_int limit) 10085 { 10086 struct wm_softc *sc = rxq->rxq_sc; 10087 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 10088 struct wm_rxsoft *rxs; 10089 struct mbuf *m; 10090 int i, len; 10091 int count = 0; 10092 uint32_t status, errors; 10093 uint16_t vlantag; 10094 bool more = false; 10095 10096 KASSERT(mutex_owned(rxq->rxq_lock)); 10097 10098 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) { 10099 rxs = &rxq->rxq_soft[i]; 10100 10101 DPRINTF(sc, WM_DEBUG_RX, 10102 ("%s: RX: checking descriptor %d\n", 10103 device_xname(sc->sc_dev), i)); 10104 wm_cdrxsync(rxq, i, 10105 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 10106 10107 status = wm_rxdesc_get_status(rxq, i); 10108 errors = wm_rxdesc_get_errors(rxq, i); 10109 len = le16toh(wm_rxdesc_get_pktlen(rxq, i)); 10110 vlantag = wm_rxdesc_get_vlantag(rxq, i); 10111 #ifdef WM_DEBUG 10112 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i)); 10113 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i); 10114 #endif 10115 10116 if (!wm_rxdesc_dd(rxq, i, status)) 10117 break; 10118 10119 if (limit-- == 0) { 10120 more = true; 10121 DPRINTF(sc, WM_DEBUG_RX, 10122 ("%s: RX: loop limited, descriptor %d is not processed\n", 10123 device_xname(sc->sc_dev), i)); 10124 break; 10125 } 10126 10127 count++; 10128 if (__predict_false(rxq->rxq_discard)) { 10129 DPRINTF(sc, WM_DEBUG_RX, 10130 ("%s: RX: discarding contents of descriptor %d\n", 10131 device_xname(sc->sc_dev), i)); 10132 wm_init_rxdesc(rxq, i); 10133 if (wm_rxdesc_is_eop(rxq, status)) { 10134 /* Reset our state. */ 10135 DPRINTF(sc, WM_DEBUG_RX, 10136 ("%s: RX: resetting rxdiscard -> 0\n", 10137 device_xname(sc->sc_dev))); 10138 rxq->rxq_discard = 0; 10139 } 10140 continue; 10141 } 10142 10143 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 10144 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 10145 10146 m = rxs->rxs_mbuf; 10147 10148 /* 10149 * Add a new receive buffer to the ring, unless of 10150 * course the length is zero. Treat the latter as a 10151 * failed mapping. 10152 */ 10153 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) { 10154 /* 10155 * Failed, throw away what we've done so 10156 * far, and discard the rest of the packet. 10157 */ 10158 if_statinc(ifp, if_ierrors); 10159 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 10160 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 10161 wm_init_rxdesc(rxq, i); 10162 if (!wm_rxdesc_is_eop(rxq, status)) 10163 rxq->rxq_discard = 1; 10164 if (rxq->rxq_head != NULL) 10165 m_freem(rxq->rxq_head); 10166 WM_RXCHAIN_RESET(rxq); 10167 DPRINTF(sc, WM_DEBUG_RX, 10168 ("%s: RX: Rx buffer allocation failed, " 10169 "dropping packet%s\n", device_xname(sc->sc_dev), 10170 rxq->rxq_discard ? " (discard)" : "")); 10171 continue; 10172 } 10173 10174 m->m_len = len; 10175 rxq->rxq_len += len; 10176 DPRINTF(sc, WM_DEBUG_RX, 10177 ("%s: RX: buffer at %p len %d\n", 10178 device_xname(sc->sc_dev), m->m_data, len)); 10179 10180 /* If this is not the end of the packet, keep looking. */ 10181 if (!wm_rxdesc_is_eop(rxq, status)) { 10182 WM_RXCHAIN_LINK(rxq, m); 10183 DPRINTF(sc, WM_DEBUG_RX, 10184 ("%s: RX: not yet EOP, rxlen -> %d\n", 10185 device_xname(sc->sc_dev), rxq->rxq_len)); 10186 continue; 10187 } 10188 10189 /* 10190 * Okay, we have the entire packet now. The chip is 10191 * configured to include the FCS except I35[04], I21[01]. 10192 * (not all chips can be configured to strip it), so we need 10193 * to trim it. Those chips have an eratta, the RCTL_SECRC bit 10194 * in RCTL register is always set, so we don't trim it. 10195 * PCH2 and newer chip also not include FCS when jumbo 10196 * frame is used to do workaround an errata. 10197 * May need to adjust length of previous mbuf in the 10198 * chain if the current mbuf is too short. 10199 */ 10200 if ((sc->sc_flags & WM_F_CRC_STRIP) == 0) { 10201 if (m->m_len < ETHER_CRC_LEN) { 10202 rxq->rxq_tail->m_len 10203 -= (ETHER_CRC_LEN - m->m_len); 10204 m->m_len = 0; 10205 } else 10206 m->m_len -= ETHER_CRC_LEN; 10207 len = rxq->rxq_len - ETHER_CRC_LEN; 10208 } else 10209 len = rxq->rxq_len; 10210 10211 WM_RXCHAIN_LINK(rxq, m); 10212 10213 *rxq->rxq_tailp = NULL; 10214 m = rxq->rxq_head; 10215 10216 WM_RXCHAIN_RESET(rxq); 10217 10218 DPRINTF(sc, WM_DEBUG_RX, 10219 ("%s: RX: have entire packet, len -> %d\n", 10220 device_xname(sc->sc_dev), len)); 10221 10222 /* If an error occurred, update stats and drop the packet. */ 10223 if (wm_rxdesc_has_errors(rxq, errors)) { 10224 m_freem(m); 10225 continue; 10226 } 10227 10228 /* No errors. Receive the packet. */ 10229 m_set_rcvif(m, ifp); 10230 m->m_pkthdr.len = len; 10231 /* 10232 * TODO 10233 * should be save rsshash and rsstype to this mbuf. 10234 */ 10235 DPRINTF(sc, WM_DEBUG_RX, 10236 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n", 10237 device_xname(sc->sc_dev), rsstype, rsshash)); 10238 10239 /* 10240 * If VLANs are enabled, VLAN packets have been unwrapped 10241 * for us. Associate the tag with the packet. 10242 */ 10243 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m)) 10244 continue; 10245 10246 /* Set up checksum info for this packet. */ 10247 wm_rxdesc_ensure_checksum(rxq, status, errors, m); 10248 10249 rxq->rxq_packets++; 10250 rxq->rxq_bytes += len; 10251 /* Pass it on. */ 10252 if_percpuq_enqueue(sc->sc_ipq, m); 10253 10254 if (rxq->rxq_stopping) 10255 break; 10256 } 10257 rxq->rxq_ptr = i; 10258 10259 if (count != 0) 10260 rnd_add_uint32(&sc->rnd_source, count); 10261 10262 DPRINTF(sc, WM_DEBUG_RX, 10263 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i)); 10264 10265 return more; 10266 } 10267 10268 /* 10269 * wm_linkintr_gmii: 10270 * 10271 * Helper; handle link interrupts for GMII. 10272 */ 10273 static void 10274 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr) 10275 { 10276 device_t dev = sc->sc_dev; 10277 uint32_t status, reg; 10278 bool link; 10279 int rv; 10280 10281 KASSERT(mutex_owned(sc->sc_core_lock)); 10282 10283 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(dev), 10284 __func__)); 10285 10286 if ((icr & ICR_LSC) == 0) { 10287 if (icr & ICR_RXSEQ) 10288 DPRINTF(sc, WM_DEBUG_LINK, 10289 ("%s: LINK Receive sequence error\n", 10290 device_xname(dev))); 10291 return; 10292 } 10293 10294 /* Link status changed */ 10295 status = CSR_READ(sc, WMREG_STATUS); 10296 link = status & STATUS_LU; 10297 if (link) { 10298 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n", 10299 device_xname(dev), 10300 (status & STATUS_FD) ? "FDX" : "HDX")); 10301 if (wm_phy_need_linkdown_discard(sc)) { 10302 DPRINTF(sc, WM_DEBUG_LINK, 10303 ("%s: linkintr: Clear linkdown discard flag\n", 10304 device_xname(dev))); 10305 wm_clear_linkdown_discard(sc); 10306 } 10307 } else { 10308 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 10309 device_xname(dev))); 10310 if (wm_phy_need_linkdown_discard(sc)) { 10311 DPRINTF(sc, WM_DEBUG_LINK, 10312 ("%s: linkintr: Set linkdown discard flag\n", 10313 device_xname(dev))); 10314 wm_set_linkdown_discard(sc); 10315 } 10316 } 10317 if ((sc->sc_type == WM_T_ICH8) && (link == false)) 10318 wm_gig_downshift_workaround_ich8lan(sc); 10319 10320 if ((sc->sc_type == WM_T_ICH8) && (sc->sc_phytype == WMPHY_IGP_3)) 10321 wm_kmrn_lock_loss_workaround_ich8lan(sc); 10322 10323 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n", 10324 device_xname(dev))); 10325 mii_pollstat(&sc->sc_mii); 10326 if (sc->sc_type == WM_T_82543) { 10327 int miistatus, active; 10328 10329 /* 10330 * With 82543, we need to force speed and 10331 * duplex on the MAC equal to what the PHY 10332 * speed and duplex configuration is. 10333 */ 10334 miistatus = sc->sc_mii.mii_media_status; 10335 10336 if (miistatus & IFM_ACTIVE) { 10337 active = sc->sc_mii.mii_media_active; 10338 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD); 10339 switch (IFM_SUBTYPE(active)) { 10340 case IFM_10_T: 10341 sc->sc_ctrl |= CTRL_SPEED_10; 10342 break; 10343 case IFM_100_TX: 10344 sc->sc_ctrl |= CTRL_SPEED_100; 10345 break; 10346 case IFM_1000_T: 10347 sc->sc_ctrl |= CTRL_SPEED_1000; 10348 break; 10349 default: 10350 /* 10351 * Fiber? 10352 * Shoud not enter here. 10353 */ 10354 device_printf(dev, "unknown media (%x)\n", 10355 active); 10356 break; 10357 } 10358 if (active & IFM_FDX) 10359 sc->sc_ctrl |= CTRL_FD; 10360 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 10361 } 10362 } else if (sc->sc_type == WM_T_PCH) { 10363 wm_k1_gig_workaround_hv(sc, 10364 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0)); 10365 } 10366 10367 /* 10368 * When connected at 10Mbps half-duplex, some parts are excessively 10369 * aggressive resulting in many collisions. To avoid this, increase 10370 * the IPG and reduce Rx latency in the PHY. 10371 */ 10372 if ((sc->sc_type >= WM_T_PCH2) && (sc->sc_type <= WM_T_PCH_CNP) 10373 && link) { 10374 uint32_t tipg_reg; 10375 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED); 10376 bool fdx; 10377 uint16_t emi_addr, emi_val; 10378 10379 tipg_reg = CSR_READ(sc, WMREG_TIPG); 10380 tipg_reg &= ~TIPG_IPGT_MASK; 10381 fdx = status & STATUS_FD; 10382 10383 if (!fdx && (speed == STATUS_SPEED_10)) { 10384 tipg_reg |= 0xff; 10385 /* Reduce Rx latency in analog PHY */ 10386 emi_val = 0; 10387 } else if ((sc->sc_type >= WM_T_PCH_SPT) && 10388 fdx && speed != STATUS_SPEED_1000) { 10389 tipg_reg |= 0xc; 10390 emi_val = 1; 10391 } else { 10392 /* Roll back the default values */ 10393 tipg_reg |= 0x08; 10394 emi_val = 1; 10395 } 10396 10397 CSR_WRITE(sc, WMREG_TIPG, tipg_reg); 10398 10399 rv = sc->phy.acquire(sc); 10400 if (rv) 10401 return; 10402 10403 if (sc->sc_type == WM_T_PCH2) 10404 emi_addr = I82579_RX_CONFIG; 10405 else 10406 emi_addr = I217_RX_CONFIG; 10407 rv = wm_write_emi_reg_locked(dev, emi_addr, emi_val); 10408 10409 if (sc->sc_type >= WM_T_PCH_LPT) { 10410 uint16_t phy_reg; 10411 10412 sc->phy.readreg_locked(dev, 2, 10413 I217_PLL_CLOCK_GATE_REG, &phy_reg); 10414 phy_reg &= ~I217_PLL_CLOCK_GATE_MASK; 10415 if (speed == STATUS_SPEED_100 10416 || speed == STATUS_SPEED_10) 10417 phy_reg |= 0x3e8; 10418 else 10419 phy_reg |= 0xfa; 10420 sc->phy.writereg_locked(dev, 2, 10421 I217_PLL_CLOCK_GATE_REG, phy_reg); 10422 10423 if (speed == STATUS_SPEED_1000) { 10424 sc->phy.readreg_locked(dev, 2, 10425 HV_PM_CTRL, &phy_reg); 10426 10427 phy_reg |= HV_PM_CTRL_K1_CLK_REQ; 10428 10429 sc->phy.writereg_locked(dev, 2, 10430 HV_PM_CTRL, phy_reg); 10431 } 10432 } 10433 sc->phy.release(sc); 10434 10435 if (rv) 10436 return; 10437 10438 if (sc->sc_type >= WM_T_PCH_SPT) { 10439 uint16_t data, ptr_gap; 10440 10441 if (speed == STATUS_SPEED_1000) { 10442 rv = sc->phy.acquire(sc); 10443 if (rv) 10444 return; 10445 10446 rv = sc->phy.readreg_locked(dev, 2, 10447 I82579_UNKNOWN1, &data); 10448 if (rv) { 10449 sc->phy.release(sc); 10450 return; 10451 } 10452 10453 ptr_gap = (data & (0x3ff << 2)) >> 2; 10454 if (ptr_gap < 0x18) { 10455 data &= ~(0x3ff << 2); 10456 data |= (0x18 << 2); 10457 rv = sc->phy.writereg_locked(dev, 10458 2, I82579_UNKNOWN1, data); 10459 } 10460 sc->phy.release(sc); 10461 if (rv) 10462 return; 10463 } else { 10464 rv = sc->phy.acquire(sc); 10465 if (rv) 10466 return; 10467 10468 rv = sc->phy.writereg_locked(dev, 2, 10469 I82579_UNKNOWN1, 0xc023); 10470 sc->phy.release(sc); 10471 if (rv) 10472 return; 10473 10474 } 10475 } 10476 } 10477 10478 /* 10479 * I217 Packet Loss issue: 10480 * ensure that FEXTNVM4 Beacon Duration is set correctly 10481 * on power up. 10482 * Set the Beacon Duration for I217 to 8 usec 10483 */ 10484 if (sc->sc_type >= WM_T_PCH_LPT) { 10485 reg = CSR_READ(sc, WMREG_FEXTNVM4); 10486 reg &= ~FEXTNVM4_BEACON_DURATION; 10487 reg |= FEXTNVM4_BEACON_DURATION_8US; 10488 CSR_WRITE(sc, WMREG_FEXTNVM4, reg); 10489 } 10490 10491 /* Work-around I218 hang issue */ 10492 if ((sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM) || 10493 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V) || 10494 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM3) || 10495 (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V3)) 10496 wm_k1_workaround_lpt_lp(sc, link); 10497 10498 if (sc->sc_type >= WM_T_PCH_LPT) { 10499 /* 10500 * Set platform power management values for Latency 10501 * Tolerance Reporting (LTR) 10502 */ 10503 wm_platform_pm_pch_lpt(sc, 10504 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0)); 10505 } 10506 10507 /* Clear link partner's EEE ability */ 10508 sc->eee_lp_ability = 0; 10509 10510 /* FEXTNVM6 K1-off workaround */ 10511 if (sc->sc_type == WM_T_PCH_SPT) { 10512 reg = CSR_READ(sc, WMREG_FEXTNVM6); 10513 if (CSR_READ(sc, WMREG_PCIEANACFG) & FEXTNVM6_K1_OFF_ENABLE) 10514 reg |= FEXTNVM6_K1_OFF_ENABLE; 10515 else 10516 reg &= ~FEXTNVM6_K1_OFF_ENABLE; 10517 CSR_WRITE(sc, WMREG_FEXTNVM6, reg); 10518 } 10519 10520 if (!link) 10521 return; 10522 10523 switch (sc->sc_type) { 10524 case WM_T_PCH2: 10525 wm_k1_workaround_lv(sc); 10526 /* FALLTHROUGH */ 10527 case WM_T_PCH: 10528 if (sc->sc_phytype == WMPHY_82578) 10529 wm_link_stall_workaround_hv(sc); 10530 break; 10531 default: 10532 break; 10533 } 10534 10535 /* Enable/Disable EEE after link up */ 10536 if (sc->sc_phytype > WMPHY_82579) 10537 wm_set_eee_pchlan(sc); 10538 } 10539 10540 /* 10541 * wm_linkintr_tbi: 10542 * 10543 * Helper; handle link interrupts for TBI mode. 10544 */ 10545 static void 10546 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr) 10547 { 10548 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 10549 uint32_t status; 10550 10551 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 10552 __func__)); 10553 10554 status = CSR_READ(sc, WMREG_STATUS); 10555 if (icr & ICR_LSC) { 10556 wm_check_for_link(sc); 10557 if (status & STATUS_LU) { 10558 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n", 10559 device_xname(sc->sc_dev), 10560 (status & STATUS_FD) ? "FDX" : "HDX")); 10561 /* 10562 * NOTE: CTRL will update TFCE and RFCE automatically, 10563 * so we should update sc->sc_ctrl 10564 */ 10565 10566 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 10567 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 10568 sc->sc_fcrtl &= ~FCRTL_XONE; 10569 if (status & STATUS_FD) 10570 sc->sc_tctl |= 10571 TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 10572 else 10573 sc->sc_tctl |= 10574 TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 10575 if (sc->sc_ctrl & CTRL_TFCE) 10576 sc->sc_fcrtl |= FCRTL_XONE; 10577 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 10578 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 10579 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl); 10580 sc->sc_tbi_linkup = 1; 10581 if_link_state_change(ifp, LINK_STATE_UP); 10582 } else { 10583 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 10584 device_xname(sc->sc_dev))); 10585 sc->sc_tbi_linkup = 0; 10586 if_link_state_change(ifp, LINK_STATE_DOWN); 10587 } 10588 /* Update LED */ 10589 wm_tbi_serdes_set_linkled(sc); 10590 } else if (icr & ICR_RXSEQ) 10591 DPRINTF(sc, WM_DEBUG_LINK, 10592 ("%s: LINK: Receive sequence error\n", 10593 device_xname(sc->sc_dev))); 10594 } 10595 10596 /* 10597 * wm_linkintr_serdes: 10598 * 10599 * Helper; handle link interrupts for TBI mode. 10600 */ 10601 static void 10602 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr) 10603 { 10604 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 10605 struct mii_data *mii = &sc->sc_mii; 10606 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 10607 uint32_t pcs_adv, pcs_lpab, reg; 10608 10609 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 10610 __func__)); 10611 10612 if (icr & ICR_LSC) { 10613 /* Check PCS */ 10614 reg = CSR_READ(sc, WMREG_PCS_LSTS); 10615 if ((reg & PCS_LSTS_LINKOK) != 0) { 10616 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> up\n", 10617 device_xname(sc->sc_dev))); 10618 mii->mii_media_status |= IFM_ACTIVE; 10619 sc->sc_tbi_linkup = 1; 10620 if_link_state_change(ifp, LINK_STATE_UP); 10621 } else { 10622 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 10623 device_xname(sc->sc_dev))); 10624 mii->mii_media_status |= IFM_NONE; 10625 sc->sc_tbi_linkup = 0; 10626 if_link_state_change(ifp, LINK_STATE_DOWN); 10627 wm_tbi_serdes_set_linkled(sc); 10628 return; 10629 } 10630 mii->mii_media_active |= IFM_1000_SX; 10631 if ((reg & PCS_LSTS_FDX) != 0) 10632 mii->mii_media_active |= IFM_FDX; 10633 else 10634 mii->mii_media_active |= IFM_HDX; 10635 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 10636 /* Check flow */ 10637 reg = CSR_READ(sc, WMREG_PCS_LSTS); 10638 if ((reg & PCS_LSTS_AN_COMP) == 0) { 10639 DPRINTF(sc, WM_DEBUG_LINK, 10640 ("XXX LINKOK but not ACOMP\n")); 10641 return; 10642 } 10643 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV); 10644 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB); 10645 DPRINTF(sc, WM_DEBUG_LINK, 10646 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab)); 10647 if ((pcs_adv & TXCW_SYM_PAUSE) 10648 && (pcs_lpab & TXCW_SYM_PAUSE)) { 10649 mii->mii_media_active |= IFM_FLOW 10650 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 10651 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0) 10652 && (pcs_adv & TXCW_ASYM_PAUSE) 10653 && (pcs_lpab & TXCW_SYM_PAUSE) 10654 && (pcs_lpab & TXCW_ASYM_PAUSE)) 10655 mii->mii_media_active |= IFM_FLOW 10656 | IFM_ETH_TXPAUSE; 10657 else if ((pcs_adv & TXCW_SYM_PAUSE) 10658 && (pcs_adv & TXCW_ASYM_PAUSE) 10659 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0) 10660 && (pcs_lpab & TXCW_ASYM_PAUSE)) 10661 mii->mii_media_active |= IFM_FLOW 10662 | IFM_ETH_RXPAUSE; 10663 } 10664 /* Update LED */ 10665 wm_tbi_serdes_set_linkled(sc); 10666 } else 10667 DPRINTF(sc, WM_DEBUG_LINK, 10668 ("%s: LINK: Receive sequence error\n", 10669 device_xname(sc->sc_dev))); 10670 } 10671 10672 /* 10673 * wm_linkintr: 10674 * 10675 * Helper; handle link interrupts. 10676 */ 10677 static void 10678 wm_linkintr(struct wm_softc *sc, uint32_t icr) 10679 { 10680 10681 KASSERT(mutex_owned(sc->sc_core_lock)); 10682 10683 if (sc->sc_flags & WM_F_HAS_MII) 10684 wm_linkintr_gmii(sc, icr); 10685 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES) 10686 && ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211))) 10687 wm_linkintr_serdes(sc, icr); 10688 else 10689 wm_linkintr_tbi(sc, icr); 10690 } 10691 10692 10693 static inline void 10694 wm_sched_handle_queue(struct wm_softc *sc, struct wm_queue *wmq) 10695 { 10696 10697 if (wmq->wmq_txrx_use_workqueue) { 10698 if (!wmq->wmq_wq_enqueued) { 10699 wmq->wmq_wq_enqueued = true; 10700 workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie, 10701 curcpu()); 10702 } 10703 } else 10704 softint_schedule(wmq->wmq_si); 10705 } 10706 10707 static inline void 10708 wm_legacy_intr_disable(struct wm_softc *sc) 10709 { 10710 10711 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 10712 } 10713 10714 static inline void 10715 wm_legacy_intr_enable(struct wm_softc *sc) 10716 { 10717 10718 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr); 10719 } 10720 10721 /* 10722 * wm_intr_legacy: 10723 * 10724 * Interrupt service routine for INTx and MSI. 10725 */ 10726 static int 10727 wm_intr_legacy(void *arg) 10728 { 10729 struct wm_softc *sc = arg; 10730 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 10731 struct wm_queue *wmq = &sc->sc_queue[0]; 10732 struct wm_txqueue *txq = &wmq->wmq_txq; 10733 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 10734 u_int txlimit = sc->sc_tx_intr_process_limit; 10735 u_int rxlimit = sc->sc_rx_intr_process_limit; 10736 uint32_t icr, rndval = 0; 10737 bool more = false; 10738 10739 icr = CSR_READ(sc, WMREG_ICR); 10740 if ((icr & sc->sc_icr) == 0) 10741 return 0; 10742 10743 DPRINTF(sc, WM_DEBUG_TX, 10744 ("%s: INTx: got intr\n",device_xname(sc->sc_dev))); 10745 if (rndval == 0) 10746 rndval = icr; 10747 10748 mutex_enter(txq->txq_lock); 10749 10750 if (txq->txq_stopping) { 10751 mutex_exit(txq->txq_lock); 10752 return 1; 10753 } 10754 10755 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS) 10756 if (icr & ICR_TXDW) { 10757 DPRINTF(sc, WM_DEBUG_TX, 10758 ("%s: TX: got TXDW interrupt\n", 10759 device_xname(sc->sc_dev))); 10760 WM_Q_EVCNT_INCR(txq, txdw); 10761 } 10762 #endif 10763 if (txlimit > 0) { 10764 more |= wm_txeof(txq, txlimit); 10765 if (!IF_IS_EMPTY(&ifp->if_snd)) 10766 more = true; 10767 } else 10768 more = true; 10769 mutex_exit(txq->txq_lock); 10770 10771 mutex_enter(rxq->rxq_lock); 10772 10773 if (rxq->rxq_stopping) { 10774 mutex_exit(rxq->rxq_lock); 10775 return 1; 10776 } 10777 10778 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS) 10779 if (icr & (ICR_RXDMT0 | ICR_RXT0)) { 10780 DPRINTF(sc, WM_DEBUG_RX, 10781 ("%s: RX: got Rx intr %#" __PRIxBIT "\n", 10782 device_xname(sc->sc_dev), 10783 icr & (ICR_RXDMT0 | ICR_RXT0))); 10784 WM_Q_EVCNT_INCR(rxq, intr); 10785 } 10786 #endif 10787 if (rxlimit > 0) { 10788 /* 10789 * wm_rxeof() does *not* call upper layer functions directly, 10790 * as if_percpuq_enqueue() just call softint_schedule(). 10791 * So, we can call wm_rxeof() in interrupt context. 10792 */ 10793 more = wm_rxeof(rxq, rxlimit); 10794 } else 10795 more = true; 10796 10797 mutex_exit(rxq->rxq_lock); 10798 10799 mutex_enter(sc->sc_core_lock); 10800 10801 if (sc->sc_core_stopping) { 10802 mutex_exit(sc->sc_core_lock); 10803 return 1; 10804 } 10805 10806 if (icr & (ICR_LSC | ICR_RXSEQ)) { 10807 WM_EVCNT_INCR(&sc->sc_ev_linkintr); 10808 wm_linkintr(sc, icr); 10809 } 10810 if ((icr & ICR_GPI(0)) != 0) 10811 device_printf(sc->sc_dev, "got module interrupt\n"); 10812 10813 mutex_exit(sc->sc_core_lock); 10814 10815 if (icr & ICR_RXO) { 10816 #if defined(WM_DEBUG) 10817 log(LOG_WARNING, "%s: Receive overrun\n", 10818 device_xname(sc->sc_dev)); 10819 #endif /* defined(WM_DEBUG) */ 10820 } 10821 10822 rnd_add_uint32(&sc->rnd_source, rndval); 10823 10824 if (more) { 10825 /* Try to get more packets going. */ 10826 wm_legacy_intr_disable(sc); 10827 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue; 10828 wm_sched_handle_queue(sc, wmq); 10829 } 10830 10831 return 1; 10832 } 10833 10834 static inline void 10835 wm_txrxintr_disable(struct wm_queue *wmq) 10836 { 10837 struct wm_softc *sc = wmq->wmq_txq.txq_sc; 10838 10839 if (__predict_false(!wm_is_using_msix(sc))) { 10840 wm_legacy_intr_disable(sc); 10841 return; 10842 } 10843 10844 if (sc->sc_type == WM_T_82574) 10845 CSR_WRITE(sc, WMREG_IMC, 10846 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id)); 10847 else if (sc->sc_type == WM_T_82575) 10848 CSR_WRITE(sc, WMREG_EIMC, 10849 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id)); 10850 else 10851 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx); 10852 } 10853 10854 static inline void 10855 wm_txrxintr_enable(struct wm_queue *wmq) 10856 { 10857 struct wm_softc *sc = wmq->wmq_txq.txq_sc; 10858 10859 wm_itrs_calculate(sc, wmq); 10860 10861 if (__predict_false(!wm_is_using_msix(sc))) { 10862 wm_legacy_intr_enable(sc); 10863 return; 10864 } 10865 10866 /* 10867 * ICR_OTHER which is disabled in wm_linkintr_msix() is enabled here. 10868 * There is no need to care about which of RXQ(0) and RXQ(1) enable 10869 * ICR_OTHER in first, because each RXQ/TXQ interrupt is disabled 10870 * while each wm_handle_queue(wmq) is runnig. 10871 */ 10872 if (sc->sc_type == WM_T_82574) 10873 CSR_WRITE(sc, WMREG_IMS, 10874 ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id) | ICR_OTHER); 10875 else if (sc->sc_type == WM_T_82575) 10876 CSR_WRITE(sc, WMREG_EIMS, 10877 EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id)); 10878 else 10879 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx); 10880 } 10881 10882 static int 10883 wm_txrxintr_msix(void *arg) 10884 { 10885 struct wm_queue *wmq = arg; 10886 struct wm_txqueue *txq = &wmq->wmq_txq; 10887 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 10888 struct wm_softc *sc = txq->txq_sc; 10889 u_int txlimit = sc->sc_tx_intr_process_limit; 10890 u_int rxlimit = sc->sc_rx_intr_process_limit; 10891 bool txmore; 10892 bool rxmore; 10893 10894 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id); 10895 10896 DPRINTF(sc, WM_DEBUG_TX, 10897 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev))); 10898 10899 wm_txrxintr_disable(wmq); 10900 10901 mutex_enter(txq->txq_lock); 10902 10903 if (txq->txq_stopping) { 10904 mutex_exit(txq->txq_lock); 10905 return 1; 10906 } 10907 10908 WM_Q_EVCNT_INCR(txq, txdw); 10909 if (txlimit > 0) { 10910 txmore = wm_txeof(txq, txlimit); 10911 /* wm_deferred start() is done in wm_handle_queue(). */ 10912 } else 10913 txmore = true; 10914 mutex_exit(txq->txq_lock); 10915 10916 DPRINTF(sc, WM_DEBUG_RX, 10917 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev))); 10918 mutex_enter(rxq->rxq_lock); 10919 10920 if (rxq->rxq_stopping) { 10921 mutex_exit(rxq->rxq_lock); 10922 return 1; 10923 } 10924 10925 WM_Q_EVCNT_INCR(rxq, intr); 10926 if (rxlimit > 0) { 10927 rxmore = wm_rxeof(rxq, rxlimit); 10928 } else 10929 rxmore = true; 10930 mutex_exit(rxq->rxq_lock); 10931 10932 wm_itrs_writereg(sc, wmq); 10933 10934 if (txmore || rxmore) { 10935 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue; 10936 wm_sched_handle_queue(sc, wmq); 10937 } else 10938 wm_txrxintr_enable(wmq); 10939 10940 return 1; 10941 } 10942 10943 static void 10944 wm_handle_queue(void *arg) 10945 { 10946 struct wm_queue *wmq = arg; 10947 struct wm_txqueue *txq = &wmq->wmq_txq; 10948 struct wm_rxqueue *rxq = &wmq->wmq_rxq; 10949 struct wm_softc *sc = txq->txq_sc; 10950 u_int txlimit = sc->sc_tx_process_limit; 10951 u_int rxlimit = sc->sc_rx_process_limit; 10952 bool txmore; 10953 bool rxmore; 10954 10955 mutex_enter(txq->txq_lock); 10956 if (txq->txq_stopping) { 10957 mutex_exit(txq->txq_lock); 10958 return; 10959 } 10960 txmore = wm_txeof(txq, txlimit); 10961 wm_deferred_start_locked(txq); 10962 mutex_exit(txq->txq_lock); 10963 10964 mutex_enter(rxq->rxq_lock); 10965 if (rxq->rxq_stopping) { 10966 mutex_exit(rxq->rxq_lock); 10967 return; 10968 } 10969 WM_Q_EVCNT_INCR(rxq, defer); 10970 rxmore = wm_rxeof(rxq, rxlimit); 10971 mutex_exit(rxq->rxq_lock); 10972 10973 if (txmore || rxmore) { 10974 wmq->wmq_txrx_use_workqueue = sc->sc_txrx_use_workqueue; 10975 wm_sched_handle_queue(sc, wmq); 10976 } else 10977 wm_txrxintr_enable(wmq); 10978 } 10979 10980 static void 10981 wm_handle_queue_work(struct work *wk, void *context) 10982 { 10983 struct wm_queue *wmq = container_of(wk, struct wm_queue, wmq_cookie); 10984 10985 /* 10986 * Some qemu environment workaround. They don't stop interrupt 10987 * immediately. 10988 */ 10989 wmq->wmq_wq_enqueued = false; 10990 wm_handle_queue(wmq); 10991 } 10992 10993 /* 10994 * wm_linkintr_msix: 10995 * 10996 * Interrupt service routine for link status change for MSI-X. 10997 */ 10998 static int 10999 wm_linkintr_msix(void *arg) 11000 { 11001 struct wm_softc *sc = arg; 11002 uint32_t reg; 11003 bool has_rxo; 11004 11005 reg = CSR_READ(sc, WMREG_ICR); 11006 mutex_enter(sc->sc_core_lock); 11007 DPRINTF(sc, WM_DEBUG_LINK, 11008 ("%s: LINK: got link intr. ICR = %08x\n", 11009 device_xname(sc->sc_dev), reg)); 11010 11011 if (sc->sc_core_stopping) 11012 goto out; 11013 11014 if ((reg & ICR_LSC) != 0) { 11015 WM_EVCNT_INCR(&sc->sc_ev_linkintr); 11016 wm_linkintr(sc, ICR_LSC); 11017 } 11018 if ((reg & ICR_GPI(0)) != 0) 11019 device_printf(sc->sc_dev, "got module interrupt\n"); 11020 11021 /* 11022 * XXX 82574 MSI-X mode workaround 11023 * 11024 * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER 11025 * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor 11026 * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1) 11027 * interrupts by writing WMREG_ICS to process receive packets. 11028 */ 11029 if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) { 11030 #if defined(WM_DEBUG) 11031 log(LOG_WARNING, "%s: Receive overrun\n", 11032 device_xname(sc->sc_dev)); 11033 #endif /* defined(WM_DEBUG) */ 11034 11035 has_rxo = true; 11036 /* 11037 * The RXO interrupt is very high rate when receive traffic is 11038 * high rate. We use polling mode for ICR_OTHER like Tx/Rx 11039 * interrupts. ICR_OTHER will be enabled at the end of 11040 * wm_txrxintr_msix() which is kicked by both ICR_RXQ(0) and 11041 * ICR_RXQ(1) interrupts. 11042 */ 11043 CSR_WRITE(sc, WMREG_IMC, ICR_OTHER); 11044 11045 CSR_WRITE(sc, WMREG_ICS, ICR_RXQ(0) | ICR_RXQ(1)); 11046 } 11047 11048 11049 11050 out: 11051 mutex_exit(sc->sc_core_lock); 11052 11053 if (sc->sc_type == WM_T_82574) { 11054 if (!has_rxo) 11055 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC); 11056 else 11057 CSR_WRITE(sc, WMREG_IMS, ICR_LSC); 11058 } else if (sc->sc_type == WM_T_82575) 11059 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER); 11060 else 11061 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx); 11062 11063 return 1; 11064 } 11065 11066 /* 11067 * Media related. 11068 * GMII, SGMII, TBI (and SERDES) 11069 */ 11070 11071 /* Common */ 11072 11073 /* 11074 * wm_tbi_serdes_set_linkled: 11075 * 11076 * Update the link LED on TBI and SERDES devices. 11077 */ 11078 static void 11079 wm_tbi_serdes_set_linkled(struct wm_softc *sc) 11080 { 11081 11082 if (sc->sc_tbi_linkup) 11083 sc->sc_ctrl |= CTRL_SWDPIN(0); 11084 else 11085 sc->sc_ctrl &= ~CTRL_SWDPIN(0); 11086 11087 /* 82540 or newer devices are active low */ 11088 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0; 11089 11090 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11091 } 11092 11093 /* GMII related */ 11094 11095 /* 11096 * wm_gmii_reset: 11097 * 11098 * Reset the PHY. 11099 */ 11100 static void 11101 wm_gmii_reset(struct wm_softc *sc) 11102 { 11103 uint32_t reg; 11104 int rv; 11105 11106 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 11107 device_xname(sc->sc_dev), __func__)); 11108 11109 rv = sc->phy.acquire(sc); 11110 if (rv != 0) { 11111 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 11112 __func__); 11113 return; 11114 } 11115 11116 switch (sc->sc_type) { 11117 case WM_T_82542_2_0: 11118 case WM_T_82542_2_1: 11119 /* null */ 11120 break; 11121 case WM_T_82543: 11122 /* 11123 * With 82543, we need to force speed and duplex on the MAC 11124 * equal to what the PHY speed and duplex configuration is. 11125 * In addition, we need to perform a hardware reset on the PHY 11126 * to take it out of reset. 11127 */ 11128 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX; 11129 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11130 11131 /* The PHY reset pin is active-low. */ 11132 reg = CSR_READ(sc, WMREG_CTRL_EXT); 11133 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) | 11134 CTRL_EXT_SWDPIN(4)); 11135 reg |= CTRL_EXT_SWDPIO(4); 11136 11137 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 11138 CSR_WRITE_FLUSH(sc); 11139 delay(10*1000); 11140 11141 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4)); 11142 CSR_WRITE_FLUSH(sc); 11143 delay(150); 11144 #if 0 11145 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4); 11146 #endif 11147 delay(20*1000); /* XXX extra delay to get PHY ID? */ 11148 break; 11149 case WM_T_82544: /* Reset 10000us */ 11150 case WM_T_82540: 11151 case WM_T_82545: 11152 case WM_T_82545_3: 11153 case WM_T_82546: 11154 case WM_T_82546_3: 11155 case WM_T_82541: 11156 case WM_T_82541_2: 11157 case WM_T_82547: 11158 case WM_T_82547_2: 11159 case WM_T_82571: /* Reset 100us */ 11160 case WM_T_82572: 11161 case WM_T_82573: 11162 case WM_T_82574: 11163 case WM_T_82575: 11164 case WM_T_82576: 11165 case WM_T_82580: 11166 case WM_T_I350: 11167 case WM_T_I354: 11168 case WM_T_I210: 11169 case WM_T_I211: 11170 case WM_T_82583: 11171 case WM_T_80003: 11172 /* Generic reset */ 11173 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 11174 CSR_WRITE_FLUSH(sc); 11175 delay(20000); 11176 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11177 CSR_WRITE_FLUSH(sc); 11178 delay(20000); 11179 11180 if ((sc->sc_type == WM_T_82541) 11181 || (sc->sc_type == WM_T_82541_2) 11182 || (sc->sc_type == WM_T_82547) 11183 || (sc->sc_type == WM_T_82547_2)) { 11184 /* Workaround for igp are done in igp_reset() */ 11185 /* XXX add code to set LED after phy reset */ 11186 } 11187 break; 11188 case WM_T_ICH8: 11189 case WM_T_ICH9: 11190 case WM_T_ICH10: 11191 case WM_T_PCH: 11192 case WM_T_PCH2: 11193 case WM_T_PCH_LPT: 11194 case WM_T_PCH_SPT: 11195 case WM_T_PCH_CNP: 11196 /* Generic reset */ 11197 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 11198 CSR_WRITE_FLUSH(sc); 11199 delay(100); 11200 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11201 CSR_WRITE_FLUSH(sc); 11202 delay(150); 11203 break; 11204 default: 11205 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 11206 __func__); 11207 break; 11208 } 11209 11210 sc->phy.release(sc); 11211 11212 /* get_cfg_done */ 11213 wm_get_cfg_done(sc); 11214 11215 /* Extra setup */ 11216 switch (sc->sc_type) { 11217 case WM_T_82542_2_0: 11218 case WM_T_82542_2_1: 11219 case WM_T_82543: 11220 case WM_T_82544: 11221 case WM_T_82540: 11222 case WM_T_82545: 11223 case WM_T_82545_3: 11224 case WM_T_82546: 11225 case WM_T_82546_3: 11226 case WM_T_82541_2: 11227 case WM_T_82547_2: 11228 case WM_T_82571: 11229 case WM_T_82572: 11230 case WM_T_82573: 11231 case WM_T_82574: 11232 case WM_T_82583: 11233 case WM_T_82575: 11234 case WM_T_82576: 11235 case WM_T_82580: 11236 case WM_T_I350: 11237 case WM_T_I354: 11238 case WM_T_I210: 11239 case WM_T_I211: 11240 case WM_T_80003: 11241 /* Null */ 11242 break; 11243 case WM_T_82541: 11244 case WM_T_82547: 11245 /* XXX Configure actively LED after PHY reset */ 11246 break; 11247 case WM_T_ICH8: 11248 case WM_T_ICH9: 11249 case WM_T_ICH10: 11250 case WM_T_PCH: 11251 case WM_T_PCH2: 11252 case WM_T_PCH_LPT: 11253 case WM_T_PCH_SPT: 11254 case WM_T_PCH_CNP: 11255 wm_phy_post_reset(sc); 11256 break; 11257 default: 11258 panic("%s: unknown type\n", __func__); 11259 break; 11260 } 11261 } 11262 11263 /* 11264 * Set up sc_phytype and mii_{read|write}reg. 11265 * 11266 * To identify PHY type, correct read/write function should be selected. 11267 * To select correct read/write function, PCI ID or MAC type are required 11268 * without accessing PHY registers. 11269 * 11270 * On the first call of this function, PHY ID is not known yet. Check 11271 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the 11272 * result might be incorrect. 11273 * 11274 * In the second call, PHY OUI and model is used to identify PHY type. 11275 * It might not be perfect because of the lack of compared entry, but it 11276 * would be better than the first call. 11277 * 11278 * If the detected new result and previous assumption is different, 11279 * a diagnostic message will be printed. 11280 */ 11281 static void 11282 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui, 11283 uint16_t phy_model) 11284 { 11285 device_t dev = sc->sc_dev; 11286 struct mii_data *mii = &sc->sc_mii; 11287 uint16_t new_phytype = WMPHY_UNKNOWN; 11288 uint16_t doubt_phytype = WMPHY_UNKNOWN; 11289 mii_readreg_t new_readreg; 11290 mii_writereg_t new_writereg; 11291 bool dodiag = true; 11292 11293 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 11294 device_xname(sc->sc_dev), __func__)); 11295 11296 /* 11297 * 1000BASE-T SFP uses SGMII and the first asumed PHY type is always 11298 * incorrect. So don't print diag output when it's 2nd call. 11299 */ 11300 if ((sc->sc_sfptype != 0) && (phy_oui == 0) && (phy_model == 0)) 11301 dodiag = false; 11302 11303 if (mii->mii_readreg == NULL) { 11304 /* 11305 * This is the first call of this function. For ICH and PCH 11306 * variants, it's difficult to determine the PHY access method 11307 * by sc_type, so use the PCI product ID for some devices. 11308 */ 11309 11310 switch (sc->sc_pcidevid) { 11311 case PCI_PRODUCT_INTEL_PCH_M_LM: 11312 case PCI_PRODUCT_INTEL_PCH_M_LC: 11313 /* 82577 */ 11314 new_phytype = WMPHY_82577; 11315 break; 11316 case PCI_PRODUCT_INTEL_PCH_D_DM: 11317 case PCI_PRODUCT_INTEL_PCH_D_DC: 11318 /* 82578 */ 11319 new_phytype = WMPHY_82578; 11320 break; 11321 case PCI_PRODUCT_INTEL_PCH2_LV_LM: 11322 case PCI_PRODUCT_INTEL_PCH2_LV_V: 11323 /* 82579 */ 11324 new_phytype = WMPHY_82579; 11325 break; 11326 case PCI_PRODUCT_INTEL_82801H_82567V_3: 11327 case PCI_PRODUCT_INTEL_82801I_BM: 11328 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */ 11329 case PCI_PRODUCT_INTEL_82801J_R_BM_LM: 11330 case PCI_PRODUCT_INTEL_82801J_R_BM_LF: 11331 case PCI_PRODUCT_INTEL_82801J_D_BM_LM: 11332 case PCI_PRODUCT_INTEL_82801J_D_BM_LF: 11333 case PCI_PRODUCT_INTEL_82801J_R_BM_V: 11334 /* ICH8, 9, 10 with 82567 */ 11335 new_phytype = WMPHY_BM; 11336 break; 11337 default: 11338 break; 11339 } 11340 } else { 11341 /* It's not the first call. Use PHY OUI and model */ 11342 switch (phy_oui) { 11343 case MII_OUI_ATTANSIC: /* atphy(4) */ 11344 switch (phy_model) { 11345 case MII_MODEL_ATTANSIC_AR8021: 11346 new_phytype = WMPHY_82578; 11347 break; 11348 default: 11349 break; 11350 } 11351 break; 11352 case MII_OUI_xxMARVELL: 11353 switch (phy_model) { 11354 case MII_MODEL_xxMARVELL_I210: 11355 new_phytype = WMPHY_I210; 11356 break; 11357 case MII_MODEL_xxMARVELL_E1011: 11358 case MII_MODEL_xxMARVELL_E1000_3: 11359 case MII_MODEL_xxMARVELL_E1000_5: 11360 case MII_MODEL_xxMARVELL_E1112: 11361 new_phytype = WMPHY_M88; 11362 break; 11363 case MII_MODEL_xxMARVELL_E1149: 11364 new_phytype = WMPHY_BM; 11365 break; 11366 case MII_MODEL_xxMARVELL_E1111: 11367 case MII_MODEL_xxMARVELL_I347: 11368 case MII_MODEL_xxMARVELL_E1512: 11369 case MII_MODEL_xxMARVELL_E1340M: 11370 case MII_MODEL_xxMARVELL_E1543: 11371 new_phytype = WMPHY_M88; 11372 break; 11373 case MII_MODEL_xxMARVELL_I82563: 11374 new_phytype = WMPHY_GG82563; 11375 break; 11376 default: 11377 break; 11378 } 11379 break; 11380 case MII_OUI_INTEL: 11381 switch (phy_model) { 11382 case MII_MODEL_INTEL_I82577: 11383 new_phytype = WMPHY_82577; 11384 break; 11385 case MII_MODEL_INTEL_I82579: 11386 new_phytype = WMPHY_82579; 11387 break; 11388 case MII_MODEL_INTEL_I217: 11389 new_phytype = WMPHY_I217; 11390 break; 11391 case MII_MODEL_INTEL_I82580: 11392 new_phytype = WMPHY_82580; 11393 break; 11394 case MII_MODEL_INTEL_I350: 11395 new_phytype = WMPHY_I350; 11396 break; 11397 default: 11398 break; 11399 } 11400 break; 11401 case MII_OUI_yyINTEL: 11402 switch (phy_model) { 11403 case MII_MODEL_yyINTEL_I82562G: 11404 case MII_MODEL_yyINTEL_I82562EM: 11405 case MII_MODEL_yyINTEL_I82562ET: 11406 new_phytype = WMPHY_IFE; 11407 break; 11408 case MII_MODEL_yyINTEL_IGP01E1000: 11409 new_phytype = WMPHY_IGP; 11410 break; 11411 case MII_MODEL_yyINTEL_I82566: 11412 new_phytype = WMPHY_IGP_3; 11413 break; 11414 default: 11415 break; 11416 } 11417 break; 11418 default: 11419 break; 11420 } 11421 11422 if (dodiag) { 11423 if (new_phytype == WMPHY_UNKNOWN) 11424 aprint_verbose_dev(dev, 11425 "%s: Unknown PHY model. OUI=%06x, " 11426 "model=%04x\n", __func__, phy_oui, 11427 phy_model); 11428 11429 if ((sc->sc_phytype != WMPHY_UNKNOWN) 11430 && (sc->sc_phytype != new_phytype)) { 11431 aprint_error_dev(dev, "Previously assumed PHY " 11432 "type(%u) was incorrect. PHY type from PHY" 11433 "ID = %u\n", sc->sc_phytype, new_phytype); 11434 } 11435 } 11436 } 11437 11438 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */ 11439 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) { 11440 /* SGMII */ 11441 new_readreg = wm_sgmii_readreg; 11442 new_writereg = wm_sgmii_writereg; 11443 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){ 11444 /* BM2 (phyaddr == 1) */ 11445 if ((sc->sc_phytype != WMPHY_UNKNOWN) 11446 && (new_phytype != WMPHY_BM) 11447 && (new_phytype != WMPHY_UNKNOWN)) 11448 doubt_phytype = new_phytype; 11449 new_phytype = WMPHY_BM; 11450 new_readreg = wm_gmii_bm_readreg; 11451 new_writereg = wm_gmii_bm_writereg; 11452 } else if (sc->sc_type >= WM_T_PCH) { 11453 /* All PCH* use _hv_ */ 11454 new_readreg = wm_gmii_hv_readreg; 11455 new_writereg = wm_gmii_hv_writereg; 11456 } else if (sc->sc_type >= WM_T_ICH8) { 11457 /* non-82567 ICH8, 9 and 10 */ 11458 new_readreg = wm_gmii_i82544_readreg; 11459 new_writereg = wm_gmii_i82544_writereg; 11460 } else if (sc->sc_type >= WM_T_80003) { 11461 /* 80003 */ 11462 if ((sc->sc_phytype != WMPHY_UNKNOWN) 11463 && (new_phytype != WMPHY_GG82563) 11464 && (new_phytype != WMPHY_UNKNOWN)) 11465 doubt_phytype = new_phytype; 11466 new_phytype = WMPHY_GG82563; 11467 new_readreg = wm_gmii_i80003_readreg; 11468 new_writereg = wm_gmii_i80003_writereg; 11469 } else if (sc->sc_type >= WM_T_I210) { 11470 /* I210 and I211 */ 11471 if ((sc->sc_phytype != WMPHY_UNKNOWN) 11472 && (new_phytype != WMPHY_I210) 11473 && (new_phytype != WMPHY_UNKNOWN)) 11474 doubt_phytype = new_phytype; 11475 new_phytype = WMPHY_I210; 11476 new_readreg = wm_gmii_gs40g_readreg; 11477 new_writereg = wm_gmii_gs40g_writereg; 11478 } else if (sc->sc_type >= WM_T_82580) { 11479 /* 82580, I350 and I354 */ 11480 new_readreg = wm_gmii_82580_readreg; 11481 new_writereg = wm_gmii_82580_writereg; 11482 } else if (sc->sc_type >= WM_T_82544) { 11483 /* 82544, 0, [56], [17], 8257[1234] and 82583 */ 11484 new_readreg = wm_gmii_i82544_readreg; 11485 new_writereg = wm_gmii_i82544_writereg; 11486 } else { 11487 new_readreg = wm_gmii_i82543_readreg; 11488 new_writereg = wm_gmii_i82543_writereg; 11489 } 11490 11491 if (new_phytype == WMPHY_BM) { 11492 /* All BM use _bm_ */ 11493 new_readreg = wm_gmii_bm_readreg; 11494 new_writereg = wm_gmii_bm_writereg; 11495 } 11496 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_CNP)) { 11497 /* All PCH* use _hv_ */ 11498 new_readreg = wm_gmii_hv_readreg; 11499 new_writereg = wm_gmii_hv_writereg; 11500 } 11501 11502 /* Diag output */ 11503 if (dodiag) { 11504 if (doubt_phytype != WMPHY_UNKNOWN) 11505 aprint_error_dev(dev, "Assumed new PHY type was " 11506 "incorrect. old = %u, new = %u\n", sc->sc_phytype, 11507 new_phytype); 11508 else if ((sc->sc_phytype != WMPHY_UNKNOWN) 11509 && (sc->sc_phytype != new_phytype)) 11510 aprint_error_dev(dev, "Previously assumed PHY type(%u)" 11511 "was incorrect. New PHY type = %u\n", 11512 sc->sc_phytype, new_phytype); 11513 11514 if ((mii->mii_readreg != NULL) && 11515 (new_phytype == WMPHY_UNKNOWN)) 11516 aprint_error_dev(dev, "PHY type is still unknown.\n"); 11517 11518 if ((mii->mii_readreg != NULL) && 11519 (mii->mii_readreg != new_readreg)) 11520 aprint_error_dev(dev, "Previously assumed PHY " 11521 "read/write function was incorrect.\n"); 11522 } 11523 11524 /* Update now */ 11525 sc->sc_phytype = new_phytype; 11526 mii->mii_readreg = new_readreg; 11527 mii->mii_writereg = new_writereg; 11528 if (new_readreg == wm_gmii_hv_readreg) { 11529 sc->phy.readreg_locked = wm_gmii_hv_readreg_locked; 11530 sc->phy.writereg_locked = wm_gmii_hv_writereg_locked; 11531 } else if (new_readreg == wm_sgmii_readreg) { 11532 sc->phy.readreg_locked = wm_sgmii_readreg_locked; 11533 sc->phy.writereg_locked = wm_sgmii_writereg_locked; 11534 } else if (new_readreg == wm_gmii_i82544_readreg) { 11535 sc->phy.readreg_locked = wm_gmii_i82544_readreg_locked; 11536 sc->phy.writereg_locked = wm_gmii_i82544_writereg_locked; 11537 } 11538 } 11539 11540 /* 11541 * wm_get_phy_id_82575: 11542 * 11543 * Return PHY ID. Return -1 if it failed. 11544 */ 11545 static int 11546 wm_get_phy_id_82575(struct wm_softc *sc) 11547 { 11548 uint32_t reg; 11549 int phyid = -1; 11550 11551 /* XXX */ 11552 if ((sc->sc_flags & WM_F_SGMII) == 0) 11553 return -1; 11554 11555 if (wm_sgmii_uses_mdio(sc)) { 11556 switch (sc->sc_type) { 11557 case WM_T_82575: 11558 case WM_T_82576: 11559 reg = CSR_READ(sc, WMREG_MDIC); 11560 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT; 11561 break; 11562 case WM_T_82580: 11563 case WM_T_I350: 11564 case WM_T_I354: 11565 case WM_T_I210: 11566 case WM_T_I211: 11567 reg = CSR_READ(sc, WMREG_MDICNFG); 11568 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT; 11569 break; 11570 default: 11571 return -1; 11572 } 11573 } 11574 11575 return phyid; 11576 } 11577 11578 /* 11579 * wm_gmii_mediainit: 11580 * 11581 * Initialize media for use on 1000BASE-T devices. 11582 */ 11583 static void 11584 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid) 11585 { 11586 device_t dev = sc->sc_dev; 11587 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 11588 struct mii_data *mii = &sc->sc_mii; 11589 11590 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 11591 device_xname(sc->sc_dev), __func__)); 11592 11593 /* We have GMII. */ 11594 sc->sc_flags |= WM_F_HAS_MII; 11595 11596 if (sc->sc_type == WM_T_80003) 11597 sc->sc_tipg = TIPG_1000T_80003_DFLT; 11598 else 11599 sc->sc_tipg = TIPG_1000T_DFLT; 11600 11601 /* 11602 * Let the chip set speed/duplex on its own based on 11603 * signals from the PHY. 11604 * XXXbouyer - I'm not sure this is right for the 80003, 11605 * the em driver only sets CTRL_SLU here - but it seems to work. 11606 */ 11607 sc->sc_ctrl |= CTRL_SLU; 11608 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11609 11610 /* Initialize our media structures and probe the GMII. */ 11611 mii->mii_ifp = ifp; 11612 11613 mii->mii_statchg = wm_gmii_statchg; 11614 11615 /* get PHY control from SMBus to PCIe */ 11616 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2) 11617 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT) 11618 || (sc->sc_type == WM_T_PCH_CNP)) 11619 wm_init_phy_workarounds_pchlan(sc); 11620 11621 wm_gmii_reset(sc); 11622 11623 sc->sc_ethercom.ec_mii = &sc->sc_mii; 11624 ifmedia_init_with_lock(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange, 11625 wm_gmii_mediastatus, sc->sc_core_lock); 11626 11627 /* Setup internal SGMII PHY for SFP */ 11628 wm_sgmii_sfp_preconfig(sc); 11629 11630 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 11631 || (sc->sc_type == WM_T_82580) 11632 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 11633 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) { 11634 if ((sc->sc_flags & WM_F_SGMII) == 0) { 11635 /* Attach only one port */ 11636 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 11637 MII_OFFSET_ANY, MIIF_DOPAUSE); 11638 } else { 11639 int i, id; 11640 uint32_t ctrl_ext; 11641 11642 id = wm_get_phy_id_82575(sc); 11643 if (id != -1) { 11644 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 11645 id, MII_OFFSET_ANY, MIIF_DOPAUSE); 11646 } 11647 if ((id == -1) 11648 || (LIST_FIRST(&mii->mii_phys) == NULL)) { 11649 /* Power on sgmii phy if it is disabled */ 11650 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 11651 CSR_WRITE(sc, WMREG_CTRL_EXT, 11652 ctrl_ext &~ CTRL_EXT_SWDPIN(3)); 11653 CSR_WRITE_FLUSH(sc); 11654 delay(300*1000); /* XXX too long */ 11655 11656 /* 11657 * From 1 to 8. 11658 * 11659 * I2C access fails with I2C register's ERROR 11660 * bit set, so prevent error message while 11661 * scanning. 11662 */ 11663 sc->phy.no_errprint = true; 11664 for (i = 1; i < 8; i++) 11665 mii_attach(sc->sc_dev, &sc->sc_mii, 11666 0xffffffff, i, MII_OFFSET_ANY, 11667 MIIF_DOPAUSE); 11668 sc->phy.no_errprint = false; 11669 11670 /* Restore previous sfp cage power state */ 11671 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 11672 } 11673 } 11674 } else 11675 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 11676 MII_OFFSET_ANY, MIIF_DOPAUSE); 11677 11678 /* 11679 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call 11680 * wm_set_mdio_slow_mode_hv() for a workaround and retry. 11681 */ 11682 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) 11683 || (sc->sc_type == WM_T_PCH_SPT) 11684 || (sc->sc_type == WM_T_PCH_CNP)) 11685 && (LIST_FIRST(&mii->mii_phys) == NULL)) { 11686 wm_set_mdio_slow_mode_hv(sc); 11687 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 11688 MII_OFFSET_ANY, MIIF_DOPAUSE); 11689 } 11690 11691 /* 11692 * (For ICH8 variants) 11693 * If PHY detection failed, use BM's r/w function and retry. 11694 */ 11695 if (LIST_FIRST(&mii->mii_phys) == NULL) { 11696 /* if failed, retry with *_bm_* */ 11697 aprint_verbose_dev(dev, "Assumed PHY access function " 11698 "(type = %d) might be incorrect. Use BM and retry.\n", 11699 sc->sc_phytype); 11700 sc->sc_phytype = WMPHY_BM; 11701 mii->mii_readreg = wm_gmii_bm_readreg; 11702 mii->mii_writereg = wm_gmii_bm_writereg; 11703 11704 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 11705 MII_OFFSET_ANY, MIIF_DOPAUSE); 11706 } 11707 11708 if (LIST_FIRST(&mii->mii_phys) == NULL) { 11709 /* Any PHY wasn't found */ 11710 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL); 11711 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE); 11712 sc->sc_phytype = WMPHY_NONE; 11713 } else { 11714 struct mii_softc *child = LIST_FIRST(&mii->mii_phys); 11715 11716 /* 11717 * PHY found! Check PHY type again by the second call of 11718 * wm_gmii_setup_phytype. 11719 */ 11720 wm_gmii_setup_phytype(sc, child->mii_mpd_oui, 11721 child->mii_mpd_model); 11722 11723 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); 11724 } 11725 } 11726 11727 /* 11728 * wm_gmii_mediachange: [ifmedia interface function] 11729 * 11730 * Set hardware to newly-selected media on a 1000BASE-T device. 11731 */ 11732 static int 11733 wm_gmii_mediachange(struct ifnet *ifp) 11734 { 11735 struct wm_softc *sc = ifp->if_softc; 11736 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 11737 uint32_t reg; 11738 int rc; 11739 11740 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 11741 device_xname(sc->sc_dev), __func__)); 11742 11743 KASSERT(mutex_owned(sc->sc_core_lock)); 11744 11745 if ((sc->sc_if_flags & IFF_UP) == 0) 11746 return 0; 11747 11748 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */ 11749 if ((sc->sc_type == WM_T_82580) 11750 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210) 11751 || (sc->sc_type == WM_T_I211)) { 11752 reg = CSR_READ(sc, WMREG_PHPM); 11753 reg &= ~PHPM_GO_LINK_D; 11754 CSR_WRITE(sc, WMREG_PHPM, reg); 11755 } 11756 11757 /* Disable D0 LPLU. */ 11758 wm_lplu_d0_disable(sc); 11759 11760 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD); 11761 sc->sc_ctrl |= CTRL_SLU; 11762 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 11763 || (sc->sc_type > WM_T_82543)) { 11764 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX); 11765 } else { 11766 sc->sc_ctrl &= ~CTRL_ASDE; 11767 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX; 11768 if (ife->ifm_media & IFM_FDX) 11769 sc->sc_ctrl |= CTRL_FD; 11770 switch (IFM_SUBTYPE(ife->ifm_media)) { 11771 case IFM_10_T: 11772 sc->sc_ctrl |= CTRL_SPEED_10; 11773 break; 11774 case IFM_100_TX: 11775 sc->sc_ctrl |= CTRL_SPEED_100; 11776 break; 11777 case IFM_1000_T: 11778 sc->sc_ctrl |= CTRL_SPEED_1000; 11779 break; 11780 case IFM_NONE: 11781 /* There is no specific setting for IFM_NONE */ 11782 break; 11783 default: 11784 panic("wm_gmii_mediachange: bad media 0x%x", 11785 ife->ifm_media); 11786 } 11787 } 11788 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11789 CSR_WRITE_FLUSH(sc); 11790 11791 if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) 11792 wm_serdes_mediachange(ifp); 11793 11794 if (sc->sc_type <= WM_T_82543) 11795 wm_gmii_reset(sc); 11796 else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211) 11797 && ((sc->sc_flags & WM_F_SGMII) != 0)) { 11798 /* allow time for SFP cage time to power up phy */ 11799 delay(300 * 1000); 11800 wm_gmii_reset(sc); 11801 } 11802 11803 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO) 11804 return 0; 11805 return rc; 11806 } 11807 11808 /* 11809 * wm_gmii_mediastatus: [ifmedia interface function] 11810 * 11811 * Get the current interface media status on a 1000BASE-T device. 11812 */ 11813 static void 11814 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 11815 { 11816 struct wm_softc *sc = ifp->if_softc; 11817 11818 KASSERT(mutex_owned(sc->sc_core_lock)); 11819 11820 ether_mediastatus(ifp, ifmr); 11821 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) 11822 | sc->sc_flowflags; 11823 } 11824 11825 #define MDI_IO CTRL_SWDPIN(2) 11826 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */ 11827 #define MDI_CLK CTRL_SWDPIN(3) 11828 11829 static void 11830 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits) 11831 { 11832 uint32_t i, v; 11833 11834 v = CSR_READ(sc, WMREG_CTRL); 11835 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT)); 11836 v |= MDI_DIR | CTRL_SWDPIO(3); 11837 11838 for (i = __BIT(nbits - 1); i != 0; i >>= 1) { 11839 if (data & i) 11840 v |= MDI_IO; 11841 else 11842 v &= ~MDI_IO; 11843 CSR_WRITE(sc, WMREG_CTRL, v); 11844 CSR_WRITE_FLUSH(sc); 11845 delay(10); 11846 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 11847 CSR_WRITE_FLUSH(sc); 11848 delay(10); 11849 CSR_WRITE(sc, WMREG_CTRL, v); 11850 CSR_WRITE_FLUSH(sc); 11851 delay(10); 11852 } 11853 } 11854 11855 static uint16_t 11856 wm_i82543_mii_recvbits(struct wm_softc *sc) 11857 { 11858 uint32_t v, i; 11859 uint16_t data = 0; 11860 11861 v = CSR_READ(sc, WMREG_CTRL); 11862 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT)); 11863 v |= CTRL_SWDPIO(3); 11864 11865 CSR_WRITE(sc, WMREG_CTRL, v); 11866 CSR_WRITE_FLUSH(sc); 11867 delay(10); 11868 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 11869 CSR_WRITE_FLUSH(sc); 11870 delay(10); 11871 CSR_WRITE(sc, WMREG_CTRL, v); 11872 CSR_WRITE_FLUSH(sc); 11873 delay(10); 11874 11875 for (i = 0; i < 16; i++) { 11876 data <<= 1; 11877 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 11878 CSR_WRITE_FLUSH(sc); 11879 delay(10); 11880 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO) 11881 data |= 1; 11882 CSR_WRITE(sc, WMREG_CTRL, v); 11883 CSR_WRITE_FLUSH(sc); 11884 delay(10); 11885 } 11886 11887 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 11888 CSR_WRITE_FLUSH(sc); 11889 delay(10); 11890 CSR_WRITE(sc, WMREG_CTRL, v); 11891 CSR_WRITE_FLUSH(sc); 11892 delay(10); 11893 11894 return data; 11895 } 11896 11897 #undef MDI_IO 11898 #undef MDI_DIR 11899 #undef MDI_CLK 11900 11901 /* 11902 * wm_gmii_i82543_readreg: [mii interface function] 11903 * 11904 * Read a PHY register on the GMII (i82543 version). 11905 */ 11906 static int 11907 wm_gmii_i82543_readreg(device_t dev, int phy, int reg, uint16_t *val) 11908 { 11909 struct wm_softc *sc = device_private(dev); 11910 11911 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32); 11912 wm_i82543_mii_sendbits(sc, reg | (phy << 5) | 11913 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14); 11914 *val = wm_i82543_mii_recvbits(sc) & 0xffff; 11915 11916 DPRINTF(sc, WM_DEBUG_GMII, 11917 ("%s: GMII: read phy %d reg %d -> 0x%04hx\n", 11918 device_xname(dev), phy, reg, *val)); 11919 11920 return 0; 11921 } 11922 11923 /* 11924 * wm_gmii_i82543_writereg: [mii interface function] 11925 * 11926 * Write a PHY register on the GMII (i82543 version). 11927 */ 11928 static int 11929 wm_gmii_i82543_writereg(device_t dev, int phy, int reg, uint16_t val) 11930 { 11931 struct wm_softc *sc = device_private(dev); 11932 11933 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32); 11934 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) | 11935 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) | 11936 (MII_COMMAND_START << 30), 32); 11937 11938 return 0; 11939 } 11940 11941 /* 11942 * wm_gmii_mdic_readreg: [mii interface function] 11943 * 11944 * Read a PHY register on the GMII. 11945 */ 11946 static int 11947 wm_gmii_mdic_readreg(device_t dev, int phy, int reg, uint16_t *val) 11948 { 11949 struct wm_softc *sc = device_private(dev); 11950 uint32_t mdic = 0; 11951 int i; 11952 11953 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217) 11954 && (reg > MII_ADDRMASK)) { 11955 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 11956 __func__, sc->sc_phytype, reg); 11957 reg &= MII_ADDRMASK; 11958 } 11959 11960 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) | 11961 MDIC_REGADD(reg)); 11962 11963 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) { 11964 delay(50); 11965 mdic = CSR_READ(sc, WMREG_MDIC); 11966 if (mdic & MDIC_READY) 11967 break; 11968 } 11969 11970 if ((mdic & MDIC_READY) == 0) { 11971 DPRINTF(sc, WM_DEBUG_GMII, 11972 ("%s: MDIC read timed out: phy %d reg %d\n", 11973 device_xname(dev), phy, reg)); 11974 return ETIMEDOUT; 11975 } else if (mdic & MDIC_E) { 11976 /* This is normal if no PHY is present. */ 11977 DPRINTF(sc, WM_DEBUG_GMII, 11978 ("%s: MDIC read error: phy %d reg %d\n", 11979 device_xname(sc->sc_dev), phy, reg)); 11980 return -1; 11981 } else 11982 *val = MDIC_DATA(mdic); 11983 11984 /* 11985 * Allow some time after each MDIC transaction to avoid 11986 * reading duplicate data in the next MDIC transaction. 11987 */ 11988 if (sc->sc_type == WM_T_PCH2) 11989 delay(100); 11990 11991 return 0; 11992 } 11993 11994 /* 11995 * wm_gmii_mdic_writereg: [mii interface function] 11996 * 11997 * Write a PHY register on the GMII. 11998 */ 11999 static int 12000 wm_gmii_mdic_writereg(device_t dev, int phy, int reg, uint16_t val) 12001 { 12002 struct wm_softc *sc = device_private(dev); 12003 uint32_t mdic = 0; 12004 int i; 12005 12006 if ((sc->sc_phytype != WMPHY_82579) && (sc->sc_phytype != WMPHY_I217) 12007 && (reg > MII_ADDRMASK)) { 12008 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 12009 __func__, sc->sc_phytype, reg); 12010 reg &= MII_ADDRMASK; 12011 } 12012 12013 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) | 12014 MDIC_REGADD(reg) | MDIC_DATA(val)); 12015 12016 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) { 12017 delay(50); 12018 mdic = CSR_READ(sc, WMREG_MDIC); 12019 if (mdic & MDIC_READY) 12020 break; 12021 } 12022 12023 if ((mdic & MDIC_READY) == 0) { 12024 DPRINTF(sc, WM_DEBUG_GMII, 12025 ("%s: MDIC write timed out: phy %d reg %d\n", 12026 device_xname(dev), phy, reg)); 12027 return ETIMEDOUT; 12028 } else if (mdic & MDIC_E) { 12029 DPRINTF(sc, WM_DEBUG_GMII, 12030 ("%s: MDIC write error: phy %d reg %d\n", 12031 device_xname(dev), phy, reg)); 12032 return -1; 12033 } 12034 12035 /* 12036 * Allow some time after each MDIC transaction to avoid 12037 * reading duplicate data in the next MDIC transaction. 12038 */ 12039 if (sc->sc_type == WM_T_PCH2) 12040 delay(100); 12041 12042 return 0; 12043 } 12044 12045 /* 12046 * wm_gmii_i82544_readreg: [mii interface function] 12047 * 12048 * Read a PHY register on the GMII. 12049 */ 12050 static int 12051 wm_gmii_i82544_readreg(device_t dev, int phy, int reg, uint16_t *val) 12052 { 12053 struct wm_softc *sc = device_private(dev); 12054 int rv; 12055 12056 rv = sc->phy.acquire(sc); 12057 if (rv != 0) { 12058 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12059 return rv; 12060 } 12061 12062 rv = wm_gmii_i82544_readreg_locked(dev, phy, reg, val); 12063 12064 sc->phy.release(sc); 12065 12066 return rv; 12067 } 12068 12069 static int 12070 wm_gmii_i82544_readreg_locked(device_t dev, int phy, int reg, uint16_t *val) 12071 { 12072 struct wm_softc *sc = device_private(dev); 12073 int rv; 12074 12075 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 12076 switch (sc->sc_phytype) { 12077 case WMPHY_IGP: 12078 case WMPHY_IGP_2: 12079 case WMPHY_IGP_3: 12080 rv = wm_gmii_mdic_writereg(dev, phy, 12081 IGPHY_PAGE_SELECT, reg); 12082 if (rv != 0) 12083 return rv; 12084 break; 12085 default: 12086 #ifdef WM_DEBUG 12087 device_printf(dev, "%s: PHYTYPE = 0x%x, addr = %02x\n", 12088 __func__, sc->sc_phytype, reg); 12089 #endif 12090 break; 12091 } 12092 } 12093 12094 return wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 12095 } 12096 12097 /* 12098 * wm_gmii_i82544_writereg: [mii interface function] 12099 * 12100 * Write a PHY register on the GMII. 12101 */ 12102 static int 12103 wm_gmii_i82544_writereg(device_t dev, int phy, int reg, uint16_t val) 12104 { 12105 struct wm_softc *sc = device_private(dev); 12106 int rv; 12107 12108 rv = sc->phy.acquire(sc); 12109 if (rv != 0) { 12110 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12111 return rv; 12112 } 12113 12114 rv = wm_gmii_i82544_writereg_locked(dev, phy, reg & MII_ADDRMASK, val); 12115 sc->phy.release(sc); 12116 12117 return rv; 12118 } 12119 12120 static int 12121 wm_gmii_i82544_writereg_locked(device_t dev, int phy, int reg, uint16_t val) 12122 { 12123 struct wm_softc *sc = device_private(dev); 12124 int rv; 12125 12126 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 12127 switch (sc->sc_phytype) { 12128 case WMPHY_IGP: 12129 case WMPHY_IGP_2: 12130 case WMPHY_IGP_3: 12131 rv = wm_gmii_mdic_writereg(dev, phy, 12132 IGPHY_PAGE_SELECT, reg); 12133 if (rv != 0) 12134 return rv; 12135 break; 12136 default: 12137 #ifdef WM_DEBUG 12138 device_printf(dev, "%s: PHYTYPE == 0x%x, addr = %02x", 12139 __func__, sc->sc_phytype, reg); 12140 #endif 12141 break; 12142 } 12143 } 12144 12145 return wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 12146 } 12147 12148 /* 12149 * wm_gmii_i80003_readreg: [mii interface function] 12150 * 12151 * Read a PHY register on the kumeran 12152 * This could be handled by the PHY layer if we didn't have to lock the 12153 * resource ... 12154 */ 12155 static int 12156 wm_gmii_i80003_readreg(device_t dev, int phy, int reg, uint16_t *val) 12157 { 12158 struct wm_softc *sc = device_private(dev); 12159 int page_select; 12160 uint16_t temp, temp2; 12161 int rv; 12162 12163 if (phy != 1) /* Only one PHY on kumeran bus */ 12164 return -1; 12165 12166 rv = sc->phy.acquire(sc); 12167 if (rv != 0) { 12168 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12169 return rv; 12170 } 12171 12172 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG) 12173 page_select = GG82563_PHY_PAGE_SELECT; 12174 else { 12175 /* 12176 * Use Alternative Page Select register to access registers 12177 * 30 and 31. 12178 */ 12179 page_select = GG82563_PHY_PAGE_SELECT_ALT; 12180 } 12181 temp = reg >> GG82563_PAGE_SHIFT; 12182 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0) 12183 goto out; 12184 12185 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) { 12186 /* 12187 * Wait more 200us for a bug of the ready bit in the MDIC 12188 * register. 12189 */ 12190 delay(200); 12191 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2); 12192 if ((rv != 0) || (temp2 != temp)) { 12193 device_printf(dev, "%s failed\n", __func__); 12194 rv = -1; 12195 goto out; 12196 } 12197 delay(200); 12198 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 12199 delay(200); 12200 } else 12201 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 12202 12203 out: 12204 sc->phy.release(sc); 12205 return rv; 12206 } 12207 12208 /* 12209 * wm_gmii_i80003_writereg: [mii interface function] 12210 * 12211 * Write a PHY register on the kumeran. 12212 * This could be handled by the PHY layer if we didn't have to lock the 12213 * resource ... 12214 */ 12215 static int 12216 wm_gmii_i80003_writereg(device_t dev, int phy, int reg, uint16_t val) 12217 { 12218 struct wm_softc *sc = device_private(dev); 12219 int page_select, rv; 12220 uint16_t temp, temp2; 12221 12222 if (phy != 1) /* Only one PHY on kumeran bus */ 12223 return -1; 12224 12225 rv = sc->phy.acquire(sc); 12226 if (rv != 0) { 12227 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12228 return rv; 12229 } 12230 12231 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG) 12232 page_select = GG82563_PHY_PAGE_SELECT; 12233 else { 12234 /* 12235 * Use Alternative Page Select register to access registers 12236 * 30 and 31. 12237 */ 12238 page_select = GG82563_PHY_PAGE_SELECT_ALT; 12239 } 12240 temp = (uint16_t)reg >> GG82563_PAGE_SHIFT; 12241 if ((rv = wm_gmii_mdic_writereg(dev, phy, page_select, temp)) != 0) 12242 goto out; 12243 12244 if ((sc->sc_flags & WM_F_80003_MDIC_WA) != 0) { 12245 /* 12246 * Wait more 200us for a bug of the ready bit in the MDIC 12247 * register. 12248 */ 12249 delay(200); 12250 rv = wm_gmii_mdic_readreg(dev, phy, page_select, &temp2); 12251 if ((rv != 0) || (temp2 != temp)) { 12252 device_printf(dev, "%s failed\n", __func__); 12253 rv = -1; 12254 goto out; 12255 } 12256 delay(200); 12257 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 12258 delay(200); 12259 } else 12260 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 12261 12262 out: 12263 sc->phy.release(sc); 12264 return rv; 12265 } 12266 12267 /* 12268 * wm_gmii_bm_readreg: [mii interface function] 12269 * 12270 * Read a PHY register on the kumeran 12271 * This could be handled by the PHY layer if we didn't have to lock the 12272 * resource ... 12273 */ 12274 static int 12275 wm_gmii_bm_readreg(device_t dev, int phy, int reg, uint16_t *val) 12276 { 12277 struct wm_softc *sc = device_private(dev); 12278 uint16_t page = reg >> BME1000_PAGE_SHIFT; 12279 int rv; 12280 12281 rv = sc->phy.acquire(sc); 12282 if (rv != 0) { 12283 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12284 return rv; 12285 } 12286 12287 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583)) 12288 phy = ((page >= 768) || ((page == 0) && (reg == 25)) 12289 || (reg == 31)) ? 1 : phy; 12290 /* Page 800 works differently than the rest so it has its own func */ 12291 if (page == BM_WUC_PAGE) { 12292 rv = wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false); 12293 goto release; 12294 } 12295 12296 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 12297 if ((phy == 1) && (sc->sc_type != WM_T_82574) 12298 && (sc->sc_type != WM_T_82583)) 12299 rv = wm_gmii_mdic_writereg(dev, phy, 12300 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT); 12301 else 12302 rv = wm_gmii_mdic_writereg(dev, phy, 12303 BME1000_PHY_PAGE_SELECT, page); 12304 if (rv != 0) 12305 goto release; 12306 } 12307 12308 rv = wm_gmii_mdic_readreg(dev, phy, reg & MII_ADDRMASK, val); 12309 12310 release: 12311 sc->phy.release(sc); 12312 return rv; 12313 } 12314 12315 /* 12316 * wm_gmii_bm_writereg: [mii interface function] 12317 * 12318 * Write a PHY register on the kumeran. 12319 * This could be handled by the PHY layer if we didn't have to lock the 12320 * resource ... 12321 */ 12322 static int 12323 wm_gmii_bm_writereg(device_t dev, int phy, int reg, uint16_t val) 12324 { 12325 struct wm_softc *sc = device_private(dev); 12326 uint16_t page = reg >> BME1000_PAGE_SHIFT; 12327 int rv; 12328 12329 rv = sc->phy.acquire(sc); 12330 if (rv != 0) { 12331 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12332 return rv; 12333 } 12334 12335 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583)) 12336 phy = ((page >= 768) || ((page == 0) && (reg == 25)) 12337 || (reg == 31)) ? 1 : phy; 12338 /* Page 800 works differently than the rest so it has its own func */ 12339 if (page == BM_WUC_PAGE) { 12340 rv = wm_access_phy_wakeup_reg_bm(dev, reg, &val, false, false); 12341 goto release; 12342 } 12343 12344 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 12345 if ((phy == 1) && (sc->sc_type != WM_T_82574) 12346 && (sc->sc_type != WM_T_82583)) 12347 rv = wm_gmii_mdic_writereg(dev, phy, 12348 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT); 12349 else 12350 rv = wm_gmii_mdic_writereg(dev, phy, 12351 BME1000_PHY_PAGE_SELECT, page); 12352 if (rv != 0) 12353 goto release; 12354 } 12355 12356 rv = wm_gmii_mdic_writereg(dev, phy, reg & MII_ADDRMASK, val); 12357 12358 release: 12359 sc->phy.release(sc); 12360 return rv; 12361 } 12362 12363 /* 12364 * wm_enable_phy_wakeup_reg_access_bm - enable access to BM wakeup registers 12365 * @dev: pointer to the HW structure 12366 * @phy_reg: pointer to store original contents of BM_WUC_ENABLE_REG 12367 * 12368 * Assumes semaphore already acquired and phy_reg points to a valid memory 12369 * address to store contents of the BM_WUC_ENABLE_REG register. 12370 */ 12371 static int 12372 wm_enable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp) 12373 { 12374 #ifdef WM_DEBUG 12375 struct wm_softc *sc = device_private(dev); 12376 #endif 12377 uint16_t temp; 12378 int rv; 12379 12380 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 12381 device_xname(dev), __func__)); 12382 12383 if (!phy_regp) 12384 return -1; 12385 12386 /* All page select, port ctrl and wakeup registers use phy address 1 */ 12387 12388 /* Select Port Control Registers page */ 12389 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 12390 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT); 12391 if (rv != 0) 12392 return rv; 12393 12394 /* Read WUCE and save it */ 12395 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_ENABLE_REG, phy_regp); 12396 if (rv != 0) 12397 return rv; 12398 12399 /* Enable both PHY wakeup mode and Wakeup register page writes. 12400 * Prevent a power state change by disabling ME and Host PHY wakeup. 12401 */ 12402 temp = *phy_regp; 12403 temp |= BM_WUC_ENABLE_BIT; 12404 temp &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT); 12405 12406 if ((rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, temp)) != 0) 12407 return rv; 12408 12409 /* Select Host Wakeup Registers page - caller now able to write 12410 * registers on the Wakeup registers page 12411 */ 12412 return wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 12413 BM_WUC_PAGE << IGP3_PAGE_SHIFT); 12414 } 12415 12416 /* 12417 * wm_disable_phy_wakeup_reg_access_bm - disable access to BM wakeup regs 12418 * @dev: pointer to the HW structure 12419 * @phy_reg: pointer to original contents of BM_WUC_ENABLE_REG 12420 * 12421 * Restore BM_WUC_ENABLE_REG to its original value. 12422 * 12423 * Assumes semaphore already acquired and *phy_reg is the contents of the 12424 * BM_WUC_ENABLE_REG before register(s) on BM_WUC_PAGE were accessed by 12425 * caller. 12426 */ 12427 static int 12428 wm_disable_phy_wakeup_reg_access_bm(device_t dev, uint16_t *phy_regp) 12429 { 12430 #ifdef WM_DEBUG 12431 struct wm_softc *sc = device_private(dev); 12432 #endif 12433 12434 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 12435 device_xname(dev), __func__)); 12436 12437 if (!phy_regp) 12438 return -1; 12439 12440 /* Select Port Control Registers page */ 12441 wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 12442 BM_PORT_CTRL_PAGE << IGP3_PAGE_SHIFT); 12443 12444 /* Restore 769.17 to its original value */ 12445 wm_gmii_mdic_writereg(dev, 1, BM_WUC_ENABLE_REG, *phy_regp); 12446 12447 return 0; 12448 } 12449 12450 /* 12451 * wm_access_phy_wakeup_reg_bm - Read/write BM PHY wakeup register 12452 * @sc: pointer to the HW structure 12453 * @offset: register offset to be read or written 12454 * @val: pointer to the data to read or write 12455 * @rd: determines if operation is read or write 12456 * @page_set: BM_WUC_PAGE already set and access enabled 12457 * 12458 * Read the PHY register at offset and store the retrieved information in 12459 * data, or write data to PHY register at offset. Note the procedure to 12460 * access the PHY wakeup registers is different than reading the other PHY 12461 * registers. It works as such: 12462 * 1) Set 769.17.2 (page 769, register 17, bit 2) = 1 12463 * 2) Set page to 800 for host (801 if we were manageability) 12464 * 3) Write the address using the address opcode (0x11) 12465 * 4) Read or write the data using the data opcode (0x12) 12466 * 5) Restore 769.17.2 to its original value 12467 * 12468 * Steps 1 and 2 are done by wm_enable_phy_wakeup_reg_access_bm() and 12469 * step 5 is done by wm_disable_phy_wakeup_reg_access_bm(). 12470 * 12471 * Assumes semaphore is already acquired. When page_set==TRUE, assumes 12472 * the PHY page is set to BM_WUC_PAGE (i.e. a function in the call stack 12473 * is responsible for calls to wm_[enable|disable]_phy_wakeup_reg_bm()). 12474 */ 12475 static int 12476 wm_access_phy_wakeup_reg_bm(device_t dev, int offset, int16_t *val, int rd, 12477 bool page_set) 12478 { 12479 struct wm_softc *sc = device_private(dev); 12480 uint16_t regnum = BM_PHY_REG_NUM(offset); 12481 uint16_t page = BM_PHY_REG_PAGE(offset); 12482 uint16_t wuce; 12483 int rv = 0; 12484 12485 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 12486 device_xname(dev), __func__)); 12487 /* XXX Gig must be disabled for MDIO accesses to page 800 */ 12488 if ((sc->sc_type == WM_T_PCH) 12489 && ((CSR_READ(sc, WMREG_PHY_CTRL) & PHY_CTRL_GBE_DIS) == 0)) { 12490 device_printf(dev, 12491 "Attempting to access page %d while gig enabled.\n", page); 12492 } 12493 12494 if (!page_set) { 12495 /* Enable access to PHY wakeup registers */ 12496 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce); 12497 if (rv != 0) { 12498 device_printf(dev, 12499 "%s: Could not enable PHY wakeup reg access\n", 12500 __func__); 12501 return rv; 12502 } 12503 } 12504 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s: Accessing PHY page %d reg 0x%x\n", 12505 device_xname(sc->sc_dev), __func__, page, regnum)); 12506 12507 /* 12508 * 2) Access PHY wakeup register. 12509 * See wm_access_phy_wakeup_reg_bm. 12510 */ 12511 12512 /* Write the Wakeup register page offset value using opcode 0x11 */ 12513 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_ADDRESS_OPCODE, regnum); 12514 if (rv != 0) 12515 return rv; 12516 12517 if (rd) { 12518 /* Read the Wakeup register page value using opcode 0x12 */ 12519 rv = wm_gmii_mdic_readreg(dev, 1, BM_WUC_DATA_OPCODE, val); 12520 } else { 12521 /* Write the Wakeup register page value using opcode 0x12 */ 12522 rv = wm_gmii_mdic_writereg(dev, 1, BM_WUC_DATA_OPCODE, *val); 12523 } 12524 if (rv != 0) 12525 return rv; 12526 12527 if (!page_set) 12528 rv = wm_disable_phy_wakeup_reg_access_bm(dev, &wuce); 12529 12530 return rv; 12531 } 12532 12533 /* 12534 * wm_gmii_hv_readreg: [mii interface function] 12535 * 12536 * Read a PHY register on the kumeran 12537 * This could be handled by the PHY layer if we didn't have to lock the 12538 * resource ... 12539 */ 12540 static int 12541 wm_gmii_hv_readreg(device_t dev, int phy, int reg, uint16_t *val) 12542 { 12543 struct wm_softc *sc = device_private(dev); 12544 int rv; 12545 12546 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 12547 device_xname(dev), __func__)); 12548 12549 rv = sc->phy.acquire(sc); 12550 if (rv != 0) { 12551 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12552 return rv; 12553 } 12554 12555 rv = wm_gmii_hv_readreg_locked(dev, phy, reg, val); 12556 sc->phy.release(sc); 12557 return rv; 12558 } 12559 12560 static int 12561 wm_gmii_hv_readreg_locked(device_t dev, int phy, int reg, uint16_t *val) 12562 { 12563 uint16_t page = BM_PHY_REG_PAGE(reg); 12564 uint16_t regnum = BM_PHY_REG_NUM(reg); 12565 int rv; 12566 12567 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy; 12568 12569 /* Page 800 works differently than the rest so it has its own func */ 12570 if (page == BM_WUC_PAGE) 12571 return wm_access_phy_wakeup_reg_bm(dev, reg, val, true, false); 12572 12573 /* 12574 * Lower than page 768 works differently than the rest so it has its 12575 * own func 12576 */ 12577 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) { 12578 device_printf(dev, "gmii_hv_readreg!!!\n"); 12579 return -1; 12580 } 12581 12582 /* 12583 * XXX I21[789] documents say that the SMBus Address register is at 12584 * PHY address 01, Page 0 (not 768), Register 26. 12585 */ 12586 if (page == HV_INTC_FC_PAGE_START) 12587 page = 0; 12588 12589 if (regnum > BME1000_MAX_MULTI_PAGE_REG) { 12590 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 12591 page << BME1000_PAGE_SHIFT); 12592 if (rv != 0) 12593 return rv; 12594 } 12595 12596 return wm_gmii_mdic_readreg(dev, phy, regnum & MII_ADDRMASK, val); 12597 } 12598 12599 /* 12600 * wm_gmii_hv_writereg: [mii interface function] 12601 * 12602 * Write a PHY register on the kumeran. 12603 * This could be handled by the PHY layer if we didn't have to lock the 12604 * resource ... 12605 */ 12606 static int 12607 wm_gmii_hv_writereg(device_t dev, int phy, int reg, uint16_t val) 12608 { 12609 struct wm_softc *sc = device_private(dev); 12610 int rv; 12611 12612 DPRINTF(sc, WM_DEBUG_GMII, ("%s: %s called\n", 12613 device_xname(dev), __func__)); 12614 12615 rv = sc->phy.acquire(sc); 12616 if (rv != 0) { 12617 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12618 return rv; 12619 } 12620 12621 rv = wm_gmii_hv_writereg_locked(dev, phy, reg, val); 12622 sc->phy.release(sc); 12623 12624 return rv; 12625 } 12626 12627 static int 12628 wm_gmii_hv_writereg_locked(device_t dev, int phy, int reg, uint16_t val) 12629 { 12630 struct wm_softc *sc = device_private(dev); 12631 uint16_t page = BM_PHY_REG_PAGE(reg); 12632 uint16_t regnum = BM_PHY_REG_NUM(reg); 12633 int rv; 12634 12635 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy; 12636 12637 /* Page 800 works differently than the rest so it has its own func */ 12638 if (page == BM_WUC_PAGE) 12639 return wm_access_phy_wakeup_reg_bm(dev, reg, &val, false, 12640 false); 12641 12642 /* 12643 * Lower than page 768 works differently than the rest so it has its 12644 * own func 12645 */ 12646 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) { 12647 device_printf(dev, "gmii_hv_writereg!!!\n"); 12648 return -1; 12649 } 12650 12651 { 12652 /* 12653 * XXX I21[789] documents say that the SMBus Address register 12654 * is at PHY address 01, Page 0 (not 768), Register 26. 12655 */ 12656 if (page == HV_INTC_FC_PAGE_START) 12657 page = 0; 12658 12659 /* 12660 * XXX Workaround MDIO accesses being disabled after entering 12661 * IEEE Power Down (whenever bit 11 of the PHY control 12662 * register is set) 12663 */ 12664 if (sc->sc_phytype == WMPHY_82578) { 12665 struct mii_softc *child; 12666 12667 child = LIST_FIRST(&sc->sc_mii.mii_phys); 12668 if ((child != NULL) && (child->mii_mpd_rev >= 1) 12669 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0) 12670 && ((val & (1 << 11)) != 0)) { 12671 device_printf(dev, "XXX need workaround\n"); 12672 } 12673 } 12674 12675 if (regnum > BME1000_MAX_MULTI_PAGE_REG) { 12676 rv = wm_gmii_mdic_writereg(dev, 1, 12677 IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT); 12678 if (rv != 0) 12679 return rv; 12680 } 12681 } 12682 12683 return wm_gmii_mdic_writereg(dev, phy, regnum & MII_ADDRMASK, val); 12684 } 12685 12686 /* 12687 * wm_gmii_82580_readreg: [mii interface function] 12688 * 12689 * Read a PHY register on the 82580 and I350. 12690 * This could be handled by the PHY layer if we didn't have to lock the 12691 * resource ... 12692 */ 12693 static int 12694 wm_gmii_82580_readreg(device_t dev, int phy, int reg, uint16_t *val) 12695 { 12696 struct wm_softc *sc = device_private(dev); 12697 int rv; 12698 12699 rv = sc->phy.acquire(sc); 12700 if (rv != 0) { 12701 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12702 return rv; 12703 } 12704 12705 #ifdef DIAGNOSTIC 12706 if (reg > MII_ADDRMASK) { 12707 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 12708 __func__, sc->sc_phytype, reg); 12709 reg &= MII_ADDRMASK; 12710 } 12711 #endif 12712 rv = wm_gmii_mdic_readreg(dev, phy, reg, val); 12713 12714 sc->phy.release(sc); 12715 return rv; 12716 } 12717 12718 /* 12719 * wm_gmii_82580_writereg: [mii interface function] 12720 * 12721 * Write a PHY register on the 82580 and I350. 12722 * This could be handled by the PHY layer if we didn't have to lock the 12723 * resource ... 12724 */ 12725 static int 12726 wm_gmii_82580_writereg(device_t dev, int phy, int reg, uint16_t val) 12727 { 12728 struct wm_softc *sc = device_private(dev); 12729 int rv; 12730 12731 rv = sc->phy.acquire(sc); 12732 if (rv != 0) { 12733 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12734 return rv; 12735 } 12736 12737 #ifdef DIAGNOSTIC 12738 if (reg > MII_ADDRMASK) { 12739 device_printf(dev, "%s: PHYTYPE = %d, addr 0x%x > 0x1f\n", 12740 __func__, sc->sc_phytype, reg); 12741 reg &= MII_ADDRMASK; 12742 } 12743 #endif 12744 rv = wm_gmii_mdic_writereg(dev, phy, reg, val); 12745 12746 sc->phy.release(sc); 12747 return rv; 12748 } 12749 12750 /* 12751 * wm_gmii_gs40g_readreg: [mii interface function] 12752 * 12753 * Read a PHY register on the I2100 and I211. 12754 * This could be handled by the PHY layer if we didn't have to lock the 12755 * resource ... 12756 */ 12757 static int 12758 wm_gmii_gs40g_readreg(device_t dev, int phy, int reg, uint16_t *val) 12759 { 12760 struct wm_softc *sc = device_private(dev); 12761 int page, offset; 12762 int rv; 12763 12764 /* Acquire semaphore */ 12765 rv = sc->phy.acquire(sc); 12766 if (rv != 0) { 12767 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12768 return rv; 12769 } 12770 12771 /* Page select */ 12772 page = reg >> GS40G_PAGE_SHIFT; 12773 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page); 12774 if (rv != 0) 12775 goto release; 12776 12777 /* Read reg */ 12778 offset = reg & GS40G_OFFSET_MASK; 12779 rv = wm_gmii_mdic_readreg(dev, phy, offset, val); 12780 12781 release: 12782 sc->phy.release(sc); 12783 return rv; 12784 } 12785 12786 /* 12787 * wm_gmii_gs40g_writereg: [mii interface function] 12788 * 12789 * Write a PHY register on the I210 and I211. 12790 * This could be handled by the PHY layer if we didn't have to lock the 12791 * resource ... 12792 */ 12793 static int 12794 wm_gmii_gs40g_writereg(device_t dev, int phy, int reg, uint16_t val) 12795 { 12796 struct wm_softc *sc = device_private(dev); 12797 uint16_t page; 12798 int offset, rv; 12799 12800 /* Acquire semaphore */ 12801 rv = sc->phy.acquire(sc); 12802 if (rv != 0) { 12803 device_printf(dev, "%s: failed to get semaphore\n", __func__); 12804 return rv; 12805 } 12806 12807 /* Page select */ 12808 page = reg >> GS40G_PAGE_SHIFT; 12809 rv = wm_gmii_mdic_writereg(dev, phy, GS40G_PAGE_SELECT, page); 12810 if (rv != 0) 12811 goto release; 12812 12813 /* Write reg */ 12814 offset = reg & GS40G_OFFSET_MASK; 12815 rv = wm_gmii_mdic_writereg(dev, phy, offset, val); 12816 12817 release: 12818 /* Release semaphore */ 12819 sc->phy.release(sc); 12820 return rv; 12821 } 12822 12823 /* 12824 * wm_gmii_statchg: [mii interface function] 12825 * 12826 * Callback from MII layer when media changes. 12827 */ 12828 static void 12829 wm_gmii_statchg(struct ifnet *ifp) 12830 { 12831 struct wm_softc *sc = ifp->if_softc; 12832 struct mii_data *mii = &sc->sc_mii; 12833 12834 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE); 12835 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 12836 sc->sc_fcrtl &= ~FCRTL_XONE; 12837 12838 /* Get flow control negotiation result. */ 12839 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO && 12840 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) { 12841 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK; 12842 mii->mii_media_active &= ~IFM_ETH_FMASK; 12843 } 12844 12845 if (sc->sc_flowflags & IFM_FLOW) { 12846 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) { 12847 sc->sc_ctrl |= CTRL_TFCE; 12848 sc->sc_fcrtl |= FCRTL_XONE; 12849 } 12850 if (sc->sc_flowflags & IFM_ETH_RXPAUSE) 12851 sc->sc_ctrl |= CTRL_RFCE; 12852 } 12853 12854 if (mii->mii_media_active & IFM_FDX) { 12855 DPRINTF(sc, WM_DEBUG_LINK, 12856 ("%s: LINK: statchg: FDX\n", ifp->if_xname)); 12857 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 12858 } else { 12859 DPRINTF(sc, WM_DEBUG_LINK, 12860 ("%s: LINK: statchg: HDX\n", ifp->if_xname)); 12861 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 12862 } 12863 12864 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 12865 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 12866 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 12867 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl); 12868 if (sc->sc_type == WM_T_80003) { 12869 switch (IFM_SUBTYPE(mii->mii_media_active)) { 12870 case IFM_1000_T: 12871 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL, 12872 KUMCTRLSTA_HD_CTRL_1000_DEFAULT); 12873 sc->sc_tipg = TIPG_1000T_80003_DFLT; 12874 break; 12875 default: 12876 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL, 12877 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT); 12878 sc->sc_tipg = TIPG_10_100_80003_DFLT; 12879 break; 12880 } 12881 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg); 12882 } 12883 } 12884 12885 /* kumeran related (80003, ICH* and PCH*) */ 12886 12887 /* 12888 * wm_kmrn_readreg: 12889 * 12890 * Read a kumeran register 12891 */ 12892 static int 12893 wm_kmrn_readreg(struct wm_softc *sc, int reg, uint16_t *val) 12894 { 12895 int rv; 12896 12897 if (sc->sc_type == WM_T_80003) 12898 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12899 else 12900 rv = sc->phy.acquire(sc); 12901 if (rv != 0) { 12902 device_printf(sc->sc_dev, "%s: failed to get semaphore\n", 12903 __func__); 12904 return rv; 12905 } 12906 12907 rv = wm_kmrn_readreg_locked(sc, reg, val); 12908 12909 if (sc->sc_type == WM_T_80003) 12910 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12911 else 12912 sc->phy.release(sc); 12913 12914 return rv; 12915 } 12916 12917 static int 12918 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg, uint16_t *val) 12919 { 12920 12921 CSR_WRITE(sc, WMREG_KUMCTRLSTA, 12922 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | 12923 KUMCTRLSTA_REN); 12924 CSR_WRITE_FLUSH(sc); 12925 delay(2); 12926 12927 *val = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK; 12928 12929 return 0; 12930 } 12931 12932 /* 12933 * wm_kmrn_writereg: 12934 * 12935 * Write a kumeran register 12936 */ 12937 static int 12938 wm_kmrn_writereg(struct wm_softc *sc, int reg, uint16_t val) 12939 { 12940 int rv; 12941 12942 if (sc->sc_type == WM_T_80003) 12943 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12944 else 12945 rv = sc->phy.acquire(sc); 12946 if (rv != 0) { 12947 device_printf(sc->sc_dev, "%s: failed to get semaphore\n", 12948 __func__); 12949 return rv; 12950 } 12951 12952 rv = wm_kmrn_writereg_locked(sc, reg, val); 12953 12954 if (sc->sc_type == WM_T_80003) 12955 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 12956 else 12957 sc->phy.release(sc); 12958 12959 return rv; 12960 } 12961 12962 static int 12963 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, uint16_t val) 12964 { 12965 12966 CSR_WRITE(sc, WMREG_KUMCTRLSTA, 12967 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | val); 12968 12969 return 0; 12970 } 12971 12972 /* 12973 * EMI register related (82579, WMPHY_I217(PCH2 and newer)) 12974 * This access method is different from IEEE MMD. 12975 */ 12976 static int 12977 wm_access_emi_reg_locked(device_t dev, int reg, uint16_t *val, bool rd) 12978 { 12979 struct wm_softc *sc = device_private(dev); 12980 int rv; 12981 12982 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_ADDR, reg); 12983 if (rv != 0) 12984 return rv; 12985 12986 if (rd) 12987 rv = sc->phy.readreg_locked(dev, 2, I82579_EMI_DATA, val); 12988 else 12989 rv = sc->phy.writereg_locked(dev, 2, I82579_EMI_DATA, *val); 12990 return rv; 12991 } 12992 12993 static int 12994 wm_read_emi_reg_locked(device_t dev, int reg, uint16_t *val) 12995 { 12996 12997 return wm_access_emi_reg_locked(dev, reg, val, true); 12998 } 12999 13000 static int 13001 wm_write_emi_reg_locked(device_t dev, int reg, uint16_t val) 13002 { 13003 13004 return wm_access_emi_reg_locked(dev, reg, &val, false); 13005 } 13006 13007 /* SGMII related */ 13008 13009 /* 13010 * wm_sgmii_uses_mdio 13011 * 13012 * Check whether the transaction is to the internal PHY or the external 13013 * MDIO interface. Return true if it's MDIO. 13014 */ 13015 static bool 13016 wm_sgmii_uses_mdio(struct wm_softc *sc) 13017 { 13018 uint32_t reg; 13019 bool ismdio = false; 13020 13021 switch (sc->sc_type) { 13022 case WM_T_82575: 13023 case WM_T_82576: 13024 reg = CSR_READ(sc, WMREG_MDIC); 13025 ismdio = ((reg & MDIC_DEST) != 0); 13026 break; 13027 case WM_T_82580: 13028 case WM_T_I350: 13029 case WM_T_I354: 13030 case WM_T_I210: 13031 case WM_T_I211: 13032 reg = CSR_READ(sc, WMREG_MDICNFG); 13033 ismdio = ((reg & MDICNFG_DEST) != 0); 13034 break; 13035 default: 13036 break; 13037 } 13038 13039 return ismdio; 13040 } 13041 13042 /* Setup internal SGMII PHY for SFP */ 13043 static void 13044 wm_sgmii_sfp_preconfig(struct wm_softc *sc) 13045 { 13046 uint16_t id1, id2, phyreg; 13047 int i, rv; 13048 13049 if (((sc->sc_flags & WM_F_SGMII) == 0) 13050 || ((sc->sc_flags & WM_F_SFP) == 0)) 13051 return; 13052 13053 for (i = 0; i < MII_NPHY; i++) { 13054 sc->phy.no_errprint = true; 13055 rv = sc->phy.readreg_locked(sc->sc_dev, i, MII_PHYIDR1, &id1); 13056 if (rv != 0) 13057 continue; 13058 rv = sc->phy.readreg_locked(sc->sc_dev, i, MII_PHYIDR2, &id2); 13059 if (rv != 0) 13060 continue; 13061 if (MII_OUI(id1, id2) != MII_OUI_xxMARVELL) 13062 continue; 13063 sc->phy.no_errprint = false; 13064 13065 sc->phy.readreg_locked(sc->sc_dev, i, MAKPHY_ESSR, &phyreg); 13066 phyreg &= ~(ESSR_SER_ANEG_BYPASS | ESSR_HWCFG_MODE); 13067 phyreg |= ESSR_SGMII_WOC_COPPER; 13068 sc->phy.writereg_locked(sc->sc_dev, i, MAKPHY_ESSR, phyreg); 13069 break; 13070 } 13071 13072 } 13073 13074 /* 13075 * wm_sgmii_readreg: [mii interface function] 13076 * 13077 * Read a PHY register on the SGMII 13078 * This could be handled by the PHY layer if we didn't have to lock the 13079 * resource ... 13080 */ 13081 static int 13082 wm_sgmii_readreg(device_t dev, int phy, int reg, uint16_t *val) 13083 { 13084 struct wm_softc *sc = device_private(dev); 13085 int rv; 13086 13087 rv = sc->phy.acquire(sc); 13088 if (rv != 0) { 13089 device_printf(dev, "%s: failed to get semaphore\n", __func__); 13090 return rv; 13091 } 13092 13093 rv = wm_sgmii_readreg_locked(dev, phy, reg, val); 13094 13095 sc->phy.release(sc); 13096 return rv; 13097 } 13098 13099 static int 13100 wm_sgmii_readreg_locked(device_t dev, int phy, int reg, uint16_t *val) 13101 { 13102 struct wm_softc *sc = device_private(dev); 13103 uint32_t i2ccmd; 13104 int i, rv = 0; 13105 13106 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT) 13107 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_READ; 13108 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 13109 13110 /* Poll the ready bit */ 13111 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 13112 delay(50); 13113 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 13114 if (i2ccmd & I2CCMD_READY) 13115 break; 13116 } 13117 if ((i2ccmd & I2CCMD_READY) == 0) { 13118 device_printf(dev, "I2CCMD Read did not complete\n"); 13119 rv = ETIMEDOUT; 13120 } 13121 if ((i2ccmd & I2CCMD_ERROR) != 0) { 13122 if (!sc->phy.no_errprint) 13123 device_printf(dev, "I2CCMD Error bit set\n"); 13124 rv = EIO; 13125 } 13126 13127 *val = (uint16_t)((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00); 13128 13129 return rv; 13130 } 13131 13132 /* 13133 * wm_sgmii_writereg: [mii interface function] 13134 * 13135 * Write a PHY register on the SGMII. 13136 * This could be handled by the PHY layer if we didn't have to lock the 13137 * resource ... 13138 */ 13139 static int 13140 wm_sgmii_writereg(device_t dev, int phy, int reg, uint16_t val) 13141 { 13142 struct wm_softc *sc = device_private(dev); 13143 int rv; 13144 13145 rv = sc->phy.acquire(sc); 13146 if (rv != 0) { 13147 device_printf(dev, "%s: failed to get semaphore\n", __func__); 13148 return rv; 13149 } 13150 13151 rv = wm_sgmii_writereg_locked(dev, phy, reg, val); 13152 13153 sc->phy.release(sc); 13154 13155 return rv; 13156 } 13157 13158 static int 13159 wm_sgmii_writereg_locked(device_t dev, int phy, int reg, uint16_t val) 13160 { 13161 struct wm_softc *sc = device_private(dev); 13162 uint32_t i2ccmd; 13163 uint16_t swapdata; 13164 int rv = 0; 13165 int i; 13166 13167 /* Swap the data bytes for the I2C interface */ 13168 swapdata = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00); 13169 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT) 13170 | (phy << I2CCMD_PHY_ADDR_SHIFT) | I2CCMD_OPCODE_WRITE | swapdata; 13171 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 13172 13173 /* Poll the ready bit */ 13174 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 13175 delay(50); 13176 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 13177 if (i2ccmd & I2CCMD_READY) 13178 break; 13179 } 13180 if ((i2ccmd & I2CCMD_READY) == 0) { 13181 device_printf(dev, "I2CCMD Write did not complete\n"); 13182 rv = ETIMEDOUT; 13183 } 13184 if ((i2ccmd & I2CCMD_ERROR) != 0) { 13185 device_printf(dev, "I2CCMD Error bit set\n"); 13186 rv = EIO; 13187 } 13188 13189 return rv; 13190 } 13191 13192 /* TBI related */ 13193 13194 static bool 13195 wm_tbi_havesignal(struct wm_softc *sc, uint32_t ctrl) 13196 { 13197 bool sig; 13198 13199 sig = ctrl & CTRL_SWDPIN(1); 13200 13201 /* 13202 * On 82543 and 82544, the CTRL_SWDPIN(1) bit will be 0 if the optics 13203 * detect a signal, 1 if they don't. 13204 */ 13205 if ((sc->sc_type == WM_T_82543) || (sc->sc_type == WM_T_82544)) 13206 sig = !sig; 13207 13208 return sig; 13209 } 13210 13211 /* 13212 * wm_tbi_mediainit: 13213 * 13214 * Initialize media for use on 1000BASE-X devices. 13215 */ 13216 static void 13217 wm_tbi_mediainit(struct wm_softc *sc) 13218 { 13219 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 13220 const char *sep = ""; 13221 13222 if (sc->sc_type < WM_T_82543) 13223 sc->sc_tipg = TIPG_WM_DFLT; 13224 else 13225 sc->sc_tipg = TIPG_LG_DFLT; 13226 13227 sc->sc_tbi_serdes_anegticks = 5; 13228 13229 /* Initialize our media structures */ 13230 sc->sc_mii.mii_ifp = ifp; 13231 sc->sc_ethercom.ec_mii = &sc->sc_mii; 13232 13233 ifp->if_baudrate = IF_Gbps(1); 13234 if (((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) 13235 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) { 13236 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK, 13237 wm_serdes_mediachange, wm_serdes_mediastatus, 13238 sc->sc_core_lock); 13239 } else { 13240 ifmedia_init_with_lock(&sc->sc_mii.mii_media, IFM_IMASK, 13241 wm_tbi_mediachange, wm_tbi_mediastatus, sc->sc_core_lock); 13242 } 13243 13244 /* 13245 * SWD Pins: 13246 * 13247 * 0 = Link LED (output) 13248 * 1 = Loss Of Signal (input) 13249 */ 13250 sc->sc_ctrl |= CTRL_SWDPIO(0); 13251 13252 /* XXX Perhaps this is only for TBI */ 13253 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES) 13254 sc->sc_ctrl &= ~CTRL_SWDPIO(1); 13255 13256 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) 13257 sc->sc_ctrl &= ~CTRL_LRST; 13258 13259 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 13260 13261 #define ADD(ss, mm, dd) \ 13262 do { \ 13263 aprint_normal("%s%s", sep, ss); \ 13264 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \ 13265 sep = ", "; \ 13266 } while (/*CONSTCOND*/0) 13267 13268 aprint_normal_dev(sc->sc_dev, ""); 13269 13270 if (sc->sc_type == WM_T_I354) { 13271 uint32_t status; 13272 13273 status = CSR_READ(sc, WMREG_STATUS); 13274 if (((status & STATUS_2P5_SKU) != 0) 13275 && ((status & STATUS_2P5_SKU_OVER) == 0)) { 13276 ADD("2500baseKX-FDX", IFM_2500_KX | IFM_FDX,ANAR_X_FD); 13277 } else 13278 ADD("1000baseKX-FDX", IFM_1000_KX | IFM_FDX,ANAR_X_FD); 13279 } else if (sc->sc_type == WM_T_82545) { 13280 /* Only 82545 is LX (XXX except SFP) */ 13281 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD); 13282 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD); 13283 } else if (sc->sc_sfptype != 0) { 13284 /* XXX wm(4) fiber/serdes don't use ifm_data */ 13285 switch (sc->sc_sfptype) { 13286 default: 13287 case SFF_SFP_ETH_FLAGS_1000SX: 13288 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD); 13289 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD); 13290 break; 13291 case SFF_SFP_ETH_FLAGS_1000LX: 13292 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD); 13293 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD); 13294 break; 13295 case SFF_SFP_ETH_FLAGS_1000CX: 13296 ADD("1000baseCX", IFM_1000_CX, ANAR_X_HD); 13297 ADD("1000baseCX-FDX", IFM_1000_CX | IFM_FDX, ANAR_X_FD); 13298 break; 13299 case SFF_SFP_ETH_FLAGS_1000T: 13300 ADD("1000baseT", IFM_1000_T, 0); 13301 ADD("1000baseT-FDX", IFM_1000_T | IFM_FDX, 0); 13302 break; 13303 case SFF_SFP_ETH_FLAGS_100FX: 13304 ADD("100baseFX", IFM_100_FX, ANAR_TX); 13305 ADD("100baseFX-FDX", IFM_100_FX | IFM_FDX, ANAR_TX_FD); 13306 break; 13307 } 13308 } else { 13309 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD); 13310 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD); 13311 } 13312 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD); 13313 aprint_normal("\n"); 13314 13315 #undef ADD 13316 13317 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO); 13318 } 13319 13320 /* 13321 * wm_tbi_mediachange: [ifmedia interface function] 13322 * 13323 * Set hardware to newly-selected media on a 1000BASE-X device. 13324 */ 13325 static int 13326 wm_tbi_mediachange(struct ifnet *ifp) 13327 { 13328 struct wm_softc *sc = ifp->if_softc; 13329 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 13330 uint32_t status, ctrl; 13331 bool signal; 13332 int i; 13333 13334 KASSERT(sc->sc_mediatype != WM_MEDIATYPE_COPPER); 13335 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) { 13336 /* XXX need some work for >= 82571 and < 82575 */ 13337 if (sc->sc_type < WM_T_82575) 13338 return 0; 13339 } 13340 13341 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572) 13342 || (sc->sc_type >= WM_T_82575)) 13343 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK); 13344 13345 sc->sc_ctrl &= ~CTRL_LRST; 13346 sc->sc_txcw = TXCW_ANE; 13347 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 13348 sc->sc_txcw |= TXCW_FD | TXCW_HD; 13349 else if (ife->ifm_media & IFM_FDX) 13350 sc->sc_txcw |= TXCW_FD; 13351 else 13352 sc->sc_txcw |= TXCW_HD; 13353 13354 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0) 13355 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE; 13356 13357 DPRINTF(sc, WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n", 13358 device_xname(sc->sc_dev), sc->sc_txcw)); 13359 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 13360 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 13361 CSR_WRITE_FLUSH(sc); 13362 delay(1000); 13363 13364 ctrl = CSR_READ(sc, WMREG_CTRL); 13365 signal = wm_tbi_havesignal(sc, ctrl); 13366 13367 DPRINTF(sc, WM_DEBUG_LINK, 13368 ("%s: signal = %d\n", device_xname(sc->sc_dev), signal)); 13369 13370 if (signal) { 13371 /* Have signal; wait for the link to come up. */ 13372 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) { 13373 delay(10000); 13374 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU) 13375 break; 13376 } 13377 13378 DPRINTF(sc, WM_DEBUG_LINK, 13379 ("%s: i = %d after waiting for link\n", 13380 device_xname(sc->sc_dev), i)); 13381 13382 status = CSR_READ(sc, WMREG_STATUS); 13383 DPRINTF(sc, WM_DEBUG_LINK, 13384 ("%s: status after final read = 0x%x, STATUS_LU = %#" 13385 __PRIxBIT "\n", 13386 device_xname(sc->sc_dev), status, STATUS_LU)); 13387 if (status & STATUS_LU) { 13388 /* Link is up. */ 13389 DPRINTF(sc, WM_DEBUG_LINK, 13390 ("%s: LINK: set media -> link up %s\n", 13391 device_xname(sc->sc_dev), 13392 (status & STATUS_FD) ? "FDX" : "HDX")); 13393 13394 /* 13395 * NOTE: CTRL will update TFCE and RFCE automatically, 13396 * so we should update sc->sc_ctrl 13397 */ 13398 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 13399 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 13400 sc->sc_fcrtl &= ~FCRTL_XONE; 13401 if (status & STATUS_FD) 13402 sc->sc_tctl |= 13403 TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 13404 else 13405 sc->sc_tctl |= 13406 TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 13407 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE) 13408 sc->sc_fcrtl |= FCRTL_XONE; 13409 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 13410 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 13411 WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl); 13412 sc->sc_tbi_linkup = 1; 13413 } else { 13414 if (i == WM_LINKUP_TIMEOUT) 13415 wm_check_for_link(sc); 13416 /* Link is down. */ 13417 DPRINTF(sc, WM_DEBUG_LINK, 13418 ("%s: LINK: set media -> link down\n", 13419 device_xname(sc->sc_dev))); 13420 sc->sc_tbi_linkup = 0; 13421 } 13422 } else { 13423 DPRINTF(sc, WM_DEBUG_LINK, 13424 ("%s: LINK: set media -> no signal\n", 13425 device_xname(sc->sc_dev))); 13426 sc->sc_tbi_linkup = 0; 13427 } 13428 13429 wm_tbi_serdes_set_linkled(sc); 13430 13431 return 0; 13432 } 13433 13434 /* 13435 * wm_tbi_mediastatus: [ifmedia interface function] 13436 * 13437 * Get the current interface media status on a 1000BASE-X device. 13438 */ 13439 static void 13440 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 13441 { 13442 struct wm_softc *sc = ifp->if_softc; 13443 uint32_t ctrl, status; 13444 13445 ifmr->ifm_status = IFM_AVALID; 13446 ifmr->ifm_active = IFM_ETHER; 13447 13448 status = CSR_READ(sc, WMREG_STATUS); 13449 if ((status & STATUS_LU) == 0) { 13450 ifmr->ifm_active |= IFM_NONE; 13451 return; 13452 } 13453 13454 ifmr->ifm_status |= IFM_ACTIVE; 13455 /* Only 82545 is LX */ 13456 if (sc->sc_type == WM_T_82545) 13457 ifmr->ifm_active |= IFM_1000_LX; 13458 else 13459 ifmr->ifm_active |= IFM_1000_SX; 13460 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD) 13461 ifmr->ifm_active |= IFM_FDX; 13462 else 13463 ifmr->ifm_active |= IFM_HDX; 13464 ctrl = CSR_READ(sc, WMREG_CTRL); 13465 if (ctrl & CTRL_RFCE) 13466 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE; 13467 if (ctrl & CTRL_TFCE) 13468 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE; 13469 } 13470 13471 /* XXX TBI only */ 13472 static int 13473 wm_check_for_link(struct wm_softc *sc) 13474 { 13475 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 13476 uint32_t rxcw; 13477 uint32_t ctrl; 13478 uint32_t status; 13479 bool signal; 13480 13481 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s called\n", 13482 device_xname(sc->sc_dev), __func__)); 13483 13484 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) { 13485 /* XXX need some work for >= 82571 */ 13486 if (sc->sc_type >= WM_T_82571) { 13487 sc->sc_tbi_linkup = 1; 13488 return 0; 13489 } 13490 } 13491 13492 rxcw = CSR_READ(sc, WMREG_RXCW); 13493 ctrl = CSR_READ(sc, WMREG_CTRL); 13494 status = CSR_READ(sc, WMREG_STATUS); 13495 signal = wm_tbi_havesignal(sc, ctrl); 13496 13497 DPRINTF(sc, WM_DEBUG_LINK, 13498 ("%s: %s: signal = %d, status_lu = %d, rxcw_c = %d\n", 13499 device_xname(sc->sc_dev), __func__, signal, 13500 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0))); 13501 13502 /* 13503 * SWDPIN LU RXCW 13504 * 0 0 0 13505 * 0 0 1 (should not happen) 13506 * 0 1 0 (should not happen) 13507 * 0 1 1 (should not happen) 13508 * 1 0 0 Disable autonego and force linkup 13509 * 1 0 1 got /C/ but not linkup yet 13510 * 1 1 0 (linkup) 13511 * 1 1 1 If IFM_AUTO, back to autonego 13512 * 13513 */ 13514 if (signal && ((status & STATUS_LU) == 0) && ((rxcw & RXCW_C) == 0)) { 13515 DPRINTF(sc, WM_DEBUG_LINK, 13516 ("%s: %s: force linkup and fullduplex\n", 13517 device_xname(sc->sc_dev), __func__)); 13518 sc->sc_tbi_linkup = 0; 13519 /* Disable auto-negotiation in the TXCW register */ 13520 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE)); 13521 13522 /* 13523 * Force link-up and also force full-duplex. 13524 * 13525 * NOTE: CTRL was updated TFCE and RFCE automatically, 13526 * so we should update sc->sc_ctrl 13527 */ 13528 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD; 13529 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 13530 } else if (((status & STATUS_LU) != 0) 13531 && ((rxcw & RXCW_C) != 0) 13532 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) { 13533 sc->sc_tbi_linkup = 1; 13534 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: go back to autonego\n", 13535 device_xname(sc->sc_dev), __func__)); 13536 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 13537 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU)); 13538 } else if (signal && ((rxcw & RXCW_C) != 0)) { 13539 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: /C/", 13540 device_xname(sc->sc_dev), __func__)); 13541 } else { 13542 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: linkup %08x,%08x,%08x\n", 13543 device_xname(sc->sc_dev), __func__, rxcw, ctrl, 13544 status)); 13545 } 13546 13547 return 0; 13548 } 13549 13550 /* 13551 * wm_tbi_tick: 13552 * 13553 * Check the link on TBI devices. 13554 * This function acts as mii_tick(). 13555 */ 13556 static void 13557 wm_tbi_tick(struct wm_softc *sc) 13558 { 13559 struct mii_data *mii = &sc->sc_mii; 13560 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 13561 uint32_t status; 13562 13563 KASSERT(mutex_owned(sc->sc_core_lock)); 13564 13565 status = CSR_READ(sc, WMREG_STATUS); 13566 13567 /* XXX is this needed? */ 13568 (void)CSR_READ(sc, WMREG_RXCW); 13569 (void)CSR_READ(sc, WMREG_CTRL); 13570 13571 /* set link status */ 13572 if ((status & STATUS_LU) == 0) { 13573 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: checklink -> down\n", 13574 device_xname(sc->sc_dev))); 13575 sc->sc_tbi_linkup = 0; 13576 } else if (sc->sc_tbi_linkup == 0) { 13577 DPRINTF(sc, WM_DEBUG_LINK, ("%s: LINK: checklink -> up %s\n", 13578 device_xname(sc->sc_dev), 13579 (status & STATUS_FD) ? "FDX" : "HDX")); 13580 sc->sc_tbi_linkup = 1; 13581 sc->sc_tbi_serdes_ticks = 0; 13582 } 13583 13584 if ((sc->sc_if_flags & IFF_UP) == 0) 13585 goto setled; 13586 13587 if ((status & STATUS_LU) == 0) { 13588 sc->sc_tbi_linkup = 0; 13589 /* If the timer expired, retry autonegotiation */ 13590 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 13591 && (++sc->sc_tbi_serdes_ticks 13592 >= sc->sc_tbi_serdes_anegticks)) { 13593 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: EXPIRE\n", 13594 device_xname(sc->sc_dev), __func__)); 13595 sc->sc_tbi_serdes_ticks = 0; 13596 /* 13597 * Reset the link, and let autonegotiation do 13598 * its thing 13599 */ 13600 sc->sc_ctrl |= CTRL_LRST; 13601 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 13602 CSR_WRITE_FLUSH(sc); 13603 delay(1000); 13604 sc->sc_ctrl &= ~CTRL_LRST; 13605 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 13606 CSR_WRITE_FLUSH(sc); 13607 delay(1000); 13608 CSR_WRITE(sc, WMREG_TXCW, 13609 sc->sc_txcw & ~TXCW_ANE); 13610 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 13611 } 13612 } 13613 13614 setled: 13615 wm_tbi_serdes_set_linkled(sc); 13616 } 13617 13618 /* SERDES related */ 13619 static void 13620 wm_serdes_power_up_link_82575(struct wm_softc *sc) 13621 { 13622 uint32_t reg; 13623 13624 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES) 13625 && ((sc->sc_flags & WM_F_SGMII) == 0)) 13626 return; 13627 13628 /* Enable PCS to turn on link */ 13629 reg = CSR_READ(sc, WMREG_PCS_CFG); 13630 reg |= PCS_CFG_PCS_EN; 13631 CSR_WRITE(sc, WMREG_PCS_CFG, reg); 13632 13633 /* Power up the laser */ 13634 reg = CSR_READ(sc, WMREG_CTRL_EXT); 13635 reg &= ~CTRL_EXT_SWDPIN(3); 13636 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 13637 13638 /* Flush the write to verify completion */ 13639 CSR_WRITE_FLUSH(sc); 13640 delay(1000); 13641 } 13642 13643 static int 13644 wm_serdes_mediachange(struct ifnet *ifp) 13645 { 13646 struct wm_softc *sc = ifp->if_softc; 13647 bool pcs_autoneg = true; /* XXX */ 13648 uint32_t ctrl_ext, pcs_lctl, reg; 13649 13650 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES) 13651 && ((sc->sc_flags & WM_F_SGMII) == 0)) 13652 return 0; 13653 13654 /* XXX Currently, this function is not called on 8257[12] */ 13655 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572) 13656 || (sc->sc_type >= WM_T_82575)) 13657 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK); 13658 13659 /* Power on the sfp cage if present */ 13660 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 13661 ctrl_ext &= ~CTRL_EXT_SWDPIN(3); 13662 ctrl_ext |= CTRL_EXT_I2C_ENA; 13663 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 13664 13665 sc->sc_ctrl |= CTRL_SLU; 13666 13667 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) { 13668 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1); 13669 13670 reg = CSR_READ(sc, WMREG_CONNSW); 13671 reg |= CONNSW_ENRGSRC; 13672 CSR_WRITE(sc, WMREG_CONNSW, reg); 13673 } 13674 13675 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL); 13676 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) { 13677 case CTRL_EXT_LINK_MODE_SGMII: 13678 /* SGMII mode lets the phy handle forcing speed/duplex */ 13679 pcs_autoneg = true; 13680 /* Autoneg time out should be disabled for SGMII mode */ 13681 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT; 13682 break; 13683 case CTRL_EXT_LINK_MODE_1000KX: 13684 pcs_autoneg = false; 13685 /* FALLTHROUGH */ 13686 default: 13687 if ((sc->sc_type == WM_T_82575) 13688 || (sc->sc_type == WM_T_82576)) { 13689 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0) 13690 pcs_autoneg = false; 13691 } 13692 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD 13693 | CTRL_FRCFDX; 13694 13695 /* Set speed of 1000/Full if speed/duplex is forced */ 13696 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL; 13697 } 13698 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 13699 13700 pcs_lctl &= ~(PCS_LCTL_AN_ENABLE | PCS_LCTL_FLV_LINK_UP | 13701 PCS_LCTL_FSD | PCS_LCTL_FORCE_LINK); 13702 13703 if (pcs_autoneg) { 13704 /* Set PCS register for autoneg */ 13705 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART; 13706 13707 /* Disable force flow control for autoneg */ 13708 pcs_lctl &= ~PCS_LCTL_FORCE_FC; 13709 13710 /* Configure flow control advertisement for autoneg */ 13711 reg = CSR_READ(sc, WMREG_PCS_ANADV); 13712 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE); 13713 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE; 13714 CSR_WRITE(sc, WMREG_PCS_ANADV, reg); 13715 } else 13716 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC; 13717 13718 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl); 13719 13720 return 0; 13721 } 13722 13723 static void 13724 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 13725 { 13726 struct wm_softc *sc = ifp->if_softc; 13727 struct mii_data *mii = &sc->sc_mii; 13728 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 13729 uint32_t pcs_adv, pcs_lpab, reg; 13730 13731 ifmr->ifm_status = IFM_AVALID; 13732 ifmr->ifm_active = IFM_ETHER; 13733 13734 /* Check PCS */ 13735 reg = CSR_READ(sc, WMREG_PCS_LSTS); 13736 if ((reg & PCS_LSTS_LINKOK) == 0) { 13737 ifmr->ifm_active |= IFM_NONE; 13738 sc->sc_tbi_linkup = 0; 13739 goto setled; 13740 } 13741 13742 sc->sc_tbi_linkup = 1; 13743 ifmr->ifm_status |= IFM_ACTIVE; 13744 if (sc->sc_type == WM_T_I354) { 13745 uint32_t status; 13746 13747 status = CSR_READ(sc, WMREG_STATUS); 13748 if (((status & STATUS_2P5_SKU) != 0) 13749 && ((status & STATUS_2P5_SKU_OVER) == 0)) { 13750 ifmr->ifm_active |= IFM_2500_KX; 13751 } else 13752 ifmr->ifm_active |= IFM_1000_KX; 13753 } else { 13754 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) { 13755 case PCS_LSTS_SPEED_10: 13756 ifmr->ifm_active |= IFM_10_T; /* XXX */ 13757 break; 13758 case PCS_LSTS_SPEED_100: 13759 ifmr->ifm_active |= IFM_100_FX; /* XXX */ 13760 break; 13761 case PCS_LSTS_SPEED_1000: 13762 ifmr->ifm_active |= IFM_1000_SX; /* XXX */ 13763 break; 13764 default: 13765 device_printf(sc->sc_dev, "Unknown speed\n"); 13766 ifmr->ifm_active |= IFM_1000_SX; /* XXX */ 13767 break; 13768 } 13769 } 13770 ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active); 13771 if ((reg & PCS_LSTS_FDX) != 0) 13772 ifmr->ifm_active |= IFM_FDX; 13773 else 13774 ifmr->ifm_active |= IFM_HDX; 13775 mii->mii_media_active &= ~IFM_ETH_FMASK; 13776 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 13777 /* Check flow */ 13778 reg = CSR_READ(sc, WMREG_PCS_LSTS); 13779 if ((reg & PCS_LSTS_AN_COMP) == 0) { 13780 DPRINTF(sc, WM_DEBUG_LINK, 13781 ("XXX LINKOK but not ACOMP\n")); 13782 goto setled; 13783 } 13784 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV); 13785 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB); 13786 DPRINTF(sc, WM_DEBUG_LINK, 13787 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab)); 13788 if ((pcs_adv & TXCW_SYM_PAUSE) 13789 && (pcs_lpab & TXCW_SYM_PAUSE)) { 13790 mii->mii_media_active |= IFM_FLOW 13791 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 13792 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0) 13793 && (pcs_adv & TXCW_ASYM_PAUSE) 13794 && (pcs_lpab & TXCW_SYM_PAUSE) 13795 && (pcs_lpab & TXCW_ASYM_PAUSE)) { 13796 mii->mii_media_active |= IFM_FLOW 13797 | IFM_ETH_TXPAUSE; 13798 } else if ((pcs_adv & TXCW_SYM_PAUSE) 13799 && (pcs_adv & TXCW_ASYM_PAUSE) 13800 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0) 13801 && (pcs_lpab & TXCW_ASYM_PAUSE)) { 13802 mii->mii_media_active |= IFM_FLOW 13803 | IFM_ETH_RXPAUSE; 13804 } 13805 } 13806 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) 13807 | (mii->mii_media_active & IFM_ETH_FMASK); 13808 setled: 13809 wm_tbi_serdes_set_linkled(sc); 13810 } 13811 13812 /* 13813 * wm_serdes_tick: 13814 * 13815 * Check the link on serdes devices. 13816 */ 13817 static void 13818 wm_serdes_tick(struct wm_softc *sc) 13819 { 13820 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 13821 struct mii_data *mii = &sc->sc_mii; 13822 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 13823 uint32_t reg; 13824 13825 KASSERT(mutex_owned(sc->sc_core_lock)); 13826 13827 mii->mii_media_status = IFM_AVALID; 13828 mii->mii_media_active = IFM_ETHER; 13829 13830 /* Check PCS */ 13831 reg = CSR_READ(sc, WMREG_PCS_LSTS); 13832 if ((reg & PCS_LSTS_LINKOK) != 0) { 13833 mii->mii_media_status |= IFM_ACTIVE; 13834 sc->sc_tbi_linkup = 1; 13835 sc->sc_tbi_serdes_ticks = 0; 13836 mii->mii_media_active |= IFM_1000_SX; /* XXX */ 13837 if ((reg & PCS_LSTS_FDX) != 0) 13838 mii->mii_media_active |= IFM_FDX; 13839 else 13840 mii->mii_media_active |= IFM_HDX; 13841 } else { 13842 mii->mii_media_status |= IFM_NONE; 13843 sc->sc_tbi_linkup = 0; 13844 /* If the timer expired, retry autonegotiation */ 13845 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 13846 && (++sc->sc_tbi_serdes_ticks 13847 >= sc->sc_tbi_serdes_anegticks)) { 13848 DPRINTF(sc, WM_DEBUG_LINK, ("%s: %s: EXPIRE\n", 13849 device_xname(sc->sc_dev), __func__)); 13850 sc->sc_tbi_serdes_ticks = 0; 13851 /* XXX */ 13852 wm_serdes_mediachange(ifp); 13853 } 13854 } 13855 13856 wm_tbi_serdes_set_linkled(sc); 13857 } 13858 13859 /* SFP related */ 13860 13861 static int 13862 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data) 13863 { 13864 uint32_t i2ccmd; 13865 int i; 13866 13867 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ; 13868 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 13869 13870 /* Poll the ready bit */ 13871 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 13872 delay(50); 13873 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 13874 if (i2ccmd & I2CCMD_READY) 13875 break; 13876 } 13877 if ((i2ccmd & I2CCMD_READY) == 0) 13878 return -1; 13879 if ((i2ccmd & I2CCMD_ERROR) != 0) 13880 return -1; 13881 13882 *data = i2ccmd & 0x00ff; 13883 13884 return 0; 13885 } 13886 13887 static uint32_t 13888 wm_sfp_get_media_type(struct wm_softc *sc) 13889 { 13890 uint32_t ctrl_ext; 13891 uint8_t val = 0; 13892 int timeout = 3; 13893 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN; 13894 int rv = -1; 13895 13896 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 13897 ctrl_ext &= ~CTRL_EXT_SWDPIN(3); 13898 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA); 13899 CSR_WRITE_FLUSH(sc); 13900 13901 /* Read SFP module data */ 13902 while (timeout) { 13903 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val); 13904 if (rv == 0) 13905 break; 13906 delay(100*1000); /* XXX too big */ 13907 timeout--; 13908 } 13909 if (rv != 0) 13910 goto out; 13911 13912 switch (val) { 13913 case SFF_SFP_ID_SFF: 13914 aprint_normal_dev(sc->sc_dev, 13915 "Module/Connector soldered to board\n"); 13916 break; 13917 case SFF_SFP_ID_SFP: 13918 sc->sc_flags |= WM_F_SFP; 13919 break; 13920 case SFF_SFP_ID_UNKNOWN: 13921 goto out; 13922 default: 13923 break; 13924 } 13925 13926 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val); 13927 if (rv != 0) 13928 goto out; 13929 13930 sc->sc_sfptype = val; 13931 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0) 13932 mediatype = WM_MEDIATYPE_SERDES; 13933 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0) { 13934 sc->sc_flags |= WM_F_SGMII; 13935 mediatype = WM_MEDIATYPE_COPPER; 13936 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0) { 13937 sc->sc_flags |= WM_F_SGMII; 13938 mediatype = WM_MEDIATYPE_SERDES; 13939 } else { 13940 device_printf(sc->sc_dev, "%s: unknown media type? (0x%hhx)\n", 13941 __func__, sc->sc_sfptype); 13942 sc->sc_sfptype = 0; /* XXX unknown */ 13943 } 13944 13945 out: 13946 /* Restore I2C interface setting */ 13947 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 13948 13949 return mediatype; 13950 } 13951 13952 /* 13953 * NVM related. 13954 * Microwire, SPI (w/wo EERD) and Flash. 13955 */ 13956 13957 /* Both spi and uwire */ 13958 13959 /* 13960 * wm_eeprom_sendbits: 13961 * 13962 * Send a series of bits to the EEPROM. 13963 */ 13964 static void 13965 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits) 13966 { 13967 uint32_t reg; 13968 int x; 13969 13970 reg = CSR_READ(sc, WMREG_EECD); 13971 13972 for (x = nbits; x > 0; x--) { 13973 if (bits & (1U << (x - 1))) 13974 reg |= EECD_DI; 13975 else 13976 reg &= ~EECD_DI; 13977 CSR_WRITE(sc, WMREG_EECD, reg); 13978 CSR_WRITE_FLUSH(sc); 13979 delay(2); 13980 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK); 13981 CSR_WRITE_FLUSH(sc); 13982 delay(2); 13983 CSR_WRITE(sc, WMREG_EECD, reg); 13984 CSR_WRITE_FLUSH(sc); 13985 delay(2); 13986 } 13987 } 13988 13989 /* 13990 * wm_eeprom_recvbits: 13991 * 13992 * Receive a series of bits from the EEPROM. 13993 */ 13994 static void 13995 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits) 13996 { 13997 uint32_t reg, val; 13998 int x; 13999 14000 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI; 14001 14002 val = 0; 14003 for (x = nbits; x > 0; x--) { 14004 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK); 14005 CSR_WRITE_FLUSH(sc); 14006 delay(2); 14007 if (CSR_READ(sc, WMREG_EECD) & EECD_DO) 14008 val |= (1U << (x - 1)); 14009 CSR_WRITE(sc, WMREG_EECD, reg); 14010 CSR_WRITE_FLUSH(sc); 14011 delay(2); 14012 } 14013 *valp = val; 14014 } 14015 14016 /* Microwire */ 14017 14018 /* 14019 * wm_nvm_read_uwire: 14020 * 14021 * Read a word from the EEPROM using the MicroWire protocol. 14022 */ 14023 static int 14024 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 14025 { 14026 uint32_t reg, val; 14027 int i, rv; 14028 14029 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14030 device_xname(sc->sc_dev), __func__)); 14031 14032 rv = sc->nvm.acquire(sc); 14033 if (rv != 0) 14034 return rv; 14035 14036 for (i = 0; i < wordcnt; i++) { 14037 /* Clear SK and DI. */ 14038 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI); 14039 CSR_WRITE(sc, WMREG_EECD, reg); 14040 14041 /* 14042 * XXX: workaround for a bug in qemu-0.12.x and prior 14043 * and Xen. 14044 * 14045 * We use this workaround only for 82540 because qemu's 14046 * e1000 act as 82540. 14047 */ 14048 if (sc->sc_type == WM_T_82540) { 14049 reg |= EECD_SK; 14050 CSR_WRITE(sc, WMREG_EECD, reg); 14051 reg &= ~EECD_SK; 14052 CSR_WRITE(sc, WMREG_EECD, reg); 14053 CSR_WRITE_FLUSH(sc); 14054 delay(2); 14055 } 14056 /* XXX: end of workaround */ 14057 14058 /* Set CHIP SELECT. */ 14059 reg |= EECD_CS; 14060 CSR_WRITE(sc, WMREG_EECD, reg); 14061 CSR_WRITE_FLUSH(sc); 14062 delay(2); 14063 14064 /* Shift in the READ command. */ 14065 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3); 14066 14067 /* Shift in address. */ 14068 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits); 14069 14070 /* Shift out the data. */ 14071 wm_eeprom_recvbits(sc, &val, 16); 14072 data[i] = val & 0xffff; 14073 14074 /* Clear CHIP SELECT. */ 14075 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS; 14076 CSR_WRITE(sc, WMREG_EECD, reg); 14077 CSR_WRITE_FLUSH(sc); 14078 delay(2); 14079 } 14080 14081 sc->nvm.release(sc); 14082 return 0; 14083 } 14084 14085 /* SPI */ 14086 14087 /* 14088 * Set SPI and FLASH related information from the EECD register. 14089 * For 82541 and 82547, the word size is taken from EEPROM. 14090 */ 14091 static int 14092 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc) 14093 { 14094 int size; 14095 uint32_t reg; 14096 uint16_t data; 14097 14098 reg = CSR_READ(sc, WMREG_EECD); 14099 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8; 14100 14101 /* Read the size of NVM from EECD by default */ 14102 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK); 14103 switch (sc->sc_type) { 14104 case WM_T_82541: 14105 case WM_T_82541_2: 14106 case WM_T_82547: 14107 case WM_T_82547_2: 14108 /* Set dummy value to access EEPROM */ 14109 sc->sc_nvm_wordsize = 64; 14110 if (wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data) != 0) { 14111 aprint_error_dev(sc->sc_dev, 14112 "%s: failed to read EEPROM size\n", __func__); 14113 } 14114 reg = data; 14115 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK); 14116 if (size == 0) 14117 size = 6; /* 64 word size */ 14118 else 14119 size += NVM_WORD_SIZE_BASE_SHIFT + 1; 14120 break; 14121 case WM_T_80003: 14122 case WM_T_82571: 14123 case WM_T_82572: 14124 case WM_T_82573: /* SPI case */ 14125 case WM_T_82574: /* SPI case */ 14126 case WM_T_82583: /* SPI case */ 14127 size += NVM_WORD_SIZE_BASE_SHIFT; 14128 if (size > 14) 14129 size = 14; 14130 break; 14131 case WM_T_82575: 14132 case WM_T_82576: 14133 case WM_T_82580: 14134 case WM_T_I350: 14135 case WM_T_I354: 14136 case WM_T_I210: 14137 case WM_T_I211: 14138 size += NVM_WORD_SIZE_BASE_SHIFT; 14139 if (size > 15) 14140 size = 15; 14141 break; 14142 default: 14143 aprint_error_dev(sc->sc_dev, 14144 "%s: unknown device(%d)?\n", __func__, sc->sc_type); 14145 return -1; 14146 break; 14147 } 14148 14149 sc->sc_nvm_wordsize = 1 << size; 14150 14151 return 0; 14152 } 14153 14154 /* 14155 * wm_nvm_ready_spi: 14156 * 14157 * Wait for a SPI EEPROM to be ready for commands. 14158 */ 14159 static int 14160 wm_nvm_ready_spi(struct wm_softc *sc) 14161 { 14162 uint32_t val; 14163 int usec; 14164 14165 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14166 device_xname(sc->sc_dev), __func__)); 14167 14168 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) { 14169 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8); 14170 wm_eeprom_recvbits(sc, &val, 8); 14171 if ((val & SPI_SR_RDY) == 0) 14172 break; 14173 } 14174 if (usec >= SPI_MAX_RETRIES) { 14175 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n"); 14176 return -1; 14177 } 14178 return 0; 14179 } 14180 14181 /* 14182 * wm_nvm_read_spi: 14183 * 14184 * Read a work from the EEPROM using the SPI protocol. 14185 */ 14186 static int 14187 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 14188 { 14189 uint32_t reg, val; 14190 int i; 14191 uint8_t opc; 14192 int rv; 14193 14194 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14195 device_xname(sc->sc_dev), __func__)); 14196 14197 rv = sc->nvm.acquire(sc); 14198 if (rv != 0) 14199 return rv; 14200 14201 /* Clear SK and CS. */ 14202 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS); 14203 CSR_WRITE(sc, WMREG_EECD, reg); 14204 CSR_WRITE_FLUSH(sc); 14205 delay(2); 14206 14207 if ((rv = wm_nvm_ready_spi(sc)) != 0) 14208 goto out; 14209 14210 /* Toggle CS to flush commands. */ 14211 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS); 14212 CSR_WRITE_FLUSH(sc); 14213 delay(2); 14214 CSR_WRITE(sc, WMREG_EECD, reg); 14215 CSR_WRITE_FLUSH(sc); 14216 delay(2); 14217 14218 opc = SPI_OPC_READ; 14219 if (sc->sc_nvm_addrbits == 8 && word >= 128) 14220 opc |= SPI_OPC_A8; 14221 14222 wm_eeprom_sendbits(sc, opc, 8); 14223 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits); 14224 14225 for (i = 0; i < wordcnt; i++) { 14226 wm_eeprom_recvbits(sc, &val, 16); 14227 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8); 14228 } 14229 14230 /* Raise CS and clear SK. */ 14231 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS; 14232 CSR_WRITE(sc, WMREG_EECD, reg); 14233 CSR_WRITE_FLUSH(sc); 14234 delay(2); 14235 14236 out: 14237 sc->nvm.release(sc); 14238 return rv; 14239 } 14240 14241 /* Using with EERD */ 14242 14243 static int 14244 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw) 14245 { 14246 uint32_t attempts = 100000; 14247 uint32_t i, reg = 0; 14248 int32_t done = -1; 14249 14250 for (i = 0; i < attempts; i++) { 14251 reg = CSR_READ(sc, rw); 14252 14253 if (reg & EERD_DONE) { 14254 done = 0; 14255 break; 14256 } 14257 delay(5); 14258 } 14259 14260 return done; 14261 } 14262 14263 static int 14264 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt, uint16_t *data) 14265 { 14266 int i, eerd = 0; 14267 int rv; 14268 14269 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14270 device_xname(sc->sc_dev), __func__)); 14271 14272 rv = sc->nvm.acquire(sc); 14273 if (rv != 0) 14274 return rv; 14275 14276 for (i = 0; i < wordcnt; i++) { 14277 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START; 14278 CSR_WRITE(sc, WMREG_EERD, eerd); 14279 rv = wm_poll_eerd_eewr_done(sc, WMREG_EERD); 14280 if (rv != 0) { 14281 aprint_error_dev(sc->sc_dev, "EERD polling failed: " 14282 "offset=%d. wordcnt=%d\n", offset, wordcnt); 14283 break; 14284 } 14285 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT); 14286 } 14287 14288 sc->nvm.release(sc); 14289 return rv; 14290 } 14291 14292 /* Flash */ 14293 14294 static int 14295 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank) 14296 { 14297 uint32_t eecd; 14298 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1; 14299 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t); 14300 uint32_t nvm_dword = 0; 14301 uint8_t sig_byte = 0; 14302 int rv; 14303 14304 switch (sc->sc_type) { 14305 case WM_T_PCH_SPT: 14306 case WM_T_PCH_CNP: 14307 bank1_offset = sc->sc_ich8_flash_bank_size * 2; 14308 act_offset = ICH_NVM_SIG_WORD * 2; 14309 14310 /* Set bank to 0 in case flash read fails. */ 14311 *bank = 0; 14312 14313 /* Check bank 0 */ 14314 rv = wm_read_ich8_dword(sc, act_offset, &nvm_dword); 14315 if (rv != 0) 14316 return rv; 14317 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8); 14318 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 14319 *bank = 0; 14320 return 0; 14321 } 14322 14323 /* Check bank 1 */ 14324 rv = wm_read_ich8_dword(sc, act_offset + bank1_offset, 14325 &nvm_dword); 14326 sig_byte = (uint8_t)((nvm_dword & 0xFF00) >> 8); 14327 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 14328 *bank = 1; 14329 return 0; 14330 } 14331 aprint_error_dev(sc->sc_dev, 14332 "%s: no valid NVM bank present (%u)\n", __func__, *bank); 14333 return -1; 14334 case WM_T_ICH8: 14335 case WM_T_ICH9: 14336 eecd = CSR_READ(sc, WMREG_EECD); 14337 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) { 14338 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0; 14339 return 0; 14340 } 14341 /* FALLTHROUGH */ 14342 default: 14343 /* Default to 0 */ 14344 *bank = 0; 14345 14346 /* Check bank 0 */ 14347 wm_read_ich8_byte(sc, act_offset, &sig_byte); 14348 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 14349 *bank = 0; 14350 return 0; 14351 } 14352 14353 /* Check bank 1 */ 14354 wm_read_ich8_byte(sc, act_offset + bank1_offset, 14355 &sig_byte); 14356 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 14357 *bank = 1; 14358 return 0; 14359 } 14360 } 14361 14362 DPRINTF(sc, WM_DEBUG_NVM, ("%s: No valid NVM bank present\n", 14363 device_xname(sc->sc_dev))); 14364 return -1; 14365 } 14366 14367 /****************************************************************************** 14368 * This function does initial flash setup so that a new read/write/erase cycle 14369 * can be started. 14370 * 14371 * sc - The pointer to the hw structure 14372 ****************************************************************************/ 14373 static int32_t 14374 wm_ich8_cycle_init(struct wm_softc *sc) 14375 { 14376 uint16_t hsfsts; 14377 int32_t error = 1; 14378 int32_t i = 0; 14379 14380 if (sc->sc_type >= WM_T_PCH_SPT) 14381 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) & 0xffffUL; 14382 else 14383 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 14384 14385 /* May be check the Flash Des Valid bit in Hw status */ 14386 if ((hsfsts & HSFSTS_FLDVAL) == 0) 14387 return error; 14388 14389 /* Clear FCERR in Hw status by writing 1 */ 14390 /* Clear DAEL in Hw status by writing a 1 */ 14391 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL; 14392 14393 if (sc->sc_type >= WM_T_PCH_SPT) 14394 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, hsfsts & 0xffffUL); 14395 else 14396 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 14397 14398 /* 14399 * Either we should have a hardware SPI cycle in progress bit to check 14400 * against, in order to start a new cycle or FDONE bit should be 14401 * changed in the hardware so that it is 1 after hardware reset, which 14402 * can then be used as an indication whether a cycle is in progress or 14403 * has been completed .. we should also have some software semaphore 14404 * mechanism to guard FDONE or the cycle in progress bit so that two 14405 * threads access to those bits can be sequentiallized or a way so that 14406 * 2 threads don't start the cycle at the same time 14407 */ 14408 14409 if ((hsfsts & HSFSTS_FLINPRO) == 0) { 14410 /* 14411 * There is no cycle running at present, so we can start a 14412 * cycle 14413 */ 14414 14415 /* Begin by setting Flash Cycle Done. */ 14416 hsfsts |= HSFSTS_DONE; 14417 if (sc->sc_type >= WM_T_PCH_SPT) 14418 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 14419 hsfsts & 0xffffUL); 14420 else 14421 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 14422 error = 0; 14423 } else { 14424 /* 14425 * Otherwise poll for sometime so the current cycle has a 14426 * chance to end before giving up. 14427 */ 14428 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) { 14429 if (sc->sc_type >= WM_T_PCH_SPT) 14430 hsfsts = ICH8_FLASH_READ32(sc, 14431 ICH_FLASH_HSFSTS) & 0xffffUL; 14432 else 14433 hsfsts = ICH8_FLASH_READ16(sc, 14434 ICH_FLASH_HSFSTS); 14435 if ((hsfsts & HSFSTS_FLINPRO) == 0) { 14436 error = 0; 14437 break; 14438 } 14439 delay(1); 14440 } 14441 if (error == 0) { 14442 /* 14443 * Successful in waiting for previous cycle to timeout, 14444 * now set the Flash Cycle Done. 14445 */ 14446 hsfsts |= HSFSTS_DONE; 14447 if (sc->sc_type >= WM_T_PCH_SPT) 14448 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 14449 hsfsts & 0xffffUL); 14450 else 14451 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, 14452 hsfsts); 14453 } 14454 } 14455 return error; 14456 } 14457 14458 /****************************************************************************** 14459 * This function starts a flash cycle and waits for its completion 14460 * 14461 * sc - The pointer to the hw structure 14462 ****************************************************************************/ 14463 static int32_t 14464 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout) 14465 { 14466 uint16_t hsflctl; 14467 uint16_t hsfsts; 14468 int32_t error = 1; 14469 uint32_t i = 0; 14470 14471 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */ 14472 if (sc->sc_type >= WM_T_PCH_SPT) 14473 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) >> 16; 14474 else 14475 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL); 14476 hsflctl |= HSFCTL_GO; 14477 if (sc->sc_type >= WM_T_PCH_SPT) 14478 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 14479 (uint32_t)hsflctl << 16); 14480 else 14481 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl); 14482 14483 /* Wait till FDONE bit is set to 1 */ 14484 do { 14485 if (sc->sc_type >= WM_T_PCH_SPT) 14486 hsfsts = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) 14487 & 0xffffUL; 14488 else 14489 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 14490 if (hsfsts & HSFSTS_DONE) 14491 break; 14492 delay(1); 14493 i++; 14494 } while (i < timeout); 14495 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0) 14496 error = 0; 14497 14498 return error; 14499 } 14500 14501 /****************************************************************************** 14502 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers. 14503 * 14504 * sc - The pointer to the hw structure 14505 * index - The index of the byte or word to read. 14506 * size - Size of data to read, 1=byte 2=word, 4=dword 14507 * data - Pointer to the word to store the value read. 14508 *****************************************************************************/ 14509 static int32_t 14510 wm_read_ich8_data(struct wm_softc *sc, uint32_t index, 14511 uint32_t size, uint32_t *data) 14512 { 14513 uint16_t hsfsts; 14514 uint16_t hsflctl; 14515 uint32_t flash_linear_address; 14516 uint32_t flash_data = 0; 14517 int32_t error = 1; 14518 int32_t count = 0; 14519 14520 if (size < 1 || size > 4 || data == 0x0 || 14521 index > ICH_FLASH_LINEAR_ADDR_MASK) 14522 return error; 14523 14524 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) + 14525 sc->sc_ich8_flash_base; 14526 14527 do { 14528 delay(1); 14529 /* Steps */ 14530 error = wm_ich8_cycle_init(sc); 14531 if (error) 14532 break; 14533 14534 if (sc->sc_type >= WM_T_PCH_SPT) 14535 hsflctl = ICH8_FLASH_READ32(sc, ICH_FLASH_HSFSTS) 14536 >> 16; 14537 else 14538 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL); 14539 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ 14540 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT) 14541 & HSFCTL_BCOUNT_MASK; 14542 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT; 14543 if (sc->sc_type >= WM_T_PCH_SPT) { 14544 /* 14545 * In SPT, This register is in Lan memory space, not 14546 * flash. Therefore, only 32 bit access is supported. 14547 */ 14548 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFSTS, 14549 (uint32_t)hsflctl << 16); 14550 } else 14551 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl); 14552 14553 /* 14554 * Write the last 24 bits of index into Flash Linear address 14555 * field in Flash Address 14556 */ 14557 /* TODO: TBD maybe check the index against the size of flash */ 14558 14559 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address); 14560 14561 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT); 14562 14563 /* 14564 * Check if FCERR is set to 1, if set to 1, clear it and try 14565 * the whole sequence a few more times, else read in (shift in) 14566 * the Flash Data0, the order is least significant byte first 14567 * msb to lsb 14568 */ 14569 if (error == 0) { 14570 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0); 14571 if (size == 1) 14572 *data = (uint8_t)(flash_data & 0x000000FF); 14573 else if (size == 2) 14574 *data = (uint16_t)(flash_data & 0x0000FFFF); 14575 else if (size == 4) 14576 *data = (uint32_t)flash_data; 14577 break; 14578 } else { 14579 /* 14580 * If we've gotten here, then things are probably 14581 * completely hosed, but if the error condition is 14582 * detected, it won't hurt to give it another try... 14583 * ICH_FLASH_CYCLE_REPEAT_COUNT times. 14584 */ 14585 if (sc->sc_type >= WM_T_PCH_SPT) 14586 hsfsts = ICH8_FLASH_READ32(sc, 14587 ICH_FLASH_HSFSTS) & 0xffffUL; 14588 else 14589 hsfsts = ICH8_FLASH_READ16(sc, 14590 ICH_FLASH_HSFSTS); 14591 14592 if (hsfsts & HSFSTS_ERR) { 14593 /* Repeat for some time before giving up. */ 14594 continue; 14595 } else if ((hsfsts & HSFSTS_DONE) == 0) 14596 break; 14597 } 14598 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT); 14599 14600 return error; 14601 } 14602 14603 /****************************************************************************** 14604 * Reads a single byte from the NVM using the ICH8 flash access registers. 14605 * 14606 * sc - pointer to wm_hw structure 14607 * index - The index of the byte to read. 14608 * data - Pointer to a byte to store the value read. 14609 *****************************************************************************/ 14610 static int32_t 14611 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data) 14612 { 14613 int32_t status; 14614 uint32_t word = 0; 14615 14616 status = wm_read_ich8_data(sc, index, 1, &word); 14617 if (status == 0) 14618 *data = (uint8_t)word; 14619 else 14620 *data = 0; 14621 14622 return status; 14623 } 14624 14625 /****************************************************************************** 14626 * Reads a word from the NVM using the ICH8 flash access registers. 14627 * 14628 * sc - pointer to wm_hw structure 14629 * index - The starting byte index of the word to read. 14630 * data - Pointer to a word to store the value read. 14631 *****************************************************************************/ 14632 static int32_t 14633 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data) 14634 { 14635 int32_t status; 14636 uint32_t word = 0; 14637 14638 status = wm_read_ich8_data(sc, index, 2, &word); 14639 if (status == 0) 14640 *data = (uint16_t)word; 14641 else 14642 *data = 0; 14643 14644 return status; 14645 } 14646 14647 /****************************************************************************** 14648 * Reads a dword from the NVM using the ICH8 flash access registers. 14649 * 14650 * sc - pointer to wm_hw structure 14651 * index - The starting byte index of the word to read. 14652 * data - Pointer to a word to store the value read. 14653 *****************************************************************************/ 14654 static int32_t 14655 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data) 14656 { 14657 int32_t status; 14658 14659 status = wm_read_ich8_data(sc, index, 4, data); 14660 return status; 14661 } 14662 14663 /****************************************************************************** 14664 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access 14665 * register. 14666 * 14667 * sc - Struct containing variables accessed by shared code 14668 * offset - offset of word in the EEPROM to read 14669 * data - word read from the EEPROM 14670 * words - number of words to read 14671 *****************************************************************************/ 14672 static int 14673 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data) 14674 { 14675 int rv; 14676 uint32_t flash_bank = 0; 14677 uint32_t act_offset = 0; 14678 uint32_t bank_offset = 0; 14679 uint16_t word = 0; 14680 uint16_t i = 0; 14681 14682 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14683 device_xname(sc->sc_dev), __func__)); 14684 14685 rv = sc->nvm.acquire(sc); 14686 if (rv != 0) 14687 return rv; 14688 14689 /* 14690 * We need to know which is the valid flash bank. In the event 14691 * that we didn't allocate eeprom_shadow_ram, we may not be 14692 * managing flash_bank. So it cannot be trusted and needs 14693 * to be updated with each read. 14694 */ 14695 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank); 14696 if (rv) { 14697 DPRINTF(sc, WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n", 14698 device_xname(sc->sc_dev))); 14699 flash_bank = 0; 14700 } 14701 14702 /* 14703 * Adjust offset appropriately if we're on bank 1 - adjust for word 14704 * size 14705 */ 14706 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2); 14707 14708 for (i = 0; i < words; i++) { 14709 /* The NVM part needs a byte offset, hence * 2 */ 14710 act_offset = bank_offset + ((offset + i) * 2); 14711 rv = wm_read_ich8_word(sc, act_offset, &word); 14712 if (rv) { 14713 aprint_error_dev(sc->sc_dev, 14714 "%s: failed to read NVM\n", __func__); 14715 break; 14716 } 14717 data[i] = word; 14718 } 14719 14720 sc->nvm.release(sc); 14721 return rv; 14722 } 14723 14724 /****************************************************************************** 14725 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access 14726 * register. 14727 * 14728 * sc - Struct containing variables accessed by shared code 14729 * offset - offset of word in the EEPROM to read 14730 * data - word read from the EEPROM 14731 * words - number of words to read 14732 *****************************************************************************/ 14733 static int 14734 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data) 14735 { 14736 int rv; 14737 uint32_t flash_bank = 0; 14738 uint32_t act_offset = 0; 14739 uint32_t bank_offset = 0; 14740 uint32_t dword = 0; 14741 uint16_t i = 0; 14742 14743 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14744 device_xname(sc->sc_dev), __func__)); 14745 14746 rv = sc->nvm.acquire(sc); 14747 if (rv != 0) 14748 return rv; 14749 14750 /* 14751 * We need to know which is the valid flash bank. In the event 14752 * that we didn't allocate eeprom_shadow_ram, we may not be 14753 * managing flash_bank. So it cannot be trusted and needs 14754 * to be updated with each read. 14755 */ 14756 rv = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank); 14757 if (rv) { 14758 DPRINTF(sc, WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n", 14759 device_xname(sc->sc_dev))); 14760 flash_bank = 0; 14761 } 14762 14763 /* 14764 * Adjust offset appropriately if we're on bank 1 - adjust for word 14765 * size 14766 */ 14767 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2); 14768 14769 for (i = 0; i < words; i++) { 14770 /* The NVM part needs a byte offset, hence * 2 */ 14771 act_offset = bank_offset + ((offset + i) * 2); 14772 /* but we must read dword aligned, so mask ... */ 14773 rv = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword); 14774 if (rv) { 14775 aprint_error_dev(sc->sc_dev, 14776 "%s: failed to read NVM\n", __func__); 14777 break; 14778 } 14779 /* ... and pick out low or high word */ 14780 if ((act_offset & 0x2) == 0) 14781 data[i] = (uint16_t)(dword & 0xFFFF); 14782 else 14783 data[i] = (uint16_t)((dword >> 16) & 0xFFFF); 14784 } 14785 14786 sc->nvm.release(sc); 14787 return rv; 14788 } 14789 14790 /* iNVM */ 14791 14792 static int 14793 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data) 14794 { 14795 int32_t rv = 0; 14796 uint32_t invm_dword; 14797 uint16_t i; 14798 uint8_t record_type, word_address; 14799 14800 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14801 device_xname(sc->sc_dev), __func__)); 14802 14803 for (i = 0; i < INVM_SIZE; i++) { 14804 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i)); 14805 /* Get record type */ 14806 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword); 14807 if (record_type == INVM_UNINITIALIZED_STRUCTURE) 14808 break; 14809 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE) 14810 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS; 14811 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE) 14812 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS; 14813 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) { 14814 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword); 14815 if (word_address == address) { 14816 *data = INVM_DWORD_TO_WORD_DATA(invm_dword); 14817 rv = 0; 14818 break; 14819 } 14820 } 14821 } 14822 14823 return rv; 14824 } 14825 14826 static int 14827 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data) 14828 { 14829 int i, rv; 14830 14831 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 14832 device_xname(sc->sc_dev), __func__)); 14833 14834 rv = sc->nvm.acquire(sc); 14835 if (rv != 0) 14836 return rv; 14837 14838 for (i = 0; i < words; i++) { 14839 switch (offset + i) { 14840 case NVM_OFF_MACADDR: 14841 case NVM_OFF_MACADDR1: 14842 case NVM_OFF_MACADDR2: 14843 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]); 14844 if (rv != 0) { 14845 data[i] = 0xffff; 14846 rv = -1; 14847 } 14848 break; 14849 case NVM_OFF_CFG1: /* == INVM_AUTOLOAD */ 14850 rv = wm_nvm_read_word_invm(sc, offset, data); 14851 if (rv != 0) { 14852 *data = INVM_DEFAULT_AL; 14853 rv = 0; 14854 } 14855 break; 14856 case NVM_OFF_CFG2: 14857 rv = wm_nvm_read_word_invm(sc, offset, data); 14858 if (rv != 0) { 14859 *data = NVM_INIT_CTRL_2_DEFAULT_I211; 14860 rv = 0; 14861 } 14862 break; 14863 case NVM_OFF_CFG4: 14864 rv = wm_nvm_read_word_invm(sc, offset, data); 14865 if (rv != 0) { 14866 *data = NVM_INIT_CTRL_4_DEFAULT_I211; 14867 rv = 0; 14868 } 14869 break; 14870 case NVM_OFF_LED_1_CFG: 14871 rv = wm_nvm_read_word_invm(sc, offset, data); 14872 if (rv != 0) { 14873 *data = NVM_LED_1_CFG_DEFAULT_I211; 14874 rv = 0; 14875 } 14876 break; 14877 case NVM_OFF_LED_0_2_CFG: 14878 rv = wm_nvm_read_word_invm(sc, offset, data); 14879 if (rv != 0) { 14880 *data = NVM_LED_0_2_CFG_DEFAULT_I211; 14881 rv = 0; 14882 } 14883 break; 14884 case NVM_OFF_ID_LED_SETTINGS: 14885 rv = wm_nvm_read_word_invm(sc, offset, data); 14886 if (rv != 0) { 14887 *data = ID_LED_RESERVED_FFFF; 14888 rv = 0; 14889 } 14890 break; 14891 default: 14892 DPRINTF(sc, WM_DEBUG_NVM, 14893 ("NVM word 0x%02x is not mapped.\n", offset)); 14894 *data = NVM_RESERVED_WORD; 14895 break; 14896 } 14897 } 14898 14899 sc->nvm.release(sc); 14900 return rv; 14901 } 14902 14903 /* Lock, detecting NVM type, validate checksum, version and read */ 14904 14905 static int 14906 wm_nvm_is_onboard_eeprom(struct wm_softc *sc) 14907 { 14908 uint32_t eecd = 0; 14909 14910 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574 14911 || sc->sc_type == WM_T_82583) { 14912 eecd = CSR_READ(sc, WMREG_EECD); 14913 14914 /* Isolate bits 15 & 16 */ 14915 eecd = ((eecd >> 15) & 0x03); 14916 14917 /* If both bits are set, device is Flash type */ 14918 if (eecd == 0x03) 14919 return 0; 14920 } 14921 return 1; 14922 } 14923 14924 static int 14925 wm_nvm_flash_presence_i210(struct wm_softc *sc) 14926 { 14927 uint32_t eec; 14928 14929 eec = CSR_READ(sc, WMREG_EEC); 14930 if ((eec & EEC_FLASH_DETECTED) != 0) 14931 return 1; 14932 14933 return 0; 14934 } 14935 14936 /* 14937 * wm_nvm_validate_checksum 14938 * 14939 * The checksum is defined as the sum of the first 64 (16 bit) words. 14940 */ 14941 static int 14942 wm_nvm_validate_checksum(struct wm_softc *sc) 14943 { 14944 uint16_t checksum; 14945 uint16_t eeprom_data; 14946 #ifdef WM_DEBUG 14947 uint16_t csum_wordaddr, valid_checksum; 14948 #endif 14949 int i; 14950 14951 checksum = 0; 14952 14953 /* Don't check for I211 */ 14954 if (sc->sc_type == WM_T_I211) 14955 return 0; 14956 14957 #ifdef WM_DEBUG 14958 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT) 14959 || (sc->sc_type == WM_T_PCH_CNP)) { 14960 csum_wordaddr = NVM_OFF_COMPAT; 14961 valid_checksum = NVM_COMPAT_VALID_CHECKSUM; 14962 } else { 14963 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1; 14964 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM; 14965 } 14966 14967 /* Dump EEPROM image for debug */ 14968 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 14969 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 14970 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) { 14971 /* XXX PCH_SPT? */ 14972 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data); 14973 if ((eeprom_data & valid_checksum) == 0) 14974 DPRINTF(sc, WM_DEBUG_NVM, 14975 ("%s: NVM need to be updated (%04x != %04x)\n", 14976 device_xname(sc->sc_dev), eeprom_data, 14977 valid_checksum)); 14978 } 14979 14980 if ((sc->sc_debug & WM_DEBUG_NVM) != 0) { 14981 printf("%s: NVM dump:\n", device_xname(sc->sc_dev)); 14982 for (i = 0; i < NVM_SIZE; i++) { 14983 if (wm_nvm_read(sc, i, 1, &eeprom_data)) 14984 printf("XXXX "); 14985 else 14986 printf("%04hx ", eeprom_data); 14987 if (i % 8 == 7) 14988 printf("\n"); 14989 } 14990 } 14991 14992 #endif /* WM_DEBUG */ 14993 14994 for (i = 0; i < NVM_SIZE; i++) { 14995 if (wm_nvm_read(sc, i, 1, &eeprom_data)) 14996 return -1; 14997 checksum += eeprom_data; 14998 } 14999 15000 if (checksum != (uint16_t) NVM_CHECKSUM) { 15001 #ifdef WM_DEBUG 15002 printf("%s: NVM checksum mismatch (%04x != %04x)\n", 15003 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM); 15004 #endif 15005 } 15006 15007 return 0; 15008 } 15009 15010 static void 15011 wm_nvm_version_invm(struct wm_softc *sc) 15012 { 15013 uint32_t dword; 15014 15015 /* 15016 * Linux's code to decode version is very strange, so we don't 15017 * obey that algorithm and just use word 61 as the document. 15018 * Perhaps it's not perfect though... 15019 * 15020 * Example: 15021 * 15022 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6) 15023 */ 15024 dword = CSR_READ(sc, WM_INVM_DATA_REG(61)); 15025 dword = __SHIFTOUT(dword, INVM_VER_1); 15026 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR); 15027 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR); 15028 } 15029 15030 static void 15031 wm_nvm_version(struct wm_softc *sc) 15032 { 15033 uint16_t major, minor, build, patch; 15034 uint16_t uid0, uid1; 15035 uint16_t nvm_data; 15036 uint16_t off; 15037 bool check_version = false; 15038 bool check_optionrom = false; 15039 bool have_build = false; 15040 bool have_uid = true; 15041 15042 /* 15043 * Version format: 15044 * 15045 * XYYZ 15046 * X0YZ 15047 * X0YY 15048 * 15049 * Example: 15050 * 15051 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10) 15052 * 82571 0x50a6 5.10.6? 15053 * 82572 0x506a 5.6.10? 15054 * 82572EI 0x5069 5.6.9? 15055 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4) 15056 * 0x2013 2.1.3? 15057 * 82583 0x10a0 1.10.0? (document says it's default value) 15058 * ICH8+82567 0x0040 0.4.0? 15059 * ICH9+82566 0x1040 1.4.0? 15060 *ICH10+82567 0x0043 0.4.3? 15061 * PCH+82577 0x00c1 0.12.1? 15062 * PCH2+82579 0x00d3 0.13.3? 15063 * 0x00d4 0.13.4? 15064 * LPT+I218 0x0023 0.2.3? 15065 * SPT+I219 0x0084 0.8.4? 15066 * CNP+I219 0x0054 0.5.4? 15067 */ 15068 15069 /* 15070 * XXX 15071 * Qemu's e1000e emulation (82574L)'s SPI has only 64 words. 15072 * I've never seen real 82574 hardware with such small SPI ROM. 15073 */ 15074 if ((sc->sc_nvm_wordsize < NVM_OFF_IMAGE_UID1) 15075 || (wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1) != 0)) 15076 have_uid = false; 15077 15078 switch (sc->sc_type) { 15079 case WM_T_82571: 15080 case WM_T_82572: 15081 case WM_T_82574: 15082 case WM_T_82583: 15083 check_version = true; 15084 check_optionrom = true; 15085 have_build = true; 15086 break; 15087 case WM_T_ICH8: 15088 case WM_T_ICH9: 15089 case WM_T_ICH10: 15090 case WM_T_PCH: 15091 case WM_T_PCH2: 15092 case WM_T_PCH_LPT: 15093 case WM_T_PCH_SPT: 15094 case WM_T_PCH_CNP: 15095 check_version = true; 15096 have_build = true; 15097 have_uid = false; 15098 break; 15099 case WM_T_82575: 15100 case WM_T_82576: 15101 case WM_T_82580: 15102 if (have_uid && (uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID) 15103 check_version = true; 15104 break; 15105 case WM_T_I211: 15106 wm_nvm_version_invm(sc); 15107 have_uid = false; 15108 goto printver; 15109 case WM_T_I210: 15110 if (!wm_nvm_flash_presence_i210(sc)) { 15111 wm_nvm_version_invm(sc); 15112 have_uid = false; 15113 goto printver; 15114 } 15115 /* FALLTHROUGH */ 15116 case WM_T_I350: 15117 case WM_T_I354: 15118 check_version = true; 15119 check_optionrom = true; 15120 break; 15121 default: 15122 return; 15123 } 15124 if (check_version 15125 && (wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data) == 0)) { 15126 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT; 15127 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) { 15128 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT; 15129 build = nvm_data & NVM_BUILD_MASK; 15130 have_build = true; 15131 } else 15132 minor = nvm_data & 0x00ff; 15133 15134 /* Decimal */ 15135 minor = (minor / 16) * 10 + (minor % 16); 15136 sc->sc_nvm_ver_major = major; 15137 sc->sc_nvm_ver_minor = minor; 15138 15139 printver: 15140 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major, 15141 sc->sc_nvm_ver_minor); 15142 if (have_build) { 15143 sc->sc_nvm_ver_build = build; 15144 aprint_verbose(".%d", build); 15145 } 15146 } 15147 15148 /* Assume the Option ROM area is at avove NVM_SIZE */ 15149 if ((sc->sc_nvm_wordsize > NVM_SIZE) && check_optionrom 15150 && (wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off) == 0)) { 15151 /* Option ROM Version */ 15152 if ((off != 0x0000) && (off != 0xffff)) { 15153 int rv; 15154 15155 off += NVM_COMBO_VER_OFF; 15156 rv = wm_nvm_read(sc, off + 1, 1, &uid1); 15157 rv |= wm_nvm_read(sc, off, 1, &uid0); 15158 if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff) 15159 && (uid1 != 0) && (uid1 != 0xffff)) { 15160 /* 16bits */ 15161 major = uid0 >> 8; 15162 build = (uid0 << 8) | (uid1 >> 8); 15163 patch = uid1 & 0x00ff; 15164 aprint_verbose(", option ROM Version %d.%d.%d", 15165 major, build, patch); 15166 } 15167 } 15168 } 15169 15170 if (have_uid && (wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0) == 0)) 15171 aprint_verbose(", Image Unique ID %08x", 15172 ((uint32_t)uid1 << 16) | uid0); 15173 } 15174 15175 /* 15176 * wm_nvm_read: 15177 * 15178 * Read data from the serial EEPROM. 15179 */ 15180 static int 15181 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 15182 { 15183 int rv; 15184 15185 DPRINTF(sc, WM_DEBUG_NVM, ("%s: %s called\n", 15186 device_xname(sc->sc_dev), __func__)); 15187 15188 if (sc->sc_flags & WM_F_EEPROM_INVALID) 15189 return -1; 15190 15191 rv = sc->nvm.read(sc, word, wordcnt, data); 15192 15193 return rv; 15194 } 15195 15196 /* 15197 * Hardware semaphores. 15198 * Very complexed... 15199 */ 15200 15201 static int 15202 wm_get_null(struct wm_softc *sc) 15203 { 15204 15205 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15206 device_xname(sc->sc_dev), __func__)); 15207 return 0; 15208 } 15209 15210 static void 15211 wm_put_null(struct wm_softc *sc) 15212 { 15213 15214 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15215 device_xname(sc->sc_dev), __func__)); 15216 return; 15217 } 15218 15219 static int 15220 wm_get_eecd(struct wm_softc *sc) 15221 { 15222 uint32_t reg; 15223 int x; 15224 15225 DPRINTF(sc, WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n", 15226 device_xname(sc->sc_dev), __func__)); 15227 15228 reg = CSR_READ(sc, WMREG_EECD); 15229 15230 /* Request EEPROM access. */ 15231 reg |= EECD_EE_REQ; 15232 CSR_WRITE(sc, WMREG_EECD, reg); 15233 15234 /* ..and wait for it to be granted. */ 15235 for (x = 0; x < 1000; x++) { 15236 reg = CSR_READ(sc, WMREG_EECD); 15237 if (reg & EECD_EE_GNT) 15238 break; 15239 delay(5); 15240 } 15241 if ((reg & EECD_EE_GNT) == 0) { 15242 aprint_error_dev(sc->sc_dev, 15243 "could not acquire EEPROM GNT\n"); 15244 reg &= ~EECD_EE_REQ; 15245 CSR_WRITE(sc, WMREG_EECD, reg); 15246 return -1; 15247 } 15248 15249 return 0; 15250 } 15251 15252 static void 15253 wm_nvm_eec_clock_raise(struct wm_softc *sc, uint32_t *eecd) 15254 { 15255 15256 *eecd |= EECD_SK; 15257 CSR_WRITE(sc, WMREG_EECD, *eecd); 15258 CSR_WRITE_FLUSH(sc); 15259 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) 15260 delay(1); 15261 else 15262 delay(50); 15263 } 15264 15265 static void 15266 wm_nvm_eec_clock_lower(struct wm_softc *sc, uint32_t *eecd) 15267 { 15268 15269 *eecd &= ~EECD_SK; 15270 CSR_WRITE(sc, WMREG_EECD, *eecd); 15271 CSR_WRITE_FLUSH(sc); 15272 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) 15273 delay(1); 15274 else 15275 delay(50); 15276 } 15277 15278 static void 15279 wm_put_eecd(struct wm_softc *sc) 15280 { 15281 uint32_t reg; 15282 15283 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15284 device_xname(sc->sc_dev), __func__)); 15285 15286 /* Stop nvm */ 15287 reg = CSR_READ(sc, WMREG_EECD); 15288 if ((sc->sc_flags & WM_F_EEPROM_SPI) != 0) { 15289 /* Pull CS high */ 15290 reg |= EECD_CS; 15291 wm_nvm_eec_clock_lower(sc, ®); 15292 } else { 15293 /* CS on Microwire is active-high */ 15294 reg &= ~(EECD_CS | EECD_DI); 15295 CSR_WRITE(sc, WMREG_EECD, reg); 15296 wm_nvm_eec_clock_raise(sc, ®); 15297 wm_nvm_eec_clock_lower(sc, ®); 15298 } 15299 15300 reg = CSR_READ(sc, WMREG_EECD); 15301 reg &= ~EECD_EE_REQ; 15302 CSR_WRITE(sc, WMREG_EECD, reg); 15303 15304 return; 15305 } 15306 15307 /* 15308 * Get hardware semaphore. 15309 * Same as e1000_get_hw_semaphore_generic() 15310 */ 15311 static int 15312 wm_get_swsm_semaphore(struct wm_softc *sc) 15313 { 15314 int32_t timeout; 15315 uint32_t swsm; 15316 15317 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15318 device_xname(sc->sc_dev), __func__)); 15319 KASSERT(sc->sc_nvm_wordsize > 0); 15320 15321 retry: 15322 /* Get the SW semaphore. */ 15323 timeout = sc->sc_nvm_wordsize + 1; 15324 while (timeout) { 15325 swsm = CSR_READ(sc, WMREG_SWSM); 15326 15327 if ((swsm & SWSM_SMBI) == 0) 15328 break; 15329 15330 delay(50); 15331 timeout--; 15332 } 15333 15334 if (timeout == 0) { 15335 if ((sc->sc_flags & WM_F_WA_I210_CLSEM) != 0) { 15336 /* 15337 * In rare circumstances, the SW semaphore may already 15338 * be held unintentionally. Clear the semaphore once 15339 * before giving up. 15340 */ 15341 sc->sc_flags &= ~WM_F_WA_I210_CLSEM; 15342 wm_put_swsm_semaphore(sc); 15343 goto retry; 15344 } 15345 aprint_error_dev(sc->sc_dev, "could not acquire SWSM SMBI\n"); 15346 return -1; 15347 } 15348 15349 /* Get the FW semaphore. */ 15350 timeout = sc->sc_nvm_wordsize + 1; 15351 while (timeout) { 15352 swsm = CSR_READ(sc, WMREG_SWSM); 15353 swsm |= SWSM_SWESMBI; 15354 CSR_WRITE(sc, WMREG_SWSM, swsm); 15355 /* If we managed to set the bit we got the semaphore. */ 15356 swsm = CSR_READ(sc, WMREG_SWSM); 15357 if (swsm & SWSM_SWESMBI) 15358 break; 15359 15360 delay(50); 15361 timeout--; 15362 } 15363 15364 if (timeout == 0) { 15365 aprint_error_dev(sc->sc_dev, 15366 "could not acquire SWSM SWESMBI\n"); 15367 /* Release semaphores */ 15368 wm_put_swsm_semaphore(sc); 15369 return -1; 15370 } 15371 return 0; 15372 } 15373 15374 /* 15375 * Put hardware semaphore. 15376 * Same as e1000_put_hw_semaphore_generic() 15377 */ 15378 static void 15379 wm_put_swsm_semaphore(struct wm_softc *sc) 15380 { 15381 uint32_t swsm; 15382 15383 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15384 device_xname(sc->sc_dev), __func__)); 15385 15386 swsm = CSR_READ(sc, WMREG_SWSM); 15387 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI); 15388 CSR_WRITE(sc, WMREG_SWSM, swsm); 15389 } 15390 15391 /* 15392 * Get SW/FW semaphore. 15393 * Same as e1000_acquire_swfw_sync_{80003es2lan,82575}(). 15394 */ 15395 static int 15396 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask) 15397 { 15398 uint32_t swfw_sync; 15399 uint32_t swmask = mask << SWFW_SOFT_SHIFT; 15400 uint32_t fwmask = mask << SWFW_FIRM_SHIFT; 15401 int timeout; 15402 15403 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15404 device_xname(sc->sc_dev), __func__)); 15405 15406 if (sc->sc_type == WM_T_80003) 15407 timeout = 50; 15408 else 15409 timeout = 200; 15410 15411 while (timeout) { 15412 if (wm_get_swsm_semaphore(sc)) { 15413 aprint_error_dev(sc->sc_dev, 15414 "%s: failed to get semaphore\n", 15415 __func__); 15416 return -1; 15417 } 15418 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC); 15419 if ((swfw_sync & (swmask | fwmask)) == 0) { 15420 swfw_sync |= swmask; 15421 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync); 15422 wm_put_swsm_semaphore(sc); 15423 return 0; 15424 } 15425 wm_put_swsm_semaphore(sc); 15426 delay(5000); 15427 timeout--; 15428 } 15429 device_printf(sc->sc_dev, 15430 "failed to get swfw semaphore mask 0x%x swfw 0x%x\n", 15431 mask, swfw_sync); 15432 return -1; 15433 } 15434 15435 static void 15436 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask) 15437 { 15438 uint32_t swfw_sync; 15439 15440 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15441 device_xname(sc->sc_dev), __func__)); 15442 15443 while (wm_get_swsm_semaphore(sc) != 0) 15444 continue; 15445 15446 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC); 15447 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT); 15448 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync); 15449 15450 wm_put_swsm_semaphore(sc); 15451 } 15452 15453 static int 15454 wm_get_nvm_80003(struct wm_softc *sc) 15455 { 15456 int rv; 15457 15458 DPRINTF(sc, WM_DEBUG_LOCK | WM_DEBUG_NVM, ("%s: %s called\n", 15459 device_xname(sc->sc_dev), __func__)); 15460 15461 if ((rv = wm_get_swfw_semaphore(sc, SWFW_EEP_SM)) != 0) { 15462 aprint_error_dev(sc->sc_dev, 15463 "%s: failed to get semaphore(SWFW)\n", __func__); 15464 return rv; 15465 } 15466 15467 if (((sc->sc_flags & WM_F_LOCK_EECD) != 0) 15468 && (rv = wm_get_eecd(sc)) != 0) { 15469 aprint_error_dev(sc->sc_dev, 15470 "%s: failed to get semaphore(EECD)\n", __func__); 15471 wm_put_swfw_semaphore(sc, SWFW_EEP_SM); 15472 return rv; 15473 } 15474 15475 return 0; 15476 } 15477 15478 static void 15479 wm_put_nvm_80003(struct wm_softc *sc) 15480 { 15481 15482 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15483 device_xname(sc->sc_dev), __func__)); 15484 15485 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0) 15486 wm_put_eecd(sc); 15487 wm_put_swfw_semaphore(sc, SWFW_EEP_SM); 15488 } 15489 15490 static int 15491 wm_get_nvm_82571(struct wm_softc *sc) 15492 { 15493 int rv; 15494 15495 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15496 device_xname(sc->sc_dev), __func__)); 15497 15498 if ((rv = wm_get_swsm_semaphore(sc)) != 0) 15499 return rv; 15500 15501 switch (sc->sc_type) { 15502 case WM_T_82573: 15503 break; 15504 default: 15505 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0) 15506 rv = wm_get_eecd(sc); 15507 break; 15508 } 15509 15510 if (rv != 0) { 15511 aprint_error_dev(sc->sc_dev, 15512 "%s: failed to get semaphore\n", 15513 __func__); 15514 wm_put_swsm_semaphore(sc); 15515 } 15516 15517 return rv; 15518 } 15519 15520 static void 15521 wm_put_nvm_82571(struct wm_softc *sc) 15522 { 15523 15524 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15525 device_xname(sc->sc_dev), __func__)); 15526 15527 switch (sc->sc_type) { 15528 case WM_T_82573: 15529 break; 15530 default: 15531 if ((sc->sc_flags & WM_F_LOCK_EECD) != 0) 15532 wm_put_eecd(sc); 15533 break; 15534 } 15535 15536 wm_put_swsm_semaphore(sc); 15537 } 15538 15539 static int 15540 wm_get_phy_82575(struct wm_softc *sc) 15541 { 15542 15543 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15544 device_xname(sc->sc_dev), __func__)); 15545 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 15546 } 15547 15548 static void 15549 wm_put_phy_82575(struct wm_softc *sc) 15550 { 15551 15552 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15553 device_xname(sc->sc_dev), __func__)); 15554 wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 15555 } 15556 15557 static int 15558 wm_get_swfwhw_semaphore(struct wm_softc *sc) 15559 { 15560 uint32_t ext_ctrl; 15561 int timeout = 200; 15562 15563 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15564 device_xname(sc->sc_dev), __func__)); 15565 15566 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */ 15567 for (timeout = 0; timeout < 200; timeout++) { 15568 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 15569 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP; 15570 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 15571 15572 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 15573 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) 15574 return 0; 15575 delay(5000); 15576 } 15577 device_printf(sc->sc_dev, 15578 "failed to get swfwhw semaphore ext_ctrl 0x%x\n", ext_ctrl); 15579 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */ 15580 return -1; 15581 } 15582 15583 static void 15584 wm_put_swfwhw_semaphore(struct wm_softc *sc) 15585 { 15586 uint32_t ext_ctrl; 15587 15588 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15589 device_xname(sc->sc_dev), __func__)); 15590 15591 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 15592 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 15593 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 15594 15595 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */ 15596 } 15597 15598 static int 15599 wm_get_swflag_ich8lan(struct wm_softc *sc) 15600 { 15601 uint32_t ext_ctrl; 15602 int timeout; 15603 15604 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15605 device_xname(sc->sc_dev), __func__)); 15606 mutex_enter(sc->sc_ich_phymtx); 15607 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) { 15608 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 15609 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0) 15610 break; 15611 delay(1000); 15612 } 15613 if (timeout >= WM_PHY_CFG_TIMEOUT) { 15614 device_printf(sc->sc_dev, 15615 "SW has already locked the resource\n"); 15616 goto out; 15617 } 15618 15619 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP; 15620 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 15621 for (timeout = 0; timeout < 1000; timeout++) { 15622 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 15623 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) 15624 break; 15625 delay(1000); 15626 } 15627 if (timeout >= 1000) { 15628 device_printf(sc->sc_dev, "failed to acquire semaphore\n"); 15629 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 15630 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 15631 goto out; 15632 } 15633 return 0; 15634 15635 out: 15636 mutex_exit(sc->sc_ich_phymtx); 15637 return -1; 15638 } 15639 15640 static void 15641 wm_put_swflag_ich8lan(struct wm_softc *sc) 15642 { 15643 uint32_t ext_ctrl; 15644 15645 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15646 device_xname(sc->sc_dev), __func__)); 15647 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 15648 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) { 15649 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 15650 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 15651 } else 15652 device_printf(sc->sc_dev, "Semaphore unexpectedly released\n"); 15653 15654 mutex_exit(sc->sc_ich_phymtx); 15655 } 15656 15657 static int 15658 wm_get_nvm_ich8lan(struct wm_softc *sc) 15659 { 15660 15661 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15662 device_xname(sc->sc_dev), __func__)); 15663 mutex_enter(sc->sc_ich_nvmmtx); 15664 15665 return 0; 15666 } 15667 15668 static void 15669 wm_put_nvm_ich8lan(struct wm_softc *sc) 15670 { 15671 15672 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15673 device_xname(sc->sc_dev), __func__)); 15674 mutex_exit(sc->sc_ich_nvmmtx); 15675 } 15676 15677 static int 15678 wm_get_hw_semaphore_82573(struct wm_softc *sc) 15679 { 15680 int i = 0; 15681 uint32_t reg; 15682 15683 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15684 device_xname(sc->sc_dev), __func__)); 15685 15686 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 15687 do { 15688 CSR_WRITE(sc, WMREG_EXTCNFCTR, 15689 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP); 15690 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 15691 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0) 15692 break; 15693 delay(2*1000); 15694 i++; 15695 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT); 15696 15697 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) { 15698 wm_put_hw_semaphore_82573(sc); 15699 log(LOG_ERR, "%s: Driver can't access the PHY\n", 15700 device_xname(sc->sc_dev)); 15701 return -1; 15702 } 15703 15704 return 0; 15705 } 15706 15707 static void 15708 wm_put_hw_semaphore_82573(struct wm_softc *sc) 15709 { 15710 uint32_t reg; 15711 15712 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15713 device_xname(sc->sc_dev), __func__)); 15714 15715 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 15716 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 15717 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg); 15718 } 15719 15720 /* 15721 * Management mode and power management related subroutines. 15722 * BMC, AMT, suspend/resume and EEE. 15723 */ 15724 15725 #ifdef WM_WOL 15726 static int 15727 wm_check_mng_mode(struct wm_softc *sc) 15728 { 15729 int rv; 15730 15731 switch (sc->sc_type) { 15732 case WM_T_ICH8: 15733 case WM_T_ICH9: 15734 case WM_T_ICH10: 15735 case WM_T_PCH: 15736 case WM_T_PCH2: 15737 case WM_T_PCH_LPT: 15738 case WM_T_PCH_SPT: 15739 case WM_T_PCH_CNP: 15740 rv = wm_check_mng_mode_ich8lan(sc); 15741 break; 15742 case WM_T_82574: 15743 case WM_T_82583: 15744 rv = wm_check_mng_mode_82574(sc); 15745 break; 15746 case WM_T_82571: 15747 case WM_T_82572: 15748 case WM_T_82573: 15749 case WM_T_80003: 15750 rv = wm_check_mng_mode_generic(sc); 15751 break; 15752 default: 15753 /* Noting to do */ 15754 rv = 0; 15755 break; 15756 } 15757 15758 return rv; 15759 } 15760 15761 static int 15762 wm_check_mng_mode_ich8lan(struct wm_softc *sc) 15763 { 15764 uint32_t fwsm; 15765 15766 fwsm = CSR_READ(sc, WMREG_FWSM); 15767 15768 if (((fwsm & FWSM_FW_VALID) != 0) 15769 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE)) 15770 return 1; 15771 15772 return 0; 15773 } 15774 15775 static int 15776 wm_check_mng_mode_82574(struct wm_softc *sc) 15777 { 15778 uint16_t data; 15779 15780 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data); 15781 15782 if ((data & NVM_CFG2_MNGM_MASK) != 0) 15783 return 1; 15784 15785 return 0; 15786 } 15787 15788 static int 15789 wm_check_mng_mode_generic(struct wm_softc *sc) 15790 { 15791 uint32_t fwsm; 15792 15793 fwsm = CSR_READ(sc, WMREG_FWSM); 15794 15795 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE) 15796 return 1; 15797 15798 return 0; 15799 } 15800 #endif /* WM_WOL */ 15801 15802 static int 15803 wm_enable_mng_pass_thru(struct wm_softc *sc) 15804 { 15805 uint32_t manc, fwsm, factps; 15806 15807 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0) 15808 return 0; 15809 15810 manc = CSR_READ(sc, WMREG_MANC); 15811 15812 DPRINTF(sc, WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n", 15813 device_xname(sc->sc_dev), manc)); 15814 if ((manc & MANC_RECV_TCO_EN) == 0) 15815 return 0; 15816 15817 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) { 15818 fwsm = CSR_READ(sc, WMREG_FWSM); 15819 factps = CSR_READ(sc, WMREG_FACTPS); 15820 if (((factps & FACTPS_MNGCG) == 0) 15821 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE)) 15822 return 1; 15823 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){ 15824 uint16_t data; 15825 15826 factps = CSR_READ(sc, WMREG_FACTPS); 15827 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data); 15828 DPRINTF(sc, WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n", 15829 device_xname(sc->sc_dev), factps, data)); 15830 if (((factps & FACTPS_MNGCG) == 0) 15831 && ((data & NVM_CFG2_MNGM_MASK) 15832 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT))) 15833 return 1; 15834 } else if (((manc & MANC_SMBUS_EN) != 0) 15835 && ((manc & MANC_ASF_EN) == 0)) 15836 return 1; 15837 15838 return 0; 15839 } 15840 15841 static bool 15842 wm_phy_resetisblocked(struct wm_softc *sc) 15843 { 15844 bool blocked = false; 15845 uint32_t reg; 15846 int i = 0; 15847 15848 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15849 device_xname(sc->sc_dev), __func__)); 15850 15851 switch (sc->sc_type) { 15852 case WM_T_ICH8: 15853 case WM_T_ICH9: 15854 case WM_T_ICH10: 15855 case WM_T_PCH: 15856 case WM_T_PCH2: 15857 case WM_T_PCH_LPT: 15858 case WM_T_PCH_SPT: 15859 case WM_T_PCH_CNP: 15860 do { 15861 reg = CSR_READ(sc, WMREG_FWSM); 15862 if ((reg & FWSM_RSPCIPHY) == 0) { 15863 blocked = true; 15864 delay(10*1000); 15865 continue; 15866 } 15867 blocked = false; 15868 } while (blocked && (i++ < 30)); 15869 return blocked; 15870 break; 15871 case WM_T_82571: 15872 case WM_T_82572: 15873 case WM_T_82573: 15874 case WM_T_82574: 15875 case WM_T_82583: 15876 case WM_T_80003: 15877 reg = CSR_READ(sc, WMREG_MANC); 15878 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0) 15879 return true; 15880 else 15881 return false; 15882 break; 15883 default: 15884 /* No problem */ 15885 break; 15886 } 15887 15888 return false; 15889 } 15890 15891 static void 15892 wm_get_hw_control(struct wm_softc *sc) 15893 { 15894 uint32_t reg; 15895 15896 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15897 device_xname(sc->sc_dev), __func__)); 15898 15899 if (sc->sc_type == WM_T_82573) { 15900 reg = CSR_READ(sc, WMREG_SWSM); 15901 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD); 15902 } else if (sc->sc_type >= WM_T_82571) { 15903 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15904 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD); 15905 } 15906 } 15907 15908 static void 15909 wm_release_hw_control(struct wm_softc *sc) 15910 { 15911 uint32_t reg; 15912 15913 DPRINTF(sc, WM_DEBUG_LOCK, ("%s: %s called\n", 15914 device_xname(sc->sc_dev), __func__)); 15915 15916 if (sc->sc_type == WM_T_82573) { 15917 reg = CSR_READ(sc, WMREG_SWSM); 15918 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD); 15919 } else if (sc->sc_type >= WM_T_82571) { 15920 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15921 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD); 15922 } 15923 } 15924 15925 static void 15926 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate) 15927 { 15928 uint32_t reg; 15929 15930 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15931 device_xname(sc->sc_dev), __func__)); 15932 15933 if (sc->sc_type < WM_T_PCH2) 15934 return; 15935 15936 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 15937 15938 if (gate) 15939 reg |= EXTCNFCTR_GATE_PHY_CFG; 15940 else 15941 reg &= ~EXTCNFCTR_GATE_PHY_CFG; 15942 15943 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg); 15944 } 15945 15946 static int 15947 wm_init_phy_workarounds_pchlan(struct wm_softc *sc) 15948 { 15949 uint32_t fwsm, reg; 15950 int rv; 15951 15952 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 15953 device_xname(sc->sc_dev), __func__)); 15954 15955 /* Gate automatic PHY configuration by hardware on non-managed 82579 */ 15956 wm_gate_hw_phy_config_ich8lan(sc, true); 15957 15958 /* Disable ULP */ 15959 wm_ulp_disable(sc); 15960 15961 /* Acquire PHY semaphore */ 15962 rv = sc->phy.acquire(sc); 15963 if (rv != 0) { 15964 DPRINTF(sc, WM_DEBUG_INIT, 15965 ("%s: %s: failed\n", device_xname(sc->sc_dev), __func__)); 15966 return rv; 15967 } 15968 15969 /* The MAC-PHY interconnect may be in SMBus mode. If the PHY is 15970 * inaccessible and resetting the PHY is not blocked, toggle the 15971 * LANPHYPC Value bit to force the interconnect to PCIe mode. 15972 */ 15973 fwsm = CSR_READ(sc, WMREG_FWSM); 15974 switch (sc->sc_type) { 15975 case WM_T_PCH_LPT: 15976 case WM_T_PCH_SPT: 15977 case WM_T_PCH_CNP: 15978 if (wm_phy_is_accessible_pchlan(sc)) 15979 break; 15980 15981 /* Before toggling LANPHYPC, see if PHY is accessible by 15982 * forcing MAC to SMBus mode first. 15983 */ 15984 reg = CSR_READ(sc, WMREG_CTRL_EXT); 15985 reg |= CTRL_EXT_FORCE_SMBUS; 15986 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 15987 #if 0 15988 /* XXX Isn't this required??? */ 15989 CSR_WRITE_FLUSH(sc); 15990 #endif 15991 /* Wait 50 milliseconds for MAC to finish any retries 15992 * that it might be trying to perform from previous 15993 * attempts to acknowledge any phy read requests. 15994 */ 15995 delay(50 * 1000); 15996 /* FALLTHROUGH */ 15997 case WM_T_PCH2: 15998 if (wm_phy_is_accessible_pchlan(sc) == true) 15999 break; 16000 /* FALLTHROUGH */ 16001 case WM_T_PCH: 16002 if (sc->sc_type == WM_T_PCH) 16003 if ((fwsm & FWSM_FW_VALID) != 0) 16004 break; 16005 16006 if (wm_phy_resetisblocked(sc) == true) { 16007 device_printf(sc->sc_dev, "XXX reset is blocked(2)\n"); 16008 break; 16009 } 16010 16011 /* Toggle LANPHYPC Value bit */ 16012 wm_toggle_lanphypc_pch_lpt(sc); 16013 16014 if (sc->sc_type >= WM_T_PCH_LPT) { 16015 if (wm_phy_is_accessible_pchlan(sc) == true) 16016 break; 16017 16018 /* Toggling LANPHYPC brings the PHY out of SMBus mode 16019 * so ensure that the MAC is also out of SMBus mode 16020 */ 16021 reg = CSR_READ(sc, WMREG_CTRL_EXT); 16022 reg &= ~CTRL_EXT_FORCE_SMBUS; 16023 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 16024 16025 if (wm_phy_is_accessible_pchlan(sc) == true) 16026 break; 16027 rv = -1; 16028 } 16029 break; 16030 default: 16031 break; 16032 } 16033 16034 /* Release semaphore */ 16035 sc->phy.release(sc); 16036 16037 if (rv == 0) { 16038 /* Check to see if able to reset PHY. Print error if not */ 16039 if (wm_phy_resetisblocked(sc)) { 16040 device_printf(sc->sc_dev, "XXX reset is blocked(3)\n"); 16041 goto out; 16042 } 16043 16044 /* Reset the PHY before any access to it. Doing so, ensures 16045 * that the PHY is in a known good state before we read/write 16046 * PHY registers. The generic reset is sufficient here, 16047 * because we haven't determined the PHY type yet. 16048 */ 16049 if (wm_reset_phy(sc) != 0) 16050 goto out; 16051 16052 /* On a successful reset, possibly need to wait for the PHY 16053 * to quiesce to an accessible state before returning control 16054 * to the calling function. If the PHY does not quiesce, then 16055 * return E1000E_BLK_PHY_RESET, as this is the condition that 16056 * the PHY is in. 16057 */ 16058 if (wm_phy_resetisblocked(sc)) 16059 device_printf(sc->sc_dev, "XXX reset is blocked(4)\n"); 16060 } 16061 16062 out: 16063 /* Ungate automatic PHY configuration on non-managed 82579 */ 16064 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) { 16065 delay(10*1000); 16066 wm_gate_hw_phy_config_ich8lan(sc, false); 16067 } 16068 16069 return 0; 16070 } 16071 16072 static void 16073 wm_init_manageability(struct wm_softc *sc) 16074 { 16075 16076 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16077 device_xname(sc->sc_dev), __func__)); 16078 KASSERT(IFNET_LOCKED(&sc->sc_ethercom.ec_if)); 16079 16080 if (sc->sc_flags & WM_F_HAS_MANAGE) { 16081 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H); 16082 uint32_t manc = CSR_READ(sc, WMREG_MANC); 16083 16084 /* Disable hardware interception of ARP */ 16085 manc &= ~MANC_ARP_EN; 16086 16087 /* Enable receiving management packets to the host */ 16088 if (sc->sc_type >= WM_T_82571) { 16089 manc |= MANC_EN_MNG2HOST; 16090 manc2h |= MANC2H_PORT_623 | MANC2H_PORT_624; 16091 CSR_WRITE(sc, WMREG_MANC2H, manc2h); 16092 } 16093 16094 CSR_WRITE(sc, WMREG_MANC, manc); 16095 } 16096 } 16097 16098 static void 16099 wm_release_manageability(struct wm_softc *sc) 16100 { 16101 16102 if (sc->sc_flags & WM_F_HAS_MANAGE) { 16103 uint32_t manc = CSR_READ(sc, WMREG_MANC); 16104 16105 manc |= MANC_ARP_EN; 16106 if (sc->sc_type >= WM_T_82571) 16107 manc &= ~MANC_EN_MNG2HOST; 16108 16109 CSR_WRITE(sc, WMREG_MANC, manc); 16110 } 16111 } 16112 16113 static void 16114 wm_get_wakeup(struct wm_softc *sc) 16115 { 16116 16117 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */ 16118 switch (sc->sc_type) { 16119 case WM_T_82573: 16120 case WM_T_82583: 16121 sc->sc_flags |= WM_F_HAS_AMT; 16122 /* FALLTHROUGH */ 16123 case WM_T_80003: 16124 case WM_T_82575: 16125 case WM_T_82576: 16126 case WM_T_82580: 16127 case WM_T_I350: 16128 case WM_T_I354: 16129 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0) 16130 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID; 16131 /* FALLTHROUGH */ 16132 case WM_T_82541: 16133 case WM_T_82541_2: 16134 case WM_T_82547: 16135 case WM_T_82547_2: 16136 case WM_T_82571: 16137 case WM_T_82572: 16138 case WM_T_82574: 16139 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES; 16140 break; 16141 case WM_T_ICH8: 16142 case WM_T_ICH9: 16143 case WM_T_ICH10: 16144 case WM_T_PCH: 16145 case WM_T_PCH2: 16146 case WM_T_PCH_LPT: 16147 case WM_T_PCH_SPT: 16148 case WM_T_PCH_CNP: 16149 sc->sc_flags |= WM_F_HAS_AMT; 16150 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES; 16151 break; 16152 default: 16153 break; 16154 } 16155 16156 /* 1: HAS_MANAGE */ 16157 if (wm_enable_mng_pass_thru(sc) != 0) 16158 sc->sc_flags |= WM_F_HAS_MANAGE; 16159 16160 /* 16161 * Note that the WOL flags is set after the resetting of the eeprom 16162 * stuff 16163 */ 16164 } 16165 16166 /* 16167 * Unconfigure Ultra Low Power mode. 16168 * Only for I217 and newer (see below). 16169 */ 16170 static int 16171 wm_ulp_disable(struct wm_softc *sc) 16172 { 16173 uint32_t reg; 16174 uint16_t phyreg; 16175 int i = 0, rv; 16176 16177 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16178 device_xname(sc->sc_dev), __func__)); 16179 /* Exclude old devices */ 16180 if ((sc->sc_type < WM_T_PCH_LPT) 16181 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM) 16182 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V) 16183 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2) 16184 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2)) 16185 return 0; 16186 16187 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) { 16188 /* Request ME un-configure ULP mode in the PHY */ 16189 reg = CSR_READ(sc, WMREG_H2ME); 16190 reg &= ~H2ME_ULP; 16191 reg |= H2ME_ENFORCE_SETTINGS; 16192 CSR_WRITE(sc, WMREG_H2ME, reg); 16193 16194 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */ 16195 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) { 16196 if (i++ == 30) { 16197 device_printf(sc->sc_dev, "%s timed out\n", 16198 __func__); 16199 return -1; 16200 } 16201 delay(10 * 1000); 16202 } 16203 reg = CSR_READ(sc, WMREG_H2ME); 16204 reg &= ~H2ME_ENFORCE_SETTINGS; 16205 CSR_WRITE(sc, WMREG_H2ME, reg); 16206 16207 return 0; 16208 } 16209 16210 /* Acquire semaphore */ 16211 rv = sc->phy.acquire(sc); 16212 if (rv != 0) { 16213 DPRINTF(sc, WM_DEBUG_INIT, 16214 ("%s: %s: failed\n", device_xname(sc->sc_dev), __func__)); 16215 return rv; 16216 } 16217 16218 /* Toggle LANPHYPC */ 16219 wm_toggle_lanphypc_pch_lpt(sc); 16220 16221 /* Unforce SMBus mode in PHY */ 16222 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL, &phyreg); 16223 if (rv != 0) { 16224 uint32_t reg2; 16225 16226 aprint_debug_dev(sc->sc_dev, "%s: Force SMBus first.\n", 16227 __func__); 16228 reg2 = CSR_READ(sc, WMREG_CTRL_EXT); 16229 reg2 |= CTRL_EXT_FORCE_SMBUS; 16230 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2); 16231 delay(50 * 1000); 16232 16233 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL, 16234 &phyreg); 16235 if (rv != 0) 16236 goto release; 16237 } 16238 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS; 16239 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, phyreg); 16240 16241 /* Unforce SMBus mode in MAC */ 16242 reg = CSR_READ(sc, WMREG_CTRL_EXT); 16243 reg &= ~CTRL_EXT_FORCE_SMBUS; 16244 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 16245 16246 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL, &phyreg); 16247 if (rv != 0) 16248 goto release; 16249 phyreg |= HV_PM_CTRL_K1_ENA; 16250 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, phyreg); 16251 16252 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, 16253 &phyreg); 16254 if (rv != 0) 16255 goto release; 16256 phyreg &= ~(I218_ULP_CONFIG1_IND 16257 | I218_ULP_CONFIG1_STICKY_ULP 16258 | I218_ULP_CONFIG1_RESET_TO_SMBUS 16259 | I218_ULP_CONFIG1_WOL_HOST 16260 | I218_ULP_CONFIG1_INBAND_EXIT 16261 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC 16262 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST 16263 | I218_ULP_CONFIG1_DIS_SMB_PERST); 16264 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg); 16265 phyreg |= I218_ULP_CONFIG1_START; 16266 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, phyreg); 16267 16268 reg = CSR_READ(sc, WMREG_FEXTNVM7); 16269 reg &= ~FEXTNVM7_DIS_SMB_PERST; 16270 CSR_WRITE(sc, WMREG_FEXTNVM7, reg); 16271 16272 release: 16273 /* Release semaphore */ 16274 sc->phy.release(sc); 16275 wm_gmii_reset(sc); 16276 delay(50 * 1000); 16277 16278 return rv; 16279 } 16280 16281 /* WOL in the newer chipset interfaces (pchlan) */ 16282 static int 16283 wm_enable_phy_wakeup(struct wm_softc *sc) 16284 { 16285 device_t dev = sc->sc_dev; 16286 uint32_t mreg, moff; 16287 uint16_t wuce, wuc, wufc, preg; 16288 int i, rv; 16289 16290 KASSERT(sc->sc_type >= WM_T_PCH); 16291 16292 /* Copy MAC RARs to PHY RARs */ 16293 wm_copy_rx_addrs_to_phy_ich8lan(sc); 16294 16295 /* Activate PHY wakeup */ 16296 rv = sc->phy.acquire(sc); 16297 if (rv != 0) { 16298 device_printf(dev, "%s: failed to acquire semaphore\n", 16299 __func__); 16300 return rv; 16301 } 16302 16303 /* 16304 * Enable access to PHY wakeup registers. 16305 * BM_MTA, BM_RCTL, BM_WUFC and BM_WUC are in BM_WUC_PAGE. 16306 */ 16307 rv = wm_enable_phy_wakeup_reg_access_bm(dev, &wuce); 16308 if (rv != 0) { 16309 device_printf(dev, 16310 "%s: Could not enable PHY wakeup reg access\n", __func__); 16311 goto release; 16312 } 16313 16314 /* Copy MAC MTA to PHY MTA */ 16315 for (i = 0; i < WM_ICH8_MC_TABSIZE; i++) { 16316 uint16_t lo, hi; 16317 16318 mreg = CSR_READ(sc, WMREG_CORDOVA_MTA + (i * 4)); 16319 lo = (uint16_t)(mreg & 0xffff); 16320 hi = (uint16_t)((mreg >> 16) & 0xffff); 16321 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i), &lo, 0, true); 16322 wm_access_phy_wakeup_reg_bm(dev, BM_MTA(i) + 1, &hi, 0, true); 16323 } 16324 16325 /* Configure PHY Rx Control register */ 16326 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 1, true); 16327 mreg = CSR_READ(sc, WMREG_RCTL); 16328 if (mreg & RCTL_UPE) 16329 preg |= BM_RCTL_UPE; 16330 if (mreg & RCTL_MPE) 16331 preg |= BM_RCTL_MPE; 16332 preg &= ~(BM_RCTL_MO_MASK); 16333 moff = __SHIFTOUT(mreg, RCTL_MO); 16334 if (moff != 0) 16335 preg |= moff << BM_RCTL_MO_SHIFT; 16336 if (mreg & RCTL_BAM) 16337 preg |= BM_RCTL_BAM; 16338 if (mreg & RCTL_PMCF) 16339 preg |= BM_RCTL_PMCF; 16340 mreg = CSR_READ(sc, WMREG_CTRL); 16341 if (mreg & CTRL_RFCE) 16342 preg |= BM_RCTL_RFCE; 16343 wm_access_phy_wakeup_reg_bm(dev, BM_RCTL, &preg, 0, true); 16344 16345 wuc = WUC_APME | WUC_PME_EN; 16346 wufc = WUFC_MAG; 16347 /* Enable PHY wakeup in MAC register */ 16348 CSR_WRITE(sc, WMREG_WUC, 16349 WUC_PHY_WAKE | WUC_PME_STATUS | WUC_APMPME | wuc); 16350 CSR_WRITE(sc, WMREG_WUFC, wufc); 16351 16352 /* Configure and enable PHY wakeup in PHY registers */ 16353 wm_access_phy_wakeup_reg_bm(dev, BM_WUC, &wuc, 0, true); 16354 wm_access_phy_wakeup_reg_bm(dev, BM_WUFC, &wufc, 0, true); 16355 16356 wuce |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT; 16357 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce); 16358 16359 release: 16360 sc->phy.release(sc); 16361 16362 return 0; 16363 } 16364 16365 /* Power down workaround on D3 */ 16366 static void 16367 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc) 16368 { 16369 uint32_t reg; 16370 uint16_t phyreg; 16371 int i; 16372 16373 for (i = 0; i < 2; i++) { 16374 /* Disable link */ 16375 reg = CSR_READ(sc, WMREG_PHY_CTRL); 16376 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; 16377 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 16378 16379 /* 16380 * Call gig speed drop workaround on Gig disable before 16381 * accessing any PHY registers 16382 */ 16383 if (sc->sc_type == WM_T_ICH8) 16384 wm_gig_downshift_workaround_ich8lan(sc); 16385 16386 /* Write VR power-down enable */ 16387 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg); 16388 phyreg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; 16389 phyreg |= IGP3_VR_CTRL_MODE_SHUTDOWN; 16390 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, phyreg); 16391 16392 /* Read it back and test */ 16393 sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL, &phyreg); 16394 phyreg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; 16395 if ((phyreg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0)) 16396 break; 16397 16398 /* Issue PHY reset and repeat at most one more time */ 16399 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 16400 } 16401 } 16402 16403 /* 16404 * wm_suspend_workarounds_ich8lan - workarounds needed during S0->Sx 16405 * @sc: pointer to the HW structure 16406 * 16407 * During S0 to Sx transition, it is possible the link remains at gig 16408 * instead of negotiating to a lower speed. Before going to Sx, set 16409 * 'Gig Disable' to force link speed negotiation to a lower speed based on 16410 * the LPLU setting in the NVM or custom setting. For PCH and newer parts, 16411 * the OEM bits PHY register (LED, GbE disable and LPLU configurations) also 16412 * needs to be written. 16413 * Parts that support (and are linked to a partner which support) EEE in 16414 * 100Mbps should disable LPLU since 100Mbps w/ EEE requires less power 16415 * than 10Mbps w/o EEE. 16416 */ 16417 static void 16418 wm_suspend_workarounds_ich8lan(struct wm_softc *sc) 16419 { 16420 device_t dev = sc->sc_dev; 16421 struct ethercom *ec = &sc->sc_ethercom; 16422 uint32_t phy_ctrl; 16423 int rv; 16424 16425 phy_ctrl = CSR_READ(sc, WMREG_PHY_CTRL); 16426 phy_ctrl |= PHY_CTRL_GBE_DIS; 16427 16428 KASSERT((sc->sc_type >= WM_T_ICH8) && (sc->sc_type <= WM_T_PCH_CNP)); 16429 16430 if (sc->sc_phytype == WMPHY_I217) { 16431 uint16_t devid = sc->sc_pcidevid; 16432 16433 if ((devid == PCI_PRODUCT_INTEL_I218_LM) || 16434 (devid == PCI_PRODUCT_INTEL_I218_V) || 16435 (devid == PCI_PRODUCT_INTEL_I218_LM3) || 16436 (devid == PCI_PRODUCT_INTEL_I218_V3) || 16437 (sc->sc_type >= WM_T_PCH_SPT)) 16438 CSR_WRITE(sc, WMREG_FEXTNVM6, 16439 CSR_READ(sc, WMREG_FEXTNVM6) 16440 & ~FEXTNVM6_REQ_PLL_CLK); 16441 16442 if (sc->phy.acquire(sc) != 0) 16443 goto out; 16444 16445 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) { 16446 uint16_t eee_advert; 16447 16448 rv = wm_read_emi_reg_locked(dev, 16449 I217_EEE_ADVERTISEMENT, &eee_advert); 16450 if (rv) 16451 goto release; 16452 16453 /* 16454 * Disable LPLU if both link partners support 100BaseT 16455 * EEE and 100Full is advertised on both ends of the 16456 * link, and enable Auto Enable LPI since there will 16457 * be no driver to enable LPI while in Sx. 16458 */ 16459 if ((eee_advert & AN_EEEADVERT_100_TX) && 16460 (sc->eee_lp_ability & AN_EEEADVERT_100_TX)) { 16461 uint16_t anar, phy_reg; 16462 16463 sc->phy.readreg_locked(dev, 2, MII_ANAR, 16464 &anar); 16465 if (anar & ANAR_TX_FD) { 16466 phy_ctrl &= ~(PHY_CTRL_D0A_LPLU | 16467 PHY_CTRL_NOND0A_LPLU); 16468 16469 /* Set Auto Enable LPI after link up */ 16470 sc->phy.readreg_locked(dev, 2, 16471 I217_LPI_GPIO_CTRL, &phy_reg); 16472 phy_reg |= I217_LPI_GPIO_CTRL_AUTO_EN_LPI; 16473 sc->phy.writereg_locked(dev, 2, 16474 I217_LPI_GPIO_CTRL, phy_reg); 16475 } 16476 } 16477 } 16478 16479 /* 16480 * For i217 Intel Rapid Start Technology support, 16481 * when the system is going into Sx and no manageability engine 16482 * is present, the driver must configure proxy to reset only on 16483 * power good. LPI (Low Power Idle) state must also reset only 16484 * on power good, as well as the MTA (Multicast table array). 16485 * The SMBus release must also be disabled on LCD reset. 16486 */ 16487 16488 /* 16489 * Enable MTA to reset for Intel Rapid Start Technology 16490 * Support 16491 */ 16492 16493 release: 16494 sc->phy.release(sc); 16495 } 16496 out: 16497 CSR_WRITE(sc, WMREG_PHY_CTRL, phy_ctrl); 16498 16499 if (sc->sc_type == WM_T_ICH8) 16500 wm_gig_downshift_workaround_ich8lan(sc); 16501 16502 if (sc->sc_type >= WM_T_PCH) { 16503 wm_oem_bits_config_ich8lan(sc, false); 16504 16505 /* Reset PHY to activate OEM bits on 82577/8 */ 16506 if (sc->sc_type == WM_T_PCH) 16507 wm_reset_phy(sc); 16508 16509 if (sc->phy.acquire(sc) != 0) 16510 return; 16511 wm_write_smbus_addr(sc); 16512 sc->phy.release(sc); 16513 } 16514 } 16515 16516 /* 16517 * wm_resume_workarounds_pchlan - workarounds needed during Sx->S0 16518 * @sc: pointer to the HW structure 16519 * 16520 * During Sx to S0 transitions on non-managed devices or managed devices 16521 * on which PHY resets are not blocked, if the PHY registers cannot be 16522 * accessed properly by the s/w toggle the LANPHYPC value to power cycle 16523 * the PHY. 16524 * On i217, setup Intel Rapid Start Technology. 16525 */ 16526 static int 16527 wm_resume_workarounds_pchlan(struct wm_softc *sc) 16528 { 16529 device_t dev = sc->sc_dev; 16530 int rv; 16531 16532 if (sc->sc_type < WM_T_PCH2) 16533 return 0; 16534 16535 rv = wm_init_phy_workarounds_pchlan(sc); 16536 if (rv != 0) 16537 return rv; 16538 16539 /* For i217 Intel Rapid Start Technology support when the system 16540 * is transitioning from Sx and no manageability engine is present 16541 * configure SMBus to restore on reset, disable proxy, and enable 16542 * the reset on MTA (Multicast table array). 16543 */ 16544 if (sc->sc_phytype == WMPHY_I217) { 16545 uint16_t phy_reg; 16546 16547 rv = sc->phy.acquire(sc); 16548 if (rv != 0) 16549 return rv; 16550 16551 /* Clear Auto Enable LPI after link up */ 16552 sc->phy.readreg_locked(dev, 1, I217_LPI_GPIO_CTRL, &phy_reg); 16553 phy_reg &= ~I217_LPI_GPIO_CTRL_AUTO_EN_LPI; 16554 sc->phy.writereg_locked(dev, 1, I217_LPI_GPIO_CTRL, phy_reg); 16555 16556 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) { 16557 /* Restore clear on SMB if no manageability engine 16558 * is present 16559 */ 16560 rv = sc->phy.readreg_locked(dev, 1, I217_MEMPWR, 16561 &phy_reg); 16562 if (rv != 0) 16563 goto release; 16564 phy_reg |= I217_MEMPWR_DISABLE_SMB_RELEASE; 16565 sc->phy.writereg_locked(dev, 1, I217_MEMPWR, phy_reg); 16566 16567 /* Disable Proxy */ 16568 sc->phy.writereg_locked(dev, 1, I217_PROXY_CTRL, 0); 16569 } 16570 /* Enable reset on MTA */ 16571 sc->phy.readreg_locked(dev, 1, I217_CFGREG, &phy_reg); 16572 if (rv != 0) 16573 goto release; 16574 phy_reg &= ~I217_CGFREG_ENABLE_MTA_RESET; 16575 sc->phy.writereg_locked(dev, 1, I217_CFGREG, phy_reg); 16576 16577 release: 16578 sc->phy.release(sc); 16579 return rv; 16580 } 16581 16582 return 0; 16583 } 16584 16585 static void 16586 wm_enable_wakeup(struct wm_softc *sc) 16587 { 16588 uint32_t reg, pmreg; 16589 pcireg_t pmode; 16590 int rv = 0; 16591 16592 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16593 device_xname(sc->sc_dev), __func__)); 16594 16595 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT, 16596 &pmreg, NULL) == 0) 16597 return; 16598 16599 if ((sc->sc_flags & WM_F_WOL) == 0) 16600 goto pme; 16601 16602 /* Advertise the wakeup capability */ 16603 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2) 16604 | CTRL_SWDPIN(3)); 16605 16606 /* Keep the laser running on fiber adapters */ 16607 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER) 16608 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) { 16609 reg = CSR_READ(sc, WMREG_CTRL_EXT); 16610 reg |= CTRL_EXT_SWDPIN(3); 16611 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 16612 } 16613 16614 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) || 16615 (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) || 16616 (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT) || 16617 (sc->sc_type == WM_T_PCH_SPT) || (sc->sc_type == WM_T_PCH_CNP)) 16618 wm_suspend_workarounds_ich8lan(sc); 16619 16620 #if 0 /* For the multicast packet */ 16621 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG; 16622 reg |= WUFC_MC; 16623 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE); 16624 #endif 16625 16626 if (sc->sc_type >= WM_T_PCH) { 16627 rv = wm_enable_phy_wakeup(sc); 16628 if (rv != 0) 16629 goto pme; 16630 } else { 16631 /* Enable wakeup by the MAC */ 16632 CSR_WRITE(sc, WMREG_WUC, WUC_APME | WUC_PME_EN); 16633 CSR_WRITE(sc, WMREG_WUFC, WUFC_MAG); 16634 } 16635 16636 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 16637 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 16638 || (sc->sc_type == WM_T_PCH2)) 16639 && (sc->sc_phytype == WMPHY_IGP_3)) 16640 wm_igp3_phy_powerdown_workaround_ich8lan(sc); 16641 16642 pme: 16643 /* Request PME */ 16644 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR); 16645 pmode |= PCI_PMCSR_PME_STS; /* in case it's already set (W1C) */ 16646 if ((rv == 0) && (sc->sc_flags & WM_F_WOL) != 0) { 16647 /* For WOL */ 16648 pmode |= PCI_PMCSR_PME_EN; 16649 } else { 16650 /* Disable WOL */ 16651 pmode &= ~PCI_PMCSR_PME_EN; 16652 } 16653 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode); 16654 } 16655 16656 /* Disable ASPM L0s and/or L1 for workaround */ 16657 static void 16658 wm_disable_aspm(struct wm_softc *sc) 16659 { 16660 pcireg_t reg, mask = 0; 16661 unsigned const char *str = ""; 16662 16663 /* 16664 * Only for PCIe device which has PCIe capability in the PCI config 16665 * space. 16666 */ 16667 if (((sc->sc_flags & WM_F_PCIE) == 0) || (sc->sc_pcixe_capoff == 0)) 16668 return; 16669 16670 switch (sc->sc_type) { 16671 case WM_T_82571: 16672 case WM_T_82572: 16673 /* 16674 * 8257[12] Errata 13: Device Does Not Support PCIe Active 16675 * State Power management L1 State (ASPM L1). 16676 */ 16677 mask = PCIE_LCSR_ASPM_L1; 16678 str = "L1 is"; 16679 break; 16680 case WM_T_82573: 16681 case WM_T_82574: 16682 case WM_T_82583: 16683 /* 16684 * The 82573 disappears when PCIe ASPM L0s is enabled. 16685 * 16686 * The 82574 and 82583 does not support PCIe ASPM L0s with 16687 * some chipset. The document of 82574 and 82583 says that 16688 * disabling L0s with some specific chipset is sufficient, 16689 * but we follow as of the Intel em driver does. 16690 * 16691 * References: 16692 * Errata 8 of the Specification Update of i82573. 16693 * Errata 20 of the Specification Update of i82574. 16694 * Errata 9 of the Specification Update of i82583. 16695 */ 16696 mask = PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S; 16697 str = "L0s and L1 are"; 16698 break; 16699 default: 16700 return; 16701 } 16702 16703 reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 16704 sc->sc_pcixe_capoff + PCIE_LCSR); 16705 reg &= ~mask; 16706 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 16707 sc->sc_pcixe_capoff + PCIE_LCSR, reg); 16708 16709 /* Print only in wm_attach() */ 16710 if ((sc->sc_flags & WM_F_ATTACHED) == 0) 16711 aprint_verbose_dev(sc->sc_dev, 16712 "ASPM %s disabled to workaround the errata.\n", str); 16713 } 16714 16715 /* LPLU */ 16716 16717 static void 16718 wm_lplu_d0_disable(struct wm_softc *sc) 16719 { 16720 struct mii_data *mii = &sc->sc_mii; 16721 uint32_t reg; 16722 uint16_t phyval; 16723 16724 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16725 device_xname(sc->sc_dev), __func__)); 16726 16727 if (sc->sc_phytype == WMPHY_IFE) 16728 return; 16729 16730 switch (sc->sc_type) { 16731 case WM_T_82571: 16732 case WM_T_82572: 16733 case WM_T_82573: 16734 case WM_T_82575: 16735 case WM_T_82576: 16736 mii->mii_readreg(sc->sc_dev, 1, IGPHY_POWER_MGMT, &phyval); 16737 phyval &= ~PMR_D0_LPLU; 16738 mii->mii_writereg(sc->sc_dev, 1, IGPHY_POWER_MGMT, phyval); 16739 break; 16740 case WM_T_82580: 16741 case WM_T_I350: 16742 case WM_T_I210: 16743 case WM_T_I211: 16744 reg = CSR_READ(sc, WMREG_PHPM); 16745 reg &= ~PHPM_D0A_LPLU; 16746 CSR_WRITE(sc, WMREG_PHPM, reg); 16747 break; 16748 case WM_T_82574: 16749 case WM_T_82583: 16750 case WM_T_ICH8: 16751 case WM_T_ICH9: 16752 case WM_T_ICH10: 16753 reg = CSR_READ(sc, WMREG_PHY_CTRL); 16754 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU); 16755 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 16756 CSR_WRITE_FLUSH(sc); 16757 break; 16758 case WM_T_PCH: 16759 case WM_T_PCH2: 16760 case WM_T_PCH_LPT: 16761 case WM_T_PCH_SPT: 16762 case WM_T_PCH_CNP: 16763 wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS, &phyval); 16764 phyval &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU); 16765 if (wm_phy_resetisblocked(sc) == false) 16766 phyval |= HV_OEM_BITS_ANEGNOW; 16767 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, phyval); 16768 break; 16769 default: 16770 break; 16771 } 16772 } 16773 16774 /* EEE */ 16775 16776 static int 16777 wm_set_eee_i350(struct wm_softc *sc) 16778 { 16779 struct ethercom *ec = &sc->sc_ethercom; 16780 uint32_t ipcnfg, eeer; 16781 uint32_t ipcnfg_mask 16782 = IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN | IPCNFG_10BASE_TE; 16783 uint32_t eeer_mask = EEER_TX_LPI_EN | EEER_RX_LPI_EN | EEER_LPI_FC; 16784 16785 KASSERT(sc->sc_mediatype == WM_MEDIATYPE_COPPER); 16786 16787 ipcnfg = CSR_READ(sc, WMREG_IPCNFG); 16788 eeer = CSR_READ(sc, WMREG_EEER); 16789 16790 /* Enable or disable per user setting */ 16791 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) { 16792 ipcnfg |= ipcnfg_mask; 16793 eeer |= eeer_mask; 16794 } else { 16795 ipcnfg &= ~ipcnfg_mask; 16796 eeer &= ~eeer_mask; 16797 } 16798 16799 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg); 16800 CSR_WRITE(sc, WMREG_EEER, eeer); 16801 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */ 16802 CSR_READ(sc, WMREG_EEER); /* XXX flush? */ 16803 16804 return 0; 16805 } 16806 16807 static int 16808 wm_set_eee_pchlan(struct wm_softc *sc) 16809 { 16810 device_t dev = sc->sc_dev; 16811 struct ethercom *ec = &sc->sc_ethercom; 16812 uint16_t lpa, pcs_status, adv_addr, adv, lpi_ctrl, data; 16813 int rv; 16814 16815 switch (sc->sc_phytype) { 16816 case WMPHY_82579: 16817 lpa = I82579_EEE_LP_ABILITY; 16818 pcs_status = I82579_EEE_PCS_STATUS; 16819 adv_addr = I82579_EEE_ADVERTISEMENT; 16820 break; 16821 case WMPHY_I217: 16822 lpa = I217_EEE_LP_ABILITY; 16823 pcs_status = I217_EEE_PCS_STATUS; 16824 adv_addr = I217_EEE_ADVERTISEMENT; 16825 break; 16826 default: 16827 return 0; 16828 } 16829 16830 rv = sc->phy.acquire(sc); 16831 if (rv != 0) { 16832 device_printf(dev, "%s: failed to get semaphore\n", __func__); 16833 return rv; 16834 } 16835 16836 rv = sc->phy.readreg_locked(dev, 1, I82579_LPI_CTRL, &lpi_ctrl); 16837 if (rv != 0) 16838 goto release; 16839 16840 /* Clear bits that enable EEE in various speeds */ 16841 lpi_ctrl &= ~I82579_LPI_CTRL_ENABLE; 16842 16843 if ((ec->ec_capenable & ETHERCAP_EEE) != 0) { 16844 /* Save off link partner's EEE ability */ 16845 rv = wm_read_emi_reg_locked(dev, lpa, &sc->eee_lp_ability); 16846 if (rv != 0) 16847 goto release; 16848 16849 /* Read EEE advertisement */ 16850 if ((rv = wm_read_emi_reg_locked(dev, adv_addr, &adv)) != 0) 16851 goto release; 16852 16853 /* 16854 * Enable EEE only for speeds in which the link partner is 16855 * EEE capable and for which we advertise EEE. 16856 */ 16857 if (adv & sc->eee_lp_ability & AN_EEEADVERT_1000_T) 16858 lpi_ctrl |= I82579_LPI_CTRL_EN_1000; 16859 if (adv & sc->eee_lp_ability & AN_EEEADVERT_100_TX) { 16860 sc->phy.readreg_locked(dev, 2, MII_ANLPAR, &data); 16861 if ((data & ANLPAR_TX_FD) != 0) 16862 lpi_ctrl |= I82579_LPI_CTRL_EN_100; 16863 else { 16864 /* 16865 * EEE is not supported in 100Half, so ignore 16866 * partner's EEE in 100 ability if full-duplex 16867 * is not advertised. 16868 */ 16869 sc->eee_lp_ability 16870 &= ~AN_EEEADVERT_100_TX; 16871 } 16872 } 16873 } 16874 16875 if (sc->sc_phytype == WMPHY_82579) { 16876 rv = wm_read_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, &data); 16877 if (rv != 0) 16878 goto release; 16879 16880 data &= ~I82579_LPI_PLL_SHUT_100; 16881 rv = wm_write_emi_reg_locked(dev, I82579_LPI_PLL_SHUT, data); 16882 } 16883 16884 /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */ 16885 if ((rv = wm_read_emi_reg_locked(dev, pcs_status, &data)) != 0) 16886 goto release; 16887 16888 rv = sc->phy.writereg_locked(dev, 1, I82579_LPI_CTRL, lpi_ctrl); 16889 release: 16890 sc->phy.release(sc); 16891 16892 return rv; 16893 } 16894 16895 static int 16896 wm_set_eee(struct wm_softc *sc) 16897 { 16898 struct ethercom *ec = &sc->sc_ethercom; 16899 16900 if ((ec->ec_capabilities & ETHERCAP_EEE) == 0) 16901 return 0; 16902 16903 if (sc->sc_type == WM_T_I354) { 16904 /* I354 uses an external PHY */ 16905 return 0; /* not yet */ 16906 } else if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211)) 16907 return wm_set_eee_i350(sc); 16908 else if (sc->sc_type >= WM_T_PCH2) 16909 return wm_set_eee_pchlan(sc); 16910 16911 return 0; 16912 } 16913 16914 /* 16915 * Workarounds (mainly PHY related). 16916 * Basically, PHY's workarounds are in the PHY drivers. 16917 */ 16918 16919 /* Workaround for 82566 Kumeran PCS lock loss */ 16920 static int 16921 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc) 16922 { 16923 struct mii_data *mii = &sc->sc_mii; 16924 uint32_t status = CSR_READ(sc, WMREG_STATUS); 16925 int i, reg, rv; 16926 uint16_t phyreg; 16927 16928 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 16929 device_xname(sc->sc_dev), __func__)); 16930 16931 /* If the link is not up, do nothing */ 16932 if ((status & STATUS_LU) == 0) 16933 return 0; 16934 16935 /* Nothing to do if the link is other than 1Gbps */ 16936 if (__SHIFTOUT(status, STATUS_SPEED) != STATUS_SPEED_1000) 16937 return 0; 16938 16939 for (i = 0; i < 10; i++) { 16940 /* read twice */ 16941 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg); 16942 if (rv != 0) 16943 return rv; 16944 rv = mii->mii_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG, &phyreg); 16945 if (rv != 0) 16946 return rv; 16947 16948 if ((phyreg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0) 16949 goto out; /* GOOD! */ 16950 16951 /* Reset the PHY */ 16952 wm_reset_phy(sc); 16953 delay(5*1000); 16954 } 16955 16956 /* Disable GigE link negotiation */ 16957 reg = CSR_READ(sc, WMREG_PHY_CTRL); 16958 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; 16959 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 16960 16961 /* 16962 * Call gig speed drop workaround on Gig disable before accessing 16963 * any PHY registers. 16964 */ 16965 wm_gig_downshift_workaround_ich8lan(sc); 16966 16967 out: 16968 return 0; 16969 } 16970 16971 /* 16972 * wm_gig_downshift_workaround_ich8lan - WoL from S5 stops working 16973 * @sc: pointer to the HW structure 16974 * 16975 * Steps to take when dropping from 1Gb/s (eg. link cable removal (LSC), 16976 * LPLU, Gig disable, MDIC PHY reset): 16977 * 1) Set Kumeran Near-end loopback 16978 * 2) Clear Kumeran Near-end loopback 16979 * Should only be called for ICH8[m] devices with any 1G Phy. 16980 */ 16981 static void 16982 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc) 16983 { 16984 uint16_t kmreg; 16985 16986 /* Only for igp3 */ 16987 if (sc->sc_phytype == WMPHY_IGP_3) { 16988 if (wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG, &kmreg) != 0) 16989 return; 16990 kmreg |= KUMCTRLSTA_DIAG_NELPBK; 16991 if (wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg) != 0) 16992 return; 16993 kmreg &= ~KUMCTRLSTA_DIAG_NELPBK; 16994 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmreg); 16995 } 16996 } 16997 16998 /* 16999 * Workaround for pch's PHYs 17000 * XXX should be moved to new PHY driver? 17001 */ 17002 static int 17003 wm_hv_phy_workarounds_ich8lan(struct wm_softc *sc) 17004 { 17005 device_t dev = sc->sc_dev; 17006 struct mii_data *mii = &sc->sc_mii; 17007 struct mii_softc *child; 17008 uint16_t phy_data, phyrev = 0; 17009 int phytype = sc->sc_phytype; 17010 int rv; 17011 17012 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17013 device_xname(dev), __func__)); 17014 KASSERT(sc->sc_type == WM_T_PCH); 17015 17016 /* Set MDIO slow mode before any other MDIO access */ 17017 if (phytype == WMPHY_82577) 17018 if ((rv = wm_set_mdio_slow_mode_hv(sc)) != 0) 17019 return rv; 17020 17021 child = LIST_FIRST(&mii->mii_phys); 17022 if (child != NULL) 17023 phyrev = child->mii_mpd_rev; 17024 17025 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/ 17026 if ((child != NULL) && 17027 (((phytype == WMPHY_82577) && ((phyrev == 1) || (phyrev == 2))) || 17028 ((phytype == WMPHY_82578) && (phyrev == 1)))) { 17029 /* Disable generation of early preamble (0x4431) */ 17030 rv = mii->mii_readreg(dev, 2, BM_RATE_ADAPTATION_CTRL, 17031 &phy_data); 17032 if (rv != 0) 17033 return rv; 17034 phy_data &= ~(BM_RATE_ADAPTATION_CTRL_RX_RXDV_PRE | 17035 BM_RATE_ADAPTATION_CTRL_RX_CRS_PRE); 17036 rv = mii->mii_writereg(dev, 2, BM_RATE_ADAPTATION_CTRL, 17037 phy_data); 17038 if (rv != 0) 17039 return rv; 17040 17041 /* Preamble tuning for SSC */ 17042 rv = mii->mii_writereg(dev, 2, HV_KMRN_FIFO_CTRLSTA, 0xa204); 17043 if (rv != 0) 17044 return rv; 17045 } 17046 17047 /* 82578 */ 17048 if (phytype == WMPHY_82578) { 17049 /* 17050 * Return registers to default by doing a soft reset then 17051 * writing 0x3140 to the control register 17052 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1 17053 */ 17054 if ((child != NULL) && (phyrev < 2)) { 17055 PHY_RESET(child); 17056 rv = mii->mii_writereg(dev, 2, MII_BMCR, 0x3140); 17057 if (rv != 0) 17058 return rv; 17059 } 17060 } 17061 17062 /* Select page 0 */ 17063 if ((rv = sc->phy.acquire(sc)) != 0) 17064 return rv; 17065 rv = wm_gmii_mdic_writereg(dev, 1, IGPHY_PAGE_SELECT, 0); 17066 sc->phy.release(sc); 17067 if (rv != 0) 17068 return rv; 17069 17070 /* 17071 * Configure the K1 Si workaround during phy reset assuming there is 17072 * link so that it disables K1 if link is in 1Gbps. 17073 */ 17074 if ((rv = wm_k1_gig_workaround_hv(sc, 1)) != 0) 17075 return rv; 17076 17077 /* Workaround for link disconnects on a busy hub in half duplex */ 17078 rv = sc->phy.acquire(sc); 17079 if (rv) 17080 return rv; 17081 rv = sc->phy.readreg_locked(dev, 2, BM_PORT_GEN_CFG, &phy_data); 17082 if (rv) 17083 goto release; 17084 rv = sc->phy.writereg_locked(dev, 2, BM_PORT_GEN_CFG, 17085 phy_data & 0x00ff); 17086 if (rv) 17087 goto release; 17088 17089 /* Set MSE higher to enable link to stay up when noise is high */ 17090 rv = wm_write_emi_reg_locked(dev, I82577_MSE_THRESHOLD, 0x0034); 17091 release: 17092 sc->phy.release(sc); 17093 17094 return rv; 17095 } 17096 17097 /* 17098 * wm_copy_rx_addrs_to_phy_ich8lan - Copy Rx addresses from MAC to PHY 17099 * @sc: pointer to the HW structure 17100 */ 17101 static void 17102 wm_copy_rx_addrs_to_phy_ich8lan(struct wm_softc *sc) 17103 { 17104 17105 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17106 device_xname(sc->sc_dev), __func__)); 17107 17108 if (sc->phy.acquire(sc) != 0) 17109 return; 17110 17111 wm_copy_rx_addrs_to_phy_ich8lan_locked(sc); 17112 17113 sc->phy.release(sc); 17114 } 17115 17116 static void 17117 wm_copy_rx_addrs_to_phy_ich8lan_locked(struct wm_softc *sc) 17118 { 17119 device_t dev = sc->sc_dev; 17120 uint32_t mac_reg; 17121 uint16_t i, wuce; 17122 int count; 17123 17124 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17125 device_xname(dev), __func__)); 17126 17127 if (wm_enable_phy_wakeup_reg_access_bm(dev, &wuce) != 0) 17128 return; 17129 17130 /* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */ 17131 count = wm_rar_count(sc); 17132 for (i = 0; i < count; i++) { 17133 uint16_t lo, hi; 17134 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAL(i)); 17135 lo = (uint16_t)(mac_reg & 0xffff); 17136 hi = (uint16_t)((mac_reg >> 16) & 0xffff); 17137 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_L(i), &lo, 0, true); 17138 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_M(i), &hi, 0, true); 17139 17140 mac_reg = CSR_READ(sc, WMREG_CORDOVA_RAH(i)); 17141 lo = (uint16_t)(mac_reg & 0xffff); 17142 hi = (uint16_t)((mac_reg & RAL_AV) >> 16); 17143 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_H(i), &lo, 0, true); 17144 wm_access_phy_wakeup_reg_bm(dev, BM_RAR_CTRL(i), &hi, 0, true); 17145 } 17146 17147 wm_disable_phy_wakeup_reg_access_bm(dev, &wuce); 17148 } 17149 17150 /* 17151 * wm_lv_jumbo_workaround_ich8lan - required for jumbo frame operation 17152 * with 82579 PHY 17153 * @enable: flag to enable/disable workaround when enabling/disabling jumbos 17154 */ 17155 static int 17156 wm_lv_jumbo_workaround_ich8lan(struct wm_softc *sc, bool enable) 17157 { 17158 device_t dev = sc->sc_dev; 17159 int rar_count; 17160 int rv; 17161 uint32_t mac_reg; 17162 uint16_t dft_ctrl, data; 17163 uint16_t i; 17164 17165 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17166 device_xname(dev), __func__)); 17167 17168 if (sc->sc_type < WM_T_PCH2) 17169 return 0; 17170 17171 /* Acquire PHY semaphore */ 17172 rv = sc->phy.acquire(sc); 17173 if (rv != 0) 17174 return rv; 17175 17176 /* Disable Rx path while enabling/disabling workaround */ 17177 rv = sc->phy.readreg_locked(dev, 2, I82579_DFT_CTRL, &dft_ctrl); 17178 if (rv != 0) 17179 goto out; 17180 rv = sc->phy.writereg_locked(dev, 2, I82579_DFT_CTRL, 17181 dft_ctrl | (1 << 14)); 17182 if (rv != 0) 17183 goto out; 17184 17185 if (enable) { 17186 /* Write Rx addresses (rar_entry_count for RAL/H, and 17187 * SHRAL/H) and initial CRC values to the MAC 17188 */ 17189 rar_count = wm_rar_count(sc); 17190 for (i = 0; i < rar_count; i++) { 17191 uint8_t mac_addr[ETHER_ADDR_LEN] = {0}; 17192 uint32_t addr_high, addr_low; 17193 17194 addr_high = CSR_READ(sc, WMREG_CORDOVA_RAH(i)); 17195 if (!(addr_high & RAL_AV)) 17196 continue; 17197 addr_low = CSR_READ(sc, WMREG_CORDOVA_RAL(i)); 17198 mac_addr[0] = (addr_low & 0xFF); 17199 mac_addr[1] = ((addr_low >> 8) & 0xFF); 17200 mac_addr[2] = ((addr_low >> 16) & 0xFF); 17201 mac_addr[3] = ((addr_low >> 24) & 0xFF); 17202 mac_addr[4] = (addr_high & 0xFF); 17203 mac_addr[5] = ((addr_high >> 8) & 0xFF); 17204 17205 CSR_WRITE(sc, WMREG_PCH_RAICC(i), 17206 ~ether_crc32_le(mac_addr, ETHER_ADDR_LEN)); 17207 } 17208 17209 /* Write Rx addresses to the PHY */ 17210 wm_copy_rx_addrs_to_phy_ich8lan_locked(sc); 17211 } 17212 17213 /* 17214 * If enable == 17215 * true: Enable jumbo frame workaround in the MAC. 17216 * false: Write MAC register values back to h/w defaults. 17217 */ 17218 mac_reg = CSR_READ(sc, WMREG_FFLT_DBG); 17219 if (enable) { 17220 mac_reg &= ~(1 << 14); 17221 mac_reg |= (7 << 15); 17222 } else 17223 mac_reg &= ~(0xf << 14); 17224 CSR_WRITE(sc, WMREG_FFLT_DBG, mac_reg); 17225 17226 mac_reg = CSR_READ(sc, WMREG_RCTL); 17227 if (enable) { 17228 mac_reg |= RCTL_SECRC; 17229 sc->sc_rctl |= RCTL_SECRC; 17230 sc->sc_flags |= WM_F_CRC_STRIP; 17231 } else { 17232 mac_reg &= ~RCTL_SECRC; 17233 sc->sc_rctl &= ~RCTL_SECRC; 17234 sc->sc_flags &= ~WM_F_CRC_STRIP; 17235 } 17236 CSR_WRITE(sc, WMREG_RCTL, mac_reg); 17237 17238 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_CTRL, &data); 17239 if (rv != 0) 17240 goto out; 17241 if (enable) 17242 data |= 1 << 0; 17243 else 17244 data &= ~(1 << 0); 17245 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_CTRL, data); 17246 if (rv != 0) 17247 goto out; 17248 17249 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_HD_CTRL, &data); 17250 if (rv != 0) 17251 goto out; 17252 /* 17253 * XXX FreeBSD and Linux do the same thing that they set the same value 17254 * on both the enable case and the disable case. Is it correct? 17255 */ 17256 data &= ~(0xf << 8); 17257 data |= (0xb << 8); 17258 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_HD_CTRL, data); 17259 if (rv != 0) 17260 goto out; 17261 17262 /* 17263 * If enable == 17264 * true: Enable jumbo frame workaround in the PHY. 17265 * false: Write PHY register values back to h/w defaults. 17266 */ 17267 rv = sc->phy.readreg_locked(dev, 2, BME1000_REG(769, 23), &data); 17268 if (rv != 0) 17269 goto out; 17270 data &= ~(0x7F << 5); 17271 if (enable) 17272 data |= (0x37 << 5); 17273 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(769, 23), data); 17274 if (rv != 0) 17275 goto out; 17276 17277 rv = sc->phy.readreg_locked(dev, 2, BME1000_REG(769, 16), &data); 17278 if (rv != 0) 17279 goto out; 17280 if (enable) 17281 data &= ~(1 << 13); 17282 else 17283 data |= (1 << 13); 17284 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(769, 16), data); 17285 if (rv != 0) 17286 goto out; 17287 17288 rv = sc->phy.readreg_locked(dev, 2, I82579_UNKNOWN1, &data); 17289 if (rv != 0) 17290 goto out; 17291 data &= ~(0x3FF << 2); 17292 if (enable) 17293 data |= (I82579_TX_PTR_GAP << 2); 17294 else 17295 data |= (0x8 << 2); 17296 rv = sc->phy.writereg_locked(dev, 2, I82579_UNKNOWN1, data); 17297 if (rv != 0) 17298 goto out; 17299 17300 rv = sc->phy.writereg_locked(dev, 2, BME1000_REG(776, 23), 17301 enable ? 0xf100 : 0x7e00); 17302 if (rv != 0) 17303 goto out; 17304 17305 rv = sc->phy.readreg_locked(dev, 2, HV_PM_CTRL, &data); 17306 if (rv != 0) 17307 goto out; 17308 if (enable) 17309 data |= 1 << 10; 17310 else 17311 data &= ~(1 << 10); 17312 rv = sc->phy.writereg_locked(dev, 2, HV_PM_CTRL, data); 17313 if (rv != 0) 17314 goto out; 17315 17316 /* Re-enable Rx path after enabling/disabling workaround */ 17317 rv = sc->phy.writereg_locked(dev, 2, I82579_DFT_CTRL, 17318 dft_ctrl & ~(1 << 14)); 17319 17320 out: 17321 sc->phy.release(sc); 17322 17323 return rv; 17324 } 17325 17326 /* 17327 * wm_lv_phy_workarounds_ich8lan - A series of Phy workarounds to be 17328 * done after every PHY reset. 17329 */ 17330 static int 17331 wm_lv_phy_workarounds_ich8lan(struct wm_softc *sc) 17332 { 17333 device_t dev = sc->sc_dev; 17334 int rv; 17335 17336 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17337 device_xname(dev), __func__)); 17338 KASSERT(sc->sc_type == WM_T_PCH2); 17339 17340 /* Set MDIO slow mode before any other MDIO access */ 17341 rv = wm_set_mdio_slow_mode_hv(sc); 17342 if (rv != 0) 17343 return rv; 17344 17345 rv = sc->phy.acquire(sc); 17346 if (rv != 0) 17347 return rv; 17348 /* Set MSE higher to enable link to stay up when noise is high */ 17349 rv = wm_write_emi_reg_locked(dev, I82579_MSE_THRESHOLD, 0x0034); 17350 if (rv != 0) 17351 goto release; 17352 /* Drop link after 5 times MSE threshold was reached */ 17353 rv = wm_write_emi_reg_locked(dev, I82579_MSE_LINK_DOWN, 0x0005); 17354 release: 17355 sc->phy.release(sc); 17356 17357 return rv; 17358 } 17359 17360 /** 17361 * wm_k1_workaround_lpt_lp - K1 workaround on Lynxpoint-LP 17362 * @link: link up bool flag 17363 * 17364 * When K1 is enabled for 1Gbps, the MAC can miss 2 DMA completion indications 17365 * preventing further DMA write requests. Workaround the issue by disabling 17366 * the de-assertion of the clock request when in 1Gpbs mode. 17367 * Also, set appropriate Tx re-transmission timeouts for 10 and 100Half link 17368 * speeds in order to avoid Tx hangs. 17369 **/ 17370 static int 17371 wm_k1_workaround_lpt_lp(struct wm_softc *sc, bool link) 17372 { 17373 uint32_t fextnvm6 = CSR_READ(sc, WMREG_FEXTNVM6); 17374 uint32_t status = CSR_READ(sc, WMREG_STATUS); 17375 uint32_t speed = __SHIFTOUT(status, STATUS_SPEED); 17376 uint16_t phyreg; 17377 17378 if (link && (speed == STATUS_SPEED_1000)) { 17379 int rv; 17380 17381 rv = sc->phy.acquire(sc); 17382 if (rv != 0) 17383 return rv; 17384 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, 17385 &phyreg); 17386 if (rv != 0) 17387 goto release; 17388 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, 17389 phyreg & ~KUMCTRLSTA_K1_ENABLE); 17390 if (rv != 0) 17391 goto release; 17392 delay(20); 17393 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6 | FEXTNVM6_REQ_PLL_CLK); 17394 17395 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, 17396 &phyreg); 17397 release: 17398 sc->phy.release(sc); 17399 return rv; 17400 } 17401 17402 fextnvm6 &= ~FEXTNVM6_REQ_PLL_CLK; 17403 17404 struct mii_softc *child = LIST_FIRST(&sc->sc_mii.mii_phys); 17405 if (((child != NULL) && (child->mii_mpd_rev > 5)) 17406 || !link 17407 || ((speed == STATUS_SPEED_100) && (status & STATUS_FD))) 17408 goto update_fextnvm6; 17409 17410 wm_gmii_hv_readreg(sc->sc_dev, 2, I217_INBAND_CTRL, &phyreg); 17411 17412 /* Clear link status transmit timeout */ 17413 phyreg &= ~I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_MASK; 17414 if (speed == STATUS_SPEED_100) { 17415 /* Set inband Tx timeout to 5x10us for 100Half */ 17416 phyreg |= 5 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT; 17417 17418 /* Do not extend the K1 entry latency for 100Half */ 17419 fextnvm6 &= ~FEXTNVM6_ENABLE_K1_ENTRY_CONDITION; 17420 } else { 17421 /* Set inband Tx timeout to 50x10us for 10Full/Half */ 17422 phyreg |= 50 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT; 17423 17424 /* Extend the K1 entry latency for 10 Mbps */ 17425 fextnvm6 |= FEXTNVM6_ENABLE_K1_ENTRY_CONDITION; 17426 } 17427 17428 wm_gmii_hv_writereg(sc->sc_dev, 2, I217_INBAND_CTRL, phyreg); 17429 17430 update_fextnvm6: 17431 CSR_WRITE(sc, WMREG_FEXTNVM6, fextnvm6); 17432 return 0; 17433 } 17434 17435 /* 17436 * wm_k1_gig_workaround_hv - K1 Si workaround 17437 * @sc: pointer to the HW structure 17438 * @link: link up bool flag 17439 * 17440 * If K1 is enabled for 1Gbps, the MAC might stall when transitioning 17441 * from a lower speed. This workaround disables K1 whenever link is at 1Gig 17442 * If link is down, the function will restore the default K1 setting located 17443 * in the NVM. 17444 */ 17445 static int 17446 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link) 17447 { 17448 int k1_enable = sc->sc_nvm_k1_enabled; 17449 int rv; 17450 17451 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17452 device_xname(sc->sc_dev), __func__)); 17453 17454 rv = sc->phy.acquire(sc); 17455 if (rv != 0) 17456 return rv; 17457 17458 if (link) { 17459 k1_enable = 0; 17460 17461 /* Link stall fix for link up */ 17462 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 17463 0x0100); 17464 } else { 17465 /* Link stall fix for link down */ 17466 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 17467 0x4100); 17468 } 17469 17470 wm_configure_k1_ich8lan(sc, k1_enable); 17471 sc->phy.release(sc); 17472 17473 return 0; 17474 } 17475 17476 /* 17477 * wm_k1_workaround_lv - K1 Si workaround 17478 * @sc: pointer to the HW structure 17479 * 17480 * Workaround to set the K1 beacon duration for 82579 parts in 10Mbps 17481 * Disable K1 for 1000 and 100 speeds 17482 */ 17483 static int 17484 wm_k1_workaround_lv(struct wm_softc *sc) 17485 { 17486 uint32_t reg; 17487 uint16_t phyreg; 17488 int rv; 17489 17490 if (sc->sc_type != WM_T_PCH2) 17491 return 0; 17492 17493 /* Set K1 beacon duration based on 10Mbps speed */ 17494 rv = wm_gmii_hv_readreg(sc->sc_dev, 2, HV_M_STATUS, &phyreg); 17495 if (rv != 0) 17496 return rv; 17497 17498 if ((phyreg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) 17499 == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { 17500 if (phyreg & 17501 (HV_M_STATUS_SPEED_1000 | HV_M_STATUS_SPEED_100)) { 17502 /* LV 1G/100 Packet drop issue wa */ 17503 rv = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_PM_CTRL, 17504 &phyreg); 17505 if (rv != 0) 17506 return rv; 17507 phyreg &= ~HV_PM_CTRL_K1_ENA; 17508 rv = wm_gmii_hv_writereg(sc->sc_dev, 1, HV_PM_CTRL, 17509 phyreg); 17510 if (rv != 0) 17511 return rv; 17512 } else { 17513 /* For 10Mbps */ 17514 reg = CSR_READ(sc, WMREG_FEXTNVM4); 17515 reg &= ~FEXTNVM4_BEACON_DURATION; 17516 reg |= FEXTNVM4_BEACON_DURATION_16US; 17517 CSR_WRITE(sc, WMREG_FEXTNVM4, reg); 17518 } 17519 } 17520 17521 return 0; 17522 } 17523 17524 /* 17525 * wm_link_stall_workaround_hv - Si workaround 17526 * @sc: pointer to the HW structure 17527 * 17528 * This function works around a Si bug where the link partner can get 17529 * a link up indication before the PHY does. If small packets are sent 17530 * by the link partner they can be placed in the packet buffer without 17531 * being properly accounted for by the PHY and will stall preventing 17532 * further packets from being received. The workaround is to clear the 17533 * packet buffer after the PHY detects link up. 17534 */ 17535 static int 17536 wm_link_stall_workaround_hv(struct wm_softc *sc) 17537 { 17538 uint16_t phyreg; 17539 17540 if (sc->sc_phytype != WMPHY_82578) 17541 return 0; 17542 17543 /* Do not apply workaround if in PHY loopback bit 14 set */ 17544 wm_gmii_hv_readreg(sc->sc_dev, 2, MII_BMCR, &phyreg); 17545 if ((phyreg & BMCR_LOOP) != 0) 17546 return 0; 17547 17548 /* Check if link is up and at 1Gbps */ 17549 wm_gmii_hv_readreg(sc->sc_dev, 2, BM_CS_STATUS, &phyreg); 17550 phyreg &= BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED 17551 | BM_CS_STATUS_SPEED_MASK; 17552 if (phyreg != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED 17553 | BM_CS_STATUS_SPEED_1000)) 17554 return 0; 17555 17556 delay(200 * 1000); /* XXX too big */ 17557 17558 /* Flush the packets in the fifo buffer */ 17559 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL, 17560 HV_MUX_DATA_CTRL_GEN_TO_MAC | HV_MUX_DATA_CTRL_FORCE_SPEED); 17561 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_MUX_DATA_CTRL, 17562 HV_MUX_DATA_CTRL_GEN_TO_MAC); 17563 17564 return 0; 17565 } 17566 17567 static int 17568 wm_set_mdio_slow_mode_hv(struct wm_softc *sc) 17569 { 17570 int rv; 17571 17572 rv = sc->phy.acquire(sc); 17573 if (rv != 0) { 17574 device_printf(sc->sc_dev, "%s: failed to get semaphore\n", 17575 __func__); 17576 return rv; 17577 } 17578 17579 rv = wm_set_mdio_slow_mode_hv_locked(sc); 17580 17581 sc->phy.release(sc); 17582 17583 return rv; 17584 } 17585 17586 static int 17587 wm_set_mdio_slow_mode_hv_locked(struct wm_softc *sc) 17588 { 17589 int rv; 17590 uint16_t reg; 17591 17592 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, ®); 17593 if (rv != 0) 17594 return rv; 17595 17596 return wm_gmii_hv_writereg_locked(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, 17597 reg | HV_KMRN_MDIO_SLOW); 17598 } 17599 17600 /* 17601 * wm_configure_k1_ich8lan - Configure K1 power state 17602 * @sc: pointer to the HW structure 17603 * @enable: K1 state to configure 17604 * 17605 * Configure the K1 power state based on the provided parameter. 17606 * Assumes semaphore already acquired. 17607 */ 17608 static void 17609 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable) 17610 { 17611 uint32_t ctrl, ctrl_ext, tmp; 17612 uint16_t kmreg; 17613 int rv; 17614 17615 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP); 17616 17617 rv = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, &kmreg); 17618 if (rv != 0) 17619 return; 17620 17621 if (k1_enable) 17622 kmreg |= KUMCTRLSTA_K1_ENABLE; 17623 else 17624 kmreg &= ~KUMCTRLSTA_K1_ENABLE; 17625 17626 rv = wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmreg); 17627 if (rv != 0) 17628 return; 17629 17630 delay(20); 17631 17632 ctrl = CSR_READ(sc, WMREG_CTRL); 17633 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 17634 17635 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100); 17636 tmp |= CTRL_FRCSPD; 17637 17638 CSR_WRITE(sc, WMREG_CTRL, tmp); 17639 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS); 17640 CSR_WRITE_FLUSH(sc); 17641 delay(20); 17642 17643 CSR_WRITE(sc, WMREG_CTRL, ctrl); 17644 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 17645 CSR_WRITE_FLUSH(sc); 17646 delay(20); 17647 17648 return; 17649 } 17650 17651 /* special case - for 82575 - need to do manual init ... */ 17652 static void 17653 wm_reset_init_script_82575(struct wm_softc *sc) 17654 { 17655 /* 17656 * Remark: this is untested code - we have no board without EEPROM 17657 * same setup as mentioned int the FreeBSD driver for the i82575 17658 */ 17659 17660 /* SerDes configuration via SERDESCTRL */ 17661 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c); 17662 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78); 17663 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23); 17664 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15); 17665 17666 /* CCM configuration via CCMCTL register */ 17667 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00); 17668 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00); 17669 17670 /* PCIe lanes configuration */ 17671 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec); 17672 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf); 17673 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05); 17674 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81); 17675 17676 /* PCIe PLL Configuration */ 17677 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47); 17678 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00); 17679 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00); 17680 } 17681 17682 static void 17683 wm_reset_mdicnfg_82580(struct wm_softc *sc) 17684 { 17685 uint32_t reg; 17686 uint16_t nvmword; 17687 int rv; 17688 17689 if (sc->sc_type != WM_T_82580) 17690 return; 17691 if ((sc->sc_flags & WM_F_SGMII) == 0) 17692 return; 17693 17694 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) 17695 + NVM_OFF_CFG3_PORTA, 1, &nvmword); 17696 if (rv != 0) { 17697 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n", 17698 __func__); 17699 return; 17700 } 17701 17702 reg = CSR_READ(sc, WMREG_MDICNFG); 17703 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO) 17704 reg |= MDICNFG_DEST; 17705 if (nvmword & NVM_CFG3_PORTA_COM_MDIO) 17706 reg |= MDICNFG_COM_MDIO; 17707 CSR_WRITE(sc, WMREG_MDICNFG, reg); 17708 } 17709 17710 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff)) 17711 17712 static bool 17713 wm_phy_is_accessible_pchlan(struct wm_softc *sc) 17714 { 17715 uint32_t reg; 17716 uint16_t id1, id2; 17717 int i, rv; 17718 17719 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17720 device_xname(sc->sc_dev), __func__)); 17721 KASSERT(CSR_READ(sc, WMREG_EXTCNFCTR) & EXTCNFCTR_MDIO_SW_OWNERSHIP); 17722 17723 id1 = id2 = 0xffff; 17724 for (i = 0; i < 2; i++) { 17725 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1, 17726 &id1); 17727 if ((rv != 0) || MII_INVALIDID(id1)) 17728 continue; 17729 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2, 17730 &id2); 17731 if ((rv != 0) || MII_INVALIDID(id2)) 17732 continue; 17733 break; 17734 } 17735 if ((rv == 0) && !MII_INVALIDID(id1) && !MII_INVALIDID(id2)) 17736 goto out; 17737 17738 /* 17739 * In case the PHY needs to be in mdio slow mode, 17740 * set slow mode and try to get the PHY id again. 17741 */ 17742 rv = 0; 17743 if (sc->sc_type < WM_T_PCH_LPT) { 17744 wm_set_mdio_slow_mode_hv_locked(sc); 17745 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1, 17746 &id1); 17747 rv |= wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2, 17748 &id2); 17749 } 17750 if ((rv != 0) || MII_INVALIDID(id1) || MII_INVALIDID(id2)) { 17751 device_printf(sc->sc_dev, "XXX return with false\n"); 17752 return false; 17753 } 17754 out: 17755 if (sc->sc_type >= WM_T_PCH_LPT) { 17756 /* Only unforce SMBus if ME is not active */ 17757 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) { 17758 uint16_t phyreg; 17759 17760 /* Unforce SMBus mode in PHY */ 17761 rv = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, 17762 CV_SMB_CTRL, &phyreg); 17763 phyreg &= ~CV_SMB_CTRL_FORCE_SMBUS; 17764 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, 17765 CV_SMB_CTRL, phyreg); 17766 17767 /* Unforce SMBus mode in MAC */ 17768 reg = CSR_READ(sc, WMREG_CTRL_EXT); 17769 reg &= ~CTRL_EXT_FORCE_SMBUS; 17770 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 17771 } 17772 } 17773 return true; 17774 } 17775 17776 static void 17777 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc) 17778 { 17779 uint32_t reg; 17780 int i; 17781 17782 /* Set PHY Config Counter to 50msec */ 17783 reg = CSR_READ(sc, WMREG_FEXTNVM3); 17784 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK; 17785 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS; 17786 CSR_WRITE(sc, WMREG_FEXTNVM3, reg); 17787 17788 /* Toggle LANPHYPC */ 17789 reg = CSR_READ(sc, WMREG_CTRL); 17790 reg |= CTRL_LANPHYPC_OVERRIDE; 17791 reg &= ~CTRL_LANPHYPC_VALUE; 17792 CSR_WRITE(sc, WMREG_CTRL, reg); 17793 CSR_WRITE_FLUSH(sc); 17794 delay(1000); 17795 reg &= ~CTRL_LANPHYPC_OVERRIDE; 17796 CSR_WRITE(sc, WMREG_CTRL, reg); 17797 CSR_WRITE_FLUSH(sc); 17798 17799 if (sc->sc_type < WM_T_PCH_LPT) 17800 delay(50 * 1000); 17801 else { 17802 i = 20; 17803 17804 do { 17805 delay(5 * 1000); 17806 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0) 17807 && i--); 17808 17809 delay(30 * 1000); 17810 } 17811 } 17812 17813 static int 17814 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link) 17815 { 17816 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ) 17817 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND; 17818 uint32_t rxa; 17819 uint16_t scale = 0, lat_enc = 0; 17820 int32_t obff_hwm = 0; 17821 int64_t lat_ns, value; 17822 17823 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 17824 device_xname(sc->sc_dev), __func__)); 17825 17826 if (link) { 17827 uint16_t max_snoop, max_nosnoop, max_ltr_enc; 17828 uint32_t status; 17829 uint16_t speed; 17830 pcireg_t preg; 17831 17832 status = CSR_READ(sc, WMREG_STATUS); 17833 switch (__SHIFTOUT(status, STATUS_SPEED)) { 17834 case STATUS_SPEED_10: 17835 speed = 10; 17836 break; 17837 case STATUS_SPEED_100: 17838 speed = 100; 17839 break; 17840 case STATUS_SPEED_1000: 17841 speed = 1000; 17842 break; 17843 default: 17844 device_printf(sc->sc_dev, "Unknown speed " 17845 "(status = %08x)\n", status); 17846 return -1; 17847 } 17848 17849 /* Rx Packet Buffer Allocation size (KB) */ 17850 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK; 17851 17852 /* 17853 * Determine the maximum latency tolerated by the device. 17854 * 17855 * Per the PCIe spec, the tolerated latencies are encoded as 17856 * a 3-bit encoded scale (only 0-5 are valid) multiplied by 17857 * a 10-bit value (0-1023) to provide a range from 1 ns to 17858 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns, 17859 * 1=2^5ns, 2=2^10ns,...5=2^25ns. 17860 */ 17861 lat_ns = ((int64_t)rxa * 1024 - 17862 (2 * ((int64_t)sc->sc_ethercom.ec_if.if_mtu 17863 + ETHER_HDR_LEN))) * 8 * 1000; 17864 if (lat_ns < 0) 17865 lat_ns = 0; 17866 else 17867 lat_ns /= speed; 17868 value = lat_ns; 17869 17870 while (value > LTRV_VALUE) { 17871 scale ++; 17872 value = howmany(value, __BIT(5)); 17873 } 17874 if (scale > LTRV_SCALE_MAX) { 17875 device_printf(sc->sc_dev, 17876 "Invalid LTR latency scale %d\n", scale); 17877 return -1; 17878 } 17879 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value); 17880 17881 /* Determine the maximum latency tolerated by the platform */ 17882 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 17883 WM_PCI_LTR_CAP_LPT); 17884 max_snoop = preg & 0xffff; 17885 max_nosnoop = preg >> 16; 17886 17887 max_ltr_enc = MAX(max_snoop, max_nosnoop); 17888 17889 if (lat_enc > max_ltr_enc) { 17890 lat_enc = max_ltr_enc; 17891 lat_ns = __SHIFTOUT(lat_enc, PCI_LTR_MAXSNOOPLAT_VAL) 17892 * PCI_LTR_SCALETONS( 17893 __SHIFTOUT(lat_enc, 17894 PCI_LTR_MAXSNOOPLAT_SCALE)); 17895 } 17896 17897 if (lat_ns) { 17898 lat_ns *= speed * 1000; 17899 lat_ns /= 8; 17900 lat_ns /= 1000000000; 17901 obff_hwm = (int32_t)(rxa - lat_ns); 17902 } 17903 if ((obff_hwm < 0) || (obff_hwm > SVT_OFF_HWM)) { 17904 device_printf(sc->sc_dev, "Invalid high water mark %d" 17905 "(rxa = %d, lat_ns = %d)\n", 17906 obff_hwm, (int32_t)rxa, (int32_t)lat_ns); 17907 return -1; 17908 } 17909 } 17910 /* Snoop and No-Snoop latencies the same */ 17911 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP); 17912 CSR_WRITE(sc, WMREG_LTRV, reg); 17913 17914 /* Set OBFF high water mark */ 17915 reg = CSR_READ(sc, WMREG_SVT) & ~SVT_OFF_HWM; 17916 reg |= obff_hwm; 17917 CSR_WRITE(sc, WMREG_SVT, reg); 17918 17919 /* Enable OBFF */ 17920 reg = CSR_READ(sc, WMREG_SVCR); 17921 reg |= SVCR_OFF_EN | SVCR_OFF_MASKINT; 17922 CSR_WRITE(sc, WMREG_SVCR, reg); 17923 17924 return 0; 17925 } 17926 17927 /* 17928 * I210 Errata 25 and I211 Errata 10 17929 * Slow System Clock. 17930 * 17931 * Note that this function is called on both FLASH and iNVM case on NetBSD. 17932 */ 17933 static int 17934 wm_pll_workaround_i210(struct wm_softc *sc) 17935 { 17936 uint32_t mdicnfg, wuc; 17937 uint32_t reg; 17938 pcireg_t pcireg; 17939 uint32_t pmreg; 17940 uint16_t nvmword, tmp_nvmword; 17941 uint16_t phyval; 17942 bool wa_done = false; 17943 int i, rv = 0; 17944 17945 /* Get Power Management cap offset */ 17946 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT, 17947 &pmreg, NULL) == 0) 17948 return -1; 17949 17950 /* Save WUC and MDICNFG registers */ 17951 wuc = CSR_READ(sc, WMREG_WUC); 17952 mdicnfg = CSR_READ(sc, WMREG_MDICNFG); 17953 17954 reg = mdicnfg & ~MDICNFG_DEST; 17955 CSR_WRITE(sc, WMREG_MDICNFG, reg); 17956 17957 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0) { 17958 /* 17959 * The default value of the Initialization Control Word 1 17960 * is the same on both I210's FLASH_HW and I21[01]'s iNVM. 17961 */ 17962 nvmword = INVM_DEFAULT_AL; 17963 } 17964 tmp_nvmword = nvmword | INVM_PLL_WO_VAL; 17965 17966 for (i = 0; i < WM_MAX_PLL_TRIES; i++) { 17967 wm_gmii_gs40g_readreg(sc->sc_dev, 1, 17968 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG, &phyval); 17969 17970 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) { 17971 rv = 0; 17972 break; /* OK */ 17973 } else 17974 rv = -1; 17975 17976 wa_done = true; 17977 /* Directly reset the internal PHY */ 17978 reg = CSR_READ(sc, WMREG_CTRL); 17979 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET); 17980 17981 reg = CSR_READ(sc, WMREG_CTRL_EXT); 17982 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE; 17983 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 17984 17985 CSR_WRITE(sc, WMREG_WUC, 0); 17986 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16); 17987 CSR_WRITE(sc, WMREG_EEARBC_I210, reg); 17988 17989 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 17990 pmreg + PCI_PMCSR); 17991 pcireg |= PCI_PMCSR_STATE_D3; 17992 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 17993 pmreg + PCI_PMCSR, pcireg); 17994 delay(1000); 17995 pcireg &= ~PCI_PMCSR_STATE_D3; 17996 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 17997 pmreg + PCI_PMCSR, pcireg); 17998 17999 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16); 18000 CSR_WRITE(sc, WMREG_EEARBC_I210, reg); 18001 18002 /* Restore WUC register */ 18003 CSR_WRITE(sc, WMREG_WUC, wuc); 18004 } 18005 18006 /* Restore MDICNFG setting */ 18007 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg); 18008 if (wa_done) 18009 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n"); 18010 return rv; 18011 } 18012 18013 static void 18014 wm_legacy_irq_quirk_spt(struct wm_softc *sc) 18015 { 18016 uint32_t reg; 18017 18018 DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s called\n", 18019 device_xname(sc->sc_dev), __func__)); 18020 KASSERT((sc->sc_type == WM_T_PCH_SPT) 18021 || (sc->sc_type == WM_T_PCH_CNP)); 18022 18023 reg = CSR_READ(sc, WMREG_FEXTNVM7); 18024 reg |= FEXTNVM7_SIDE_CLK_UNGATE; 18025 CSR_WRITE(sc, WMREG_FEXTNVM7, reg); 18026 18027 reg = CSR_READ(sc, WMREG_FEXTNVM9); 18028 reg |= FEXTNVM9_IOSFSB_CLKGATE_DIS | FEXTNVM9_IOSFSB_CLKREQ_DIS; 18029 CSR_WRITE(sc, WMREG_FEXTNVM9, reg); 18030 } 18031 18032 /* Sysctl functions */ 18033 static int 18034 wm_sysctl_tdh_handler(SYSCTLFN_ARGS) 18035 { 18036 struct sysctlnode node = *rnode; 18037 struct wm_txqueue *txq = (struct wm_txqueue *)node.sysctl_data; 18038 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq); 18039 struct wm_softc *sc = txq->txq_sc; 18040 uint32_t reg; 18041 18042 reg = CSR_READ(sc, WMREG_TDH(wmq->wmq_id)); 18043 node.sysctl_data = ® 18044 return sysctl_lookup(SYSCTLFN_CALL(&node)); 18045 } 18046 18047 static int 18048 wm_sysctl_tdt_handler(SYSCTLFN_ARGS) 18049 { 18050 struct sysctlnode node = *rnode; 18051 struct wm_txqueue *txq = (struct wm_txqueue *)node.sysctl_data; 18052 struct wm_queue *wmq = container_of(txq, struct wm_queue, wmq_txq); 18053 struct wm_softc *sc = txq->txq_sc; 18054 uint32_t reg; 18055 18056 reg = CSR_READ(sc, WMREG_TDT(wmq->wmq_id)); 18057 node.sysctl_data = ® 18058 return sysctl_lookup(SYSCTLFN_CALL(&node)); 18059 } 18060 18061 #ifdef WM_DEBUG 18062 static int 18063 wm_sysctl_debug(SYSCTLFN_ARGS) 18064 { 18065 struct sysctlnode node = *rnode; 18066 struct wm_softc *sc = (struct wm_softc *)node.sysctl_data; 18067 uint32_t dflags; 18068 int error; 18069 18070 dflags = sc->sc_debug; 18071 node.sysctl_data = &dflags; 18072 error = sysctl_lookup(SYSCTLFN_CALL(&node)); 18073 18074 if (error || newp == NULL) 18075 return error; 18076 18077 sc->sc_debug = dflags; 18078 device_printf(sc->sc_dev, "TARC0: %08x\n", CSR_READ(sc, WMREG_TARC0)); 18079 device_printf(sc->sc_dev, "TDT0: %08x\n", CSR_READ(sc, WMREG_TDT(0))); 18080 18081 return 0; 18082 } 18083 #endif 18084