aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx
diff options
context:
space:
mode:
authorIdo Yariv <ido@wizery.com>2011-04-18 16:44:11 +0300
committerLuciano Coelho <coelho@ti.com>2011-05-02 10:27:13 +0300
commitef2e3004855e90d2919105e4a91d7df6ab9845a9 (patch)
tree5961f34f1b5d7e27de8a674222f6aa28841f2341 /drivers/net/wireless/wl12xx
parentae825e4ba81203e1b3d3159f24327cdc2629dbd8 (diff)
downloadkernel_samsung_smdk4412-ef2e3004855e90d2919105e4a91d7df6ab9845a9.zip
kernel_samsung_smdk4412-ef2e3004855e90d2919105e4a91d7df6ab9845a9.tar.gz
kernel_samsung_smdk4412-ef2e3004855e90d2919105e4a91d7df6ab9845a9.tar.bz2
wl12xx: Restart TX when TX descriptors are available
The driver stops sending TX packets when either there aren't enough memory blocks, or it runs out of TX descriptors. The driver continues to send packets to the FW only when more memory blocks are available. The FW might free TX descriptors without freeing the corresponding memory blocks, especially when dynamic memory is enabled. In cases where memory blocks are not freed at all, the driver will keep waiting for more memory blocks indefinitely. Fix this by clearing the WL1271_FLAG_FW_TX_BUSY flag when there are available TX descriptors. Signed-off-by: Ido Yariv <ido@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx')
-rw-r--r--drivers/net/wireless/wl12xx/tx.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/tx.c b/drivers/net/wireless/wl12xx/tx.c
index c836659..cc837bb 100644
--- a/drivers/net/wireless/wl12xx/tx.c
+++ b/drivers/net/wireless/wl12xx/tx.c
@@ -65,6 +65,9 @@ static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
static void wl1271_free_tx_id(struct wl1271 *wl, int id)
{
if (__test_and_clear_bit(id, wl->tx_frames_map)) {
+ if (unlikely(wl->tx_frames_cnt == ACX_TX_DESCRIPTORS))
+ clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
+
wl->tx_frames[id] = NULL;
wl->tx_frames_cnt--;
}