summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/tx/if_tx.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/sys/dev/tx/if_tx.c b/sys/dev/tx/if_tx.c
index 716cd96..bb44a87 100644
--- a/sys/dev/tx/if_tx.c
+++ b/sys/dev/tx/if_tx.c
@@ -140,6 +140,7 @@ static EPIC_INTR_RET_TYPE epic_intr(void *);
static int epic_common_attach(epic_softc_t *);
static void epic_ifstart(struct ifnet *);
static void epic_ifwatchdog(struct ifnet *);
+static void epic_stats_update(epic_softc_t *);
static int epic_init(epic_softc_t *);
static void epic_stop(epic_softc_t *);
static void epic_rx_done(epic_softc_t *);
@@ -1149,6 +1150,26 @@ epic_ifwatchdog(ifp)
}
/*
+ * Despite the name of this function, it doesn't update statistics, it only
+ * helps in autonegotiation process.
+ */
+static void
+epic_stats_update(epic_softc_t * sc)
+{
+ struct mii_data * mii;
+ int s;
+
+ s = splimp();
+
+ mii = device_get_softc(sc->miibus);
+ mii_tick(mii);
+
+ sc->stat_ch = timeout((timeout_t *)epic_stats_update, sc, hz);
+
+ splx(s);
+}
+
+/*
* Set media options.
*/
static int
@@ -1354,7 +1375,9 @@ epic_miibus_statchg(dev)
else
sc->sc_if.if_baudrate = 10000000;
+ epic_stop_activity(sc);
epic_set_tx_mode(sc);
+ epic_start_activity(sc);
return;
}
@@ -1399,7 +1422,6 @@ epic_init(sc)
epic_softc_t *sc;
{
struct ifnet *ifp = &sc->sc_if;
- struct mii_data *mii;
int s,i;
s = splimp();
@@ -1475,17 +1497,11 @@ epic_init(sc)
/* Start Rx process */
epic_start_activity(sc);
- /* Reset all PHYs */
- mii = device_get_softc(sc->miibus);
- if (mii->mii_instance) {
- struct mii_softc *miisc;
- LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
- mii_phy_reset(miisc);
- }
-
/* Set appropriate media */
epic_ifmedia_upd(ifp);
+ sc->stat_ch = timeout((timeout_t *)epic_stats_update, sc, hz);
+
splx(s);
return 0;
@@ -1724,6 +1740,8 @@ epic_stop(sc)
sc->sc_if.if_timer = 0;
+ untimeout((timeout_t *)epic_stats_update, sc, sc->stat_ch);
+
/* Disable interrupts */
CSR_WRITE_4( sc, INTMASK, 0 );
CSR_WRITE_4( sc, GENCTL, 0 );
OpenPOWER on IntegriCloud