Page MenuHomeFreeBSD

D56138.diff
No OneTemporary

D56138.diff

diff --git a/sys/dev/usb/net/if_ure.c b/sys/dev/usb/net/if_ure.c
--- a/sys/dev/usb/net/if_ure.c
+++ b/sys/dev/usb/net/if_ure.c
@@ -34,6 +34,7 @@
#include <sys/lock.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/sx.h>
#include <sys/sbuf.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
@@ -444,9 +445,8 @@
struct ure_softc *sc;
struct mii_data *mii;
if_t ifp;
- int locked;
uint16_t bmsr;
- bool new_link, old_link;
+ bool locked, new_link, old_link;
sc = device_get_softc(dev);
mii = GET_MII(sc);
@@ -459,7 +459,7 @@
(if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
goto done;
- old_link = (sc->sc_flags & URE_FLAG_LINK) ? true : false;
+ old_link = (sc->sc_flags & URE_FLAG_LINK) != 0;
sc->sc_flags &= ~URE_FLAG_LINK;
if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
(IFM_ACTIVE | IFM_AVALID)) {
@@ -480,7 +480,7 @@
}
}
- new_link = (sc->sc_flags & URE_FLAG_LINK) ? true : false;
+ new_link = (sc->sc_flags & URE_FLAG_LINK) != 0;
if (old_link && !new_link) {
/*
* MII layer reports link down. Verify by reading
@@ -517,13 +517,13 @@
{
struct ure_softc *sc;
struct mii_data *mii;
- int locked;
uint16_t bmsr;
+ bool locked;
sc = device_get_softc(dev);
mii = GET_MII(sc);
locked = mtx_owned(&sc->sc_mtx);
- if (locked == 0)
+ if (!locked)
URE_LOCK(sc);
/*
@@ -542,7 +542,7 @@
mii->mii_media_status |= IFM_ACTIVE;
}
- if (locked == 0)
+ if (!locked)
URE_UNLOCK(sc);
}
@@ -582,6 +582,7 @@
sc->sc_flags = USB_GET_DRIVER_INFO(uaa);
device_set_usb_desc(dev);
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF);
+ sx_init(&sc->sc_mii_lock, "uremii");
iface_index = URE_IFACE_IDX;
@@ -656,6 +657,7 @@
usbd_transfer_unsetup(sc->sc_tx_xfer, URE_MAX_TX);
usbd_transfer_unsetup(sc->sc_rx_xfer, URE_MAX_RX);
uether_ifdetach(ue);
+ sx_destroy(&sc->sc_mii_lock);
mtx_destroy(&sc->sc_mtx);
return (0);
@@ -1233,6 +1235,13 @@
if (sc->sc_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
ure_link_state(sc);
} else {
+ URE_UNLOCK(sc);
+ if (!URE_MII_TRYLOCK(sc)) {
+ URE_LOCK(sc);
+ return;
+ }
+ URE_LOCK(sc);
+
mii = GET_MII(sc);
mii_tick(mii);
if ((sc->sc_flags & URE_FLAG_LINK) == 0
@@ -1242,6 +1251,10 @@
sc->sc_rxstarted = 0;
ure_start(ue);
}
+
+ URE_UNLOCK(sc);
+ URE_MII_UNLOCK(sc);
+ URE_LOCK(sc);
}
}
@@ -1408,9 +1421,18 @@
mii = GET_MII(sc);
URE_LOCK_ASSERT(sc, MA_OWNED);
+
+ URE_UNLOCK(sc);
+ URE_MII_LOCK(sc);
+ URE_LOCK(sc);
+
LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
PHY_RESET(miisc);
error = mii_mediachg(mii);
+
+ URE_UNLOCK(sc);
+ URE_MII_UNLOCK(sc);
+ URE_LOCK(sc);
return (error);
}
@@ -1452,11 +1474,13 @@
mii = GET_MII(sc);
+ URE_MII_LOCK(sc);
URE_LOCK(sc);
mii_pollstat(mii);
ifmr->ifm_active = mii->mii_media_active;
ifmr->ifm_status = mii->mii_media_status;
URE_UNLOCK(sc);
+ URE_MII_UNLOCK(sc);
}
static void
diff --git a/sys/dev/usb/net/if_urereg.h b/sys/dev/usb/net/if_urereg.h
--- a/sys/dev/usb/net/if_urereg.h
+++ b/sys/dev/usb/net/if_urereg.h
@@ -581,6 +581,7 @@
struct usb_ether sc_ue;
struct ifmedia sc_ifmedia;
struct mtx sc_mtx;
+ struct sx sc_mii_lock;
struct usb_xfer *sc_rx_xfer[URE_MAX_RX];
struct usb_xfer *sc_tx_xfer[URE_MAX_TX];
@@ -616,5 +617,8 @@
#define URE_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
#define URE_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
#define URE_LOCK_ASSERT(_sc, t) mtx_assert(&(_sc)->sc_mtx, t)
+#define URE_MII_LOCK(_sc) sx_xlock(&(_sc)->sc_mii_lock)
+#define URE_MII_UNLOCK(_sc) sx_xunlock(&(_sc)->sc_mii_lock)
+#define URE_MII_TRYLOCK(_sc) sx_try_xlock(&(_sc)->sc_mii_lock)
#endif /* _IF_UREREG_H_ */

File Metadata

Mime Type
text/plain
Expires
Sun, May 31, 8:25 AM (9 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33648152
Default Alt Text
D56138.diff (3 KB)

Event Timeline