svn commit: r212972 - head/sys/dev/stge

Pyun YongHyeon yongari at FreeBSD.org
Tue Sep 21 17:52:33 UTC 2010


Author: yongari
Date: Tue Sep 21 17:52:32 2010
New Revision: 212972
URL: http://svn.freebsd.org/changeset/base/212972

Log:
  Remove unnecessary controller reinitialization.
  
  PR:	kern/87506

Modified:
  head/sys/dev/stge/if_stge.c

Modified: head/sys/dev/stge/if_stge.c
==============================================================================
--- head/sys/dev/stge/if_stge.c	Tue Sep 21 17:42:19 2010	(r212971)
+++ head/sys/dev/stge/if_stge.c	Tue Sep 21 17:52:32 2010	(r212972)
@@ -1377,6 +1377,7 @@ stge_watchdog(struct stge_softc *sc)
 	ifp = sc->sc_ifp;
 	if_printf(sc->sc_ifp, "device timeout\n");
 	ifp->if_oerrors++;
+	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 	stge_init_locked(sc);
 	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 		stge_start_locked(ifp);
@@ -1405,7 +1406,10 @@ stge_ioctl(struct ifnet *ifp, u_long cmd
 		else if (ifp->if_mtu != ifr->ifr_mtu) {
 			ifp->if_mtu = ifr->ifr_mtu;
 			STGE_LOCK(sc);
-			stge_init_locked(sc);
+			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
+				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+				stge_init_locked(sc);
+			}
 			STGE_UNLOCK(sc);
 		}
 		break;
@@ -1639,8 +1643,10 @@ stge_intr(void *arg)
 	}
 
 force_init:
-	if (reinit != 0)
+	if (reinit != 0) {
+		ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 		stge_init_locked(sc);
+	}
 
 	/* Re-enable interrupts. */
 	CSR_WRITE_2(sc, STGE_IntEnable, sc->sc_IntEnable);
@@ -1936,11 +1942,16 @@ stge_poll(struct ifnet *ifp, enum poll_c
 			if ((status & IS_HostError) != 0) {
 				device_printf(sc->sc_dev,
 				    "Host interface error, resetting...\n");
+				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 				stge_init_locked(sc);
+				break;
 			}
 			if ((status & IS_TxComplete) != 0) {
-				if (stge_tx_error(sc) != 0)
+				if (stge_tx_error(sc) != 0) {
+					ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 					stge_init_locked(sc);
+					break;
+				}
 			}
 		}
 
@@ -2121,6 +2132,8 @@ stge_init_locked(struct stge_softc *sc)
 	STGE_LOCK_ASSERT(sc);
 
 	ifp = sc->sc_ifp;
+	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+		return;
 	mii = device_get_softc(sc->sc_miibus);
 
 	/*


More information about the svn-src-head mailing list