]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: rtw89: add EVM statistics for 1SS rate
authorKuan-Chung Chen <damon.chen@realtek.com>
Wed, 24 Jul 2024 05:26:23 +0000 (13:26 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 2 Aug 2024 01:18:25 +0000 (09:18 +0800)
To more accurately debug performance issues, EVM statistics will
differentiate between different space streams, and only beacon
and data frames will be included.

Signed-off-by: Kuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240724052626.12774-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/debug.c
drivers/net/wireless/realtek/rtw89/txrx.h

index 7019f7d482a88175fd45ea629e75308ab14e814b..86b6febedc25440c772acf1db39b96e28ecb39ab 100644 (file)
@@ -1449,16 +1449,20 @@ static int rtw89_core_rx_process_mac_ppdu(struct rtw89_dev *rtwdev,
                return -EINVAL;
        }
 
-       /* For WiFi 7 chips, RXWD.mac_id of PPDU status is not set by hardware,
-        * so update mac_id by rxinfo_user[].mac_id.
-        */
-       for (i = 0; i < usr_num && chip_gen == RTW89_CHIP_BE; i++) {
+       for (i = 0; i < usr_num; i++) {
                user = &rxinfo->user[i];
                if (!le32_get_bits(user->w0, RTW89_RXINFO_USER_MAC_ID_VALID))
                        continue;
-
-               phy_ppdu->mac_id =
-                       le32_get_bits(user->w0, RTW89_RXINFO_USER_MACID);
+               /* For WiFi 7 chips, RXWD.mac_id of PPDU status is not set
+                * by hardware, so update mac_id by rxinfo_user[].mac_id.
+                */
+               if (chip_gen == RTW89_CHIP_BE)
+                       phy_ppdu->mac_id =
+                               le32_get_bits(user->w0, RTW89_RXINFO_USER_MACID);
+               phy_ppdu->has_data =
+                       le32_get_bits(user->w0, RTW89_RXINFO_USER_DATA);
+               phy_ppdu->has_bcn =
+                       le32_get_bits(user->w0, RTW89_RXINFO_USER_BCN);
                break;
        }
 
@@ -1480,6 +1484,26 @@ static int rtw89_core_rx_process_mac_ppdu(struct rtw89_dev *rtwdev,
        return 0;
 }
 
+static u8 rtw89_get_data_rate_nss(struct rtw89_dev *rtwdev, u16 data_rate)
+{
+       u8 data_rate_mode;
+
+       data_rate_mode = rtw89_get_data_rate_mode(rtwdev, data_rate);
+       switch (data_rate_mode) {
+       case DATA_RATE_MODE_NON_HT:
+               return 1;
+       case DATA_RATE_MODE_HT:
+               return rtw89_get_data_ht_nss(rtwdev, data_rate) + 1;
+       case DATA_RATE_MODE_VHT:
+       case DATA_RATE_MODE_HE:
+       case DATA_RATE_MODE_EHT:
+               return rtw89_get_data_nss(rtwdev, data_rate) + 1;
+       default:
+               rtw89_warn(rtwdev, "invalid RX rate mode %d\n", data_rate_mode);
+               return 0;
+       }
+}
+
 static void rtw89_core_rx_process_phy_ppdu_iter(void *data,
                                                struct ieee80211_sta *sta)
 {
@@ -1509,10 +1533,14 @@ static void rtw89_core_rx_process_phy_ppdu_iter(void *data,
                        ewma_rssi_add(&rtwsta->rssi[i], phy_ppdu->rssi[i]);
        }
 
-       if (phy_ppdu->ofdm.has) {
+       if (phy_ppdu->ofdm.has && (phy_ppdu->has_data || phy_ppdu->has_bcn)) {
                ewma_snr_add(&rtwsta->avg_snr, phy_ppdu->ofdm.avg_snr);
-               ewma_evm_add(&rtwsta->evm_min[evm_pos], phy_ppdu->ofdm.evm_min);
-               ewma_evm_add(&rtwsta->evm_max[evm_pos], phy_ppdu->ofdm.evm_max);
+               if (rtw89_get_data_rate_nss(rtwdev, phy_ppdu->rate) == 1) {
+                       ewma_evm_add(&rtwsta->evm_1ss, phy_ppdu->ofdm.evm_min);
+               } else {
+                       ewma_evm_add(&rtwsta->evm_min[evm_pos], phy_ppdu->ofdm.evm_min);
+                       ewma_evm_add(&rtwsta->evm_max[evm_pos], phy_ppdu->ofdm.evm_max);
+               }
        }
 }
 
@@ -3367,6 +3395,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
 
        ewma_rssi_init(&rtwsta->avg_rssi);
        ewma_snr_init(&rtwsta->avg_snr);
+       ewma_evm_init(&rtwsta->evm_1ss);
        for (i = 0; i < ant_num; i++) {
                ewma_rssi_init(&rtwsta->rssi[i]);
                ewma_evm_init(&rtwsta->evm_min[i]);
index 11fa003a9788c446181f8ced509dc8acd9e04ad9..0a09360515dca657e52d303e8af7c018350b1b22 100644 (file)
@@ -802,6 +802,8 @@ struct rtw89_rx_phy_ppdu {
                u8 evm_max;
                u8 evm_min;
        } ofdm;
+       bool has_data;
+       bool has_bcn;
        bool ldpc;
        bool stbc;
        bool to_self;
@@ -3306,6 +3308,7 @@ struct rtw89_sta {
        struct ewma_rssi avg_rssi;
        struct ewma_rssi rssi[RF_PATH_MAX];
        struct ewma_snr avg_snr;
+       struct ewma_evm evm_1ss;
        struct ewma_evm evm_min[RF_PATH_MAX];
        struct ewma_evm evm_max[RF_PATH_MAX];
        struct rtw89_ampdu_params ampdu_params[IEEE80211_NUM_TIDS];
index 9e1353cce9ccd65433be3a6393eb9955675199e0..6fc30f137eaa5e8ca4af7aa22ab4bd7807ed88b0 100644 (file)
@@ -3505,7 +3505,7 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
        struct rtw89_hal *hal = &rtwdev->hal;
        u8 ant_num = hal->ant_diversity ? 2 : rtwdev->chip->rf_path_num;
        bool ant_asterisk = hal->tx_path_diversity || hal->ant_diversity;
-       u8 evm_min, evm_max;
+       u8 evm_min, evm_max, evm_1ss;
        u8 rssi;
        u8 snr;
        int i;
@@ -3574,7 +3574,8 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
        }
        seq_puts(m, "]\n");
 
-       seq_puts(m, "EVM: [");
+       evm_1ss = ewma_evm_read(&rtwsta->evm_1ss);
+       seq_printf(m, "EVM: [%2u.%02u, ", evm_1ss >> 2, (evm_1ss & 0x3) * 25);
        for (i = 0; i < (hal->ant_diversity ? 2 : 1); i++) {
                evm_min = ewma_evm_read(&rtwsta->evm_min[i]);
                evm_max = ewma_evm_read(&rtwsta->evm_max[i]);
index 3882938c089318cf3c8c66aa501bd320abafa9f9..a33280ec2a257f9558a5c863d22c9f228ecdf2b5 100644 (file)
@@ -14,6 +14,7 @@
 #define DATA_RATE_HT_IDX_MASK          GENMASK(4, 0)
 #define DATA_RATE_HT_IDX_MASK_V1       GENMASK(4, 0)
 #define DATA_RATE_MODE_HT              0x1
+#define DATA_RATE_HT_NSS_MASK          GENMASK(4, 3)
 #define DATA_RATE_VHT_HE_NSS_MASK      GENMASK(6, 4)
 #define DATA_RATE_VHT_HE_IDX_MASK      GENMASK(3, 0)
 #define DATA_RATE_NSS_MASK_V1          GENMASK(7, 5)
@@ -51,6 +52,11 @@ static inline u8 rtw89_get_data_mcs(struct rtw89_dev *rtwdev, u16 hw_rate)
        return u16_get_bits(hw_rate, DATA_RATE_VHT_HE_IDX_MASK);
 }
 
+static inline u8 rtw89_get_data_ht_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
+{
+       return u16_get_bits(hw_rate, DATA_RATE_HT_NSS_MASK);
+}
+
 static inline u8 rtw89_get_data_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
 {
        if (rtwdev->chip->chip_gen == RTW89_CHIP_BE)
@@ -408,7 +414,7 @@ struct rtw89_rxinfo_user {
 #define RTW89_RXINFO_USER_DATA BIT(1)
 #define RTW89_RXINFO_USER_CTRL BIT(2)
 #define RTW89_RXINFO_USER_MGMT BIT(3)
-#define RTW89_RXINFO_USER_BCM BIT(4)
+#define RTW89_RXINFO_USER_BCN BIT(4)
 #define RTW89_RXINFO_USER_MACID GENMASK(15, 8)
 
 struct rtw89_rxinfo {