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 <[email protected]>
Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Luciano Coelho <[email protected]>
This commit is contained in:
Arik Nemtsov 2011-08-14 13:17:34 +03:00 • committed by Luciano Coelho
commit bdf91cfae6

View file

@ -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;