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);

Reply via email to