summaryrefslogtreecommitdiffstats
path: root/sys/dev/iwi
diff options
context:
space:
mode:
authormlaier <mlaier@FreeBSD.org>2006-12-06 21:23:51 +0000
committermlaier <mlaier@FreeBSD.org>2006-12-06 21:23:51 +0000
commit0cffb45c379cc8cb0170971011777787ff1d362f (patch)
tree0a2c06ae27a4dd95fc87994ba8ed1503096260b2 /sys/dev/iwi
parente735758280ef40b426a9cd91ea5364fa92a64adc (diff)
downloadFreeBSD-src-0cffb45c379cc8cb0170971011777787ff1d362f.zip
FreeBSD-src-0cffb45c379cc8cb0170971011777787ff1d362f.tar.gz
Drop the iwi softc lock when calling back into net80211 on rx. This fixes a
LOR with direct dispatch in the netisr. Reported and tested by: Munehiro Matsuda Submitted by: jhb LOR id: 194
Diffstat (limited to 'sys/dev/iwi')
-rw-r--r--sys/dev/iwi/if_iwi.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/dev/iwi/if_iwi.c b/sys/dev/iwi/if_iwi.c
index c08afd6..4f5499d 100644
--- a/sys/dev/iwi/if_iwi.c
+++ b/sys/dev/iwi/if_iwi.c
@@ -1230,6 +1230,7 @@ iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
struct mbuf *mnew, *m;
struct ieee80211_node *ni;
int type, error, framelen;
+ IWI_LOCK_DECL;
framelen = le16toh(frame->len);
if (framelen < IEEE80211_MIN_LEN || framelen > MCLBYTES) {
@@ -1310,6 +1311,7 @@ iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
}
+ IWI_UNLOCK(sc);
ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *));
@@ -1319,6 +1321,7 @@ iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
/* node is no longer needed */
ieee80211_free_node(ni);
+ IWI_LOCK(sc);
if (sc->sc_softled) {
/*
* Blink for any data frame. Otherwise do a
OpenPOWER on IntegriCloud