1 /* $NetBSD: if_wm.c,v 1.383 2015/12/18 09:57:57 knakahara 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 * - Disable D0 LPLU on 8257[12356], 82580 and I350. 77 * - TX Multi queue 78 * - EEE (Energy Efficiency Ethernet) 79 * - Virtual Function 80 * - Set LED correctly (based on contents in EEPROM) 81 * - Rework how parameters are loaded from the EEPROM. 82 * - Image Unique ID 83 */ 84 85 #include <sys/cdefs.h> 86 __KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.383 2015/12/18 09:57:57 knakahara Exp $"); 87 88 #ifdef _KERNEL_OPT 89 #include "opt_net_mpsafe.h" 90 #endif 91 92 #include <sys/param.h> 93 #include <sys/systm.h> 94 #include <sys/callout.h> 95 #include <sys/mbuf.h> 96 #include <sys/malloc.h> 97 #include <sys/kmem.h> 98 #include <sys/kernel.h> 99 #include <sys/socket.h> 100 #include <sys/ioctl.h> 101 #include <sys/errno.h> 102 #include <sys/device.h> 103 #include <sys/queue.h> 104 #include <sys/syslog.h> 105 #include <sys/interrupt.h> 106 107 #include <sys/rndsource.h> 108 109 #include <net/if.h> 110 #include <net/if_dl.h> 111 #include <net/if_media.h> 112 #include <net/if_ether.h> 113 114 #include <net/bpf.h> 115 116 #include <netinet/in.h> /* XXX for struct ip */ 117 #include <netinet/in_systm.h> /* XXX for struct ip */ 118 #include <netinet/ip.h> /* XXX for struct ip */ 119 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */ 120 #include <netinet/tcp.h> /* XXX for struct tcphdr */ 121 122 #include <sys/bus.h> 123 #include <sys/intr.h> 124 #include <machine/endian.h> 125 126 #include <dev/mii/mii.h> 127 #include <dev/mii/miivar.h> 128 #include <dev/mii/miidevs.h> 129 #include <dev/mii/mii_bitbang.h> 130 #include <dev/mii/ikphyreg.h> 131 #include <dev/mii/igphyreg.h> 132 #include <dev/mii/igphyvar.h> 133 #include <dev/mii/inbmphyreg.h> 134 135 #include <dev/pci/pcireg.h> 136 #include <dev/pci/pcivar.h> 137 #include <dev/pci/pcidevs.h> 138 139 #include <dev/pci/if_wmreg.h> 140 #include <dev/pci/if_wmvar.h> 141 142 #ifdef WM_DEBUG 143 #define WM_DEBUG_LINK 0x01 144 #define WM_DEBUG_TX 0x02 145 #define WM_DEBUG_RX 0x04 146 #define WM_DEBUG_GMII 0x08 147 #define WM_DEBUG_MANAGE 0x10 148 #define WM_DEBUG_NVM 0x20 149 int wm_debug = WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | WM_DEBUG_GMII 150 | WM_DEBUG_MANAGE | WM_DEBUG_NVM; 151 152 #define DPRINTF(x, y) if (wm_debug & (x)) printf y 153 #else 154 #define DPRINTF(x, y) /* nothing */ 155 #endif /* WM_DEBUG */ 156 157 #ifdef NET_MPSAFE 158 #define WM_MPSAFE 1 159 #endif 160 161 /* 162 * This device driver's max interrupt numbers. 163 */ 164 #define WM_MAX_NTXINTR 16 165 #define WM_MAX_NRXINTR 16 166 #define WM_MAX_NINTR (WM_MAX_NTXINTR + WM_MAX_NRXINTR + 1) 167 168 /* 169 * Transmit descriptor list size. Due to errata, we can only have 170 * 256 hardware descriptors in the ring on < 82544, but we use 4096 171 * on >= 82544. We tell the upper layers that they can queue a lot 172 * of packets, and we go ahead and manage up to 64 (16 for the i82547) 173 * of them at a time. 174 * 175 * We allow up to 256 (!) DMA segments per packet. Pathological packet 176 * chains containing many small mbufs have been observed in zero-copy 177 * situations with jumbo frames. 178 */ 179 #define WM_NTXSEGS 256 180 #define WM_IFQUEUELEN 256 181 #define WM_TXQUEUELEN_MAX 64 182 #define WM_TXQUEUELEN_MAX_82547 16 183 #define WM_TXQUEUELEN(txq) ((txq)->txq_num) 184 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1) 185 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8) 186 #define WM_NTXDESC_82542 256 187 #define WM_NTXDESC_82544 4096 188 #define WM_NTXDESC(txq) ((txq)->txq_ndesc) 189 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1) 190 #define WM_TXDESCSIZE(txq) (WM_NTXDESC(txq) * sizeof(wiseman_txdesc_t)) 191 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq)) 192 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq)) 193 194 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */ 195 196 /* 197 * Receive descriptor list size. We have one Rx buffer for normal 198 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized 199 * packet. We allocate 256 receive descriptors, each with a 2k 200 * buffer (MCLBYTES), which gives us room for 50 jumbo packets. 201 */ 202 #define WM_NRXDESC 256 203 #define WM_NRXDESC_MASK (WM_NRXDESC - 1) 204 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK) 205 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK) 206 207 typedef union txdescs { 208 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544]; 209 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544]; 210 } txdescs_t; 211 212 #define WM_CDTXOFF(x) (sizeof(wiseman_txdesc_t) * x) 213 #define WM_CDRXOFF(x) (sizeof(wiseman_rxdesc_t) * x) 214 215 /* 216 * Software state for transmit jobs. 217 */ 218 struct wm_txsoft { 219 struct mbuf *txs_mbuf; /* head of our mbuf chain */ 220 bus_dmamap_t txs_dmamap; /* our DMA map */ 221 int txs_firstdesc; /* first descriptor in packet */ 222 int txs_lastdesc; /* last descriptor in packet */ 223 int txs_ndesc; /* # of descriptors used */ 224 }; 225 226 /* 227 * Software state for receive buffers. Each descriptor gets a 228 * 2k (MCLBYTES) buffer and a DMA map. For packets which fill 229 * more than one buffer, we chain them together. 230 */ 231 struct wm_rxsoft { 232 struct mbuf *rxs_mbuf; /* head of our mbuf chain */ 233 bus_dmamap_t rxs_dmamap; /* our DMA map */ 234 }; 235 236 #define WM_LINKUP_TIMEOUT 50 237 238 static uint16_t swfwphysem[] = { 239 SWFW_PHY0_SM, 240 SWFW_PHY1_SM, 241 SWFW_PHY2_SM, 242 SWFW_PHY3_SM 243 }; 244 245 static const uint32_t wm_82580_rxpbs_table[] = { 246 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140 247 }; 248 249 struct wm_softc; 250 251 struct wm_txqueue { 252 kmutex_t *txq_lock; /* lock for tx operations */ 253 254 struct wm_softc *txq_sc; 255 256 int txq_id; /* index of transmit queues */ 257 int txq_intr_idx; /* index of MSI-X tables */ 258 259 /* Software state for the transmit descriptors. */ 260 int txq_num; /* must be a power of two */ 261 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX]; 262 263 /* TX control data structures. */ 264 int txq_ndesc; /* must be a power of two */ 265 txdescs_t *txq_descs_u; 266 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */ 267 bus_dma_segment_t txq_desc_seg; /* control data segment */ 268 int txq_desc_rseg; /* real number of control segment */ 269 size_t txq_desc_size; /* control data size */ 270 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr 271 #define txq_descs txq_descs_u->sctxu_txdescs 272 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs 273 274 bus_addr_t txq_tdt_reg; /* offset of TDT register */ 275 276 int txq_free; /* number of free Tx descriptors */ 277 int txq_next; /* next ready Tx descriptor */ 278 279 int txq_sfree; /* number of free Tx jobs */ 280 int txq_snext; /* next free Tx job */ 281 int txq_sdirty; /* dirty Tx jobs */ 282 283 /* These 4 variables are used only on the 82547. */ 284 int txq_fifo_size; /* Tx FIFO size */ 285 int txq_fifo_head; /* current head of FIFO */ 286 uint32_t txq_fifo_addr; /* internal address of start of FIFO */ 287 int txq_fifo_stall; /* Tx FIFO is stalled */ 288 289 /* XXX which event counter is required? */ 290 }; 291 292 struct wm_rxqueue { 293 kmutex_t *rxq_lock; /* lock for rx operations */ 294 295 struct wm_softc *rxq_sc; 296 297 int rxq_id; /* index of receive queues */ 298 int rxq_intr_idx; /* index of MSI-X tables */ 299 300 /* Software state for the receive descriptors. */ 301 wiseman_rxdesc_t *rxq_descs; 302 303 /* RX control data structures. */ 304 struct wm_rxsoft rxq_soft[WM_NRXDESC]; 305 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */ 306 bus_dma_segment_t rxq_desc_seg; /* control data segment */ 307 int rxq_desc_rseg; /* real number of control segment */ 308 size_t rxq_desc_size; /* control data size */ 309 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr 310 311 bus_addr_t rxq_rdt_reg; /* offset of RDT register */ 312 313 int rxq_ptr; /* next ready Rx descriptor/queue ent */ 314 int rxq_discard; 315 int rxq_len; 316 struct mbuf *rxq_head; 317 struct mbuf *rxq_tail; 318 struct mbuf **rxq_tailp; 319 320 /* XXX which event counter is required? */ 321 }; 322 323 /* 324 * Software state per device. 325 */ 326 struct wm_softc { 327 device_t sc_dev; /* generic device information */ 328 bus_space_tag_t sc_st; /* bus space tag */ 329 bus_space_handle_t sc_sh; /* bus space handle */ 330 bus_size_t sc_ss; /* bus space size */ 331 bus_space_tag_t sc_iot; /* I/O space tag */ 332 bus_space_handle_t sc_ioh; /* I/O space handle */ 333 bus_size_t sc_ios; /* I/O space size */ 334 bus_space_tag_t sc_flasht; /* flash registers space tag */ 335 bus_space_handle_t sc_flashh; /* flash registers space handle */ 336 bus_size_t sc_flashs; /* flash registers space size */ 337 bus_dma_tag_t sc_dmat; /* bus DMA tag */ 338 339 struct ethercom sc_ethercom; /* ethernet common data */ 340 struct mii_data sc_mii; /* MII/media information */ 341 342 pci_chipset_tag_t sc_pc; 343 pcitag_t sc_pcitag; 344 int sc_bus_speed; /* PCI/PCIX bus speed */ 345 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */ 346 347 uint16_t sc_pcidevid; /* PCI device ID */ 348 wm_chip_type sc_type; /* MAC type */ 349 int sc_rev; /* MAC revision */ 350 wm_phy_type sc_phytype; /* PHY type */ 351 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/ 352 #define WM_MEDIATYPE_UNKNOWN 0x00 353 #define WM_MEDIATYPE_FIBER 0x01 354 #define WM_MEDIATYPE_COPPER 0x02 355 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */ 356 int sc_funcid; /* unit number of the chip (0 to 3) */ 357 int sc_flags; /* flags; see below */ 358 int sc_if_flags; /* last if_flags */ 359 int sc_flowflags; /* 802.3x flow control flags */ 360 int sc_align_tweak; 361 362 void *sc_ihs[WM_MAX_NINTR]; /* 363 * interrupt cookie. 364 * legacy and msi use sc_ihs[0]. 365 */ 366 pci_intr_handle_t *sc_intrs; /* legacy and msi use sc_intrs[0] */ 367 int sc_nintrs; /* number of interrupts */ 368 369 int sc_link_intr_idx; /* index of MSI-X tables */ 370 371 callout_t sc_tick_ch; /* tick callout */ 372 bool sc_stopping; 373 374 int sc_nvm_ver_major; 375 int sc_nvm_ver_minor; 376 int sc_nvm_ver_build; 377 int sc_nvm_addrbits; /* NVM address bits */ 378 unsigned int sc_nvm_wordsize; /* NVM word size */ 379 int sc_ich8_flash_base; 380 int sc_ich8_flash_bank_size; 381 int sc_nvm_k1_enabled; 382 383 int sc_ntxqueues; 384 struct wm_txqueue *sc_txq; 385 386 int sc_nrxqueues; 387 struct wm_rxqueue *sc_rxq; 388 389 #ifdef WM_EVENT_COUNTERS 390 /* Event counters. */ 391 struct evcnt sc_ev_txsstall; /* Tx stalled due to no txs */ 392 struct evcnt sc_ev_txdstall; /* Tx stalled due to no txd */ 393 struct evcnt sc_ev_txfifo_stall;/* Tx FIFO stalls (82547) */ 394 struct evcnt sc_ev_txdw; /* Tx descriptor interrupts */ 395 struct evcnt sc_ev_txqe; /* Tx queue empty interrupts */ 396 struct evcnt sc_ev_rxintr; /* Rx interrupts */ 397 struct evcnt sc_ev_linkintr; /* Link interrupts */ 398 399 struct evcnt sc_ev_rxipsum; /* IP checksums checked in-bound */ 400 struct evcnt sc_ev_rxtusum; /* TCP/UDP cksums checked in-bound */ 401 struct evcnt sc_ev_txipsum; /* IP checksums comp. out-bound */ 402 struct evcnt sc_ev_txtusum; /* TCP/UDP cksums comp. out-bound */ 403 struct evcnt sc_ev_txtusum6; /* TCP/UDP v6 cksums comp. out-bound */ 404 struct evcnt sc_ev_txtso; /* TCP seg offload out-bound (IPv4) */ 405 struct evcnt sc_ev_txtso6; /* TCP seg offload out-bound (IPv6) */ 406 struct evcnt sc_ev_txtsopain; /* painful header manip. for TSO */ 407 408 struct evcnt sc_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */ 409 struct evcnt sc_ev_txdrop; /* Tx packets dropped (too many segs) */ 410 411 struct evcnt sc_ev_tu; /* Tx underrun */ 412 413 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */ 414 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */ 415 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */ 416 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */ 417 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */ 418 #endif /* WM_EVENT_COUNTERS */ 419 420 /* This variable are used only on the 82547. */ 421 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */ 422 423 uint32_t sc_ctrl; /* prototype CTRL register */ 424 #if 0 425 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */ 426 #endif 427 uint32_t sc_icr; /* prototype interrupt bits */ 428 uint32_t sc_itr; /* prototype intr throttling reg */ 429 uint32_t sc_tctl; /* prototype TCTL register */ 430 uint32_t sc_rctl; /* prototype RCTL register */ 431 uint32_t sc_txcw; /* prototype TXCW register */ 432 uint32_t sc_tipg; /* prototype TIPG register */ 433 uint32_t sc_fcrtl; /* prototype FCRTL register */ 434 uint32_t sc_pba; /* prototype PBA register */ 435 436 int sc_tbi_linkup; /* TBI link status */ 437 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */ 438 int sc_tbi_serdes_ticks; /* tbi ticks */ 439 440 int sc_mchash_type; /* multicast filter offset */ 441 442 krndsource_t rnd_source; /* random source */ 443 444 kmutex_t *sc_core_lock; /* lock for softc operations */ 445 }; 446 447 #define WM_TX_LOCK(_txq) if ((_txq)->txq_lock) mutex_enter((_txq)->txq_lock) 448 #define WM_TX_UNLOCK(_txq) if ((_txq)->txq_lock) mutex_exit((_txq)->txq_lock) 449 #define WM_TX_LOCKED(_txq) (!(_txq)->txq_lock || mutex_owned((_txq)->txq_lock)) 450 #define WM_RX_LOCK(_rxq) if ((_rxq)->rxq_lock) mutex_enter((_rxq)->rxq_lock) 451 #define WM_RX_UNLOCK(_rxq) if ((_rxq)->rxq_lock) mutex_exit((_rxq)->rxq_lock) 452 #define WM_RX_LOCKED(_rxq) (!(_rxq)->rxq_lock || mutex_owned((_rxq)->rxq_lock)) 453 #define WM_CORE_LOCK(_sc) if ((_sc)->sc_core_lock) mutex_enter((_sc)->sc_core_lock) 454 #define WM_CORE_UNLOCK(_sc) if ((_sc)->sc_core_lock) mutex_exit((_sc)->sc_core_lock) 455 #define WM_CORE_LOCKED(_sc) (!(_sc)->sc_core_lock || mutex_owned((_sc)->sc_core_lock)) 456 457 #ifdef WM_MPSAFE 458 #define CALLOUT_FLAGS CALLOUT_MPSAFE 459 #else 460 #define CALLOUT_FLAGS 0 461 #endif 462 463 #define WM_RXCHAIN_RESET(rxq) \ 464 do { \ 465 (rxq)->rxq_tailp = &(rxq)->rxq_head; \ 466 *(rxq)->rxq_tailp = NULL; \ 467 (rxq)->rxq_len = 0; \ 468 } while (/*CONSTCOND*/0) 469 470 #define WM_RXCHAIN_LINK(rxq, m) \ 471 do { \ 472 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \ 473 (rxq)->rxq_tailp = &(m)->m_next; \ 474 } while (/*CONSTCOND*/0) 475 476 #ifdef WM_EVENT_COUNTERS 477 #define WM_EVCNT_INCR(ev) (ev)->ev_count++ 478 #define WM_EVCNT_ADD(ev, val) (ev)->ev_count += (val) 479 #else 480 #define WM_EVCNT_INCR(ev) /* nothing */ 481 #define WM_EVCNT_ADD(ev, val) /* nothing */ 482 #endif 483 484 #define CSR_READ(sc, reg) \ 485 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 486 #define CSR_WRITE(sc, reg, val) \ 487 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 488 #define CSR_WRITE_FLUSH(sc) \ 489 (void) CSR_READ((sc), WMREG_STATUS) 490 491 #define ICH8_FLASH_READ32(sc, reg) \ 492 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, (reg)) 493 #define ICH8_FLASH_WRITE32(sc, reg, data) \ 494 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, (reg), (data)) 495 496 #define ICH8_FLASH_READ16(sc, reg) \ 497 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, (reg)) 498 #define ICH8_FLASH_WRITE16(sc, reg, data) \ 499 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, (reg), (data)) 500 501 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((x))) 502 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((x))) 503 504 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU) 505 #define WM_CDTXADDR_HI(txq, x) \ 506 (sizeof(bus_addr_t) == 8 ? \ 507 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0) 508 509 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU) 510 #define WM_CDRXADDR_HI(rxq, x) \ 511 (sizeof(bus_addr_t) == 8 ? \ 512 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0) 513 514 /* 515 * Register read/write functions. 516 * Other than CSR_{READ|WRITE}(). 517 */ 518 #if 0 519 static inline uint32_t wm_io_read(struct wm_softc *, int); 520 #endif 521 static inline void wm_io_write(struct wm_softc *, int, uint32_t); 522 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t, 523 uint32_t, uint32_t); 524 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t); 525 526 /* 527 * Descriptor sync/init functions. 528 */ 529 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int); 530 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int); 531 static inline void wm_init_rxdesc(struct wm_rxqueue *, int); 532 533 /* 534 * Device driver interface functions and commonly used functions. 535 * match, attach, detach, init, start, stop, ioctl, watchdog and so on. 536 */ 537 static const struct wm_product *wm_lookup(const struct pci_attach_args *); 538 static int wm_match(device_t, cfdata_t, void *); 539 static void wm_attach(device_t, device_t, void *); 540 static int wm_detach(device_t, int); 541 static bool wm_suspend(device_t, const pmf_qual_t *); 542 static bool wm_resume(device_t, const pmf_qual_t *); 543 static void wm_watchdog(struct ifnet *); 544 static void wm_tick(void *); 545 static int wm_ifflags_cb(struct ethercom *); 546 static int wm_ioctl(struct ifnet *, u_long, void *); 547 /* MAC address related */ 548 static uint16_t wm_check_alt_mac_addr(struct wm_softc *); 549 static int wm_read_mac_addr(struct wm_softc *, uint8_t *); 550 static void wm_set_ral(struct wm_softc *, const uint8_t *, int); 551 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *); 552 static void wm_set_filter(struct wm_softc *); 553 /* Reset and init related */ 554 static void wm_set_vlan(struct wm_softc *); 555 static void wm_set_pcie_completion_timeout(struct wm_softc *); 556 static void wm_get_auto_rd_done(struct wm_softc *); 557 static void wm_lan_init_done(struct wm_softc *); 558 static void wm_get_cfg_done(struct wm_softc *); 559 static void wm_initialize_hardware_bits(struct wm_softc *); 560 static uint32_t wm_rxpbs_adjust_82580(uint32_t); 561 static void wm_reset(struct wm_softc *); 562 static int wm_add_rxbuf(struct wm_rxqueue *, int); 563 static void wm_rxdrain(struct wm_rxqueue *); 564 static void wm_rss_getkey(uint8_t *); 565 static void wm_init_rss(struct wm_softc *); 566 static void wm_adjust_qnum(struct wm_softc *, int); 567 static int wm_setup_legacy(struct wm_softc *); 568 static int wm_setup_msix(struct wm_softc *); 569 static int wm_init(struct ifnet *); 570 static int wm_init_locked(struct ifnet *); 571 static void wm_stop(struct ifnet *, int); 572 static void wm_stop_locked(struct ifnet *, int); 573 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *); 574 static void wm_82547_txfifo_stall(void *); 575 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *); 576 /* DMA related */ 577 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *); 578 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *); 579 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *); 580 static void wm_init_tx_regs(struct wm_softc *, struct wm_txqueue *); 581 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *); 582 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *); 583 static void wm_init_rx_regs(struct wm_softc *, struct wm_rxqueue *); 584 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *); 585 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *); 586 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *); 587 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 588 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 589 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *); 590 static void wm_init_tx_queue(struct wm_softc *, struct wm_txqueue *); 591 static int wm_init_rx_queue(struct wm_softc *, struct wm_rxqueue *); 592 static int wm_alloc_txrx_queues(struct wm_softc *); 593 static void wm_free_txrx_queues(struct wm_softc *); 594 static int wm_init_txrx_queues(struct wm_softc *); 595 /* Start */ 596 static int wm_tx_offload(struct wm_softc *, struct wm_txsoft *, 597 uint32_t *, uint8_t *); 598 static void wm_start(struct ifnet *); 599 static void wm_start_locked(struct ifnet *); 600 static int wm_nq_tx_offload(struct wm_softc *, struct wm_txsoft *, 601 uint32_t *, uint32_t *, bool *); 602 static void wm_nq_start(struct ifnet *); 603 static void wm_nq_start_locked(struct ifnet *); 604 /* Interrupt */ 605 static int wm_txeof(struct wm_softc *); 606 static void wm_rxeof(struct wm_rxqueue *); 607 static void wm_linkintr_gmii(struct wm_softc *, uint32_t); 608 static void wm_linkintr_tbi(struct wm_softc *, uint32_t); 609 static void wm_linkintr_serdes(struct wm_softc *, uint32_t); 610 static void wm_linkintr(struct wm_softc *, uint32_t); 611 static int wm_intr_legacy(void *); 612 static int wm_txintr_msix(void *); 613 static int wm_rxintr_msix(void *); 614 static int wm_linkintr_msix(void *); 615 616 /* 617 * Media related. 618 * GMII, SGMII, TBI, SERDES and SFP. 619 */ 620 /* Common */ 621 static void wm_tbi_serdes_set_linkled(struct wm_softc *); 622 /* GMII related */ 623 static void wm_gmii_reset(struct wm_softc *); 624 static int wm_get_phy_id_82575(struct wm_softc *); 625 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t); 626 static int wm_gmii_mediachange(struct ifnet *); 627 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *); 628 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int); 629 static uint32_t wm_i82543_mii_recvbits(struct wm_softc *); 630 static int wm_gmii_i82543_readreg(device_t, int, int); 631 static void wm_gmii_i82543_writereg(device_t, int, int, int); 632 static int wm_gmii_i82544_readreg(device_t, int, int); 633 static void wm_gmii_i82544_writereg(device_t, int, int, int); 634 static int wm_gmii_i80003_readreg(device_t, int, int); 635 static void wm_gmii_i80003_writereg(device_t, int, int, int); 636 static int wm_gmii_bm_readreg(device_t, int, int); 637 static void wm_gmii_bm_writereg(device_t, int, int, int); 638 static void wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int); 639 static int wm_gmii_hv_readreg(device_t, int, int); 640 static void wm_gmii_hv_writereg(device_t, int, int, int); 641 static int wm_gmii_82580_readreg(device_t, int, int); 642 static void wm_gmii_82580_writereg(device_t, int, int, int); 643 static int wm_gmii_gs40g_readreg(device_t, int, int); 644 static void wm_gmii_gs40g_writereg(device_t, int, int, int); 645 static void wm_gmii_statchg(struct ifnet *); 646 static int wm_kmrn_readreg(struct wm_softc *, int); 647 static void wm_kmrn_writereg(struct wm_softc *, int, int); 648 /* SGMII */ 649 static bool wm_sgmii_uses_mdio(struct wm_softc *); 650 static int wm_sgmii_readreg(device_t, int, int); 651 static void wm_sgmii_writereg(device_t, int, int, int); 652 /* TBI related */ 653 static void wm_tbi_mediainit(struct wm_softc *); 654 static int wm_tbi_mediachange(struct ifnet *); 655 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *); 656 static int wm_check_for_link(struct wm_softc *); 657 static void wm_tbi_tick(struct wm_softc *); 658 /* SERDES related */ 659 static void wm_serdes_power_up_link_82575(struct wm_softc *); 660 static int wm_serdes_mediachange(struct ifnet *); 661 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *); 662 static void wm_serdes_tick(struct wm_softc *); 663 /* SFP related */ 664 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *); 665 static uint32_t wm_sfp_get_media_type(struct wm_softc *); 666 667 /* 668 * NVM related. 669 * Microwire, SPI (w/wo EERD) and Flash. 670 */ 671 /* Misc functions */ 672 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int); 673 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int); 674 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *); 675 /* Microwire */ 676 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *); 677 /* SPI */ 678 static int wm_nvm_ready_spi(struct wm_softc *); 679 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *); 680 /* Using with EERD */ 681 static int wm_poll_eerd_eewr_done(struct wm_softc *, int); 682 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *); 683 /* Flash */ 684 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *, 685 unsigned int *); 686 static int32_t wm_ich8_cycle_init(struct wm_softc *); 687 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t); 688 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t, 689 uint16_t *); 690 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *); 691 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *); 692 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *); 693 /* iNVM */ 694 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *); 695 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *); 696 /* Lock, detecting NVM type, validate checksum and read */ 697 static int wm_nvm_acquire(struct wm_softc *); 698 static void wm_nvm_release(struct wm_softc *); 699 static int wm_nvm_is_onboard_eeprom(struct wm_softc *); 700 static int wm_nvm_get_flash_presence_i210(struct wm_softc *); 701 static int wm_nvm_validate_checksum(struct wm_softc *); 702 static void wm_nvm_version_invm(struct wm_softc *); 703 static void wm_nvm_version(struct wm_softc *); 704 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *); 705 706 /* 707 * Hardware semaphores. 708 * Very complexed... 709 */ 710 static int wm_get_swsm_semaphore(struct wm_softc *); 711 static void wm_put_swsm_semaphore(struct wm_softc *); 712 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t); 713 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t); 714 static int wm_get_swfwhw_semaphore(struct wm_softc *); 715 static void wm_put_swfwhw_semaphore(struct wm_softc *); 716 static int wm_get_hw_semaphore_82573(struct wm_softc *); 717 static void wm_put_hw_semaphore_82573(struct wm_softc *); 718 719 /* 720 * Management mode and power management related subroutines. 721 * BMC, AMT, suspend/resume and EEE. 722 */ 723 #ifdef WM_WOL 724 static int wm_check_mng_mode(struct wm_softc *); 725 static int wm_check_mng_mode_ich8lan(struct wm_softc *); 726 static int wm_check_mng_mode_82574(struct wm_softc *); 727 static int wm_check_mng_mode_generic(struct wm_softc *); 728 #endif 729 static int wm_enable_mng_pass_thru(struct wm_softc *); 730 static int wm_check_reset_block(struct wm_softc *); 731 static void wm_get_hw_control(struct wm_softc *); 732 static void wm_release_hw_control(struct wm_softc *); 733 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, int); 734 static void wm_smbustopci(struct wm_softc *); 735 static void wm_init_manageability(struct wm_softc *); 736 static void wm_release_manageability(struct wm_softc *); 737 static void wm_get_wakeup(struct wm_softc *); 738 #ifdef WM_WOL 739 static void wm_enable_phy_wakeup(struct wm_softc *); 740 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *); 741 static void wm_enable_wakeup(struct wm_softc *); 742 #endif 743 /* LPLU (Low Power Link Up) */ 744 static void wm_lplu_d0_disable(struct wm_softc *); 745 static void wm_lplu_d0_disable_pch(struct wm_softc *); 746 /* EEE */ 747 static void wm_set_eee_i350(struct wm_softc *); 748 749 /* 750 * Workarounds (mainly PHY related). 751 * Basically, PHY's workarounds are in the PHY drivers. 752 */ 753 static void wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *); 754 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *); 755 static void wm_hv_phy_workaround_ich8lan(struct wm_softc *); 756 static void wm_lv_phy_workaround_ich8lan(struct wm_softc *); 757 static void wm_k1_gig_workaround_hv(struct wm_softc *, int); 758 static void wm_set_mdio_slow_mode_hv(struct wm_softc *); 759 static void wm_configure_k1_ich8lan(struct wm_softc *, int); 760 static void wm_reset_init_script_82575(struct wm_softc *); 761 static void wm_reset_mdicnfg_82580(struct wm_softc *); 762 static void wm_pll_workaround_i210(struct wm_softc *); 763 764 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc), 765 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); 766 767 /* 768 * Devices supported by this driver. 769 */ 770 static const struct wm_product { 771 pci_vendor_id_t wmp_vendor; 772 pci_product_id_t wmp_product; 773 const char *wmp_name; 774 wm_chip_type wmp_type; 775 uint32_t wmp_flags; 776 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN 777 #define WMP_F_FIBER WM_MEDIATYPE_FIBER 778 #define WMP_F_COPPER WM_MEDIATYPE_COPPER 779 #define WMP_F_SERDES WM_MEDIATYPE_SERDES 780 #define WMP_MEDIATYPE(x) ((x) & 0x03) 781 } wm_products[] = { 782 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542, 783 "Intel i82542 1000BASE-X Ethernet", 784 WM_T_82542_2_1, WMP_F_FIBER }, 785 786 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER, 787 "Intel i82543GC 1000BASE-X Ethernet", 788 WM_T_82543, WMP_F_FIBER }, 789 790 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER, 791 "Intel i82543GC 1000BASE-T Ethernet", 792 WM_T_82543, WMP_F_COPPER }, 793 794 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER, 795 "Intel i82544EI 1000BASE-T Ethernet", 796 WM_T_82544, WMP_F_COPPER }, 797 798 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER, 799 "Intel i82544EI 1000BASE-X Ethernet", 800 WM_T_82544, WMP_F_FIBER }, 801 802 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER, 803 "Intel i82544GC 1000BASE-T Ethernet", 804 WM_T_82544, WMP_F_COPPER }, 805 806 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM, 807 "Intel i82544GC (LOM) 1000BASE-T Ethernet", 808 WM_T_82544, WMP_F_COPPER }, 809 810 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM, 811 "Intel i82540EM 1000BASE-T Ethernet", 812 WM_T_82540, WMP_F_COPPER }, 813 814 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM, 815 "Intel i82540EM (LOM) 1000BASE-T Ethernet", 816 WM_T_82540, WMP_F_COPPER }, 817 818 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM, 819 "Intel i82540EP 1000BASE-T Ethernet", 820 WM_T_82540, WMP_F_COPPER }, 821 822 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP, 823 "Intel i82540EP 1000BASE-T Ethernet", 824 WM_T_82540, WMP_F_COPPER }, 825 826 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP, 827 "Intel i82540EP 1000BASE-T Ethernet", 828 WM_T_82540, WMP_F_COPPER }, 829 830 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER, 831 "Intel i82545EM 1000BASE-T Ethernet", 832 WM_T_82545, WMP_F_COPPER }, 833 834 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER, 835 "Intel i82545GM 1000BASE-T Ethernet", 836 WM_T_82545_3, WMP_F_COPPER }, 837 838 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER, 839 "Intel i82545GM 1000BASE-X Ethernet", 840 WM_T_82545_3, WMP_F_FIBER }, 841 842 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES, 843 "Intel i82545GM Gigabit Ethernet (SERDES)", 844 WM_T_82545_3, WMP_F_SERDES }, 845 846 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER, 847 "Intel i82546EB 1000BASE-T Ethernet", 848 WM_T_82546, WMP_F_COPPER }, 849 850 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD, 851 "Intel i82546EB 1000BASE-T Ethernet", 852 WM_T_82546, WMP_F_COPPER }, 853 854 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER, 855 "Intel i82545EM 1000BASE-X Ethernet", 856 WM_T_82545, WMP_F_FIBER }, 857 858 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER, 859 "Intel i82546EB 1000BASE-X Ethernet", 860 WM_T_82546, WMP_F_FIBER }, 861 862 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER, 863 "Intel i82546GB 1000BASE-T Ethernet", 864 WM_T_82546_3, WMP_F_COPPER }, 865 866 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER, 867 "Intel i82546GB 1000BASE-X Ethernet", 868 WM_T_82546_3, WMP_F_FIBER }, 869 870 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES, 871 "Intel i82546GB Gigabit Ethernet (SERDES)", 872 WM_T_82546_3, WMP_F_SERDES }, 873 874 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER, 875 "i82546GB quad-port Gigabit Ethernet", 876 WM_T_82546_3, WMP_F_COPPER }, 877 878 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3, 879 "i82546GB quad-port Gigabit Ethernet (KSP3)", 880 WM_T_82546_3, WMP_F_COPPER }, 881 882 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE, 883 "Intel PRO/1000MT (82546GB)", 884 WM_T_82546_3, WMP_F_COPPER }, 885 886 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI, 887 "Intel i82541EI 1000BASE-T Ethernet", 888 WM_T_82541, WMP_F_COPPER }, 889 890 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM, 891 "Intel i82541ER (LOM) 1000BASE-T Ethernet", 892 WM_T_82541, WMP_F_COPPER }, 893 894 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE, 895 "Intel i82541EI Mobile 1000BASE-T Ethernet", 896 WM_T_82541, WMP_F_COPPER }, 897 898 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER, 899 "Intel i82541ER 1000BASE-T Ethernet", 900 WM_T_82541_2, WMP_F_COPPER }, 901 902 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI, 903 "Intel i82541GI 1000BASE-T Ethernet", 904 WM_T_82541_2, WMP_F_COPPER }, 905 906 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE, 907 "Intel i82541GI Mobile 1000BASE-T Ethernet", 908 WM_T_82541_2, WMP_F_COPPER }, 909 910 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI, 911 "Intel i82541PI 1000BASE-T Ethernet", 912 WM_T_82541_2, WMP_F_COPPER }, 913 914 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI, 915 "Intel i82547EI 1000BASE-T Ethernet", 916 WM_T_82547, WMP_F_COPPER }, 917 918 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE, 919 "Intel i82547EI Mobile 1000BASE-T Ethernet", 920 WM_T_82547, WMP_F_COPPER }, 921 922 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI, 923 "Intel i82547GI 1000BASE-T Ethernet", 924 WM_T_82547_2, WMP_F_COPPER }, 925 926 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER, 927 "Intel PRO/1000 PT (82571EB)", 928 WM_T_82571, WMP_F_COPPER }, 929 930 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER, 931 "Intel PRO/1000 PF (82571EB)", 932 WM_T_82571, WMP_F_FIBER }, 933 934 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES, 935 "Intel PRO/1000 PB (82571EB)", 936 WM_T_82571, WMP_F_SERDES }, 937 938 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER, 939 "Intel PRO/1000 QT (82571EB)", 940 WM_T_82571, WMP_F_COPPER }, 941 942 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER, 943 "Intel PRO/1000 PT Quad Port Server Adapter", 944 WM_T_82571, WMP_F_COPPER, }, 945 946 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER, 947 "Intel Gigabit PT Quad Port Server ExpressModule", 948 WM_T_82571, WMP_F_COPPER, }, 949 950 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES, 951 "Intel 82571EB Dual Gigabit Ethernet (SERDES)", 952 WM_T_82571, WMP_F_SERDES, }, 953 954 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES, 955 "Intel 82571EB Quad Gigabit Ethernet (SERDES)", 956 WM_T_82571, WMP_F_SERDES, }, 957 958 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER, 959 "Intel 82571EB Quad 1000baseX Ethernet", 960 WM_T_82571, WMP_F_FIBER, }, 961 962 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER, 963 "Intel i82572EI 1000baseT Ethernet", 964 WM_T_82572, WMP_F_COPPER }, 965 966 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER, 967 "Intel i82572EI 1000baseX Ethernet", 968 WM_T_82572, WMP_F_FIBER }, 969 970 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES, 971 "Intel i82572EI Gigabit Ethernet (SERDES)", 972 WM_T_82572, WMP_F_SERDES }, 973 974 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI, 975 "Intel i82572EI 1000baseT Ethernet", 976 WM_T_82572, WMP_F_COPPER }, 977 978 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E, 979 "Intel i82573E", 980 WM_T_82573, WMP_F_COPPER }, 981 982 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT, 983 "Intel i82573E IAMT", 984 WM_T_82573, WMP_F_COPPER }, 985 986 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L, 987 "Intel i82573L Gigabit Ethernet", 988 WM_T_82573, WMP_F_COPPER }, 989 990 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L, 991 "Intel i82574L", 992 WM_T_82574, WMP_F_COPPER }, 993 994 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA, 995 "Intel i82574L", 996 WM_T_82574, WMP_F_COPPER }, 997 998 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V, 999 "Intel i82583V", 1000 WM_T_82583, WMP_F_COPPER }, 1001 1002 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT, 1003 "i80003 dual 1000baseT Ethernet", 1004 WM_T_80003, WMP_F_COPPER }, 1005 1006 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT, 1007 "i80003 dual 1000baseX Ethernet", 1008 WM_T_80003, WMP_F_COPPER }, 1009 1010 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT, 1011 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)", 1012 WM_T_80003, WMP_F_SERDES }, 1013 1014 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT, 1015 "Intel i80003 1000baseT Ethernet", 1016 WM_T_80003, WMP_F_COPPER }, 1017 1018 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT, 1019 "Intel i80003 Gigabit Ethernet (SERDES)", 1020 WM_T_80003, WMP_F_SERDES }, 1021 1022 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT, 1023 "Intel i82801H (M_AMT) LAN Controller", 1024 WM_T_ICH8, WMP_F_COPPER }, 1025 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT, 1026 "Intel i82801H (AMT) LAN Controller", 1027 WM_T_ICH8, WMP_F_COPPER }, 1028 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN, 1029 "Intel i82801H LAN Controller", 1030 WM_T_ICH8, WMP_F_COPPER }, 1031 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN, 1032 "Intel i82801H (IFE) LAN Controller", 1033 WM_T_ICH8, WMP_F_COPPER }, 1034 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN, 1035 "Intel i82801H (M) LAN Controller", 1036 WM_T_ICH8, WMP_F_COPPER }, 1037 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT, 1038 "Intel i82801H IFE (GT) LAN Controller", 1039 WM_T_ICH8, WMP_F_COPPER }, 1040 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G, 1041 "Intel i82801H IFE (G) LAN Controller", 1042 WM_T_ICH8, WMP_F_COPPER }, 1043 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT, 1044 "82801I (AMT) LAN Controller", 1045 WM_T_ICH9, WMP_F_COPPER }, 1046 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE, 1047 "82801I LAN Controller", 1048 WM_T_ICH9, WMP_F_COPPER }, 1049 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G, 1050 "82801I (G) LAN Controller", 1051 WM_T_ICH9, WMP_F_COPPER }, 1052 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT, 1053 "82801I (GT) LAN Controller", 1054 WM_T_ICH9, WMP_F_COPPER }, 1055 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C, 1056 "82801I (C) LAN Controller", 1057 WM_T_ICH9, WMP_F_COPPER }, 1058 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M, 1059 "82801I mobile LAN Controller", 1060 WM_T_ICH9, WMP_F_COPPER }, 1061 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IGP_M_V, 1062 "82801I mobile (V) LAN Controller", 1063 WM_T_ICH9, WMP_F_COPPER }, 1064 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT, 1065 "82801I mobile (AMT) LAN Controller", 1066 WM_T_ICH9, WMP_F_COPPER }, 1067 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM, 1068 "82567LM-4 LAN Controller", 1069 WM_T_ICH9, WMP_F_COPPER }, 1070 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_82567V_3, 1071 "82567V-3 LAN Controller", 1072 WM_T_ICH9, WMP_F_COPPER }, 1073 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM, 1074 "82567LM-2 LAN Controller", 1075 WM_T_ICH10, WMP_F_COPPER }, 1076 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF, 1077 "82567LF-2 LAN Controller", 1078 WM_T_ICH10, WMP_F_COPPER }, 1079 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM, 1080 "82567LM-3 LAN Controller", 1081 WM_T_ICH10, WMP_F_COPPER }, 1082 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF, 1083 "82567LF-3 LAN Controller", 1084 WM_T_ICH10, WMP_F_COPPER }, 1085 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V, 1086 "82567V-2 LAN Controller", 1087 WM_T_ICH10, WMP_F_COPPER }, 1088 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V, 1089 "82567V-3? LAN Controller", 1090 WM_T_ICH10, WMP_F_COPPER }, 1091 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE, 1092 "HANKSVILLE LAN Controller", 1093 WM_T_ICH10, WMP_F_COPPER }, 1094 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM, 1095 "PCH LAN (82577LM) Controller", 1096 WM_T_PCH, WMP_F_COPPER }, 1097 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC, 1098 "PCH LAN (82577LC) Controller", 1099 WM_T_PCH, WMP_F_COPPER }, 1100 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM, 1101 "PCH LAN (82578DM) Controller", 1102 WM_T_PCH, WMP_F_COPPER }, 1103 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC, 1104 "PCH LAN (82578DC) Controller", 1105 WM_T_PCH, WMP_F_COPPER }, 1106 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM, 1107 "PCH2 LAN (82579LM) Controller", 1108 WM_T_PCH2, WMP_F_COPPER }, 1109 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V, 1110 "PCH2 LAN (82579V) Controller", 1111 WM_T_PCH2, WMP_F_COPPER }, 1112 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER, 1113 "82575EB dual-1000baseT Ethernet", 1114 WM_T_82575, WMP_F_COPPER }, 1115 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES, 1116 "82575EB dual-1000baseX Ethernet (SERDES)", 1117 WM_T_82575, WMP_F_SERDES }, 1118 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER, 1119 "82575GB quad-1000baseT Ethernet", 1120 WM_T_82575, WMP_F_COPPER }, 1121 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM, 1122 "82575GB quad-1000baseT Ethernet (PM)", 1123 WM_T_82575, WMP_F_COPPER }, 1124 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER, 1125 "82576 1000BaseT Ethernet", 1126 WM_T_82576, WMP_F_COPPER }, 1127 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER, 1128 "82576 1000BaseX Ethernet", 1129 WM_T_82576, WMP_F_FIBER }, 1130 1131 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES, 1132 "82576 gigabit Ethernet (SERDES)", 1133 WM_T_82576, WMP_F_SERDES }, 1134 1135 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER, 1136 "82576 quad-1000BaseT Ethernet", 1137 WM_T_82576, WMP_F_COPPER }, 1138 1139 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2, 1140 "82576 Gigabit ET2 Quad Port Server Adapter", 1141 WM_T_82576, WMP_F_COPPER }, 1142 1143 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS, 1144 "82576 gigabit Ethernet", 1145 WM_T_82576, WMP_F_COPPER }, 1146 1147 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES, 1148 "82576 gigabit Ethernet (SERDES)", 1149 WM_T_82576, WMP_F_SERDES }, 1150 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD, 1151 "82576 quad-gigabit Ethernet (SERDES)", 1152 WM_T_82576, WMP_F_SERDES }, 1153 1154 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER, 1155 "82580 1000BaseT Ethernet", 1156 WM_T_82580, WMP_F_COPPER }, 1157 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER, 1158 "82580 1000BaseX Ethernet", 1159 WM_T_82580, WMP_F_FIBER }, 1160 1161 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES, 1162 "82580 1000BaseT Ethernet (SERDES)", 1163 WM_T_82580, WMP_F_SERDES }, 1164 1165 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII, 1166 "82580 gigabit Ethernet (SGMII)", 1167 WM_T_82580, WMP_F_COPPER }, 1168 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL, 1169 "82580 dual-1000BaseT Ethernet", 1170 WM_T_82580, WMP_F_COPPER }, 1171 1172 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER, 1173 "82580 quad-1000BaseX Ethernet", 1174 WM_T_82580, WMP_F_FIBER }, 1175 1176 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII, 1177 "DH89XXCC Gigabit Ethernet (SGMII)", 1178 WM_T_82580, WMP_F_COPPER }, 1179 1180 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES, 1181 "DH89XXCC Gigabit Ethernet (SERDES)", 1182 WM_T_82580, WMP_F_SERDES }, 1183 1184 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE, 1185 "DH89XXCC 1000BASE-KX Ethernet", 1186 WM_T_82580, WMP_F_SERDES }, 1187 1188 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP, 1189 "DH89XXCC Gigabit Ethernet (SFP)", 1190 WM_T_82580, WMP_F_SERDES }, 1191 1192 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER, 1193 "I350 Gigabit Network Connection", 1194 WM_T_I350, WMP_F_COPPER }, 1195 1196 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER, 1197 "I350 Gigabit Fiber Network Connection", 1198 WM_T_I350, WMP_F_FIBER }, 1199 1200 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES, 1201 "I350 Gigabit Backplane Connection", 1202 WM_T_I350, WMP_F_SERDES }, 1203 1204 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4, 1205 "I350 Quad Port Gigabit Ethernet", 1206 WM_T_I350, WMP_F_SERDES }, 1207 1208 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII, 1209 "I350 Gigabit Connection", 1210 WM_T_I350, WMP_F_COPPER }, 1211 1212 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX, 1213 "I354 Gigabit Ethernet (KX)", 1214 WM_T_I354, WMP_F_SERDES }, 1215 1216 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII, 1217 "I354 Gigabit Ethernet (SGMII)", 1218 WM_T_I354, WMP_F_COPPER }, 1219 1220 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE, 1221 "I354 Gigabit Ethernet (2.5G)", 1222 WM_T_I354, WMP_F_COPPER }, 1223 1224 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1, 1225 "I210-T1 Ethernet Server Adapter", 1226 WM_T_I210, WMP_F_COPPER }, 1227 1228 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1, 1229 "I210 Ethernet (Copper OEM)", 1230 WM_T_I210, WMP_F_COPPER }, 1231 1232 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT, 1233 "I210 Ethernet (Copper IT)", 1234 WM_T_I210, WMP_F_COPPER }, 1235 1236 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF, 1237 "I210 Ethernet (FLASH less)", 1238 WM_T_I210, WMP_F_COPPER }, 1239 1240 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER, 1241 "I210 Gigabit Ethernet (Fiber)", 1242 WM_T_I210, WMP_F_FIBER }, 1243 1244 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES, 1245 "I210 Gigabit Ethernet (SERDES)", 1246 WM_T_I210, WMP_F_SERDES }, 1247 1248 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF, 1249 "I210 Gigabit Ethernet (FLASH less)", 1250 WM_T_I210, WMP_F_SERDES }, 1251 1252 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII, 1253 "I210 Gigabit Ethernet (SGMII)", 1254 WM_T_I210, WMP_F_COPPER }, 1255 1256 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER, 1257 "I211 Ethernet (COPPER)", 1258 WM_T_I211, WMP_F_COPPER }, 1259 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V, 1260 "I217 V Ethernet Connection", 1261 WM_T_PCH_LPT, WMP_F_COPPER }, 1262 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM, 1263 "I217 LM Ethernet Connection", 1264 WM_T_PCH_LPT, WMP_F_COPPER }, 1265 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V, 1266 "I218 V Ethernet Connection", 1267 WM_T_PCH_LPT, WMP_F_COPPER }, 1268 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2, 1269 "I218 V Ethernet Connection", 1270 WM_T_PCH_LPT, WMP_F_COPPER }, 1271 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3, 1272 "I218 V Ethernet Connection", 1273 WM_T_PCH_LPT, WMP_F_COPPER }, 1274 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM, 1275 "I218 LM Ethernet Connection", 1276 WM_T_PCH_LPT, WMP_F_COPPER }, 1277 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2, 1278 "I218 LM Ethernet Connection", 1279 WM_T_PCH_LPT, WMP_F_COPPER }, 1280 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3, 1281 "I218 LM Ethernet Connection", 1282 WM_T_PCH_LPT, WMP_F_COPPER }, 1283 { 0, 0, 1284 NULL, 1285 0, 0 }, 1286 }; 1287 1288 #ifdef WM_EVENT_COUNTERS 1289 static char wm_txseg_evcnt_names[WM_NTXSEGS][sizeof("txsegXXX")]; 1290 #endif /* WM_EVENT_COUNTERS */ 1291 1292 1293 /* 1294 * Register read/write functions. 1295 * Other than CSR_{READ|WRITE}(). 1296 */ 1297 1298 #if 0 /* Not currently used */ 1299 static inline uint32_t 1300 wm_io_read(struct wm_softc *sc, int reg) 1301 { 1302 1303 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg); 1304 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4)); 1305 } 1306 #endif 1307 1308 static inline void 1309 wm_io_write(struct wm_softc *sc, int reg, uint32_t val) 1310 { 1311 1312 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg); 1313 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val); 1314 } 1315 1316 static inline void 1317 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off, 1318 uint32_t data) 1319 { 1320 uint32_t regval; 1321 int i; 1322 1323 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT); 1324 1325 CSR_WRITE(sc, reg, regval); 1326 1327 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) { 1328 delay(5); 1329 if (CSR_READ(sc, reg) & SCTL_CTL_READY) 1330 break; 1331 } 1332 if (i == SCTL_CTL_POLL_TIMEOUT) { 1333 aprint_error("%s: WARNING:" 1334 " i82575 reg 0x%08x setup did not indicate ready\n", 1335 device_xname(sc->sc_dev), reg); 1336 } 1337 } 1338 1339 static inline void 1340 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v) 1341 { 1342 wa->wa_low = htole32(v & 0xffffffffU); 1343 if (sizeof(bus_addr_t) == 8) 1344 wa->wa_high = htole32((uint64_t) v >> 32); 1345 else 1346 wa->wa_high = 0; 1347 } 1348 1349 /* 1350 * Descriptor sync/init functions. 1351 */ 1352 static inline void 1353 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops) 1354 { 1355 struct wm_softc *sc = txq->txq_sc; 1356 1357 /* If it will wrap around, sync to the end of the ring. */ 1358 if ((start + num) > WM_NTXDESC(txq)) { 1359 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap, 1360 WM_CDTXOFF(start), sizeof(wiseman_txdesc_t) * 1361 (WM_NTXDESC(txq) - start), ops); 1362 num -= (WM_NTXDESC(txq) - start); 1363 start = 0; 1364 } 1365 1366 /* Now sync whatever is left. */ 1367 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap, 1368 WM_CDTXOFF(start), sizeof(wiseman_txdesc_t) * num, ops); 1369 } 1370 1371 static inline void 1372 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops) 1373 { 1374 struct wm_softc *sc = rxq->rxq_sc; 1375 1376 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap, 1377 WM_CDRXOFF(start), sizeof(wiseman_rxdesc_t), ops); 1378 } 1379 1380 static inline void 1381 wm_init_rxdesc(struct wm_rxqueue *rxq, int start) 1382 { 1383 struct wm_softc *sc = rxq->rxq_sc; 1384 struct wm_rxsoft *rxs = &rxq->rxq_soft[start]; 1385 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start]; 1386 struct mbuf *m = rxs->rxs_mbuf; 1387 1388 /* 1389 * Note: We scoot the packet forward 2 bytes in the buffer 1390 * so that the payload after the Ethernet header is aligned 1391 * to a 4-byte boundary. 1392 1393 * XXX BRAINDAMAGE ALERT! 1394 * The stupid chip uses the same size for every buffer, which 1395 * is set in the Receive Control register. We are using the 2K 1396 * size option, but what we REALLY want is (2K - 2)! For this 1397 * reason, we can't "scoot" packets longer than the standard 1398 * Ethernet MTU. On strict-alignment platforms, if the total 1399 * size exceeds (2K - 2) we set align_tweak to 0 and let 1400 * the upper layer copy the headers. 1401 */ 1402 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak; 1403 1404 wm_set_dma_addr(&rxd->wrx_addr, 1405 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak); 1406 rxd->wrx_len = 0; 1407 rxd->wrx_cksum = 0; 1408 rxd->wrx_status = 0; 1409 rxd->wrx_errors = 0; 1410 rxd->wrx_special = 0; 1411 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1412 1413 CSR_WRITE(sc, rxq->rxq_rdt_reg, start); 1414 } 1415 1416 /* 1417 * Device driver interface functions and commonly used functions. 1418 * match, attach, detach, init, start, stop, ioctl, watchdog and so on. 1419 */ 1420 1421 /* Lookup supported device table */ 1422 static const struct wm_product * 1423 wm_lookup(const struct pci_attach_args *pa) 1424 { 1425 const struct wm_product *wmp; 1426 1427 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) { 1428 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor && 1429 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product) 1430 return wmp; 1431 } 1432 return NULL; 1433 } 1434 1435 /* The match function (ca_match) */ 1436 static int 1437 wm_match(device_t parent, cfdata_t cf, void *aux) 1438 { 1439 struct pci_attach_args *pa = aux; 1440 1441 if (wm_lookup(pa) != NULL) 1442 return 1; 1443 1444 return 0; 1445 } 1446 1447 /* The attach function (ca_attach) */ 1448 static void 1449 wm_attach(device_t parent, device_t self, void *aux) 1450 { 1451 struct wm_softc *sc = device_private(self); 1452 struct pci_attach_args *pa = aux; 1453 prop_dictionary_t dict; 1454 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1455 pci_chipset_tag_t pc = pa->pa_pc; 1456 int counts[PCI_INTR_TYPE_SIZE]; 1457 pci_intr_type_t max_type; 1458 const char *eetype, *xname; 1459 bus_space_tag_t memt; 1460 bus_space_handle_t memh; 1461 bus_size_t memsize; 1462 int memh_valid; 1463 int i, error; 1464 const struct wm_product *wmp; 1465 prop_data_t ea; 1466 prop_number_t pn; 1467 uint8_t enaddr[ETHER_ADDR_LEN]; 1468 uint16_t cfg1, cfg2, swdpin, nvmword; 1469 pcireg_t preg, memtype; 1470 uint16_t eeprom_data, apme_mask; 1471 bool force_clear_smbi; 1472 uint32_t link_mode; 1473 uint32_t reg; 1474 1475 sc->sc_dev = self; 1476 callout_init(&sc->sc_tick_ch, CALLOUT_FLAGS); 1477 sc->sc_stopping = false; 1478 1479 wmp = wm_lookup(pa); 1480 #ifdef DIAGNOSTIC 1481 if (wmp == NULL) { 1482 printf("\n"); 1483 panic("wm_attach: impossible"); 1484 } 1485 #endif 1486 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags); 1487 1488 sc->sc_pc = pa->pa_pc; 1489 sc->sc_pcitag = pa->pa_tag; 1490 1491 if (pci_dma64_available(pa)) 1492 sc->sc_dmat = pa->pa_dmat64; 1493 else 1494 sc->sc_dmat = pa->pa_dmat; 1495 1496 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id); 1497 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag, PCI_CLASS_REG)); 1498 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1); 1499 1500 sc->sc_type = wmp->wmp_type; 1501 if (sc->sc_type < WM_T_82543) { 1502 if (sc->sc_rev < 2) { 1503 aprint_error_dev(sc->sc_dev, 1504 "i82542 must be at least rev. 2\n"); 1505 return; 1506 } 1507 if (sc->sc_rev < 3) 1508 sc->sc_type = WM_T_82542_2_0; 1509 } 1510 1511 /* 1512 * Disable MSI for Errata: 1513 * "Message Signaled Interrupt Feature May Corrupt Write Transactions" 1514 * 1515 * 82544: Errata 25 1516 * 82540: Errata 6 (easy to reproduce device timeout) 1517 * 82545: Errata 4 (easy to reproduce device timeout) 1518 * 82546: Errata 26 (easy to reproduce device timeout) 1519 * 82541: Errata 7 (easy to reproduce device timeout) 1520 * 1521 * "Byte Enables 2 and 3 are not set on MSI writes" 1522 * 1523 * 82571 & 82572: Errata 63 1524 */ 1525 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571) 1526 || (sc->sc_type == WM_T_82572)) 1527 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY; 1528 1529 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 1530 || (sc->sc_type == WM_T_82580) 1531 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 1532 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 1533 sc->sc_flags |= WM_F_NEWQUEUE; 1534 1535 /* Set device properties (mactype) */ 1536 dict = device_properties(sc->sc_dev); 1537 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type); 1538 1539 /* 1540 * Map the device. All devices support memory-mapped acccess, 1541 * and it is really required for normal operation. 1542 */ 1543 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA); 1544 switch (memtype) { 1545 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: 1546 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: 1547 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA, 1548 memtype, 0, &memt, &memh, NULL, &memsize) == 0); 1549 break; 1550 default: 1551 memh_valid = 0; 1552 break; 1553 } 1554 1555 if (memh_valid) { 1556 sc->sc_st = memt; 1557 sc->sc_sh = memh; 1558 sc->sc_ss = memsize; 1559 } else { 1560 aprint_error_dev(sc->sc_dev, 1561 "unable to map device registers\n"); 1562 return; 1563 } 1564 1565 /* 1566 * In addition, i82544 and later support I/O mapped indirect 1567 * register access. It is not desirable (nor supported in 1568 * this driver) to use it for normal operation, though it is 1569 * required to work around bugs in some chip versions. 1570 */ 1571 if (sc->sc_type >= WM_T_82544) { 1572 /* First we have to find the I/O BAR. */ 1573 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) { 1574 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i); 1575 if (memtype == PCI_MAPREG_TYPE_IO) 1576 break; 1577 if (PCI_MAPREG_MEM_TYPE(memtype) == 1578 PCI_MAPREG_MEM_TYPE_64BIT) 1579 i += 4; /* skip high bits, too */ 1580 } 1581 if (i < PCI_MAPREG_END) { 1582 /* 1583 * We found PCI_MAPREG_TYPE_IO. Note that 82580 1584 * (and newer?) chip has no PCI_MAPREG_TYPE_IO. 1585 * It's no problem because newer chips has no this 1586 * bug. 1587 * 1588 * The i8254x doesn't apparently respond when the 1589 * I/O BAR is 0, which looks somewhat like it's not 1590 * been configured. 1591 */ 1592 preg = pci_conf_read(pc, pa->pa_tag, i); 1593 if (PCI_MAPREG_MEM_ADDR(preg) == 0) { 1594 aprint_error_dev(sc->sc_dev, 1595 "WARNING: I/O BAR at zero.\n"); 1596 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO, 1597 0, &sc->sc_iot, &sc->sc_ioh, 1598 NULL, &sc->sc_ios) == 0) { 1599 sc->sc_flags |= WM_F_IOH_VALID; 1600 } else { 1601 aprint_error_dev(sc->sc_dev, 1602 "WARNING: unable to map I/O space\n"); 1603 } 1604 } 1605 1606 } 1607 1608 /* Enable bus mastering. Disable MWI on the i82542 2.0. */ 1609 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 1610 preg |= PCI_COMMAND_MASTER_ENABLE; 1611 if (sc->sc_type < WM_T_82542_2_1) 1612 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE; 1613 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg); 1614 1615 /* power up chip */ 1616 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self, 1617 NULL)) && error != EOPNOTSUPP) { 1618 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error); 1619 return; 1620 } 1621 1622 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag)); 1623 1624 /* Allocation settings */ 1625 max_type = PCI_INTR_TYPE_MSIX; 1626 counts[PCI_INTR_TYPE_MSIX] = sc->sc_ntxqueues + sc->sc_nrxqueues + 1; 1627 counts[PCI_INTR_TYPE_MSI] = 1; 1628 counts[PCI_INTR_TYPE_INTX] = 1; 1629 1630 alloc_retry: 1631 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) { 1632 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n"); 1633 return; 1634 } 1635 1636 if (pci_intr_type(sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) { 1637 error = wm_setup_msix(sc); 1638 if (error) { 1639 pci_intr_release(pc, sc->sc_intrs, 1640 counts[PCI_INTR_TYPE_MSIX]); 1641 1642 /* Setup for MSI: Disable MSI-X */ 1643 max_type = PCI_INTR_TYPE_MSI; 1644 counts[PCI_INTR_TYPE_MSI] = 1; 1645 counts[PCI_INTR_TYPE_INTX] = 1; 1646 goto alloc_retry; 1647 } 1648 } else if (pci_intr_type(sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) { 1649 wm_adjust_qnum(sc, 0); /* must not use multiqueue */ 1650 error = wm_setup_legacy(sc); 1651 if (error) { 1652 pci_intr_release(sc->sc_pc, sc->sc_intrs, 1653 counts[PCI_INTR_TYPE_MSI]); 1654 1655 /* The next try is for INTx: Disable MSI */ 1656 max_type = PCI_INTR_TYPE_INTX; 1657 counts[PCI_INTR_TYPE_INTX] = 1; 1658 goto alloc_retry; 1659 } 1660 } else { 1661 wm_adjust_qnum(sc, 0); /* must not use multiqueue */ 1662 error = wm_setup_legacy(sc); 1663 if (error) { 1664 pci_intr_release(sc->sc_pc, sc->sc_intrs, 1665 counts[PCI_INTR_TYPE_INTX]); 1666 return; 1667 } 1668 } 1669 1670 /* 1671 * Check the function ID (unit number of the chip). 1672 */ 1673 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3) 1674 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003) 1675 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 1676 || (sc->sc_type == WM_T_82580) 1677 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 1678 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS) 1679 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK; 1680 else 1681 sc->sc_funcid = 0; 1682 1683 /* 1684 * Determine a few things about the bus we're connected to. 1685 */ 1686 if (sc->sc_type < WM_T_82543) { 1687 /* We don't really know the bus characteristics here. */ 1688 sc->sc_bus_speed = 33; 1689 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) { 1690 /* 1691 * CSA (Communication Streaming Architecture) is about as fast 1692 * a 32-bit 66MHz PCI Bus. 1693 */ 1694 sc->sc_flags |= WM_F_CSA; 1695 sc->sc_bus_speed = 66; 1696 aprint_verbose_dev(sc->sc_dev, 1697 "Communication Streaming Architecture\n"); 1698 if (sc->sc_type == WM_T_82547) { 1699 callout_init(&sc->sc_txfifo_ch, CALLOUT_FLAGS); 1700 callout_setfunc(&sc->sc_txfifo_ch, 1701 wm_82547_txfifo_stall, sc); 1702 aprint_verbose_dev(sc->sc_dev, 1703 "using 82547 Tx FIFO stall work-around\n"); 1704 } 1705 } else if (sc->sc_type >= WM_T_82571) { 1706 sc->sc_flags |= WM_F_PCIE; 1707 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9) 1708 && (sc->sc_type != WM_T_ICH10) 1709 && (sc->sc_type != WM_T_PCH) 1710 && (sc->sc_type != WM_T_PCH2) 1711 && (sc->sc_type != WM_T_PCH_LPT)) { 1712 /* ICH* and PCH* have no PCIe capability registers */ 1713 if (pci_get_capability(pa->pa_pc, pa->pa_tag, 1714 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff, 1715 NULL) == 0) 1716 aprint_error_dev(sc->sc_dev, 1717 "unable to find PCIe capability\n"); 1718 } 1719 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n"); 1720 } else { 1721 reg = CSR_READ(sc, WMREG_STATUS); 1722 if (reg & STATUS_BUS64) 1723 sc->sc_flags |= WM_F_BUS64; 1724 if ((reg & STATUS_PCIX_MODE) != 0) { 1725 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb; 1726 1727 sc->sc_flags |= WM_F_PCIX; 1728 if (pci_get_capability(pa->pa_pc, pa->pa_tag, 1729 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0) 1730 aprint_error_dev(sc->sc_dev, 1731 "unable to find PCIX capability\n"); 1732 else if (sc->sc_type != WM_T_82545_3 && 1733 sc->sc_type != WM_T_82546_3) { 1734 /* 1735 * Work around a problem caused by the BIOS 1736 * setting the max memory read byte count 1737 * incorrectly. 1738 */ 1739 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag, 1740 sc->sc_pcixe_capoff + PCIX_CMD); 1741 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag, 1742 sc->sc_pcixe_capoff + PCIX_STATUS); 1743 1744 bytecnt = 1745 (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >> 1746 PCIX_CMD_BYTECNT_SHIFT; 1747 maxb = 1748 (pcix_sts & PCIX_STATUS_MAXB_MASK) >> 1749 PCIX_STATUS_MAXB_SHIFT; 1750 if (bytecnt > maxb) { 1751 aprint_verbose_dev(sc->sc_dev, 1752 "resetting PCI-X MMRBC: %d -> %d\n", 1753 512 << bytecnt, 512 << maxb); 1754 pcix_cmd = (pcix_cmd & 1755 ~PCIX_CMD_BYTECNT_MASK) | 1756 (maxb << PCIX_CMD_BYTECNT_SHIFT); 1757 pci_conf_write(pa->pa_pc, pa->pa_tag, 1758 sc->sc_pcixe_capoff + PCIX_CMD, 1759 pcix_cmd); 1760 } 1761 } 1762 } 1763 /* 1764 * The quad port adapter is special; it has a PCIX-PCIX 1765 * bridge on the board, and can run the secondary bus at 1766 * a higher speed. 1767 */ 1768 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) { 1769 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120 1770 : 66; 1771 } else if (sc->sc_flags & WM_F_PCIX) { 1772 switch (reg & STATUS_PCIXSPD_MASK) { 1773 case STATUS_PCIXSPD_50_66: 1774 sc->sc_bus_speed = 66; 1775 break; 1776 case STATUS_PCIXSPD_66_100: 1777 sc->sc_bus_speed = 100; 1778 break; 1779 case STATUS_PCIXSPD_100_133: 1780 sc->sc_bus_speed = 133; 1781 break; 1782 default: 1783 aprint_error_dev(sc->sc_dev, 1784 "unknown PCIXSPD %d; assuming 66MHz\n", 1785 reg & STATUS_PCIXSPD_MASK); 1786 sc->sc_bus_speed = 66; 1787 break; 1788 } 1789 } else 1790 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33; 1791 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n", 1792 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed, 1793 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI"); 1794 } 1795 1796 /* clear interesting stat counters */ 1797 CSR_READ(sc, WMREG_COLC); 1798 CSR_READ(sc, WMREG_RXERRC); 1799 1800 /* get PHY control from SMBus to PCIe */ 1801 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2) 1802 || (sc->sc_type == WM_T_PCH_LPT)) 1803 wm_smbustopci(sc); 1804 1805 /* Reset the chip to a known state. */ 1806 wm_reset(sc); 1807 1808 /* Get some information about the EEPROM. */ 1809 switch (sc->sc_type) { 1810 case WM_T_82542_2_0: 1811 case WM_T_82542_2_1: 1812 case WM_T_82543: 1813 case WM_T_82544: 1814 /* Microwire */ 1815 sc->sc_nvm_wordsize = 64; 1816 sc->sc_nvm_addrbits = 6; 1817 break; 1818 case WM_T_82540: 1819 case WM_T_82545: 1820 case WM_T_82545_3: 1821 case WM_T_82546: 1822 case WM_T_82546_3: 1823 /* Microwire */ 1824 reg = CSR_READ(sc, WMREG_EECD); 1825 if (reg & EECD_EE_SIZE) { 1826 sc->sc_nvm_wordsize = 256; 1827 sc->sc_nvm_addrbits = 8; 1828 } else { 1829 sc->sc_nvm_wordsize = 64; 1830 sc->sc_nvm_addrbits = 6; 1831 } 1832 sc->sc_flags |= WM_F_LOCK_EECD; 1833 break; 1834 case WM_T_82541: 1835 case WM_T_82541_2: 1836 case WM_T_82547: 1837 case WM_T_82547_2: 1838 sc->sc_flags |= WM_F_LOCK_EECD; 1839 reg = CSR_READ(sc, WMREG_EECD); 1840 if (reg & EECD_EE_TYPE) { 1841 /* SPI */ 1842 sc->sc_flags |= WM_F_EEPROM_SPI; 1843 wm_nvm_set_addrbits_size_eecd(sc); 1844 } else { 1845 /* Microwire */ 1846 if ((reg & EECD_EE_ABITS) != 0) { 1847 sc->sc_nvm_wordsize = 256; 1848 sc->sc_nvm_addrbits = 8; 1849 } else { 1850 sc->sc_nvm_wordsize = 64; 1851 sc->sc_nvm_addrbits = 6; 1852 } 1853 } 1854 break; 1855 case WM_T_82571: 1856 case WM_T_82572: 1857 /* SPI */ 1858 sc->sc_flags |= WM_F_EEPROM_SPI; 1859 wm_nvm_set_addrbits_size_eecd(sc); 1860 sc->sc_flags |= WM_F_LOCK_EECD | WM_F_LOCK_SWSM; 1861 break; 1862 case WM_T_82573: 1863 sc->sc_flags |= WM_F_LOCK_SWSM; 1864 /* FALLTHROUGH */ 1865 case WM_T_82574: 1866 case WM_T_82583: 1867 if (wm_nvm_is_onboard_eeprom(sc) == 0) { 1868 sc->sc_flags |= WM_F_EEPROM_FLASH; 1869 sc->sc_nvm_wordsize = 2048; 1870 } else { 1871 /* SPI */ 1872 sc->sc_flags |= WM_F_EEPROM_SPI; 1873 wm_nvm_set_addrbits_size_eecd(sc); 1874 } 1875 sc->sc_flags |= WM_F_EEPROM_EERDEEWR; 1876 break; 1877 case WM_T_82575: 1878 case WM_T_82576: 1879 case WM_T_82580: 1880 case WM_T_I350: 1881 case WM_T_I354: 1882 case WM_T_80003: 1883 /* SPI */ 1884 sc->sc_flags |= WM_F_EEPROM_SPI; 1885 wm_nvm_set_addrbits_size_eecd(sc); 1886 sc->sc_flags |= WM_F_EEPROM_EERDEEWR | WM_F_LOCK_SWFW 1887 | WM_F_LOCK_SWSM; 1888 break; 1889 case WM_T_ICH8: 1890 case WM_T_ICH9: 1891 case WM_T_ICH10: 1892 case WM_T_PCH: 1893 case WM_T_PCH2: 1894 case WM_T_PCH_LPT: 1895 /* FLASH */ 1896 sc->sc_flags |= WM_F_EEPROM_FLASH | WM_F_LOCK_EXTCNF; 1897 sc->sc_nvm_wordsize = 2048; 1898 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_ICH8_FLASH); 1899 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0, 1900 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) { 1901 aprint_error_dev(sc->sc_dev, 1902 "can't map FLASH registers\n"); 1903 goto out; 1904 } 1905 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG); 1906 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) * 1907 ICH_FLASH_SECTOR_SIZE; 1908 sc->sc_ich8_flash_bank_size = 1909 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1; 1910 sc->sc_ich8_flash_bank_size -= 1911 (reg & ICH_GFPREG_BASE_MASK); 1912 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE; 1913 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t); 1914 break; 1915 case WM_T_I210: 1916 case WM_T_I211: 1917 if (wm_nvm_get_flash_presence_i210(sc)) { 1918 wm_nvm_set_addrbits_size_eecd(sc); 1919 sc->sc_flags |= WM_F_EEPROM_FLASH_HW; 1920 sc->sc_flags |= WM_F_EEPROM_EERDEEWR | WM_F_LOCK_SWFW; 1921 } else { 1922 sc->sc_nvm_wordsize = INVM_SIZE; 1923 sc->sc_flags |= WM_F_EEPROM_INVM; 1924 sc->sc_flags |= WM_F_LOCK_SWFW; 1925 } 1926 break; 1927 default: 1928 break; 1929 } 1930 1931 /* Ensure the SMBI bit is clear before first NVM or PHY access */ 1932 switch (sc->sc_type) { 1933 case WM_T_82571: 1934 case WM_T_82572: 1935 reg = CSR_READ(sc, WMREG_SWSM2); 1936 if ((reg & SWSM2_LOCK) == 0) { 1937 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK); 1938 force_clear_smbi = true; 1939 } else 1940 force_clear_smbi = false; 1941 break; 1942 case WM_T_82573: 1943 case WM_T_82574: 1944 case WM_T_82583: 1945 force_clear_smbi = true; 1946 break; 1947 default: 1948 force_clear_smbi = false; 1949 break; 1950 } 1951 if (force_clear_smbi) { 1952 reg = CSR_READ(sc, WMREG_SWSM); 1953 if ((reg & SWSM_SMBI) != 0) 1954 aprint_error_dev(sc->sc_dev, 1955 "Please update the Bootagent\n"); 1956 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI); 1957 } 1958 1959 /* 1960 * Defer printing the EEPROM type until after verifying the checksum 1961 * This allows the EEPROM type to be printed correctly in the case 1962 * that no EEPROM is attached. 1963 */ 1964 /* 1965 * Validate the EEPROM checksum. If the checksum fails, flag 1966 * this for later, so we can fail future reads from the EEPROM. 1967 */ 1968 if (wm_nvm_validate_checksum(sc)) { 1969 /* 1970 * Read twice again because some PCI-e parts fail the 1971 * first check due to the link being in sleep state. 1972 */ 1973 if (wm_nvm_validate_checksum(sc)) 1974 sc->sc_flags |= WM_F_EEPROM_INVALID; 1975 } 1976 1977 /* Set device properties (macflags) */ 1978 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags); 1979 1980 if (sc->sc_flags & WM_F_EEPROM_INVALID) 1981 aprint_verbose_dev(sc->sc_dev, "No EEPROM"); 1982 else { 1983 aprint_verbose_dev(sc->sc_dev, "%u words ", 1984 sc->sc_nvm_wordsize); 1985 if (sc->sc_flags & WM_F_EEPROM_INVM) 1986 aprint_verbose("iNVM"); 1987 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW) 1988 aprint_verbose("FLASH(HW)"); 1989 else if (sc->sc_flags & WM_F_EEPROM_FLASH) 1990 aprint_verbose("FLASH"); 1991 else { 1992 if (sc->sc_flags & WM_F_EEPROM_SPI) 1993 eetype = "SPI"; 1994 else 1995 eetype = "MicroWire"; 1996 aprint_verbose("(%d address bits) %s EEPROM", 1997 sc->sc_nvm_addrbits, eetype); 1998 } 1999 } 2000 wm_nvm_version(sc); 2001 aprint_verbose("\n"); 2002 2003 /* Check for I21[01] PLL workaround */ 2004 if (sc->sc_type == WM_T_I210) 2005 sc->sc_flags |= WM_F_PLL_WA_I210; 2006 if ((sc->sc_type == WM_T_I210) && wm_nvm_get_flash_presence_i210(sc)) { 2007 /* NVM image release 3.25 has a workaround */ 2008 if ((sc->sc_nvm_ver_major < 3) 2009 || ((sc->sc_nvm_ver_major == 3) 2010 && (sc->sc_nvm_ver_minor < 25))) { 2011 aprint_verbose_dev(sc->sc_dev, 2012 "ROM image version %d.%d is older than 3.25\n", 2013 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor); 2014 sc->sc_flags |= WM_F_PLL_WA_I210; 2015 } 2016 } 2017 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0) 2018 wm_pll_workaround_i210(sc); 2019 2020 wm_get_wakeup(sc); 2021 switch (sc->sc_type) { 2022 case WM_T_82571: 2023 case WM_T_82572: 2024 case WM_T_82573: 2025 case WM_T_82574: 2026 case WM_T_82583: 2027 case WM_T_80003: 2028 case WM_T_ICH8: 2029 case WM_T_ICH9: 2030 case WM_T_ICH10: 2031 case WM_T_PCH: 2032 case WM_T_PCH2: 2033 case WM_T_PCH_LPT: 2034 /* Non-AMT based hardware can now take control from firmware */ 2035 if ((sc->sc_flags & WM_F_HAS_AMT) == 0) 2036 wm_get_hw_control(sc); 2037 break; 2038 default: 2039 break; 2040 } 2041 2042 /* 2043 * Read the Ethernet address from the EEPROM, if not first found 2044 * in device properties. 2045 */ 2046 ea = prop_dictionary_get(dict, "mac-address"); 2047 if (ea != NULL) { 2048 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA); 2049 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN); 2050 memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN); 2051 } else { 2052 if (wm_read_mac_addr(sc, enaddr) != 0) { 2053 aprint_error_dev(sc->sc_dev, 2054 "unable to read Ethernet address\n"); 2055 goto out; 2056 } 2057 } 2058 2059 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n", 2060 ether_sprintf(enaddr)); 2061 2062 /* 2063 * Read the config info from the EEPROM, and set up various 2064 * bits in the control registers based on their contents. 2065 */ 2066 pn = prop_dictionary_get(dict, "i82543-cfg1"); 2067 if (pn != NULL) { 2068 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2069 cfg1 = (uint16_t) prop_number_integer_value(pn); 2070 } else { 2071 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) { 2072 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n"); 2073 goto out; 2074 } 2075 } 2076 2077 pn = prop_dictionary_get(dict, "i82543-cfg2"); 2078 if (pn != NULL) { 2079 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2080 cfg2 = (uint16_t) prop_number_integer_value(pn); 2081 } else { 2082 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) { 2083 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n"); 2084 goto out; 2085 } 2086 } 2087 2088 /* check for WM_F_WOL */ 2089 switch (sc->sc_type) { 2090 case WM_T_82542_2_0: 2091 case WM_T_82542_2_1: 2092 case WM_T_82543: 2093 /* dummy? */ 2094 eeprom_data = 0; 2095 apme_mask = NVM_CFG3_APME; 2096 break; 2097 case WM_T_82544: 2098 apme_mask = NVM_CFG2_82544_APM_EN; 2099 eeprom_data = cfg2; 2100 break; 2101 case WM_T_82546: 2102 case WM_T_82546_3: 2103 case WM_T_82571: 2104 case WM_T_82572: 2105 case WM_T_82573: 2106 case WM_T_82574: 2107 case WM_T_82583: 2108 case WM_T_80003: 2109 default: 2110 apme_mask = NVM_CFG3_APME; 2111 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB 2112 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data); 2113 break; 2114 case WM_T_82575: 2115 case WM_T_82576: 2116 case WM_T_82580: 2117 case WM_T_I350: 2118 case WM_T_I354: /* XXX ok? */ 2119 case WM_T_ICH8: 2120 case WM_T_ICH9: 2121 case WM_T_ICH10: 2122 case WM_T_PCH: 2123 case WM_T_PCH2: 2124 case WM_T_PCH_LPT: 2125 /* XXX The funcid should be checked on some devices */ 2126 apme_mask = WUC_APME; 2127 eeprom_data = CSR_READ(sc, WMREG_WUC); 2128 break; 2129 } 2130 2131 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */ 2132 if ((eeprom_data & apme_mask) != 0) 2133 sc->sc_flags |= WM_F_WOL; 2134 #ifdef WM_DEBUG 2135 if ((sc->sc_flags & WM_F_WOL) != 0) 2136 printf("WOL\n"); 2137 #endif 2138 2139 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) { 2140 /* Check NVM for autonegotiation */ 2141 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) { 2142 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) != 0) 2143 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO; 2144 } 2145 } 2146 2147 /* 2148 * XXX need special handling for some multiple port cards 2149 * to disable a paticular port. 2150 */ 2151 2152 if (sc->sc_type >= WM_T_82544) { 2153 pn = prop_dictionary_get(dict, "i82543-swdpin"); 2154 if (pn != NULL) { 2155 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER); 2156 swdpin = (uint16_t) prop_number_integer_value(pn); 2157 } else { 2158 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) { 2159 aprint_error_dev(sc->sc_dev, 2160 "unable to read SWDPIN\n"); 2161 goto out; 2162 } 2163 } 2164 } 2165 2166 if (cfg1 & NVM_CFG1_ILOS) 2167 sc->sc_ctrl |= CTRL_ILOS; 2168 2169 /* 2170 * XXX 2171 * This code isn't correct because pin 2 and 3 are located 2172 * in different position on newer chips. Check all datasheet. 2173 * 2174 * Until resolve this problem, check if a chip < 82580 2175 */ 2176 if (sc->sc_type <= WM_T_82580) { 2177 if (sc->sc_type >= WM_T_82544) { 2178 sc->sc_ctrl |= 2179 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) << 2180 CTRL_SWDPIO_SHIFT; 2181 sc->sc_ctrl |= 2182 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) << 2183 CTRL_SWDPINS_SHIFT; 2184 } else { 2185 sc->sc_ctrl |= 2186 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) << 2187 CTRL_SWDPIO_SHIFT; 2188 } 2189 } 2190 2191 /* XXX For other than 82580? */ 2192 if (sc->sc_type == WM_T_82580) { 2193 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &nvmword); 2194 printf("CFG3 = %08x\n", (uint32_t)nvmword); 2195 if (nvmword & __BIT(13)) { 2196 printf("SET ILOS\n"); 2197 sc->sc_ctrl |= CTRL_ILOS; 2198 } 2199 } 2200 2201 #if 0 2202 if (sc->sc_type >= WM_T_82544) { 2203 if (cfg1 & NVM_CFG1_IPS0) 2204 sc->sc_ctrl_ext |= CTRL_EXT_IPS; 2205 if (cfg1 & NVM_CFG1_IPS1) 2206 sc->sc_ctrl_ext |= CTRL_EXT_IPS1; 2207 sc->sc_ctrl_ext |= 2208 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) << 2209 CTRL_EXT_SWDPIO_SHIFT; 2210 sc->sc_ctrl_ext |= 2211 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) << 2212 CTRL_EXT_SWDPINS_SHIFT; 2213 } else { 2214 sc->sc_ctrl_ext |= 2215 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) << 2216 CTRL_EXT_SWDPIO_SHIFT; 2217 } 2218 #endif 2219 2220 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 2221 #if 0 2222 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext); 2223 #endif 2224 2225 if (sc->sc_type == WM_T_PCH) { 2226 uint16_t val; 2227 2228 /* Save the NVM K1 bit setting */ 2229 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val); 2230 2231 if ((val & NVM_K1_CONFIG_ENABLE) != 0) 2232 sc->sc_nvm_k1_enabled = 1; 2233 else 2234 sc->sc_nvm_k1_enabled = 0; 2235 } 2236 2237 /* 2238 * Determine if we're TBI,GMII or SGMII mode, and initialize the 2239 * media structures accordingly. 2240 */ 2241 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9 2242 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH 2243 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT 2244 || sc->sc_type == WM_T_82573 2245 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) { 2246 /* STATUS_TBIMODE reserved/reused, can't rely on it */ 2247 wm_gmii_mediainit(sc, wmp->wmp_product); 2248 } else if (sc->sc_type < WM_T_82543 || 2249 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) { 2250 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) { 2251 aprint_error_dev(sc->sc_dev, 2252 "WARNING: TBIMODE set on 1000BASE-T product!\n"); 2253 sc->sc_mediatype = WM_MEDIATYPE_FIBER; 2254 } 2255 wm_tbi_mediainit(sc); 2256 } else { 2257 switch (sc->sc_type) { 2258 case WM_T_82575: 2259 case WM_T_82576: 2260 case WM_T_82580: 2261 case WM_T_I350: 2262 case WM_T_I354: 2263 case WM_T_I210: 2264 case WM_T_I211: 2265 reg = CSR_READ(sc, WMREG_CTRL_EXT); 2266 link_mode = reg & CTRL_EXT_LINK_MODE_MASK; 2267 switch (link_mode) { 2268 case CTRL_EXT_LINK_MODE_1000KX: 2269 aprint_verbose_dev(sc->sc_dev, "1000KX\n"); 2270 sc->sc_mediatype = WM_MEDIATYPE_SERDES; 2271 break; 2272 case CTRL_EXT_LINK_MODE_SGMII: 2273 if (wm_sgmii_uses_mdio(sc)) { 2274 aprint_verbose_dev(sc->sc_dev, 2275 "SGMII(MDIO)\n"); 2276 sc->sc_flags |= WM_F_SGMII; 2277 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2278 break; 2279 } 2280 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n"); 2281 /*FALLTHROUGH*/ 2282 case CTRL_EXT_LINK_MODE_PCIE_SERDES: 2283 sc->sc_mediatype = wm_sfp_get_media_type(sc); 2284 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) { 2285 if (link_mode 2286 == CTRL_EXT_LINK_MODE_SGMII) { 2287 sc->sc_mediatype 2288 = WM_MEDIATYPE_COPPER; 2289 sc->sc_flags |= WM_F_SGMII; 2290 } else { 2291 sc->sc_mediatype 2292 = WM_MEDIATYPE_SERDES; 2293 aprint_verbose_dev(sc->sc_dev, 2294 "SERDES\n"); 2295 } 2296 break; 2297 } 2298 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) 2299 aprint_verbose_dev(sc->sc_dev, 2300 "SERDES\n"); 2301 2302 /* Change current link mode setting */ 2303 reg &= ~CTRL_EXT_LINK_MODE_MASK; 2304 switch (sc->sc_mediatype) { 2305 case WM_MEDIATYPE_COPPER: 2306 reg |= CTRL_EXT_LINK_MODE_SGMII; 2307 break; 2308 case WM_MEDIATYPE_SERDES: 2309 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES; 2310 break; 2311 default: 2312 break; 2313 } 2314 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 2315 break; 2316 case CTRL_EXT_LINK_MODE_GMII: 2317 default: 2318 aprint_verbose_dev(sc->sc_dev, "Copper\n"); 2319 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2320 break; 2321 } 2322 2323 reg &= ~CTRL_EXT_I2C_ENA; 2324 if ((sc->sc_flags & WM_F_SGMII) != 0) 2325 reg |= CTRL_EXT_I2C_ENA; 2326 else 2327 reg &= ~CTRL_EXT_I2C_ENA; 2328 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 2329 2330 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) 2331 wm_gmii_mediainit(sc, wmp->wmp_product); 2332 else 2333 wm_tbi_mediainit(sc); 2334 break; 2335 default: 2336 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) 2337 aprint_error_dev(sc->sc_dev, 2338 "WARNING: TBIMODE clear on 1000BASE-X product!\n"); 2339 sc->sc_mediatype = WM_MEDIATYPE_COPPER; 2340 wm_gmii_mediainit(sc, wmp->wmp_product); 2341 } 2342 } 2343 2344 ifp = &sc->sc_ethercom.ec_if; 2345 xname = device_xname(sc->sc_dev); 2346 strlcpy(ifp->if_xname, xname, IFNAMSIZ); 2347 ifp->if_softc = sc; 2348 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 2349 ifp->if_ioctl = wm_ioctl; 2350 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 2351 ifp->if_start = wm_nq_start; 2352 else 2353 ifp->if_start = wm_start; 2354 ifp->if_watchdog = wm_watchdog; 2355 ifp->if_init = wm_init; 2356 ifp->if_stop = wm_stop; 2357 IFQ_SET_MAXLEN(&ifp->if_snd, max(WM_IFQUEUELEN, IFQ_MAXLEN)); 2358 IFQ_SET_READY(&ifp->if_snd); 2359 2360 /* Check for jumbo frame */ 2361 switch (sc->sc_type) { 2362 case WM_T_82573: 2363 /* XXX limited to 9234 if ASPM is disabled */ 2364 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword); 2365 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0) 2366 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 2367 break; 2368 case WM_T_82571: 2369 case WM_T_82572: 2370 case WM_T_82574: 2371 case WM_T_82575: 2372 case WM_T_82576: 2373 case WM_T_82580: 2374 case WM_T_I350: 2375 case WM_T_I354: /* XXXX ok? */ 2376 case WM_T_I210: 2377 case WM_T_I211: 2378 case WM_T_80003: 2379 case WM_T_ICH9: 2380 case WM_T_ICH10: 2381 case WM_T_PCH2: /* PCH2 supports 9K frame size */ 2382 case WM_T_PCH_LPT: 2383 /* XXX limited to 9234 */ 2384 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 2385 break; 2386 case WM_T_PCH: 2387 /* XXX limited to 4096 */ 2388 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 2389 break; 2390 case WM_T_82542_2_0: 2391 case WM_T_82542_2_1: 2392 case WM_T_82583: 2393 case WM_T_ICH8: 2394 /* No support for jumbo frame */ 2395 break; 2396 default: 2397 /* ETHER_MAX_LEN_JUMBO */ 2398 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU; 2399 break; 2400 } 2401 2402 /* If we're a i82543 or greater, we can support VLANs. */ 2403 if (sc->sc_type >= WM_T_82543) 2404 sc->sc_ethercom.ec_capabilities |= 2405 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING; 2406 2407 /* 2408 * We can perform TCPv4 and UDPv4 checkums in-bound. Only 2409 * on i82543 and later. 2410 */ 2411 if (sc->sc_type >= WM_T_82543) { 2412 ifp->if_capabilities |= 2413 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx | 2414 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx | 2415 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx | 2416 IFCAP_CSUM_TCPv6_Tx | 2417 IFCAP_CSUM_UDPv6_Tx; 2418 } 2419 2420 /* 2421 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL. 2422 * 2423 * 82541GI (8086:1076) ... no 2424 * 82572EI (8086:10b9) ... yes 2425 */ 2426 if (sc->sc_type >= WM_T_82571) { 2427 ifp->if_capabilities |= 2428 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx; 2429 } 2430 2431 /* 2432 * If we're a i82544 or greater (except i82547), we can do 2433 * TCP segmentation offload. 2434 */ 2435 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) { 2436 ifp->if_capabilities |= IFCAP_TSOv4; 2437 } 2438 2439 if (sc->sc_type >= WM_T_82571) { 2440 ifp->if_capabilities |= IFCAP_TSOv6; 2441 } 2442 2443 #ifdef WM_MPSAFE 2444 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 2445 #else 2446 sc->sc_core_lock = NULL; 2447 #endif 2448 2449 /* Attach the interface. */ 2450 if_attach(ifp); 2451 ether_ifattach(ifp, enaddr); 2452 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb); 2453 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET, 2454 RND_FLAG_DEFAULT); 2455 2456 #ifdef WM_EVENT_COUNTERS 2457 /* Attach event counters. */ 2458 evcnt_attach_dynamic(&sc->sc_ev_txsstall, EVCNT_TYPE_MISC, 2459 NULL, xname, "txsstall"); 2460 evcnt_attach_dynamic(&sc->sc_ev_txdstall, EVCNT_TYPE_MISC, 2461 NULL, xname, "txdstall"); 2462 evcnt_attach_dynamic(&sc->sc_ev_txfifo_stall, EVCNT_TYPE_MISC, 2463 NULL, xname, "txfifo_stall"); 2464 evcnt_attach_dynamic(&sc->sc_ev_txdw, EVCNT_TYPE_INTR, 2465 NULL, xname, "txdw"); 2466 evcnt_attach_dynamic(&sc->sc_ev_txqe, EVCNT_TYPE_INTR, 2467 NULL, xname, "txqe"); 2468 evcnt_attach_dynamic(&sc->sc_ev_rxintr, EVCNT_TYPE_INTR, 2469 NULL, xname, "rxintr"); 2470 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR, 2471 NULL, xname, "linkintr"); 2472 2473 evcnt_attach_dynamic(&sc->sc_ev_rxipsum, EVCNT_TYPE_MISC, 2474 NULL, xname, "rxipsum"); 2475 evcnt_attach_dynamic(&sc->sc_ev_rxtusum, EVCNT_TYPE_MISC, 2476 NULL, xname, "rxtusum"); 2477 evcnt_attach_dynamic(&sc->sc_ev_txipsum, EVCNT_TYPE_MISC, 2478 NULL, xname, "txipsum"); 2479 evcnt_attach_dynamic(&sc->sc_ev_txtusum, EVCNT_TYPE_MISC, 2480 NULL, xname, "txtusum"); 2481 evcnt_attach_dynamic(&sc->sc_ev_txtusum6, EVCNT_TYPE_MISC, 2482 NULL, xname, "txtusum6"); 2483 2484 evcnt_attach_dynamic(&sc->sc_ev_txtso, EVCNT_TYPE_MISC, 2485 NULL, xname, "txtso"); 2486 evcnt_attach_dynamic(&sc->sc_ev_txtso6, EVCNT_TYPE_MISC, 2487 NULL, xname, "txtso6"); 2488 evcnt_attach_dynamic(&sc->sc_ev_txtsopain, EVCNT_TYPE_MISC, 2489 NULL, xname, "txtsopain"); 2490 2491 for (i = 0; i < WM_NTXSEGS; i++) { 2492 snprintf(wm_txseg_evcnt_names[i], 2493 sizeof(wm_txseg_evcnt_names[i]), "txseg%d", i); 2494 evcnt_attach_dynamic(&sc->sc_ev_txseg[i], EVCNT_TYPE_MISC, 2495 NULL, xname, wm_txseg_evcnt_names[i]); 2496 } 2497 2498 evcnt_attach_dynamic(&sc->sc_ev_txdrop, EVCNT_TYPE_MISC, 2499 NULL, xname, "txdrop"); 2500 2501 evcnt_attach_dynamic(&sc->sc_ev_tu, EVCNT_TYPE_MISC, 2502 NULL, xname, "tu"); 2503 2504 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC, 2505 NULL, xname, "tx_xoff"); 2506 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC, 2507 NULL, xname, "tx_xon"); 2508 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC, 2509 NULL, xname, "rx_xoff"); 2510 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC, 2511 NULL, xname, "rx_xon"); 2512 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC, 2513 NULL, xname, "rx_macctl"); 2514 #endif /* WM_EVENT_COUNTERS */ 2515 2516 if (pmf_device_register(self, wm_suspend, wm_resume)) 2517 pmf_class_network_register(self, ifp); 2518 else 2519 aprint_error_dev(self, "couldn't establish power handler\n"); 2520 2521 sc->sc_flags |= WM_F_ATTACHED; 2522 out: 2523 return; 2524 } 2525 2526 /* The detach function (ca_detach) */ 2527 static int 2528 wm_detach(device_t self, int flags __unused) 2529 { 2530 struct wm_softc *sc = device_private(self); 2531 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2532 int i; 2533 #ifndef WM_MPSAFE 2534 int s; 2535 #endif 2536 2537 if ((sc->sc_flags & WM_F_ATTACHED) == 0) 2538 return 0; 2539 2540 #ifndef WM_MPSAFE 2541 s = splnet(); 2542 #endif 2543 /* Stop the interface. Callouts are stopped in it. */ 2544 wm_stop(ifp, 1); 2545 2546 #ifndef WM_MPSAFE 2547 splx(s); 2548 #endif 2549 2550 pmf_device_deregister(self); 2551 2552 /* Tell the firmware about the release */ 2553 WM_CORE_LOCK(sc); 2554 wm_release_manageability(sc); 2555 wm_release_hw_control(sc); 2556 WM_CORE_UNLOCK(sc); 2557 2558 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY); 2559 2560 /* Delete all remaining media. */ 2561 ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY); 2562 2563 ether_ifdetach(ifp); 2564 if_detach(ifp); 2565 2566 2567 /* Unload RX dmamaps and free mbufs */ 2568 for (i = 0; i < sc->sc_nrxqueues; i++) { 2569 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 2570 WM_RX_LOCK(rxq); 2571 wm_rxdrain(rxq); 2572 WM_RX_UNLOCK(rxq); 2573 } 2574 /* Must unlock here */ 2575 2576 wm_free_txrx_queues(sc); 2577 2578 /* Disestablish the interrupt handler */ 2579 for (i = 0; i < sc->sc_nintrs; i++) { 2580 if (sc->sc_ihs[i] != NULL) { 2581 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 2582 sc->sc_ihs[i] = NULL; 2583 } 2584 } 2585 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs); 2586 2587 /* Unmap the registers */ 2588 if (sc->sc_ss) { 2589 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss); 2590 sc->sc_ss = 0; 2591 } 2592 if (sc->sc_ios) { 2593 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 2594 sc->sc_ios = 0; 2595 } 2596 if (sc->sc_flashs) { 2597 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs); 2598 sc->sc_flashs = 0; 2599 } 2600 2601 if (sc->sc_core_lock) 2602 mutex_obj_free(sc->sc_core_lock); 2603 2604 return 0; 2605 } 2606 2607 static bool 2608 wm_suspend(device_t self, const pmf_qual_t *qual) 2609 { 2610 struct wm_softc *sc = device_private(self); 2611 2612 wm_release_manageability(sc); 2613 wm_release_hw_control(sc); 2614 #ifdef WM_WOL 2615 wm_enable_wakeup(sc); 2616 #endif 2617 2618 return true; 2619 } 2620 2621 static bool 2622 wm_resume(device_t self, const pmf_qual_t *qual) 2623 { 2624 struct wm_softc *sc = device_private(self); 2625 2626 wm_init_manageability(sc); 2627 2628 return true; 2629 } 2630 2631 /* 2632 * wm_watchdog: [ifnet interface function] 2633 * 2634 * Watchdog timer handler. 2635 */ 2636 static void 2637 wm_watchdog(struct ifnet *ifp) 2638 { 2639 struct wm_softc *sc = ifp->if_softc; 2640 struct wm_txqueue *txq = &sc->sc_txq[0]; 2641 2642 /* 2643 * Since we're using delayed interrupts, sweep up 2644 * before we report an error. 2645 */ 2646 WM_TX_LOCK(txq); 2647 wm_txeof(sc); 2648 WM_TX_UNLOCK(txq); 2649 2650 if (txq->txq_free != WM_NTXDESC(txq)) { 2651 #ifdef WM_DEBUG 2652 int i, j; 2653 struct wm_txsoft *txs; 2654 #endif 2655 log(LOG_ERR, 2656 "%s: device timeout (txfree %d txsfree %d txnext %d)\n", 2657 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree, 2658 txq->txq_next); 2659 ifp->if_oerrors++; 2660 #ifdef WM_DEBUG 2661 for (i = txq->txq_sdirty; i != txq->txq_snext ; 2662 i = WM_NEXTTXS(txq, i)) { 2663 txs = &txq->txq_soft[i]; 2664 printf("txs %d tx %d -> %d\n", 2665 i, txs->txs_firstdesc, txs->txs_lastdesc); 2666 for (j = txs->txs_firstdesc; ; 2667 j = WM_NEXTTX(txq, j)) { 2668 printf("\tdesc %d: 0x%" PRIx64 "\n", j, 2669 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr); 2670 printf("\t %#08x%08x\n", 2671 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields, 2672 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen); 2673 if (j == txs->txs_lastdesc) 2674 break; 2675 } 2676 } 2677 #endif 2678 /* Reset the interface. */ 2679 (void) wm_init(ifp); 2680 } 2681 2682 /* Try to get more packets going. */ 2683 ifp->if_start(ifp); 2684 } 2685 2686 /* 2687 * wm_tick: 2688 * 2689 * One second timer, used to check link status, sweep up 2690 * completed transmit jobs, etc. 2691 */ 2692 static void 2693 wm_tick(void *arg) 2694 { 2695 struct wm_softc *sc = arg; 2696 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2697 #ifndef WM_MPSAFE 2698 int s; 2699 2700 s = splnet(); 2701 #endif 2702 2703 WM_CORE_LOCK(sc); 2704 2705 if (sc->sc_stopping) 2706 goto out; 2707 2708 if (sc->sc_type >= WM_T_82542_2_1) { 2709 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC)); 2710 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC)); 2711 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC)); 2712 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC)); 2713 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC)); 2714 } 2715 2716 ifp->if_collisions += CSR_READ(sc, WMREG_COLC); 2717 ifp->if_ierrors += 0ULL + /* ensure quad_t */ 2718 + CSR_READ(sc, WMREG_CRCERRS) 2719 + CSR_READ(sc, WMREG_ALGNERRC) 2720 + CSR_READ(sc, WMREG_SYMERRC) 2721 + CSR_READ(sc, WMREG_RXERRC) 2722 + CSR_READ(sc, WMREG_SEC) 2723 + CSR_READ(sc, WMREG_CEXTERR) 2724 + CSR_READ(sc, WMREG_RLEC); 2725 ifp->if_iqdrops += CSR_READ(sc, WMREG_MPC) + CSR_READ(sc, WMREG_RNBC); 2726 2727 if (sc->sc_flags & WM_F_HAS_MII) 2728 mii_tick(&sc->sc_mii); 2729 else if ((sc->sc_type >= WM_T_82575) 2730 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 2731 wm_serdes_tick(sc); 2732 else 2733 wm_tbi_tick(sc); 2734 2735 out: 2736 WM_CORE_UNLOCK(sc); 2737 #ifndef WM_MPSAFE 2738 splx(s); 2739 #endif 2740 2741 if (!sc->sc_stopping) 2742 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc); 2743 } 2744 2745 static int 2746 wm_ifflags_cb(struct ethercom *ec) 2747 { 2748 struct ifnet *ifp = &ec->ec_if; 2749 struct wm_softc *sc = ifp->if_softc; 2750 int change = ifp->if_flags ^ sc->sc_if_flags; 2751 int rc = 0; 2752 2753 WM_CORE_LOCK(sc); 2754 2755 if (change != 0) 2756 sc->sc_if_flags = ifp->if_flags; 2757 2758 if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0) { 2759 rc = ENETRESET; 2760 goto out; 2761 } 2762 2763 if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0) 2764 wm_set_filter(sc); 2765 2766 wm_set_vlan(sc); 2767 2768 out: 2769 WM_CORE_UNLOCK(sc); 2770 2771 return rc; 2772 } 2773 2774 /* 2775 * wm_ioctl: [ifnet interface function] 2776 * 2777 * Handle control requests from the operator. 2778 */ 2779 static int 2780 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data) 2781 { 2782 struct wm_softc *sc = ifp->if_softc; 2783 struct ifreq *ifr = (struct ifreq *) data; 2784 struct ifaddr *ifa = (struct ifaddr *)data; 2785 struct sockaddr_dl *sdl; 2786 int s, error; 2787 2788 #ifndef WM_MPSAFE 2789 s = splnet(); 2790 #endif 2791 switch (cmd) { 2792 case SIOCSIFMEDIA: 2793 case SIOCGIFMEDIA: 2794 WM_CORE_LOCK(sc); 2795 /* Flow control requires full-duplex mode. */ 2796 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO || 2797 (ifr->ifr_media & IFM_FDX) == 0) 2798 ifr->ifr_media &= ~IFM_ETH_FMASK; 2799 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) { 2800 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) { 2801 /* We can do both TXPAUSE and RXPAUSE. */ 2802 ifr->ifr_media |= 2803 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 2804 } 2805 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK; 2806 } 2807 WM_CORE_UNLOCK(sc); 2808 #ifdef WM_MPSAFE 2809 s = splnet(); 2810 #endif 2811 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 2812 #ifdef WM_MPSAFE 2813 splx(s); 2814 #endif 2815 break; 2816 case SIOCINITIFADDR: 2817 WM_CORE_LOCK(sc); 2818 if (ifa->ifa_addr->sa_family == AF_LINK) { 2819 sdl = satosdl(ifp->if_dl->ifa_addr); 2820 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len, 2821 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen); 2822 /* unicast address is first multicast entry */ 2823 wm_set_filter(sc); 2824 error = 0; 2825 WM_CORE_UNLOCK(sc); 2826 break; 2827 } 2828 WM_CORE_UNLOCK(sc); 2829 /*FALLTHROUGH*/ 2830 default: 2831 #ifdef WM_MPSAFE 2832 s = splnet(); 2833 #endif 2834 /* It may call wm_start, so unlock here */ 2835 error = ether_ioctl(ifp, cmd, data); 2836 #ifdef WM_MPSAFE 2837 splx(s); 2838 #endif 2839 if (error != ENETRESET) 2840 break; 2841 2842 error = 0; 2843 2844 if (cmd == SIOCSIFCAP) { 2845 error = (*ifp->if_init)(ifp); 2846 } else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) 2847 ; 2848 else if (ifp->if_flags & IFF_RUNNING) { 2849 /* 2850 * Multicast list has changed; set the hardware filter 2851 * accordingly. 2852 */ 2853 WM_CORE_LOCK(sc); 2854 wm_set_filter(sc); 2855 WM_CORE_UNLOCK(sc); 2856 } 2857 break; 2858 } 2859 2860 #ifndef WM_MPSAFE 2861 splx(s); 2862 #endif 2863 return error; 2864 } 2865 2866 /* MAC address related */ 2867 2868 /* 2869 * Get the offset of MAC address and return it. 2870 * If error occured, use offset 0. 2871 */ 2872 static uint16_t 2873 wm_check_alt_mac_addr(struct wm_softc *sc) 2874 { 2875 uint16_t myea[ETHER_ADDR_LEN / 2]; 2876 uint16_t offset = NVM_OFF_MACADDR; 2877 2878 /* Try to read alternative MAC address pointer */ 2879 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0) 2880 return 0; 2881 2882 /* Check pointer if it's valid or not. */ 2883 if ((offset == 0x0000) || (offset == 0xffff)) 2884 return 0; 2885 2886 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid); 2887 /* 2888 * Check whether alternative MAC address is valid or not. 2889 * Some cards have non 0xffff pointer but those don't use 2890 * alternative MAC address in reality. 2891 * 2892 * Check whether the broadcast bit is set or not. 2893 */ 2894 if (wm_nvm_read(sc, offset, 1, myea) == 0) 2895 if (((myea[0] & 0xff) & 0x01) == 0) 2896 return offset; /* Found */ 2897 2898 /* Not found */ 2899 return 0; 2900 } 2901 2902 static int 2903 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr) 2904 { 2905 uint16_t myea[ETHER_ADDR_LEN / 2]; 2906 uint16_t offset = NVM_OFF_MACADDR; 2907 int do_invert = 0; 2908 2909 switch (sc->sc_type) { 2910 case WM_T_82580: 2911 case WM_T_I350: 2912 case WM_T_I354: 2913 /* EEPROM Top Level Partitioning */ 2914 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0; 2915 break; 2916 case WM_T_82571: 2917 case WM_T_82575: 2918 case WM_T_82576: 2919 case WM_T_80003: 2920 case WM_T_I210: 2921 case WM_T_I211: 2922 offset = wm_check_alt_mac_addr(sc); 2923 if (offset == 0) 2924 if ((sc->sc_funcid & 0x01) == 1) 2925 do_invert = 1; 2926 break; 2927 default: 2928 if ((sc->sc_funcid & 0x01) == 1) 2929 do_invert = 1; 2930 break; 2931 } 2932 2933 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), 2934 myea) != 0) 2935 goto bad; 2936 2937 enaddr[0] = myea[0] & 0xff; 2938 enaddr[1] = myea[0] >> 8; 2939 enaddr[2] = myea[1] & 0xff; 2940 enaddr[3] = myea[1] >> 8; 2941 enaddr[4] = myea[2] & 0xff; 2942 enaddr[5] = myea[2] >> 8; 2943 2944 /* 2945 * Toggle the LSB of the MAC address on the second port 2946 * of some dual port cards. 2947 */ 2948 if (do_invert != 0) 2949 enaddr[5] ^= 1; 2950 2951 return 0; 2952 2953 bad: 2954 return -1; 2955 } 2956 2957 /* 2958 * wm_set_ral: 2959 * 2960 * Set an entery in the receive address list. 2961 */ 2962 static void 2963 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx) 2964 { 2965 uint32_t ral_lo, ral_hi; 2966 2967 if (enaddr != NULL) { 2968 ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) | 2969 (enaddr[3] << 24); 2970 ral_hi = enaddr[4] | (enaddr[5] << 8); 2971 ral_hi |= RAL_AV; 2972 } else { 2973 ral_lo = 0; 2974 ral_hi = 0; 2975 } 2976 2977 if (sc->sc_type >= WM_T_82544) { 2978 CSR_WRITE(sc, WMREG_RAL_LO(WMREG_CORDOVA_RAL_BASE, idx), 2979 ral_lo); 2980 CSR_WRITE(sc, WMREG_RAL_HI(WMREG_CORDOVA_RAL_BASE, idx), 2981 ral_hi); 2982 } else { 2983 CSR_WRITE(sc, WMREG_RAL_LO(WMREG_RAL_BASE, idx), ral_lo); 2984 CSR_WRITE(sc, WMREG_RAL_HI(WMREG_RAL_BASE, idx), ral_hi); 2985 } 2986 } 2987 2988 /* 2989 * wm_mchash: 2990 * 2991 * Compute the hash of the multicast address for the 4096-bit 2992 * multicast filter. 2993 */ 2994 static uint32_t 2995 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr) 2996 { 2997 static const int lo_shift[4] = { 4, 3, 2, 0 }; 2998 static const int hi_shift[4] = { 4, 5, 6, 8 }; 2999 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 }; 3000 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 }; 3001 uint32_t hash; 3002 3003 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 3004 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 3005 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) { 3006 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) | 3007 (((uint16_t) enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]); 3008 return (hash & 0x3ff); 3009 } 3010 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) | 3011 (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]); 3012 3013 return (hash & 0xfff); 3014 } 3015 3016 /* 3017 * wm_set_filter: 3018 * 3019 * Set up the receive filter. 3020 */ 3021 static void 3022 wm_set_filter(struct wm_softc *sc) 3023 { 3024 struct ethercom *ec = &sc->sc_ethercom; 3025 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3026 struct ether_multi *enm; 3027 struct ether_multistep step; 3028 bus_addr_t mta_reg; 3029 uint32_t hash, reg, bit; 3030 int i, size; 3031 3032 if (sc->sc_type >= WM_T_82544) 3033 mta_reg = WMREG_CORDOVA_MTA; 3034 else 3035 mta_reg = WMREG_MTA; 3036 3037 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE); 3038 3039 if (ifp->if_flags & IFF_BROADCAST) 3040 sc->sc_rctl |= RCTL_BAM; 3041 if (ifp->if_flags & IFF_PROMISC) { 3042 sc->sc_rctl |= RCTL_UPE; 3043 goto allmulti; 3044 } 3045 3046 /* 3047 * Set the station address in the first RAL slot, and 3048 * clear the remaining slots. 3049 */ 3050 if (sc->sc_type == WM_T_ICH8) 3051 size = WM_RAL_TABSIZE_ICH8 -1; 3052 else if ((sc->sc_type == WM_T_ICH9) || (sc->sc_type == WM_T_ICH10) 3053 || (sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2) 3054 || (sc->sc_type == WM_T_PCH_LPT)) 3055 size = WM_RAL_TABSIZE_ICH8; 3056 else if (sc->sc_type == WM_T_82575) 3057 size = WM_RAL_TABSIZE_82575; 3058 else if ((sc->sc_type == WM_T_82576) || (sc->sc_type == WM_T_82580)) 3059 size = WM_RAL_TABSIZE_82576; 3060 else if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 3061 size = WM_RAL_TABSIZE_I350; 3062 else 3063 size = WM_RAL_TABSIZE; 3064 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0); 3065 for (i = 1; i < size; i++) 3066 wm_set_ral(sc, NULL, i); 3067 3068 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 3069 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 3070 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) 3071 size = WM_ICH8_MC_TABSIZE; 3072 else 3073 size = WM_MC_TABSIZE; 3074 /* Clear out the multicast table. */ 3075 for (i = 0; i < size; i++) 3076 CSR_WRITE(sc, mta_reg + (i << 2), 0); 3077 3078 ETHER_FIRST_MULTI(step, ec, enm); 3079 while (enm != NULL) { 3080 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 3081 /* 3082 * We must listen to a range of multicast addresses. 3083 * For now, just accept all multicasts, rather than 3084 * trying to set only those filter bits needed to match 3085 * the range. (At this time, the only use of address 3086 * ranges is for IP multicast routing, for which the 3087 * range is big enough to require all bits set.) 3088 */ 3089 goto allmulti; 3090 } 3091 3092 hash = wm_mchash(sc, enm->enm_addrlo); 3093 3094 reg = (hash >> 5); 3095 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 3096 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 3097 || (sc->sc_type == WM_T_PCH2) 3098 || (sc->sc_type == WM_T_PCH_LPT)) 3099 reg &= 0x1f; 3100 else 3101 reg &= 0x7f; 3102 bit = hash & 0x1f; 3103 3104 hash = CSR_READ(sc, mta_reg + (reg << 2)); 3105 hash |= 1U << bit; 3106 3107 /* XXX Hardware bug?? */ 3108 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) { 3109 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2)); 3110 CSR_WRITE(sc, mta_reg + (reg << 2), hash); 3111 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit); 3112 } else 3113 CSR_WRITE(sc, mta_reg + (reg << 2), hash); 3114 3115 ETHER_NEXT_MULTI(step, enm); 3116 } 3117 3118 ifp->if_flags &= ~IFF_ALLMULTI; 3119 goto setit; 3120 3121 allmulti: 3122 ifp->if_flags |= IFF_ALLMULTI; 3123 sc->sc_rctl |= RCTL_MPE; 3124 3125 setit: 3126 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl); 3127 } 3128 3129 /* Reset and init related */ 3130 3131 static void 3132 wm_set_vlan(struct wm_softc *sc) 3133 { 3134 /* Deal with VLAN enables. */ 3135 if (VLAN_ATTACHED(&sc->sc_ethercom)) 3136 sc->sc_ctrl |= CTRL_VME; 3137 else 3138 sc->sc_ctrl &= ~CTRL_VME; 3139 3140 /* Write the control registers. */ 3141 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 3142 } 3143 3144 static void 3145 wm_set_pcie_completion_timeout(struct wm_softc *sc) 3146 { 3147 uint32_t gcr; 3148 pcireg_t ctrl2; 3149 3150 gcr = CSR_READ(sc, WMREG_GCR); 3151 3152 /* Only take action if timeout value is defaulted to 0 */ 3153 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0) 3154 goto out; 3155 3156 if ((gcr & GCR_CAP_VER2) == 0) { 3157 gcr |= GCR_CMPL_TMOUT_10MS; 3158 goto out; 3159 } 3160 3161 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 3162 sc->sc_pcixe_capoff + PCIE_DCSR2); 3163 ctrl2 |= WM_PCIE_DCSR2_16MS; 3164 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 3165 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2); 3166 3167 out: 3168 /* Disable completion timeout resend */ 3169 gcr &= ~GCR_CMPL_TMOUT_RESEND; 3170 3171 CSR_WRITE(sc, WMREG_GCR, gcr); 3172 } 3173 3174 void 3175 wm_get_auto_rd_done(struct wm_softc *sc) 3176 { 3177 int i; 3178 3179 /* wait for eeprom to reload */ 3180 switch (sc->sc_type) { 3181 case WM_T_82571: 3182 case WM_T_82572: 3183 case WM_T_82573: 3184 case WM_T_82574: 3185 case WM_T_82583: 3186 case WM_T_82575: 3187 case WM_T_82576: 3188 case WM_T_82580: 3189 case WM_T_I350: 3190 case WM_T_I354: 3191 case WM_T_I210: 3192 case WM_T_I211: 3193 case WM_T_80003: 3194 case WM_T_ICH8: 3195 case WM_T_ICH9: 3196 for (i = 0; i < 10; i++) { 3197 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD) 3198 break; 3199 delay(1000); 3200 } 3201 if (i == 10) { 3202 log(LOG_ERR, "%s: auto read from eeprom failed to " 3203 "complete\n", device_xname(sc->sc_dev)); 3204 } 3205 break; 3206 default: 3207 break; 3208 } 3209 } 3210 3211 void 3212 wm_lan_init_done(struct wm_softc *sc) 3213 { 3214 uint32_t reg = 0; 3215 int i; 3216 3217 /* wait for eeprom to reload */ 3218 switch (sc->sc_type) { 3219 case WM_T_ICH10: 3220 case WM_T_PCH: 3221 case WM_T_PCH2: 3222 case WM_T_PCH_LPT: 3223 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) { 3224 reg = CSR_READ(sc, WMREG_STATUS); 3225 if ((reg & STATUS_LAN_INIT_DONE) != 0) 3226 break; 3227 delay(100); 3228 } 3229 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) { 3230 log(LOG_ERR, "%s: %s: lan_init_done failed to " 3231 "complete\n", device_xname(sc->sc_dev), __func__); 3232 } 3233 break; 3234 default: 3235 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 3236 __func__); 3237 break; 3238 } 3239 3240 reg &= ~STATUS_LAN_INIT_DONE; 3241 CSR_WRITE(sc, WMREG_STATUS, reg); 3242 } 3243 3244 void 3245 wm_get_cfg_done(struct wm_softc *sc) 3246 { 3247 int mask; 3248 uint32_t reg; 3249 int i; 3250 3251 /* wait for eeprom to reload */ 3252 switch (sc->sc_type) { 3253 case WM_T_82542_2_0: 3254 case WM_T_82542_2_1: 3255 /* null */ 3256 break; 3257 case WM_T_82543: 3258 case WM_T_82544: 3259 case WM_T_82540: 3260 case WM_T_82545: 3261 case WM_T_82545_3: 3262 case WM_T_82546: 3263 case WM_T_82546_3: 3264 case WM_T_82541: 3265 case WM_T_82541_2: 3266 case WM_T_82547: 3267 case WM_T_82547_2: 3268 case WM_T_82573: 3269 case WM_T_82574: 3270 case WM_T_82583: 3271 /* generic */ 3272 delay(10*1000); 3273 break; 3274 case WM_T_80003: 3275 case WM_T_82571: 3276 case WM_T_82572: 3277 case WM_T_82575: 3278 case WM_T_82576: 3279 case WM_T_82580: 3280 case WM_T_I350: 3281 case WM_T_I354: 3282 case WM_T_I210: 3283 case WM_T_I211: 3284 if (sc->sc_type == WM_T_82571) { 3285 /* Only 82571 shares port 0 */ 3286 mask = EEMNGCTL_CFGDONE_0; 3287 } else 3288 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid; 3289 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) { 3290 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask) 3291 break; 3292 delay(1000); 3293 } 3294 if (i >= WM_PHY_CFG_TIMEOUT) { 3295 DPRINTF(WM_DEBUG_GMII, ("%s: %s failed\n", 3296 device_xname(sc->sc_dev), __func__)); 3297 } 3298 break; 3299 case WM_T_ICH8: 3300 case WM_T_ICH9: 3301 case WM_T_ICH10: 3302 case WM_T_PCH: 3303 case WM_T_PCH2: 3304 case WM_T_PCH_LPT: 3305 delay(10*1000); 3306 if (sc->sc_type >= WM_T_ICH10) 3307 wm_lan_init_done(sc); 3308 else 3309 wm_get_auto_rd_done(sc); 3310 3311 reg = CSR_READ(sc, WMREG_STATUS); 3312 if ((reg & STATUS_PHYRA) != 0) 3313 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA); 3314 break; 3315 default: 3316 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 3317 __func__); 3318 break; 3319 } 3320 } 3321 3322 /* Init hardware bits */ 3323 void 3324 wm_initialize_hardware_bits(struct wm_softc *sc) 3325 { 3326 uint32_t tarc0, tarc1, reg; 3327 3328 /* For 82571 variant, 80003 and ICHs */ 3329 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583)) 3330 || (sc->sc_type >= WM_T_80003)) { 3331 3332 /* Transmit Descriptor Control 0 */ 3333 reg = CSR_READ(sc, WMREG_TXDCTL(0)); 3334 reg |= TXDCTL_COUNT_DESC; 3335 CSR_WRITE(sc, WMREG_TXDCTL(0), reg); 3336 3337 /* Transmit Descriptor Control 1 */ 3338 reg = CSR_READ(sc, WMREG_TXDCTL(1)); 3339 reg |= TXDCTL_COUNT_DESC; 3340 CSR_WRITE(sc, WMREG_TXDCTL(1), reg); 3341 3342 /* TARC0 */ 3343 tarc0 = CSR_READ(sc, WMREG_TARC0); 3344 switch (sc->sc_type) { 3345 case WM_T_82571: 3346 case WM_T_82572: 3347 case WM_T_82573: 3348 case WM_T_82574: 3349 case WM_T_82583: 3350 case WM_T_80003: 3351 /* Clear bits 30..27 */ 3352 tarc0 &= ~__BITS(30, 27); 3353 break; 3354 default: 3355 break; 3356 } 3357 3358 switch (sc->sc_type) { 3359 case WM_T_82571: 3360 case WM_T_82572: 3361 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */ 3362 3363 tarc1 = CSR_READ(sc, WMREG_TARC1); 3364 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */ 3365 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */ 3366 /* 8257[12] Errata No.7 */ 3367 tarc1 |= __BIT(22); /* TARC1 bits 22 */ 3368 3369 /* TARC1 bit 28 */ 3370 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 3371 tarc1 &= ~__BIT(28); 3372 else 3373 tarc1 |= __BIT(28); 3374 CSR_WRITE(sc, WMREG_TARC1, tarc1); 3375 3376 /* 3377 * 8257[12] Errata No.13 3378 * Disable Dyamic Clock Gating. 3379 */ 3380 reg = CSR_READ(sc, WMREG_CTRL_EXT); 3381 reg &= ~CTRL_EXT_DMA_DYN_CLK; 3382 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3383 break; 3384 case WM_T_82573: 3385 case WM_T_82574: 3386 case WM_T_82583: 3387 if ((sc->sc_type == WM_T_82574) 3388 || (sc->sc_type == WM_T_82583)) 3389 tarc0 |= __BIT(26); /* TARC0 bit 26 */ 3390 3391 /* Extended Device Control */ 3392 reg = CSR_READ(sc, WMREG_CTRL_EXT); 3393 reg &= ~__BIT(23); /* Clear bit 23 */ 3394 reg |= __BIT(22); /* Set bit 22 */ 3395 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3396 3397 /* Device Control */ 3398 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */ 3399 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 3400 3401 /* PCIe Control Register */ 3402 /* 3403 * 82573 Errata (unknown). 3404 * 3405 * 82574 Errata 25 and 82583 Errata 12 3406 * "Dropped Rx Packets": 3407 * NVM Image Version 2.1.4 and newer has no this bug. 3408 */ 3409 reg = CSR_READ(sc, WMREG_GCR); 3410 reg |= GCR_L1_ACT_WITHOUT_L0S_RX; 3411 CSR_WRITE(sc, WMREG_GCR, reg); 3412 3413 if ((sc->sc_type == WM_T_82574) 3414 || (sc->sc_type == WM_T_82583)) { 3415 /* 3416 * Document says this bit must be set for 3417 * proper operation. 3418 */ 3419 reg = CSR_READ(sc, WMREG_GCR); 3420 reg |= __BIT(22); 3421 CSR_WRITE(sc, WMREG_GCR, reg); 3422 3423 /* 3424 * Apply workaround for hardware errata 3425 * documented in errata docs Fixes issue where 3426 * some error prone or unreliable PCIe 3427 * completions are occurring, particularly 3428 * with ASPM enabled. Without fix, issue can 3429 * cause Tx timeouts. 3430 */ 3431 reg = CSR_READ(sc, WMREG_GCR2); 3432 reg |= __BIT(0); 3433 CSR_WRITE(sc, WMREG_GCR2, reg); 3434 } 3435 break; 3436 case WM_T_80003: 3437 /* TARC0 */ 3438 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER) 3439 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 3440 tarc0 &= ~__BIT(20); /* Clear bits 20 */ 3441 3442 /* TARC1 bit 28 */ 3443 tarc1 = CSR_READ(sc, WMREG_TARC1); 3444 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 3445 tarc1 &= ~__BIT(28); 3446 else 3447 tarc1 |= __BIT(28); 3448 CSR_WRITE(sc, WMREG_TARC1, tarc1); 3449 break; 3450 case WM_T_ICH8: 3451 case WM_T_ICH9: 3452 case WM_T_ICH10: 3453 case WM_T_PCH: 3454 case WM_T_PCH2: 3455 case WM_T_PCH_LPT: 3456 /* TARC 0 */ 3457 if (sc->sc_type == WM_T_ICH8) { 3458 /* Set TARC0 bits 29 and 28 */ 3459 tarc0 |= __BITS(29, 28); 3460 } 3461 /* Set TARC0 bits 23,24,26,27 */ 3462 tarc0 |= __BITS(27, 26) | __BITS(24, 23); 3463 3464 /* CTRL_EXT */ 3465 reg = CSR_READ(sc, WMREG_CTRL_EXT); 3466 reg |= __BIT(22); /* Set bit 22 */ 3467 /* 3468 * Enable PHY low-power state when MAC is at D3 3469 * w/o WoL 3470 */ 3471 if (sc->sc_type >= WM_T_PCH) 3472 reg |= CTRL_EXT_PHYPDEN; 3473 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3474 3475 /* TARC1 */ 3476 tarc1 = CSR_READ(sc, WMREG_TARC1); 3477 /* bit 28 */ 3478 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0) 3479 tarc1 &= ~__BIT(28); 3480 else 3481 tarc1 |= __BIT(28); 3482 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30); 3483 CSR_WRITE(sc, WMREG_TARC1, tarc1); 3484 3485 /* Device Status */ 3486 if (sc->sc_type == WM_T_ICH8) { 3487 reg = CSR_READ(sc, WMREG_STATUS); 3488 reg &= ~__BIT(31); 3489 CSR_WRITE(sc, WMREG_STATUS, reg); 3490 3491 } 3492 3493 /* 3494 * Work-around descriptor data corruption issue during 3495 * NFS v2 UDP traffic, just disable the NFS filtering 3496 * capability. 3497 */ 3498 reg = CSR_READ(sc, WMREG_RFCTL); 3499 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS; 3500 CSR_WRITE(sc, WMREG_RFCTL, reg); 3501 break; 3502 default: 3503 break; 3504 } 3505 CSR_WRITE(sc, WMREG_TARC0, tarc0); 3506 3507 /* 3508 * 8257[12] Errata No.52 and some others. 3509 * Avoid RSS Hash Value bug. 3510 */ 3511 switch (sc->sc_type) { 3512 case WM_T_82571: 3513 case WM_T_82572: 3514 case WM_T_82573: 3515 case WM_T_80003: 3516 case WM_T_ICH8: 3517 reg = CSR_READ(sc, WMREG_RFCTL); 3518 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS; 3519 CSR_WRITE(sc, WMREG_RFCTL, reg); 3520 break; 3521 default: 3522 break; 3523 } 3524 } 3525 } 3526 3527 static uint32_t 3528 wm_rxpbs_adjust_82580(uint32_t val) 3529 { 3530 uint32_t rv = 0; 3531 3532 if (val < __arraycount(wm_82580_rxpbs_table)) 3533 rv = wm_82580_rxpbs_table[val]; 3534 3535 return rv; 3536 } 3537 3538 /* 3539 * wm_reset: 3540 * 3541 * Reset the i82542 chip. 3542 */ 3543 static void 3544 wm_reset(struct wm_softc *sc) 3545 { 3546 int phy_reset = 0; 3547 int i, error = 0; 3548 uint32_t reg, mask; 3549 3550 /* 3551 * Allocate on-chip memory according to the MTU size. 3552 * The Packet Buffer Allocation register must be written 3553 * before the chip is reset. 3554 */ 3555 switch (sc->sc_type) { 3556 case WM_T_82547: 3557 case WM_T_82547_2: 3558 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ? 3559 PBA_22K : PBA_30K; 3560 for (i = 0; i < sc->sc_ntxqueues; i++) { 3561 struct wm_txqueue *txq = &sc->sc_txq[i]; 3562 txq->txq_fifo_head = 0; 3563 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT; 3564 txq->txq_fifo_size = 3565 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT; 3566 txq->txq_fifo_stall = 0; 3567 } 3568 break; 3569 case WM_T_82571: 3570 case WM_T_82572: 3571 case WM_T_82575: /* XXX need special handing for jumbo frames */ 3572 case WM_T_80003: 3573 sc->sc_pba = PBA_32K; 3574 break; 3575 case WM_T_82573: 3576 sc->sc_pba = PBA_12K; 3577 break; 3578 case WM_T_82574: 3579 case WM_T_82583: 3580 sc->sc_pba = PBA_20K; 3581 break; 3582 case WM_T_82576: 3583 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS); 3584 sc->sc_pba &= RXPBS_SIZE_MASK_82576; 3585 break; 3586 case WM_T_82580: 3587 case WM_T_I350: 3588 case WM_T_I354: 3589 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS)); 3590 break; 3591 case WM_T_I210: 3592 case WM_T_I211: 3593 sc->sc_pba = PBA_34K; 3594 break; 3595 case WM_T_ICH8: 3596 /* Workaround for a bit corruption issue in FIFO memory */ 3597 sc->sc_pba = PBA_8K; 3598 CSR_WRITE(sc, WMREG_PBS, PBA_16K); 3599 break; 3600 case WM_T_ICH9: 3601 case WM_T_ICH10: 3602 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ? 3603 PBA_14K : PBA_10K; 3604 break; 3605 case WM_T_PCH: 3606 case WM_T_PCH2: 3607 case WM_T_PCH_LPT: 3608 sc->sc_pba = PBA_26K; 3609 break; 3610 default: 3611 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ? 3612 PBA_40K : PBA_48K; 3613 break; 3614 } 3615 /* 3616 * Only old or non-multiqueue devices have the PBA register 3617 * XXX Need special handling for 82575. 3618 */ 3619 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0) 3620 || (sc->sc_type == WM_T_82575)) 3621 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba); 3622 3623 /* Prevent the PCI-E bus from sticking */ 3624 if (sc->sc_flags & WM_F_PCIE) { 3625 int timeout = 800; 3626 3627 sc->sc_ctrl |= CTRL_GIO_M_DIS; 3628 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 3629 3630 while (timeout--) { 3631 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA) 3632 == 0) 3633 break; 3634 delay(100); 3635 } 3636 } 3637 3638 /* Set the completion timeout for interface */ 3639 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 3640 || (sc->sc_type == WM_T_82580) 3641 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 3642 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) 3643 wm_set_pcie_completion_timeout(sc); 3644 3645 /* Clear interrupt */ 3646 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 3647 if (sc->sc_nintrs > 1) { 3648 if (sc->sc_type != WM_T_82574) { 3649 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 3650 CSR_WRITE(sc, WMREG_EIAC, 0); 3651 } else { 3652 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 3653 } 3654 } 3655 3656 /* Stop the transmit and receive processes. */ 3657 CSR_WRITE(sc, WMREG_RCTL, 0); 3658 sc->sc_rctl &= ~RCTL_EN; 3659 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP); 3660 CSR_WRITE_FLUSH(sc); 3661 3662 /* XXX set_tbi_sbp_82543() */ 3663 3664 delay(10*1000); 3665 3666 /* Must acquire the MDIO ownership before MAC reset */ 3667 switch (sc->sc_type) { 3668 case WM_T_82573: 3669 case WM_T_82574: 3670 case WM_T_82583: 3671 error = wm_get_hw_semaphore_82573(sc); 3672 break; 3673 default: 3674 break; 3675 } 3676 3677 /* 3678 * 82541 Errata 29? & 82547 Errata 28? 3679 * See also the description about PHY_RST bit in CTRL register 3680 * in 8254x_GBe_SDM.pdf. 3681 */ 3682 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) { 3683 CSR_WRITE(sc, WMREG_CTRL, 3684 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET); 3685 CSR_WRITE_FLUSH(sc); 3686 delay(5000); 3687 } 3688 3689 switch (sc->sc_type) { 3690 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */ 3691 case WM_T_82541: 3692 case WM_T_82541_2: 3693 case WM_T_82547: 3694 case WM_T_82547_2: 3695 /* 3696 * On some chipsets, a reset through a memory-mapped write 3697 * cycle can cause the chip to reset before completing the 3698 * write cycle. This causes major headache that can be 3699 * avoided by issuing the reset via indirect register writes 3700 * through I/O space. 3701 * 3702 * So, if we successfully mapped the I/O BAR at attach time, 3703 * use that. Otherwise, try our luck with a memory-mapped 3704 * reset. 3705 */ 3706 if (sc->sc_flags & WM_F_IOH_VALID) 3707 wm_io_write(sc, WMREG_CTRL, CTRL_RST); 3708 else 3709 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST); 3710 break; 3711 case WM_T_82545_3: 3712 case WM_T_82546_3: 3713 /* Use the shadow control register on these chips. */ 3714 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST); 3715 break; 3716 case WM_T_80003: 3717 mask = swfwphysem[sc->sc_funcid]; 3718 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST; 3719 wm_get_swfw_semaphore(sc, mask); 3720 CSR_WRITE(sc, WMREG_CTRL, reg); 3721 wm_put_swfw_semaphore(sc, mask); 3722 break; 3723 case WM_T_ICH8: 3724 case WM_T_ICH9: 3725 case WM_T_ICH10: 3726 case WM_T_PCH: 3727 case WM_T_PCH2: 3728 case WM_T_PCH_LPT: 3729 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST; 3730 if (wm_check_reset_block(sc) == 0) { 3731 /* 3732 * Gate automatic PHY configuration by hardware on 3733 * non-managed 82579 3734 */ 3735 if ((sc->sc_type == WM_T_PCH2) 3736 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) 3737 == 0)) 3738 wm_gate_hw_phy_config_ich8lan(sc, 1); 3739 3740 reg |= CTRL_PHY_RESET; 3741 phy_reset = 1; 3742 } 3743 wm_get_swfwhw_semaphore(sc); 3744 CSR_WRITE(sc, WMREG_CTRL, reg); 3745 /* Don't insert a completion barrier when reset */ 3746 delay(20*1000); 3747 wm_put_swfwhw_semaphore(sc); 3748 break; 3749 case WM_T_82580: 3750 case WM_T_I350: 3751 case WM_T_I354: 3752 case WM_T_I210: 3753 case WM_T_I211: 3754 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST); 3755 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII) 3756 CSR_WRITE_FLUSH(sc); 3757 delay(5000); 3758 break; 3759 case WM_T_82542_2_0: 3760 case WM_T_82542_2_1: 3761 case WM_T_82543: 3762 case WM_T_82540: 3763 case WM_T_82545: 3764 case WM_T_82546: 3765 case WM_T_82571: 3766 case WM_T_82572: 3767 case WM_T_82573: 3768 case WM_T_82574: 3769 case WM_T_82575: 3770 case WM_T_82576: 3771 case WM_T_82583: 3772 default: 3773 /* Everything else can safely use the documented method. */ 3774 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST); 3775 break; 3776 } 3777 3778 /* Must release the MDIO ownership after MAC reset */ 3779 switch (sc->sc_type) { 3780 case WM_T_82573: 3781 case WM_T_82574: 3782 case WM_T_82583: 3783 if (error == 0) 3784 wm_put_hw_semaphore_82573(sc); 3785 break; 3786 default: 3787 break; 3788 } 3789 3790 if (phy_reset != 0) 3791 wm_get_cfg_done(sc); 3792 3793 /* reload EEPROM */ 3794 switch (sc->sc_type) { 3795 case WM_T_82542_2_0: 3796 case WM_T_82542_2_1: 3797 case WM_T_82543: 3798 case WM_T_82544: 3799 delay(10); 3800 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST; 3801 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3802 CSR_WRITE_FLUSH(sc); 3803 delay(2000); 3804 break; 3805 case WM_T_82540: 3806 case WM_T_82545: 3807 case WM_T_82545_3: 3808 case WM_T_82546: 3809 case WM_T_82546_3: 3810 delay(5*1000); 3811 /* XXX Disable HW ARPs on ASF enabled adapters */ 3812 break; 3813 case WM_T_82541: 3814 case WM_T_82541_2: 3815 case WM_T_82547: 3816 case WM_T_82547_2: 3817 delay(20000); 3818 /* XXX Disable HW ARPs on ASF enabled adapters */ 3819 break; 3820 case WM_T_82571: 3821 case WM_T_82572: 3822 case WM_T_82573: 3823 case WM_T_82574: 3824 case WM_T_82583: 3825 if (sc->sc_flags & WM_F_EEPROM_FLASH) { 3826 delay(10); 3827 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST; 3828 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 3829 CSR_WRITE_FLUSH(sc); 3830 } 3831 /* check EECD_EE_AUTORD */ 3832 wm_get_auto_rd_done(sc); 3833 /* 3834 * Phy configuration from NVM just starts after EECD_AUTO_RD 3835 * is set. 3836 */ 3837 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574) 3838 || (sc->sc_type == WM_T_82583)) 3839 delay(25*1000); 3840 break; 3841 case WM_T_82575: 3842 case WM_T_82576: 3843 case WM_T_82580: 3844 case WM_T_I350: 3845 case WM_T_I354: 3846 case WM_T_I210: 3847 case WM_T_I211: 3848 case WM_T_80003: 3849 /* check EECD_EE_AUTORD */ 3850 wm_get_auto_rd_done(sc); 3851 break; 3852 case WM_T_ICH8: 3853 case WM_T_ICH9: 3854 case WM_T_ICH10: 3855 case WM_T_PCH: 3856 case WM_T_PCH2: 3857 case WM_T_PCH_LPT: 3858 break; 3859 default: 3860 panic("%s: unknown type\n", __func__); 3861 } 3862 3863 /* Check whether EEPROM is present or not */ 3864 switch (sc->sc_type) { 3865 case WM_T_82575: 3866 case WM_T_82576: 3867 case WM_T_82580: 3868 case WM_T_I350: 3869 case WM_T_I354: 3870 case WM_T_ICH8: 3871 case WM_T_ICH9: 3872 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) { 3873 /* Not found */ 3874 sc->sc_flags |= WM_F_EEPROM_INVALID; 3875 if (sc->sc_type == WM_T_82575) 3876 wm_reset_init_script_82575(sc); 3877 } 3878 break; 3879 default: 3880 break; 3881 } 3882 3883 if ((sc->sc_type == WM_T_82580) 3884 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) { 3885 /* clear global device reset status bit */ 3886 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET); 3887 } 3888 3889 /* Clear any pending interrupt events. */ 3890 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 3891 reg = CSR_READ(sc, WMREG_ICR); 3892 if (sc->sc_nintrs > 1) { 3893 if (sc->sc_type != WM_T_82574) { 3894 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 3895 CSR_WRITE(sc, WMREG_EIAC, 0); 3896 } else 3897 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 3898 } 3899 3900 /* reload sc_ctrl */ 3901 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 3902 3903 if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211)) 3904 wm_set_eee_i350(sc); 3905 3906 /* dummy read from WUC */ 3907 if (sc->sc_type == WM_T_PCH) 3908 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, BM_WUC); 3909 /* 3910 * For PCH, this write will make sure that any noise will be detected 3911 * as a CRC error and be dropped rather than show up as a bad packet 3912 * to the DMA engine 3913 */ 3914 if (sc->sc_type == WM_T_PCH) 3915 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565); 3916 3917 if (sc->sc_type >= WM_T_82544) 3918 CSR_WRITE(sc, WMREG_WUC, 0); 3919 3920 wm_reset_mdicnfg_82580(sc); 3921 3922 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0) 3923 wm_pll_workaround_i210(sc); 3924 } 3925 3926 /* 3927 * wm_add_rxbuf: 3928 * 3929 * Add a receive buffer to the indiciated descriptor. 3930 */ 3931 static int 3932 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx) 3933 { 3934 struct wm_softc *sc = rxq->rxq_sc; 3935 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx]; 3936 struct mbuf *m; 3937 int error; 3938 3939 KASSERT(WM_RX_LOCKED(rxq)); 3940 3941 MGETHDR(m, M_DONTWAIT, MT_DATA); 3942 if (m == NULL) 3943 return ENOBUFS; 3944 3945 MCLGET(m, M_DONTWAIT); 3946 if ((m->m_flags & M_EXT) == 0) { 3947 m_freem(m); 3948 return ENOBUFS; 3949 } 3950 3951 if (rxs->rxs_mbuf != NULL) 3952 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 3953 3954 rxs->rxs_mbuf = m; 3955 3956 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; 3957 error = bus_dmamap_load_mbuf(sc->sc_dmat, rxs->rxs_dmamap, m, 3958 BUS_DMA_READ|BUS_DMA_NOWAIT); 3959 if (error) { 3960 /* XXX XXX XXX */ 3961 aprint_error_dev(sc->sc_dev, 3962 "unable to load rx DMA map %d, error = %d\n", 3963 idx, error); 3964 panic("wm_add_rxbuf"); 3965 } 3966 3967 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 3968 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 3969 3970 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 3971 if ((sc->sc_rctl & RCTL_EN) != 0) 3972 wm_init_rxdesc(rxq, idx); 3973 } else 3974 wm_init_rxdesc(rxq, idx); 3975 3976 return 0; 3977 } 3978 3979 /* 3980 * wm_rxdrain: 3981 * 3982 * Drain the receive queue. 3983 */ 3984 static void 3985 wm_rxdrain(struct wm_rxqueue *rxq) 3986 { 3987 struct wm_softc *sc = rxq->rxq_sc; 3988 struct wm_rxsoft *rxs; 3989 int i; 3990 3991 KASSERT(WM_RX_LOCKED(rxq)); 3992 3993 for (i = 0; i < WM_NRXDESC; i++) { 3994 rxs = &rxq->rxq_soft[i]; 3995 if (rxs->rxs_mbuf != NULL) { 3996 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 3997 m_freem(rxs->rxs_mbuf); 3998 rxs->rxs_mbuf = NULL; 3999 } 4000 } 4001 } 4002 4003 4004 /* 4005 * XXX copy from FreeBSD's sys/net/rss_config.c 4006 */ 4007 /* 4008 * RSS secret key, intended to prevent attacks on load-balancing. Its 4009 * effectiveness may be limited by algorithm choice and available entropy 4010 * during the boot. 4011 * 4012 * XXXRW: And that we don't randomize it yet! 4013 * 4014 * This is the default Microsoft RSS specification key which is also 4015 * the Chelsio T5 firmware default key. 4016 */ 4017 #define RSS_KEYSIZE 40 4018 static uint8_t wm_rss_key[RSS_KEYSIZE] = { 4019 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2, 4020 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0, 4021 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4, 4022 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c, 4023 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa, 4024 }; 4025 4026 /* 4027 * Caller must pass an array of size sizeof(rss_key). 4028 * 4029 * XXX 4030 * As if_ixgbe may use this function, this function should not be 4031 * if_wm specific function. 4032 */ 4033 static void 4034 wm_rss_getkey(uint8_t *key) 4035 { 4036 4037 memcpy(key, wm_rss_key, sizeof(wm_rss_key)); 4038 } 4039 4040 /* 4041 * Setup registers for RSS. 4042 * 4043 * XXX not yet VMDq support 4044 */ 4045 static void 4046 wm_init_rss(struct wm_softc *sc) 4047 { 4048 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS]; 4049 int i; 4050 4051 CTASSERT(sizeof(rss_key) == sizeof(wm_rss_key)); 4052 4053 for (i = 0; i < RETA_NUM_ENTRIES; i++) { 4054 int qid, reta_ent; 4055 4056 qid = i % sc->sc_nrxqueues; 4057 switch(sc->sc_type) { 4058 case WM_T_82574: 4059 reta_ent = __SHIFTIN(qid, 4060 RETA_ENT_QINDEX_MASK_82574); 4061 break; 4062 case WM_T_82575: 4063 reta_ent = __SHIFTIN(qid, 4064 RETA_ENT_QINDEX1_MASK_82575); 4065 break; 4066 default: 4067 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK); 4068 break; 4069 } 4070 4071 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i)); 4072 reta_reg &= ~RETA_ENTRY_MASK_Q(i); 4073 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i)); 4074 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg); 4075 } 4076 4077 wm_rss_getkey((uint8_t *)rss_key); 4078 for (i = 0; i < RSSRK_NUM_REGS; i++) 4079 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]); 4080 4081 if (sc->sc_type == WM_T_82574) 4082 mrqc = MRQC_ENABLE_RSS_MQ_82574; 4083 else 4084 mrqc = MRQC_ENABLE_RSS_MQ; 4085 4086 /* XXXX 4087 * The same as FreeBSD igb. 4088 * Why doesn't use MRQC_RSS_FIELD_IPV6_EX? 4089 */ 4090 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP); 4091 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP); 4092 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP); 4093 mrqc |= (MRQC_RSS_FIELD_IPV6_UDP_EX | MRQC_RSS_FIELD_IPV6_TCP_EX); 4094 4095 CSR_WRITE(sc, WMREG_MRQC, mrqc); 4096 } 4097 4098 /* 4099 * Adjust TX and RX queue numbers which the system actulally uses. 4100 * 4101 * The numbers are affected by below parameters. 4102 * - The nubmer of hardware queues 4103 * - The number of MSI-X vectors (= "nvectors" argument) 4104 * - ncpu 4105 */ 4106 static void 4107 wm_adjust_qnum(struct wm_softc *sc, int nvectors) 4108 { 4109 int hw_ntxqueues, hw_nrxqueues; 4110 4111 if (nvectors < 3) { 4112 sc->sc_ntxqueues = 1; 4113 sc->sc_nrxqueues = 1; 4114 return; 4115 } 4116 4117 switch(sc->sc_type) { 4118 case WM_T_82572: 4119 hw_ntxqueues = 2; 4120 hw_nrxqueues = 2; 4121 break; 4122 case WM_T_82574: 4123 hw_ntxqueues = 2; 4124 hw_nrxqueues = 2; 4125 break; 4126 case WM_T_82575: 4127 hw_ntxqueues = 4; 4128 hw_nrxqueues = 4; 4129 break; 4130 case WM_T_82576: 4131 hw_ntxqueues = 16; 4132 hw_nrxqueues = 16; 4133 break; 4134 case WM_T_82580: 4135 case WM_T_I350: 4136 case WM_T_I354: 4137 hw_ntxqueues = 8; 4138 hw_nrxqueues = 8; 4139 break; 4140 case WM_T_I210: 4141 hw_ntxqueues = 4; 4142 hw_nrxqueues = 4; 4143 break; 4144 case WM_T_I211: 4145 hw_ntxqueues = 2; 4146 hw_nrxqueues = 2; 4147 break; 4148 /* 4149 * As below ethernet controllers does not support MSI-X, 4150 * this driver let them not use multiqueue. 4151 * - WM_T_80003 4152 * - WM_T_ICH8 4153 * - WM_T_ICH9 4154 * - WM_T_ICH10 4155 * - WM_T_PCH 4156 * - WM_T_PCH2 4157 * - WM_T_PCH_LPT 4158 */ 4159 default: 4160 hw_ntxqueues = 1; 4161 hw_nrxqueues = 1; 4162 break; 4163 } 4164 4165 /* 4166 * As queues more then MSI-X vectors cannot improve scaling, we limit 4167 * the number of queues used actually. 4168 * 4169 * XXX 4170 * Currently, we separate TX queue interrupts and RX queue interrupts. 4171 * Howerver, the number of MSI-X vectors of recent controllers (such as 4172 * I354) expects that drivers bundle a TX queue interrupt and a RX 4173 * interrupt to one interrupt. e.g. FreeBSD's igb deals interrupts in 4174 * such a way. 4175 */ 4176 if (nvectors < hw_ntxqueues + hw_nrxqueues + 1) { 4177 sc->sc_ntxqueues = (nvectors - 1) / 2; 4178 sc->sc_nrxqueues = (nvectors - 1) / 2; 4179 } else { 4180 sc->sc_ntxqueues = hw_ntxqueues; 4181 sc->sc_nrxqueues = hw_nrxqueues; 4182 } 4183 4184 /* 4185 * As queues more then cpus cannot improve scaling, we limit 4186 * the number of queues used actually. 4187 */ 4188 if (ncpu < sc->sc_ntxqueues) 4189 sc->sc_ntxqueues = ncpu; 4190 if (ncpu < sc->sc_nrxqueues) 4191 sc->sc_nrxqueues = ncpu; 4192 4193 /* XXX Currently, this driver supports RX multiqueue only. */ 4194 sc->sc_ntxqueues = 1; 4195 } 4196 4197 /* 4198 * Both single interrupt MSI and INTx can use this function. 4199 */ 4200 static int 4201 wm_setup_legacy(struct wm_softc *sc) 4202 { 4203 pci_chipset_tag_t pc = sc->sc_pc; 4204 const char *intrstr = NULL; 4205 char intrbuf[PCI_INTRSTR_LEN]; 4206 int error; 4207 4208 error = wm_alloc_txrx_queues(sc); 4209 if (error) { 4210 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n", 4211 error); 4212 return ENOMEM; 4213 } 4214 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf, 4215 sizeof(intrbuf)); 4216 #ifdef WM_MPSAFE 4217 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true); 4218 #endif 4219 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0], 4220 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev)); 4221 if (sc->sc_ihs[0] == NULL) { 4222 aprint_error_dev(sc->sc_dev,"unable to establish %s\n", 4223 (pci_intr_type(sc->sc_intrs[0]) 4224 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx"); 4225 return ENOMEM; 4226 } 4227 4228 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr); 4229 sc->sc_nintrs = 1; 4230 return 0; 4231 } 4232 4233 static int 4234 wm_setup_msix(struct wm_softc *sc) 4235 { 4236 void *vih; 4237 kcpuset_t *affinity; 4238 int qidx, error, intr_idx, tx_established, rx_established; 4239 pci_chipset_tag_t pc = sc->sc_pc; 4240 const char *intrstr = NULL; 4241 char intrbuf[PCI_INTRSTR_LEN]; 4242 char intr_xname[INTRDEVNAMEBUF]; 4243 /* 4244 * To avoid other devices' interrupts, the affinity of Tx/Rx interrupts 4245 * start from CPU#1. 4246 */ 4247 int affinity_offset = 1; 4248 4249 error = wm_alloc_txrx_queues(sc); 4250 if (error) { 4251 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n", 4252 error); 4253 return ENOMEM; 4254 } 4255 4256 kcpuset_create(&affinity, false); 4257 intr_idx = 0; 4258 4259 /* 4260 * TX 4261 */ 4262 tx_established = 0; 4263 for (qidx = 0; qidx < sc->sc_ntxqueues; qidx++) { 4264 struct wm_txqueue *txq = &sc->sc_txq[qidx]; 4265 int affinity_to = (affinity_offset + intr_idx) % ncpu; 4266 4267 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 4268 sizeof(intrbuf)); 4269 #ifdef WM_MPSAFE 4270 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], 4271 PCI_INTR_MPSAFE, true); 4272 #endif 4273 memset(intr_xname, 0, sizeof(intr_xname)); 4274 snprintf(intr_xname, sizeof(intr_xname), "%sTX%d", 4275 device_xname(sc->sc_dev), qidx); 4276 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 4277 IPL_NET, wm_txintr_msix, txq, intr_xname); 4278 if (vih == NULL) { 4279 aprint_error_dev(sc->sc_dev, 4280 "unable to establish MSI-X(for TX)%s%s\n", 4281 intrstr ? " at " : "", 4282 intrstr ? intrstr : ""); 4283 4284 goto fail_0; 4285 } 4286 kcpuset_zero(affinity); 4287 /* Round-robin affinity */ 4288 kcpuset_set(affinity, affinity_to); 4289 error = interrupt_distribute(vih, affinity, NULL); 4290 if (error == 0) { 4291 aprint_normal_dev(sc->sc_dev, 4292 "for TX interrupting at %s affinity to %u\n", 4293 intrstr, affinity_to); 4294 } else { 4295 aprint_normal_dev(sc->sc_dev, 4296 "for TX interrupting at %s\n", intrstr); 4297 } 4298 sc->sc_ihs[intr_idx] = vih; 4299 txq->txq_id = qidx; 4300 txq->txq_intr_idx = intr_idx; 4301 4302 tx_established++; 4303 intr_idx++; 4304 } 4305 4306 /* 4307 * RX 4308 */ 4309 rx_established = 0; 4310 for (qidx = 0; qidx < sc->sc_nrxqueues; qidx++) { 4311 struct wm_rxqueue *rxq = &sc->sc_rxq[qidx]; 4312 int affinity_to = (affinity_offset + intr_idx) % ncpu; 4313 4314 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 4315 sizeof(intrbuf)); 4316 #ifdef WM_MPSAFE 4317 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], 4318 PCI_INTR_MPSAFE, true); 4319 #endif 4320 memset(intr_xname, 0, sizeof(intr_xname)); 4321 snprintf(intr_xname, sizeof(intr_xname), "%sRX%d", 4322 device_xname(sc->sc_dev), qidx); 4323 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 4324 IPL_NET, wm_rxintr_msix, rxq, intr_xname); 4325 if (vih == NULL) { 4326 aprint_error_dev(sc->sc_dev, 4327 "unable to establish MSI-X(for RX)%s%s\n", 4328 intrstr ? " at " : "", 4329 intrstr ? intrstr : ""); 4330 4331 goto fail_1; 4332 } 4333 kcpuset_zero(affinity); 4334 /* Round-robin affinity */ 4335 kcpuset_set(affinity, affinity_to); 4336 error = interrupt_distribute(vih, affinity, NULL); 4337 if (error == 0) { 4338 aprint_normal_dev(sc->sc_dev, 4339 "for RX interrupting at %s affinity to %u\n", 4340 intrstr, affinity_to); 4341 } else { 4342 aprint_normal_dev(sc->sc_dev, 4343 "for RX interrupting at %s\n", intrstr); 4344 } 4345 sc->sc_ihs[intr_idx] = vih; 4346 rxq->rxq_id = qidx; 4347 rxq->rxq_intr_idx = intr_idx; 4348 4349 rx_established++; 4350 intr_idx++; 4351 } 4352 4353 /* 4354 * LINK 4355 */ 4356 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf, 4357 sizeof(intrbuf)); 4358 #ifdef WM_MPSAFE 4359 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], 4360 PCI_INTR_MPSAFE, true); 4361 #endif 4362 memset(intr_xname, 0, sizeof(intr_xname)); 4363 snprintf(intr_xname, sizeof(intr_xname), "%sLINK", 4364 device_xname(sc->sc_dev)); 4365 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx], 4366 IPL_NET, wm_linkintr_msix, sc, intr_xname); 4367 if (vih == NULL) { 4368 aprint_error_dev(sc->sc_dev, 4369 "unable to establish MSI-X(for LINK)%s%s\n", 4370 intrstr ? " at " : "", 4371 intrstr ? intrstr : ""); 4372 4373 goto fail_1; 4374 } 4375 /* keep default affinity to LINK interrupt */ 4376 aprint_normal_dev(sc->sc_dev, 4377 "for LINK interrupting at %s\n", intrstr); 4378 sc->sc_ihs[intr_idx] = vih; 4379 sc->sc_link_intr_idx = intr_idx; 4380 4381 sc->sc_nintrs = sc->sc_ntxqueues + sc->sc_nrxqueues + 1; 4382 kcpuset_destroy(affinity); 4383 return 0; 4384 4385 fail_1: 4386 for (qidx = 0; qidx < rx_established; qidx++) { 4387 struct wm_rxqueue *rxq = &sc->sc_rxq[qidx]; 4388 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[rxq->rxq_intr_idx]); 4389 sc->sc_ihs[rxq->rxq_intr_idx] = NULL; 4390 } 4391 fail_0: 4392 for (qidx = 0; qidx < tx_established; qidx++) { 4393 struct wm_txqueue *txq = &sc->sc_txq[qidx]; 4394 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[txq->txq_intr_idx]); 4395 sc->sc_ihs[txq->txq_intr_idx] = NULL; 4396 } 4397 4398 kcpuset_destroy(affinity); 4399 return ENOMEM; 4400 } 4401 4402 /* 4403 * wm_init: [ifnet interface function] 4404 * 4405 * Initialize the interface. 4406 */ 4407 static int 4408 wm_init(struct ifnet *ifp) 4409 { 4410 struct wm_softc *sc = ifp->if_softc; 4411 int ret; 4412 4413 WM_CORE_LOCK(sc); 4414 ret = wm_init_locked(ifp); 4415 WM_CORE_UNLOCK(sc); 4416 4417 return ret; 4418 } 4419 4420 static int 4421 wm_init_locked(struct ifnet *ifp) 4422 { 4423 struct wm_softc *sc = ifp->if_softc; 4424 int i, j, trynum, error = 0; 4425 uint32_t reg; 4426 4427 KASSERT(WM_CORE_LOCKED(sc)); 4428 /* 4429 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set. 4430 * There is a small but measurable benefit to avoiding the adjusment 4431 * of the descriptor so that the headers are aligned, for normal mtu, 4432 * on such platforms. One possibility is that the DMA itself is 4433 * slightly more efficient if the front of the entire packet (instead 4434 * of the front of the headers) is aligned. 4435 * 4436 * Note we must always set align_tweak to 0 if we are using 4437 * jumbo frames. 4438 */ 4439 #ifdef __NO_STRICT_ALIGNMENT 4440 sc->sc_align_tweak = 0; 4441 #else 4442 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2)) 4443 sc->sc_align_tweak = 0; 4444 else 4445 sc->sc_align_tweak = 2; 4446 #endif /* __NO_STRICT_ALIGNMENT */ 4447 4448 /* Cancel any pending I/O. */ 4449 wm_stop_locked(ifp, 0); 4450 4451 /* update statistics before reset */ 4452 ifp->if_collisions += CSR_READ(sc, WMREG_COLC); 4453 ifp->if_ierrors += CSR_READ(sc, WMREG_RXERRC); 4454 4455 /* Reset the chip to a known state. */ 4456 wm_reset(sc); 4457 4458 switch (sc->sc_type) { 4459 case WM_T_82571: 4460 case WM_T_82572: 4461 case WM_T_82573: 4462 case WM_T_82574: 4463 case WM_T_82583: 4464 case WM_T_80003: 4465 case WM_T_ICH8: 4466 case WM_T_ICH9: 4467 case WM_T_ICH10: 4468 case WM_T_PCH: 4469 case WM_T_PCH2: 4470 case WM_T_PCH_LPT: 4471 /* AMT based hardware can now take control from firmware */ 4472 if ((sc->sc_flags & WM_F_HAS_AMT) != 0) 4473 wm_get_hw_control(sc); 4474 break; 4475 default: 4476 break; 4477 } 4478 4479 /* Init hardware bits */ 4480 wm_initialize_hardware_bits(sc); 4481 4482 /* Reset the PHY. */ 4483 if (sc->sc_flags & WM_F_HAS_MII) 4484 wm_gmii_reset(sc); 4485 4486 /* Calculate (E)ITR value */ 4487 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 4488 sc->sc_itr = 450; /* For EITR */ 4489 } else if (sc->sc_type >= WM_T_82543) { 4490 /* 4491 * Set up the interrupt throttling register (units of 256ns) 4492 * Note that a footnote in Intel's documentation says this 4493 * ticker runs at 1/4 the rate when the chip is in 100Mbit 4494 * or 10Mbit mode. Empirically, it appears to be the case 4495 * that that is also true for the 1024ns units of the other 4496 * interrupt-related timer registers -- so, really, we ought 4497 * to divide this value by 4 when the link speed is low. 4498 * 4499 * XXX implement this division at link speed change! 4500 */ 4501 4502 /* 4503 * For N interrupts/sec, set this value to: 4504 * 1000000000 / (N * 256). Note that we set the 4505 * absolute and packet timer values to this value 4506 * divided by 4 to get "simple timer" behavior. 4507 */ 4508 4509 sc->sc_itr = 1500; /* 2604 ints/sec */ 4510 } 4511 4512 error = wm_init_txrx_queues(sc); 4513 if (error) 4514 goto out; 4515 4516 /* 4517 * Clear out the VLAN table -- we don't use it (yet). 4518 */ 4519 CSR_WRITE(sc, WMREG_VET, 0); 4520 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) 4521 trynum = 10; /* Due to hw errata */ 4522 else 4523 trynum = 1; 4524 for (i = 0; i < WM_VLAN_TABSIZE; i++) 4525 for (j = 0; j < trynum; j++) 4526 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0); 4527 4528 /* 4529 * Set up flow-control parameters. 4530 * 4531 * XXX Values could probably stand some tuning. 4532 */ 4533 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9) 4534 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH) 4535 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)) { 4536 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST); 4537 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST); 4538 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL); 4539 } 4540 4541 sc->sc_fcrtl = FCRTL_DFLT; 4542 if (sc->sc_type < WM_T_82543) { 4543 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT); 4544 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl); 4545 } else { 4546 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT); 4547 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl); 4548 } 4549 4550 if (sc->sc_type == WM_T_80003) 4551 CSR_WRITE(sc, WMREG_FCTTV, 0xffff); 4552 else 4553 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT); 4554 4555 /* Writes the control register. */ 4556 wm_set_vlan(sc); 4557 4558 if (sc->sc_flags & WM_F_HAS_MII) { 4559 int val; 4560 4561 switch (sc->sc_type) { 4562 case WM_T_80003: 4563 case WM_T_ICH8: 4564 case WM_T_ICH9: 4565 case WM_T_ICH10: 4566 case WM_T_PCH: 4567 case WM_T_PCH2: 4568 case WM_T_PCH_LPT: 4569 /* 4570 * Set the mac to wait the maximum time between each 4571 * iteration and increase the max iterations when 4572 * polling the phy; this fixes erroneous timeouts at 4573 * 10Mbps. 4574 */ 4575 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS, 4576 0xFFFF); 4577 val = wm_kmrn_readreg(sc, 4578 KUMCTRLSTA_OFFSET_INB_PARAM); 4579 val |= 0x3F; 4580 wm_kmrn_writereg(sc, 4581 KUMCTRLSTA_OFFSET_INB_PARAM, val); 4582 break; 4583 default: 4584 break; 4585 } 4586 4587 if (sc->sc_type == WM_T_80003) { 4588 val = CSR_READ(sc, WMREG_CTRL_EXT); 4589 val &= ~CTRL_EXT_LINK_MODE_MASK; 4590 CSR_WRITE(sc, WMREG_CTRL_EXT, val); 4591 4592 /* Bypass RX and TX FIFO's */ 4593 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL, 4594 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 4595 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS); 4596 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL, 4597 KUMCTRLSTA_INB_CTRL_DIS_PADDING | 4598 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT); 4599 } 4600 } 4601 #if 0 4602 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext); 4603 #endif 4604 4605 /* Set up checksum offload parameters. */ 4606 reg = CSR_READ(sc, WMREG_RXCSUM); 4607 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL); 4608 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx) 4609 reg |= RXCSUM_IPOFL; 4610 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx)) 4611 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL; 4612 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx)) 4613 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL; 4614 CSR_WRITE(sc, WMREG_RXCSUM, reg); 4615 4616 /* Set up MSI-X */ 4617 if (sc->sc_nintrs > 1) { 4618 uint32_t ivar; 4619 4620 if (sc->sc_type == WM_T_82575) { 4621 /* Interrupt control */ 4622 reg = CSR_READ(sc, WMREG_CTRL_EXT); 4623 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR; 4624 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 4625 4626 /* TX */ 4627 for (i = 0; i < sc->sc_ntxqueues; i++) { 4628 struct wm_txqueue *txq = &sc->sc_txq[i]; 4629 CSR_WRITE(sc, WMREG_MSIXBM(txq->txq_intr_idx), 4630 EITR_TX_QUEUE(txq->txq_id)); 4631 } 4632 /* RX */ 4633 for (i = 0; i < sc->sc_nrxqueues; i++) { 4634 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 4635 CSR_WRITE(sc, WMREG_MSIXBM(rxq->rxq_intr_idx), 4636 EITR_RX_QUEUE(rxq->rxq_id)); 4637 } 4638 /* Link status */ 4639 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx), 4640 EITR_OTHER); 4641 } else if (sc->sc_type == WM_T_82574) { 4642 /* Interrupt control */ 4643 reg = CSR_READ(sc, WMREG_CTRL_EXT); 4644 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME; 4645 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 4646 4647 ivar = 0; 4648 /* TX */ 4649 for (i = 0; i < sc->sc_ntxqueues; i++) { 4650 struct wm_txqueue *txq = &sc->sc_txq[i]; 4651 ivar |= __SHIFTIN((IVAR_VALID_82574|txq->txq_intr_idx), 4652 IVAR_TX_MASK_Q_82574(txq->txq_id)); 4653 } 4654 /* RX */ 4655 for (i = 0; i < sc->sc_nrxqueues; i++) { 4656 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 4657 ivar |= __SHIFTIN((IVAR_VALID_82574|rxq->rxq_intr_idx), 4658 IVAR_RX_MASK_Q_82574(rxq->rxq_id)); 4659 } 4660 /* Link status */ 4661 ivar |= __SHIFTIN((IVAR_VALID_82574|sc->sc_link_intr_idx), 4662 IVAR_OTHER_MASK); 4663 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB); 4664 } else { 4665 /* Interrupt control */ 4666 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR 4667 | GPIE_MULTI_MSIX | GPIE_EIAME 4668 | GPIE_PBA); 4669 4670 switch (sc->sc_type) { 4671 case WM_T_82580: 4672 case WM_T_I350: 4673 case WM_T_I354: 4674 case WM_T_I210: 4675 case WM_T_I211: 4676 /* TX */ 4677 for (i = 0; i < sc->sc_ntxqueues; i++) { 4678 struct wm_txqueue *txq = &sc->sc_txq[i]; 4679 int qid = txq->txq_id; 4680 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid)); 4681 ivar &= ~IVAR_TX_MASK_Q(qid); 4682 ivar |= __SHIFTIN( 4683 (txq->txq_intr_idx | IVAR_VALID), 4684 IVAR_TX_MASK_Q(qid)); 4685 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar); 4686 } 4687 4688 /* RX */ 4689 for (i = 0; i < sc->sc_nrxqueues; i++) { 4690 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 4691 int qid = rxq->rxq_id; 4692 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid)); 4693 ivar &= ~IVAR_RX_MASK_Q(qid); 4694 ivar |= __SHIFTIN( 4695 (rxq->rxq_intr_idx | IVAR_VALID), 4696 IVAR_RX_MASK_Q(qid)); 4697 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar); 4698 } 4699 break; 4700 case WM_T_82576: 4701 /* TX */ 4702 for (i = 0; i < sc->sc_ntxqueues; i++) { 4703 struct wm_txqueue *txq = &sc->sc_txq[i]; 4704 int qid = txq->txq_id; 4705 ivar = CSR_READ(sc, WMREG_IVAR_Q_82576(qid)); 4706 ivar &= ~IVAR_TX_MASK_Q_82576(qid); 4707 ivar |= __SHIFTIN( 4708 (txq->txq_intr_idx | IVAR_VALID), 4709 IVAR_TX_MASK_Q_82576(qid)); 4710 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid), ivar); 4711 } 4712 4713 /* RX */ 4714 for (i = 0; i < sc->sc_nrxqueues; i++) { 4715 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 4716 int qid = rxq->rxq_id; 4717 ivar = CSR_READ(sc, WMREG_IVAR_Q_82576(qid)); 4718 ivar &= ~IVAR_RX_MASK_Q_82576(qid); 4719 ivar |= __SHIFTIN( 4720 (rxq->rxq_intr_idx | IVAR_VALID), 4721 IVAR_RX_MASK_Q_82576(qid)); 4722 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid), ivar); 4723 } 4724 break; 4725 default: 4726 break; 4727 } 4728 4729 /* Link status */ 4730 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID), 4731 IVAR_MISC_OTHER); 4732 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar); 4733 } 4734 4735 if (sc->sc_nrxqueues > 1) { 4736 wm_init_rss(sc); 4737 4738 /* 4739 ** NOTE: Receive Full-Packet Checksum Offload 4740 ** is mutually exclusive with Multiqueue. However 4741 ** this is not the same as TCP/IP checksums which 4742 ** still work. 4743 */ 4744 reg = CSR_READ(sc, WMREG_RXCSUM); 4745 reg |= RXCSUM_PCSD; 4746 CSR_WRITE(sc, WMREG_RXCSUM, reg); 4747 } 4748 } 4749 4750 /* Set up the interrupt registers. */ 4751 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 4752 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 | 4753 ICR_RXO | ICR_RXT0; 4754 if (sc->sc_nintrs > 1) { 4755 uint32_t mask; 4756 switch (sc->sc_type) { 4757 case WM_T_82574: 4758 CSR_WRITE(sc, WMREG_EIAC_82574, 4759 WMREG_EIAC_82574_MSIX_MASK); 4760 sc->sc_icr |= WMREG_EIAC_82574_MSIX_MASK; 4761 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr); 4762 break; 4763 default: 4764 if (sc->sc_type == WM_T_82575) { 4765 mask = 0; 4766 for (i = 0; i < sc->sc_ntxqueues; i++) { 4767 struct wm_txqueue *txq = &sc->sc_txq[i]; 4768 mask |= EITR_TX_QUEUE(txq->txq_id); 4769 } 4770 for (i = 0; i < sc->sc_nrxqueues; i++) { 4771 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 4772 mask |= EITR_RX_QUEUE(rxq->rxq_id); 4773 } 4774 mask |= EITR_OTHER; 4775 } else { 4776 mask = 0; 4777 for (i = 0; i < sc->sc_ntxqueues; i++) { 4778 struct wm_txqueue *txq = &sc->sc_txq[i]; 4779 mask |= 1 << txq->txq_intr_idx; 4780 } 4781 for (i = 0; i < sc->sc_nrxqueues; i++) { 4782 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 4783 mask |= 1 << rxq->rxq_intr_idx; 4784 } 4785 mask |= 1 << sc->sc_link_intr_idx; 4786 } 4787 CSR_WRITE(sc, WMREG_EIAC, mask); 4788 CSR_WRITE(sc, WMREG_EIAM, mask); 4789 CSR_WRITE(sc, WMREG_EIMS, mask); 4790 CSR_WRITE(sc, WMREG_IMS, ICR_LSC); 4791 break; 4792 } 4793 } else 4794 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr); 4795 4796 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 4797 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 4798 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) { 4799 reg = CSR_READ(sc, WMREG_KABGTXD); 4800 reg |= KABGTXD_BGSQLBIAS; 4801 CSR_WRITE(sc, WMREG_KABGTXD, reg); 4802 } 4803 4804 /* Set up the inter-packet gap. */ 4805 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg); 4806 4807 if (sc->sc_type >= WM_T_82543) { 4808 /* 4809 * XXX 82574 has both ITR and EITR. SET EITR when we use 4810 * the multi queue function with MSI-X. 4811 */ 4812 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 4813 int qidx; 4814 for (qidx = 0; qidx < sc->sc_ntxqueues; qidx++) { 4815 struct wm_txqueue *txq = &sc->sc_txq[qidx]; 4816 CSR_WRITE(sc, WMREG_EITR(txq->txq_intr_idx), 4817 sc->sc_itr); 4818 } 4819 for (qidx = 0; qidx < sc->sc_nrxqueues; qidx++) { 4820 struct wm_rxqueue *rxq = &sc->sc_rxq[qidx]; 4821 CSR_WRITE(sc, WMREG_EITR(rxq->rxq_intr_idx), 4822 sc->sc_itr); 4823 } 4824 /* 4825 * Link interrupts occur much less than TX 4826 * interrupts and RX interrupts. So, we don't 4827 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like 4828 * FreeBSD's if_igb. 4829 */ 4830 } else 4831 CSR_WRITE(sc, WMREG_ITR, sc->sc_itr); 4832 } 4833 4834 /* Set the VLAN ethernetype. */ 4835 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN); 4836 4837 /* 4838 * Set up the transmit control register; we start out with 4839 * a collision distance suitable for FDX, but update it whe 4840 * we resolve the media type. 4841 */ 4842 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC 4843 | TCTL_CT(TX_COLLISION_THRESHOLD) 4844 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 4845 if (sc->sc_type >= WM_T_82571) 4846 sc->sc_tctl |= TCTL_MULR; 4847 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 4848 4849 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 4850 /* Write TDT after TCTL.EN is set. See the document. */ 4851 CSR_WRITE(sc, WMREG_TDT(0), 0); 4852 } 4853 4854 if (sc->sc_type == WM_T_80003) { 4855 reg = CSR_READ(sc, WMREG_TCTL_EXT); 4856 reg &= ~TCTL_EXT_GCEX_MASK; 4857 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; 4858 CSR_WRITE(sc, WMREG_TCTL_EXT, reg); 4859 } 4860 4861 /* Set the media. */ 4862 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0) 4863 goto out; 4864 4865 /* Configure for OS presence */ 4866 wm_init_manageability(sc); 4867 4868 /* 4869 * Set up the receive control register; we actually program 4870 * the register when we set the receive filter. Use multicast 4871 * address offset type 0. 4872 * 4873 * Only the i82544 has the ability to strip the incoming 4874 * CRC, so we don't enable that feature. 4875 */ 4876 sc->sc_mchash_type = 0; 4877 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF 4878 | RCTL_MO(sc->sc_mchash_type); 4879 4880 /* 4881 * The I350 has a bug where it always strips the CRC whether 4882 * asked to or not. So ask for stripped CRC here and cope in rxeof 4883 */ 4884 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 4885 || (sc->sc_type == WM_T_I210)) 4886 sc->sc_rctl |= RCTL_SECRC; 4887 4888 if (((sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) != 0) 4889 && (ifp->if_mtu > ETHERMTU)) { 4890 sc->sc_rctl |= RCTL_LPE; 4891 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 4892 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO); 4893 } 4894 4895 if (MCLBYTES == 2048) { 4896 sc->sc_rctl |= RCTL_2k; 4897 } else { 4898 if (sc->sc_type >= WM_T_82543) { 4899 switch (MCLBYTES) { 4900 case 4096: 4901 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k; 4902 break; 4903 case 8192: 4904 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k; 4905 break; 4906 case 16384: 4907 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k; 4908 break; 4909 default: 4910 panic("wm_init: MCLBYTES %d unsupported", 4911 MCLBYTES); 4912 break; 4913 } 4914 } else panic("wm_init: i82542 requires MCLBYTES = 2048"); 4915 } 4916 4917 /* Set the receive filter. */ 4918 wm_set_filter(sc); 4919 4920 /* Enable ECC */ 4921 switch (sc->sc_type) { 4922 case WM_T_82571: 4923 reg = CSR_READ(sc, WMREG_PBA_ECC); 4924 reg |= PBA_ECC_CORR_EN; 4925 CSR_WRITE(sc, WMREG_PBA_ECC, reg); 4926 break; 4927 case WM_T_PCH_LPT: 4928 reg = CSR_READ(sc, WMREG_PBECCSTS); 4929 reg |= PBECCSTS_UNCORR_ECC_ENABLE; 4930 CSR_WRITE(sc, WMREG_PBECCSTS, reg); 4931 4932 reg = CSR_READ(sc, WMREG_CTRL); 4933 reg |= CTRL_MEHE; 4934 CSR_WRITE(sc, WMREG_CTRL, reg); 4935 break; 4936 default: 4937 break; 4938 } 4939 4940 /* On 575 and later set RDT only if RX enabled */ 4941 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 4942 int qidx; 4943 for (qidx = 0; qidx < sc->sc_nrxqueues; qidx++) { 4944 struct wm_rxqueue *rxq = &sc->sc_rxq[qidx]; 4945 for (i = 0; i < WM_NRXDESC; i++) { 4946 WM_RX_LOCK(rxq); 4947 wm_init_rxdesc(rxq, i); 4948 WM_RX_UNLOCK(rxq); 4949 4950 } 4951 } 4952 } 4953 4954 sc->sc_stopping = false; 4955 4956 /* Start the one second link check clock. */ 4957 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc); 4958 4959 /* ...all done! */ 4960 ifp->if_flags |= IFF_RUNNING; 4961 ifp->if_flags &= ~IFF_OACTIVE; 4962 4963 out: 4964 sc->sc_if_flags = ifp->if_flags; 4965 if (error) 4966 log(LOG_ERR, "%s: interface not running\n", 4967 device_xname(sc->sc_dev)); 4968 return error; 4969 } 4970 4971 /* 4972 * wm_stop: [ifnet interface function] 4973 * 4974 * Stop transmission on the interface. 4975 */ 4976 static void 4977 wm_stop(struct ifnet *ifp, int disable) 4978 { 4979 struct wm_softc *sc = ifp->if_softc; 4980 4981 WM_CORE_LOCK(sc); 4982 wm_stop_locked(ifp, disable); 4983 WM_CORE_UNLOCK(sc); 4984 } 4985 4986 static void 4987 wm_stop_locked(struct ifnet *ifp, int disable) 4988 { 4989 struct wm_softc *sc = ifp->if_softc; 4990 struct wm_txsoft *txs; 4991 int i, qidx; 4992 4993 KASSERT(WM_CORE_LOCKED(sc)); 4994 4995 sc->sc_stopping = true; 4996 4997 /* Stop the one second clock. */ 4998 callout_stop(&sc->sc_tick_ch); 4999 5000 /* Stop the 82547 Tx FIFO stall check timer. */ 5001 if (sc->sc_type == WM_T_82547) 5002 callout_stop(&sc->sc_txfifo_ch); 5003 5004 if (sc->sc_flags & WM_F_HAS_MII) { 5005 /* Down the MII. */ 5006 mii_down(&sc->sc_mii); 5007 } else { 5008 #if 0 5009 /* Should we clear PHY's status properly? */ 5010 wm_reset(sc); 5011 #endif 5012 } 5013 5014 /* Stop the transmit and receive processes. */ 5015 CSR_WRITE(sc, WMREG_TCTL, 0); 5016 CSR_WRITE(sc, WMREG_RCTL, 0); 5017 sc->sc_rctl &= ~RCTL_EN; 5018 5019 /* 5020 * Clear the interrupt mask to ensure the device cannot assert its 5021 * interrupt line. 5022 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to 5023 * service any currently pending or shared interrupt. 5024 */ 5025 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU); 5026 sc->sc_icr = 0; 5027 if (sc->sc_nintrs > 1) { 5028 if (sc->sc_type != WM_T_82574) { 5029 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU); 5030 CSR_WRITE(sc, WMREG_EIAC, 0); 5031 } else 5032 CSR_WRITE(sc, WMREG_EIAC_82574, 0); 5033 } 5034 5035 /* Release any queued transmit buffers. */ 5036 for (qidx = 0; qidx < sc->sc_ntxqueues; qidx++) { 5037 struct wm_txqueue *txq = &sc->sc_txq[qidx]; 5038 WM_TX_LOCK(txq); 5039 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 5040 txs = &txq->txq_soft[i]; 5041 if (txs->txs_mbuf != NULL) { 5042 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 5043 m_freem(txs->txs_mbuf); 5044 txs->txs_mbuf = NULL; 5045 } 5046 } 5047 WM_TX_UNLOCK(txq); 5048 } 5049 5050 /* Mark the interface as down and cancel the watchdog timer. */ 5051 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 5052 ifp->if_timer = 0; 5053 5054 if (disable) { 5055 for (i = 0; i < sc->sc_nrxqueues; i++) { 5056 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 5057 WM_RX_LOCK(rxq); 5058 wm_rxdrain(rxq); 5059 WM_RX_UNLOCK(rxq); 5060 } 5061 } 5062 5063 #if 0 /* notyet */ 5064 if (sc->sc_type >= WM_T_82544) 5065 CSR_WRITE(sc, WMREG_WUC, 0); 5066 #endif 5067 } 5068 5069 static void 5070 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0) 5071 { 5072 struct mbuf *m; 5073 int i; 5074 5075 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev)); 5076 for (m = m0, i = 0; m != NULL; m = m->m_next, i++) 5077 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, " 5078 "m_flags = 0x%08x\n", device_xname(sc->sc_dev), 5079 m->m_data, m->m_len, m->m_flags); 5080 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev), 5081 i, i == 1 ? "" : "s"); 5082 } 5083 5084 /* 5085 * wm_82547_txfifo_stall: 5086 * 5087 * Callout used to wait for the 82547 Tx FIFO to drain, 5088 * reset the FIFO pointers, and restart packet transmission. 5089 */ 5090 static void 5091 wm_82547_txfifo_stall(void *arg) 5092 { 5093 struct wm_softc *sc = arg; 5094 struct wm_txqueue *txq = sc->sc_txq; 5095 #ifndef WM_MPSAFE 5096 int s; 5097 5098 s = splnet(); 5099 #endif 5100 WM_TX_LOCK(txq); 5101 5102 if (sc->sc_stopping) 5103 goto out; 5104 5105 if (txq->txq_fifo_stall) { 5106 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) && 5107 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) && 5108 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) { 5109 /* 5110 * Packets have drained. Stop transmitter, reset 5111 * FIFO pointers, restart transmitter, and kick 5112 * the packet queue. 5113 */ 5114 uint32_t tctl = CSR_READ(sc, WMREG_TCTL); 5115 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN); 5116 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr); 5117 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr); 5118 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr); 5119 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr); 5120 CSR_WRITE(sc, WMREG_TCTL, tctl); 5121 CSR_WRITE_FLUSH(sc); 5122 5123 txq->txq_fifo_head = 0; 5124 txq->txq_fifo_stall = 0; 5125 wm_start_locked(&sc->sc_ethercom.ec_if); 5126 } else { 5127 /* 5128 * Still waiting for packets to drain; try again in 5129 * another tick. 5130 */ 5131 callout_schedule(&sc->sc_txfifo_ch, 1); 5132 } 5133 } 5134 5135 out: 5136 WM_TX_UNLOCK(txq); 5137 #ifndef WM_MPSAFE 5138 splx(s); 5139 #endif 5140 } 5141 5142 /* 5143 * wm_82547_txfifo_bugchk: 5144 * 5145 * Check for bug condition in the 82547 Tx FIFO. We need to 5146 * prevent enqueueing a packet that would wrap around the end 5147 * if the Tx FIFO ring buffer, otherwise the chip will croak. 5148 * 5149 * We do this by checking the amount of space before the end 5150 * of the Tx FIFO buffer. If the packet will not fit, we "stall" 5151 * the Tx FIFO, wait for all remaining packets to drain, reset 5152 * the internal FIFO pointers to the beginning, and restart 5153 * transmission on the interface. 5154 */ 5155 #define WM_FIFO_HDR 0x10 5156 #define WM_82547_PAD_LEN 0x3e0 5157 static int 5158 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0) 5159 { 5160 struct wm_txqueue *txq = &sc->sc_txq[0]; 5161 int space = txq->txq_fifo_size - txq->txq_fifo_head; 5162 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR); 5163 5164 /* Just return if already stalled. */ 5165 if (txq->txq_fifo_stall) 5166 return 1; 5167 5168 if (sc->sc_mii.mii_media_active & IFM_FDX) { 5169 /* Stall only occurs in half-duplex mode. */ 5170 goto send_packet; 5171 } 5172 5173 if (len >= WM_82547_PAD_LEN + space) { 5174 txq->txq_fifo_stall = 1; 5175 callout_schedule(&sc->sc_txfifo_ch, 1); 5176 return 1; 5177 } 5178 5179 send_packet: 5180 txq->txq_fifo_head += len; 5181 if (txq->txq_fifo_head >= txq->txq_fifo_size) 5182 txq->txq_fifo_head -= txq->txq_fifo_size; 5183 5184 return 0; 5185 } 5186 5187 static int 5188 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq) 5189 { 5190 int error; 5191 5192 /* 5193 * Allocate the control data structures, and create and load the 5194 * DMA map for it. 5195 * 5196 * NOTE: All Tx descriptors must be in the same 4G segment of 5197 * memory. So must Rx descriptors. We simplify by allocating 5198 * both sets within the same 4G segment. 5199 */ 5200 if (sc->sc_type < WM_T_82544) { 5201 WM_NTXDESC(txq) = WM_NTXDESC_82542; 5202 txq->txq_desc_size = sizeof(wiseman_txdesc_t) * WM_NTXDESC(txq); 5203 } else { 5204 WM_NTXDESC(txq) = WM_NTXDESC_82544; 5205 txq->txq_desc_size = sizeof(txdescs_t); 5206 } 5207 5208 if ((error = bus_dmamem_alloc(sc->sc_dmat, txq->txq_desc_size, PAGE_SIZE, 5209 (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg, 1, 5210 &txq->txq_desc_rseg, 0)) != 0) { 5211 aprint_error_dev(sc->sc_dev, 5212 "unable to allocate TX control data, error = %d\n", 5213 error); 5214 goto fail_0; 5215 } 5216 5217 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg, 5218 txq->txq_desc_rseg, txq->txq_desc_size, 5219 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) { 5220 aprint_error_dev(sc->sc_dev, 5221 "unable to map TX control data, error = %d\n", error); 5222 goto fail_1; 5223 } 5224 5225 if ((error = bus_dmamap_create(sc->sc_dmat, txq->txq_desc_size, 1, 5226 txq->txq_desc_size, 0, 0, &txq->txq_desc_dmamap)) != 0) { 5227 aprint_error_dev(sc->sc_dev, 5228 "unable to create TX control data DMA map, error = %d\n", 5229 error); 5230 goto fail_2; 5231 } 5232 5233 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap, 5234 txq->txq_descs_u, txq->txq_desc_size, NULL, 0)) != 0) { 5235 aprint_error_dev(sc->sc_dev, 5236 "unable to load TX control data DMA map, error = %d\n", 5237 error); 5238 goto fail_3; 5239 } 5240 5241 return 0; 5242 5243 fail_3: 5244 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap); 5245 fail_2: 5246 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u, 5247 txq->txq_desc_size); 5248 fail_1: 5249 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg); 5250 fail_0: 5251 return error; 5252 } 5253 5254 static void 5255 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq) 5256 { 5257 5258 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap); 5259 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap); 5260 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u, 5261 txq->txq_desc_size); 5262 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg); 5263 } 5264 5265 static int 5266 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq) 5267 { 5268 int error; 5269 5270 /* 5271 * Allocate the control data structures, and create and load the 5272 * DMA map for it. 5273 * 5274 * NOTE: All Tx descriptors must be in the same 4G segment of 5275 * memory. So must Rx descriptors. We simplify by allocating 5276 * both sets within the same 4G segment. 5277 */ 5278 rxq->rxq_desc_size = sizeof(wiseman_rxdesc_t) * WM_NRXDESC; 5279 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq->rxq_desc_size, PAGE_SIZE, 5280 (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg, 1, 5281 &rxq->rxq_desc_rseg, 0)) != 0) { 5282 aprint_error_dev(sc->sc_dev, 5283 "unable to allocate RX control data, error = %d\n", 5284 error); 5285 goto fail_0; 5286 } 5287 5288 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg, 5289 rxq->rxq_desc_rseg, rxq->rxq_desc_size, 5290 (void **)&rxq->rxq_descs, BUS_DMA_COHERENT)) != 0) { 5291 aprint_error_dev(sc->sc_dev, 5292 "unable to map RX control data, error = %d\n", error); 5293 goto fail_1; 5294 } 5295 5296 if ((error = bus_dmamap_create(sc->sc_dmat, rxq->rxq_desc_size, 1, 5297 rxq->rxq_desc_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) { 5298 aprint_error_dev(sc->sc_dev, 5299 "unable to create RX control data DMA map, error = %d\n", 5300 error); 5301 goto fail_2; 5302 } 5303 5304 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap, 5305 rxq->rxq_descs, rxq->rxq_desc_size, NULL, 0)) != 0) { 5306 aprint_error_dev(sc->sc_dev, 5307 "unable to load RX control data DMA map, error = %d\n", 5308 error); 5309 goto fail_3; 5310 } 5311 5312 return 0; 5313 5314 fail_3: 5315 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap); 5316 fail_2: 5317 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs, 5318 rxq->rxq_desc_size); 5319 fail_1: 5320 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg); 5321 fail_0: 5322 return error; 5323 } 5324 5325 static void 5326 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq) 5327 { 5328 5329 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap); 5330 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap); 5331 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs, 5332 rxq->rxq_desc_size); 5333 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg); 5334 } 5335 5336 5337 static int 5338 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq) 5339 { 5340 int i, error; 5341 5342 /* Create the transmit buffer DMA maps. */ 5343 WM_TXQUEUELEN(txq) = 5344 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ? 5345 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX; 5346 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 5347 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA, 5348 WM_NTXSEGS, WTX_MAX_LEN, 0, 0, 5349 &txq->txq_soft[i].txs_dmamap)) != 0) { 5350 aprint_error_dev(sc->sc_dev, 5351 "unable to create Tx DMA map %d, error = %d\n", 5352 i, error); 5353 goto fail; 5354 } 5355 } 5356 5357 return 0; 5358 5359 fail: 5360 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 5361 if (txq->txq_soft[i].txs_dmamap != NULL) 5362 bus_dmamap_destroy(sc->sc_dmat, 5363 txq->txq_soft[i].txs_dmamap); 5364 } 5365 return error; 5366 } 5367 5368 static void 5369 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq) 5370 { 5371 int i; 5372 5373 for (i = 0; i < WM_TXQUEUELEN(txq); i++) { 5374 if (txq->txq_soft[i].txs_dmamap != NULL) 5375 bus_dmamap_destroy(sc->sc_dmat, 5376 txq->txq_soft[i].txs_dmamap); 5377 } 5378 } 5379 5380 static int 5381 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 5382 { 5383 int i, error; 5384 5385 /* Create the receive buffer DMA maps. */ 5386 for (i = 0; i < WM_NRXDESC; i++) { 5387 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 5388 MCLBYTES, 0, 0, 5389 &rxq->rxq_soft[i].rxs_dmamap)) != 0) { 5390 aprint_error_dev(sc->sc_dev, 5391 "unable to create Rx DMA map %d error = %d\n", 5392 i, error); 5393 goto fail; 5394 } 5395 rxq->rxq_soft[i].rxs_mbuf = NULL; 5396 } 5397 5398 return 0; 5399 5400 fail: 5401 for (i = 0; i < WM_NRXDESC; i++) { 5402 if (rxq->rxq_soft[i].rxs_dmamap != NULL) 5403 bus_dmamap_destroy(sc->sc_dmat, 5404 rxq->rxq_soft[i].rxs_dmamap); 5405 } 5406 return error; 5407 } 5408 5409 static void 5410 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 5411 { 5412 int i; 5413 5414 for (i = 0; i < WM_NRXDESC; i++) { 5415 if (rxq->rxq_soft[i].rxs_dmamap != NULL) 5416 bus_dmamap_destroy(sc->sc_dmat, 5417 rxq->rxq_soft[i].rxs_dmamap); 5418 } 5419 } 5420 5421 /* 5422 * wm_alloc_quques: 5423 * Allocate {tx,rx}descs and {tx,rx} buffers 5424 */ 5425 static int 5426 wm_alloc_txrx_queues(struct wm_softc *sc) 5427 { 5428 int i, error, tx_done, rx_done; 5429 5430 /* 5431 * For transmission 5432 */ 5433 sc->sc_txq = kmem_zalloc(sizeof(struct wm_txqueue) * sc->sc_ntxqueues, 5434 KM_SLEEP); 5435 if (sc->sc_txq == NULL) { 5436 aprint_error_dev(sc->sc_dev, "unable to allocate wm_txqueue\n"); 5437 error = ENOMEM; 5438 goto fail_0; 5439 } 5440 5441 error = 0; 5442 tx_done = 0; 5443 for (i = 0; i < sc->sc_ntxqueues; i++) { 5444 struct wm_txqueue *txq = &sc->sc_txq[i]; 5445 txq->txq_sc = sc; 5446 #ifdef WM_MPSAFE 5447 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 5448 #else 5449 txq->txq_lock = NULL; 5450 #endif 5451 error = wm_alloc_tx_descs(sc, txq); 5452 if (error) 5453 break; 5454 error = wm_alloc_tx_buffer(sc, txq); 5455 if (error) { 5456 wm_free_tx_descs(sc, txq); 5457 break; 5458 } 5459 tx_done++; 5460 } 5461 if (error) 5462 goto fail_1; 5463 5464 /* 5465 * For recieve 5466 */ 5467 sc->sc_rxq = kmem_zalloc(sizeof(struct wm_rxqueue) * sc->sc_nrxqueues, 5468 KM_SLEEP); 5469 if (sc->sc_rxq == NULL) { 5470 aprint_error_dev(sc->sc_dev, "unable to allocate wm_rxqueue\n"); 5471 error = ENOMEM; 5472 goto fail_1; 5473 } 5474 5475 error = 0; 5476 rx_done = 0; 5477 for (i = 0; i < sc->sc_nrxqueues; i++) { 5478 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 5479 rxq->rxq_sc = sc; 5480 #ifdef WM_MPSAFE 5481 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 5482 #else 5483 rxq->rxq_lock = NULL; 5484 #endif 5485 error = wm_alloc_rx_descs(sc, rxq); 5486 if (error) 5487 break; 5488 5489 error = wm_alloc_rx_buffer(sc, rxq); 5490 if (error) { 5491 wm_free_rx_descs(sc, rxq); 5492 break; 5493 } 5494 5495 rx_done++; 5496 } 5497 if (error) 5498 goto fail_2; 5499 5500 return 0; 5501 5502 fail_2: 5503 for (i = 0; i < rx_done; i++) { 5504 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 5505 wm_free_rx_buffer(sc, rxq); 5506 wm_free_rx_descs(sc, rxq); 5507 if (rxq->rxq_lock) 5508 mutex_obj_free(rxq->rxq_lock); 5509 } 5510 kmem_free(sc->sc_rxq, 5511 sizeof(struct wm_rxqueue) * sc->sc_nrxqueues); 5512 fail_1: 5513 for (i = 0; i < tx_done; i++) { 5514 struct wm_txqueue *txq = &sc->sc_txq[i]; 5515 wm_free_tx_buffer(sc, txq); 5516 wm_free_tx_descs(sc, txq); 5517 if (txq->txq_lock) 5518 mutex_obj_free(txq->txq_lock); 5519 } 5520 kmem_free(sc->sc_txq, 5521 sizeof(struct wm_txqueue) * sc->sc_ntxqueues); 5522 fail_0: 5523 return error; 5524 } 5525 5526 /* 5527 * wm_free_quques: 5528 * Free {tx,rx}descs and {tx,rx} buffers 5529 */ 5530 static void 5531 wm_free_txrx_queues(struct wm_softc *sc) 5532 { 5533 int i; 5534 5535 for (i = 0; i < sc->sc_nrxqueues; i++) { 5536 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 5537 wm_free_rx_buffer(sc, rxq); 5538 wm_free_rx_descs(sc, rxq); 5539 if (rxq->rxq_lock) 5540 mutex_obj_free(rxq->rxq_lock); 5541 } 5542 kmem_free(sc->sc_rxq, sizeof(struct wm_rxqueue) * sc->sc_nrxqueues); 5543 5544 for (i = 0; i < sc->sc_ntxqueues; i++) { 5545 struct wm_txqueue *txq = &sc->sc_txq[i]; 5546 wm_free_tx_buffer(sc, txq); 5547 wm_free_tx_descs(sc, txq); 5548 if (txq->txq_lock) 5549 mutex_obj_free(txq->txq_lock); 5550 } 5551 kmem_free(sc->sc_txq, sizeof(struct wm_txqueue) * sc->sc_ntxqueues); 5552 } 5553 5554 static void 5555 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq) 5556 { 5557 5558 KASSERT(WM_TX_LOCKED(txq)); 5559 5560 /* Initialize the transmit descriptor ring. */ 5561 memset(txq->txq_descs, 0, WM_TXDESCSIZE(txq)); 5562 wm_cdtxsync(txq, 0, WM_NTXDESC(txq), 5563 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 5564 txq->txq_free = WM_NTXDESC(txq); 5565 txq->txq_next = 0; 5566 } 5567 5568 static void 5569 wm_init_tx_regs(struct wm_softc *sc, struct wm_txqueue *txq) 5570 { 5571 5572 KASSERT(WM_TX_LOCKED(txq)); 5573 5574 if (sc->sc_type < WM_T_82543) { 5575 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0)); 5576 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0)); 5577 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCSIZE(txq)); 5578 CSR_WRITE(sc, WMREG_OLD_TDH, 0); 5579 CSR_WRITE(sc, WMREG_OLD_TDT, 0); 5580 CSR_WRITE(sc, WMREG_OLD_TIDV, 128); 5581 } else { 5582 int qid = txq->txq_id; 5583 5584 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0)); 5585 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0)); 5586 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCSIZE(txq)); 5587 CSR_WRITE(sc, WMREG_TDH(qid), 0); 5588 5589 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) 5590 /* 5591 * Don't write TDT before TCTL.EN is set. 5592 * See the document. 5593 */ 5594 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE 5595 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0) 5596 | TXDCTL_WTHRESH(0)); 5597 else { 5598 /* ITR / 4 */ 5599 CSR_WRITE(sc, WMREG_TIDV, sc->sc_itr / 4); 5600 if (sc->sc_type >= WM_T_82540) { 5601 /* should be same */ 5602 CSR_WRITE(sc, WMREG_TADV, sc->sc_itr / 4); 5603 } 5604 5605 CSR_WRITE(sc, WMREG_TDT(qid), 0); 5606 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) | 5607 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0)); 5608 } 5609 } 5610 } 5611 5612 static void 5613 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq) 5614 { 5615 int i; 5616 5617 KASSERT(WM_TX_LOCKED(txq)); 5618 5619 /* Initialize the transmit job descriptors. */ 5620 for (i = 0; i < WM_TXQUEUELEN(txq); i++) 5621 txq->txq_soft[i].txs_mbuf = NULL; 5622 txq->txq_sfree = WM_TXQUEUELEN(txq); 5623 txq->txq_snext = 0; 5624 txq->txq_sdirty = 0; 5625 } 5626 5627 static void 5628 wm_init_tx_queue(struct wm_softc *sc, struct wm_txqueue *txq) 5629 { 5630 5631 KASSERT(WM_TX_LOCKED(txq)); 5632 5633 /* 5634 * Set up some register offsets that are different between 5635 * the i82542 and the i82543 and later chips. 5636 */ 5637 if (sc->sc_type < WM_T_82543) { 5638 txq->txq_tdt_reg = WMREG_OLD_TDT; 5639 } else { 5640 txq->txq_tdt_reg = WMREG_TDT(0); 5641 } 5642 5643 wm_init_tx_descs(sc, txq); 5644 wm_init_tx_regs(sc, txq); 5645 wm_init_tx_buffer(sc, txq); 5646 } 5647 5648 static void 5649 wm_init_rx_regs(struct wm_softc *sc, struct wm_rxqueue *rxq) 5650 { 5651 5652 KASSERT(WM_RX_LOCKED(rxq)); 5653 5654 /* 5655 * Initialize the receive descriptor and receive job 5656 * descriptor rings. 5657 */ 5658 if (sc->sc_type < WM_T_82543) { 5659 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0)); 5660 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0)); 5661 CSR_WRITE(sc, WMREG_OLD_RDLEN0, 5662 sizeof(wiseman_rxdesc_t) * WM_NRXDESC); 5663 CSR_WRITE(sc, WMREG_OLD_RDH0, 0); 5664 CSR_WRITE(sc, WMREG_OLD_RDT0, 0); 5665 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD); 5666 5667 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0); 5668 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0); 5669 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0); 5670 CSR_WRITE(sc, WMREG_OLD_RDH1, 0); 5671 CSR_WRITE(sc, WMREG_OLD_RDT1, 0); 5672 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0); 5673 } else { 5674 int qid = rxq->rxq_id; 5675 5676 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0)); 5677 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0)); 5678 CSR_WRITE(sc, WMREG_RDLEN(qid), rxq->rxq_desc_size); 5679 5680 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { 5681 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1)) 5682 panic("%s: MCLBYTES %d unsupported for i2575 or higher\n", __func__, MCLBYTES); 5683 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_LEGACY 5684 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT)); 5685 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE 5686 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8) 5687 | RXDCTL_WTHRESH(1)); 5688 CSR_WRITE(sc, WMREG_RDH(qid), 0); 5689 CSR_WRITE(sc, WMREG_RDT(qid), 0); 5690 } else { 5691 CSR_WRITE(sc, WMREG_RDH(qid), 0); 5692 CSR_WRITE(sc, WMREG_RDT(qid), 0); 5693 /* ITR / 4 */ 5694 CSR_WRITE(sc, WMREG_RDTR, (sc->sc_itr / 4) | RDTR_FPD); 5695 /* MUST be same */ 5696 CSR_WRITE(sc, WMREG_RADV, sc->sc_itr / 4); 5697 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) | 5698 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1)); 5699 } 5700 } 5701 } 5702 5703 static int 5704 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq) 5705 { 5706 struct wm_rxsoft *rxs; 5707 int error, i; 5708 5709 KASSERT(WM_RX_LOCKED(rxq)); 5710 5711 for (i = 0; i < WM_NRXDESC; i++) { 5712 rxs = &rxq->rxq_soft[i]; 5713 if (rxs->rxs_mbuf == NULL) { 5714 if ((error = wm_add_rxbuf(rxq, i)) != 0) { 5715 log(LOG_ERR, "%s: unable to allocate or map " 5716 "rx buffer %d, error = %d\n", 5717 device_xname(sc->sc_dev), i, error); 5718 /* 5719 * XXX Should attempt to run with fewer receive 5720 * XXX buffers instead of just failing. 5721 */ 5722 wm_rxdrain(rxq); 5723 return ENOMEM; 5724 } 5725 } else { 5726 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0) 5727 wm_init_rxdesc(rxq, i); 5728 /* 5729 * For 82575 and newer device, the RX descriptors 5730 * must be initialized after the setting of RCTL.EN in 5731 * wm_set_filter() 5732 */ 5733 } 5734 } 5735 rxq->rxq_ptr = 0; 5736 rxq->rxq_discard = 0; 5737 WM_RXCHAIN_RESET(rxq); 5738 5739 return 0; 5740 } 5741 5742 static int 5743 wm_init_rx_queue(struct wm_softc *sc, struct wm_rxqueue *rxq) 5744 { 5745 5746 KASSERT(WM_RX_LOCKED(rxq)); 5747 5748 /* 5749 * Set up some register offsets that are different between 5750 * the i82542 and the i82543 and later chips. 5751 */ 5752 if (sc->sc_type < WM_T_82543) { 5753 rxq->rxq_rdt_reg = WMREG_OLD_RDT0; 5754 } else { 5755 rxq->rxq_rdt_reg = WMREG_RDT(rxq->rxq_id); 5756 } 5757 5758 wm_init_rx_regs(sc, rxq); 5759 return wm_init_rx_buffer(sc, rxq); 5760 } 5761 5762 /* 5763 * wm_init_quques: 5764 * Initialize {tx,rx}descs and {tx,rx} buffers 5765 */ 5766 static int 5767 wm_init_txrx_queues(struct wm_softc *sc) 5768 { 5769 int i, error; 5770 5771 for (i = 0; i < sc->sc_ntxqueues; i++) { 5772 struct wm_txqueue *txq = &sc->sc_txq[i]; 5773 WM_TX_LOCK(txq); 5774 wm_init_tx_queue(sc, txq); 5775 WM_TX_UNLOCK(txq); 5776 } 5777 5778 error = 0; 5779 for (i = 0; i < sc->sc_nrxqueues; i++) { 5780 struct wm_rxqueue *rxq = &sc->sc_rxq[i]; 5781 WM_RX_LOCK(rxq); 5782 error = wm_init_rx_queue(sc, rxq); 5783 WM_RX_UNLOCK(rxq); 5784 if (error) 5785 break; 5786 } 5787 5788 return error; 5789 } 5790 5791 /* 5792 * wm_tx_offload: 5793 * 5794 * Set up TCP/IP checksumming parameters for the 5795 * specified packet. 5796 */ 5797 static int 5798 wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp, 5799 uint8_t *fieldsp) 5800 { 5801 struct wm_txqueue *txq = &sc->sc_txq[0]; 5802 struct mbuf *m0 = txs->txs_mbuf; 5803 struct livengood_tcpip_ctxdesc *t; 5804 uint32_t ipcs, tucs, cmd, cmdlen, seg; 5805 uint32_t ipcse; 5806 struct ether_header *eh; 5807 int offset, iphl; 5808 uint8_t fields; 5809 5810 /* 5811 * XXX It would be nice if the mbuf pkthdr had offset 5812 * fields for the protocol headers. 5813 */ 5814 5815 eh = mtod(m0, struct ether_header *); 5816 switch (htons(eh->ether_type)) { 5817 case ETHERTYPE_IP: 5818 case ETHERTYPE_IPV6: 5819 offset = ETHER_HDR_LEN; 5820 break; 5821 5822 case ETHERTYPE_VLAN: 5823 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 5824 break; 5825 5826 default: 5827 /* 5828 * Don't support this protocol or encapsulation. 5829 */ 5830 *fieldsp = 0; 5831 *cmdp = 0; 5832 return 0; 5833 } 5834 5835 if ((m0->m_pkthdr.csum_flags & 5836 (M_CSUM_TSOv4|M_CSUM_UDPv4|M_CSUM_TCPv4)) != 0) { 5837 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data); 5838 } else { 5839 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data); 5840 } 5841 ipcse = offset + iphl - 1; 5842 5843 cmd = WTX_CMD_DEXT | WTX_DTYP_D; 5844 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE; 5845 seg = 0; 5846 fields = 0; 5847 5848 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) { 5849 int hlen = offset + iphl; 5850 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0; 5851 5852 if (__predict_false(m0->m_len < 5853 (hlen + sizeof(struct tcphdr)))) { 5854 /* 5855 * TCP/IP headers are not in the first mbuf; we need 5856 * to do this the slow and painful way. Let's just 5857 * hope this doesn't happen very often. 5858 */ 5859 struct tcphdr th; 5860 5861 WM_EVCNT_INCR(&sc->sc_ev_txtsopain); 5862 5863 m_copydata(m0, hlen, sizeof(th), &th); 5864 if (v4) { 5865 struct ip ip; 5866 5867 m_copydata(m0, offset, sizeof(ip), &ip); 5868 ip.ip_len = 0; 5869 m_copyback(m0, 5870 offset + offsetof(struct ip, ip_len), 5871 sizeof(ip.ip_len), &ip.ip_len); 5872 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr, 5873 ip.ip_dst.s_addr, htons(IPPROTO_TCP)); 5874 } else { 5875 struct ip6_hdr ip6; 5876 5877 m_copydata(m0, offset, sizeof(ip6), &ip6); 5878 ip6.ip6_plen = 0; 5879 m_copyback(m0, 5880 offset + offsetof(struct ip6_hdr, ip6_plen), 5881 sizeof(ip6.ip6_plen), &ip6.ip6_plen); 5882 th.th_sum = in6_cksum_phdr(&ip6.ip6_src, 5883 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP)); 5884 } 5885 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum), 5886 sizeof(th.th_sum), &th.th_sum); 5887 5888 hlen += th.th_off << 2; 5889 } else { 5890 /* 5891 * TCP/IP headers are in the first mbuf; we can do 5892 * this the easy way. 5893 */ 5894 struct tcphdr *th; 5895 5896 if (v4) { 5897 struct ip *ip = 5898 (void *)(mtod(m0, char *) + offset); 5899 th = (void *)(mtod(m0, char *) + hlen); 5900 5901 ip->ip_len = 0; 5902 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 5903 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 5904 } else { 5905 struct ip6_hdr *ip6 = 5906 (void *)(mtod(m0, char *) + offset); 5907 th = (void *)(mtod(m0, char *) + hlen); 5908 5909 ip6->ip6_plen = 0; 5910 th->th_sum = in6_cksum_phdr(&ip6->ip6_src, 5911 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP)); 5912 } 5913 hlen += th->th_off << 2; 5914 } 5915 5916 if (v4) { 5917 WM_EVCNT_INCR(&sc->sc_ev_txtso); 5918 cmdlen |= WTX_TCPIP_CMD_IP; 5919 } else { 5920 WM_EVCNT_INCR(&sc->sc_ev_txtso6); 5921 ipcse = 0; 5922 } 5923 cmd |= WTX_TCPIP_CMD_TSE; 5924 cmdlen |= WTX_TCPIP_CMD_TSE | 5925 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen); 5926 seg = WTX_TCPIP_SEG_HDRLEN(hlen) | 5927 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz); 5928 } 5929 5930 /* 5931 * NOTE: Even if we're not using the IP or TCP/UDP checksum 5932 * offload feature, if we load the context descriptor, we 5933 * MUST provide valid values for IPCSS and TUCSS fields. 5934 */ 5935 5936 ipcs = WTX_TCPIP_IPCSS(offset) | 5937 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) | 5938 WTX_TCPIP_IPCSE(ipcse); 5939 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4|M_CSUM_TSOv4)) { 5940 WM_EVCNT_INCR(&sc->sc_ev_txipsum); 5941 fields |= WTX_IXSM; 5942 } 5943 5944 offset += iphl; 5945 5946 if (m0->m_pkthdr.csum_flags & 5947 (M_CSUM_TCPv4|M_CSUM_UDPv4|M_CSUM_TSOv4)) { 5948 WM_EVCNT_INCR(&sc->sc_ev_txtusum); 5949 fields |= WTX_TXSM; 5950 tucs = WTX_TCPIP_TUCSS(offset) | 5951 WTX_TCPIP_TUCSO(offset + 5952 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) | 5953 WTX_TCPIP_TUCSE(0) /* rest of packet */; 5954 } else if ((m0->m_pkthdr.csum_flags & 5955 (M_CSUM_TCPv6|M_CSUM_UDPv6|M_CSUM_TSOv6)) != 0) { 5956 WM_EVCNT_INCR(&sc->sc_ev_txtusum6); 5957 fields |= WTX_TXSM; 5958 tucs = WTX_TCPIP_TUCSS(offset) | 5959 WTX_TCPIP_TUCSO(offset + 5960 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) | 5961 WTX_TCPIP_TUCSE(0) /* rest of packet */; 5962 } else { 5963 /* Just initialize it to a valid TCP context. */ 5964 tucs = WTX_TCPIP_TUCSS(offset) | 5965 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) | 5966 WTX_TCPIP_TUCSE(0) /* rest of packet */; 5967 } 5968 5969 /* Fill in the context descriptor. */ 5970 t = (struct livengood_tcpip_ctxdesc *) 5971 &txq->txq_descs[txq->txq_next]; 5972 t->tcpip_ipcs = htole32(ipcs); 5973 t->tcpip_tucs = htole32(tucs); 5974 t->tcpip_cmdlen = htole32(cmdlen); 5975 t->tcpip_seg = htole32(seg); 5976 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE); 5977 5978 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 5979 txs->txs_ndesc++; 5980 5981 *cmdp = cmd; 5982 *fieldsp = fields; 5983 5984 return 0; 5985 } 5986 5987 /* 5988 * wm_start: [ifnet interface function] 5989 * 5990 * Start packet transmission on the interface. 5991 */ 5992 static void 5993 wm_start(struct ifnet *ifp) 5994 { 5995 struct wm_softc *sc = ifp->if_softc; 5996 struct wm_txqueue *txq = &sc->sc_txq[0]; 5997 5998 WM_TX_LOCK(txq); 5999 if (!sc->sc_stopping) 6000 wm_start_locked(ifp); 6001 WM_TX_UNLOCK(txq); 6002 } 6003 6004 static void 6005 wm_start_locked(struct ifnet *ifp) 6006 { 6007 struct wm_softc *sc = ifp->if_softc; 6008 struct wm_txqueue *txq = &sc->sc_txq[0]; 6009 struct mbuf *m0; 6010 struct m_tag *mtag; 6011 struct wm_txsoft *txs; 6012 bus_dmamap_t dmamap; 6013 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso; 6014 bus_addr_t curaddr; 6015 bus_size_t seglen, curlen; 6016 uint32_t cksumcmd; 6017 uint8_t cksumfields; 6018 6019 KASSERT(WM_TX_LOCKED(txq)); 6020 6021 if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING) 6022 return; 6023 6024 /* Remember the previous number of free descriptors. */ 6025 ofree = txq->txq_free; 6026 6027 /* 6028 * Loop through the send queue, setting up transmit descriptors 6029 * until we drain the queue, or use up all available transmit 6030 * descriptors. 6031 */ 6032 for (;;) { 6033 m0 = NULL; 6034 6035 /* Get a work queue entry. */ 6036 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) { 6037 wm_txeof(sc); 6038 if (txq->txq_sfree == 0) { 6039 DPRINTF(WM_DEBUG_TX, 6040 ("%s: TX: no free job descriptors\n", 6041 device_xname(sc->sc_dev))); 6042 WM_EVCNT_INCR(&sc->sc_ev_txsstall); 6043 break; 6044 } 6045 } 6046 6047 /* Grab a packet off the queue. */ 6048 IFQ_DEQUEUE(&ifp->if_snd, m0); 6049 if (m0 == NULL) 6050 break; 6051 6052 DPRINTF(WM_DEBUG_TX, 6053 ("%s: TX: have packet to transmit: %p\n", 6054 device_xname(sc->sc_dev), m0)); 6055 6056 txs = &txq->txq_soft[txq->txq_snext]; 6057 dmamap = txs->txs_dmamap; 6058 6059 use_tso = (m0->m_pkthdr.csum_flags & 6060 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0; 6061 6062 /* 6063 * So says the Linux driver: 6064 * The controller does a simple calculation to make sure 6065 * there is enough room in the FIFO before initiating the 6066 * DMA for each buffer. The calc is: 6067 * 4 = ceil(buffer len / MSS) 6068 * To make sure we don't overrun the FIFO, adjust the max 6069 * buffer len if the MSS drops. 6070 */ 6071 dmamap->dm_maxsegsz = 6072 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN) 6073 ? m0->m_pkthdr.segsz << 2 6074 : WTX_MAX_LEN; 6075 6076 /* 6077 * Load the DMA map. If this fails, the packet either 6078 * didn't fit in the allotted number of segments, or we 6079 * were short on resources. For the too-many-segments 6080 * case, we simply report an error and drop the packet, 6081 * since we can't sanely copy a jumbo packet to a single 6082 * buffer. 6083 */ 6084 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 6085 BUS_DMA_WRITE|BUS_DMA_NOWAIT); 6086 if (error) { 6087 if (error == EFBIG) { 6088 WM_EVCNT_INCR(&sc->sc_ev_txdrop); 6089 log(LOG_ERR, "%s: Tx packet consumes too many " 6090 "DMA segments, dropping...\n", 6091 device_xname(sc->sc_dev)); 6092 wm_dump_mbuf_chain(sc, m0); 6093 m_freem(m0); 6094 continue; 6095 } 6096 /* Short on resources, just stop for now. */ 6097 DPRINTF(WM_DEBUG_TX, 6098 ("%s: TX: dmamap load failed: %d\n", 6099 device_xname(sc->sc_dev), error)); 6100 break; 6101 } 6102 6103 segs_needed = dmamap->dm_nsegs; 6104 if (use_tso) { 6105 /* For sentinel descriptor; see below. */ 6106 segs_needed++; 6107 } 6108 6109 /* 6110 * Ensure we have enough descriptors free to describe 6111 * the packet. Note, we always reserve one descriptor 6112 * at the end of the ring due to the semantics of the 6113 * TDT register, plus one more in the event we need 6114 * to load offload context. 6115 */ 6116 if (segs_needed > txq->txq_free - 2) { 6117 /* 6118 * Not enough free descriptors to transmit this 6119 * packet. We haven't committed anything yet, 6120 * so just unload the DMA map, put the packet 6121 * pack on the queue, and punt. Notify the upper 6122 * layer that there are no more slots left. 6123 */ 6124 DPRINTF(WM_DEBUG_TX, 6125 ("%s: TX: need %d (%d) descriptors, have %d\n", 6126 device_xname(sc->sc_dev), dmamap->dm_nsegs, 6127 segs_needed, txq->txq_free - 1)); 6128 ifp->if_flags |= IFF_OACTIVE; 6129 bus_dmamap_unload(sc->sc_dmat, dmamap); 6130 WM_EVCNT_INCR(&sc->sc_ev_txdstall); 6131 break; 6132 } 6133 6134 /* 6135 * Check for 82547 Tx FIFO bug. We need to do this 6136 * once we know we can transmit the packet, since we 6137 * do some internal FIFO space accounting here. 6138 */ 6139 if (sc->sc_type == WM_T_82547 && 6140 wm_82547_txfifo_bugchk(sc, m0)) { 6141 DPRINTF(WM_DEBUG_TX, 6142 ("%s: TX: 82547 Tx FIFO bug detected\n", 6143 device_xname(sc->sc_dev))); 6144 ifp->if_flags |= IFF_OACTIVE; 6145 bus_dmamap_unload(sc->sc_dmat, dmamap); 6146 WM_EVCNT_INCR(&sc->sc_ev_txfifo_stall); 6147 break; 6148 } 6149 6150 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */ 6151 6152 DPRINTF(WM_DEBUG_TX, 6153 ("%s: TX: packet has %d (%d) DMA segments\n", 6154 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed)); 6155 6156 WM_EVCNT_INCR(&sc->sc_ev_txseg[dmamap->dm_nsegs - 1]); 6157 6158 /* 6159 * Store a pointer to the packet so that we can free it 6160 * later. 6161 * 6162 * Initially, we consider the number of descriptors the 6163 * packet uses the number of DMA segments. This may be 6164 * incremented by 1 if we do checksum offload (a descriptor 6165 * is used to set the checksum context). 6166 */ 6167 txs->txs_mbuf = m0; 6168 txs->txs_firstdesc = txq->txq_next; 6169 txs->txs_ndesc = segs_needed; 6170 6171 /* Set up offload parameters for this packet. */ 6172 if (m0->m_pkthdr.csum_flags & 6173 (M_CSUM_TSOv4|M_CSUM_TSOv6| 6174 M_CSUM_IPv4|M_CSUM_TCPv4|M_CSUM_UDPv4| 6175 M_CSUM_TCPv6|M_CSUM_UDPv6)) { 6176 if (wm_tx_offload(sc, txs, &cksumcmd, 6177 &cksumfields) != 0) { 6178 /* Error message already displayed. */ 6179 bus_dmamap_unload(sc->sc_dmat, dmamap); 6180 continue; 6181 } 6182 } else { 6183 cksumcmd = 0; 6184 cksumfields = 0; 6185 } 6186 6187 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS; 6188 6189 /* Sync the DMA map. */ 6190 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 6191 BUS_DMASYNC_PREWRITE); 6192 6193 /* Initialize the transmit descriptor. */ 6194 for (nexttx = txq->txq_next, seg = 0; 6195 seg < dmamap->dm_nsegs; seg++) { 6196 for (seglen = dmamap->dm_segs[seg].ds_len, 6197 curaddr = dmamap->dm_segs[seg].ds_addr; 6198 seglen != 0; 6199 curaddr += curlen, seglen -= curlen, 6200 nexttx = WM_NEXTTX(txq, nexttx)) { 6201 curlen = seglen; 6202 6203 /* 6204 * So says the Linux driver: 6205 * Work around for premature descriptor 6206 * write-backs in TSO mode. Append a 6207 * 4-byte sentinel descriptor. 6208 */ 6209 if (use_tso && 6210 seg == dmamap->dm_nsegs - 1 && 6211 curlen > 8) 6212 curlen -= 4; 6213 6214 wm_set_dma_addr( 6215 &txq->txq_descs[nexttx].wtx_addr, 6216 curaddr); 6217 txq->txq_descs[nexttx].wtx_cmdlen = 6218 htole32(cksumcmd | curlen); 6219 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 6220 0; 6221 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 6222 cksumfields; 6223 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan = 0; 6224 lasttx = nexttx; 6225 6226 DPRINTF(WM_DEBUG_TX, 6227 ("%s: TX: desc %d: low %#" PRIx64 ", " 6228 "len %#04zx\n", 6229 device_xname(sc->sc_dev), nexttx, 6230 (uint64_t)curaddr, curlen)); 6231 } 6232 } 6233 6234 KASSERT(lasttx != -1); 6235 6236 /* 6237 * Set up the command byte on the last descriptor of 6238 * the packet. If we're in the interrupt delay window, 6239 * delay the interrupt. 6240 */ 6241 txq->txq_descs[lasttx].wtx_cmdlen |= 6242 htole32(WTX_CMD_EOP | WTX_CMD_RS); 6243 6244 /* 6245 * If VLANs are enabled and the packet has a VLAN tag, set 6246 * up the descriptor to encapsulate the packet for us. 6247 * 6248 * This is only valid on the last descriptor of the packet. 6249 */ 6250 if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != NULL) { 6251 txq->txq_descs[lasttx].wtx_cmdlen |= 6252 htole32(WTX_CMD_VLE); 6253 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan 6254 = htole16(VLAN_TAG_VALUE(mtag) & 0xffff); 6255 } 6256 6257 txs->txs_lastdesc = lasttx; 6258 6259 DPRINTF(WM_DEBUG_TX, 6260 ("%s: TX: desc %d: cmdlen 0x%08x\n", 6261 device_xname(sc->sc_dev), 6262 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen))); 6263 6264 /* Sync the descriptors we're using. */ 6265 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc, 6266 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 6267 6268 /* Give the packet to the chip. */ 6269 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx); 6270 6271 DPRINTF(WM_DEBUG_TX, 6272 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx)); 6273 6274 DPRINTF(WM_DEBUG_TX, 6275 ("%s: TX: finished transmitting packet, job %d\n", 6276 device_xname(sc->sc_dev), txq->txq_snext)); 6277 6278 /* Advance the tx pointer. */ 6279 txq->txq_free -= txs->txs_ndesc; 6280 txq->txq_next = nexttx; 6281 6282 txq->txq_sfree--; 6283 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext); 6284 6285 /* Pass the packet to any BPF listeners. */ 6286 bpf_mtap(ifp, m0); 6287 } 6288 6289 if (m0 != NULL) { 6290 ifp->if_flags |= IFF_OACTIVE; 6291 WM_EVCNT_INCR(&sc->sc_ev_txdrop); 6292 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", __func__)); 6293 m_freem(m0); 6294 } 6295 6296 if (txq->txq_sfree == 0 || txq->txq_free <= 2) { 6297 /* No more slots; notify upper layer. */ 6298 ifp->if_flags |= IFF_OACTIVE; 6299 } 6300 6301 if (txq->txq_free != ofree) { 6302 /* Set a watchdog timer in case the chip flakes out. */ 6303 ifp->if_timer = 5; 6304 } 6305 } 6306 6307 /* 6308 * wm_nq_tx_offload: 6309 * 6310 * Set up TCP/IP checksumming parameters for the 6311 * specified packet, for NEWQUEUE devices 6312 */ 6313 static int 6314 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, 6315 uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum) 6316 { 6317 struct wm_txqueue *txq = &sc->sc_txq[0]; 6318 struct mbuf *m0 = txs->txs_mbuf; 6319 struct m_tag *mtag; 6320 uint32_t vl_len, mssidx, cmdc; 6321 struct ether_header *eh; 6322 int offset, iphl; 6323 6324 /* 6325 * XXX It would be nice if the mbuf pkthdr had offset 6326 * fields for the protocol headers. 6327 */ 6328 *cmdlenp = 0; 6329 *fieldsp = 0; 6330 6331 eh = mtod(m0, struct ether_header *); 6332 switch (htons(eh->ether_type)) { 6333 case ETHERTYPE_IP: 6334 case ETHERTYPE_IPV6: 6335 offset = ETHER_HDR_LEN; 6336 break; 6337 6338 case ETHERTYPE_VLAN: 6339 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 6340 break; 6341 6342 default: 6343 /* Don't support this protocol or encapsulation. */ 6344 *do_csum = false; 6345 return 0; 6346 } 6347 *do_csum = true; 6348 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS; 6349 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT; 6350 6351 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT); 6352 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0); 6353 6354 if ((m0->m_pkthdr.csum_flags & 6355 (M_CSUM_TSOv4|M_CSUM_UDPv4|M_CSUM_TCPv4|M_CSUM_IPv4)) != 0) { 6356 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data); 6357 } else { 6358 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data); 6359 } 6360 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT); 6361 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0); 6362 6363 if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != NULL) { 6364 vl_len |= ((VLAN_TAG_VALUE(mtag) & NQTXC_VLLEN_VLAN_MASK) 6365 << NQTXC_VLLEN_VLAN_SHIFT); 6366 *cmdlenp |= NQTX_CMD_VLE; 6367 } 6368 6369 mssidx = 0; 6370 6371 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) { 6372 int hlen = offset + iphl; 6373 int tcp_hlen; 6374 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0; 6375 6376 if (__predict_false(m0->m_len < 6377 (hlen + sizeof(struct tcphdr)))) { 6378 /* 6379 * TCP/IP headers are not in the first mbuf; we need 6380 * to do this the slow and painful way. Let's just 6381 * hope this doesn't happen very often. 6382 */ 6383 struct tcphdr th; 6384 6385 WM_EVCNT_INCR(&sc->sc_ev_txtsopain); 6386 6387 m_copydata(m0, hlen, sizeof(th), &th); 6388 if (v4) { 6389 struct ip ip; 6390 6391 m_copydata(m0, offset, sizeof(ip), &ip); 6392 ip.ip_len = 0; 6393 m_copyback(m0, 6394 offset + offsetof(struct ip, ip_len), 6395 sizeof(ip.ip_len), &ip.ip_len); 6396 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr, 6397 ip.ip_dst.s_addr, htons(IPPROTO_TCP)); 6398 } else { 6399 struct ip6_hdr ip6; 6400 6401 m_copydata(m0, offset, sizeof(ip6), &ip6); 6402 ip6.ip6_plen = 0; 6403 m_copyback(m0, 6404 offset + offsetof(struct ip6_hdr, ip6_plen), 6405 sizeof(ip6.ip6_plen), &ip6.ip6_plen); 6406 th.th_sum = in6_cksum_phdr(&ip6.ip6_src, 6407 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP)); 6408 } 6409 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum), 6410 sizeof(th.th_sum), &th.th_sum); 6411 6412 tcp_hlen = th.th_off << 2; 6413 } else { 6414 /* 6415 * TCP/IP headers are in the first mbuf; we can do 6416 * this the easy way. 6417 */ 6418 struct tcphdr *th; 6419 6420 if (v4) { 6421 struct ip *ip = 6422 (void *)(mtod(m0, char *) + offset); 6423 th = (void *)(mtod(m0, char *) + hlen); 6424 6425 ip->ip_len = 0; 6426 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 6427 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 6428 } else { 6429 struct ip6_hdr *ip6 = 6430 (void *)(mtod(m0, char *) + offset); 6431 th = (void *)(mtod(m0, char *) + hlen); 6432 6433 ip6->ip6_plen = 0; 6434 th->th_sum = in6_cksum_phdr(&ip6->ip6_src, 6435 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP)); 6436 } 6437 tcp_hlen = th->th_off << 2; 6438 } 6439 hlen += tcp_hlen; 6440 *cmdlenp |= NQTX_CMD_TSE; 6441 6442 if (v4) { 6443 WM_EVCNT_INCR(&sc->sc_ev_txtso); 6444 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM; 6445 } else { 6446 WM_EVCNT_INCR(&sc->sc_ev_txtso6); 6447 *fieldsp |= NQTXD_FIELDS_TUXSM; 6448 } 6449 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT); 6450 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0); 6451 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT); 6452 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0); 6453 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT); 6454 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0); 6455 } else { 6456 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT); 6457 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0); 6458 } 6459 6460 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) { 6461 *fieldsp |= NQTXD_FIELDS_IXSM; 6462 cmdc |= NQTXC_CMD_IP4; 6463 } 6464 6465 if (m0->m_pkthdr.csum_flags & 6466 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) { 6467 WM_EVCNT_INCR(&sc->sc_ev_txtusum); 6468 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) { 6469 cmdc |= NQTXC_CMD_TCP; 6470 } else { 6471 cmdc |= NQTXC_CMD_UDP; 6472 } 6473 cmdc |= NQTXC_CMD_IP4; 6474 *fieldsp |= NQTXD_FIELDS_TUXSM; 6475 } 6476 if (m0->m_pkthdr.csum_flags & 6477 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) { 6478 WM_EVCNT_INCR(&sc->sc_ev_txtusum6); 6479 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) { 6480 cmdc |= NQTXC_CMD_TCP; 6481 } else { 6482 cmdc |= NQTXC_CMD_UDP; 6483 } 6484 cmdc |= NQTXC_CMD_IP6; 6485 *fieldsp |= NQTXD_FIELDS_TUXSM; 6486 } 6487 6488 /* Fill in the context descriptor. */ 6489 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len = 6490 htole32(vl_len); 6491 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0; 6492 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd = 6493 htole32(cmdc); 6494 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx = 6495 htole32(mssidx); 6496 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE); 6497 DPRINTF(WM_DEBUG_TX, 6498 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev), 6499 txq->txq_next, 0, vl_len)); 6500 DPRINTF(WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc)); 6501 txq->txq_next = WM_NEXTTX(txq, txq->txq_next); 6502 txs->txs_ndesc++; 6503 return 0; 6504 } 6505 6506 /* 6507 * wm_nq_start: [ifnet interface function] 6508 * 6509 * Start packet transmission on the interface for NEWQUEUE devices 6510 */ 6511 static void 6512 wm_nq_start(struct ifnet *ifp) 6513 { 6514 struct wm_softc *sc = ifp->if_softc; 6515 struct wm_txqueue *txq = &sc->sc_txq[0]; 6516 6517 WM_TX_LOCK(txq); 6518 if (!sc->sc_stopping) 6519 wm_nq_start_locked(ifp); 6520 WM_TX_UNLOCK(txq); 6521 } 6522 6523 static void 6524 wm_nq_start_locked(struct ifnet *ifp) 6525 { 6526 struct wm_softc *sc = ifp->if_softc; 6527 struct wm_txqueue *txq = &sc->sc_txq[0]; 6528 struct mbuf *m0; 6529 struct m_tag *mtag; 6530 struct wm_txsoft *txs; 6531 bus_dmamap_t dmamap; 6532 int error, nexttx, lasttx = -1, seg, segs_needed; 6533 bool do_csum, sent; 6534 6535 KASSERT(WM_TX_LOCKED(txq)); 6536 6537 if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING) 6538 return; 6539 6540 sent = false; 6541 6542 /* 6543 * Loop through the send queue, setting up transmit descriptors 6544 * until we drain the queue, or use up all available transmit 6545 * descriptors. 6546 */ 6547 for (;;) { 6548 m0 = NULL; 6549 6550 /* Get a work queue entry. */ 6551 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) { 6552 wm_txeof(sc); 6553 if (txq->txq_sfree == 0) { 6554 DPRINTF(WM_DEBUG_TX, 6555 ("%s: TX: no free job descriptors\n", 6556 device_xname(sc->sc_dev))); 6557 WM_EVCNT_INCR(&sc->sc_ev_txsstall); 6558 break; 6559 } 6560 } 6561 6562 /* Grab a packet off the queue. */ 6563 IFQ_DEQUEUE(&ifp->if_snd, m0); 6564 if (m0 == NULL) 6565 break; 6566 6567 DPRINTF(WM_DEBUG_TX, 6568 ("%s: TX: have packet to transmit: %p\n", 6569 device_xname(sc->sc_dev), m0)); 6570 6571 txs = &txq->txq_soft[txq->txq_snext]; 6572 dmamap = txs->txs_dmamap; 6573 6574 /* 6575 * Load the DMA map. If this fails, the packet either 6576 * didn't fit in the allotted number of segments, or we 6577 * were short on resources. For the too-many-segments 6578 * case, we simply report an error and drop the packet, 6579 * since we can't sanely copy a jumbo packet to a single 6580 * buffer. 6581 */ 6582 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 6583 BUS_DMA_WRITE|BUS_DMA_NOWAIT); 6584 if (error) { 6585 if (error == EFBIG) { 6586 WM_EVCNT_INCR(&sc->sc_ev_txdrop); 6587 log(LOG_ERR, "%s: Tx packet consumes too many " 6588 "DMA segments, dropping...\n", 6589 device_xname(sc->sc_dev)); 6590 wm_dump_mbuf_chain(sc, m0); 6591 m_freem(m0); 6592 continue; 6593 } 6594 /* Short on resources, just stop for now. */ 6595 DPRINTF(WM_DEBUG_TX, 6596 ("%s: TX: dmamap load failed: %d\n", 6597 device_xname(sc->sc_dev), error)); 6598 break; 6599 } 6600 6601 segs_needed = dmamap->dm_nsegs; 6602 6603 /* 6604 * Ensure we have enough descriptors free to describe 6605 * the packet. Note, we always reserve one descriptor 6606 * at the end of the ring due to the semantics of the 6607 * TDT register, plus one more in the event we need 6608 * to load offload context. 6609 */ 6610 if (segs_needed > txq->txq_free - 2) { 6611 /* 6612 * Not enough free descriptors to transmit this 6613 * packet. We haven't committed anything yet, 6614 * so just unload the DMA map, put the packet 6615 * pack on the queue, and punt. Notify the upper 6616 * layer that there are no more slots left. 6617 */ 6618 DPRINTF(WM_DEBUG_TX, 6619 ("%s: TX: need %d (%d) descriptors, have %d\n", 6620 device_xname(sc->sc_dev), dmamap->dm_nsegs, 6621 segs_needed, txq->txq_free - 1)); 6622 ifp->if_flags |= IFF_OACTIVE; 6623 bus_dmamap_unload(sc->sc_dmat, dmamap); 6624 WM_EVCNT_INCR(&sc->sc_ev_txdstall); 6625 break; 6626 } 6627 6628 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */ 6629 6630 DPRINTF(WM_DEBUG_TX, 6631 ("%s: TX: packet has %d (%d) DMA segments\n", 6632 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed)); 6633 6634 WM_EVCNT_INCR(&sc->sc_ev_txseg[dmamap->dm_nsegs - 1]); 6635 6636 /* 6637 * Store a pointer to the packet so that we can free it 6638 * later. 6639 * 6640 * Initially, we consider the number of descriptors the 6641 * packet uses the number of DMA segments. This may be 6642 * incremented by 1 if we do checksum offload (a descriptor 6643 * is used to set the checksum context). 6644 */ 6645 txs->txs_mbuf = m0; 6646 txs->txs_firstdesc = txq->txq_next; 6647 txs->txs_ndesc = segs_needed; 6648 6649 /* Set up offload parameters for this packet. */ 6650 uint32_t cmdlen, fields, dcmdlen; 6651 if (m0->m_pkthdr.csum_flags & 6652 (M_CSUM_TSOv4|M_CSUM_TSOv6| 6653 M_CSUM_IPv4|M_CSUM_TCPv4|M_CSUM_UDPv4| 6654 M_CSUM_TCPv6|M_CSUM_UDPv6)) { 6655 if (wm_nq_tx_offload(sc, txs, &cmdlen, &fields, 6656 &do_csum) != 0) { 6657 /* Error message already displayed. */ 6658 bus_dmamap_unload(sc->sc_dmat, dmamap); 6659 continue; 6660 } 6661 } else { 6662 do_csum = false; 6663 cmdlen = 0; 6664 fields = 0; 6665 } 6666 6667 /* Sync the DMA map. */ 6668 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 6669 BUS_DMASYNC_PREWRITE); 6670 6671 /* Initialize the first transmit descriptor. */ 6672 nexttx = txq->txq_next; 6673 if (!do_csum) { 6674 /* setup a legacy descriptor */ 6675 wm_set_dma_addr( 6676 &txq->txq_descs[nexttx].wtx_addr, 6677 dmamap->dm_segs[0].ds_addr); 6678 txq->txq_descs[nexttx].wtx_cmdlen = 6679 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len); 6680 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0; 6681 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0; 6682 if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != 6683 NULL) { 6684 txq->txq_descs[nexttx].wtx_cmdlen |= 6685 htole32(WTX_CMD_VLE); 6686 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan = 6687 htole16(VLAN_TAG_VALUE(mtag) & 0xffff); 6688 } else { 6689 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0; 6690 } 6691 dcmdlen = 0; 6692 } else { 6693 /* setup an advanced data descriptor */ 6694 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr = 6695 htole64(dmamap->dm_segs[0].ds_addr); 6696 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0); 6697 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen = 6698 htole32(dmamap->dm_segs[0].ds_len | cmdlen ); 6699 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 6700 htole32(fields); 6701 DPRINTF(WM_DEBUG_TX, 6702 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n", 6703 device_xname(sc->sc_dev), nexttx, 6704 (uint64_t)dmamap->dm_segs[0].ds_addr)); 6705 DPRINTF(WM_DEBUG_TX, 6706 ("\t 0x%08x%08x\n", fields, 6707 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen)); 6708 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT; 6709 } 6710 6711 lasttx = nexttx; 6712 nexttx = WM_NEXTTX(txq, nexttx); 6713 /* 6714 * fill in the next descriptors. legacy or adcanced format 6715 * is the same here 6716 */ 6717 for (seg = 1; seg < dmamap->dm_nsegs; 6718 seg++, nexttx = WM_NEXTTX(txq, nexttx)) { 6719 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr = 6720 htole64(dmamap->dm_segs[seg].ds_addr); 6721 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen = 6722 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len); 6723 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0); 6724 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0; 6725 lasttx = nexttx; 6726 6727 DPRINTF(WM_DEBUG_TX, 6728 ("%s: TX: desc %d: %#" PRIx64 ", " 6729 "len %#04zx\n", 6730 device_xname(sc->sc_dev), nexttx, 6731 (uint64_t)dmamap->dm_segs[seg].ds_addr, 6732 dmamap->dm_segs[seg].ds_len)); 6733 } 6734 6735 KASSERT(lasttx != -1); 6736 6737 /* 6738 * Set up the command byte on the last descriptor of 6739 * the packet. If we're in the interrupt delay window, 6740 * delay the interrupt. 6741 */ 6742 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) == 6743 (NQTX_CMD_EOP | NQTX_CMD_RS)); 6744 txq->txq_descs[lasttx].wtx_cmdlen |= 6745 htole32(WTX_CMD_EOP | WTX_CMD_RS); 6746 6747 txs->txs_lastdesc = lasttx; 6748 6749 DPRINTF(WM_DEBUG_TX, 6750 ("%s: TX: desc %d: cmdlen 0x%08x\n", 6751 device_xname(sc->sc_dev), 6752 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen))); 6753 6754 /* Sync the descriptors we're using. */ 6755 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc, 6756 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 6757 6758 /* Give the packet to the chip. */ 6759 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx); 6760 sent = true; 6761 6762 DPRINTF(WM_DEBUG_TX, 6763 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx)); 6764 6765 DPRINTF(WM_DEBUG_TX, 6766 ("%s: TX: finished transmitting packet, job %d\n", 6767 device_xname(sc->sc_dev), txq->txq_snext)); 6768 6769 /* Advance the tx pointer. */ 6770 txq->txq_free -= txs->txs_ndesc; 6771 txq->txq_next = nexttx; 6772 6773 txq->txq_sfree--; 6774 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext); 6775 6776 /* Pass the packet to any BPF listeners. */ 6777 bpf_mtap(ifp, m0); 6778 } 6779 6780 if (m0 != NULL) { 6781 ifp->if_flags |= IFF_OACTIVE; 6782 WM_EVCNT_INCR(&sc->sc_ev_txdrop); 6783 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", __func__)); 6784 m_freem(m0); 6785 } 6786 6787 if (txq->txq_sfree == 0 || txq->txq_free <= 2) { 6788 /* No more slots; notify upper layer. */ 6789 ifp->if_flags |= IFF_OACTIVE; 6790 } 6791 6792 if (sent) { 6793 /* Set a watchdog timer in case the chip flakes out. */ 6794 ifp->if_timer = 5; 6795 } 6796 } 6797 6798 /* Interrupt */ 6799 6800 /* 6801 * wm_txeof: 6802 * 6803 * Helper; handle transmit interrupts. 6804 */ 6805 static int 6806 wm_txeof(struct wm_softc *sc) 6807 { 6808 struct wm_txqueue *txq = &sc->sc_txq[0]; 6809 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6810 struct wm_txsoft *txs; 6811 bool processed = false; 6812 int count = 0; 6813 int i; 6814 uint8_t status; 6815 6816 if (sc->sc_stopping) 6817 return 0; 6818 6819 ifp->if_flags &= ~IFF_OACTIVE; 6820 6821 /* 6822 * Go through the Tx list and free mbufs for those 6823 * frames which have been transmitted. 6824 */ 6825 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq); 6826 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) { 6827 txs = &txq->txq_soft[i]; 6828 6829 DPRINTF(WM_DEBUG_TX, 6830 ("%s: TX: checking job %d\n", device_xname(sc->sc_dev), i)); 6831 6832 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc, 6833 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 6834 6835 status = 6836 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status; 6837 if ((status & WTX_ST_DD) == 0) { 6838 wm_cdtxsync(txq, txs->txs_lastdesc, 1, 6839 BUS_DMASYNC_PREREAD); 6840 break; 6841 } 6842 6843 processed = true; 6844 count++; 6845 DPRINTF(WM_DEBUG_TX, 6846 ("%s: TX: job %d done: descs %d..%d\n", 6847 device_xname(sc->sc_dev), i, txs->txs_firstdesc, 6848 txs->txs_lastdesc)); 6849 6850 /* 6851 * XXX We should probably be using the statistics 6852 * XXX registers, but I don't know if they exist 6853 * XXX on chips before the i82544. 6854 */ 6855 6856 #ifdef WM_EVENT_COUNTERS 6857 if (status & WTX_ST_TU) 6858 WM_EVCNT_INCR(&sc->sc_ev_tu); 6859 #endif /* WM_EVENT_COUNTERS */ 6860 6861 if (status & (WTX_ST_EC|WTX_ST_LC)) { 6862 ifp->if_oerrors++; 6863 if (status & WTX_ST_LC) 6864 log(LOG_WARNING, "%s: late collision\n", 6865 device_xname(sc->sc_dev)); 6866 else if (status & WTX_ST_EC) { 6867 ifp->if_collisions += 16; 6868 log(LOG_WARNING, "%s: excessive collisions\n", 6869 device_xname(sc->sc_dev)); 6870 } 6871 } else 6872 ifp->if_opackets++; 6873 6874 txq->txq_free += txs->txs_ndesc; 6875 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap, 6876 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); 6877 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 6878 m_freem(txs->txs_mbuf); 6879 txs->txs_mbuf = NULL; 6880 } 6881 6882 /* Update the dirty transmit buffer pointer. */ 6883 txq->txq_sdirty = i; 6884 DPRINTF(WM_DEBUG_TX, 6885 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i)); 6886 6887 if (count != 0) 6888 rnd_add_uint32(&sc->rnd_source, count); 6889 6890 /* 6891 * If there are no more pending transmissions, cancel the watchdog 6892 * timer. 6893 */ 6894 if (txq->txq_sfree == WM_TXQUEUELEN(txq)) 6895 ifp->if_timer = 0; 6896 6897 return processed; 6898 } 6899 6900 /* 6901 * wm_rxeof: 6902 * 6903 * Helper; handle receive interrupts. 6904 */ 6905 static void 6906 wm_rxeof(struct wm_rxqueue *rxq) 6907 { 6908 struct wm_softc *sc = rxq->rxq_sc; 6909 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6910 struct wm_rxsoft *rxs; 6911 struct mbuf *m; 6912 int i, len; 6913 int count = 0; 6914 uint8_t status, errors; 6915 uint16_t vlantag; 6916 6917 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) { 6918 rxs = &rxq->rxq_soft[i]; 6919 6920 DPRINTF(WM_DEBUG_RX, 6921 ("%s: RX: checking descriptor %d\n", 6922 device_xname(sc->sc_dev), i)); 6923 6924 wm_cdrxsync(rxq, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 6925 6926 status = rxq->rxq_descs[i].wrx_status; 6927 errors = rxq->rxq_descs[i].wrx_errors; 6928 len = le16toh(rxq->rxq_descs[i].wrx_len); 6929 vlantag = rxq->rxq_descs[i].wrx_special; 6930 6931 if ((status & WRX_ST_DD) == 0) { 6932 /* We have processed all of the receive descriptors. */ 6933 wm_cdrxsync(rxq, i, BUS_DMASYNC_PREREAD); 6934 break; 6935 } 6936 6937 count++; 6938 if (__predict_false(rxq->rxq_discard)) { 6939 DPRINTF(WM_DEBUG_RX, 6940 ("%s: RX: discarding contents of descriptor %d\n", 6941 device_xname(sc->sc_dev), i)); 6942 wm_init_rxdesc(rxq, i); 6943 if (status & WRX_ST_EOP) { 6944 /* Reset our state. */ 6945 DPRINTF(WM_DEBUG_RX, 6946 ("%s: RX: resetting rxdiscard -> 0\n", 6947 device_xname(sc->sc_dev))); 6948 rxq->rxq_discard = 0; 6949 } 6950 continue; 6951 } 6952 6953 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 6954 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 6955 6956 m = rxs->rxs_mbuf; 6957 6958 /* 6959 * Add a new receive buffer to the ring, unless of 6960 * course the length is zero. Treat the latter as a 6961 * failed mapping. 6962 */ 6963 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) { 6964 /* 6965 * Failed, throw away what we've done so 6966 * far, and discard the rest of the packet. 6967 */ 6968 ifp->if_ierrors++; 6969 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 6970 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 6971 wm_init_rxdesc(rxq, i); 6972 if ((status & WRX_ST_EOP) == 0) 6973 rxq->rxq_discard = 1; 6974 if (rxq->rxq_head != NULL) 6975 m_freem(rxq->rxq_head); 6976 WM_RXCHAIN_RESET(rxq); 6977 DPRINTF(WM_DEBUG_RX, 6978 ("%s: RX: Rx buffer allocation failed, " 6979 "dropping packet%s\n", device_xname(sc->sc_dev), 6980 rxq->rxq_discard ? " (discard)" : "")); 6981 continue; 6982 } 6983 6984 m->m_len = len; 6985 rxq->rxq_len += len; 6986 DPRINTF(WM_DEBUG_RX, 6987 ("%s: RX: buffer at %p len %d\n", 6988 device_xname(sc->sc_dev), m->m_data, len)); 6989 6990 /* If this is not the end of the packet, keep looking. */ 6991 if ((status & WRX_ST_EOP) == 0) { 6992 WM_RXCHAIN_LINK(rxq, m); 6993 DPRINTF(WM_DEBUG_RX, 6994 ("%s: RX: not yet EOP, rxlen -> %d\n", 6995 device_xname(sc->sc_dev), rxq->rxq_len)); 6996 continue; 6997 } 6998 6999 /* 7000 * Okay, we have the entire packet now. The chip is 7001 * configured to include the FCS except I350 and I21[01] 7002 * (not all chips can be configured to strip it), 7003 * so we need to trim it. 7004 * May need to adjust length of previous mbuf in the 7005 * chain if the current mbuf is too short. 7006 * For an eratta, the RCTL_SECRC bit in RCTL register 7007 * is always set in I350, so we don't trim it. 7008 */ 7009 if ((sc->sc_type != WM_T_I350) && (sc->sc_type != WM_T_I354) 7010 && (sc->sc_type != WM_T_I210) 7011 && (sc->sc_type != WM_T_I211)) { 7012 if (m->m_len < ETHER_CRC_LEN) { 7013 rxq->rxq_tail->m_len 7014 -= (ETHER_CRC_LEN - m->m_len); 7015 m->m_len = 0; 7016 } else 7017 m->m_len -= ETHER_CRC_LEN; 7018 len = rxq->rxq_len - ETHER_CRC_LEN; 7019 } else 7020 len = rxq->rxq_len; 7021 7022 WM_RXCHAIN_LINK(rxq, m); 7023 7024 *rxq->rxq_tailp = NULL; 7025 m = rxq->rxq_head; 7026 7027 WM_RXCHAIN_RESET(rxq); 7028 7029 DPRINTF(WM_DEBUG_RX, 7030 ("%s: RX: have entire packet, len -> %d\n", 7031 device_xname(sc->sc_dev), len)); 7032 7033 /* If an error occurred, update stats and drop the packet. */ 7034 if (errors & 7035 (WRX_ER_CE|WRX_ER_SE|WRX_ER_SEQ|WRX_ER_CXE|WRX_ER_RXE)) { 7036 if (errors & WRX_ER_SE) 7037 log(LOG_WARNING, "%s: symbol error\n", 7038 device_xname(sc->sc_dev)); 7039 else if (errors & WRX_ER_SEQ) 7040 log(LOG_WARNING, "%s: receive sequence error\n", 7041 device_xname(sc->sc_dev)); 7042 else if (errors & WRX_ER_CE) 7043 log(LOG_WARNING, "%s: CRC error\n", 7044 device_xname(sc->sc_dev)); 7045 m_freem(m); 7046 continue; 7047 } 7048 7049 /* No errors. Receive the packet. */ 7050 m->m_pkthdr.rcvif = ifp; 7051 m->m_pkthdr.len = len; 7052 7053 /* 7054 * If VLANs are enabled, VLAN packets have been unwrapped 7055 * for us. Associate the tag with the packet. 7056 */ 7057 /* XXXX should check for i350 and i354 */ 7058 if ((status & WRX_ST_VP) != 0) { 7059 VLAN_INPUT_TAG(ifp, m, 7060 le16toh(vlantag), 7061 continue); 7062 } 7063 7064 /* Set up checksum info for this packet. */ 7065 if ((status & WRX_ST_IXSM) == 0) { 7066 if (status & WRX_ST_IPCS) { 7067 WM_EVCNT_INCR(&sc->sc_ev_rxipsum); 7068 m->m_pkthdr.csum_flags |= M_CSUM_IPv4; 7069 if (errors & WRX_ER_IPE) 7070 m->m_pkthdr.csum_flags |= 7071 M_CSUM_IPv4_BAD; 7072 } 7073 if (status & WRX_ST_TCPCS) { 7074 /* 7075 * Note: we don't know if this was TCP or UDP, 7076 * so we just set both bits, and expect the 7077 * upper layers to deal. 7078 */ 7079 WM_EVCNT_INCR(&sc->sc_ev_rxtusum); 7080 m->m_pkthdr.csum_flags |= 7081 M_CSUM_TCPv4 | M_CSUM_UDPv4 | 7082 M_CSUM_TCPv6 | M_CSUM_UDPv6; 7083 if (errors & WRX_ER_TCPE) 7084 m->m_pkthdr.csum_flags |= 7085 M_CSUM_TCP_UDP_BAD; 7086 } 7087 } 7088 7089 ifp->if_ipackets++; 7090 7091 WM_RX_UNLOCK(rxq); 7092 7093 /* Pass this up to any BPF listeners. */ 7094 bpf_mtap(ifp, m); 7095 7096 /* Pass it on. */ 7097 (*ifp->if_input)(ifp, m); 7098 7099 WM_RX_LOCK(rxq); 7100 7101 if (sc->sc_stopping) 7102 break; 7103 } 7104 7105 /* Update the receive pointer. */ 7106 rxq->rxq_ptr = i; 7107 if (count != 0) 7108 rnd_add_uint32(&sc->rnd_source, count); 7109 7110 DPRINTF(WM_DEBUG_RX, 7111 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i)); 7112 } 7113 7114 /* 7115 * wm_linkintr_gmii: 7116 * 7117 * Helper; handle link interrupts for GMII. 7118 */ 7119 static void 7120 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr) 7121 { 7122 7123 KASSERT(WM_CORE_LOCKED(sc)); 7124 7125 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 7126 __func__)); 7127 7128 if (icr & ICR_LSC) { 7129 uint32_t status = CSR_READ(sc, WMREG_STATUS); 7130 7131 if ((sc->sc_type == WM_T_ICH8) && ((status & STATUS_LU) == 0)) 7132 wm_gig_downshift_workaround_ich8lan(sc); 7133 7134 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n", 7135 device_xname(sc->sc_dev))); 7136 mii_pollstat(&sc->sc_mii); 7137 if (sc->sc_type == WM_T_82543) { 7138 int miistatus, active; 7139 7140 /* 7141 * With 82543, we need to force speed and 7142 * duplex on the MAC equal to what the PHY 7143 * speed and duplex configuration is. 7144 */ 7145 miistatus = sc->sc_mii.mii_media_status; 7146 7147 if (miistatus & IFM_ACTIVE) { 7148 active = sc->sc_mii.mii_media_active; 7149 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD); 7150 switch (IFM_SUBTYPE(active)) { 7151 case IFM_10_T: 7152 sc->sc_ctrl |= CTRL_SPEED_10; 7153 break; 7154 case IFM_100_TX: 7155 sc->sc_ctrl |= CTRL_SPEED_100; 7156 break; 7157 case IFM_1000_T: 7158 sc->sc_ctrl |= CTRL_SPEED_1000; 7159 break; 7160 default: 7161 /* 7162 * fiber? 7163 * Shoud not enter here. 7164 */ 7165 printf("unknown media (%x)\n", 7166 active); 7167 break; 7168 } 7169 if (active & IFM_FDX) 7170 sc->sc_ctrl |= CTRL_FD; 7171 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7172 } 7173 } else if ((sc->sc_type == WM_T_ICH8) 7174 && (sc->sc_phytype == WMPHY_IGP_3)) { 7175 wm_kmrn_lock_loss_workaround_ich8lan(sc); 7176 } else if (sc->sc_type == WM_T_PCH) { 7177 wm_k1_gig_workaround_hv(sc, 7178 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0)); 7179 } 7180 7181 if ((sc->sc_phytype == WMPHY_82578) 7182 && (IFM_SUBTYPE(sc->sc_mii.mii_media_active) 7183 == IFM_1000_T)) { 7184 7185 if ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0) { 7186 delay(200*1000); /* XXX too big */ 7187 7188 /* Link stall fix for link up */ 7189 wm_gmii_hv_writereg(sc->sc_dev, 1, 7190 HV_MUX_DATA_CTRL, 7191 HV_MUX_DATA_CTRL_GEN_TO_MAC 7192 | HV_MUX_DATA_CTRL_FORCE_SPEED); 7193 wm_gmii_hv_writereg(sc->sc_dev, 1, 7194 HV_MUX_DATA_CTRL, 7195 HV_MUX_DATA_CTRL_GEN_TO_MAC); 7196 } 7197 } 7198 } else if (icr & ICR_RXSEQ) { 7199 DPRINTF(WM_DEBUG_LINK, 7200 ("%s: LINK Receive sequence error\n", 7201 device_xname(sc->sc_dev))); 7202 } 7203 } 7204 7205 /* 7206 * wm_linkintr_tbi: 7207 * 7208 * Helper; handle link interrupts for TBI mode. 7209 */ 7210 static void 7211 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr) 7212 { 7213 uint32_t status; 7214 7215 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 7216 __func__)); 7217 7218 status = CSR_READ(sc, WMREG_STATUS); 7219 if (icr & ICR_LSC) { 7220 if (status & STATUS_LU) { 7221 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n", 7222 device_xname(sc->sc_dev), 7223 (status & STATUS_FD) ? "FDX" : "HDX")); 7224 /* 7225 * NOTE: CTRL will update TFCE and RFCE automatically, 7226 * so we should update sc->sc_ctrl 7227 */ 7228 7229 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 7230 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 7231 sc->sc_fcrtl &= ~FCRTL_XONE; 7232 if (status & STATUS_FD) 7233 sc->sc_tctl |= 7234 TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 7235 else 7236 sc->sc_tctl |= 7237 TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 7238 if (sc->sc_ctrl & CTRL_TFCE) 7239 sc->sc_fcrtl |= FCRTL_XONE; 7240 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 7241 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 7242 WMREG_OLD_FCRTL : WMREG_FCRTL, 7243 sc->sc_fcrtl); 7244 sc->sc_tbi_linkup = 1; 7245 } else { 7246 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n", 7247 device_xname(sc->sc_dev))); 7248 sc->sc_tbi_linkup = 0; 7249 } 7250 /* Update LED */ 7251 wm_tbi_serdes_set_linkled(sc); 7252 } else if (icr & ICR_RXSEQ) { 7253 DPRINTF(WM_DEBUG_LINK, 7254 ("%s: LINK: Receive sequence error\n", 7255 device_xname(sc->sc_dev))); 7256 } 7257 } 7258 7259 /* 7260 * wm_linkintr_serdes: 7261 * 7262 * Helper; handle link interrupts for TBI mode. 7263 */ 7264 static void 7265 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr) 7266 { 7267 struct mii_data *mii = &sc->sc_mii; 7268 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 7269 uint32_t pcs_adv, pcs_lpab, reg; 7270 7271 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev), 7272 __func__)); 7273 7274 if (icr & ICR_LSC) { 7275 /* Check PCS */ 7276 reg = CSR_READ(sc, WMREG_PCS_LSTS); 7277 if ((reg & PCS_LSTS_LINKOK) != 0) { 7278 mii->mii_media_status |= IFM_ACTIVE; 7279 sc->sc_tbi_linkup = 1; 7280 } else { 7281 mii->mii_media_status |= IFM_NONE; 7282 sc->sc_tbi_linkup = 0; 7283 wm_tbi_serdes_set_linkled(sc); 7284 return; 7285 } 7286 mii->mii_media_active |= IFM_1000_SX; 7287 if ((reg & PCS_LSTS_FDX) != 0) 7288 mii->mii_media_active |= IFM_FDX; 7289 else 7290 mii->mii_media_active |= IFM_HDX; 7291 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 7292 /* Check flow */ 7293 reg = CSR_READ(sc, WMREG_PCS_LSTS); 7294 if ((reg & PCS_LSTS_AN_COMP) == 0) { 7295 DPRINTF(WM_DEBUG_LINK, 7296 ("XXX LINKOK but not ACOMP\n")); 7297 return; 7298 } 7299 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV); 7300 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB); 7301 DPRINTF(WM_DEBUG_LINK, 7302 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab)); 7303 if ((pcs_adv & TXCW_SYM_PAUSE) 7304 && (pcs_lpab & TXCW_SYM_PAUSE)) { 7305 mii->mii_media_active |= IFM_FLOW 7306 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 7307 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0) 7308 && (pcs_adv & TXCW_ASYM_PAUSE) 7309 && (pcs_lpab & TXCW_SYM_PAUSE) 7310 && (pcs_lpab & TXCW_ASYM_PAUSE)) 7311 mii->mii_media_active |= IFM_FLOW 7312 | IFM_ETH_TXPAUSE; 7313 else if ((pcs_adv & TXCW_SYM_PAUSE) 7314 && (pcs_adv & TXCW_ASYM_PAUSE) 7315 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0) 7316 && (pcs_lpab & TXCW_ASYM_PAUSE)) 7317 mii->mii_media_active |= IFM_FLOW 7318 | IFM_ETH_RXPAUSE; 7319 } 7320 /* Update LED */ 7321 wm_tbi_serdes_set_linkled(sc); 7322 } else { 7323 DPRINTF(WM_DEBUG_LINK, 7324 ("%s: LINK: Receive sequence error\n", 7325 device_xname(sc->sc_dev))); 7326 } 7327 } 7328 7329 /* 7330 * wm_linkintr: 7331 * 7332 * Helper; handle link interrupts. 7333 */ 7334 static void 7335 wm_linkintr(struct wm_softc *sc, uint32_t icr) 7336 { 7337 7338 KASSERT(WM_CORE_LOCKED(sc)); 7339 7340 if (sc->sc_flags & WM_F_HAS_MII) 7341 wm_linkintr_gmii(sc, icr); 7342 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES) 7343 && (sc->sc_type >= WM_T_82575)) 7344 wm_linkintr_serdes(sc, icr); 7345 else 7346 wm_linkintr_tbi(sc, icr); 7347 } 7348 7349 /* 7350 * wm_intr_legacy: 7351 * 7352 * Interrupt service routine for INTx and MSI. 7353 */ 7354 static int 7355 wm_intr_legacy(void *arg) 7356 { 7357 struct wm_softc *sc = arg; 7358 struct wm_txqueue *txq = &sc->sc_txq[0]; 7359 struct wm_rxqueue *rxq = &sc->sc_rxq[0]; 7360 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 7361 uint32_t icr, rndval = 0; 7362 int handled = 0; 7363 7364 DPRINTF(WM_DEBUG_TX, 7365 ("%s: INTx: got intr\n", device_xname(sc->sc_dev))); 7366 while (1 /* CONSTCOND */) { 7367 icr = CSR_READ(sc, WMREG_ICR); 7368 if ((icr & sc->sc_icr) == 0) 7369 break; 7370 if (rndval == 0) 7371 rndval = icr; 7372 7373 WM_RX_LOCK(rxq); 7374 7375 if (sc->sc_stopping) { 7376 WM_RX_UNLOCK(rxq); 7377 break; 7378 } 7379 7380 handled = 1; 7381 7382 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS) 7383 if (icr & (ICR_RXDMT0|ICR_RXT0)) { 7384 DPRINTF(WM_DEBUG_RX, 7385 ("%s: RX: got Rx intr 0x%08x\n", 7386 device_xname(sc->sc_dev), 7387 icr & (ICR_RXDMT0|ICR_RXT0))); 7388 WM_EVCNT_INCR(&sc->sc_ev_rxintr); 7389 } 7390 #endif 7391 wm_rxeof(rxq); 7392 7393 WM_RX_UNLOCK(rxq); 7394 WM_TX_LOCK(txq); 7395 7396 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS) 7397 if (icr & ICR_TXDW) { 7398 DPRINTF(WM_DEBUG_TX, 7399 ("%s: TX: got TXDW interrupt\n", 7400 device_xname(sc->sc_dev))); 7401 WM_EVCNT_INCR(&sc->sc_ev_txdw); 7402 } 7403 #endif 7404 wm_txeof(sc); 7405 7406 WM_TX_UNLOCK(txq); 7407 WM_CORE_LOCK(sc); 7408 7409 if (icr & (ICR_LSC|ICR_RXSEQ)) { 7410 WM_EVCNT_INCR(&sc->sc_ev_linkintr); 7411 wm_linkintr(sc, icr); 7412 } 7413 7414 WM_CORE_UNLOCK(sc); 7415 7416 if (icr & ICR_RXO) { 7417 #if defined(WM_DEBUG) 7418 log(LOG_WARNING, "%s: Receive overrun\n", 7419 device_xname(sc->sc_dev)); 7420 #endif /* defined(WM_DEBUG) */ 7421 } 7422 } 7423 7424 rnd_add_uint32(&sc->rnd_source, rndval); 7425 7426 if (handled) { 7427 /* Try to get more packets going. */ 7428 ifp->if_start(ifp); 7429 } 7430 7431 return handled; 7432 } 7433 7434 /* 7435 * wm_txintr_msix: 7436 * 7437 * Interrupt service routine for TX complete interrupt for MSI-X. 7438 */ 7439 static int 7440 wm_txintr_msix(void *arg) 7441 { 7442 struct wm_txqueue *txq = arg; 7443 struct wm_softc *sc = txq->txq_sc; 7444 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 7445 int handled = 0; 7446 7447 DPRINTF(WM_DEBUG_TX, 7448 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev))); 7449 7450 if (sc->sc_type == WM_T_82574) 7451 CSR_WRITE(sc, WMREG_IMC, ICR_TXQ(txq->txq_id)); /* 82574 only */ 7452 else if (sc->sc_type == WM_T_82575) 7453 CSR_WRITE(sc, WMREG_EIMC, EITR_TX_QUEUE(txq->txq_id)); 7454 else 7455 CSR_WRITE(sc, WMREG_EIMC, 1 << txq->txq_intr_idx); 7456 7457 WM_TX_LOCK(txq); 7458 7459 if (sc->sc_stopping) 7460 goto out; 7461 7462 WM_EVCNT_INCR(&sc->sc_ev_txdw); 7463 handled = wm_txeof(sc); 7464 7465 out: 7466 WM_TX_UNLOCK(txq); 7467 7468 if (sc->sc_type == WM_T_82574) 7469 CSR_WRITE(sc, WMREG_IMS, ICR_TXQ(txq->txq_id)); /* 82574 only */ 7470 else if (sc->sc_type == WM_T_82575) 7471 CSR_WRITE(sc, WMREG_EIMS, EITR_TX_QUEUE(txq->txq_id)); 7472 else 7473 CSR_WRITE(sc, WMREG_EIMS, 1 << txq->txq_intr_idx); 7474 7475 if (handled) { 7476 /* Try to get more packets going. */ 7477 ifp->if_start(ifp); 7478 } 7479 7480 return handled; 7481 } 7482 7483 /* 7484 * wm_rxintr_msix: 7485 * 7486 * Interrupt service routine for RX interrupt for MSI-X. 7487 */ 7488 static int 7489 wm_rxintr_msix(void *arg) 7490 { 7491 struct wm_rxqueue *rxq = arg; 7492 struct wm_softc *sc = rxq->rxq_sc; 7493 7494 DPRINTF(WM_DEBUG_RX, 7495 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev))); 7496 7497 if (sc->sc_type == WM_T_82574) 7498 CSR_WRITE(sc, WMREG_IMC, ICR_RXQ(rxq->rxq_id)); /* 82574 only */ 7499 else if (sc->sc_type == WM_T_82575) 7500 CSR_WRITE(sc, WMREG_EIMC, EITR_RX_QUEUE(rxq->rxq_id)); 7501 else 7502 CSR_WRITE(sc, WMREG_EIMC, 1 << rxq->rxq_intr_idx); 7503 7504 WM_RX_LOCK(rxq); 7505 7506 if (sc->sc_stopping) 7507 goto out; 7508 7509 WM_EVCNT_INCR(&sc->sc_ev_rxintr); 7510 wm_rxeof(rxq); 7511 7512 out: 7513 WM_RX_UNLOCK(rxq); 7514 7515 if (sc->sc_type == WM_T_82574) 7516 CSR_WRITE(sc, WMREG_IMS, ICR_RXQ(rxq->rxq_id)); 7517 else if (sc->sc_type == WM_T_82575) 7518 CSR_WRITE(sc, WMREG_EIMS, EITR_RX_QUEUE(rxq->rxq_id)); 7519 else 7520 CSR_WRITE(sc, WMREG_EIMS, 1 << rxq->rxq_intr_idx); 7521 7522 return 1; 7523 } 7524 7525 /* 7526 * wm_linkintr_msix: 7527 * 7528 * Interrupt service routine for link status change for MSI-X. 7529 */ 7530 static int 7531 wm_linkintr_msix(void *arg) 7532 { 7533 struct wm_softc *sc = arg; 7534 uint32_t reg; 7535 7536 DPRINTF(WM_DEBUG_LINK, 7537 ("%s: LINK: got link intr\n", device_xname(sc->sc_dev))); 7538 7539 reg = CSR_READ(sc, WMREG_ICR); 7540 WM_CORE_LOCK(sc); 7541 if ((sc->sc_stopping) || ((reg & ICR_LSC) == 0)) 7542 goto out; 7543 7544 WM_EVCNT_INCR(&sc->sc_ev_linkintr); 7545 wm_linkintr(sc, ICR_LSC); 7546 7547 out: 7548 WM_CORE_UNLOCK(sc); 7549 7550 if (sc->sc_type == WM_T_82574) 7551 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC); /* 82574 only */ 7552 else if (sc->sc_type == WM_T_82575) 7553 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER); 7554 else 7555 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx); 7556 7557 return 1; 7558 } 7559 7560 /* 7561 * Media related. 7562 * GMII, SGMII, TBI (and SERDES) 7563 */ 7564 7565 /* Common */ 7566 7567 /* 7568 * wm_tbi_serdes_set_linkled: 7569 * 7570 * Update the link LED on TBI and SERDES devices. 7571 */ 7572 static void 7573 wm_tbi_serdes_set_linkled(struct wm_softc *sc) 7574 { 7575 7576 if (sc->sc_tbi_linkup) 7577 sc->sc_ctrl |= CTRL_SWDPIN(0); 7578 else 7579 sc->sc_ctrl &= ~CTRL_SWDPIN(0); 7580 7581 /* 82540 or newer devices are active low */ 7582 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0; 7583 7584 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7585 } 7586 7587 /* GMII related */ 7588 7589 /* 7590 * wm_gmii_reset: 7591 * 7592 * Reset the PHY. 7593 */ 7594 static void 7595 wm_gmii_reset(struct wm_softc *sc) 7596 { 7597 uint32_t reg; 7598 int rv; 7599 7600 /* get phy semaphore */ 7601 switch (sc->sc_type) { 7602 case WM_T_82571: 7603 case WM_T_82572: 7604 case WM_T_82573: 7605 case WM_T_82574: 7606 case WM_T_82583: 7607 /* XXX should get sw semaphore, too */ 7608 rv = wm_get_swsm_semaphore(sc); 7609 break; 7610 case WM_T_82575: 7611 case WM_T_82576: 7612 case WM_T_82580: 7613 case WM_T_I350: 7614 case WM_T_I354: 7615 case WM_T_I210: 7616 case WM_T_I211: 7617 case WM_T_80003: 7618 rv = wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 7619 break; 7620 case WM_T_ICH8: 7621 case WM_T_ICH9: 7622 case WM_T_ICH10: 7623 case WM_T_PCH: 7624 case WM_T_PCH2: 7625 case WM_T_PCH_LPT: 7626 rv = wm_get_swfwhw_semaphore(sc); 7627 break; 7628 default: 7629 /* nothing to do*/ 7630 rv = 0; 7631 break; 7632 } 7633 if (rv != 0) { 7634 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 7635 __func__); 7636 return; 7637 } 7638 7639 switch (sc->sc_type) { 7640 case WM_T_82542_2_0: 7641 case WM_T_82542_2_1: 7642 /* null */ 7643 break; 7644 case WM_T_82543: 7645 /* 7646 * With 82543, we need to force speed and duplex on the MAC 7647 * equal to what the PHY speed and duplex configuration is. 7648 * In addition, we need to perform a hardware reset on the PHY 7649 * to take it out of reset. 7650 */ 7651 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX; 7652 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7653 7654 /* The PHY reset pin is active-low. */ 7655 reg = CSR_READ(sc, WMREG_CTRL_EXT); 7656 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) | 7657 CTRL_EXT_SWDPIN(4)); 7658 reg |= CTRL_EXT_SWDPIO(4); 7659 7660 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 7661 CSR_WRITE_FLUSH(sc); 7662 delay(10*1000); 7663 7664 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4)); 7665 CSR_WRITE_FLUSH(sc); 7666 delay(150); 7667 #if 0 7668 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4); 7669 #endif 7670 delay(20*1000); /* XXX extra delay to get PHY ID? */ 7671 break; 7672 case WM_T_82544: /* reset 10000us */ 7673 case WM_T_82540: 7674 case WM_T_82545: 7675 case WM_T_82545_3: 7676 case WM_T_82546: 7677 case WM_T_82546_3: 7678 case WM_T_82541: 7679 case WM_T_82541_2: 7680 case WM_T_82547: 7681 case WM_T_82547_2: 7682 case WM_T_82571: /* reset 100us */ 7683 case WM_T_82572: 7684 case WM_T_82573: 7685 case WM_T_82574: 7686 case WM_T_82575: 7687 case WM_T_82576: 7688 case WM_T_82580: 7689 case WM_T_I350: 7690 case WM_T_I354: 7691 case WM_T_I210: 7692 case WM_T_I211: 7693 case WM_T_82583: 7694 case WM_T_80003: 7695 /* generic reset */ 7696 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 7697 CSR_WRITE_FLUSH(sc); 7698 delay(20000); 7699 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7700 CSR_WRITE_FLUSH(sc); 7701 delay(20000); 7702 7703 if ((sc->sc_type == WM_T_82541) 7704 || (sc->sc_type == WM_T_82541_2) 7705 || (sc->sc_type == WM_T_82547) 7706 || (sc->sc_type == WM_T_82547_2)) { 7707 /* workaround for igp are done in igp_reset() */ 7708 /* XXX add code to set LED after phy reset */ 7709 } 7710 break; 7711 case WM_T_ICH8: 7712 case WM_T_ICH9: 7713 case WM_T_ICH10: 7714 case WM_T_PCH: 7715 case WM_T_PCH2: 7716 case WM_T_PCH_LPT: 7717 /* generic reset */ 7718 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 7719 CSR_WRITE_FLUSH(sc); 7720 delay(100); 7721 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7722 CSR_WRITE_FLUSH(sc); 7723 delay(150); 7724 break; 7725 default: 7726 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev), 7727 __func__); 7728 break; 7729 } 7730 7731 /* release PHY semaphore */ 7732 switch (sc->sc_type) { 7733 case WM_T_82571: 7734 case WM_T_82572: 7735 case WM_T_82573: 7736 case WM_T_82574: 7737 case WM_T_82583: 7738 /* XXX should put sw semaphore, too */ 7739 wm_put_swsm_semaphore(sc); 7740 break; 7741 case WM_T_82575: 7742 case WM_T_82576: 7743 case WM_T_82580: 7744 case WM_T_I350: 7745 case WM_T_I354: 7746 case WM_T_I210: 7747 case WM_T_I211: 7748 case WM_T_80003: 7749 wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 7750 break; 7751 case WM_T_ICH8: 7752 case WM_T_ICH9: 7753 case WM_T_ICH10: 7754 case WM_T_PCH: 7755 case WM_T_PCH2: 7756 case WM_T_PCH_LPT: 7757 wm_put_swfwhw_semaphore(sc); 7758 break; 7759 default: 7760 /* nothing to do*/ 7761 rv = 0; 7762 break; 7763 } 7764 7765 /* get_cfg_done */ 7766 wm_get_cfg_done(sc); 7767 7768 /* extra setup */ 7769 switch (sc->sc_type) { 7770 case WM_T_82542_2_0: 7771 case WM_T_82542_2_1: 7772 case WM_T_82543: 7773 case WM_T_82544: 7774 case WM_T_82540: 7775 case WM_T_82545: 7776 case WM_T_82545_3: 7777 case WM_T_82546: 7778 case WM_T_82546_3: 7779 case WM_T_82541_2: 7780 case WM_T_82547_2: 7781 case WM_T_82571: 7782 case WM_T_82572: 7783 case WM_T_82573: 7784 case WM_T_82575: 7785 case WM_T_82576: 7786 case WM_T_82580: 7787 case WM_T_I350: 7788 case WM_T_I354: 7789 case WM_T_I210: 7790 case WM_T_I211: 7791 case WM_T_80003: 7792 /* null */ 7793 break; 7794 case WM_T_82574: 7795 case WM_T_82583: 7796 wm_lplu_d0_disable(sc); 7797 break; 7798 case WM_T_82541: 7799 case WM_T_82547: 7800 /* XXX Configure actively LED after PHY reset */ 7801 break; 7802 case WM_T_ICH8: 7803 case WM_T_ICH9: 7804 case WM_T_ICH10: 7805 case WM_T_PCH: 7806 case WM_T_PCH2: 7807 case WM_T_PCH_LPT: 7808 /* Allow time for h/w to get to a quiescent state afer reset */ 7809 delay(10*1000); 7810 7811 if (sc->sc_type == WM_T_PCH) 7812 wm_hv_phy_workaround_ich8lan(sc); 7813 7814 if (sc->sc_type == WM_T_PCH2) 7815 wm_lv_phy_workaround_ich8lan(sc); 7816 7817 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)) { 7818 /* 7819 * dummy read to clear the phy wakeup bit after lcd 7820 * reset 7821 */ 7822 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, BM_WUC); 7823 } 7824 7825 /* 7826 * XXX Configure the LCD with th extended configuration region 7827 * in NVM 7828 */ 7829 7830 /* Disable D0 LPLU. */ 7831 if (sc->sc_type >= WM_T_PCH) /* PCH* */ 7832 wm_lplu_d0_disable_pch(sc); 7833 else 7834 wm_lplu_d0_disable(sc); /* ICH* */ 7835 break; 7836 default: 7837 panic("%s: unknown type\n", __func__); 7838 break; 7839 } 7840 } 7841 7842 /* 7843 * wm_get_phy_id_82575: 7844 * 7845 * Return PHY ID. Return -1 if it failed. 7846 */ 7847 static int 7848 wm_get_phy_id_82575(struct wm_softc *sc) 7849 { 7850 uint32_t reg; 7851 int phyid = -1; 7852 7853 /* XXX */ 7854 if ((sc->sc_flags & WM_F_SGMII) == 0) 7855 return -1; 7856 7857 if (wm_sgmii_uses_mdio(sc)) { 7858 switch (sc->sc_type) { 7859 case WM_T_82575: 7860 case WM_T_82576: 7861 reg = CSR_READ(sc, WMREG_MDIC); 7862 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT; 7863 break; 7864 case WM_T_82580: 7865 case WM_T_I350: 7866 case WM_T_I354: 7867 case WM_T_I210: 7868 case WM_T_I211: 7869 reg = CSR_READ(sc, WMREG_MDICNFG); 7870 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT; 7871 break; 7872 default: 7873 return -1; 7874 } 7875 } 7876 7877 return phyid; 7878 } 7879 7880 7881 /* 7882 * wm_gmii_mediainit: 7883 * 7884 * Initialize media for use on 1000BASE-T devices. 7885 */ 7886 static void 7887 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid) 7888 { 7889 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 7890 struct mii_data *mii = &sc->sc_mii; 7891 uint32_t reg; 7892 7893 /* We have GMII. */ 7894 sc->sc_flags |= WM_F_HAS_MII; 7895 7896 if (sc->sc_type == WM_T_80003) 7897 sc->sc_tipg = TIPG_1000T_80003_DFLT; 7898 else 7899 sc->sc_tipg = TIPG_1000T_DFLT; 7900 7901 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */ 7902 if ((sc->sc_type == WM_T_82580) 7903 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210) 7904 || (sc->sc_type == WM_T_I211)) { 7905 reg = CSR_READ(sc, WMREG_PHPM); 7906 reg &= ~PHPM_GO_LINK_D; 7907 CSR_WRITE(sc, WMREG_PHPM, reg); 7908 } 7909 7910 /* 7911 * Let the chip set speed/duplex on its own based on 7912 * signals from the PHY. 7913 * XXXbouyer - I'm not sure this is right for the 80003, 7914 * the em driver only sets CTRL_SLU here - but it seems to work. 7915 */ 7916 sc->sc_ctrl |= CTRL_SLU; 7917 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 7918 7919 /* Initialize our media structures and probe the GMII. */ 7920 mii->mii_ifp = ifp; 7921 7922 /* 7923 * Determine the PHY access method. 7924 * 7925 * For SGMII, use SGMII specific method. 7926 * 7927 * For some devices, we can determine the PHY access method 7928 * from sc_type. 7929 * 7930 * For ICH and PCH variants, it's difficult to determine the PHY 7931 * access method by sc_type, so use the PCI product ID for some 7932 * devices. 7933 * For other ICH8 variants, try to use igp's method. If the PHY 7934 * can't detect, then use bm's method. 7935 */ 7936 switch (prodid) { 7937 case PCI_PRODUCT_INTEL_PCH_M_LM: 7938 case PCI_PRODUCT_INTEL_PCH_M_LC: 7939 /* 82577 */ 7940 sc->sc_phytype = WMPHY_82577; 7941 break; 7942 case PCI_PRODUCT_INTEL_PCH_D_DM: 7943 case PCI_PRODUCT_INTEL_PCH_D_DC: 7944 /* 82578 */ 7945 sc->sc_phytype = WMPHY_82578; 7946 break; 7947 case PCI_PRODUCT_INTEL_PCH2_LV_LM: 7948 case PCI_PRODUCT_INTEL_PCH2_LV_V: 7949 /* 82579 */ 7950 sc->sc_phytype = WMPHY_82579; 7951 break; 7952 case PCI_PRODUCT_INTEL_82801I_BM: 7953 case PCI_PRODUCT_INTEL_82801J_R_BM_LM: 7954 case PCI_PRODUCT_INTEL_82801J_R_BM_LF: 7955 case PCI_PRODUCT_INTEL_82801J_D_BM_LM: 7956 case PCI_PRODUCT_INTEL_82801J_D_BM_LF: 7957 case PCI_PRODUCT_INTEL_82801J_R_BM_V: 7958 /* 82567 */ 7959 sc->sc_phytype = WMPHY_BM; 7960 mii->mii_readreg = wm_gmii_bm_readreg; 7961 mii->mii_writereg = wm_gmii_bm_writereg; 7962 break; 7963 default: 7964 if (((sc->sc_flags & WM_F_SGMII) != 0) 7965 && !wm_sgmii_uses_mdio(sc)){ 7966 /* SGMII */ 7967 mii->mii_readreg = wm_sgmii_readreg; 7968 mii->mii_writereg = wm_sgmii_writereg; 7969 } else if (sc->sc_type >= WM_T_80003) { 7970 /* 80003 */ 7971 mii->mii_readreg = wm_gmii_i80003_readreg; 7972 mii->mii_writereg = wm_gmii_i80003_writereg; 7973 } else if (sc->sc_type >= WM_T_I210) { 7974 /* I210 and I211 */ 7975 mii->mii_readreg = wm_gmii_gs40g_readreg; 7976 mii->mii_writereg = wm_gmii_gs40g_writereg; 7977 } else if (sc->sc_type >= WM_T_82580) { 7978 /* 82580, I350 and I354 */ 7979 sc->sc_phytype = WMPHY_82580; 7980 mii->mii_readreg = wm_gmii_82580_readreg; 7981 mii->mii_writereg = wm_gmii_82580_writereg; 7982 } else if (sc->sc_type >= WM_T_82544) { 7983 /* 82544, 0, [56], [17], 8257[1234] and 82583 */ 7984 mii->mii_readreg = wm_gmii_i82544_readreg; 7985 mii->mii_writereg = wm_gmii_i82544_writereg; 7986 } else { 7987 mii->mii_readreg = wm_gmii_i82543_readreg; 7988 mii->mii_writereg = wm_gmii_i82543_writereg; 7989 } 7990 break; 7991 } 7992 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_LPT)) { 7993 /* All PCH* use _hv_ */ 7994 mii->mii_readreg = wm_gmii_hv_readreg; 7995 mii->mii_writereg = wm_gmii_hv_writereg; 7996 } 7997 mii->mii_statchg = wm_gmii_statchg; 7998 7999 wm_gmii_reset(sc); 8000 8001 sc->sc_ethercom.ec_mii = &sc->sc_mii; 8002 ifmedia_init(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange, 8003 wm_gmii_mediastatus); 8004 8005 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576) 8006 || (sc->sc_type == WM_T_82580) 8007 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354) 8008 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) { 8009 if ((sc->sc_flags & WM_F_SGMII) == 0) { 8010 /* Attach only one port */ 8011 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 8012 MII_OFFSET_ANY, MIIF_DOPAUSE); 8013 } else { 8014 int i, id; 8015 uint32_t ctrl_ext; 8016 8017 id = wm_get_phy_id_82575(sc); 8018 if (id != -1) { 8019 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 8020 id, MII_OFFSET_ANY, MIIF_DOPAUSE); 8021 } 8022 if ((id == -1) 8023 || (LIST_FIRST(&mii->mii_phys) == NULL)) { 8024 /* Power on sgmii phy if it is disabled */ 8025 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 8026 CSR_WRITE(sc, WMREG_CTRL_EXT, 8027 ctrl_ext &~ CTRL_EXT_SWDPIN(3)); 8028 CSR_WRITE_FLUSH(sc); 8029 delay(300*1000); /* XXX too long */ 8030 8031 /* from 1 to 8 */ 8032 for (i = 1; i < 8; i++) 8033 mii_attach(sc->sc_dev, &sc->sc_mii, 8034 0xffffffff, i, MII_OFFSET_ANY, 8035 MIIF_DOPAUSE); 8036 8037 /* restore previous sfp cage power state */ 8038 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 8039 } 8040 } 8041 } else { 8042 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 8043 MII_OFFSET_ANY, MIIF_DOPAUSE); 8044 } 8045 8046 /* 8047 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call 8048 * wm_set_mdio_slow_mode_hv() for a workaround and retry. 8049 */ 8050 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) && 8051 (LIST_FIRST(&mii->mii_phys) == NULL)) { 8052 wm_set_mdio_slow_mode_hv(sc); 8053 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 8054 MII_OFFSET_ANY, MIIF_DOPAUSE); 8055 } 8056 8057 /* 8058 * (For ICH8 variants) 8059 * If PHY detection failed, use BM's r/w function and retry. 8060 */ 8061 if (LIST_FIRST(&mii->mii_phys) == NULL) { 8062 /* if failed, retry with *_bm_* */ 8063 mii->mii_readreg = wm_gmii_bm_readreg; 8064 mii->mii_writereg = wm_gmii_bm_writereg; 8065 8066 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 8067 MII_OFFSET_ANY, MIIF_DOPAUSE); 8068 } 8069 8070 if (LIST_FIRST(&mii->mii_phys) == NULL) { 8071 /* Any PHY wasn't find */ 8072 ifmedia_add(&mii->mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 8073 ifmedia_set(&mii->mii_media, IFM_ETHER|IFM_NONE); 8074 sc->sc_phytype = WMPHY_NONE; 8075 } else { 8076 /* 8077 * PHY Found! 8078 * Check PHY type. 8079 */ 8080 uint32_t model; 8081 struct mii_softc *child; 8082 8083 child = LIST_FIRST(&mii->mii_phys); 8084 model = child->mii_mpd_model; 8085 if (model == MII_MODEL_yyINTEL_I82566) 8086 sc->sc_phytype = WMPHY_IGP_3; 8087 8088 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); 8089 } 8090 } 8091 8092 /* 8093 * wm_gmii_mediachange: [ifmedia interface function] 8094 * 8095 * Set hardware to newly-selected media on a 1000BASE-T device. 8096 */ 8097 static int 8098 wm_gmii_mediachange(struct ifnet *ifp) 8099 { 8100 struct wm_softc *sc = ifp->if_softc; 8101 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 8102 int rc; 8103 8104 if ((ifp->if_flags & IFF_UP) == 0) 8105 return 0; 8106 8107 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD); 8108 sc->sc_ctrl |= CTRL_SLU; 8109 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 8110 || (sc->sc_type > WM_T_82543)) { 8111 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX); 8112 } else { 8113 sc->sc_ctrl &= ~CTRL_ASDE; 8114 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX; 8115 if (ife->ifm_media & IFM_FDX) 8116 sc->sc_ctrl |= CTRL_FD; 8117 switch (IFM_SUBTYPE(ife->ifm_media)) { 8118 case IFM_10_T: 8119 sc->sc_ctrl |= CTRL_SPEED_10; 8120 break; 8121 case IFM_100_TX: 8122 sc->sc_ctrl |= CTRL_SPEED_100; 8123 break; 8124 case IFM_1000_T: 8125 sc->sc_ctrl |= CTRL_SPEED_1000; 8126 break; 8127 default: 8128 panic("wm_gmii_mediachange: bad media 0x%x", 8129 ife->ifm_media); 8130 } 8131 } 8132 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 8133 if (sc->sc_type <= WM_T_82543) 8134 wm_gmii_reset(sc); 8135 8136 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO) 8137 return 0; 8138 return rc; 8139 } 8140 8141 /* 8142 * wm_gmii_mediastatus: [ifmedia interface function] 8143 * 8144 * Get the current interface media status on a 1000BASE-T device. 8145 */ 8146 static void 8147 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 8148 { 8149 struct wm_softc *sc = ifp->if_softc; 8150 8151 ether_mediastatus(ifp, ifmr); 8152 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) 8153 | sc->sc_flowflags; 8154 } 8155 8156 #define MDI_IO CTRL_SWDPIN(2) 8157 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */ 8158 #define MDI_CLK CTRL_SWDPIN(3) 8159 8160 static void 8161 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits) 8162 { 8163 uint32_t i, v; 8164 8165 v = CSR_READ(sc, WMREG_CTRL); 8166 v &= ~(MDI_IO|MDI_CLK|(CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT)); 8167 v |= MDI_DIR | CTRL_SWDPIO(3); 8168 8169 for (i = 1 << (nbits - 1); i != 0; i >>= 1) { 8170 if (data & i) 8171 v |= MDI_IO; 8172 else 8173 v &= ~MDI_IO; 8174 CSR_WRITE(sc, WMREG_CTRL, v); 8175 CSR_WRITE_FLUSH(sc); 8176 delay(10); 8177 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 8178 CSR_WRITE_FLUSH(sc); 8179 delay(10); 8180 CSR_WRITE(sc, WMREG_CTRL, v); 8181 CSR_WRITE_FLUSH(sc); 8182 delay(10); 8183 } 8184 } 8185 8186 static uint32_t 8187 wm_i82543_mii_recvbits(struct wm_softc *sc) 8188 { 8189 uint32_t v, i, data = 0; 8190 8191 v = CSR_READ(sc, WMREG_CTRL); 8192 v &= ~(MDI_IO|MDI_CLK|(CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT)); 8193 v |= CTRL_SWDPIO(3); 8194 8195 CSR_WRITE(sc, WMREG_CTRL, v); 8196 CSR_WRITE_FLUSH(sc); 8197 delay(10); 8198 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 8199 CSR_WRITE_FLUSH(sc); 8200 delay(10); 8201 CSR_WRITE(sc, WMREG_CTRL, v); 8202 CSR_WRITE_FLUSH(sc); 8203 delay(10); 8204 8205 for (i = 0; i < 16; i++) { 8206 data <<= 1; 8207 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 8208 CSR_WRITE_FLUSH(sc); 8209 delay(10); 8210 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO) 8211 data |= 1; 8212 CSR_WRITE(sc, WMREG_CTRL, v); 8213 CSR_WRITE_FLUSH(sc); 8214 delay(10); 8215 } 8216 8217 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK); 8218 CSR_WRITE_FLUSH(sc); 8219 delay(10); 8220 CSR_WRITE(sc, WMREG_CTRL, v); 8221 CSR_WRITE_FLUSH(sc); 8222 delay(10); 8223 8224 return data; 8225 } 8226 8227 #undef MDI_IO 8228 #undef MDI_DIR 8229 #undef MDI_CLK 8230 8231 /* 8232 * wm_gmii_i82543_readreg: [mii interface function] 8233 * 8234 * Read a PHY register on the GMII (i82543 version). 8235 */ 8236 static int 8237 wm_gmii_i82543_readreg(device_t self, int phy, int reg) 8238 { 8239 struct wm_softc *sc = device_private(self); 8240 int rv; 8241 8242 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32); 8243 wm_i82543_mii_sendbits(sc, reg | (phy << 5) | 8244 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14); 8245 rv = wm_i82543_mii_recvbits(sc) & 0xffff; 8246 8247 DPRINTF(WM_DEBUG_GMII, 8248 ("%s: GMII: read phy %d reg %d -> 0x%04x\n", 8249 device_xname(sc->sc_dev), phy, reg, rv)); 8250 8251 return rv; 8252 } 8253 8254 /* 8255 * wm_gmii_i82543_writereg: [mii interface function] 8256 * 8257 * Write a PHY register on the GMII (i82543 version). 8258 */ 8259 static void 8260 wm_gmii_i82543_writereg(device_t self, int phy, int reg, int val) 8261 { 8262 struct wm_softc *sc = device_private(self); 8263 8264 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32); 8265 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) | 8266 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) | 8267 (MII_COMMAND_START << 30), 32); 8268 } 8269 8270 /* 8271 * wm_gmii_i82544_readreg: [mii interface function] 8272 * 8273 * Read a PHY register on the GMII. 8274 */ 8275 static int 8276 wm_gmii_i82544_readreg(device_t self, int phy, int reg) 8277 { 8278 struct wm_softc *sc = device_private(self); 8279 uint32_t mdic = 0; 8280 int i, rv; 8281 8282 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) | 8283 MDIC_REGADD(reg)); 8284 8285 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) { 8286 mdic = CSR_READ(sc, WMREG_MDIC); 8287 if (mdic & MDIC_READY) 8288 break; 8289 delay(50); 8290 } 8291 8292 if ((mdic & MDIC_READY) == 0) { 8293 log(LOG_WARNING, "%s: MDIC read timed out: phy %d reg %d\n", 8294 device_xname(sc->sc_dev), phy, reg); 8295 rv = 0; 8296 } else if (mdic & MDIC_E) { 8297 #if 0 /* This is normal if no PHY is present. */ 8298 log(LOG_WARNING, "%s: MDIC read error: phy %d reg %d\n", 8299 device_xname(sc->sc_dev), phy, reg); 8300 #endif 8301 rv = 0; 8302 } else { 8303 rv = MDIC_DATA(mdic); 8304 if (rv == 0xffff) 8305 rv = 0; 8306 } 8307 8308 return rv; 8309 } 8310 8311 /* 8312 * wm_gmii_i82544_writereg: [mii interface function] 8313 * 8314 * Write a PHY register on the GMII. 8315 */ 8316 static void 8317 wm_gmii_i82544_writereg(device_t self, int phy, int reg, int val) 8318 { 8319 struct wm_softc *sc = device_private(self); 8320 uint32_t mdic = 0; 8321 int i; 8322 8323 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) | 8324 MDIC_REGADD(reg) | MDIC_DATA(val)); 8325 8326 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) { 8327 mdic = CSR_READ(sc, WMREG_MDIC); 8328 if (mdic & MDIC_READY) 8329 break; 8330 delay(50); 8331 } 8332 8333 if ((mdic & MDIC_READY) == 0) 8334 log(LOG_WARNING, "%s: MDIC write timed out: phy %d reg %d\n", 8335 device_xname(sc->sc_dev), phy, reg); 8336 else if (mdic & MDIC_E) 8337 log(LOG_WARNING, "%s: MDIC write error: phy %d reg %d\n", 8338 device_xname(sc->sc_dev), phy, reg); 8339 } 8340 8341 /* 8342 * wm_gmii_i80003_readreg: [mii interface function] 8343 * 8344 * Read a PHY register on the kumeran 8345 * This could be handled by the PHY layer if we didn't have to lock the 8346 * ressource ... 8347 */ 8348 static int 8349 wm_gmii_i80003_readreg(device_t self, int phy, int reg) 8350 { 8351 struct wm_softc *sc = device_private(self); 8352 int sem; 8353 int rv; 8354 8355 if (phy != 1) /* only one PHY on kumeran bus */ 8356 return 0; 8357 8358 sem = swfwphysem[sc->sc_funcid]; 8359 if (wm_get_swfw_semaphore(sc, sem)) { 8360 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8361 __func__); 8362 return 0; 8363 } 8364 8365 if ((reg & GG82563_MAX_REG_ADDRESS) < GG82563_MIN_ALT_REG) { 8366 wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT, 8367 reg >> GG82563_PAGE_SHIFT); 8368 } else { 8369 wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT_ALT, 8370 reg >> GG82563_PAGE_SHIFT); 8371 } 8372 /* Wait more 200us for a bug of the ready bit in the MDIC register */ 8373 delay(200); 8374 rv = wm_gmii_i82544_readreg(self, phy, reg & GG82563_MAX_REG_ADDRESS); 8375 delay(200); 8376 8377 wm_put_swfw_semaphore(sc, sem); 8378 return rv; 8379 } 8380 8381 /* 8382 * wm_gmii_i80003_writereg: [mii interface function] 8383 * 8384 * Write a PHY register on the kumeran. 8385 * This could be handled by the PHY layer if we didn't have to lock the 8386 * ressource ... 8387 */ 8388 static void 8389 wm_gmii_i80003_writereg(device_t self, int phy, int reg, int val) 8390 { 8391 struct wm_softc *sc = device_private(self); 8392 int sem; 8393 8394 if (phy != 1) /* only one PHY on kumeran bus */ 8395 return; 8396 8397 sem = swfwphysem[sc->sc_funcid]; 8398 if (wm_get_swfw_semaphore(sc, sem)) { 8399 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8400 __func__); 8401 return; 8402 } 8403 8404 if ((reg & GG82563_MAX_REG_ADDRESS) < GG82563_MIN_ALT_REG) { 8405 wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT, 8406 reg >> GG82563_PAGE_SHIFT); 8407 } else { 8408 wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT_ALT, 8409 reg >> GG82563_PAGE_SHIFT); 8410 } 8411 /* Wait more 200us for a bug of the ready bit in the MDIC register */ 8412 delay(200); 8413 wm_gmii_i82544_writereg(self, phy, reg & GG82563_MAX_REG_ADDRESS, val); 8414 delay(200); 8415 8416 wm_put_swfw_semaphore(sc, sem); 8417 } 8418 8419 /* 8420 * wm_gmii_bm_readreg: [mii interface function] 8421 * 8422 * Read a PHY register on the kumeran 8423 * This could be handled by the PHY layer if we didn't have to lock the 8424 * ressource ... 8425 */ 8426 static int 8427 wm_gmii_bm_readreg(device_t self, int phy, int reg) 8428 { 8429 struct wm_softc *sc = device_private(self); 8430 int sem; 8431 int rv; 8432 8433 sem = swfwphysem[sc->sc_funcid]; 8434 if (wm_get_swfw_semaphore(sc, sem)) { 8435 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8436 __func__); 8437 return 0; 8438 } 8439 8440 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 8441 if (phy == 1) 8442 wm_gmii_i82544_writereg(self, phy, MII_IGPHY_PAGE_SELECT, 8443 reg); 8444 else 8445 wm_gmii_i82544_writereg(self, phy, 8446 GG82563_PHY_PAGE_SELECT, 8447 reg >> GG82563_PAGE_SHIFT); 8448 } 8449 8450 rv = wm_gmii_i82544_readreg(self, phy, reg & GG82563_MAX_REG_ADDRESS); 8451 wm_put_swfw_semaphore(sc, sem); 8452 return rv; 8453 } 8454 8455 /* 8456 * wm_gmii_bm_writereg: [mii interface function] 8457 * 8458 * Write a PHY register on the kumeran. 8459 * This could be handled by the PHY layer if we didn't have to lock the 8460 * ressource ... 8461 */ 8462 static void 8463 wm_gmii_bm_writereg(device_t self, int phy, int reg, int val) 8464 { 8465 struct wm_softc *sc = device_private(self); 8466 int sem; 8467 8468 sem = swfwphysem[sc->sc_funcid]; 8469 if (wm_get_swfw_semaphore(sc, sem)) { 8470 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8471 __func__); 8472 return; 8473 } 8474 8475 if (reg > BME1000_MAX_MULTI_PAGE_REG) { 8476 if (phy == 1) 8477 wm_gmii_i82544_writereg(self, phy, MII_IGPHY_PAGE_SELECT, 8478 reg); 8479 else 8480 wm_gmii_i82544_writereg(self, phy, 8481 GG82563_PHY_PAGE_SELECT, 8482 reg >> GG82563_PAGE_SHIFT); 8483 } 8484 8485 wm_gmii_i82544_writereg(self, phy, reg & GG82563_MAX_REG_ADDRESS, val); 8486 wm_put_swfw_semaphore(sc, sem); 8487 } 8488 8489 static void 8490 wm_access_phy_wakeup_reg_bm(device_t self, int offset, int16_t *val, int rd) 8491 { 8492 struct wm_softc *sc = device_private(self); 8493 uint16_t regnum = BM_PHY_REG_NUM(offset); 8494 uint16_t wuce; 8495 8496 /* XXX Gig must be disabled for MDIO accesses to page 800 */ 8497 if (sc->sc_type == WM_T_PCH) { 8498 /* XXX e1000 driver do nothing... why? */ 8499 } 8500 8501 /* Set page 769 */ 8502 wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT, 8503 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT); 8504 8505 wuce = wm_gmii_i82544_readreg(self, 1, BM_WUC_ENABLE_REG); 8506 8507 wuce &= ~BM_WUC_HOST_WU_BIT; 8508 wm_gmii_i82544_writereg(self, 1, BM_WUC_ENABLE_REG, 8509 wuce | BM_WUC_ENABLE_BIT); 8510 8511 /* Select page 800 */ 8512 wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT, 8513 BM_WUC_PAGE << BME1000_PAGE_SHIFT); 8514 8515 /* Write page 800 */ 8516 wm_gmii_i82544_writereg(self, 1, BM_WUC_ADDRESS_OPCODE, regnum); 8517 8518 if (rd) 8519 *val = wm_gmii_i82544_readreg(self, 1, BM_WUC_DATA_OPCODE); 8520 else 8521 wm_gmii_i82544_writereg(self, 1, BM_WUC_DATA_OPCODE, *val); 8522 8523 /* Set page 769 */ 8524 wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT, 8525 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT); 8526 8527 wm_gmii_i82544_writereg(self, 1, BM_WUC_ENABLE_REG, wuce); 8528 } 8529 8530 /* 8531 * wm_gmii_hv_readreg: [mii interface function] 8532 * 8533 * Read a PHY register on the kumeran 8534 * This could be handled by the PHY layer if we didn't have to lock the 8535 * ressource ... 8536 */ 8537 static int 8538 wm_gmii_hv_readreg(device_t self, int phy, int reg) 8539 { 8540 struct wm_softc *sc = device_private(self); 8541 uint16_t page = BM_PHY_REG_PAGE(reg); 8542 uint16_t regnum = BM_PHY_REG_NUM(reg); 8543 uint16_t val; 8544 int rv; 8545 8546 if (wm_get_swfwhw_semaphore(sc)) { 8547 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8548 __func__); 8549 return 0; 8550 } 8551 8552 /* XXX Workaround failure in MDIO access while cable is disconnected */ 8553 if (sc->sc_phytype == WMPHY_82577) { 8554 /* XXX must write */ 8555 } 8556 8557 /* Page 800 works differently than the rest so it has its own func */ 8558 if (page == BM_WUC_PAGE) { 8559 wm_access_phy_wakeup_reg_bm(self, reg, &val, 1); 8560 return val; 8561 } 8562 8563 /* 8564 * Lower than page 768 works differently than the rest so it has its 8565 * own func 8566 */ 8567 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) { 8568 printf("gmii_hv_readreg!!!\n"); 8569 return 0; 8570 } 8571 8572 if (regnum > BME1000_MAX_MULTI_PAGE_REG) { 8573 wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT, 8574 page << BME1000_PAGE_SHIFT); 8575 } 8576 8577 rv = wm_gmii_i82544_readreg(self, phy, regnum & IGPHY_MAXREGADDR); 8578 wm_put_swfwhw_semaphore(sc); 8579 return rv; 8580 } 8581 8582 /* 8583 * wm_gmii_hv_writereg: [mii interface function] 8584 * 8585 * Write a PHY register on the kumeran. 8586 * This could be handled by the PHY layer if we didn't have to lock the 8587 * ressource ... 8588 */ 8589 static void 8590 wm_gmii_hv_writereg(device_t self, int phy, int reg, int val) 8591 { 8592 struct wm_softc *sc = device_private(self); 8593 uint16_t page = BM_PHY_REG_PAGE(reg); 8594 uint16_t regnum = BM_PHY_REG_NUM(reg); 8595 8596 if (wm_get_swfwhw_semaphore(sc)) { 8597 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8598 __func__); 8599 return; 8600 } 8601 8602 /* XXX Workaround failure in MDIO access while cable is disconnected */ 8603 8604 /* Page 800 works differently than the rest so it has its own func */ 8605 if (page == BM_WUC_PAGE) { 8606 uint16_t tmp; 8607 8608 tmp = val; 8609 wm_access_phy_wakeup_reg_bm(self, reg, &tmp, 0); 8610 return; 8611 } 8612 8613 /* 8614 * Lower than page 768 works differently than the rest so it has its 8615 * own func 8616 */ 8617 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) { 8618 printf("gmii_hv_writereg!!!\n"); 8619 return; 8620 } 8621 8622 /* 8623 * XXX Workaround MDIO accesses being disabled after entering IEEE 8624 * Power Down (whenever bit 11 of the PHY control register is set) 8625 */ 8626 8627 if (regnum > BME1000_MAX_MULTI_PAGE_REG) { 8628 wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT, 8629 page << BME1000_PAGE_SHIFT); 8630 } 8631 8632 wm_gmii_i82544_writereg(self, phy, regnum & IGPHY_MAXREGADDR, val); 8633 wm_put_swfwhw_semaphore(sc); 8634 } 8635 8636 /* 8637 * wm_gmii_82580_readreg: [mii interface function] 8638 * 8639 * Read a PHY register on the 82580 and I350. 8640 * This could be handled by the PHY layer if we didn't have to lock the 8641 * ressource ... 8642 */ 8643 static int 8644 wm_gmii_82580_readreg(device_t self, int phy, int reg) 8645 { 8646 struct wm_softc *sc = device_private(self); 8647 int sem; 8648 int rv; 8649 8650 sem = swfwphysem[sc->sc_funcid]; 8651 if (wm_get_swfw_semaphore(sc, sem)) { 8652 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8653 __func__); 8654 return 0; 8655 } 8656 8657 rv = wm_gmii_i82544_readreg(self, phy, reg); 8658 8659 wm_put_swfw_semaphore(sc, sem); 8660 return rv; 8661 } 8662 8663 /* 8664 * wm_gmii_82580_writereg: [mii interface function] 8665 * 8666 * Write a PHY register on the 82580 and I350. 8667 * This could be handled by the PHY layer if we didn't have to lock the 8668 * ressource ... 8669 */ 8670 static void 8671 wm_gmii_82580_writereg(device_t self, int phy, int reg, int val) 8672 { 8673 struct wm_softc *sc = device_private(self); 8674 int sem; 8675 8676 sem = swfwphysem[sc->sc_funcid]; 8677 if (wm_get_swfw_semaphore(sc, sem)) { 8678 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8679 __func__); 8680 return; 8681 } 8682 8683 wm_gmii_i82544_writereg(self, phy, reg, val); 8684 8685 wm_put_swfw_semaphore(sc, sem); 8686 } 8687 8688 /* 8689 * wm_gmii_gs40g_readreg: [mii interface function] 8690 * 8691 * Read a PHY register on the I2100 and I211. 8692 * This could be handled by the PHY layer if we didn't have to lock the 8693 * ressource ... 8694 */ 8695 static int 8696 wm_gmii_gs40g_readreg(device_t self, int phy, int reg) 8697 { 8698 struct wm_softc *sc = device_private(self); 8699 int sem; 8700 int page, offset; 8701 int rv; 8702 8703 /* Acquire semaphore */ 8704 sem = swfwphysem[sc->sc_funcid]; 8705 if (wm_get_swfw_semaphore(sc, sem)) { 8706 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8707 __func__); 8708 return 0; 8709 } 8710 8711 /* Page select */ 8712 page = reg >> GS40G_PAGE_SHIFT; 8713 wm_gmii_i82544_writereg(self, phy, GS40G_PAGE_SELECT, page); 8714 8715 /* Read reg */ 8716 offset = reg & GS40G_OFFSET_MASK; 8717 rv = wm_gmii_i82544_readreg(self, phy, offset); 8718 8719 wm_put_swfw_semaphore(sc, sem); 8720 return rv; 8721 } 8722 8723 /* 8724 * wm_gmii_gs40g_writereg: [mii interface function] 8725 * 8726 * Write a PHY register on the I210 and I211. 8727 * This could be handled by the PHY layer if we didn't have to lock the 8728 * ressource ... 8729 */ 8730 static void 8731 wm_gmii_gs40g_writereg(device_t self, int phy, int reg, int val) 8732 { 8733 struct wm_softc *sc = device_private(self); 8734 int sem; 8735 int page, offset; 8736 8737 /* Acquire semaphore */ 8738 sem = swfwphysem[sc->sc_funcid]; 8739 if (wm_get_swfw_semaphore(sc, sem)) { 8740 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8741 __func__); 8742 return; 8743 } 8744 8745 /* Page select */ 8746 page = reg >> GS40G_PAGE_SHIFT; 8747 wm_gmii_i82544_writereg(self, phy, GS40G_PAGE_SELECT, page); 8748 8749 /* Write reg */ 8750 offset = reg & GS40G_OFFSET_MASK; 8751 wm_gmii_i82544_writereg(self, phy, offset, val); 8752 8753 /* Release semaphore */ 8754 wm_put_swfw_semaphore(sc, sem); 8755 } 8756 8757 /* 8758 * wm_gmii_statchg: [mii interface function] 8759 * 8760 * Callback from MII layer when media changes. 8761 */ 8762 static void 8763 wm_gmii_statchg(struct ifnet *ifp) 8764 { 8765 struct wm_softc *sc = ifp->if_softc; 8766 struct mii_data *mii = &sc->sc_mii; 8767 8768 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE); 8769 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 8770 sc->sc_fcrtl &= ~FCRTL_XONE; 8771 8772 /* 8773 * Get flow control negotiation result. 8774 */ 8775 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO && 8776 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) { 8777 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK; 8778 mii->mii_media_active &= ~IFM_ETH_FMASK; 8779 } 8780 8781 if (sc->sc_flowflags & IFM_FLOW) { 8782 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) { 8783 sc->sc_ctrl |= CTRL_TFCE; 8784 sc->sc_fcrtl |= FCRTL_XONE; 8785 } 8786 if (sc->sc_flowflags & IFM_ETH_RXPAUSE) 8787 sc->sc_ctrl |= CTRL_RFCE; 8788 } 8789 8790 if (sc->sc_mii.mii_media_active & IFM_FDX) { 8791 DPRINTF(WM_DEBUG_LINK, 8792 ("%s: LINK: statchg: FDX\n", ifp->if_xname)); 8793 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 8794 } else { 8795 DPRINTF(WM_DEBUG_LINK, 8796 ("%s: LINK: statchg: HDX\n", ifp->if_xname)); 8797 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 8798 } 8799 8800 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 8801 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 8802 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL 8803 : WMREG_FCRTL, sc->sc_fcrtl); 8804 if (sc->sc_type == WM_T_80003) { 8805 switch (IFM_SUBTYPE(sc->sc_mii.mii_media_active)) { 8806 case IFM_1000_T: 8807 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL, 8808 KUMCTRLSTA_HD_CTRL_1000_DEFAULT); 8809 sc->sc_tipg = TIPG_1000T_80003_DFLT; 8810 break; 8811 default: 8812 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL, 8813 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT); 8814 sc->sc_tipg = TIPG_10_100_80003_DFLT; 8815 break; 8816 } 8817 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg); 8818 } 8819 } 8820 8821 /* 8822 * wm_kmrn_readreg: 8823 * 8824 * Read a kumeran register 8825 */ 8826 static int 8827 wm_kmrn_readreg(struct wm_softc *sc, int reg) 8828 { 8829 int rv; 8830 8831 if (sc->sc_flags & WM_F_LOCK_SWFW) { 8832 if (wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM)) { 8833 aprint_error_dev(sc->sc_dev, 8834 "%s: failed to get semaphore\n", __func__); 8835 return 0; 8836 } 8837 } else if (sc->sc_flags & WM_F_LOCK_EXTCNF) { 8838 if (wm_get_swfwhw_semaphore(sc)) { 8839 aprint_error_dev(sc->sc_dev, 8840 "%s: failed to get semaphore\n", __func__); 8841 return 0; 8842 } 8843 } 8844 8845 CSR_WRITE(sc, WMREG_KUMCTRLSTA, 8846 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | 8847 KUMCTRLSTA_REN); 8848 CSR_WRITE_FLUSH(sc); 8849 delay(2); 8850 8851 rv = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK; 8852 8853 if (sc->sc_flags & WM_F_LOCK_SWFW) 8854 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 8855 else if (sc->sc_flags & WM_F_LOCK_EXTCNF) 8856 wm_put_swfwhw_semaphore(sc); 8857 8858 return rv; 8859 } 8860 8861 /* 8862 * wm_kmrn_writereg: 8863 * 8864 * Write a kumeran register 8865 */ 8866 static void 8867 wm_kmrn_writereg(struct wm_softc *sc, int reg, int val) 8868 { 8869 8870 if (sc->sc_flags & WM_F_LOCK_SWFW) { 8871 if (wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM)) { 8872 aprint_error_dev(sc->sc_dev, 8873 "%s: failed to get semaphore\n", __func__); 8874 return; 8875 } 8876 } else if (sc->sc_flags & WM_F_LOCK_EXTCNF) { 8877 if (wm_get_swfwhw_semaphore(sc)) { 8878 aprint_error_dev(sc->sc_dev, 8879 "%s: failed to get semaphore\n", __func__); 8880 return; 8881 } 8882 } 8883 8884 CSR_WRITE(sc, WMREG_KUMCTRLSTA, 8885 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) | 8886 (val & KUMCTRLSTA_MASK)); 8887 8888 if (sc->sc_flags & WM_F_LOCK_SWFW) 8889 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM); 8890 else if (sc->sc_flags & WM_F_LOCK_EXTCNF) 8891 wm_put_swfwhw_semaphore(sc); 8892 } 8893 8894 /* SGMII related */ 8895 8896 /* 8897 * wm_sgmii_uses_mdio 8898 * 8899 * Check whether the transaction is to the internal PHY or the external 8900 * MDIO interface. Return true if it's MDIO. 8901 */ 8902 static bool 8903 wm_sgmii_uses_mdio(struct wm_softc *sc) 8904 { 8905 uint32_t reg; 8906 bool ismdio = false; 8907 8908 switch (sc->sc_type) { 8909 case WM_T_82575: 8910 case WM_T_82576: 8911 reg = CSR_READ(sc, WMREG_MDIC); 8912 ismdio = ((reg & MDIC_DEST) != 0); 8913 break; 8914 case WM_T_82580: 8915 case WM_T_I350: 8916 case WM_T_I354: 8917 case WM_T_I210: 8918 case WM_T_I211: 8919 reg = CSR_READ(sc, WMREG_MDICNFG); 8920 ismdio = ((reg & MDICNFG_DEST) != 0); 8921 break; 8922 default: 8923 break; 8924 } 8925 8926 return ismdio; 8927 } 8928 8929 /* 8930 * wm_sgmii_readreg: [mii interface function] 8931 * 8932 * Read a PHY register on the SGMII 8933 * This could be handled by the PHY layer if we didn't have to lock the 8934 * ressource ... 8935 */ 8936 static int 8937 wm_sgmii_readreg(device_t self, int phy, int reg) 8938 { 8939 struct wm_softc *sc = device_private(self); 8940 uint32_t i2ccmd; 8941 int i, rv; 8942 8943 if (wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid])) { 8944 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8945 __func__); 8946 return 0; 8947 } 8948 8949 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT) 8950 | (phy << I2CCMD_PHY_ADDR_SHIFT) 8951 | I2CCMD_OPCODE_READ; 8952 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 8953 8954 /* Poll the ready bit */ 8955 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 8956 delay(50); 8957 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 8958 if (i2ccmd & I2CCMD_READY) 8959 break; 8960 } 8961 if ((i2ccmd & I2CCMD_READY) == 0) 8962 aprint_error_dev(sc->sc_dev, "I2CCMD Read did not complete\n"); 8963 if ((i2ccmd & I2CCMD_ERROR) != 0) 8964 aprint_error_dev(sc->sc_dev, "I2CCMD Error bit set\n"); 8965 8966 rv = ((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00); 8967 8968 wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]); 8969 return rv; 8970 } 8971 8972 /* 8973 * wm_sgmii_writereg: [mii interface function] 8974 * 8975 * Write a PHY register on the SGMII. 8976 * This could be handled by the PHY layer if we didn't have to lock the 8977 * ressource ... 8978 */ 8979 static void 8980 wm_sgmii_writereg(device_t self, int phy, int reg, int val) 8981 { 8982 struct wm_softc *sc = device_private(self); 8983 uint32_t i2ccmd; 8984 int i; 8985 int val_swapped; 8986 8987 if (wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid])) { 8988 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 8989 __func__); 8990 return; 8991 } 8992 /* Swap the data bytes for the I2C interface */ 8993 val_swapped = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00); 8994 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT) 8995 | (phy << I2CCMD_PHY_ADDR_SHIFT) 8996 | I2CCMD_OPCODE_WRITE | val_swapped; 8997 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 8998 8999 /* Poll the ready bit */ 9000 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 9001 delay(50); 9002 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 9003 if (i2ccmd & I2CCMD_READY) 9004 break; 9005 } 9006 if ((i2ccmd & I2CCMD_READY) == 0) 9007 aprint_error_dev(sc->sc_dev, "I2CCMD Write did not complete\n"); 9008 if ((i2ccmd & I2CCMD_ERROR) != 0) 9009 aprint_error_dev(sc->sc_dev, "I2CCMD Error bit set\n"); 9010 9011 wm_put_swfw_semaphore(sc, SWFW_PHY0_SM); 9012 } 9013 9014 /* TBI related */ 9015 9016 /* 9017 * wm_tbi_mediainit: 9018 * 9019 * Initialize media for use on 1000BASE-X devices. 9020 */ 9021 static void 9022 wm_tbi_mediainit(struct wm_softc *sc) 9023 { 9024 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9025 const char *sep = ""; 9026 9027 if (sc->sc_type < WM_T_82543) 9028 sc->sc_tipg = TIPG_WM_DFLT; 9029 else 9030 sc->sc_tipg = TIPG_LG_DFLT; 9031 9032 sc->sc_tbi_serdes_anegticks = 5; 9033 9034 /* Initialize our media structures */ 9035 sc->sc_mii.mii_ifp = ifp; 9036 sc->sc_ethercom.ec_mii = &sc->sc_mii; 9037 9038 if ((sc->sc_type >= WM_T_82575) 9039 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) 9040 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, 9041 wm_serdes_mediachange, wm_serdes_mediastatus); 9042 else 9043 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, 9044 wm_tbi_mediachange, wm_tbi_mediastatus); 9045 9046 /* 9047 * SWD Pins: 9048 * 9049 * 0 = Link LED (output) 9050 * 1 = Loss Of Signal (input) 9051 */ 9052 sc->sc_ctrl |= CTRL_SWDPIO(0); 9053 9054 /* XXX Perhaps this is only for TBI */ 9055 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES) 9056 sc->sc_ctrl &= ~CTRL_SWDPIO(1); 9057 9058 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) 9059 sc->sc_ctrl &= ~CTRL_LRST; 9060 9061 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9062 9063 #define ADD(ss, mm, dd) \ 9064 do { \ 9065 aprint_normal("%s%s", sep, ss); \ 9066 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|(mm), (dd), NULL); \ 9067 sep = ", "; \ 9068 } while (/*CONSTCOND*/0) 9069 9070 aprint_normal_dev(sc->sc_dev, ""); 9071 9072 /* Only 82545 is LX */ 9073 if (sc->sc_type == WM_T_82545) { 9074 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD); 9075 ADD("1000baseLX-FDX", IFM_1000_LX|IFM_FDX, ANAR_X_FD); 9076 } else { 9077 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD); 9078 ADD("1000baseSX-FDX", IFM_1000_SX|IFM_FDX, ANAR_X_FD); 9079 } 9080 ADD("auto", IFM_AUTO, ANAR_X_FD|ANAR_X_HD); 9081 aprint_normal("\n"); 9082 9083 #undef ADD 9084 9085 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO); 9086 } 9087 9088 /* 9089 * wm_tbi_mediachange: [ifmedia interface function] 9090 * 9091 * Set hardware to newly-selected media on a 1000BASE-X device. 9092 */ 9093 static int 9094 wm_tbi_mediachange(struct ifnet *ifp) 9095 { 9096 struct wm_softc *sc = ifp->if_softc; 9097 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 9098 uint32_t status; 9099 int i; 9100 9101 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) { 9102 /* XXX need some work for >= 82571 and < 82575 */ 9103 if (sc->sc_type < WM_T_82575) 9104 return 0; 9105 } 9106 9107 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572) 9108 || (sc->sc_type >= WM_T_82575)) 9109 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK); 9110 9111 sc->sc_ctrl &= ~CTRL_LRST; 9112 sc->sc_txcw = TXCW_ANE; 9113 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 9114 sc->sc_txcw |= TXCW_FD | TXCW_HD; 9115 else if (ife->ifm_media & IFM_FDX) 9116 sc->sc_txcw |= TXCW_FD; 9117 else 9118 sc->sc_txcw |= TXCW_HD; 9119 9120 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0) 9121 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE; 9122 9123 DPRINTF(WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n", 9124 device_xname(sc->sc_dev), sc->sc_txcw)); 9125 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 9126 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9127 CSR_WRITE_FLUSH(sc); 9128 delay(1000); 9129 9130 i = CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1); 9131 DPRINTF(WM_DEBUG_LINK,("%s: i = 0x%x\n", device_xname(sc->sc_dev),i)); 9132 9133 /* 9134 * On 82544 chips and later, the CTRL_SWDPIN(1) bit will be set if the 9135 * optics detect a signal, 0 if they don't. 9136 */ 9137 if (((i != 0) && (sc->sc_type > WM_T_82544)) || (i == 0)) { 9138 /* Have signal; wait for the link to come up. */ 9139 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) { 9140 delay(10000); 9141 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU) 9142 break; 9143 } 9144 9145 DPRINTF(WM_DEBUG_LINK,("%s: i = %d after waiting for link\n", 9146 device_xname(sc->sc_dev),i)); 9147 9148 status = CSR_READ(sc, WMREG_STATUS); 9149 DPRINTF(WM_DEBUG_LINK, 9150 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n", 9151 device_xname(sc->sc_dev),status, STATUS_LU)); 9152 if (status & STATUS_LU) { 9153 /* Link is up. */ 9154 DPRINTF(WM_DEBUG_LINK, 9155 ("%s: LINK: set media -> link up %s\n", 9156 device_xname(sc->sc_dev), 9157 (status & STATUS_FD) ? "FDX" : "HDX")); 9158 9159 /* 9160 * NOTE: CTRL will update TFCE and RFCE automatically, 9161 * so we should update sc->sc_ctrl 9162 */ 9163 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL); 9164 sc->sc_tctl &= ~TCTL_COLD(0x3ff); 9165 sc->sc_fcrtl &= ~FCRTL_XONE; 9166 if (status & STATUS_FD) 9167 sc->sc_tctl |= 9168 TCTL_COLD(TX_COLLISION_DISTANCE_FDX); 9169 else 9170 sc->sc_tctl |= 9171 TCTL_COLD(TX_COLLISION_DISTANCE_HDX); 9172 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE) 9173 sc->sc_fcrtl |= FCRTL_XONE; 9174 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl); 9175 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? 9176 WMREG_OLD_FCRTL : WMREG_FCRTL, 9177 sc->sc_fcrtl); 9178 sc->sc_tbi_linkup = 1; 9179 } else { 9180 if (i == WM_LINKUP_TIMEOUT) 9181 wm_check_for_link(sc); 9182 /* Link is down. */ 9183 DPRINTF(WM_DEBUG_LINK, 9184 ("%s: LINK: set media -> link down\n", 9185 device_xname(sc->sc_dev))); 9186 sc->sc_tbi_linkup = 0; 9187 } 9188 } else { 9189 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n", 9190 device_xname(sc->sc_dev))); 9191 sc->sc_tbi_linkup = 0; 9192 } 9193 9194 wm_tbi_serdes_set_linkled(sc); 9195 9196 return 0; 9197 } 9198 9199 /* 9200 * wm_tbi_mediastatus: [ifmedia interface function] 9201 * 9202 * Get the current interface media status on a 1000BASE-X device. 9203 */ 9204 static void 9205 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 9206 { 9207 struct wm_softc *sc = ifp->if_softc; 9208 uint32_t ctrl, status; 9209 9210 ifmr->ifm_status = IFM_AVALID; 9211 ifmr->ifm_active = IFM_ETHER; 9212 9213 status = CSR_READ(sc, WMREG_STATUS); 9214 if ((status & STATUS_LU) == 0) { 9215 ifmr->ifm_active |= IFM_NONE; 9216 return; 9217 } 9218 9219 ifmr->ifm_status |= IFM_ACTIVE; 9220 /* Only 82545 is LX */ 9221 if (sc->sc_type == WM_T_82545) 9222 ifmr->ifm_active |= IFM_1000_LX; 9223 else 9224 ifmr->ifm_active |= IFM_1000_SX; 9225 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD) 9226 ifmr->ifm_active |= IFM_FDX; 9227 else 9228 ifmr->ifm_active |= IFM_HDX; 9229 ctrl = CSR_READ(sc, WMREG_CTRL); 9230 if (ctrl & CTRL_RFCE) 9231 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE; 9232 if (ctrl & CTRL_TFCE) 9233 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE; 9234 } 9235 9236 /* XXX TBI only */ 9237 static int 9238 wm_check_for_link(struct wm_softc *sc) 9239 { 9240 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 9241 uint32_t rxcw; 9242 uint32_t ctrl; 9243 uint32_t status; 9244 uint32_t sig; 9245 9246 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) { 9247 /* XXX need some work for >= 82571 */ 9248 if (sc->sc_type >= WM_T_82571) { 9249 sc->sc_tbi_linkup = 1; 9250 return 0; 9251 } 9252 } 9253 9254 rxcw = CSR_READ(sc, WMREG_RXCW); 9255 ctrl = CSR_READ(sc, WMREG_CTRL); 9256 status = CSR_READ(sc, WMREG_STATUS); 9257 9258 sig = (sc->sc_type > WM_T_82544) ? CTRL_SWDPIN(1) : 0; 9259 9260 DPRINTF(WM_DEBUG_LINK, ("%s: %s: sig = %d, status_lu = %d, rxcw_c = %d\n", 9261 device_xname(sc->sc_dev), __func__, 9262 ((ctrl & CTRL_SWDPIN(1)) == sig), 9263 ((status & STATUS_LU) != 0), 9264 ((rxcw & RXCW_C) != 0) 9265 )); 9266 9267 /* 9268 * SWDPIN LU RXCW 9269 * 0 0 0 9270 * 0 0 1 (should not happen) 9271 * 0 1 0 (should not happen) 9272 * 0 1 1 (should not happen) 9273 * 1 0 0 Disable autonego and force linkup 9274 * 1 0 1 got /C/ but not linkup yet 9275 * 1 1 0 (linkup) 9276 * 1 1 1 If IFM_AUTO, back to autonego 9277 * 9278 */ 9279 if (((ctrl & CTRL_SWDPIN(1)) == sig) 9280 && ((status & STATUS_LU) == 0) 9281 && ((rxcw & RXCW_C) == 0)) { 9282 DPRINTF(WM_DEBUG_LINK, ("%s: force linkup and fullduplex\n", 9283 __func__)); 9284 sc->sc_tbi_linkup = 0; 9285 /* Disable auto-negotiation in the TXCW register */ 9286 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE)); 9287 9288 /* 9289 * Force link-up and also force full-duplex. 9290 * 9291 * NOTE: CTRL was updated TFCE and RFCE automatically, 9292 * so we should update sc->sc_ctrl 9293 */ 9294 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD; 9295 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9296 } else if (((status & STATUS_LU) != 0) 9297 && ((rxcw & RXCW_C) != 0) 9298 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) { 9299 sc->sc_tbi_linkup = 1; 9300 DPRINTF(WM_DEBUG_LINK, ("%s: go back to autonego\n", 9301 __func__)); 9302 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 9303 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU)); 9304 } else if (((ctrl & CTRL_SWDPIN(1)) == sig) 9305 && ((rxcw & RXCW_C) != 0)) { 9306 DPRINTF(WM_DEBUG_LINK, ("/C/")); 9307 } else { 9308 DPRINTF(WM_DEBUG_LINK, ("%s: %x,%x,%x\n", __func__, rxcw, ctrl, 9309 status)); 9310 } 9311 9312 return 0; 9313 } 9314 9315 /* 9316 * wm_tbi_tick: 9317 * 9318 * Check the link on TBI devices. 9319 * This function acts as mii_tick(). 9320 */ 9321 static void 9322 wm_tbi_tick(struct wm_softc *sc) 9323 { 9324 struct wm_txqueue *txq __diagused = &sc->sc_txq[0]; 9325 struct mii_data *mii = &sc->sc_mii; 9326 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 9327 uint32_t status; 9328 9329 KASSERT(WM_TX_LOCKED(txq)); 9330 9331 status = CSR_READ(sc, WMREG_STATUS); 9332 9333 /* XXX is this needed? */ 9334 (void)CSR_READ(sc, WMREG_RXCW); 9335 (void)CSR_READ(sc, WMREG_CTRL); 9336 9337 /* set link status */ 9338 if ((status & STATUS_LU) == 0) { 9339 DPRINTF(WM_DEBUG_LINK, 9340 ("%s: LINK: checklink -> down\n", 9341 device_xname(sc->sc_dev))); 9342 sc->sc_tbi_linkup = 0; 9343 } else if (sc->sc_tbi_linkup == 0) { 9344 DPRINTF(WM_DEBUG_LINK, 9345 ("%s: LINK: checklink -> up %s\n", 9346 device_xname(sc->sc_dev), 9347 (status & STATUS_FD) ? "FDX" : "HDX")); 9348 sc->sc_tbi_linkup = 1; 9349 sc->sc_tbi_serdes_ticks = 0; 9350 } 9351 9352 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0) 9353 goto setled; 9354 9355 if ((status & STATUS_LU) == 0) { 9356 sc->sc_tbi_linkup = 0; 9357 /* If the timer expired, retry autonegotiation */ 9358 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 9359 && (++sc->sc_tbi_serdes_ticks 9360 >= sc->sc_tbi_serdes_anegticks)) { 9361 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n")); 9362 sc->sc_tbi_serdes_ticks = 0; 9363 /* 9364 * Reset the link, and let autonegotiation do 9365 * its thing 9366 */ 9367 sc->sc_ctrl |= CTRL_LRST; 9368 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9369 CSR_WRITE_FLUSH(sc); 9370 delay(1000); 9371 sc->sc_ctrl &= ~CTRL_LRST; 9372 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9373 CSR_WRITE_FLUSH(sc); 9374 delay(1000); 9375 CSR_WRITE(sc, WMREG_TXCW, 9376 sc->sc_txcw & ~TXCW_ANE); 9377 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw); 9378 } 9379 } 9380 9381 setled: 9382 wm_tbi_serdes_set_linkled(sc); 9383 } 9384 9385 /* SERDES related */ 9386 static void 9387 wm_serdes_power_up_link_82575(struct wm_softc *sc) 9388 { 9389 uint32_t reg; 9390 9391 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES) 9392 && ((sc->sc_flags & WM_F_SGMII) == 0)) 9393 return; 9394 9395 reg = CSR_READ(sc, WMREG_PCS_CFG); 9396 reg |= PCS_CFG_PCS_EN; 9397 CSR_WRITE(sc, WMREG_PCS_CFG, reg); 9398 9399 reg = CSR_READ(sc, WMREG_CTRL_EXT); 9400 reg &= ~CTRL_EXT_SWDPIN(3); 9401 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 9402 CSR_WRITE_FLUSH(sc); 9403 } 9404 9405 static int 9406 wm_serdes_mediachange(struct ifnet *ifp) 9407 { 9408 struct wm_softc *sc = ifp->if_softc; 9409 bool pcs_autoneg = true; /* XXX */ 9410 uint32_t ctrl_ext, pcs_lctl, reg; 9411 9412 /* XXX Currently, this function is not called on 8257[12] */ 9413 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572) 9414 || (sc->sc_type >= WM_T_82575)) 9415 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK); 9416 9417 wm_serdes_power_up_link_82575(sc); 9418 9419 sc->sc_ctrl |= CTRL_SLU; 9420 9421 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) 9422 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1); 9423 9424 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 9425 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL); 9426 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) { 9427 case CTRL_EXT_LINK_MODE_SGMII: 9428 pcs_autoneg = true; 9429 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT; 9430 break; 9431 case CTRL_EXT_LINK_MODE_1000KX: 9432 pcs_autoneg = false; 9433 /* FALLTHROUGH */ 9434 default: 9435 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)){ 9436 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0) 9437 pcs_autoneg = false; 9438 } 9439 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD 9440 | CTRL_FRCFDX; 9441 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL; 9442 } 9443 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 9444 9445 if (pcs_autoneg) { 9446 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART; 9447 pcs_lctl &= ~PCS_LCTL_FORCE_FC; 9448 9449 reg = CSR_READ(sc, WMREG_PCS_ANADV); 9450 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE); 9451 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE; 9452 CSR_WRITE(sc, WMREG_PCS_ANADV, reg); 9453 } else 9454 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC; 9455 9456 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl); 9457 9458 9459 return 0; 9460 } 9461 9462 static void 9463 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 9464 { 9465 struct wm_softc *sc = ifp->if_softc; 9466 struct mii_data *mii = &sc->sc_mii; 9467 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 9468 uint32_t pcs_adv, pcs_lpab, reg; 9469 9470 ifmr->ifm_status = IFM_AVALID; 9471 ifmr->ifm_active = IFM_ETHER; 9472 9473 /* Check PCS */ 9474 reg = CSR_READ(sc, WMREG_PCS_LSTS); 9475 if ((reg & PCS_LSTS_LINKOK) == 0) { 9476 ifmr->ifm_active |= IFM_NONE; 9477 sc->sc_tbi_linkup = 0; 9478 goto setled; 9479 } 9480 9481 sc->sc_tbi_linkup = 1; 9482 ifmr->ifm_status |= IFM_ACTIVE; 9483 ifmr->ifm_active |= IFM_1000_SX; /* XXX */ 9484 if ((reg & PCS_LSTS_FDX) != 0) 9485 ifmr->ifm_active |= IFM_FDX; 9486 else 9487 ifmr->ifm_active |= IFM_HDX; 9488 mii->mii_media_active &= ~IFM_ETH_FMASK; 9489 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 9490 /* Check flow */ 9491 reg = CSR_READ(sc, WMREG_PCS_LSTS); 9492 if ((reg & PCS_LSTS_AN_COMP) == 0) { 9493 printf("XXX LINKOK but not ACOMP\n"); 9494 goto setled; 9495 } 9496 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV); 9497 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB); 9498 printf("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab); 9499 if ((pcs_adv & TXCW_SYM_PAUSE) 9500 && (pcs_lpab & TXCW_SYM_PAUSE)) { 9501 mii->mii_media_active |= IFM_FLOW 9502 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE; 9503 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0) 9504 && (pcs_adv & TXCW_ASYM_PAUSE) 9505 && (pcs_lpab & TXCW_SYM_PAUSE) 9506 && (pcs_lpab & TXCW_ASYM_PAUSE)) { 9507 mii->mii_media_active |= IFM_FLOW 9508 | IFM_ETH_TXPAUSE; 9509 } else if ((pcs_adv & TXCW_SYM_PAUSE) 9510 && (pcs_adv & TXCW_ASYM_PAUSE) 9511 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0) 9512 && (pcs_lpab & TXCW_ASYM_PAUSE)) { 9513 mii->mii_media_active |= IFM_FLOW 9514 | IFM_ETH_RXPAUSE; 9515 } else { 9516 } 9517 } 9518 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) 9519 | (mii->mii_media_active & IFM_ETH_FMASK); 9520 setled: 9521 wm_tbi_serdes_set_linkled(sc); 9522 } 9523 9524 /* 9525 * wm_serdes_tick: 9526 * 9527 * Check the link on serdes devices. 9528 */ 9529 static void 9530 wm_serdes_tick(struct wm_softc *sc) 9531 { 9532 struct wm_txqueue *txq __diagused = &sc->sc_txq[0]; 9533 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 9534 struct mii_data *mii = &sc->sc_mii; 9535 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 9536 uint32_t reg; 9537 9538 KASSERT(WM_TX_LOCKED(txq)); 9539 9540 mii->mii_media_status = IFM_AVALID; 9541 mii->mii_media_active = IFM_ETHER; 9542 9543 /* Check PCS */ 9544 reg = CSR_READ(sc, WMREG_PCS_LSTS); 9545 if ((reg & PCS_LSTS_LINKOK) != 0) { 9546 mii->mii_media_status |= IFM_ACTIVE; 9547 sc->sc_tbi_linkup = 1; 9548 sc->sc_tbi_serdes_ticks = 0; 9549 mii->mii_media_active |= IFM_1000_SX; /* XXX */ 9550 if ((reg & PCS_LSTS_FDX) != 0) 9551 mii->mii_media_active |= IFM_FDX; 9552 else 9553 mii->mii_media_active |= IFM_HDX; 9554 } else { 9555 mii->mii_media_status |= IFM_NONE; 9556 sc->sc_tbi_linkup = 0; 9557 /* If the timer expired, retry autonegotiation */ 9558 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) 9559 && (++sc->sc_tbi_serdes_ticks 9560 >= sc->sc_tbi_serdes_anegticks)) { 9561 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n")); 9562 sc->sc_tbi_serdes_ticks = 0; 9563 /* XXX */ 9564 wm_serdes_mediachange(ifp); 9565 } 9566 } 9567 9568 wm_tbi_serdes_set_linkled(sc); 9569 } 9570 9571 /* SFP related */ 9572 9573 static int 9574 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data) 9575 { 9576 uint32_t i2ccmd; 9577 int i; 9578 9579 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ; 9580 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd); 9581 9582 /* Poll the ready bit */ 9583 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) { 9584 delay(50); 9585 i2ccmd = CSR_READ(sc, WMREG_I2CCMD); 9586 if (i2ccmd & I2CCMD_READY) 9587 break; 9588 } 9589 if ((i2ccmd & I2CCMD_READY) == 0) 9590 return -1; 9591 if ((i2ccmd & I2CCMD_ERROR) != 0) 9592 return -1; 9593 9594 *data = i2ccmd & 0x00ff; 9595 9596 return 0; 9597 } 9598 9599 static uint32_t 9600 wm_sfp_get_media_type(struct wm_softc *sc) 9601 { 9602 uint32_t ctrl_ext; 9603 uint8_t val = 0; 9604 int timeout = 3; 9605 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN; 9606 int rv = -1; 9607 9608 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 9609 ctrl_ext &= ~CTRL_EXT_SWDPIN(3); 9610 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA); 9611 CSR_WRITE_FLUSH(sc); 9612 9613 /* Read SFP module data */ 9614 while (timeout) { 9615 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val); 9616 if (rv == 0) 9617 break; 9618 delay(100*1000); /* XXX too big */ 9619 timeout--; 9620 } 9621 if (rv != 0) 9622 goto out; 9623 switch (val) { 9624 case SFF_SFP_ID_SFF: 9625 aprint_normal_dev(sc->sc_dev, 9626 "Module/Connector soldered to board\n"); 9627 break; 9628 case SFF_SFP_ID_SFP: 9629 aprint_normal_dev(sc->sc_dev, "SFP\n"); 9630 break; 9631 case SFF_SFP_ID_UNKNOWN: 9632 goto out; 9633 default: 9634 break; 9635 } 9636 9637 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val); 9638 if (rv != 0) { 9639 goto out; 9640 } 9641 9642 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0) 9643 mediatype = WM_MEDIATYPE_SERDES; 9644 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0){ 9645 sc->sc_flags |= WM_F_SGMII; 9646 mediatype = WM_MEDIATYPE_COPPER; 9647 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0){ 9648 sc->sc_flags |= WM_F_SGMII; 9649 mediatype = WM_MEDIATYPE_SERDES; 9650 } 9651 9652 out: 9653 /* Restore I2C interface setting */ 9654 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 9655 9656 return mediatype; 9657 } 9658 /* 9659 * NVM related. 9660 * Microwire, SPI (w/wo EERD) and Flash. 9661 */ 9662 9663 /* Both spi and uwire */ 9664 9665 /* 9666 * wm_eeprom_sendbits: 9667 * 9668 * Send a series of bits to the EEPROM. 9669 */ 9670 static void 9671 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits) 9672 { 9673 uint32_t reg; 9674 int x; 9675 9676 reg = CSR_READ(sc, WMREG_EECD); 9677 9678 for (x = nbits; x > 0; x--) { 9679 if (bits & (1U << (x - 1))) 9680 reg |= EECD_DI; 9681 else 9682 reg &= ~EECD_DI; 9683 CSR_WRITE(sc, WMREG_EECD, reg); 9684 CSR_WRITE_FLUSH(sc); 9685 delay(2); 9686 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK); 9687 CSR_WRITE_FLUSH(sc); 9688 delay(2); 9689 CSR_WRITE(sc, WMREG_EECD, reg); 9690 CSR_WRITE_FLUSH(sc); 9691 delay(2); 9692 } 9693 } 9694 9695 /* 9696 * wm_eeprom_recvbits: 9697 * 9698 * Receive a series of bits from the EEPROM. 9699 */ 9700 static void 9701 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits) 9702 { 9703 uint32_t reg, val; 9704 int x; 9705 9706 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI; 9707 9708 val = 0; 9709 for (x = nbits; x > 0; x--) { 9710 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK); 9711 CSR_WRITE_FLUSH(sc); 9712 delay(2); 9713 if (CSR_READ(sc, WMREG_EECD) & EECD_DO) 9714 val |= (1U << (x - 1)); 9715 CSR_WRITE(sc, WMREG_EECD, reg); 9716 CSR_WRITE_FLUSH(sc); 9717 delay(2); 9718 } 9719 *valp = val; 9720 } 9721 9722 /* Microwire */ 9723 9724 /* 9725 * wm_nvm_read_uwire: 9726 * 9727 * Read a word from the EEPROM using the MicroWire protocol. 9728 */ 9729 static int 9730 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 9731 { 9732 uint32_t reg, val; 9733 int i; 9734 9735 for (i = 0; i < wordcnt; i++) { 9736 /* Clear SK and DI. */ 9737 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI); 9738 CSR_WRITE(sc, WMREG_EECD, reg); 9739 9740 /* 9741 * XXX: workaround for a bug in qemu-0.12.x and prior 9742 * and Xen. 9743 * 9744 * We use this workaround only for 82540 because qemu's 9745 * e1000 act as 82540. 9746 */ 9747 if (sc->sc_type == WM_T_82540) { 9748 reg |= EECD_SK; 9749 CSR_WRITE(sc, WMREG_EECD, reg); 9750 reg &= ~EECD_SK; 9751 CSR_WRITE(sc, WMREG_EECD, reg); 9752 CSR_WRITE_FLUSH(sc); 9753 delay(2); 9754 } 9755 /* XXX: end of workaround */ 9756 9757 /* Set CHIP SELECT. */ 9758 reg |= EECD_CS; 9759 CSR_WRITE(sc, WMREG_EECD, reg); 9760 CSR_WRITE_FLUSH(sc); 9761 delay(2); 9762 9763 /* Shift in the READ command. */ 9764 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3); 9765 9766 /* Shift in address. */ 9767 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits); 9768 9769 /* Shift out the data. */ 9770 wm_eeprom_recvbits(sc, &val, 16); 9771 data[i] = val & 0xffff; 9772 9773 /* Clear CHIP SELECT. */ 9774 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS; 9775 CSR_WRITE(sc, WMREG_EECD, reg); 9776 CSR_WRITE_FLUSH(sc); 9777 delay(2); 9778 } 9779 9780 return 0; 9781 } 9782 9783 /* SPI */ 9784 9785 /* 9786 * Set SPI and FLASH related information from the EECD register. 9787 * For 82541 and 82547, the word size is taken from EEPROM. 9788 */ 9789 static int 9790 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc) 9791 { 9792 int size; 9793 uint32_t reg; 9794 uint16_t data; 9795 9796 reg = CSR_READ(sc, WMREG_EECD); 9797 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8; 9798 9799 /* Read the size of NVM from EECD by default */ 9800 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK); 9801 switch (sc->sc_type) { 9802 case WM_T_82541: 9803 case WM_T_82541_2: 9804 case WM_T_82547: 9805 case WM_T_82547_2: 9806 /* Set dummy value to access EEPROM */ 9807 sc->sc_nvm_wordsize = 64; 9808 wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data); 9809 reg = data; 9810 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK); 9811 if (size == 0) 9812 size = 6; /* 64 word size */ 9813 else 9814 size += NVM_WORD_SIZE_BASE_SHIFT + 1; 9815 break; 9816 case WM_T_80003: 9817 case WM_T_82571: 9818 case WM_T_82572: 9819 case WM_T_82573: /* SPI case */ 9820 case WM_T_82574: /* SPI case */ 9821 case WM_T_82583: /* SPI case */ 9822 size += NVM_WORD_SIZE_BASE_SHIFT; 9823 if (size > 14) 9824 size = 14; 9825 break; 9826 case WM_T_82575: 9827 case WM_T_82576: 9828 case WM_T_82580: 9829 case WM_T_I350: 9830 case WM_T_I354: 9831 case WM_T_I210: 9832 case WM_T_I211: 9833 size += NVM_WORD_SIZE_BASE_SHIFT; 9834 if (size > 15) 9835 size = 15; 9836 break; 9837 default: 9838 aprint_error_dev(sc->sc_dev, 9839 "%s: unknown device(%d)?\n", __func__, sc->sc_type); 9840 return -1; 9841 break; 9842 } 9843 9844 sc->sc_nvm_wordsize = 1 << size; 9845 9846 return 0; 9847 } 9848 9849 /* 9850 * wm_nvm_ready_spi: 9851 * 9852 * Wait for a SPI EEPROM to be ready for commands. 9853 */ 9854 static int 9855 wm_nvm_ready_spi(struct wm_softc *sc) 9856 { 9857 uint32_t val; 9858 int usec; 9859 9860 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) { 9861 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8); 9862 wm_eeprom_recvbits(sc, &val, 8); 9863 if ((val & SPI_SR_RDY) == 0) 9864 break; 9865 } 9866 if (usec >= SPI_MAX_RETRIES) { 9867 aprint_error_dev(sc->sc_dev, "EEPROM failed to become ready\n"); 9868 return 1; 9869 } 9870 return 0; 9871 } 9872 9873 /* 9874 * wm_nvm_read_spi: 9875 * 9876 * Read a work from the EEPROM using the SPI protocol. 9877 */ 9878 static int 9879 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 9880 { 9881 uint32_t reg, val; 9882 int i; 9883 uint8_t opc; 9884 9885 /* Clear SK and CS. */ 9886 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS); 9887 CSR_WRITE(sc, WMREG_EECD, reg); 9888 CSR_WRITE_FLUSH(sc); 9889 delay(2); 9890 9891 if (wm_nvm_ready_spi(sc)) 9892 return 1; 9893 9894 /* Toggle CS to flush commands. */ 9895 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS); 9896 CSR_WRITE_FLUSH(sc); 9897 delay(2); 9898 CSR_WRITE(sc, WMREG_EECD, reg); 9899 CSR_WRITE_FLUSH(sc); 9900 delay(2); 9901 9902 opc = SPI_OPC_READ; 9903 if (sc->sc_nvm_addrbits == 8 && word >= 128) 9904 opc |= SPI_OPC_A8; 9905 9906 wm_eeprom_sendbits(sc, opc, 8); 9907 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits); 9908 9909 for (i = 0; i < wordcnt; i++) { 9910 wm_eeprom_recvbits(sc, &val, 16); 9911 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8); 9912 } 9913 9914 /* Raise CS and clear SK. */ 9915 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS; 9916 CSR_WRITE(sc, WMREG_EECD, reg); 9917 CSR_WRITE_FLUSH(sc); 9918 delay(2); 9919 9920 return 0; 9921 } 9922 9923 /* Using with EERD */ 9924 9925 static int 9926 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw) 9927 { 9928 uint32_t attempts = 100000; 9929 uint32_t i, reg = 0; 9930 int32_t done = -1; 9931 9932 for (i = 0; i < attempts; i++) { 9933 reg = CSR_READ(sc, rw); 9934 9935 if (reg & EERD_DONE) { 9936 done = 0; 9937 break; 9938 } 9939 delay(5); 9940 } 9941 9942 return done; 9943 } 9944 9945 static int 9946 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt, 9947 uint16_t *data) 9948 { 9949 int i, eerd = 0; 9950 int error = 0; 9951 9952 for (i = 0; i < wordcnt; i++) { 9953 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START; 9954 9955 CSR_WRITE(sc, WMREG_EERD, eerd); 9956 error = wm_poll_eerd_eewr_done(sc, WMREG_EERD); 9957 if (error != 0) 9958 break; 9959 9960 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT); 9961 } 9962 9963 return error; 9964 } 9965 9966 /* Flash */ 9967 9968 static int 9969 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank) 9970 { 9971 uint32_t eecd; 9972 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1; 9973 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t); 9974 uint8_t sig_byte = 0; 9975 9976 switch (sc->sc_type) { 9977 case WM_T_ICH8: 9978 case WM_T_ICH9: 9979 eecd = CSR_READ(sc, WMREG_EECD); 9980 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) { 9981 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0; 9982 return 0; 9983 } 9984 /* FALLTHROUGH */ 9985 default: 9986 /* Default to 0 */ 9987 *bank = 0; 9988 9989 /* Check bank 0 */ 9990 wm_read_ich8_byte(sc, act_offset, &sig_byte); 9991 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 9992 *bank = 0; 9993 return 0; 9994 } 9995 9996 /* Check bank 1 */ 9997 wm_read_ich8_byte(sc, act_offset + bank1_offset, 9998 &sig_byte); 9999 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) { 10000 *bank = 1; 10001 return 0; 10002 } 10003 } 10004 10005 DPRINTF(WM_DEBUG_NVM, ("%s: No valid NVM bank present\n", 10006 device_xname(sc->sc_dev))); 10007 return -1; 10008 } 10009 10010 /****************************************************************************** 10011 * This function does initial flash setup so that a new read/write/erase cycle 10012 * can be started. 10013 * 10014 * sc - The pointer to the hw structure 10015 ****************************************************************************/ 10016 static int32_t 10017 wm_ich8_cycle_init(struct wm_softc *sc) 10018 { 10019 uint16_t hsfsts; 10020 int32_t error = 1; 10021 int32_t i = 0; 10022 10023 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 10024 10025 /* May be check the Flash Des Valid bit in Hw status */ 10026 if ((hsfsts & HSFSTS_FLDVAL) == 0) { 10027 return error; 10028 } 10029 10030 /* Clear FCERR in Hw status by writing 1 */ 10031 /* Clear DAEL in Hw status by writing a 1 */ 10032 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL; 10033 10034 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 10035 10036 /* 10037 * Either we should have a hardware SPI cycle in progress bit to check 10038 * against, in order to start a new cycle or FDONE bit should be 10039 * changed in the hardware so that it is 1 after harware reset, which 10040 * can then be used as an indication whether a cycle is in progress or 10041 * has been completed .. we should also have some software semaphore 10042 * mechanism to guard FDONE or the cycle in progress bit so that two 10043 * threads access to those bits can be sequentiallized or a way so that 10044 * 2 threads dont start the cycle at the same time 10045 */ 10046 10047 if ((hsfsts & HSFSTS_FLINPRO) == 0) { 10048 /* 10049 * There is no cycle running at present, so we can start a 10050 * cycle 10051 */ 10052 10053 /* Begin by setting Flash Cycle Done. */ 10054 hsfsts |= HSFSTS_DONE; 10055 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 10056 error = 0; 10057 } else { 10058 /* 10059 * otherwise poll for sometime so the current cycle has a 10060 * chance to end before giving up. 10061 */ 10062 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) { 10063 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 10064 if ((hsfsts & HSFSTS_FLINPRO) == 0) { 10065 error = 0; 10066 break; 10067 } 10068 delay(1); 10069 } 10070 if (error == 0) { 10071 /* 10072 * Successful in waiting for previous cycle to timeout, 10073 * now set the Flash Cycle Done. 10074 */ 10075 hsfsts |= HSFSTS_DONE; 10076 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts); 10077 } 10078 } 10079 return error; 10080 } 10081 10082 /****************************************************************************** 10083 * This function starts a flash cycle and waits for its completion 10084 * 10085 * sc - The pointer to the hw structure 10086 ****************************************************************************/ 10087 static int32_t 10088 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout) 10089 { 10090 uint16_t hsflctl; 10091 uint16_t hsfsts; 10092 int32_t error = 1; 10093 uint32_t i = 0; 10094 10095 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */ 10096 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL); 10097 hsflctl |= HSFCTL_GO; 10098 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl); 10099 10100 /* Wait till FDONE bit is set to 1 */ 10101 do { 10102 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 10103 if (hsfsts & HSFSTS_DONE) 10104 break; 10105 delay(1); 10106 i++; 10107 } while (i < timeout); 10108 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0) 10109 error = 0; 10110 10111 return error; 10112 } 10113 10114 /****************************************************************************** 10115 * Reads a byte or word from the NVM using the ICH8 flash access registers. 10116 * 10117 * sc - The pointer to the hw structure 10118 * index - The index of the byte or word to read. 10119 * size - Size of data to read, 1=byte 2=word 10120 * data - Pointer to the word to store the value read. 10121 *****************************************************************************/ 10122 static int32_t 10123 wm_read_ich8_data(struct wm_softc *sc, uint32_t index, 10124 uint32_t size, uint16_t *data) 10125 { 10126 uint16_t hsfsts; 10127 uint16_t hsflctl; 10128 uint32_t flash_linear_address; 10129 uint32_t flash_data = 0; 10130 int32_t error = 1; 10131 int32_t count = 0; 10132 10133 if (size < 1 || size > 2 || data == 0x0 || 10134 index > ICH_FLASH_LINEAR_ADDR_MASK) 10135 return error; 10136 10137 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) + 10138 sc->sc_ich8_flash_base; 10139 10140 do { 10141 delay(1); 10142 /* Steps */ 10143 error = wm_ich8_cycle_init(sc); 10144 if (error) 10145 break; 10146 10147 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL); 10148 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ 10149 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT) 10150 & HSFCTL_BCOUNT_MASK; 10151 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT; 10152 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl); 10153 10154 /* 10155 * Write the last 24 bits of index into Flash Linear address 10156 * field in Flash Address 10157 */ 10158 /* TODO: TBD maybe check the index against the size of flash */ 10159 10160 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address); 10161 10162 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT); 10163 10164 /* 10165 * Check if FCERR is set to 1, if set to 1, clear it and try 10166 * the whole sequence a few more times, else read in (shift in) 10167 * the Flash Data0, the order is least significant byte first 10168 * msb to lsb 10169 */ 10170 if (error == 0) { 10171 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0); 10172 if (size == 1) 10173 *data = (uint8_t)(flash_data & 0x000000FF); 10174 else if (size == 2) 10175 *data = (uint16_t)(flash_data & 0x0000FFFF); 10176 break; 10177 } else { 10178 /* 10179 * If we've gotten here, then things are probably 10180 * completely hosed, but if the error condition is 10181 * detected, it won't hurt to give it another try... 10182 * ICH_FLASH_CYCLE_REPEAT_COUNT times. 10183 */ 10184 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS); 10185 if (hsfsts & HSFSTS_ERR) { 10186 /* Repeat for some time before giving up. */ 10187 continue; 10188 } else if ((hsfsts & HSFSTS_DONE) == 0) 10189 break; 10190 } 10191 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT); 10192 10193 return error; 10194 } 10195 10196 /****************************************************************************** 10197 * Reads a single byte from the NVM using the ICH8 flash access registers. 10198 * 10199 * sc - pointer to wm_hw structure 10200 * index - The index of the byte to read. 10201 * data - Pointer to a byte to store the value read. 10202 *****************************************************************************/ 10203 static int32_t 10204 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data) 10205 { 10206 int32_t status; 10207 uint16_t word = 0; 10208 10209 status = wm_read_ich8_data(sc, index, 1, &word); 10210 if (status == 0) 10211 *data = (uint8_t)word; 10212 else 10213 *data = 0; 10214 10215 return status; 10216 } 10217 10218 /****************************************************************************** 10219 * Reads a word from the NVM using the ICH8 flash access registers. 10220 * 10221 * sc - pointer to wm_hw structure 10222 * index - The starting byte index of the word to read. 10223 * data - Pointer to a word to store the value read. 10224 *****************************************************************************/ 10225 static int32_t 10226 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data) 10227 { 10228 int32_t status; 10229 10230 status = wm_read_ich8_data(sc, index, 2, data); 10231 return status; 10232 } 10233 10234 /****************************************************************************** 10235 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access 10236 * register. 10237 * 10238 * sc - Struct containing variables accessed by shared code 10239 * offset - offset of word in the EEPROM to read 10240 * data - word read from the EEPROM 10241 * words - number of words to read 10242 *****************************************************************************/ 10243 static int 10244 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data) 10245 { 10246 int32_t error = 0; 10247 uint32_t flash_bank = 0; 10248 uint32_t act_offset = 0; 10249 uint32_t bank_offset = 0; 10250 uint16_t word = 0; 10251 uint16_t i = 0; 10252 10253 /* 10254 * We need to know which is the valid flash bank. In the event 10255 * that we didn't allocate eeprom_shadow_ram, we may not be 10256 * managing flash_bank. So it cannot be trusted and needs 10257 * to be updated with each read. 10258 */ 10259 error = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank); 10260 if (error) { 10261 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n", 10262 device_xname(sc->sc_dev))); 10263 flash_bank = 0; 10264 } 10265 10266 /* 10267 * Adjust offset appropriately if we're on bank 1 - adjust for word 10268 * size 10269 */ 10270 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2); 10271 10272 error = wm_get_swfwhw_semaphore(sc); 10273 if (error) { 10274 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 10275 __func__); 10276 return error; 10277 } 10278 10279 for (i = 0; i < words; i++) { 10280 /* The NVM part needs a byte offset, hence * 2 */ 10281 act_offset = bank_offset + ((offset + i) * 2); 10282 error = wm_read_ich8_word(sc, act_offset, &word); 10283 if (error) { 10284 aprint_error_dev(sc->sc_dev, 10285 "%s: failed to read NVM\n", __func__); 10286 break; 10287 } 10288 data[i] = word; 10289 } 10290 10291 wm_put_swfwhw_semaphore(sc); 10292 return error; 10293 } 10294 10295 /* iNVM */ 10296 10297 static int 10298 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data) 10299 { 10300 int32_t rv = 0; 10301 uint32_t invm_dword; 10302 uint16_t i; 10303 uint8_t record_type, word_address; 10304 10305 for (i = 0; i < INVM_SIZE; i++) { 10306 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i)); 10307 /* Get record type */ 10308 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword); 10309 if (record_type == INVM_UNINITIALIZED_STRUCTURE) 10310 break; 10311 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE) 10312 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS; 10313 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE) 10314 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS; 10315 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) { 10316 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword); 10317 if (word_address == address) { 10318 *data = INVM_DWORD_TO_WORD_DATA(invm_dword); 10319 rv = 0; 10320 break; 10321 } 10322 } 10323 } 10324 10325 return rv; 10326 } 10327 10328 static int 10329 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data) 10330 { 10331 int rv = 0; 10332 int i; 10333 10334 for (i = 0; i < words; i++) { 10335 switch (offset + i) { 10336 case NVM_OFF_MACADDR: 10337 case NVM_OFF_MACADDR1: 10338 case NVM_OFF_MACADDR2: 10339 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]); 10340 if (rv != 0) { 10341 data[i] = 0xffff; 10342 rv = -1; 10343 } 10344 break; 10345 case NVM_OFF_CFG2: 10346 rv = wm_nvm_read_word_invm(sc, offset, data); 10347 if (rv != 0) { 10348 *data = NVM_INIT_CTRL_2_DEFAULT_I211; 10349 rv = 0; 10350 } 10351 break; 10352 case NVM_OFF_CFG4: 10353 rv = wm_nvm_read_word_invm(sc, offset, data); 10354 if (rv != 0) { 10355 *data = NVM_INIT_CTRL_4_DEFAULT_I211; 10356 rv = 0; 10357 } 10358 break; 10359 case NVM_OFF_LED_1_CFG: 10360 rv = wm_nvm_read_word_invm(sc, offset, data); 10361 if (rv != 0) { 10362 *data = NVM_LED_1_CFG_DEFAULT_I211; 10363 rv = 0; 10364 } 10365 break; 10366 case NVM_OFF_LED_0_2_CFG: 10367 rv = wm_nvm_read_word_invm(sc, offset, data); 10368 if (rv != 0) { 10369 *data = NVM_LED_0_2_CFG_DEFAULT_I211; 10370 rv = 0; 10371 } 10372 break; 10373 case NVM_OFF_ID_LED_SETTINGS: 10374 rv = wm_nvm_read_word_invm(sc, offset, data); 10375 if (rv != 0) { 10376 *data = ID_LED_RESERVED_FFFF; 10377 rv = 0; 10378 } 10379 break; 10380 default: 10381 DPRINTF(WM_DEBUG_NVM, 10382 ("NVM word 0x%02x is not mapped.\n", offset)); 10383 *data = NVM_RESERVED_WORD; 10384 break; 10385 } 10386 } 10387 10388 return rv; 10389 } 10390 10391 /* Lock, detecting NVM type, validate checksum, version and read */ 10392 10393 /* 10394 * wm_nvm_acquire: 10395 * 10396 * Perform the EEPROM handshake required on some chips. 10397 */ 10398 static int 10399 wm_nvm_acquire(struct wm_softc *sc) 10400 { 10401 uint32_t reg; 10402 int x; 10403 int ret = 0; 10404 10405 /* always success */ 10406 if ((sc->sc_flags & WM_F_EEPROM_FLASH) != 0) 10407 return 0; 10408 10409 if (sc->sc_flags & WM_F_LOCK_EXTCNF) { 10410 ret = wm_get_swfwhw_semaphore(sc); 10411 } else if (sc->sc_flags & WM_F_LOCK_SWFW) { 10412 /* This will also do wm_get_swsm_semaphore() if needed */ 10413 ret = wm_get_swfw_semaphore(sc, SWFW_EEP_SM); 10414 } else if (sc->sc_flags & WM_F_LOCK_SWSM) { 10415 ret = wm_get_swsm_semaphore(sc); 10416 } 10417 10418 if (ret) { 10419 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n", 10420 __func__); 10421 return 1; 10422 } 10423 10424 if (sc->sc_flags & WM_F_LOCK_EECD) { 10425 reg = CSR_READ(sc, WMREG_EECD); 10426 10427 /* Request EEPROM access. */ 10428 reg |= EECD_EE_REQ; 10429 CSR_WRITE(sc, WMREG_EECD, reg); 10430 10431 /* ..and wait for it to be granted. */ 10432 for (x = 0; x < 1000; x++) { 10433 reg = CSR_READ(sc, WMREG_EECD); 10434 if (reg & EECD_EE_GNT) 10435 break; 10436 delay(5); 10437 } 10438 if ((reg & EECD_EE_GNT) == 0) { 10439 aprint_error_dev(sc->sc_dev, 10440 "could not acquire EEPROM GNT\n"); 10441 reg &= ~EECD_EE_REQ; 10442 CSR_WRITE(sc, WMREG_EECD, reg); 10443 if (sc->sc_flags & WM_F_LOCK_EXTCNF) 10444 wm_put_swfwhw_semaphore(sc); 10445 if (sc->sc_flags & WM_F_LOCK_SWFW) 10446 wm_put_swfw_semaphore(sc, SWFW_EEP_SM); 10447 else if (sc->sc_flags & WM_F_LOCK_SWSM) 10448 wm_put_swsm_semaphore(sc); 10449 return 1; 10450 } 10451 } 10452 10453 return 0; 10454 } 10455 10456 /* 10457 * wm_nvm_release: 10458 * 10459 * Release the EEPROM mutex. 10460 */ 10461 static void 10462 wm_nvm_release(struct wm_softc *sc) 10463 { 10464 uint32_t reg; 10465 10466 /* always success */ 10467 if ((sc->sc_flags & WM_F_EEPROM_FLASH) != 0) 10468 return; 10469 10470 if (sc->sc_flags & WM_F_LOCK_EECD) { 10471 reg = CSR_READ(sc, WMREG_EECD); 10472 reg &= ~EECD_EE_REQ; 10473 CSR_WRITE(sc, WMREG_EECD, reg); 10474 } 10475 10476 if (sc->sc_flags & WM_F_LOCK_EXTCNF) 10477 wm_put_swfwhw_semaphore(sc); 10478 if (sc->sc_flags & WM_F_LOCK_SWFW) 10479 wm_put_swfw_semaphore(sc, SWFW_EEP_SM); 10480 else if (sc->sc_flags & WM_F_LOCK_SWSM) 10481 wm_put_swsm_semaphore(sc); 10482 } 10483 10484 static int 10485 wm_nvm_is_onboard_eeprom(struct wm_softc *sc) 10486 { 10487 uint32_t eecd = 0; 10488 10489 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574 10490 || sc->sc_type == WM_T_82583) { 10491 eecd = CSR_READ(sc, WMREG_EECD); 10492 10493 /* Isolate bits 15 & 16 */ 10494 eecd = ((eecd >> 15) & 0x03); 10495 10496 /* If both bits are set, device is Flash type */ 10497 if (eecd == 0x03) 10498 return 0; 10499 } 10500 return 1; 10501 } 10502 10503 static int 10504 wm_nvm_get_flash_presence_i210(struct wm_softc *sc) 10505 { 10506 uint32_t eec; 10507 10508 eec = CSR_READ(sc, WMREG_EEC); 10509 if ((eec & EEC_FLASH_DETECTED) != 0) 10510 return 1; 10511 10512 return 0; 10513 } 10514 10515 /* 10516 * wm_nvm_validate_checksum 10517 * 10518 * The checksum is defined as the sum of the first 64 (16 bit) words. 10519 */ 10520 static int 10521 wm_nvm_validate_checksum(struct wm_softc *sc) 10522 { 10523 uint16_t checksum; 10524 uint16_t eeprom_data; 10525 #ifdef WM_DEBUG 10526 uint16_t csum_wordaddr, valid_checksum; 10527 #endif 10528 int i; 10529 10530 checksum = 0; 10531 10532 /* Don't check for I211 */ 10533 if (sc->sc_type == WM_T_I211) 10534 return 0; 10535 10536 #ifdef WM_DEBUG 10537 if (sc->sc_type == WM_T_PCH_LPT) { 10538 csum_wordaddr = NVM_OFF_COMPAT; 10539 valid_checksum = NVM_COMPAT_VALID_CHECKSUM; 10540 } else { 10541 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1; 10542 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM; 10543 } 10544 10545 /* Dump EEPROM image for debug */ 10546 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 10547 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 10548 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) { 10549 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data); 10550 if ((eeprom_data & valid_checksum) == 0) { 10551 DPRINTF(WM_DEBUG_NVM, 10552 ("%s: NVM need to be updated (%04x != %04x)\n", 10553 device_xname(sc->sc_dev), eeprom_data, 10554 valid_checksum)); 10555 } 10556 } 10557 10558 if ((wm_debug & WM_DEBUG_NVM) != 0) { 10559 printf("%s: NVM dump:\n", device_xname(sc->sc_dev)); 10560 for (i = 0; i < NVM_SIZE; i++) { 10561 if (wm_nvm_read(sc, i, 1, &eeprom_data)) 10562 printf("XXXX "); 10563 else 10564 printf("%04hx ", eeprom_data); 10565 if (i % 8 == 7) 10566 printf("\n"); 10567 } 10568 } 10569 10570 #endif /* WM_DEBUG */ 10571 10572 for (i = 0; i < NVM_SIZE; i++) { 10573 if (wm_nvm_read(sc, i, 1, &eeprom_data)) 10574 return 1; 10575 checksum += eeprom_data; 10576 } 10577 10578 if (checksum != (uint16_t) NVM_CHECKSUM) { 10579 #ifdef WM_DEBUG 10580 printf("%s: NVM checksum mismatch (%04x != %04x)\n", 10581 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM); 10582 #endif 10583 } 10584 10585 return 0; 10586 } 10587 10588 static void 10589 wm_nvm_version_invm(struct wm_softc *sc) 10590 { 10591 uint32_t dword; 10592 10593 /* 10594 * Linux's code to decode version is very strange, so we don't 10595 * obey that algorithm and just use word 61 as the document. 10596 * Perhaps it's not perfect though... 10597 * 10598 * Example: 10599 * 10600 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6) 10601 */ 10602 dword = CSR_READ(sc, WM_INVM_DATA_REG(61)); 10603 dword = __SHIFTOUT(dword, INVM_VER_1); 10604 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR); 10605 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR); 10606 } 10607 10608 static void 10609 wm_nvm_version(struct wm_softc *sc) 10610 { 10611 uint16_t major, minor, build, patch; 10612 uint16_t uid0, uid1; 10613 uint16_t nvm_data; 10614 uint16_t off; 10615 bool check_version = false; 10616 bool check_optionrom = false; 10617 bool have_build = false; 10618 10619 /* 10620 * Version format: 10621 * 10622 * XYYZ 10623 * X0YZ 10624 * X0YY 10625 * 10626 * Example: 10627 * 10628 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10) 10629 * 82571 0x50a6 5.10.6? 10630 * 82572 0x506a 5.6.10? 10631 * 82572EI 0x5069 5.6.9? 10632 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4) 10633 * 0x2013 2.1.3? 10634 * 82583 0x10a0 1.10.0? (document says it's default vaule) 10635 */ 10636 wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1); 10637 switch (sc->sc_type) { 10638 case WM_T_82571: 10639 case WM_T_82572: 10640 case WM_T_82574: 10641 case WM_T_82583: 10642 check_version = true; 10643 check_optionrom = true; 10644 have_build = true; 10645 break; 10646 case WM_T_82575: 10647 case WM_T_82576: 10648 case WM_T_82580: 10649 if ((uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID) 10650 check_version = true; 10651 break; 10652 case WM_T_I211: 10653 wm_nvm_version_invm(sc); 10654 goto printver; 10655 case WM_T_I210: 10656 if (!wm_nvm_get_flash_presence_i210(sc)) { 10657 wm_nvm_version_invm(sc); 10658 goto printver; 10659 } 10660 /* FALLTHROUGH */ 10661 case WM_T_I350: 10662 case WM_T_I354: 10663 check_version = true; 10664 check_optionrom = true; 10665 break; 10666 default: 10667 return; 10668 } 10669 if (check_version) { 10670 wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data); 10671 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT; 10672 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) { 10673 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT; 10674 build = nvm_data & NVM_BUILD_MASK; 10675 have_build = true; 10676 } else 10677 minor = nvm_data & 0x00ff; 10678 10679 /* Decimal */ 10680 minor = (minor / 16) * 10 + (minor % 16); 10681 sc->sc_nvm_ver_major = major; 10682 sc->sc_nvm_ver_minor = minor; 10683 10684 printver: 10685 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major, 10686 sc->sc_nvm_ver_minor); 10687 if (have_build) { 10688 sc->sc_nvm_ver_build = build; 10689 aprint_verbose(".%d", build); 10690 } 10691 } 10692 if (check_optionrom) { 10693 wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off); 10694 /* Option ROM Version */ 10695 if ((off != 0x0000) && (off != 0xffff)) { 10696 off += NVM_COMBO_VER_OFF; 10697 wm_nvm_read(sc, off + 1, 1, &uid1); 10698 wm_nvm_read(sc, off, 1, &uid0); 10699 if ((uid0 != 0) && (uid0 != 0xffff) 10700 && (uid1 != 0) && (uid1 != 0xffff)) { 10701 /* 16bits */ 10702 major = uid0 >> 8; 10703 build = (uid0 << 8) | (uid1 >> 8); 10704 patch = uid1 & 0x00ff; 10705 aprint_verbose(", option ROM Version %d.%d.%d", 10706 major, build, patch); 10707 } 10708 } 10709 } 10710 10711 wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0); 10712 aprint_verbose(", Image Unique ID %08x", (uid1 << 16) | uid0); 10713 } 10714 10715 /* 10716 * wm_nvm_read: 10717 * 10718 * Read data from the serial EEPROM. 10719 */ 10720 static int 10721 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data) 10722 { 10723 int rv; 10724 10725 if (sc->sc_flags & WM_F_EEPROM_INVALID) 10726 return 1; 10727 10728 if (wm_nvm_acquire(sc)) 10729 return 1; 10730 10731 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 10732 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 10733 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) 10734 rv = wm_nvm_read_ich8(sc, word, wordcnt, data); 10735 else if (sc->sc_flags & WM_F_EEPROM_INVM) 10736 rv = wm_nvm_read_invm(sc, word, wordcnt, data); 10737 else if (sc->sc_flags & WM_F_EEPROM_EERDEEWR) 10738 rv = wm_nvm_read_eerd(sc, word, wordcnt, data); 10739 else if (sc->sc_flags & WM_F_EEPROM_SPI) 10740 rv = wm_nvm_read_spi(sc, word, wordcnt, data); 10741 else 10742 rv = wm_nvm_read_uwire(sc, word, wordcnt, data); 10743 10744 wm_nvm_release(sc); 10745 return rv; 10746 } 10747 10748 /* 10749 * Hardware semaphores. 10750 * Very complexed... 10751 */ 10752 10753 static int 10754 wm_get_swsm_semaphore(struct wm_softc *sc) 10755 { 10756 int32_t timeout; 10757 uint32_t swsm; 10758 10759 if (sc->sc_flags & WM_F_LOCK_SWSM) { 10760 /* Get the SW semaphore. */ 10761 timeout = sc->sc_nvm_wordsize + 1; 10762 while (timeout) { 10763 swsm = CSR_READ(sc, WMREG_SWSM); 10764 10765 if ((swsm & SWSM_SMBI) == 0) 10766 break; 10767 10768 delay(50); 10769 timeout--; 10770 } 10771 10772 if (timeout == 0) { 10773 aprint_error_dev(sc->sc_dev, 10774 "could not acquire SWSM SMBI\n"); 10775 return 1; 10776 } 10777 } 10778 10779 /* Get the FW semaphore. */ 10780 timeout = sc->sc_nvm_wordsize + 1; 10781 while (timeout) { 10782 swsm = CSR_READ(sc, WMREG_SWSM); 10783 swsm |= SWSM_SWESMBI; 10784 CSR_WRITE(sc, WMREG_SWSM, swsm); 10785 /* If we managed to set the bit we got the semaphore. */ 10786 swsm = CSR_READ(sc, WMREG_SWSM); 10787 if (swsm & SWSM_SWESMBI) 10788 break; 10789 10790 delay(50); 10791 timeout--; 10792 } 10793 10794 if (timeout == 0) { 10795 aprint_error_dev(sc->sc_dev, "could not acquire SWSM SWESMBI\n"); 10796 /* Release semaphores */ 10797 wm_put_swsm_semaphore(sc); 10798 return 1; 10799 } 10800 return 0; 10801 } 10802 10803 static void 10804 wm_put_swsm_semaphore(struct wm_softc *sc) 10805 { 10806 uint32_t swsm; 10807 10808 swsm = CSR_READ(sc, WMREG_SWSM); 10809 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI); 10810 CSR_WRITE(sc, WMREG_SWSM, swsm); 10811 } 10812 10813 static int 10814 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask) 10815 { 10816 uint32_t swfw_sync; 10817 uint32_t swmask = mask << SWFW_SOFT_SHIFT; 10818 uint32_t fwmask = mask << SWFW_FIRM_SHIFT; 10819 int timeout = 200; 10820 10821 for (timeout = 0; timeout < 200; timeout++) { 10822 if (sc->sc_flags & WM_F_LOCK_SWSM) { 10823 if (wm_get_swsm_semaphore(sc)) { 10824 aprint_error_dev(sc->sc_dev, 10825 "%s: failed to get semaphore\n", 10826 __func__); 10827 return 1; 10828 } 10829 } 10830 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC); 10831 if ((swfw_sync & (swmask | fwmask)) == 0) { 10832 swfw_sync |= swmask; 10833 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync); 10834 if (sc->sc_flags & WM_F_LOCK_SWSM) 10835 wm_put_swsm_semaphore(sc); 10836 return 0; 10837 } 10838 if (sc->sc_flags & WM_F_LOCK_SWSM) 10839 wm_put_swsm_semaphore(sc); 10840 delay(5000); 10841 } 10842 printf("%s: failed to get swfw semaphore mask 0x%x swfw 0x%x\n", 10843 device_xname(sc->sc_dev), mask, swfw_sync); 10844 return 1; 10845 } 10846 10847 static void 10848 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask) 10849 { 10850 uint32_t swfw_sync; 10851 10852 if (sc->sc_flags & WM_F_LOCK_SWSM) { 10853 while (wm_get_swsm_semaphore(sc) != 0) 10854 continue; 10855 } 10856 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC); 10857 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT); 10858 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync); 10859 if (sc->sc_flags & WM_F_LOCK_SWSM) 10860 wm_put_swsm_semaphore(sc); 10861 } 10862 10863 static int 10864 wm_get_swfwhw_semaphore(struct wm_softc *sc) 10865 { 10866 uint32_t ext_ctrl; 10867 int timeout = 200; 10868 10869 for (timeout = 0; timeout < 200; timeout++) { 10870 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 10871 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP; 10872 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 10873 10874 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 10875 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) 10876 return 0; 10877 delay(5000); 10878 } 10879 printf("%s: failed to get swfwhw semaphore ext_ctrl 0x%x\n", 10880 device_xname(sc->sc_dev), ext_ctrl); 10881 return 1; 10882 } 10883 10884 static void 10885 wm_put_swfwhw_semaphore(struct wm_softc *sc) 10886 { 10887 uint32_t ext_ctrl; 10888 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR); 10889 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 10890 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl); 10891 } 10892 10893 static int 10894 wm_get_hw_semaphore_82573(struct wm_softc *sc) 10895 { 10896 int i = 0; 10897 uint32_t reg; 10898 10899 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 10900 do { 10901 CSR_WRITE(sc, WMREG_EXTCNFCTR, 10902 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP); 10903 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 10904 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0) 10905 break; 10906 delay(2*1000); 10907 i++; 10908 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT); 10909 10910 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) { 10911 wm_put_hw_semaphore_82573(sc); 10912 log(LOG_ERR, "%s: Driver can't access the PHY\n", 10913 device_xname(sc->sc_dev)); 10914 return -1; 10915 } 10916 10917 return 0; 10918 } 10919 10920 static void 10921 wm_put_hw_semaphore_82573(struct wm_softc *sc) 10922 { 10923 uint32_t reg; 10924 10925 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 10926 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP; 10927 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg); 10928 } 10929 10930 /* 10931 * Management mode and power management related subroutines. 10932 * BMC, AMT, suspend/resume and EEE. 10933 */ 10934 10935 #ifdef WM_WOL 10936 static int 10937 wm_check_mng_mode(struct wm_softc *sc) 10938 { 10939 int rv; 10940 10941 switch (sc->sc_type) { 10942 case WM_T_ICH8: 10943 case WM_T_ICH9: 10944 case WM_T_ICH10: 10945 case WM_T_PCH: 10946 case WM_T_PCH2: 10947 case WM_T_PCH_LPT: 10948 rv = wm_check_mng_mode_ich8lan(sc); 10949 break; 10950 case WM_T_82574: 10951 case WM_T_82583: 10952 rv = wm_check_mng_mode_82574(sc); 10953 break; 10954 case WM_T_82571: 10955 case WM_T_82572: 10956 case WM_T_82573: 10957 case WM_T_80003: 10958 rv = wm_check_mng_mode_generic(sc); 10959 break; 10960 default: 10961 /* noting to do */ 10962 rv = 0; 10963 break; 10964 } 10965 10966 return rv; 10967 } 10968 10969 static int 10970 wm_check_mng_mode_ich8lan(struct wm_softc *sc) 10971 { 10972 uint32_t fwsm; 10973 10974 fwsm = CSR_READ(sc, WMREG_FWSM); 10975 10976 if (((fwsm & FWSM_FW_VALID) != 0) && 10977 (fwsm & FWSM_MODE_MASK) == (MNG_ICH_IAMT_MODE << FWSM_MODE_SHIFT)) 10978 return 1; 10979 10980 return 0; 10981 } 10982 10983 static int 10984 wm_check_mng_mode_82574(struct wm_softc *sc) 10985 { 10986 uint16_t data; 10987 10988 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data); 10989 10990 if ((data & NVM_CFG2_MNGM_MASK) != 0) 10991 return 1; 10992 10993 return 0; 10994 } 10995 10996 static int 10997 wm_check_mng_mode_generic(struct wm_softc *sc) 10998 { 10999 uint32_t fwsm; 11000 11001 fwsm = CSR_READ(sc, WMREG_FWSM); 11002 11003 if ((fwsm & FWSM_MODE_MASK) == (MNG_IAMT_MODE << FWSM_MODE_SHIFT)) 11004 return 1; 11005 11006 return 0; 11007 } 11008 #endif /* WM_WOL */ 11009 11010 static int 11011 wm_enable_mng_pass_thru(struct wm_softc *sc) 11012 { 11013 uint32_t manc, fwsm, factps; 11014 11015 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0) 11016 return 0; 11017 11018 manc = CSR_READ(sc, WMREG_MANC); 11019 11020 DPRINTF(WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n", 11021 device_xname(sc->sc_dev), manc)); 11022 if ((manc & MANC_RECV_TCO_EN) == 0) 11023 return 0; 11024 11025 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) { 11026 fwsm = CSR_READ(sc, WMREG_FWSM); 11027 factps = CSR_READ(sc, WMREG_FACTPS); 11028 if (((factps & FACTPS_MNGCG) == 0) 11029 && ((fwsm & FWSM_MODE_MASK) 11030 == (MNG_ICH_IAMT_MODE << FWSM_MODE_SHIFT))) 11031 return 1; 11032 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){ 11033 uint16_t data; 11034 11035 factps = CSR_READ(sc, WMREG_FACTPS); 11036 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data); 11037 DPRINTF(WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n", 11038 device_xname(sc->sc_dev), factps, data)); 11039 if (((factps & FACTPS_MNGCG) == 0) 11040 && ((data & NVM_CFG2_MNGM_MASK) 11041 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT))) 11042 return 1; 11043 } else if (((manc & MANC_SMBUS_EN) != 0) 11044 && ((manc & MANC_ASF_EN) == 0)) 11045 return 1; 11046 11047 return 0; 11048 } 11049 11050 static int 11051 wm_check_reset_block(struct wm_softc *sc) 11052 { 11053 bool blocked = false; 11054 uint32_t reg; 11055 int i = 0; 11056 11057 switch (sc->sc_type) { 11058 case WM_T_ICH8: 11059 case WM_T_ICH9: 11060 case WM_T_ICH10: 11061 case WM_T_PCH: 11062 case WM_T_PCH2: 11063 case WM_T_PCH_LPT: 11064 do { 11065 reg = CSR_READ(sc, WMREG_FWSM); 11066 if ((reg & FWSM_RSPCIPHY) == 0) { 11067 blocked = true; 11068 delay(10*1000); 11069 continue; 11070 } 11071 blocked = false; 11072 } while (blocked && (i++ < 10)); 11073 return blocked ? 1 : 0; 11074 break; 11075 case WM_T_82571: 11076 case WM_T_82572: 11077 case WM_T_82573: 11078 case WM_T_82574: 11079 case WM_T_82583: 11080 case WM_T_80003: 11081 reg = CSR_READ(sc, WMREG_MANC); 11082 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0) 11083 return -1; 11084 else 11085 return 0; 11086 break; 11087 default: 11088 /* no problem */ 11089 break; 11090 } 11091 11092 return 0; 11093 } 11094 11095 static void 11096 wm_get_hw_control(struct wm_softc *sc) 11097 { 11098 uint32_t reg; 11099 11100 switch (sc->sc_type) { 11101 case WM_T_82573: 11102 reg = CSR_READ(sc, WMREG_SWSM); 11103 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD); 11104 break; 11105 case WM_T_82571: 11106 case WM_T_82572: 11107 case WM_T_82574: 11108 case WM_T_82583: 11109 case WM_T_80003: 11110 case WM_T_ICH8: 11111 case WM_T_ICH9: 11112 case WM_T_ICH10: 11113 case WM_T_PCH: 11114 case WM_T_PCH2: 11115 case WM_T_PCH_LPT: 11116 reg = CSR_READ(sc, WMREG_CTRL_EXT); 11117 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD); 11118 break; 11119 default: 11120 break; 11121 } 11122 } 11123 11124 static void 11125 wm_release_hw_control(struct wm_softc *sc) 11126 { 11127 uint32_t reg; 11128 11129 if ((sc->sc_flags & WM_F_HAS_MANAGE) == 0) 11130 return; 11131 11132 if (sc->sc_type == WM_T_82573) { 11133 reg = CSR_READ(sc, WMREG_SWSM); 11134 reg &= ~SWSM_DRV_LOAD; 11135 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD); 11136 } else { 11137 reg = CSR_READ(sc, WMREG_CTRL_EXT); 11138 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD); 11139 } 11140 } 11141 11142 static void 11143 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, int on) 11144 { 11145 uint32_t reg; 11146 11147 reg = CSR_READ(sc, WMREG_EXTCNFCTR); 11148 11149 if (on != 0) 11150 reg |= EXTCNFCTR_GATE_PHY_CFG; 11151 else 11152 reg &= ~EXTCNFCTR_GATE_PHY_CFG; 11153 11154 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg); 11155 } 11156 11157 static void 11158 wm_smbustopci(struct wm_softc *sc) 11159 { 11160 uint32_t fwsm; 11161 11162 fwsm = CSR_READ(sc, WMREG_FWSM); 11163 if (((fwsm & FWSM_FW_VALID) == 0) 11164 && ((wm_check_reset_block(sc) == 0))) { 11165 sc->sc_ctrl |= CTRL_LANPHYPC_OVERRIDE; 11166 sc->sc_ctrl &= ~CTRL_LANPHYPC_VALUE; 11167 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11168 CSR_WRITE_FLUSH(sc); 11169 delay(10); 11170 sc->sc_ctrl &= ~CTRL_LANPHYPC_OVERRIDE; 11171 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); 11172 CSR_WRITE_FLUSH(sc); 11173 delay(50*1000); 11174 11175 /* 11176 * Gate automatic PHY configuration by hardware on non-managed 11177 * 82579 11178 */ 11179 if (sc->sc_type == WM_T_PCH2) 11180 wm_gate_hw_phy_config_ich8lan(sc, 1); 11181 } 11182 } 11183 11184 static void 11185 wm_init_manageability(struct wm_softc *sc) 11186 { 11187 11188 if (sc->sc_flags & WM_F_HAS_MANAGE) { 11189 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H); 11190 uint32_t manc = CSR_READ(sc, WMREG_MANC); 11191 11192 /* Disable hardware interception of ARP */ 11193 manc &= ~MANC_ARP_EN; 11194 11195 /* Enable receiving management packets to the host */ 11196 if (sc->sc_type >= WM_T_82571) { 11197 manc |= MANC_EN_MNG2HOST; 11198 manc2h |= MANC2H_PORT_623| MANC2H_PORT_624; 11199 CSR_WRITE(sc, WMREG_MANC2H, manc2h); 11200 } 11201 11202 CSR_WRITE(sc, WMREG_MANC, manc); 11203 } 11204 } 11205 11206 static void 11207 wm_release_manageability(struct wm_softc *sc) 11208 { 11209 11210 if (sc->sc_flags & WM_F_HAS_MANAGE) { 11211 uint32_t manc = CSR_READ(sc, WMREG_MANC); 11212 11213 manc |= MANC_ARP_EN; 11214 if (sc->sc_type >= WM_T_82571) 11215 manc &= ~MANC_EN_MNG2HOST; 11216 11217 CSR_WRITE(sc, WMREG_MANC, manc); 11218 } 11219 } 11220 11221 static void 11222 wm_get_wakeup(struct wm_softc *sc) 11223 { 11224 11225 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */ 11226 switch (sc->sc_type) { 11227 case WM_T_82573: 11228 case WM_T_82583: 11229 sc->sc_flags |= WM_F_HAS_AMT; 11230 /* FALLTHROUGH */ 11231 case WM_T_80003: 11232 case WM_T_82541: 11233 case WM_T_82547: 11234 case WM_T_82571: 11235 case WM_T_82572: 11236 case WM_T_82574: 11237 case WM_T_82575: 11238 case WM_T_82576: 11239 case WM_T_82580: 11240 case WM_T_I350: 11241 case WM_T_I354: 11242 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE_MASK) != 0) 11243 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID; 11244 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES; 11245 break; 11246 case WM_T_ICH8: 11247 case WM_T_ICH9: 11248 case WM_T_ICH10: 11249 case WM_T_PCH: 11250 case WM_T_PCH2: 11251 case WM_T_PCH_LPT: 11252 sc->sc_flags |= WM_F_HAS_AMT; 11253 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES; 11254 break; 11255 default: 11256 break; 11257 } 11258 11259 /* 1: HAS_MANAGE */ 11260 if (wm_enable_mng_pass_thru(sc) != 0) 11261 sc->sc_flags |= WM_F_HAS_MANAGE; 11262 11263 #ifdef WM_DEBUG 11264 printf("\n"); 11265 if ((sc->sc_flags & WM_F_HAS_AMT) != 0) 11266 printf("HAS_AMT,"); 11267 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) 11268 printf("ARC_SUBSYS_VALID,"); 11269 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) != 0) 11270 printf("ASF_FIRMWARE_PRES,"); 11271 if ((sc->sc_flags & WM_F_HAS_MANAGE) != 0) 11272 printf("HAS_MANAGE,"); 11273 printf("\n"); 11274 #endif 11275 /* 11276 * Note that the WOL flags is set after the resetting of the eeprom 11277 * stuff 11278 */ 11279 } 11280 11281 #ifdef WM_WOL 11282 /* WOL in the newer chipset interfaces (pchlan) */ 11283 static void 11284 wm_enable_phy_wakeup(struct wm_softc *sc) 11285 { 11286 #if 0 11287 uint16_t preg; 11288 11289 /* Copy MAC RARs to PHY RARs */ 11290 11291 /* Copy MAC MTA to PHY MTA */ 11292 11293 /* Configure PHY Rx Control register */ 11294 11295 /* Enable PHY wakeup in MAC register */ 11296 11297 /* Configure and enable PHY wakeup in PHY registers */ 11298 11299 /* Activate PHY wakeup */ 11300 11301 /* XXX */ 11302 #endif 11303 } 11304 11305 /* Power down workaround on D3 */ 11306 static void 11307 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc) 11308 { 11309 uint32_t reg; 11310 int i; 11311 11312 for (i = 0; i < 2; i++) { 11313 /* Disable link */ 11314 reg = CSR_READ(sc, WMREG_PHY_CTRL); 11315 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; 11316 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 11317 11318 /* 11319 * Call gig speed drop workaround on Gig disable before 11320 * accessing any PHY registers 11321 */ 11322 if (sc->sc_type == WM_T_ICH8) 11323 wm_gig_downshift_workaround_ich8lan(sc); 11324 11325 /* Write VR power-down enable */ 11326 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL); 11327 reg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; 11328 reg |= IGP3_VR_CTRL_MODE_SHUTDOWN; 11329 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, reg); 11330 11331 /* Read it back and test */ 11332 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL); 11333 reg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; 11334 if ((reg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0)) 11335 break; 11336 11337 /* Issue PHY reset and repeat at most one more time */ 11338 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET); 11339 } 11340 } 11341 11342 static void 11343 wm_enable_wakeup(struct wm_softc *sc) 11344 { 11345 uint32_t reg, pmreg; 11346 pcireg_t pmode; 11347 11348 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT, 11349 &pmreg, NULL) == 0) 11350 return; 11351 11352 /* Advertise the wakeup capability */ 11353 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2) 11354 | CTRL_SWDPIN(3)); 11355 CSR_WRITE(sc, WMREG_WUC, WUC_APME); 11356 11357 /* ICH workaround */ 11358 switch (sc->sc_type) { 11359 case WM_T_ICH8: 11360 case WM_T_ICH9: 11361 case WM_T_ICH10: 11362 case WM_T_PCH: 11363 case WM_T_PCH2: 11364 case WM_T_PCH_LPT: 11365 /* Disable gig during WOL */ 11366 reg = CSR_READ(sc, WMREG_PHY_CTRL); 11367 reg |= PHY_CTRL_D0A_LPLU | PHY_CTRL_GBE_DIS; 11368 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 11369 if (sc->sc_type == WM_T_PCH) 11370 wm_gmii_reset(sc); 11371 11372 /* Power down workaround */ 11373 if (sc->sc_phytype == WMPHY_82577) { 11374 struct mii_softc *child; 11375 11376 /* Assume that the PHY is copper */ 11377 child = LIST_FIRST(&sc->sc_mii.mii_phys); 11378 if (child->mii_mpd_rev <= 2) 11379 sc->sc_mii.mii_writereg(sc->sc_dev, 1, 11380 (768 << 5) | 25, 0x0444); /* magic num */ 11381 } 11382 break; 11383 default: 11384 break; 11385 } 11386 11387 /* Keep the laser running on fiber adapters */ 11388 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER) 11389 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) { 11390 reg = CSR_READ(sc, WMREG_CTRL_EXT); 11391 reg |= CTRL_EXT_SWDPIN(3); 11392 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 11393 } 11394 11395 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG; 11396 #if 0 /* for the multicast packet */ 11397 reg |= WUFC_MC; 11398 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE); 11399 #endif 11400 11401 if (sc->sc_type == WM_T_PCH) { 11402 wm_enable_phy_wakeup(sc); 11403 } else { 11404 CSR_WRITE(sc, WMREG_WUC, WUC_PME_EN); 11405 CSR_WRITE(sc, WMREG_WUFC, reg); 11406 } 11407 11408 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9) 11409 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH) 11410 || (sc->sc_type == WM_T_PCH2)) 11411 && (sc->sc_phytype == WMPHY_IGP_3)) 11412 wm_igp3_phy_powerdown_workaround_ich8lan(sc); 11413 11414 /* Request PME */ 11415 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR); 11416 #if 0 11417 /* Disable WOL */ 11418 pmode &= ~(PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN); 11419 #else 11420 /* For WOL */ 11421 pmode |= PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN; 11422 #endif 11423 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode); 11424 } 11425 #endif /* WM_WOL */ 11426 11427 /* LPLU */ 11428 11429 static void 11430 wm_lplu_d0_disable(struct wm_softc *sc) 11431 { 11432 uint32_t reg; 11433 11434 reg = CSR_READ(sc, WMREG_PHY_CTRL); 11435 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU); 11436 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 11437 } 11438 11439 static void 11440 wm_lplu_d0_disable_pch(struct wm_softc *sc) 11441 { 11442 uint32_t reg; 11443 11444 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS); 11445 reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU); 11446 reg |= HV_OEM_BITS_ANEGNOW; 11447 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, reg); 11448 } 11449 11450 /* EEE */ 11451 11452 static void 11453 wm_set_eee_i350(struct wm_softc *sc) 11454 { 11455 uint32_t ipcnfg, eeer; 11456 11457 ipcnfg = CSR_READ(sc, WMREG_IPCNFG); 11458 eeer = CSR_READ(sc, WMREG_EEER); 11459 11460 if ((sc->sc_flags & WM_F_EEE) != 0) { 11461 ipcnfg |= (IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN); 11462 eeer |= (EEER_TX_LPI_EN | EEER_RX_LPI_EN 11463 | EEER_LPI_FC); 11464 } else { 11465 ipcnfg &= ~(IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN); 11466 ipcnfg &= ~IPCNFG_10BASE_TE; 11467 eeer &= ~(EEER_TX_LPI_EN | EEER_RX_LPI_EN 11468 | EEER_LPI_FC); 11469 } 11470 11471 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg); 11472 CSR_WRITE(sc, WMREG_EEER, eeer); 11473 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */ 11474 CSR_READ(sc, WMREG_EEER); /* XXX flush? */ 11475 } 11476 11477 /* 11478 * Workarounds (mainly PHY related). 11479 * Basically, PHY's workarounds are in the PHY drivers. 11480 */ 11481 11482 /* Work-around for 82566 Kumeran PCS lock loss */ 11483 static void 11484 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc) 11485 { 11486 #if 0 11487 int miistatus, active, i; 11488 int reg; 11489 11490 miistatus = sc->sc_mii.mii_media_status; 11491 11492 /* If the link is not up, do nothing */ 11493 if ((miistatus & IFM_ACTIVE) == 0) 11494 return; 11495 11496 active = sc->sc_mii.mii_media_active; 11497 11498 /* Nothing to do if the link is other than 1Gbps */ 11499 if (IFM_SUBTYPE(active) != IFM_1000_T) 11500 return; 11501 11502 for (i = 0; i < 10; i++) { 11503 /* read twice */ 11504 reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG); 11505 reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG); 11506 if ((reg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0) 11507 goto out; /* GOOD! */ 11508 11509 /* Reset the PHY */ 11510 wm_gmii_reset(sc); 11511 delay(5*1000); 11512 } 11513 11514 /* Disable GigE link negotiation */ 11515 reg = CSR_READ(sc, WMREG_PHY_CTRL); 11516 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; 11517 CSR_WRITE(sc, WMREG_PHY_CTRL, reg); 11518 11519 /* 11520 * Call gig speed drop workaround on Gig disable before accessing 11521 * any PHY registers. 11522 */ 11523 wm_gig_downshift_workaround_ich8lan(sc); 11524 11525 out: 11526 return; 11527 #endif 11528 } 11529 11530 /* WOL from S5 stops working */ 11531 static void 11532 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc) 11533 { 11534 uint16_t kmrn_reg; 11535 11536 /* Only for igp3 */ 11537 if (sc->sc_phytype == WMPHY_IGP_3) { 11538 kmrn_reg = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG); 11539 kmrn_reg |= KUMCTRLSTA_DIAG_NELPBK; 11540 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg); 11541 kmrn_reg &= ~KUMCTRLSTA_DIAG_NELPBK; 11542 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg); 11543 } 11544 } 11545 11546 /* 11547 * Workaround for pch's PHYs 11548 * XXX should be moved to new PHY driver? 11549 */ 11550 static void 11551 wm_hv_phy_workaround_ich8lan(struct wm_softc *sc) 11552 { 11553 if (sc->sc_phytype == WMPHY_82577) 11554 wm_set_mdio_slow_mode_hv(sc); 11555 11556 /* (PCH rev.2) && (82577 && (phy rev 2 or 3)) */ 11557 11558 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/ 11559 11560 /* 82578 */ 11561 if (sc->sc_phytype == WMPHY_82578) { 11562 /* PCH rev. < 3 */ 11563 if (sc->sc_rev < 3) { 11564 /* XXX 6 bit shift? Why? Is it page2? */ 11565 wm_gmii_hv_writereg(sc->sc_dev, 1, ((1 << 6) | 0x29), 11566 0x66c0); 11567 wm_gmii_hv_writereg(sc->sc_dev, 1, ((1 << 6) | 0x1e), 11568 0xffff); 11569 } 11570 11571 /* XXX phy rev. < 2 */ 11572 } 11573 11574 /* Select page 0 */ 11575 11576 /* XXX acquire semaphore */ 11577 wm_gmii_i82544_writereg(sc->sc_dev, 1, MII_IGPHY_PAGE_SELECT, 0); 11578 /* XXX release semaphore */ 11579 11580 /* 11581 * Configure the K1 Si workaround during phy reset assuming there is 11582 * link so that it disables K1 if link is in 1Gbps. 11583 */ 11584 wm_k1_gig_workaround_hv(sc, 1); 11585 } 11586 11587 static void 11588 wm_lv_phy_workaround_ich8lan(struct wm_softc *sc) 11589 { 11590 11591 wm_set_mdio_slow_mode_hv(sc); 11592 } 11593 11594 static void 11595 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link) 11596 { 11597 int k1_enable = sc->sc_nvm_k1_enabled; 11598 11599 /* XXX acquire semaphore */ 11600 11601 if (link) { 11602 k1_enable = 0; 11603 11604 /* Link stall fix for link up */ 11605 wm_gmii_hv_writereg(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x0100); 11606 } else { 11607 /* Link stall fix for link down */ 11608 wm_gmii_hv_writereg(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x4100); 11609 } 11610 11611 wm_configure_k1_ich8lan(sc, k1_enable); 11612 11613 /* XXX release semaphore */ 11614 } 11615 11616 static void 11617 wm_set_mdio_slow_mode_hv(struct wm_softc *sc) 11618 { 11619 uint32_t reg; 11620 11621 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL); 11622 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL, 11623 reg | HV_KMRN_MDIO_SLOW); 11624 } 11625 11626 static void 11627 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable) 11628 { 11629 uint32_t ctrl, ctrl_ext, tmp; 11630 uint16_t kmrn_reg; 11631 11632 kmrn_reg = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_K1_CONFIG); 11633 11634 if (k1_enable) 11635 kmrn_reg |= KUMCTRLSTA_K1_ENABLE; 11636 else 11637 kmrn_reg &= ~KUMCTRLSTA_K1_ENABLE; 11638 11639 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmrn_reg); 11640 11641 delay(20); 11642 11643 ctrl = CSR_READ(sc, WMREG_CTRL); 11644 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT); 11645 11646 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100); 11647 tmp |= CTRL_FRCSPD; 11648 11649 CSR_WRITE(sc, WMREG_CTRL, tmp); 11650 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS); 11651 CSR_WRITE_FLUSH(sc); 11652 delay(20); 11653 11654 CSR_WRITE(sc, WMREG_CTRL, ctrl); 11655 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext); 11656 CSR_WRITE_FLUSH(sc); 11657 delay(20); 11658 } 11659 11660 /* special case - for 82575 - need to do manual init ... */ 11661 static void 11662 wm_reset_init_script_82575(struct wm_softc *sc) 11663 { 11664 /* 11665 * remark: this is untested code - we have no board without EEPROM 11666 * same setup as mentioned int the FreeBSD driver for the i82575 11667 */ 11668 11669 /* SerDes configuration via SERDESCTRL */ 11670 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c); 11671 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78); 11672 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23); 11673 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15); 11674 11675 /* CCM configuration via CCMCTL register */ 11676 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00); 11677 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00); 11678 11679 /* PCIe lanes configuration */ 11680 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec); 11681 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf); 11682 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05); 11683 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81); 11684 11685 /* PCIe PLL Configuration */ 11686 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47); 11687 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00); 11688 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00); 11689 } 11690 11691 static void 11692 wm_reset_mdicnfg_82580(struct wm_softc *sc) 11693 { 11694 uint32_t reg; 11695 uint16_t nvmword; 11696 int rv; 11697 11698 if ((sc->sc_flags & WM_F_SGMII) == 0) 11699 return; 11700 11701 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) 11702 + NVM_OFF_CFG3_PORTA, 1, &nvmword); 11703 if (rv != 0) { 11704 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n", 11705 __func__); 11706 return; 11707 } 11708 11709 reg = CSR_READ(sc, WMREG_MDICNFG); 11710 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO) 11711 reg |= MDICNFG_DEST; 11712 if (nvmword & NVM_CFG3_PORTA_COM_MDIO) 11713 reg |= MDICNFG_COM_MDIO; 11714 CSR_WRITE(sc, WMREG_MDICNFG, reg); 11715 } 11716 11717 /* 11718 * I210 Errata 25 and I211 Errata 10 11719 * Slow System Clock. 11720 */ 11721 static void 11722 wm_pll_workaround_i210(struct wm_softc *sc) 11723 { 11724 uint32_t mdicnfg, wuc; 11725 uint32_t reg; 11726 pcireg_t pcireg; 11727 uint32_t pmreg; 11728 uint16_t nvmword, tmp_nvmword; 11729 int phyval; 11730 bool wa_done = false; 11731 int i; 11732 11733 /* Save WUC and MDICNFG registers */ 11734 wuc = CSR_READ(sc, WMREG_WUC); 11735 mdicnfg = CSR_READ(sc, WMREG_MDICNFG); 11736 11737 reg = mdicnfg & ~MDICNFG_DEST; 11738 CSR_WRITE(sc, WMREG_MDICNFG, reg); 11739 11740 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0) 11741 nvmword = INVM_DEFAULT_AL; 11742 tmp_nvmword = nvmword | INVM_PLL_WO_VAL; 11743 11744 /* Get Power Management cap offset */ 11745 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT, 11746 &pmreg, NULL) == 0) 11747 return; 11748 for (i = 0; i < WM_MAX_PLL_TRIES; i++) { 11749 phyval = wm_gmii_gs40g_readreg(sc->sc_dev, 1, 11750 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG); 11751 11752 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) { 11753 break; /* OK */ 11754 } 11755 11756 wa_done = true; 11757 /* Directly reset the internal PHY */ 11758 reg = CSR_READ(sc, WMREG_CTRL); 11759 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET); 11760 11761 reg = CSR_READ(sc, WMREG_CTRL_EXT); 11762 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE; 11763 CSR_WRITE(sc, WMREG_CTRL_EXT, reg); 11764 11765 CSR_WRITE(sc, WMREG_WUC, 0); 11766 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16); 11767 CSR_WRITE(sc, WMREG_EEARBC_I210, reg); 11768 11769 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 11770 pmreg + PCI_PMCSR); 11771 pcireg |= PCI_PMCSR_STATE_D3; 11772 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 11773 pmreg + PCI_PMCSR, pcireg); 11774 delay(1000); 11775 pcireg &= ~PCI_PMCSR_STATE_D3; 11776 pci_conf_write(sc->sc_pc, sc->sc_pcitag, 11777 pmreg + PCI_PMCSR, pcireg); 11778 11779 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16); 11780 CSR_WRITE(sc, WMREG_EEARBC_I210, reg); 11781 11782 /* Restore WUC register */ 11783 CSR_WRITE(sc, WMREG_WUC, wuc); 11784 } 11785 11786 /* Restore MDICNFG setting */ 11787 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg); 11788 if (wa_done) 11789 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n"); 11790 } 11791