diff options
author | le <le@FreeBSD.org> | 2007-03-24 18:53:33 +0000 |
---|---|---|
committer | le <le@FreeBSD.org> | 2007-03-24 18:53:33 +0000 |
commit | e39860cf02c6c4a7ff28cd3faa71dfe540a62bdb (patch) | |
tree | b9ba5d83dd060d8e1b898ee6c27a9bdcb552737c /sys/dev/ipw | |
parent | 9c634a627668ccdaeacae5569bb324114626d828 (diff) | |
download | FreeBSD-src-e39860cf02c6c4a7ff28cd3faa71dfe540a62bdb.zip FreeBSD-src-e39860cf02c6c4a7ff28cd3faa71dfe540a62bdb.tar.gz |
Drop the ipw softc lock before calling back into net80211, fixing a
LOR/deadlock.
Tested by: Denis Shaposhnikov <dsh_AT_vlink.ru>, le@
LOR id: 205
MFC in: 3 days
Diffstat (limited to 'sys/dev/ipw')
-rw-r--r-- | sys/dev/ipw/if_ipw.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/dev/ipw/if_ipw.c b/sys/dev/ipw/if_ipw.c index 1942c0017..974bcc9 100644 --- a/sys/dev/ipw/if_ipw.c +++ b/sys/dev/ipw/if_ipw.c @@ -1065,6 +1065,7 @@ ipw_data_intr(struct ipw_softc *sc, struct ipw_status *status, ipw_fix_channel(ic, m); wh = mtod(m, struct ieee80211_frame *); + mtx_unlock(&sc->sc_mtx); ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); /* send the frame to the 802.11 layer */ @@ -1072,6 +1073,7 @@ ipw_data_intr(struct ipw_softc *sc, struct ipw_status *status, /* node is no longer needed */ ieee80211_free_node(ni); + mtx_lock(&sc->sc_mtx); bus_dmamap_sync(sc->rbd_dmat, sc->rbd_map, BUS_DMASYNC_PREWRITE); } |