On Fri, Feb 12, 2016 at 10:47:16AM -0500, Donald Allen wrote:
> On Fri, Feb 12, 2016 at 10:45 AM, Chris Cappuccio <ch...@nmedia.net> wrote:
> 
> > Donald Allen [donaldcal...@gmail.com] wrote:
> > > On Feb 12, 2016 05:08, "Stefan Sperling" <s...@stsp.name> wrote:
> > > >
> > > > On Thu, Feb 11, 2016 at 08:42:21PM -0500, Donald Allen wrote:
> > > > > When attempting to install the 2/8 snapshot on my Thinkpad x-250, I
> > > chose
> > > > > to configure the wireless network interface (iwm). This resulted in
> > the
> > > > > following:
> > > > >
> > > > > iwm0: could not read firmware iwm-7265-9 (error 2)
> > > > > panic: attempt to execute user address 0x0 in supervisor mode
> > > >
> > > > Do you have a trace from ddb please?
> > >
> > > There was no entry to ddb. There was one additional message after the
> > above:
> > >
> > > syncing disks... done
> > >
> > > and that was all she wrote. (I took a photo of the screen.)
> > >
> > > If you have a suggestion for how to get the trace, I will certainly try
> > to
> > > help. Or maybe build a kernel with some additional printfs to try to
> > > isolate where this is happening?
> >
> > sysctl ddb.panic=1 ??
> >
> 
> Ah .. thank you. I'll give it a try.
> 

No need. I could reproduce locally. The problem also shows up with
a GENERIC kernel when the firmware is not installed.

For some reason, the callbacks into the wireless stack aren't hooked
up until after the firmware is loaded. There is no reason not do hook
them up ealier. This diff fixes the crash for me.

Index: if_iwm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
retrieving revision 1.77
diff -u -p -r1.77 if_iwm.c
--- if_iwm.c    5 Feb 2016 16:08:44 -0000       1.77
+++ if_iwm.c    12 Feb 2016 16:10:48 -0000
@@ -6642,18 +6642,6 @@ iwm_preinit(struct iwm_softc *sc)
                printf("%s: could not set MAC address (error %d)\n",
                    DEVNAME(sc), error);
 
-       ic->ic_node_alloc = iwm_node_alloc;
-
-       /* Override 802.11 state transition machine. */
-       sc->sc_newstate = ic->ic_newstate;
-       ic->ic_newstate = iwm_newstate;
-       ic->ic_update_htprot = iwm_update_htprot;
-       ic->ic_ampdu_rx_start = iwm_ampdu_rx_start;
-       ic->ic_ampdu_rx_stop = iwm_ampdu_rx_stop;
-#ifdef notyet
-       ic->ic_ampdu_tx_start = iwm_ampdu_tx_start;
-       ic->ic_ampdu_tx_stop = iwm_ampdu_tx_stop;
-#endif
        ieee80211_media_init(ifp, iwm_media_change, ieee80211_media_status);
 
        return 0;
@@ -6886,6 +6874,18 @@ iwm_attach(struct device *parent, struct
        task_set(&sc->ba_task, iwm_ba_task, sc);
        task_set(&sc->htprot_task, iwm_htprot_task, sc);
 
+       ic->ic_node_alloc = iwm_node_alloc;
+
+       /* Override 802.11 state transition machine. */
+       sc->sc_newstate = ic->ic_newstate;
+       ic->ic_newstate = iwm_newstate;
+       ic->ic_update_htprot = iwm_update_htprot;
+       ic->ic_ampdu_rx_start = iwm_ampdu_rx_start;
+       ic->ic_ampdu_rx_stop = iwm_ampdu_rx_stop;
+#ifdef notyet
+       ic->ic_ampdu_tx_start = iwm_ampdu_tx_start;
+       ic->ic_ampdu_tx_stop = iwm_ampdu_tx_stop;
+#endif
        /*
         * We cannot read the MAC address without loading the
         * firmware from disk. Postpone until mountroot is done.

Reply via email to