Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-8]: src/sys/dev/pci Pull up following revision(s) (requested by m...
details: https://anonhg.NetBSD.org/src/rev/a4039e5a9503
branches: netbsd-8
changeset: 435191:a4039e5a9503
user: martin <martin%NetBSD.org@localhost>
date: Sat Aug 11 14:47:31 2018 +0000
description:
Pull up following revision(s) (requested by msaitoh in ticket #969):
sys/dev/pci/if_wm.c: revision 1.584
sys/dev/pci/if_wmvar.h: revision 1.39
Add MDIC_WA and CLSEMWA to snprintb() string for WM_F_* flags.
Fix two bugs for non-SERDES fiber. Tested on 82544EI(0x1009), 82545GM(0x1027),
82546GB(0x107a), 82571GB(0x105f), 82572EI(0x107e). Tested on SERDES
82580(0x150e (Winyao SERDES SFP)) and 82580(0x150e) as regression test:
- Fix a bug that the link can't detect in link interrupt function for
non-SERDES fiber. When the signal is detected & STATUS_LU == 0 & RXCW == 0,
it's required to set CTRL_SLU and CTRL_FD bit. wm_check_for_link() is the
function to do it. If a link status change interrupt occurred, call
wm_check_for_link() before checking current link status.
- Fix a bug that 82542 misunderstand fiber's signal detection. CTRL_SWDPIN(1)
is used for fiber's signal and it's value is reversed only on 82543 and
82544. Simplify the code and move it into a new function wm_tbi_havesignal()
and use it.
diffstat:
sys/dev/pci/if_wm.c | 78 ++++++++++++++++++++++++++++++++-----------------
sys/dev/pci/if_wmvar.h | 4 +-
2 files changed, 52 insertions(+), 30 deletions(-)
diffs (180 lines):
diff -r 1989eb27f6e8 -r a4039e5a9503 sys/dev/pci/if_wm.c
--- a/sys/dev/pci/if_wm.c Thu Aug 09 13:25:35 2018 +0000
+++ b/sys/dev/pci/if_wm.c Sat Aug 11 14:47:31 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wm.c,v 1.508.4.21 2018/07/26 20:40:39 snj Exp $ */
+/* $NetBSD: if_wm.c,v 1.508.4.22 2018/08/11 14:47:31 martin Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@@ -83,7 +83,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.21 2018/07/26 20:40:39 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.22 2018/08/11 14:47:31 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_net_mpsafe.h"
@@ -842,6 +842,7 @@
static int wm_sgmii_readreg(device_t, int, int);
static void wm_sgmii_writereg(device_t, int, int, int);
/* TBI related */
+static bool wm_tbi_havesignal(struct wm_softc *, uint32_t);
static void wm_tbi_mediainit(struct wm_softc *);
static int wm_tbi_mediachange(struct ifnet *);
static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
@@ -8755,6 +8756,7 @@
status = CSR_READ(sc, WMREG_STATUS);
if (icr & ICR_LSC) {
+ wm_check_for_link(sc);
if (status & STATUS_LU) {
DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
device_xname(sc->sc_dev),
@@ -10962,6 +10964,23 @@
/* TBI related */
+static bool
+wm_tbi_havesignal(struct wm_softc *sc, uint32_t ctrl)
+{
+ bool sig;
+
+ sig = ctrl & CTRL_SWDPIN(1);
+
+ /*
+ * On 82543 and 82544, the CTRL_SWDPIN(1) bit will be 0 if the optics
+ * detect a signal, 1 if they don't.
+ */
+ if ((sc->sc_type == WM_T_82543) || (sc->sc_type == WM_T_82544))
+ sig = !sig;
+
+ return sig;
+}
+
/*
* wm_tbi_mediainit:
*
@@ -11053,9 +11072,11 @@
{
struct wm_softc *sc = ifp->if_softc;
struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
- uint32_t status;
+ uint32_t status, ctrl;
+ bool signal;
int i;
+ KASSERT(sc->sc_mediatype != WM_MEDIATYPE_COPPER);
if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
/* XXX need some work for >= 82571 and < 82575 */
if (sc->sc_type < WM_T_82575)
@@ -11085,14 +11106,13 @@
CSR_WRITE_FLUSH(sc);
delay(1000);
- i = CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1);
- DPRINTF(WM_DEBUG_LINK,("%s: i = 0x%x\n", device_xname(sc->sc_dev),i));
-
- /*
- * On 82544 chips and later, the CTRL_SWDPIN(1) bit will be set if the
- * optics detect a signal, 0 if they don't.
- */
- if (((i != 0) && (sc->sc_type > WM_T_82544)) || (i == 0)) {
+ ctrl = CSR_READ(sc, WMREG_CTRL);
+ signal = wm_tbi_havesignal(sc, ctrl);
+
+ DPRINTF(WM_DEBUG_LINK, ("%s: signal = %d\n", device_xname(sc->sc_dev),
+ signal));
+
+ if (signal) {
/* Have signal; wait for the link to come up. */
for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
delay(10000);
@@ -11198,7 +11218,10 @@
uint32_t rxcw;
uint32_t ctrl;
uint32_t status;
- uint32_t sig;
+ bool signal;
+
+ DPRINTF(WM_DEBUG_LINK, ("%s: %s called\n",
+ device_xname(sc->sc_dev), __func__));
if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
/* XXX need some work for >= 82571 */
@@ -11211,13 +11234,11 @@
rxcw = CSR_READ(sc, WMREG_RXCW);
ctrl = CSR_READ(sc, WMREG_CTRL);
status = CSR_READ(sc, WMREG_STATUS);
-
- sig = (sc->sc_type > WM_T_82544) ? CTRL_SWDPIN(1) : 0;
-
+ signal = wm_tbi_havesignal(sc, ctrl);
+
DPRINTF(WM_DEBUG_LINK,
- ("%s: %s: sig = %d, status_lu = %d, rxcw_c = %d\n",
- device_xname(sc->sc_dev), __func__,
- ((ctrl & CTRL_SWDPIN(1)) == sig),
+ ("%s: %s: signal = %d, status_lu = %d, rxcw_c = %d\n",
+ device_xname(sc->sc_dev), __func__, signal,
((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0)));
/*
@@ -11232,11 +11253,10 @@
* 1 1 1 If IFM_AUTO, back to autonego
*
*/
- if (((ctrl & CTRL_SWDPIN(1)) == sig)
- && ((status & STATUS_LU) == 0)
- && ((rxcw & RXCW_C) == 0)) {
- DPRINTF(WM_DEBUG_LINK, ("%s: force linkup and fullduplex\n",
- __func__));
+ if (signal && ((status & STATUS_LU) == 0) && ((rxcw & RXCW_C) == 0)) {
+ DPRINTF(WM_DEBUG_LINK,
+ ("%s: %s: force linkup and fullduplex\n",
+ device_xname(sc->sc_dev), __func__));
sc->sc_tbi_linkup = 0;
/* Disable auto-negotiation in the TXCW register */
CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
@@ -11253,15 +11273,17 @@
&& ((rxcw & RXCW_C) != 0)
&& (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
sc->sc_tbi_linkup = 1;
- DPRINTF(WM_DEBUG_LINK, ("%s: go back to autonego\n",
+ DPRINTF(WM_DEBUG_LINK, ("%s: %s: go back to autonego\n",
+ device_xname(sc->sc_dev),
__func__));
CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
- } else if (((ctrl & CTRL_SWDPIN(1)) == sig)
- && ((rxcw & RXCW_C) != 0)) {
- DPRINTF(WM_DEBUG_LINK, ("/C/"));
+ } else if (signal && ((rxcw & RXCW_C) != 0)) {
+ DPRINTF(WM_DEBUG_LINK, ("%s: %s: /C/",
+ device_xname(sc->sc_dev), __func__));
} else {
- DPRINTF(WM_DEBUG_LINK, ("%s: %x,%x,%x\n", __func__, rxcw, ctrl,
+ DPRINTF(WM_DEBUG_LINK, ("%s: %s: linkup %08x,%08x,%08x\n",
+ device_xname(sc->sc_dev), __func__, rxcw, ctrl,
status));
}
diff -r 1989eb27f6e8 -r a4039e5a9503 sys/dev/pci/if_wmvar.h
--- a/sys/dev/pci/if_wmvar.h Thu Aug 09 13:25:35 2018 +0000
+++ b/sys/dev/pci/if_wmvar.h Sat Aug 11 14:47:31 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wmvar.h,v 1.33.6.2 2018/04/16 14:25:49 martin Exp $ */
+/* $NetBSD: if_wmvar.h,v 1.33.6.3 2018/08/11 14:47:32 martin Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@@ -105,7 +105,7 @@
"\15" "PCIX" "\16" "CSA" "\17" "PCIE" "\20" "SGMII" \
"\21" "NEWQUEUE" "\22" "ASF_FIRM" "\23" "ARC_SUBSYS" "\24" "AMT" \
"\25" "MANAGE" "\26" "WOL" "\27" "EEE" "\30" "ATTACHED" \
- "\31" "_B24" "\32" "PCS_DIS_AUTONEGO" "\33" "PLLWA"
+ "\31" "MDIC_WA" "\32" "PCS_DIS_AUTONEGO" "\33" "PLLWA" "\40" "CLSEMWA"
/*
* Variations of Intel gigabit Ethernet controller:
Home |
Main Index |
Thread Index |
Old Index