Add a new tunable "hw.bge.fake_autoneg", get rid of BGE_FAKE_AUTONEG kernel
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 23 Mar 2006 13:45:12 +0000 (13:45 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 23 Mar 2006 13:45:12 +0000 (13:45 +0000)
option.  This lets GENERIC kernel work with some broken "bge(4) + switch
modules" configurations.

By default this tunable is set to 0, if autonegociation breakage happens
for certain switch modules shipped with IBM/Intel blades, set this tunable
to 1.

Thank Devon H. O'Dell <devon.odell at gmail.com> for confirming this is
useful.

Initial-idea-from: hmp
Reminded-by: Devon H. O'Dell <devon.odell at gmail.com>
sys/conf/options
sys/config/LINT
sys/dev/netif/bge/Makefile
sys/dev/netif/bge/if_bge.c
sys/i386/conf/LINT

index 5c512ce..dee4a9e 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/options,v 1.191.2.53 2003/06/04 17:56:58 sam Exp $
-# $DragonFly: src/sys/conf/options,v 1.43 2006/03/12 13:57:45 swildner Exp $
+# $DragonFly: src/sys/conf/options,v 1.44 2006/03/23 13:45:12 sephe Exp $
 #
 #        On the handling of kernel options
 #
@@ -536,9 +536,6 @@ KTR_MSGPORT                 opt_ktr.h
 KTR_ENTRIES                    opt_global.h
 KTR_VERBOSE                    opt_ktr.h
 
-# bge driver
-BGE_FAKE_AUTONEG       opt_bge.h
-
 # ed driver
 ED_NO_MIIBUS           opt_ed.h
 
index 472a683..43c4a2e 100644 (file)
@@ -3,7 +3,7 @@
 #      as much of the source tree as it can.
 #
 # $FreeBSD: src/sys/i386/conf/LINT,v 1.749.2.144 2003/06/04 17:56:59 sam Exp $
-# $DragonFly: src/sys/config/LINT,v 1.69 2006/02/19 09:16:26 swildner Exp $
+# $DragonFly: src/sys/config/LINT,v 1.70 2006/03/23 13:45:12 sephe Exp $
 #
 # NB: You probably don't want to try running a kernel built from this
 # file.  Instead, you should start from GENERIC, and add options from
@@ -1695,9 +1695,6 @@ options   AHD_REG_PRETTY_PRINT
 # 3Com 3c996-T, the Netgear GA302T, the SysKonnect SK-9D21 and SK-9D41,
 # and the embedded gigE NICs on Dell PowerEdge 2550 servers.
 #
-# options BGE_FAKE_AUTONEG is needed for some IBM blade servers with the
-# DNL switch module. Auto negotiation is broken those configurations.
-#
 # The `ncr' device provides support for the NCR 53C810 and 53C825
 # self-contained SCSI host adapters.
 #
index 62c2a8f..ec33d3e 100644 (file)
@@ -1,9 +1,9 @@
 # $FreeBSD: src/sys/modules/bge/Makefile,v 1.1.2.2 2001/12/04 20:01:53 brooks Exp $
-# $DragonFly: src/sys/dev/netif/bge/Makefile,v 1.4 2005/08/22 18:29:52 joerg Exp $
+# $DragonFly: src/sys/dev/netif/bge/Makefile,v 1.5 2006/03/23 13:45:12 sephe Exp $
 
 KMOD=  if_bge
 SRCS=  if_bge.c
-SRCS+= opt_bge.h opt_bdg.h
+SRCS+= opt_bdg.h
 SRCS+= miibus_if.h device_if.h bus_if.h pci_if.h
 KMODDEPS = miibus
 
index 76d6661..6dacce5 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.29 2003/12/01 21:06:59 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.52 2005/12/31 14:07:59 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.53 2006/03/23 13:45:12 sephe Exp $
  *
  */
 
@@ -72,8 +72,6 @@
  * ring.
  */
 
-#include "opt_bge.h"
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/sockio.h>
@@ -259,6 +257,13 @@ static void        bge_miibus_statchg(device_t);
 
 static void    bge_reset(struct bge_softc *);
 
+/*
+ * Set following tunable to 1 for some IBM blade servers with the DNLK
+ * switch module. Auto negotiation is broken for those configurations.
+ */
+static int     bge_fake_autoneg = 0;
+TUNABLE_INT("hw.bge.fake_autoneg", &bge_fake_autoneg);
+
 static device_method_t bge_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         bge_probe),
@@ -2566,13 +2571,13 @@ bge_ifmedia_upd(struct ifnet *ifp)
                        return(EINVAL);
                switch(IFM_SUBTYPE(ifm->ifm_media)) {
                case IFM_AUTO:
-#ifndef BGE_FAKE_AUTONEG
                        /*
                         * The BCM5704 ASIC appears to have a special
                         * mechanism for programming the autoneg
                         * advertisement registers in TBI mode.
                         */
-                       if (sc->bge_asicrev == BGE_ASICREV_BCM5704) {
+                       if (!bge_fake_autoneg &&
+                           sc->bge_asicrev == BGE_ASICREV_BCM5704) {
                                uint32_t sgdig;
 
                                CSR_WRITE_4(sc, BGE_TX_TBI_AUTONEG, 0);
@@ -2585,7 +2590,6 @@ bge_ifmedia_upd(struct ifnet *ifp)
                                DELAY(5);
                                CSR_WRITE_4(sc, BGE_SGDIG_CFG, sgdig);
                        }
-#endif /* !BEG_FAKE_AUTONEG */
                        break;
                case IFM_1000_SX:
                        if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {
index 64cb685..06e7e50 100644 (file)
@@ -3,7 +3,7 @@
 #      as much of the source tree as it can.
 #
 # $FreeBSD: src/sys/i386/conf/LINT,v 1.749.2.144 2003/06/04 17:56:59 sam Exp $
-# $DragonFly: src/sys/i386/conf/Attic/LINT,v 1.69 2006/02/19 09:16:26 swildner Exp $
+# $DragonFly: src/sys/i386/conf/Attic/LINT,v 1.70 2006/03/23 13:45:12 sephe Exp $
 #
 # NB: You probably don't want to try running a kernel built from this
 # file.  Instead, you should start from GENERIC, and add options from
@@ -1695,9 +1695,6 @@ options   AHD_REG_PRETTY_PRINT
 # 3Com 3c996-T, the Netgear GA302T, the SysKonnect SK-9D21 and SK-9D41,
 # and the embedded gigE NICs on Dell PowerEdge 2550 servers.
 #
-# options BGE_FAKE_AUTONEG is needed for some IBM blade servers with the
-# DNL switch module. Auto negotiation is broken those configurations.
-#
 # The `ncr' device provides support for the NCR 53C810 and 53C825
 # self-contained SCSI host adapters.
 #