]> git.baikalelectronics.ru Git - kernel.git/commit
cw1200: Don't perform SPI transfers in interrupt context
authorSolomon Peachy <pizza@shaftnet.org>
Wed, 28 Aug 2013 00:29:46 +0000 (20:29 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 9 Sep 2013 18:40:53 +0000 (14:40 -0400)
commit987489e2e1d36522d0a513e5070a7b775fdea07b
tree584e2a99402483e16d6145bdf1d29416a1a0abce
parentc991289b02564ffd8c5c171af405717c37f72639
cw1200: Don't perform SPI transfers in interrupt context

When we get an interrupt from the hardware, the first thing the driver does
is tell the device to mask off the interrupt line.  Unfortunately this
involves a SPI transaction in interrupt context.  Some (most?) SPI
controllers perform the transfer asynchronously and try to sleep.
This is bad, and triggers a BUG().

So, work around this by using adding a hwbus hook for the cw1200 driver
core to call.  The cw1200_spi driver translates this into
irq_disable()/irq_enable() calls instead, which can safely be called in
interrupt context.

Apparently the platforms I used to develop the cw1200_spi driver used
synchronous spi_sync() implementations, which is why this didn't surface
until now.

Many thanks to Dave Sizeburns for the inital bug report and his services
as a tester.

Signed-off-by: Solomon Peachy <pizza@shaftnet.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/cw1200/cw1200_spi.c
drivers/net/wireless/cw1200/fwio.c
drivers/net/wireless/cw1200/hwbus.h
drivers/net/wireless/cw1200/hwio.c