tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

patch: avoid wm(4) resets when adding/deleting vlan(4)



After a wm(4) is reset, it takes about 30 seconds for the NIC to get
back "on net."  It's really painful.

I've attached a patch for -current that stops wm(4) from needlessly
resetting when you add or delete a vlan(4):

ifconfig vlan0 create vlan 2 vlanif wm0
ifconfig vlan0 destroy

Please give it a look or give it a try.  I will commit it next week.

A patch for netbsd-5 is on the way.

Dave

-- 
David Young             OJC Technologies
dyoung%ojctech.com@localhost      Urbana, IL * (217) 278-3933
Index: if_wm.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_wm.c,v
retrieving revision 1.215
diff -u -p -r1.215 if_wm.c
--- if_wm.c     16 Oct 2010 06:31:49 -0000      1.215
+++ if_wm.c     3 Dec 2010 21:14:01 -0000
@@ -516,6 +516,7 @@ static int  wm_read_mac_addr(struct wm_so
 static void    wm_tick(void *);
 
 static void    wm_set_filter(struct wm_softc *);
+static void    wm_set_vlan(struct wm_softc *);
 
 static int     wm_intr(void *);
 static void    wm_txintr(struct wm_softc *);
@@ -2738,14 +2739,17 @@ wm_ifflags_cb(struct ethercom *ec)
        struct wm_softc *sc = ifp->if_softc;
        int change = ifp->if_flags ^ sc->sc_if_flags;
 
+       if (change != 0)
+               sc->sc_if_flags = ifp->if_flags;
+
        if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
                return ENETRESET;
-       else if ((change & (IFF_PROMISC | IFF_ALLMULTI)) == 0)
-               return 0;
 
-       wm_set_filter(sc);
+       if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
+               wm_set_filter(sc);
+
+       wm_set_vlan(sc);
 
-       sc->sc_if_flags = ifp->if_flags;
        return 0;
 }
 
@@ -3704,6 +3708,19 @@ wm_reset(struct wm_softc *sc)
        /* XXX need special handling for 82580 */
 }
 
+static void
+wm_set_vlan(struct wm_softc *sc)
+{
+       /* Deal with VLAN enables. */
+       if (VLAN_ATTACHED(&sc->sc_ethercom))
+               sc->sc_ctrl |= CTRL_VME;
+       else
+               sc->sc_ctrl &= ~CTRL_VME;
+
+       /* Write the control registers. */
+       CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
+}
+
 /*
  * wm_init:            [ifnet interface function]
  *
@@ -3921,14 +3938,8 @@ wm_init(struct ifnet *ifp)
        else
                CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
 
-       /* Deal with VLAN enables. */
-       if (VLAN_ATTACHED(&sc->sc_ethercom))
-               sc->sc_ctrl |= CTRL_VME;
-       else
-               sc->sc_ctrl &= ~CTRL_VME;
-
-       /* Write the control register. */
-       CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
+       /* Writes the control register. */
+       wm_set_vlan(sc);
 
        if (sc->sc_flags & WM_F_HAS_MII) {
                int val;


Home | Main Index | Thread Index | Old Index