Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 May 2011 17:01:22 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r222135 - head/sys/dev/gem
Message-ID:  <201105201701.p4KH1MK6092946@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201105201701.p4KH1MK6092946>