iwm(4) can panic if the firmware image is missing or corrupt:

starting network
iwm1: firmware parse error 22, section type 0
iwm1: failed to load init firmware
ifconfig: SIOCSIFXFLAGS: Invalid argument
panic: kernel diagnostic assertion "sc->task_refs.r_refs == 0" failed: file "/u
sr/src/sys/dev/pci/if_iwm.c", line 10361
Stopped at      db_enter+0x10:  popq    %rbp
    TID    PID    UID     PRFLAGS     PFLAGS    0         0x3          0    1K 
ifconfig
db_enter() at db_enter+0x10
panic(ffffffff81f3341f) at panic+0xbf
__assert(ffffffff81fa36d6,ffffffff81f9df76,2879,ffffffff81f4cb41) at __assert+0
x25
iwm_init(ffff8000005eb048) at iwm_init+0x2c4
iwm_ioctl(ffff8000005eb048,8020690c,ffff800000bc2400) at iwm_ioctl+0xf9
in6_ifinit(ffff8000005eb048,ffff800000bc2400,1) at in6_ifinit+0xbb
in6_update_ifa(ffff8000005eb048,ffff8000227473b0,0) at in6_update_ifa+0x774
in6_ifattach_linklocal(ffff8000005eb048,0) at in6_ifattach_linklocal+0x1ff
in6_ifattach(ffff8000005eb048) at in6_ifattach+0xef
ifioctl(fffffd810ec50ac0,801169ab,ffff800022747570,ffff800022782a80) at ifioctl
+0xd97
sys_ioctl(ffff800022782a80,ffff800022747680,ffff8000227476e0) at sys_ioctl+0x2c
4
syscall(ffff800022747750) at syscall+0x384
Xsyscall() at Xsyscall+0x128
end of kernel
end trace frame: 0x7f7ffffe1490, count: 2
https://www.openbsd.org/ddb.html describes the minimum info required in bug
reports.  Insufficient info makes it difficult to find and fix bugs.
ddb{1}>

This issue has already been fixed for iwx(4) in r1.113 of if_iwx.c.
Equivalent fix for iwm(4) below.

ok?

diff /usr/src
commit - 36eaeeee8d761cea6a70e9e97003c06b13843e25
path + /usr/src
blob - b7d37d7182e12521452a6d0ee178001ce2f9ba14
file + sys/dev/pci/if_iwm.c
--- sys/dev/pci/if_iwm.c
+++ sys/dev/pci/if_iwm.c
@@ -10358,9 +10358,6 @@ iwm_init(struct ifnet *ifp)
 
        generation = ++sc->sc_generation;
 
-       KASSERT(sc->task_refs.r_refs == 0);
-       refcnt_init(&sc->task_refs);
-
        err = iwm_preinit(sc);
        if (err)
                return err;
@@ -10374,7 +10371,7 @@ iwm_init(struct ifnet *ifp)
        err = iwm_init_hw(sc);
        if (err) {
                if (generation == sc->sc_generation)
-                       iwm_stop(ifp);
+                       iwm_stop_device(sc);
                return err;
        }
 
@@ -10383,6 +10380,8 @@ iwm_init(struct ifnet *ifp)
        if (sc->sc_nvm.sku_cap_11ac_enable)
                iwm_setup_vht_rates(sc);
 
+       KASSERT(sc->task_refs.r_refs == 0);
+       refcnt_init(&sc->task_refs);
        ifq_clr_oactive(&ifp->if_snd);
        ifp->if_flags |= IFF_RUNNING;
 

Reply via email to