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;