]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: use real noise floor instead of default value
authorRaj Kumar Bhagat <quic_rajkbhag@quicinc.com>
Mon, 23 Jun 2025 15:49:10 +0000 (21:19 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Thu, 26 Jun 2025 23:10:46 +0000 (16:10 -0700)
ATH12K_DEFAULT_NOISE_FLOOR represents the approximate noise floor value
which is used for RSSI calculation. Commit "wifi: ath12k: handle WMI event
for real noise floor calculation" added support to get the real noise floor
value from the firmware. Add changes to use the real value now instead of
the default one.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1

Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com>
Co-developed-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250623-support_real_noise_floor-v2-2-974bbafa317e@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp_mon.c
drivers/net/wireless/ath/ath12k/dp_tx.c
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/wmi.c

index 91f4e3aff74c3804188af69fd9bb81103dc88175..b408103fe9d4703c44a0fde456b71bb7aaf6420c 100644 (file)
@@ -2146,10 +2146,15 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar,
                                          struct ieee80211_rx_status *rxs)
 {
        struct ieee80211_supported_band *sband;
+       s32 noise_floor;
        u8 *ptr = NULL;
 
+       spin_lock_bh(&ar->data_lock);
+       noise_floor = ath12k_pdev_get_noise_floor(ar);
+       spin_unlock_bh(&ar->data_lock);
+
        rxs->flag |= RX_FLAG_MACTIME_START;
-       rxs->signal = ppduinfo->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
+       rxs->signal = ppduinfo->rssi_comb + noise_floor;
        rxs->nss = ppduinfo->nss + 1;
 
        if (ppduinfo->userstats[ppduinfo->userid].ampdu_present) {
index 075912eacfaab520e0ed0041b330096c830ae8a0..ca3d97043da04ceb2be5d3823e36b755b837a1ff 100644 (file)
@@ -553,6 +553,7 @@ ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_base *ab,
        struct ath12k_vif *ahvif;
        struct ath12k *ar;
        struct sk_buff *msdu = desc_params->skb;
+       s32 noise_floor;
 
        skb_cb = ATH12K_SKB_CB(msdu);
        info = IEEE80211_SKB_CB(msdu);
@@ -591,8 +592,13 @@ ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_base *ab,
                        info->status.ack_signal = ts->ack_rssi;
 
                        if (!test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
-                                     ab->wmi_ab.svc_map))
-                               info->status.ack_signal += ATH12K_DEFAULT_NOISE_FLOOR;
+                                     ab->wmi_ab.svc_map)) {
+                               spin_lock_bh(&ar->data_lock);
+                               noise_floor = ath12k_pdev_get_noise_floor(ar);
+                               spin_unlock_bh(&ar->data_lock);
+
+                               info->status.ack_signal += noise_floor;
+                       }
 
                        info->status.flags = IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
                } else {
@@ -774,6 +780,7 @@ static void ath12k_dp_tx_complete_msdu(struct ath12k *ar,
        struct ieee80211_vif *vif;
        struct ath12k_vif *ahvif;
        struct sk_buff *msdu = desc_params->skb;
+       s32 noise_floor;
 
        if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) {
                /* Must not happen */
@@ -826,8 +833,13 @@ static void ath12k_dp_tx_complete_msdu(struct ath12k *ar,
                        info->status.ack_signal = ts->ack_rssi;
 
                        if (!test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
-                                     ab->wmi_ab.svc_map))
-                               info->status.ack_signal += ATH12K_DEFAULT_NOISE_FLOOR;
+                                     ab->wmi_ab.svc_map)) {
+                               spin_lock_bh(&ar->data_lock);
+                               noise_floor = ath12k_pdev_get_noise_floor(ar);
+                               spin_unlock_bh(&ar->data_lock);
+
+                               info->status.ack_signal += noise_floor;
+                       }
 
                        info->status.flags = IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
                }
index 4a35577f79f1646866fbe5198e89029c4366fe5e..ab184c5c7da1eed07395cd0d7478d1cf2081aaa6 100644 (file)
@@ -11590,8 +11590,8 @@ static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
        struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
        struct ath12k_fw_stats_req_params params = {};
        struct ath12k_link_sta *arsta;
+       s8 signal, noise_floor;
        struct ath12k *ar;
-       s8 signal;
        bool db2dbm;
 
        lockdep_assert_wiphy(hw->wiphy);
@@ -11639,15 +11639,19 @@ static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
            !(ath12k_mac_get_fw_stats(ar, &params)))
                signal = arsta->rssi_beacon;
 
+       spin_lock_bh(&ar->data_lock);
+       noise_floor = ath12k_pdev_get_noise_floor(ar);
+       spin_unlock_bh(&ar->data_lock);
+
        if (signal) {
-               sinfo->signal = db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
+               sinfo->signal = db2dbm ? signal : signal + 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->signal_avg += noise_floor;
 
        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
 }
index 3ec58feab7559e3fcd1cb9891a8ebc0084264334..37ac921fb7da701a9faa6e9a93a73be5303e01fc 100644 (file)
@@ -6981,6 +6981,7 @@ static void ath12k_mgmt_rx_event(struct ath12k_base *ab, struct sk_buff *skb)
        struct ieee80211_hdr *hdr;
        u16 fc;
        struct ieee80211_supported_band *sband;
+       s32 noise_floor;
 
        if (ath12k_pull_mgmt_rx_params_tlv(ab, skb, &rx_ev) != 0) {
                ath12k_warn(ab, "failed to extract mgmt rx event");
@@ -7042,7 +7043,11 @@ static void ath12k_mgmt_rx_event(struct ath12k_base *ab, struct sk_buff *skb)
                status->freq = ieee80211_channel_to_frequency(rx_ev.channel,
                                                              status->band);
 
-       status->signal = rx_ev.snr + ATH12K_DEFAULT_NOISE_FLOOR;
+       spin_lock_bh(&ar->data_lock);
+       noise_floor = ath12k_pdev_get_noise_floor(ar);
+       spin_unlock_bh(&ar->data_lock);
+
+       status->signal = rx_ev.snr + noise_floor;
        status->rate_idx = ath12k_mac_bitrate_to_idx(sband, rx_ev.rate / 100);
 
        hdr = (struct ieee80211_hdr *)skb->data;