diff options
author | Arik Nemtsov <arik@wizery.com> | 2012-02-27 22:41:32 (GMT) |
---|---|---|
committer | Luciano Coelho <coelho@ti.com> | 2012-02-28 11:25:09 (GMT) |
commit | 18aa755b84715f36e2811734f95cb822bcacfd89 (patch) | |
tree | a6db34428a267d3f453a9d38dd4009bda54ca6c0 /drivers/net/wireless/wl12xx/tx.c | |
parent | 49c9cd26445aa8bc8348c384c943b758c57c47a9 (diff) | |
download | linux-18aa755b84715f36e2811734f95cb822bcacfd89.tar.xz |
wl12xx: flush all Tx queues on tx_flush timeout
Ensure our queues are empty at the end of a tx_flush(), in case we
timeout on passively waiting for them. This makes sure no left-overs are
transmitted when we are on the wrong channel.
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx/tx.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/tx.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/tx.c b/drivers/net/wireless/wl12xx/tx.c index 6640c39..8f78fdd 100644 --- a/drivers/net/wireless/wl12xx/tx.c +++ b/drivers/net/wireless/wl12xx/tx.c @@ -1040,6 +1040,7 @@ void wl12xx_tx_reset(struct wl1271 *wl, bool reset_tx_queues) void wl1271_tx_flush(struct wl1271 *wl) { unsigned long timeout; + int i; timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT); while (!time_after(jiffies, timeout)) { @@ -1057,6 +1058,12 @@ void wl1271_tx_flush(struct wl1271 *wl) } wl1271_warning("Unable to flush all TX buffers, timed out."); + + /* forcibly flush all Tx buffers on our queues */ + mutex_lock(&wl->mutex); + for (i = 0; i < WL12XX_MAX_LINKS; i++) + wl1271_tx_reset_link_queues(wl, i); + mutex_unlock(&wl->mutex); } u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set) |