wl12xx: track freed packets in FW by AC
authorArik Nemtsov <arik@wizery.com>
Sun, 14 Aug 2011 10:17:32 +0000 (13:17 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 22 Aug 2011 09:35:30 +0000 (12:35 +0300)
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>
drivers/net/wireless/wl12xx/main.c
drivers/net/wireless/wl12xx/tx.c
drivers/net/wireless/wl12xx/wl12xx.h

index c917f69f0069c07ed3d77b52ed34dbc6c63a9e0c..09cecb336d5398f59ddcf78f38db3424657b12b6 100644 (file)
@@ -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);
index 8fdffd08d492e4d9c5f65a459d42e777b378c9a1..7dd6d8b94f649c8e5f474186bac5451c3c7bd4cd 100644 (file)
@@ -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;
 
index 416d68ed95cf6d46b6bed15ea2c9cb17bf071491..24b40251535b5717a6d03503a938d6cf16c00ee6 100644 (file)
@@ -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];
@@ -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;