Author: yongari
Date: Fri May 20 17:01:22 2011
New Revision: 222135
URL: http://svn.freebsd.org/changeset/base/222135

Log:
  Remove unnecessary controller reinitialization by checking
  IFF_DRV_RUNNING flag.  Previously running dhclient or adding alias
  addresses reinitialized controller and it resulted in unnecessary
  link flips.
  
  Reviewed by:  marius

Modified:
  head/sys/dev/gem/if_gem.c

Modified: head/sys/dev/gem/if_gem.c
==============================================================================
--- head/sys/dev/gem/if_gem.c   Fri May 20 16:03:36 2011        (r222134)
+++ head/sys/dev/gem/if_gem.c   Fri May 20 17:01:22 2011        (r222135)
@@ -739,8 +739,10 @@ gem_reset_rxdma(struct gem_softc *sc)
 {
        int i;
 
-       if (gem_reset_rx(sc) != 0)
+       if (gem_reset_rx(sc) != 0) {
+               sc->sc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
                return (gem_init_locked(sc));
+       }
        for (i = 0; i < GEM_NRXDESC; i++)
                if (sc->sc_rxsoft[i].rxs_mbuf != NULL)
                        GEM_UPDATE_RXDESC(sc, i);
@@ -924,6 +926,9 @@ gem_init_locked(struct gem_softc *sc)
 
        GEM_LOCK_ASSERT(sc, MA_OWNED);
 
+       if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+               return;
+
 #ifdef GEM_DEBUG
        CTR2(KTR_GEM, "%s: %s: calling stop", device_get_name(sc->sc_dev),
            __func__);
@@ -1762,6 +1767,7 @@ gem_intr(void *v)
                if ((status2 &
                    (GEM_MAC_TX_UNDERRUN | GEM_MAC_TX_PKT_TOO_LONG)) != 0) {
                        sc->sc_ifp->if_oerrors++;
+                       sc->sc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
                        gem_init_locked(sc);
                }
        }
@@ -1814,6 +1820,7 @@ gem_watchdog(struct gem_softc *sc)
        ++ifp->if_oerrors;
 
        /* Try to get more packets going. */
+       ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
        gem_init_locked(sc);
        gem_start_locked(ifp);
        return (EJUSTRETURN);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to