[PATCH v2] ath11k: add signal report to mac80211 for QCA6390 and WCN6855

Jeff Johnson quic_jjohnson at quicinc.com
Thu Dec 16 15:32:31 PST 2021


On 12/15/2021 11:05 PM, Wen Gong wrote:
> IEEE80211_HW_USES_RSS is set in ath11k, then the device uses RSS and
> thus requires parallel RX which implies using per-CPU station statistics
> in sta_get_last_rx_stats() of mac80211. Currently signal is only set in
> ath11k_mgmt_rx_event(), and not set for RX data packet, then it show
> signal as 0 for iw command easily.
> 
> Change to get signal from firmware and report to mac80211.
> 
> For QCA6390 and WCN6855, the rssi value is already in dbm unit, so
> don't need to convert it again.
> 
> Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
> Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
> 
> Signed-off-by: Wen Gong <quic_wgong at quicinc.com>
> ---
> v2:
>      1. rebased to ath.git ath-202112141538
>      2. change commit log
> depends on patch "[v6] ath11k: report rssi of each chain to mac80211 for QCA6390/WCN6855"
> https://patchwork.kernel.org/project/linux-wireless/patch/20211215090944.19729-1-quic_wgong@quicinc.com/
> 
>   drivers/net/wireless/ath/ath11k/core.h |  1 +
>   drivers/net/wireless/ath/ath11k/mac.c  | 22 ++++++++++--
>   drivers/net/wireless/ath/ath11k/wmi.c  | 49 +++++++++++++++++++++-----
>   3 files changed, 61 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h
> index 170fc8e66c90..aa6d51d17e31 100644
> --- a/drivers/net/wireless/ath/ath11k/core.h
> +++ b/drivers/net/wireless/ath/ath11k/core.h
> @@ -385,6 +385,7 @@ struct ath11k_sta {
>   	u64 rx_duration;
>   	u64 tx_duration;
>   	u8 rssi_comb;
> +	s8 rssi_beacon;
>   	s8 chain_signal[IEEE80211_MAX_CHAINS];
>   	struct ath11k_htt_tx_stats *tx_stats;
>   	struct ath11k_rx_peer_stats *rx_stats;
> diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
> index ef4859a5887b..f135a3dd2f4e 100644
> --- a/drivers/net/wireless/ath/ath11k/mac.c
> +++ b/drivers/net/wireless/ath/ath11k/mac.c
> @@ -7811,6 +7811,9 @@ static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
>   {
>   	struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
>   	struct ath11k *ar = arsta->arvif->ar;
> +	s8 signal;
> +	bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
> +			       ar->ab->wmi_ab.svc_map);
>   
>   	sinfo->rx_duration = arsta->rx_duration;
>   	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
> @@ -7843,9 +7846,22 @@ static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
>   		ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
>   	}
>   
> -	/* TODO: Use real NF instead of default one. */
> -	sinfo->signal = arsta->rssi_comb + ATH11K_DEFAULT_NOISE_FLOOR;
> -	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
> +	signal = arsta->rssi_comb;
> +	if (!signal &&
> +	    arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
> +	    ar->ab->hw_params.supports_rssi_stats &&
> +	    !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
> +					WMI_REQUEST_VDEV_STAT)))

what happens when CONFIG_ATH11K_DEBUGFS is not enabled?
should the logic to get the stats be decoupled from DebugFS support?


> +		signal = arsta->rssi_beacon;
> +
> +	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
> +		   "mac sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
> +		   db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
> +
> +	if (signal) {
> +		sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
> +		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
> +	}
>   }
>   
>   static const struct ieee80211_ops ath11k_ops = {
> diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c
> index b7bdc37f24fd..6d92bb9483be 100644
> --- a/drivers/net/wireless/ath/ath11k/wmi.c
> +++ b/drivers/net/wireless/ath/ath11k/wmi.c
> @@ -5639,7 +5639,11 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
>   {
>   	struct ath11k_fw_stats *stats = parse->stats;
>   	const struct wmi_stats_event *ev = parse->ev;
> -	int i;
> +	struct ath11k *ar;
> +	struct ath11k_vif *arvif;
> +	struct ieee80211_sta *sta;
> +	struct ath11k_sta *arsta;
> +	int i, ret = 0;
>   	const void *data = ptr;
>   
>   	if (!ev) {
> @@ -5649,13 +5653,19 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
>   
>   	stats->stats_id = 0;
>   
> +	rcu_read_lock();
> +
> +	ar = ath11k_mac_get_ar_by_pdev_id(ab, ev->pdev_id);
> +
>   	for (i = 0; i < ev->num_pdev_stats; i++) {
>   		const struct wmi_pdev_stats *src;
>   		struct ath11k_fw_stats_pdev *dst;
>   
>   		src = data;
> -		if (len < sizeof(*src))
> -			return -EPROTO;
> +		if (len < sizeof(*src)) {
> +			ret = -EPROTO;
> +			goto exit;
> +		}
>   
>   		stats->stats_id = WMI_REQUEST_PDEV_STAT;
>   
> @@ -5677,11 +5687,30 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
>   		struct ath11k_fw_stats_vdev *dst;
>   
>   		src = data;
> -		if (len < sizeof(*src))
> -			return -EPROTO;
> +		if (len < sizeof(*src)) {
> +			ret = -EPROTO;
> +			goto exit;
> +		}
>   
>   		stats->stats_id = WMI_REQUEST_VDEV_STAT;
>   
> +		arvif = ath11k_mac_get_arvif(ar, src->vdev_id);
> +		if (arvif) {
> +			sta = ieee80211_find_sta_by_ifaddr(ar->hw,
> +							   arvif->bssid,
> +							   NULL);
> +			if (sta) {
> +				arsta = (struct ath11k_sta *)sta->drv_priv;
> +				arsta->rssi_beacon = src->beacon_snr;
> +				ath11k_dbg(ab, ATH11K_DBG_WMI,
> +					   "wmi stats vdev id %d snr %d\n",
> +					   src->vdev_id, src->beacon_snr);
> +			} else {
> +				ath11k_warn(ab, "not found station for bssid %pM\n",
> +					    arvif->bssid);
> +			}
> +		}
> +
>   		data += sizeof(*src);
>   		len -= sizeof(*src);
>   
> @@ -5698,8 +5727,10 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
>   		struct ath11k_fw_stats_bcn *dst;
>   
>   		src = data;
> -		if (len < sizeof(*src))
> -			return -EPROTO;
> +		if (len < sizeof(*src)) {
> +			ret = -EPROTO;
> +			goto exit;
> +		}
>   
>   		stats->stats_id = WMI_REQUEST_BCN_STAT;
>   
> @@ -5714,7 +5745,9 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
>   		list_add_tail(&dst->list, &stats->bcn);
>   	}
>   
> -	return 0;
> +exit:
> +	rcu_read_unlock();
> +	return ret;
>   }
>   
>   static int ath11k_wmi_tlv_fw_stats_parse(struct ath11k_base *ab,
> 
> base-commit: f21e9b6adc354bfa274d4510df602f081a08194e
> prerequisite-patch-id: ea323ac33f40186a1950044c1997e9c4509c5725
> 




More information about the ath11k mailing list