Search Linux Wireless

Re: [PATCH] wifi: ath12k: support average ack rssi in station dump

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/14/2024 5:49 AM, Sowmiya Sree Elavalagan wrote:
> From: Sivashankari Madhavan <quic_sivamadh@xxxxxxxxxxx>
> 
> Currently, the ACK RSSI value is not shown in station dump. Enable WMI
> resource flag for ACK RSSI in WMI INIT command to add ACK RSSI value in
> management TX completion event from WMI. Update ACK RSSI value obtained
> in management and data frame completion path to ieee80211_tx_info. Also
> advertise NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT flag during hardware
> register to mac80211 layer so that ACK RSSI is added to station dump
> message.
> 
> Example output :
> Station 00:03:7f:12:cc:cc (on wlo1)
>         inactive time:  600 ms
>         rx bytes:       288106
>         rx packets:     1446
>         tx bytes:       41818
>         tx packets:     342
>         tx retries:     64
>         tx failed:      0
>         beacon loss:    0
>         beacon rx:      602
>         rx drop misc:   51
>         signal:         0 dBm
>         beacon signal avg:      -44 dBm
>         tx duration:    0 us
>         rx bitrate:     1441.1 MBit/s 80MHz HE-MCS 9 HE-NSS 3 HE-GI 0 HE-DCM 0
>         rx duration:    0 us
>         last ack signal:-51 dBm
>         avg ack signal: -50 dBm
>         authorized:     yes
>         .......
> 
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
> Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
> 
> Signed-off-by: Sivashankari Madhavan <quic_sivamadh@xxxxxxxxxxx>
> Signed-off-by: Sowmiya Sree Elavalagan <quic_ssreeela@xxxxxxxxxxx>
> 
> Depends-On: wifi: ath12k: fix the issue that calculation of ack signal strength
>  https://patchwork.kernel.org/project/linux-wireless/patch/20240511030917.65811-1-quic_lingbok@xxxxxxxxxxx/

Does your patch not need to consider whether or not
WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT is enabled?

