]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: support average ack rssi in station dump
authorSivashankari Madhavan <quic_sivamadh@quicinc.com>
Wed, 9 Jul 2025 13:35:54 +0000 (19:05 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 11 Jul 2025 16:33:33 +0000 (09:33 -0700)
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 aa:bb:cc:dd:ee:ff (on wlp88s0)
        inactive time:  46584 ms
        rx bytes:       955
        rx packets:     10
        tx bytes:       769
        tx packets:     6
        tx retries:     81
        tx failed:      0
        rx drop misc:   0
        signal:         -39 dBm
        signal avg:     -40 dBm
        tx bitrate:     6.0 MBit/s
        tx duration:    1185 us
        rx bitrate:     309.7 MBit/s 40MHz HE-MCS 6 HE-NSS 2 HE-GI 0 HE-DCM 0
        rx duration:    0 us
        last ack signal:-41 dBm
        avg ack signal: -40 dBm
        authorized:     yes
        authenticated:  yes
        .......

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-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@quicinc.com>
Signed-off-by: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250709133554.622463-1-quic_ssreeela@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp_tx.c
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/wmi.c
drivers/net/wireless/ath/ath12k/wmi.h

index 1fa37cda104631654cc05ab9c7383b24a935a3ad..56c08199c79fb68df6c149ff4baaeb2ea5e76b4e 100644 (file)
@@ -901,6 +901,9 @@ static void ath12k_dp_tx_status_parse(struct ath12k_base *ab,
 
        ts->peer_id = le32_get_bits(desc->info3, HAL_WBM_COMPL_TX_INFO3_PEER_ID);
 
+       ts->ack_rssi = le32_get_bits(desc->info2,
+                                    HAL_WBM_COMPL_TX_INFO2_ACK_FRAME_RSSI);
+
        if (info0 & HAL_TX_RATE_STATS_INFO0_VALID) {
                ts->pkt_type = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_PKT_TYPE);
                ts->mcs = u32_get_bits(info0, HAL_TX_RATE_STATS_INFO0_MCS);
index 5333da9cac1b2cae4a71c975bf927de8182c357b..1f4deedcd189c635e93d0a3ca49de547585230b9 100644 (file)
@@ -13816,6 +13816,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);
index a6379f19be2caba707862fb367e922c7aeb22c22..b5b1f93ea22dcfa9b8cecd71731ef0848b91d9f8 100644 (file)
@@ -3886,7 +3886,8 @@ ath12k_wmi_copy_resource_config(struct ath12k_base *ab,
        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);
@@ -6122,7 +6123,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;
@@ -6151,8 +6152,11 @@ static int wmi_process_mgmt_tx_comp(struct ath12k *ar, u32 desc_id,
        /* skip tx rate update from ieee80211_status*/
        info->status.rates[0].idx = -1;
 
-       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;
+       }
 
        if ((info->flags & IEEE80211_TX_CTL_NO_ACK) && !status)
                info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
@@ -6196,6 +6200,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;
@@ -7122,7 +7128,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",
index eeea9a22d93bba9d0ab55e1aaf9ed7b4ba48e0f7..967a7cc1e3d557af87f708991bd00e2aa038c75f 100644 (file)
@@ -2527,6 +2527,7 @@ struct wmi_init_cmd {
 #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_FLAGS2_CALC_NEXT_DTIM_COUNT_SET      BIT(9)
+#define WMI_RSRC_CFG_FLAG1_ACK_RSSI    BIT(18)
 
 struct ath12k_wmi_resource_config_params {
        __le32 tlv_header;
@@ -4515,6 +4516,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 {