I've run into an issue where iwn(4) fails to init the hardware. Running 'ifconfig iwn0 scan' resulted in:
setting configuration iwn0: fatal firmware error firmware error log: error type = "SYSASSERT" (0x00000005) program counter = 0x00022088 source line = 0x000000A4 error data = 0x000000A400000000 branch link = 0x0002225800022258 interrupt link = 0x0000153200000000 time = 27873 driver status: tx ring 0: qid=0 cur=0 queued=0 tx ring 1: qid=1 cur=0 queued=0 tx ring 2: qid=2 cur=0 queued=0 tx ring 3: qid=3 cur=0 queued=0 tx ring 4: qid=4 cur=6 queued=0 tx ring 5: qid=5 cur=0 queued=0 tx ring 6: qid=6 cur=0 queued=0 tx ring 7: qid=7 cur=0 queued=0 tx ring 8: qid=8 cur=0 queued=0 tx ring 9: qid=9 cur=0 queued=0 tx ring 10: qid=10 cur=0 queued=0 tx ring 11: qid=11 cur=0 queued=0 tx ring 12: qid=12 cur=0 queued=0 tx ring 13: qid=13 cur=0 queued=0 tx ring 14: qid=14 cur=0 queued=0 tx ring 15: qid=15 cur=0 queued=0 tx ring 16: qid=16 cur=0 queued=0 tx ring 17: qid=17 cur=0 queued=0 tx ring 18: qid=18 cur=0 queued=0 tx ring 19: qid=19 cur=0 queued=0 rx ring: cur=7 802.11 state 0 iwn0: RXON command failed iwn0: could not configure device iwn0: could not load firmware .data section iwn0: could not load firmware iwn0: could not initialize hardware A debug printf revealed the rxon command channel was set to zero: iwn_config: rxon chan 0 flags 40008000 cck f ofdm ff I haven't been able to reproduce the problem with the diff below. Note that this code runs during hardware initialization only. It shouldn't really matter what channel we set here as long as it isn't zero. Fix a misplaced curly brace while here... ok? Index: if_iwn.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v retrieving revision 1.153 diff -u -p -r1.153 if_iwn.c --- if_iwn.c 7 Jan 2016 23:08:38 -0000 1.153 +++ if_iwn.c 9 Jan 2016 21:12:23 -0000 @@ -3429,7 +3429,7 @@ iwn_set_link_quality(struct iwn_softc *s /* Next retry at immediate lower bit-rate. */ if (txrate > 0) txrate--; - } + } } return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, 1); @@ -4455,15 +4455,9 @@ iwn_config(struct iwn_softc *sc) IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl)); IEEE80211_ADDR_COPY(sc->rxon.myaddr, ic->ic_myaddr); IEEE80211_ADDR_COPY(sc->rxon.wlap, ic->ic_myaddr); - sc->rxon.chan = ieee80211_chan2ieee(ic, ic->ic_ibss_chan); + sc->rxon.chan = 1; sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); - if (IEEE80211_IS_CHAN_2GHZ(ic->ic_ibss_chan)) { - sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); - if (ic->ic_flags & IEEE80211_F_USEPROT) - sc->rxon.flags |= htole32(IWN_RXON_TGG_PROT); - DPRINTF(("%s: 2ghz prot 0x%x\n", __func__, - le32toh(sc->rxon.flags))); - } + sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); switch (ic->ic_opmode) { case IEEE80211_M_STA: sc->rxon.mode = IWN_MODE_STA; @@ -4489,6 +4483,9 @@ iwn_config(struct iwn_softc *sc) IWN_RXCHAIN_IDLE_COUNT(2); sc->rxon.rxchain = htole16(rxchain); DPRINTF(("setting configuration\n")); + DPRINTF(("%s: rxon chan %d flags %x cck %x ofdm %x\n", __func__, + sc->rxon.chan, le32toh(sc->rxon.flags), sc->rxon.cck_mask, + sc->rxon.ofdm_mask)); error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 0); if (error != 0) { printf("%s: RXON command failed\n", sc->sc_dev.dv_xname);