Hi, Attached is a minimal patch that fixes the iwn lock-ups (at least for me :-). Please test.
Regards, Sverre
Index: sys/dev/pci/if_iwn.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/if_iwn.c,v retrieving revision 1.38 diff -u -p -r1.38 if_iwn.c --- sys/dev/pci/if_iwn.c 5 Apr 2010 07:20:26 -0000 1.38 +++ sys/dev/pci/if_iwn.c 9 Apr 2010 13:52:24 -0000 @@ -1932,6 +1932,8 @@ iwn_rx_done(struct iwn_softc *sc, struct /* * See comment in if_wpi.c:wpi_rx_intr() about locking * nb_free_entries here. In short: it's not required. + * XXX please verify that this section still does not + * require locking! */ MGETHDR(m1, M_DONTWAIT, MT_DATA); if (m1 == NULL) { @@ -1939,17 +1941,22 @@ iwn_rx_done(struct iwn_softc *sc, struct ifp->if_ierrors++; return; } - if (sc->rxq.nb_free_entries <= 0) { + if (sc->rxq.nb_free_entries > 0) { + rbuf = iwn_alloc_rbuf(sc); + /* Attach RX buffer to mbuf header. */ + MEXTADD(m1, rbuf->vaddr, IWN_RBUF_SIZE, 0, iwn_free_rbuf, + rbuf); + m1->m_flags |= M_EXT_RW; + } + else + MEXTMALLOC(m1, IWN_RBUF_SIZE, M_DONTWAIT); + + if (m1 == NULL) { ic->ic_stats.is_rx_nobuf++; ifp->if_ierrors++; m_freem(m1); return; } - rbuf = iwn_alloc_rbuf(sc); - /* Attach RX buffer to mbuf header. */ - MEXTADD(m1, rbuf->vaddr, IWN_RBUF_SIZE, 0, iwn_free_rbuf, - rbuf); - m1->m_flags |= M_EXT_RW; bus_dmamap_unload(sc->sc_dmat, data->map); error = bus_dmamap_load(sc->sc_dmat, data->map, m1->m_ext.ext_buf,