Page MenuHomeFreeBSD

D55925.diff
No OneTemporary

D55925.diff

diff --git a/sys/dev/usb/net/if_axe.c b/sys/dev/usb/net/if_axe.c
--- a/sys/dev/usb/net/if_axe.c
+++ b/sys/dev/usb/net/if_axe.c
@@ -454,9 +454,17 @@
AXE_LOCK_ASSERT(sc, MA_OWNED);
+ AXE_UNLOCK(sc);
+ AXE_MII_LOCK(sc);
+ AXE_LOCK(sc);
+
LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
PHY_RESET(miisc);
error = mii_mediachg(mii);
+
+ AXE_UNLOCK(sc);
+ AXE_MII_UNLOCK(sc);
+ AXE_LOCK(sc);
return (error);
}
@@ -469,11 +477,13 @@
struct axe_softc *sc = if_getsoftc(ifp);
struct mii_data *mii = GET_MII(sc);
+ AXE_MII_LOCK(sc);
AXE_LOCK(sc);
mii_pollstat(mii);
ifmr->ifm_active = mii->mii_media_active;
ifmr->ifm_status = mii->mii_media_status;
AXE_UNLOCK(sc);
+ AXE_MII_UNLOCK(sc);
}
static u_int
@@ -940,6 +950,7 @@
device_set_usb_desc(dev);
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF);
+ sx_init(&sc->sc_mii_lock, "axemii");
iface_index = AXE_IFACE_IDX;
error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer,
@@ -975,6 +986,7 @@
usbd_transfer_unsetup(sc->sc_xfer, AXE_N_TRANSFER);
uether_ifdetach(ue);
+ sx_destroy(&sc->sc_mii_lock);
mtx_destroy(&sc->sc_mtx);
return (0);
@@ -1270,12 +1282,23 @@
AXE_LOCK_ASSERT(sc, MA_OWNED);
+ AXE_UNLOCK(sc);
+ if (!AXE_MII_TRYLOCK(sc)) {
+ AXE_LOCK(sc);
+ return;
+ }
+ AXE_LOCK(sc);
+
mii_tick(mii);
if ((sc->sc_flags & AXE_FLAG_LINK) == 0) {
axe_miibus_statchg(ue->ue_dev);
if ((sc->sc_flags & AXE_FLAG_LINK) != 0)
axe_start(ue);
}
+
+ AXE_UNLOCK(sc);
+ AXE_MII_UNLOCK(sc);
+ AXE_LOCK(sc);
}
static void
diff --git a/sys/dev/usb/net/if_axereg.h b/sys/dev/usb/net/if_axereg.h
--- a/sys/dev/usb/net/if_axereg.h
+++ b/sys/dev/usb/net/if_axereg.h
@@ -333,6 +333,7 @@
struct axe_softc {
struct usb_ether sc_ue;
struct mtx sc_mtx;
+ struct sx sc_mii_lock;
struct usb_xfer *sc_xfer[AXE_N_TRANSFER];
int sc_phyno;
@@ -361,3 +362,6 @@
#define AXE_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
#define AXE_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
#define AXE_LOCK_ASSERT(_sc, t) mtx_assert(&(_sc)->sc_mtx, t)
+#define AXE_MII_LOCK(_sc) sx_xlock(&(_sc)->sc_mii_lock)
+#define AXE_MII_UNLOCK(_sc) sx_xunlock(&(_sc)->sc_mii_lock)
+#define AXE_MII_TRYLOCK(_sc) sx_try_xlock(&(_sc)->sc_mii_lock)

File Metadata

Mime Type
text/plain
Expires
Mon, Jun 22, 5:39 AM (19 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34165928
Default Alt Text
D55925.diff (2 KB)

Event Timeline