ath10k: add accounting for the extended peer statistics
authorChristian Lamparter <chunkeey@googlemail.com>
Mon, 5 Dec 2016 21:52:45 +0000 (22:52 +0100)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 13 Jan 2017 13:27:37 +0000 (15:27 +0200)
The 10.4 firmware adds extended peer information to the
firmware's statistics payload. This additional info is
stored as a separate data field and the elements are
stored in their own "peers_extd" list.

These elements can pile up in the same way as the peer
information elements. This is because the
ath10k_wmi_10_4_op_pull_fw_stats() function tries to
pull the same amount (num_peer_stats) for every statistic
data unit.

Fixes: 4a49ae94a448faa ("ath10k: fix 10.4 extended peer stats update")
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/debug.c

index e1a70dffc52a80a351eb45a04c0e576333a3769e..b882b0892dcfa7b235764c32db137a19a3f29898 100644 (file)
@@ -400,6 +400,7 @@ void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
                         * prevent firmware from DoS-ing the host.
                         */
                        ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers);
+                       ath10k_fw_extd_stats_peers_free(&ar->debug.fw_stats.peers_extd);
                        ath10k_warn(ar, "dropping fw peer stats\n");
                        goto free;
                }
@@ -410,10 +411,12 @@ void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
                        goto free;
                }
 
+               if (!list_empty(&stats.peers))
+                       list_splice_tail_init(&stats.peers_extd,
+                                             &ar->debug.fw_stats.peers_extd);
+
                list_splice_tail_init(&stats.peers, &ar->debug.fw_stats.peers);
                list_splice_tail_init(&stats.vdevs, &ar->debug.fw_stats.vdevs);
-               list_splice_tail_init(&stats.peers_extd,
-                                     &ar->debug.fw_stats.peers_extd);
        }
 
        complete(&ar->debug.fw_stats_complete);