aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/cmd.c
diff options
context:
space:
mode:
authorArik Nemtsov <arik@wizery.com>2012-03-03 15:18:00 -0500
committerLuciano Coelho <coelho@ti.com>2012-03-08 07:25:18 -0500
commit55df5afb13718cda49128fa5985556df91d07765 (patch)
treebb6c9279e12b90af623ba6ea4b17ea85f679e251 /drivers/net/wireless/wl12xx/cmd.c
parent8ccd16e6cb17a1e961617cc67798bbb222e4cd13 (diff)
wl12xx: implement SW Tx watchdog
Track freed FW blocks during Tx. If no blocks were freed during a predefined timeout, initiate a HW recovery. This helps in situations when the FW watchdog fails. Don't trigger recovery during activities that can temporarily stop Tx. This includes: - scanning - buffering packets for sleeping stations (AP role) - ROC on any role Signed-off-by: Arik Nemtsov <arik@wizery.com> Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx/cmd.c')
-rw-r--r--drivers/net/wireless/wl12xx/cmd.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c
index 1ef212f6440f..3414fc11e9ba 100644
--- a/drivers/net/wireless/wl12xx/cmd.c
+++ b/drivers/net/wireless/wl12xx/cmd.c
@@ -1818,6 +1818,14 @@ int wl12xx_croc(struct wl1271 *wl, u8 role_id)
1818 goto out; 1818 goto out;
1819 1819
1820 __clear_bit(role_id, wl->roc_map); 1820 __clear_bit(role_id, wl->roc_map);
1821
1822 /*
1823 * Rearm the tx watchdog when removing the last ROC. This prevents
1824 * recoveries due to just finished ROCs - when Tx hasn't yet had
1825 * a chance to get out.
1826 */
1827 if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES)
1828 wl12xx_rearm_tx_watchdog_locked(wl);
1821out: 1829out:
1822 return ret; 1830 return ret;
1823} 1831}