wifi: rtw89: record signal strength per RF path
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 8 Sep 2022 07:41:39 +0000 (15:41 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 12 Sep 2022 11:51:44 +0000 (14:51 +0300)
Originally, we show average signal strength. To support TX diversity, this
patch prepares strength per path, then we can decide TX path.

  RSSI: -54 dBm (raw=112, prev=110) [-57, -52]

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220908074140.39776-5-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/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c

index 71ee237a7c286f141893920719dfeb9fd26eb38f..0f474b50b161e748a90faf32c705768a2acf230e 100644 (file)
@@ -1143,9 +1143,14 @@ static void rtw89_core_rx_process_phy_ppdu_iter(void *data,
 {
        struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
        struct rtw89_rx_phy_ppdu *phy_ppdu = (struct rtw89_rx_phy_ppdu *)data;
+       struct rtw89_dev *rtwdev = rtwsta->rtwdev;
+       int i;
 
-       if (rtwsta->mac_id == phy_ppdu->mac_id && phy_ppdu->to_self)
+       if (rtwsta->mac_id == phy_ppdu->mac_id && phy_ppdu->to_self) {
                ewma_rssi_add(&rtwsta->avg_rssi, phy_ppdu->rssi_avg);
+               for (i = 0; i < rtwdev->chip->rf_path_num; i++)
+                       ewma_rssi_add(&rtwsta->rssi[i], phy_ppdu->rssi[i]);
+       }
 }
 
 #define VAR_LEN 0xff
@@ -1201,15 +1206,15 @@ static int rtw89_core_process_phy_status_ie(struct rtw89_dev *rtwdev, u8 *addr,
 
 static void rtw89_core_update_phy_ppdu(struct rtw89_rx_phy_ppdu *phy_ppdu)
 {
-       s8 *rssi = phy_ppdu->rssi;
+       u8 *rssi = phy_ppdu->rssi;
        u8 *buf = phy_ppdu->buf;
 
        phy_ppdu->ie = RTW89_GET_PHY_STS_IE_MAP(buf);
        phy_ppdu->rssi_avg = RTW89_GET_PHY_STS_RSSI_AVG(buf);
-       rssi[RF_PATH_A] = RTW89_RSSI_RAW_TO_DBM(RTW89_GET_PHY_STS_RSSI_A(buf));
-       rssi[RF_PATH_B] = RTW89_RSSI_RAW_TO_DBM(RTW89_GET_PHY_STS_RSSI_B(buf));
-       rssi[RF_PATH_C] = RTW89_RSSI_RAW_TO_DBM(RTW89_GET_PHY_STS_RSSI_C(buf));
-       rssi[RF_PATH_D] = RTW89_RSSI_RAW_TO_DBM(RTW89_GET_PHY_STS_RSSI_D(buf));
+       rssi[RF_PATH_A] = RTW89_GET_PHY_STS_RSSI_A(buf);
+       rssi[RF_PATH_B] = RTW89_GET_PHY_STS_RSSI_B(buf);
+       rssi[RF_PATH_C] = RTW89_GET_PHY_STS_RSSI_C(buf);
+       rssi[RF_PATH_D] = RTW89_GET_PHY_STS_RSSI_D(buf);
 }
 
 static int rtw89_core_rx_process_phy_ppdu(struct rtw89_dev *rtwdev,
@@ -2365,6 +2370,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
        struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
        int i;
 
+       rtwsta->rtwdev = rtwdev;
        rtwsta->rtwvif = rtwvif;
        rtwsta->prev_rssi = 0;
        INIT_LIST_HEAD(&rtwsta->ba_cam_list);
@@ -2373,6 +2379,8 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
                rtw89_core_txq_init(rtwdev, sta->txq[i]);
 
        ewma_rssi_init(&rtwsta->avg_rssi);
+       for (i = 0; i < rtwdev->chip->rf_path_num; i++)
+               ewma_rssi_init(&rtwsta->rssi[i]);
 
        if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
                /* for station mode, assign the mac_id from itself */
index 3f944e631ee23c04eca0d269ec1d3b65695968f8..392a8bf4372e828c8832470fa27b40df58287320 100644 (file)
@@ -522,7 +522,7 @@ struct rtw89_rx_phy_ppdu {
        u8 *buf;
        u32 len;
        u8 rssi_avg;
-       s8 rssi[RF_PATH_MAX];
+       u8 rssi[RF_PATH_MAX];
        u8 mac_id;
        u8 chan_idx;
        u8 ie;
@@ -2136,12 +2136,14 @@ struct rtw89_sec_cam_entry {
 struct rtw89_sta {
        u8 mac_id;
        bool disassoc;
+       struct rtw89_dev *rtwdev;
        struct rtw89_vif *rtwvif;
        struct rtw89_ra_info ra;
        struct rtw89_ra_report ra_report;
        int max_agg_wait;
        u8 prev_rssi;
        struct ewma_rssi avg_rssi;
+       struct ewma_rssi rssi[RF_PATH_MAX];
        struct rtw89_ampdu_params ampdu_params[IEEE80211_NUM_TIDS];
        struct ieee80211_rx_status rx_status;
        u16 rx_hw_rate;
index 9117b6168e325f6172c4040583310ee67d7bf031..a34f612ac8d9036e5287afa2a97c9e19c582a103 100644 (file)
@@ -2290,7 +2290,9 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
        struct rate_info *rate = &rtwsta->ra_report.txrate;
        struct ieee80211_rx_status *status = &rtwsta->rx_status;
        struct seq_file *m = (struct seq_file *)data;
+       struct rtw89_dev *rtwdev = rtwsta->rtwdev;
        u8 rssi;
+       int i;
 
        seq_printf(m, "TX rate [%d]: ", rtwsta->mac_id);
 
@@ -2335,8 +2337,14 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
        seq_printf(m, "\t(hw_rate=0x%x)\n", rtwsta->rx_hw_rate);
 
        rssi = ewma_rssi_read(&rtwsta->avg_rssi);
-       seq_printf(m, "RSSI: %d dBm (raw=%d, prev=%d)\n",
+       seq_printf(m, "RSSI: %d dBm (raw=%d, prev=%d) [",
                   RTW89_RSSI_RAW_TO_DBM(rssi), rssi, rtwsta->prev_rssi);
+       for (i = 0; i < rtwdev->chip->rf_path_num; i++) {
+               rssi = ewma_rssi_read(&rtwsta->rssi[i]);
+               seq_printf(m, "%d%s", RTW89_RSSI_RAW_TO_DBM(rssi),
+                          i + 1 == rtwdev->chip->rf_path_num ? "" : ", ");
+       }
+       seq_puts(m, "]\n");
 }
 
 static void
index c872c8bfb33df55c5b68e2a2baaaa08e2d3a502e..d25fe3f14b30385246b144525fc1275088328ddf 100644 (file)
@@ -2051,12 +2051,12 @@ static void rtw8852a_query_ppdu(struct rtw89_dev *rtwdev,
                                struct ieee80211_rx_status *status)
 {
        u8 path;
-       s8 *rx_power = phy_ppdu->rssi;
+       u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal = max_t(s8, rx_power[RF_PATH_A], rx_power[RF_PATH_B]);
+       status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
        for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
                status->chains |= BIT(path);
-               status->chain_signal[path] = rx_power[path];
+               status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
        }
        if (phy_ppdu->valid)
                rtw8852a_fill_freq_with_ppdu(rtwdev, phy_ppdu, status);
index ac025618374f342a1d8fa1519e3af0442f4492f6..0e5461b02660b796ab47dcca92a29f1d2158d810 100644 (file)
@@ -2837,12 +2837,12 @@ static void rtw8852c_query_ppdu(struct rtw89_dev *rtwdev,
                                struct ieee80211_rx_status *status)
 {
        u8 path;
-       s8 *rx_power = phy_ppdu->rssi;
+       u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal = max_t(s8, rx_power[RF_PATH_A], rx_power[RF_PATH_B]);
+       status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
        for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
                status->chains |= BIT(path);
-               status->chain_signal[path] = rx_power[path];
+               status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
        }
        if (phy_ppdu->valid)
                rtw8852c_fill_freq_with_ppdu(rtwdev, phy_ppdu, status);