aboutsummaryrefslogtreecommitdiff
path: root/drivers/net/wireless/wl12xx/io.h
diff options
context:
space:
mode:
authorIdo Yariv <ido@wizery.com>2011-03-01 15:14:41 +0200
committerLuciano Coelho <coelho@ti.com>2011-03-03 16:10:46 +0200
commita620865edf62ea2d024bbfe62162244473badfcb (patch)
tree5eb75c0c194cba0e40fa9dc9b6bd01cadff83bf9 /drivers/net/wireless/wl12xx/io.h
parent393fb560d328cc06e6a5c7b7473901ad724f82e7 (diff)
wl12xx: Switch to a threaded interrupt handler
To achieve maximal throughput, it is very important to react to interrupts as soon as possible. Currently the interrupt handler wakes up a worker for handling interrupts in process context. A cleaner and more efficient design would be to request a threaded interrupt handler. This handler's priority is very high, and can do blocking operations such as SDIO/SPI transactions. Some work can be deferred, mostly calls to mac80211 APIs (ieee80211_rx_ni and ieee80211_tx_status). By deferring such work to a different worker, we can keep the irq handler thread more I/O responsive. In addition, on multi-core systems the two threads can be scheduled on different cores, which will improve overall performance. The use of WL1271_FLAG_IRQ_PENDING & WL1271_FLAG_IRQ_RUNNING was changed. For simplicity, always query the FW for more pending interrupts. Since there are relatively long bursts of interrupts, the extra FW status read overhead is negligible. In addition, this enables registering the IRQ handler with the ONESHOT option. Signed-off-by: Ido Yariv <ido@wizery.com> Reviewed-by: Luciano Coelho <coelho@ti.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx/io.h')
-rw-r--r--drivers/net/wireless/wl12xx/io.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/io.h b/drivers/net/wireless/wl12xx/io.h
index 844b32b170b..c1aac829208 100644
--- a/drivers/net/wireless/wl12xx/io.h
+++ b/drivers/net/wireless/wl12xx/io.h
@@ -168,5 +168,6 @@ void wl1271_unregister_hw(struct wl1271 *wl);
int wl1271_init_ieee80211(struct wl1271 *wl);
struct ieee80211_hw *wl1271_alloc_hw(void);
int wl1271_free_hw(struct wl1271 *wl);
+irqreturn_t wl1271_irq(int irq, void *data);
#endif