diff options
author | jhb <jhb@FreeBSD.org> | 2007-01-13 04:35:15 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2007-01-13 04:35:15 +0000 |
commit | cbd9e164046125adc3cf7eee878772255b2ab871 (patch) | |
tree | 4685dbb682a2267b7841e0546cb79958ec121c47 | |
parent | f6ff13951b6587cc6964bceca96745df18785aa3 (diff) | |
download | FreeBSD-src-cbd9e164046125adc3cf7eee878772255b2ab871.zip FreeBSD-src-cbd9e164046125adc3cf7eee878772255b2ab871.tar.gz |
- Add a locked variant of bce_ifmedia_upd() for use within the driver and
add missing locking to bce_ifmedia_upd().
- While I'm here, unexpand an instance of LIST_FOREACH().
MFC after: 2 weeks
Reviewed by: scottl
-rw-r--r-- | sys/dev/bce/if_bce.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c index 44bb096..9441c50 100644 --- a/sys/dev/bce/if_bce.c +++ b/sys/dev/bce/if_bce.c @@ -305,6 +305,7 @@ static void bce_start (struct ifnet *); static int bce_ioctl (struct ifnet *, u_long, caddr_t); static void bce_watchdog (struct bce_softc *); static int bce_ifmedia_upd (struct ifnet *); +static void bce_ifmedia_upd_locked (struct ifnet *); static void bce_ifmedia_sts (struct ifnet *, struct ifmediareq *); static void bce_init_locked (struct bce_softc *); static void bce_init (void *); @@ -3812,12 +3813,24 @@ static int bce_ifmedia_upd(struct ifnet *ifp) { struct bce_softc *sc; + + sc = ifp->if_softc; + BCE_LOCK(sc); + bce_ifmedia_upd_locked(ifp); + BCE_UNLOCK(sc); + return (0); +} + +static void +bce_ifmedia_upd_locked(struct ifnet *ifp) +{ + struct bce_softc *sc; struct mii_data *mii; struct ifmedia *ifm; - int rc = 0; sc = ifp->if_softc; ifm = &sc->bce_ifmedia; + BCE_LOCK_ASSERT(sc); /* DRC - ToDo: Add SerDes support. */ @@ -3825,13 +3838,11 @@ bce_ifmedia_upd(struct ifnet *ifp) sc->bce_link = 0; if (mii->mii_instance) { struct mii_softc *miisc; - for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL; - miisc = LIST_NEXT(miisc, mii_list)) + + LIST_FOREACH(miisc, &mii->mii_phys, mii_list) mii_phy_reset(miisc); } mii_mediachg(mii); - - return(rc); } @@ -4444,7 +4455,7 @@ bce_init_locked(struct bce_softc *sc) /* Enable host interrupts. */ bce_enable_intr(sc); - bce_ifmedia_upd(ifp); + bce_ifmedia_upd_locked(ifp); ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; @@ -4487,7 +4498,7 @@ bce_mgmt_init_locked(struct bce_softc *sc) REG_RD(sc, BCE_MISC_ENABLE_SET_BITS); DELAY(20); - bce_ifmedia_upd(ifp); + bce_ifmedia_upd_locked(ifp); bce_mgmt_init_locked_exit: DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); |