diff options
author | Arik Nemtsov <arik@wizery.com> | 2011-08-14 12:17:32 +0200 |
---|---|---|
committer | Luciano Coelho <coelho@ti.com> | 2011-08-22 11:35:30 +0200 |
commit | bf54e301671a6ece6c94550294dc7faf14158cd3 (patch) | |
tree | d33066bcbeb014c3b14aee433619b307040e8879 /drivers/net/wireless/wl12xx/main.c | |
parent | wl12xx: don't remove key if hlid was already deleted (diff) | |
download | linux-bf54e301671a6ece6c94550294dc7faf14158cd3.tar.xz linux-bf54e301671a6ece6c94550294dc7faf14158cd3.zip |
wl12xx: track freed packets in FW by AC
Track the number of freed packets in each AC when receiving an interrupt
from the FW. This paves the way for tracking allocated packets per AC.
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/main.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/main.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c index c917f69f0069..09cecb336d53 100644 --- a/drivers/net/wireless/wl12xx/main.c +++ b/drivers/net/wireless/wl12xx/main.c @@ -814,6 +814,7 @@ static void wl12xx_fw_status(struct wl1271 *wl, struct timespec ts; u32 old_tx_blk_count = wl->tx_blocks_available; int avail, freed_blocks; + int i; wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false); @@ -824,6 +825,15 @@ static void wl12xx_fw_status(struct wl1271 *wl, status->drv_rx_counter, status->tx_results_counter); + for (i = 0; i < NUM_TX_QUEUES; i++) { + /* prevent wrap-around in freed-packets counter */ + wl->tx_allocated_pkts -= + (status->tx_released_pkts[i] - + wl->tx_pkts_freed[i]) & 0xff; + + wl->tx_pkts_freed[i] = status->tx_released_pkts[i]; + } + freed_blocks = le32_to_cpu(status->total_released_blks) - wl->tx_blocks_freed; wl->tx_blocks_freed = le32_to_cpu(status->total_released_blks); @@ -1934,7 +1944,7 @@ out: static void __wl1271_op_remove_interface(struct wl1271 *wl, bool reset_tx_queues) { - int ret; + int ret, i; wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface"); @@ -2050,6 +2060,10 @@ deinit: wl->tx_blocks_freed = 0; + wl->tx_allocated_pkts = 0; + for (i = 0; i < NUM_TX_QUEUES; i++) + wl->tx_pkts_freed[i] = 0; + wl1271_debugfs_reset(wl); kfree(wl->fw_status); |