diff options
| author | Sam Leffler <sam@FreeBSD.org> | 2003-11-14 19:00:32 +0000 |
|---|---|---|
| committer | Sam Leffler <sam@FreeBSD.org> | 2003-11-14 19:00:32 +0000 |
| commit | 5120abbfb44aea8edaca3311a60e73429dc71942 (patch) | |
| tree | 0e5901939d8633065a9035209aa5138fe4ea6820 /sys/dev/sk | |
| parent | 274461c9441dd719a672a8fef48458e127b3885e (diff) | |
Notes
Diffstat (limited to 'sys/dev/sk')
| -rw-r--r-- | sys/dev/sk/if_sk.c | 6 | ||||
| -rw-r--r-- | sys/dev/sk/if_skreg.h | 1 |
2 files changed, 7 insertions, 0 deletions
diff --git a/sys/dev/sk/if_sk.c b/sys/dev/sk/if_sk.c index 1ef44935baec3..3226d91694cec 100644 --- a/sys/dev/sk/if_sk.c +++ b/sys/dev/sk/if_sk.c @@ -1839,6 +1839,7 @@ static void sk_rxeof(sc_if) struct sk_if_softc *sc_if; { + struct sk_softc *sc; struct mbuf *m; struct ifnet *ifp; struct sk_chain *cur_rx; @@ -1846,10 +1847,13 @@ sk_rxeof(sc_if) int i; u_int32_t rxstat; + sc = sc_if->sk_softc; ifp = &sc_if->arpcom.ac_if; i = sc_if->sk_cdata.sk_rx_prod; cur_rx = &sc_if->sk_cdata.sk_rx_chain[i]; + SK_LOCK_ASSERT(sc); + while(!(sc_if->sk_rdata->sk_rx_ring[i].sk_ctl & SK_RXCTL_OWN)) { cur_rx = &sc_if->sk_cdata.sk_rx_chain[i]; @@ -1891,7 +1895,9 @@ sk_rxeof(sc_if) } ifp->if_ipackets++; + SK_UNLOCK(sc); (*ifp->if_input)(ifp, m); + SK_LOCK(sc); } sc_if->sk_cdata.sk_rx_prod = i; diff --git a/sys/dev/sk/if_skreg.h b/sys/dev/sk/if_skreg.h index 7309841592b0e..8e2eb53497016 100644 --- a/sys/dev/sk/if_skreg.h +++ b/sys/dev/sk/if_skreg.h @@ -1423,6 +1423,7 @@ struct sk_softc { #define SK_LOCK(_sc) mtx_lock(&(_sc)->sk_mtx) #define SK_UNLOCK(_sc) mtx_unlock(&(_sc)->sk_mtx) +#define SK_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sk_mtx, MA_OWNED) #define SK_IF_LOCK(_sc) mtx_lock(&(_sc)->sk_softc->sk_mtx) #define SK_IF_UNLOCK(_sc) mtx_unlock(&(_sc)->sk_softc->sk_mtx) |
