Make iwm_init() call iwm_stop() if we fail to move into SCAN state.
authorstsp <stsp@openbsd.org>
Tue, 20 Jul 2021 14:44:37 +0000 (14:44 +0000)
committerstsp <stsp@openbsd.org>
Tue, 20 Jul 2021 14:44:37 +0000 (14:44 +0000)
commit7ec08a8d192b070fdedad0c48e41882e82a34d91
tree9a2686190bdb439c2f67a7aabb993be1a7a24f93
parente6733efbf1a3e611c8519633af2f19745385a078
Make iwm_init() call iwm_stop() if we fail to move into SCAN state.

Generally, iwm_init() must either succeed or reset everything. In the case
I observed, the missing call to iwm_stop() left us with a non-zero refcount
for the newstate task which failed to perform the INIT -> SCAN transition.
The next ioctl request from userspace would then trigger a KASSERT in
iwm_init() which checks for old tasks that haven't run to completion.

This problem won't happen under normal conditions. It will happen if
the firmware crashes in response to a bad scan command, for instance.
I ran into this while working on support for newer iwx(4) firmware.
sys/dev/pci/if_iwm.c