summaryrefslogtreecommitdiffstats
path: root/sys/dev/bce
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2007-01-13 04:35:15 +0000
committerjhb <jhb@FreeBSD.org>2007-01-13 04:35:15 +0000
commitcbd9e164046125adc3cf7eee878772255b2ab871 (patch)
tree4685dbb682a2267b7841e0546cb79958ec121c47 /sys/dev/bce
parentf6ff13951b6587cc6964bceca96745df18785aa3 (diff)
downloadFreeBSD-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
Diffstat (limited to 'sys/dev/bce')
-rw-r--r--sys/dev/bce/if_bce.c25
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__);
OpenPOWER on IntegriCloud