On Tue, Jan 12, 2016 at 11:59:08AM +0100, Stefan Sperling wrote:
> On Sat, Jan 09, 2016 at 10:25:45PM +0100, Stefan Sperling wrote:
> > 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?
>
> Anyone?
>
> I've been running with this for 3 days without issues.
>
This fixed it for me.
OK reyk@
> > 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);
> >
>
--