diff options
author | Arik Nemtsov <arik@wizery.com> | 2011-08-14 10:17:34 (GMT) |
---|---|---|
committer | Luciano Coelho <coelho@ti.com> | 2011-08-22 09:35:30 (GMT) |
commit | bdf91cfae66dd76a093c75cac8f6ada12fd21b83 (patch) | |
tree | 58f07c4eda2091cc51666093a9318de141e6b361 | |
parent | 742246f8bc16c3a1a556c68ca2fabca162d14c24 (diff) | |
download | linux-fsl-qoriq-bdf91cfae66dd76a093c75cac8f6ada12fd21b83.tar.xz |
wl12xx: handle wrap-around overflow in released Tx blocks FW counter
When the FW Tx released blocks counter wraps around, we should correct
our calculation of released blocks. Otherwise we add a large negative
figure to our driver freed blocks counter
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
-rw-r--r-- | drivers/net/wireless/wl12xx/main.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c index 027b674..0fa3a22 100644 --- a/drivers/net/wireless/wl12xx/main.c +++ b/drivers/net/wireless/wl12xx/main.c @@ -834,8 +834,15 @@ static void wl12xx_fw_status(struct wl1271 *wl, wl->tx_pkts_freed[i] = status->tx_released_pkts[i]; } - freed_blocks = le32_to_cpu(status->total_released_blks) - - wl->tx_blocks_freed; + /* prevent wrap-around in total blocks counter */ + if (likely(wl->tx_blocks_freed <= + le32_to_cpu(status->total_released_blks))) + freed_blocks = le32_to_cpu(status->total_released_blks) - + wl->tx_blocks_freed; + else + freed_blocks = 0x100000000LL - wl->tx_blocks_freed + + le32_to_cpu(status->total_released_blks); + wl->tx_blocks_freed = le32_to_cpu(status->total_released_blks); wl->tx_allocated_blocks -= freed_blocks; |