diff mbox series

[v2] wifi: ath12k: add support of station average signal strength

Message ID 20250121093834.25132-1-nico.escande@gmail.com (mailing list archive)
State New
Delegated to: Kalle Valo
Headers show
Series [v2] wifi: ath12k: add support of station average signal strength | expand

Commit Message

Nicolas Escande Jan. 21, 2025, 9:38 a.m. UTC
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>
---
v2:
  - removed spurious exta new line at the beggining of core.h

v1: https://lore.kernel.org/ath12k/20250117172819.3357534-1-nico.escande@gmail.com/
  - initial version
---
 drivers/net/wireless/ath/ath12k/core.h   | 4 ++++
 drivers/net/wireless/ath/ath12k/dp_mon.c | 2 ++
 drivers/net/wireless/ath/ath12k/mac.c    | 5 +++++
 3 files changed, 11 insertions(+)

Comments

Vasanthakumar Thiagarajan Jan. 21, 2025, 10:27 a.m. UTC | #1
On 1/21/2025 3:08 PM, Nicolas Escande wrote:
> 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>
> ---
> v2:
>    - removed spurious exta new line at the beggining of core.h
> 
> v1: https://lore.kernel.org/ath12k/20250117172819.3357534-1-nico.escande@gmail.com/
>    - initial version
> ---
>   drivers/net/wireless/ath/ath12k/core.h   | 4 ++++
>   drivers/net/wireless/ath/ath12k/dp_mon.c | 2 ++
>   drivers/net/wireless/ath/ath12k/mac.c    | 5 +++++
>   3 files changed, 11 insertions(+)
> 
> diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h
> index ee595794a7aee..83af4381b79ff 100644
> --- a/drivers/net/wireless/ath/ath12k/core.h
> +++ b/drivers/net/wireless/ath/ath12k/core.h
> @@ -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"
> @@ -477,6 +478,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;
> @@ -496,6 +499,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;
> diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c
> index 5a21961cfd465..e53d5674b4368 100644
> --- a/drivers/net/wireless/ath/ath12k/dp_mon.c
> +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c
> @@ -2157,6 +2157,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;
> @@ -2329,6 +2330,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;
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index 2d062b5904a8e..5be8cf0e41279 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -5403,6 +5403,7 @@ static int ath12k_mac_station_add(struct ath12k *ar,
>   		}
>   	}
>   
> +	ewma_avg_rssi_init(&arsta->avg_rssi);
>   	return 0;
>   
>   free_peer:
> @@ -10054,6 +10055,10 @@ static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
>   	/* TODO: Use real NF instead of default one. */
>   	sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
>   	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
> +
> +	sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
> +		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,


Reviewed-by: Vasanthakumar Thiagarajan <quic_vthiagar@quicinc.com>
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h
index ee595794a7aee..83af4381b79ff 100644
--- a/drivers/net/wireless/ath/ath12k/core.h
+++ b/drivers/net/wireless/ath/ath12k/core.h
@@ -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"
@@ -477,6 +478,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;
@@ -496,6 +499,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;
diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c
index 5a21961cfd465..e53d5674b4368 100644
--- a/drivers/net/wireless/ath/ath12k/dp_mon.c
+++ b/drivers/net/wireless/ath/ath12k/dp_mon.c
@@ -2157,6 +2157,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;
@@ -2329,6 +2330,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;
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 2d062b5904a8e..5be8cf0e41279 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -5403,6 +5403,7 @@  static int ath12k_mac_station_add(struct ath12k *ar,
 		}
 	}
 
+	ewma_avg_rssi_init(&arsta->avg_rssi);
 	return 0;
 
 free_peer:
@@ -10054,6 +10055,10 @@  static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
 	/* TODO: Use real NF instead of default one. */
 	sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
+
+	sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
+		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,