Module Name: src Committed By: msaitoh Date: Tue Jul 22 04:20:39 UTC 2014
Modified Files: src/sys/dev/pci: if_wm.c Log Message: Add SERDES support from Matthias Drochner. Not all devices were tested but all SERDES entries are enabled. To generate a diff of this commit: cvs rdiff -u -r1.278 -r1.279 src/sys/dev/pci/if_wm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.278 src/sys/dev/pci/if_wm.c:1.279 --- src/sys/dev/pci/if_wm.c:1.278 Mon Jul 14 05:00:18 2014 +++ src/sys/dev/pci/if_wm.c Tue Jul 22 04:20:39 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.278 2014/07/14 05:00:18 msaitoh Exp $ */ +/* $NetBSD: if_wm.c,v 1.279 2014/07/22 04:20:39 msaitoh Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.278 2014/07/14 05:00:18 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.279 2014/07/22 04:20:39 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -712,11 +712,11 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER, "Intel i82545GM 1000BASE-X Ethernet", WM_T_82545_3, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES, "Intel i82545GM Gigabit Ethernet (SERDES)", WM_T_82545_3, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER, "Intel i82546EB 1000BASE-T Ethernet", WM_T_82546, WMP_F_1000T }, @@ -740,11 +740,11 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER, "Intel i82546GB 1000BASE-X Ethernet", WM_T_82546_3, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES, "Intel i82546GB Gigabit Ethernet (SERDES)", WM_T_82546_3, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER, "i82546GB quad-port Gigabit Ethernet", WM_T_82546_3, WMP_F_1000T }, @@ -804,11 +804,11 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER, "Intel PRO/1000 PF (82571EB)", WM_T_82571, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES, "Intel PRO/1000 PB (82571EB)", WM_T_82571, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER, "Intel PRO/1000 QT (82571EB)", WM_T_82571, WMP_F_1000T }, @@ -824,11 +824,10 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER, "Intel i82572EI 1000baseX Ethernet", WM_T_82572, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES, "Intel i82572EI Gigabit Ethernet (SERDES)", WM_T_82572, WMP_F_SERDES }, -#endif { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI, "Intel i82572EI 1000baseT Ethernet", @@ -861,20 +860,19 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT, "i80003 dual 1000baseX Ethernet", WM_T_80003, WMP_F_1000T }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT, "Intel i80003ES2 dual Gigabit Ethernet (SERDES)", WM_T_80003, WMP_F_SERDES }, -#endif { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT, "Intel i80003 1000baseT Ethernet", WM_T_80003, WMP_F_1000T }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT, "Intel i80003 Gigabit Ethernet (SERDES)", WM_T_80003, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT, "Intel i82801H (M_AMT) LAN Controller", WM_T_ICH8, WMP_F_1000T }, @@ -989,36 +987,36 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER, "82576 1000BaseX Ethernet", WM_T_82576, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES, "82576 gigabit Ethernet (SERDES)", WM_T_82576, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER, "82576 quad-1000BaseT Ethernet", WM_T_82576, WMP_F_1000T }, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS, "82576 gigabit Ethernet", WM_T_82576, WMP_F_1000T }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES, "82576 gigabit Ethernet (SERDES)", WM_T_82576, WMP_F_SERDES }, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD, "82576 quad-gigabit Ethernet (SERDES)", WM_T_82576, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER, "82580 1000BaseT Ethernet", WM_T_82580, WMP_F_1000T }, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER, "82580 1000BaseX Ethernet", WM_T_82580, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES, "82580 1000BaseT Ethernet (SERDES)", WM_T_82580, WMP_F_SERDES }, -#endif + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII, "82580 gigabit Ethernet (SGMII)", WM_T_82580, WMP_F_1000T }, @@ -1040,10 +1038,11 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER, "I350 Gigabit Fiber Network Connection", WM_T_I350, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES, "I350 Gigabit Backplane Connection", WM_T_I350, WMP_F_SERDES }, +#if 0 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII, "I350 Gigabit Connection", WM_T_I350, WMP_F_1000T }, @@ -1063,10 +1062,11 @@ static const struct wm_product { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER, "I210 Gigabit Ethernet (Fiber)", WM_T_I210, WMP_F_1000X }, -#if 0 + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES, "I210 Gigabit Ethernet (SERDES)", WM_T_I210, WMP_F_SERDES }, +#if 0 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII, "I210 Gigabit Ethernet (SGMII)", WM_T_I210, WMP_F_SERDES }, @@ -6141,6 +6141,8 @@ wm_tbi_mediainit(struct wm_softc *sc) */ sc->sc_ctrl |= CTRL_SWDPIO(0); sc->sc_ctrl &= ~CTRL_SWDPIO(1); + if (sc->sc_wmp->wmp_flags & WMP_F_SERDES) + sc->sc_ctrl &= ~CTRL_LRST; CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); @@ -6208,6 +6210,9 @@ wm_tbi_mediachange(struct ifnet *ifp) uint32_t status; int i; + if (sc->sc_wmp->wmp_flags & WMP_F_SERDES) + return 0; + sc->sc_txcw = 0; if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO || (sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0) @@ -6351,6 +6356,11 @@ wm_tbi_check_link(struct wm_softc *sc) KASSERT(WM_LOCKED(sc)); + if (sc->sc_wmp->wmp_flags & WMP_F_SERDES) { + sc->sc_tbi_linkup = 1; + return; + } + status = CSR_READ(sc, WMREG_STATUS); /* XXX is this needed? */ @@ -8492,6 +8502,11 @@ wm_check_for_link(struct wm_softc *sc) uint32_t status; uint32_t sig; + if (sc->sc_wmp->wmp_flags & WMP_F_SERDES) { + sc->sc_tbi_linkup = 1; + return 0; + } + rxcw = CSR_READ(sc, WMREG_RXCW); ctrl = CSR_READ(sc, WMREG_CTRL); status = CSR_READ(sc, WMREG_STATUS);