summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/mips/atheros/if_arge.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/sys/mips/atheros/if_arge.c b/sys/mips/atheros/if_arge.c
index f5a0a25..09e9ae4 100644
--- a/sys/mips/atheros/if_arge.c
+++ b/sys/mips/atheros/if_arge.c
@@ -110,6 +110,7 @@ static int arge_ioctl(struct ifnet *, u_long, caddr_t);
static void arge_init(void *);
static void arge_init_locked(struct arge_softc *);
static void arge_link_task(void *, int);
+static void arge_update_link_locked(struct arge_softc *sc);
static void arge_set_pll(struct arge_softc *, int, int);
static int arge_miibus_readreg(device_t, int, int);
static void arge_miibus_statchg(device_t);
@@ -684,13 +685,20 @@ static void
arge_link_task(void *arg, int pending)
{
struct arge_softc *sc;
+ sc = (struct arge_softc *)arg;
+
+ ARGE_LOCK(sc);
+ arge_update_link_locked(sc);
+ ARGE_UNLOCK(sc);
+}
+
+static void
+arge_update_link_locked(struct arge_softc *sc)
+{
struct mii_data *mii;
struct ifnet *ifp;
uint32_t media, duplex;
- sc = (struct arge_softc *)arg;
-
- ARGE_LOCK(sc);
mii = device_get_softc(sc->arge_miibus);
ifp = sc->arge_ifp;
if (mii == NULL || ifp == NULL ||
@@ -708,10 +716,10 @@ arge_link_task(void *arg, int pending)
duplex = mii->mii_media_active & IFM_GMASK;
arge_set_pll(sc, media, duplex);
}
- } else
+ } else {
sc->arge_link_status = 0;
+ }
- ARGE_UNLOCK(sc);
}
static void
@@ -853,7 +861,6 @@ arge_init_locked(struct arge_softc *sc)
if (sc->arge_miibus) {
- sc->arge_link_status = 0;
mii = device_get_softc(sc->arge_miibus);
mii_mediachg(mii);
}
@@ -867,8 +874,10 @@ arge_init_locked(struct arge_softc *sc)
ifp->if_drv_flags |= IFF_DRV_RUNNING;
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
- if (sc->arge_miibus)
+ if (sc->arge_miibus) {
callout_reset(&sc->arge_stat_callout, hz, arge_tick, sc);
+ arge_update_link_locked(sc);
+ }
ARGE_WRITE(sc, AR71XX_DMA_TX_DESC, ARGE_TX_RING_ADDR(sc, 0));
ARGE_WRITE(sc, AR71XX_DMA_RX_DESC, ARGE_RX_RING_ADDR(sc, 0));
OpenPOWER on IntegriCloud