mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-14 04:09:18 -04:00
wifi: rtw89: add EVM statistics for 1SS rate
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
This commit is contained in:
committed by
Ping-Ke Shih
parent
53ed4b25a7
commit
bd4a3b10fa
@@ -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]);
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user