Skip to content

Commit

Permalink
wl12xx: track freed packets in FW by AC
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Arik Nemtsov authored and Luciano Coelho committed Aug 22, 2011
1 parent 010d3d3 commit bf54e30
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 3 deletions.
16 changes: 15 additions & 1 deletion drivers/net/wireless/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);
Expand Down Expand Up @@ -1934,7 +1944,7 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
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");

Expand Down Expand Up @@ -2050,6 +2060,10 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,

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);
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/wireless/wl12xx/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
wl->tx_blocks_available -= total_blocks;
wl->tx_allocated_blocks += total_blocks;

wl->tx_allocated_pkts++;

if (wl->bss_type == BSS_TYPE_AP_BSS)
wl->links[hlid].allocated_blks += total_blocks;

Expand Down
8 changes: 6 additions & 2 deletions drivers/net/wireless/wl12xx/wl12xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,8 +268,8 @@ struct wl12xx_fw_status {
/* Size (in Memory Blocks) of TX pool */
__le32 tx_total;

/* Cumulative counter of released mem-blocks per AC */
u8 tx_released_blks[NUM_TX_QUEUES];
/* Cumulative counter of released packets per AC */
u8 tx_released_pkts[NUM_TX_QUEUES];

/* Cumulative counter of freed MBs per HLID */
u8 tx_lnk_free_blks[WL12XX_MAX_LINKS];
Expand Down Expand Up @@ -422,6 +422,10 @@ struct wl1271 {
u32 tx_allocated_blocks;
u32 tx_results_count;

/* Accounting for allocated / available Tx packets in HW */
u32 tx_pkts_freed[NUM_TX_QUEUES];
u32 tx_allocated_pkts;

/* Transmitted TX packets counter for chipset interface */
u32 tx_packets_count;

Expand Down

0 comments on commit bf54e30

Please sign in to comment.