> ---
>  drivers/net/wireless/ath/ath12k/dp_tx.c |  2 ++
>  drivers/net/wireless/ath/ath12k/mac.c   |  1 +
>  drivers/net/wireless/ath/ath12k/wmi.c   | 15 +++++++++++----
>  drivers/net/wireless/ath/ath12k/wmi.h   |  3 +++
>  4 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c
> index 32496015cf9a..43bdb49d08e2 100644
> --- a/drivers/net/wireless/ath/ath12k/dp_tx.c
> +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c
> @@ -541,6 +541,8 @@ static void ath12k_dp_tx_status_parse(struct ath12k_base *ab,
>  
>  	ts->ppdu_id = le32_get_bits(desc->info1,
>  				    HAL_WBM_COMPL_TX_INFO1_TQM_STATUS_NUMBER);
> +	ts->ack_rssi = le32_get_bits(desc->info2,
> +				     HAL_WBM_COMPL_TX_INFO2_ACK_FRAME_RSSI);
>  	if (le32_to_cpu(desc->rate_stats.info0) & HAL_TX_RATE_STATS_INFO0_VALID)
>  		ts->rate_stats = le32_to_cpu(desc->rate_stats.info0);
>  	else
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index 96dc5c2e096f..1f4739269544 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -8733,6 +8733,7 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah)
>  
>  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
>  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
> +	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
>  
>  	wiphy->cipher_suites = cipher_suites;
>  	wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
> diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c
> index 3004c7463be9..fe909d866539 100644
> --- a/drivers/net/wireless/ath/ath12k/wmi.c
> +++ b/drivers/net/wireless/ath/ath12k/wmi.c
> @@ -3468,7 +3468,8 @@ ath12k_wmi_copy_resource_config(struct ath12k_wmi_resource_config_params *wmi_cf
>  	wmi_cfg->max_bssid_rx_filters = cpu_to_le32(tg_cfg->max_bssid_rx_filters);
>  	wmi_cfg->use_pdev_id = cpu_to_le32(tg_cfg->use_pdev_id);
>  	wmi_cfg->flag1 = cpu_to_le32(tg_cfg->atf_config |
> -				     WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64);
> +				     WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 |
> +				     WMI_RSRC_CFG_FLAG1_ACK_RSSI);
>  	wmi_cfg->peer_map_unmap_version = cpu_to_le32(tg_cfg->peer_map_unmap_version);
>  	wmi_cfg->sched_params = cpu_to_le32(tg_cfg->sched_params);
>  	wmi_cfg->twt_ap_pdev_count = cpu_to_le32(tg_cfg->twt_ap_pdev_count);
> @@ -5134,7 +5135,7 @@ static int ath12k_pull_mgmt_rx_params_tlv(struct ath12k_base *ab,
>  }
>  
>  static int wmi_process_mgmt_tx_comp(struct ath12k *ar, u32 desc_id,
> -				    u32 status)
> +				    u32 status, u32 ack_rssi)
>  {
>  	struct sk_buff *msdu;
>  	struct ieee80211_tx_info *info;
> @@ -5158,8 +5159,11 @@ static int wmi_process_mgmt_tx_comp(struct ath12k *ar, u32 desc_id,
>  	dma_unmap_single(ar->ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
>  
>  	info = IEEE80211_SKB_CB(msdu);
> -	if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && !status)
> +	if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && !status) {
>  		info->flags |= IEEE80211_TX_STAT_ACK;
> +		info->status.ack_signal = ack_rssi;
> +		info->status.flags |= IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
> +	}
>  
>  	ieee80211_tx_status_irqsafe(ath12k_ar_to_hw(ar), msdu);
>  
> @@ -5200,6 +5204,8 @@ static int ath12k_pull_mgmt_tx_compl_param_tlv(struct ath12k_base *ab,
>  	param->pdev_id = ev->pdev_id;
>  	param->desc_id = ev->desc_id;
>  	param->status = ev->status;
> +	param->ppdu_id = ev->ppdu_id;
> +	param->ack_rssi = ev->ack_rssi;
>  
>  	kfree(tb);
>  	return 0;
> @@ -6110,7 +6116,8 @@ static void ath12k_mgmt_tx_compl_event(struct ath12k_base *ab, struct sk_buff *s
>  	}
>  
>  	wmi_process_mgmt_tx_comp(ar, le32_to_cpu(tx_compl_param.desc_id),
> -				 le32_to_cpu(tx_compl_param.status));
> +				 le32_to_cpu(tx_compl_param.status),
> +				 le32_to_cpu(tx_compl_param.ack_rssi));
>  
>  	ath12k_dbg(ab, ATH12K_DBG_MGMT,
>  		   "mgmt tx compl ev pdev_id %d, desc_id %d, status %d",
> diff --git a/drivers/net/wireless/ath/ath12k/wmi.h b/drivers/net/wireless/ath/ath12k/wmi.h
> index 496866673aea..7ebd52a7ebb8 100644
> --- a/drivers/net/wireless/ath/ath12k/wmi.h
> +++ b/drivers/net/wireless/ath/ath12k/wmi.h
> @@ -2410,6 +2410,7 @@ struct wmi_init_cmd {
>  #define WMI_RSRC_CFG_HOST_SVC_FLAG_REG_CC_EXT_SUPPORT_BIT 4
>  #define WMI_RSRC_CFG_FLAGS2_RX_PEER_METADATA_VERSION		GENMASK(5, 4)
>  #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64	BIT(5)
> +#define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18)
>  
>  struct ath12k_wmi_resource_config_params {
>  	__le32 tlv_header;
> @@ -4180,6 +4181,8 @@ struct wmi_mgmt_tx_compl_event {
>  	__le32 desc_id;
>  	__le32 status;
>  	__le32 pdev_id;
> +	__le32 ppdu_id;
> +	__le32 ack_rssi;
>  } __packed;
>  
>  struct wmi_scan_event {





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux