zd1211rw: detect stalled beacon interrupt faster
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>
Mon, 20 Jun 2011 11:42:54 +0000 (14:42 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Jun 2011 20:09:47 +0000 (16:09 -0400)
As USB_INT_ID_RETRY_FAILED can override USB_INT_ID_REGS, beacon interrupt
(CR_INTERRUPT) might be lost. Problem is that when device trigger CR_INTERRUPT
it disables HW interrupt. Now if USB_INT_ID_REGS with CR_INTERRUPT gets lost,
beacon interrupt stays disabled until beacon watchdog notices the stall. This
happen very often on heavy TX. Improve watchdog to trigger earlier, after three
missing beacon interrupts.

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/zd1211rw/zd_mac.c

index b67c52d9c36c0e81571ef93f3e6769d1766ef9c0..cabfae1e70b14027e5e5d381783590869c23f0d8 100644 (file)
@@ -1429,7 +1429,8 @@ static void beacon_watchdog_handler(struct work_struct *work)
        spin_lock_irq(&mac->lock);
        interval = mac->beacon.interval;
        period = mac->beacon.period;
-       timeout = mac->beacon.last_update + msecs_to_jiffies(interval) + HZ;
+       timeout = mac->beacon.last_update +
+                       msecs_to_jiffies(interval * 1024 / 1000) * 3;
        spin_unlock_irq(&mac->lock);
 
        if (interval > 0 && time_is_before_jiffies(timeout)) {