>Number:         177184
>Category:       kern
>Synopsis:       patch for bge network driver to enable wake on lan
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 21 10:30:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Hielke Christian Braun
>Release:        9.1-RELEASE-p1
>Organization:
>Environment:
FreeBSD xxx 9.1-RELEASE-p1 FreeBSD 9.1-RELEASE-p1 #48: Fri Mar 15 01:09:33 CET 
2013     root@freebsd:/usr/obj/nas4free/usr/src/sys/NAS4FREE-amd64  amd64
>Description:
Hello,

a patch to enable wake-on-lan (with magic packet) in the bge network driver. 
Maybe you can add it. Developed this for a HP ProLiant MicroServer N40L machine 
with a

bge0: <HP NC107i PCIe Gigabit Server Adapter, ASIC rev. 0x5784100> mem 
0xfe9f0000-0xfe9fffff irq 18 at device 0.0 on pci2


Kind regards,
Christian. 
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- if_bge.c.orig       2013-03-13 23:42:26.000000000 +0100
+++ if_bge.c    2013-03-14 13:30:08.000000000 +0100
@@ -469,6 +469,7 @@
 static void bge_stop_fw(struct bge_softc *);
 static int bge_reset(struct bge_softc *);
 static void bge_link_upd(struct bge_softc *);
+static void bge_setwol(struct bge_softc *);

 /*
  * The BGE_REGISTER_DEBUG option is only for low-level debugging.  It may
@@ -3335,7 +3336,7 @@
        IFQ_SET_READY(&ifp->if_snd);
        ifp->if_hwassist = sc->bge_csum_features;
        ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_HWTAGGING |
-           IFCAP_VLAN_MTU;
+           IFCAP_VLAN_MTU | IFCAP_WOL_MAGIC;
        if ((sc->bge_flags & (BGE_FLAG_TSO | BGE_FLAG_TSO3)) != 0) {
                ifp->if_hwassist |= CSUM_TSO;
                ifp->if_capabilities |= IFCAP_TSO4 | IFCAP_VLAN_HWTSO;
@@ -5537,6 +5538,7 @@
        BGE_LOCK(sc);
        bge_stop(sc);
        bge_reset(sc);
+       bge_setwol(sc);
        BGE_UNLOCK(sc);

        return (0);
@@ -6206,3 +6208,34 @@
        }
        return (*func == NULL ? ENXIO : 0);
 }
+
+static void
+bge_setwol(struct bge_softc *sc)
+{
+       struct ifnet *ifp;
+       uint16_t pmstat;
+       int pmc;
+
+       ifp = sc->bge_ifp;
+
+       if ((ifp->if_capenable & IFCAP_WOL_MAGIC) == 0)
+           return;
+
+       if (pci_find_cap(sc->bge_dev, PCIY_PMG, &pmc) != 0)
+           return;
+
+       BGE_SETBIT(sc, BGE_MAC_MODE, BGE_MACMODE_MAGIC_PKT_ENB);
+
+       BGE_CLRBIT(sc, BGE_MAC_MODE, BGE_MACMODE_PORTMODE);
+       BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_GMII);
+
+       BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_ENABLE);
+
+       /* Request PME. */
+       pmstat = pci_read_config(sc->bge_dev,
+           pmc + PCIR_POWER_STATUS, 2);
+       pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
+       pci_write_config(sc->bge_dev,
+           pmc + PCIR_POWER_STATUS, pmstat, 2);
+}
+

>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to