Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Feb 2011 02:40:31 +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: r218964 - head/sys/dev/dc
Message-ID:  <201102230240.p1N2eVUB028942@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Wed Feb 23 02:40:31 2011
New Revision: 218964
URL: http://svn.freebsd.org/changeset/base/218964

Log:
  Remove unnecessary controller reinitialization which resulted in
  link flips during alias address insertion or dhclient operation.
  While I'm here remove dc_reset() in DC_ISR_BUS_ERR case. Device is
  fully reinitialized again in dc_init_locked().

Modified:
  head/sys/dev/dc/if_dc.c

Modified: head/sys/dev/dc/if_dc.c
==============================================================================
--- head/sys/dev/dc/if_dc.c	Tue Feb 22 21:27:46 2011	(r218963)
+++ head/sys/dev/dc/if_dc.c	Wed Feb 23 02:40:31 2011	(r218964)
@@ -2894,6 +2894,7 @@ dc_rxeof(struct dc_softc *sc)
 				if (rxstat & DC_RXSTAT_CRCERR)
 					continue;
 				else {
+					ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 					dc_init_locked(sc);
 					return (rx_npkts);
 				}
@@ -3032,6 +3033,7 @@ dc_txeof(struct dc_softc *sc)
 			if (txstat & DC_TXSTAT_LATECOLL)
 				ifp->if_collisions++;
 			if (!(txstat & DC_TXSTAT_UNDERRUN)) {
+				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 				dc_init_locked(sc);
 				return;
 			}
@@ -3143,8 +3145,10 @@ dc_tx_underrun(struct dc_softc *sc)
 	uint32_t isr;
 	int i;
 
-	if (DC_IS_DAVICOM(sc))
+	if (DC_IS_DAVICOM(sc)) {
+		sc->dc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 		dc_init_locked(sc);
+	}
 
 	if (DC_IS_INTEL(sc)) {
 		/*
@@ -3164,6 +3168,7 @@ dc_tx_underrun(struct dc_softc *sc)
 			device_printf(sc->dc_dev,
 			    "%s: failed to force tx to idle state\n",
 			    __func__);
+			sc->dc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 			dc_init_locked(sc);
 		}
 	}
@@ -3236,7 +3241,7 @@ dc_poll(struct ifnet *ifp, enum poll_cmd
 
 		if (status & DC_ISR_BUS_ERR) {
 			if_printf(ifp, "%s: bus error\n", __func__);
-			dc_reset(sc);
+			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 			dc_init_locked(sc);
 		}
 	}
@@ -3319,7 +3324,7 @@ dc_intr(void *arg)
 			dc_start_locked(ifp);
 
 		if (status & DC_ISR_BUS_ERR) {
-			dc_reset(sc);
+			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 			dc_init_locked(sc);
 			DC_UNLOCK(sc);
 			return;
@@ -3565,6 +3570,9 @@ dc_init_locked(struct dc_softc *sc)
 
 	DC_LOCK_ASSERT(sc);
 
+	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+		return;
+
 	mii = device_get_softc(sc->dc_miibus);
 
 	/*
@@ -3818,6 +3826,7 @@ dc_ioctl(struct ifnet *ifp, u_long comma
 					dc_setfilt(sc);
 			} else {
 				sc->dc_txthresh = 0;
+				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 				dc_init_locked(sc);
 			}
 		} else {
@@ -3890,8 +3899,7 @@ dc_watchdog(void *xsc)
 	ifp->if_oerrors++;
 	device_printf(sc->dc_dev, "watchdog timeout\n");
 
-	dc_stop(sc);
-	dc_reset(sc);
+	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 	dc_init_locked(sc);
 
 	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))



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