summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2009-12-23 17:46:11 +0000
committeryongari <yongari@FreeBSD.org>2009-12-23 17:46:11 +0000
commit1469c6e0a82e5624f13c1af33c8427bea5c83cef (patch)
treea9efbfcd6e945f89300cea633c439b8f76117c94
parenta0fa5bcb40b1e91b2066aef7b3d02ed0547abea1 (diff)
downloadFreeBSD-src-1469c6e0a82e5624f13c1af33c8427bea5c83cef.zip
FreeBSD-src-1469c6e0a82e5624f13c1af33c8427bea5c83cef.tar.gz
Don't reinitialize controller if driver is already running. This
reduces number of link state UP/DOWN changes.
-rw-r--r--sys/dev/ste/if_ste.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/dev/ste/if_ste.c b/sys/dev/ste/if_ste.c
index f25c9cf..1ca3f3c 100644
--- a/sys/dev/ste/if_ste.c
+++ b/sys/dev/ste/if_ste.c
@@ -643,8 +643,10 @@ ste_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
if (status & STE_ISR_STATS_OFLOW)
ste_stats_update(sc);
- if (status & STE_ISR_HOSTERR)
+ if (status & STE_ISR_HOSTERR) {
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
ste_init_locked(sc);
+ }
}
return (rx_npkts);
}
@@ -692,8 +694,10 @@ ste_intr(void *xsc)
if (status & STE_ISR_STATS_OFLOW)
ste_stats_update(sc);
- if (status & STE_ISR_HOSTERR)
+ if (status & STE_ISR_HOSTERR) {
ste_init_locked(sc);
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+ }
}
/* Re-enable interrupts */
@@ -832,6 +836,7 @@ ste_txeoc(struct ste_softc *sc)
STE_SETBIT4(sc, STE_DMACTL,
STE_DMACTL_TXDMA_STALL);
ste_wait(sc);
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
ste_init_locked(sc);
break;
}
@@ -1548,6 +1553,9 @@ ste_init_locked(struct ste_softc *sc)
STE_LOCK_ASSERT(sc);
ifp = sc->ste_ifp;
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+ return;
+
ste_stop(sc);
/* Reset the chip to a known state. */
ste_reset(sc);
@@ -2005,6 +2013,7 @@ ste_watchdog(struct ste_softc *sc)
ste_txeof(sc);
ste_txeoc(sc);
ste_rxeof(sc, -1);
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
ste_init_locked(sc);
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
OpenPOWER on IntegriCloud