linux/drivers/net/wireless
Emmanuel Grumbach a6bd005fe9 iwlwifi: pcie: fix RF-Kill vs. firmware load race
When we load the firmware, we hold trans_pcie->mutex to
avoid nested flows. We also rely on the ISR to wake up the
thread when the DMA has finished copying a chunk. During
this flow, we enable the RF-Kill interrupt.

The problem is that the RF-Kill interrupt handler can take
the mutex and bring the device down. This means that if
we load the firmware while the RF-Kill switch is enabled
(which will happen when we load the INIT firmware to read
the device's capabilities and register to mac80211), we
may get an RF-Kill interrupt immediately and the ISR will
be waiting for the mutex held by the thread that is
currently loading the firmware. At this stage, the ISR
won't be able to service the DMA's interrupt needed to
wake up the thread that load the firmware. We are in a
deadlock situation which ends when the thread that loads
the firmware fails on timeout and releases the mutex.

To fix this, take the mutex later in the flow, disable
the interrupts and synchronize_irq() to give a chance to
the RF-Kill interrupt to run and complete.
After that, mask all the interrupts besides the DMA
interrupt and proceed with firmware load. Make sure to
check that there was no RF-Kill interrupt when the
interrupts were disabled.

This fixes https://bugzilla.kernel.org/show_bug.cgi?id=111361

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
2016-02-15 13:38:25 +02:00
..
admtek adm80211: move under admtek vendor directory 2015-11-17 19:49:19 +02:00
ath Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2016-01-12 18:57:02 -08:00
atmel atmel: move under atmel vendor directory 2015-11-18 11:19:07 +02:00
broadcom brcmfmac: Do not handle link downs for ibss. 2016-01-08 10:44:48 +02:00
cisco wireless: airo: re-use mac_pton() 2015-11-30 14:59:28 +02:00
intel iwlwifi: pcie: fix RF-Kill vs. firmware load race 2016-02-15 13:38:25 +02:00
intersil prism54: fix checks for dma mapping errors 2015-12-31 10:23:32 +02:00
marvell Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2016-01-12 18:57:02 -08:00
mediatek mediatek: unify Kconfig with other vendors 2015-11-18 14:28:31 +02:00
ralink rt2x00pci: Disable memory-write-invalidate when the driver exits 2016-01-07 11:22:46 +02:00
realtek rtlwifi: rtl_pci: Fix kernel panic 2015-12-30 17:36:05 +02:00
rsi rsi: bool tests do not need comparison 2015-12-30 17:34:26 +02:00
st cw1200: remove some dead code 2015-12-11 13:15:08 +02:00
ti Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2016-01-12 18:57:02 -08:00
zydas zd1211rw: move under zydas vendor directory 2015-11-18 14:28:30 +02:00
Kconfig mac80211_hwsim: move Kconfig entry for sorting alphabetically 2015-11-18 15:23:36 +02:00
mac80211_hwsim.c mac80211_hwsim: check ATTR_FREQ for wmediumd (netlink) packets 2015-12-04 14:43:32 +01:00
mac80211_hwsim.h
Makefile ath: unify Kconfig with other vendors 2015-11-18 14:28:31 +02:00
ray_cs.c ray_cs: Change 1 to true for bool type variable. 2015-06-02 23:30:14 +03:00
ray_cs.h
rayctl.h
rndis_wlan.c rndis_wlan: fix checking for default value 2015-09-22 16:14:32 -07:00
wl3501_cs.c
wl3501.h