--- a/drivers/net/wireless/ti/wlcore/main.c 2012-09-06 08:35:44.821870411 -0700 +++ b/drivers/net/wireless/ti/wlcore/main.c 2012-09-06 08:38:32.994704341 -0700 @@ -5234,6 +5234,11 @@ static irqreturn_t wl12xx_hardirq(int irq, void *cookie) { + return IRQ_WAKE_THREAD; +} + +static irqreturn_t wl1271_irq_special(int irq, void *cookie) +{ struct wl1271 *wl = cookie; unsigned long flags; @@ -5253,12 +5258,10 @@ wl1271_debug(DEBUG_IRQ, "should not enqueue work"); disable_irq_nosync(wl->irq); pm_wakeup_event(wl->dev, 0); - spin_unlock_irqrestore(&wl->wl_lock, flags); - return IRQ_HANDLED; } spin_unlock_irqrestore(&wl->wl_lock, flags); - return IRQ_WAKE_THREAD; + return wl1271_irq(irq, cookie); } int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev) @@ -5292,7 +5295,7 @@ else irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT; - ret = request_threaded_irq(wl->irq, wl12xx_hardirq, wl1271_irq, + ret = request_threaded_irq(wl->irq, wl12xx_hardirq, wl1271_irq_special, irqflags, pdev->name, wl); if (ret < 0) {