]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ath12k: add support of station average signal strength
authorNicolas Escande <nico.escande@gmail.com>
Sat, 1 Feb 2025 21:13:01 +0000 (22:13 +0100)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Tue, 11 Feb 2025 15:27:08 +0000 (07:27 -0800)
This adds support for reporting to the kernel the average rssi. This is
done the same way as it was done in ath11k. A simple ewma (with the same
parameters) is updated with each rssi update.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1

Signed-off-by: Nicolas Escande <nico.escande@gmail.com>
Reviewed-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Link: https://patch.msgid.link/20250201211301.357985-1-nico.escande@gmail.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/dp_mon.c
drivers/net/wireless/ath/ath12k/mac.c

index 57e71ccbbb674c04ff4033569b7e5e9baea013bf..3dcdedf9e9de1e6281d1db036d1a2a46df7da724 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/ctype.h>
 #include <linux/firmware.h>
 #include <linux/panic_notifier.h>
+#include <linux/average.h>
 #include "qmi.h"
 #include "htc.h"
 #include "wmi.h"
@@ -483,6 +484,8 @@ struct ath12k_wbm_tx_stats {
        u64 wbm_tx_comp_stats[HAL_WBM_REL_HTT_TX_COMP_STATUS_MAX];
 };
 
+DECLARE_EWMA(avg_rssi, 10, 8)
+
 struct ath12k_link_sta {
        struct ath12k_link_vif *arvif;
        struct ath12k_sta *ahsta;
@@ -502,6 +505,7 @@ struct ath12k_link_sta {
        u64 rx_duration;
        u64 tx_duration;
        u8 rssi_comb;
+       struct ewma_avg_rssi avg_rssi;
        u8 link_id;
        struct ath12k_rx_peer_stats *rx_stats;
        struct ath12k_wbm_tx_stats *wbm_tx_stats;
index 4e9a60181c06704d36e17088f005d61dab1a0ea8..d529229f2d0fa309316017ace2849395758d1f21 100644 (file)
@@ -2002,6 +2002,7 @@ static void ath12k_dp_mon_rx_update_peer_su_stats(struct ath12k *ar,
                return;
 
        arsta->rssi_comb = ppdu_info->rssi_comb;
+       ewma_avg_rssi_add(&arsta->avg_rssi, ppdu_info->rssi_comb);
 
        num_msdu = ppdu_info->tcp_msdu_count + ppdu_info->tcp_ack_msdu_count +
                   ppdu_info->udp_msdu_count + ppdu_info->other_msdu_count;
@@ -2174,6 +2175,7 @@ ath12k_dp_mon_rx_update_user_stats(struct ath12k *ar,
                return;
 
        arsta->rssi_comb = ppdu_info->rssi_comb;
+       ewma_avg_rssi_add(&arsta->avg_rssi, ppdu_info->rssi_comb);
 
        num_msdu = user_stats->tcp_msdu_count + user_stats->tcp_ack_msdu_count +
                   user_stats->udp_msdu_count + user_stats->other_msdu_count;
index 16e6f2fae943d3fa6a46ab1ba6780c9070418279..fc5cfd860d4d6bd5f41dbdea9411119a8f8298f3 100644 (file)
@@ -5519,6 +5519,7 @@ static int ath12k_mac_station_add(struct ath12k *ar,
                }
        }
 
+       ewma_avg_rssi_init(&arsta->avg_rssi);
        return 0;
 
 free_peer:
@@ -10197,6 +10198,13 @@ static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
                sinfo->signal = db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
        }
+
+       sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
+
+       if (!db2dbm)
+               sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
+
+       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
 }
 
 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,