mwifiex: fix kernel crash after shutdown command timeout
authorBrian Norris <briannorris@chromium.org>
Thu, 16 Mar 2017 21:36:07 +0000 (14:36 -0700)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 20 Mar 2017 17:09:20 +0000 (19:09 +0200)
commit5caa7f384629eb2b02f2289ffea1277a401adfcb
tree8481e8d5c8b7a15968e231c74ed80f5a595a3ce9
parent0a5cc49750b89717ad02abf132aa119743c0e5d4
mwifiex: fix kernel crash after shutdown command timeout

We observed a SHUTDOWN command timeout during reboot stress test due to
a corner case firmware bug. It can lead to either a use-after-free +
OOPS (on either the adapter structure, or the 'card' structure) or an
abort (where, e.g., the PCI device is "disabled" before we're done
dumping the FW).

We can avoid this by canceling/flushing the FW dump work:

(a) after we've terminated all other work queues (e.g., for processing
    commands which could time out)
(b) after we've disabled all interrupts (which could also queue more
    work for us)
(c) after we've unregistered the netdev and wiphy structures (and
    implicitly, and debugfs entries which could manually trigger FW dumps)
(d) before we've actually disabled the device (e.g.,
    pci_device_disable())

Altogether, this means no card->work will be scheduled if we sync at
a point that satisfies the above. This can be done at the beginning of
the .cleanup_if() callback.

Signed-off-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/pcie.c
drivers/net/wireless/marvell/mwifiex/sdio.c