]> git.karo-electronics.de Git - karo-tx-linux.git/commit
ath9k_htc: fix data race between request_firmware_nowait() callback and suspend()
authorAlexey Khoroshilov <khoroshilov@ispras.ru>
Mon, 1 Jul 2013 20:43:42 +0000 (00:43 +0400)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 15 Jul 2013 18:08:47 +0000 (14:08 -0400)
commit53e5946a5a8df3fe7fb1f9cef4d1a48092c2234a
treea000972fd36f649a7ac42de07d1f4dc0b060e1a7
parent6bde1be33e82f726cedbd602af2e979663d3efdf
ath9k_htc: fix data race between request_firmware_nowait() callback and suspend()

ath9k_hif_usb_probe() requests firmware asynchronically and
there is some initialization postponed till firmware is ready.
In particular, ath9k_hif_usb_firmware_cb() callback initializes
hif_dev->tx.tx_buf and hif_dev->tx.tx_pending lists.

At the same time, ath9k_hif_usb_suspend() iterates that lists through
ath9k_hif_usb_dealloc_urbs(). If suspend happens before request_firmware_nowait()
callback is called, it can lead to oops.

Similar issue could be in ath9k_hif_usb_disconnect(), but it is prevented
using hif_dev->fw_done completion and HIF_USB_READY flag. The patch extends
this approach to suspend() as well.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hif_usb.c