Author: yongari
Date: Fri May 27 18:59:24 2011
New Revision: 222372
URL: http://svn.freebsd.org/changeset/base/222372

Log:
  MFC r222135:
    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.

Modified:
  stable/7/sys/dev/gem/if_gem.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/dev/gem/if_gem.c
==============================================================================
--- stable/7/sys/dev/gem/if_gem.c       Fri May 27 18:58:08 2011        
(r222371)
+++ stable/7/sys/dev/gem/if_gem.c       Fri May 27 18:59:24 2011        
(r222372)
@@ -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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to