]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: 8922a: use RSSI from PHY report in RX descriptor
authorChih-Kang Chang <gary.chang@realtek.com>
Thu, 28 Nov 2024 05:54:31 +0000 (13:54 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 5 Dec 2024 06:26:05 +0000 (14:26 +0800)
The PPDU status of probe response will fail to parse the IE due to being
filtered by the to_self check. Therefore, we parse RSSI from PHY report in
RX descriptor.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241128055433.11851-5-pkshih@realtek.com
14 files changed:
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac_be.c
drivers/net/wireless/realtek/rtw89/reg.h
drivers/net/wireless/realtek/rtw89/rtw8851b.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852b_common.c
drivers/net/wireless/realtek/rtw89/rtw8852bt.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c
drivers/net/wireless/realtek/rtw89/txrx.h

index 6f9b4f0b2748ff41dd1ba54f227d60e34c0b07a6..29d0ac502bab2a9001de1868a7c5da9ed3674443 100644 (file)
@@ -2366,6 +2366,12 @@ static void rtw89_core_update_radiotap(struct rtw89_dev *rtwdev,
        }
 }
 
+static void rtw89_core_validate_rx_signal(struct ieee80211_rx_status *rx_status)
+{
+       if (!rx_status->signal)
+               rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
+}
+
 static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
                                      struct rtw89_rx_phy_ppdu *phy_ppdu,
                                      struct rtw89_rx_desc_info *desc_info,
@@ -2382,6 +2388,8 @@ static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
        rtw89_core_rx_stats(rtwdev, phy_ppdu, desc_info, skb_ppdu);
        rtw89_core_update_rx_status_by_ppdu(rtwdev, rx_status, phy_ppdu);
        rtw89_core_update_radiotap(rtwdev, skb_ppdu, rx_status);
+       rtw89_core_validate_rx_signal(rx_status);
+
        /* In low power mode, it does RX in thread context. */
        local_bh_disable();
        ieee80211_rx_napi(rtwdev->hw, NULL, skb_ppdu, napi);
@@ -2517,6 +2525,7 @@ void rtw89_core_query_rxdesc_v2(struct rtw89_dev *rtwdev,
                                struct rtw89_rx_desc_info *desc_info,
                                u8 *data, u32 data_offset)
 {
+       struct rtw89_rxdesc_phy_rpt_v2 *rxd_rpt;
        struct rtw89_rxdesc_short_v2 *rxd_s;
        struct rtw89_rxdesc_long_v2 *rxd_l;
        u16 shift_len, drv_info_len, phy_rtp_len, hdr_cnv_len;
@@ -2564,6 +2573,12 @@ void rtw89_core_query_rxdesc_v2(struct rtw89_dev *rtwdev,
                desc_info->rxd_len = sizeof(struct rtw89_rxdesc_short_v2);
        desc_info->ready = true;
 
+       if (phy_rtp_len == sizeof(*rxd_rpt)) {
+               rxd_rpt = (struct rtw89_rxdesc_phy_rpt_v2 *)(data + data_offset +
+                                                            desc_info->rxd_len);
+               desc_info->rssi = le32_get_bits(rxd_rpt->dword0, BE_RXD_PHY_RSSI);
+       }
+
        if (!desc_info->long_rxdesc)
                return;
 
@@ -2706,6 +2721,7 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
        rx_status->flag |= RX_FLAG_MACTIME_START;
        rx_status->mactime = desc_info->free_run_cnt;
 
+       rtw89_chip_phy_rpt_to_rssi(rtwdev, desc_info, rx_status);
        rtw89_core_stats_sta_rx_status(rtwdev, desc_info, rx_status);
 }
 
@@ -4522,6 +4538,7 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
        rtw89_phy_dm_init(rtwdev);
 
        rtw89_mac_cfg_ppdu_status_bands(rtwdev, true);
+       rtw89_mac_cfg_phy_rpt_bands(rtwdev, true);
        rtw89_mac_update_rts_threshold(rtwdev);
 
        rtw89_tas_reset(rtwdev);
index 8c7e8b1c954f447d7317731cfb4e4a3dbf093614..82844e470d1b8291add34102c040cc246a7eb69b 100644 (file)
@@ -1084,6 +1084,7 @@ struct rtw89_rx_desc_info {
        u16 offset;
        u16 rxd_len;
        bool ready;
+       u16 rssi;
 };
 
 struct rtw89_rxdesc_short {
@@ -1126,6 +1127,11 @@ struct rtw89_rxdesc_long_v2 {
        __le32 dword9;
 } __packed;
 
+struct rtw89_rxdesc_phy_rpt_v2 {
+       __le32 dword0;
+       __le32 dword1;
+} __packed;
+
 struct rtw89_tx_desc_info {
        u16 pkt_size;
        u8 wp_offset;
@@ -3624,6 +3630,9 @@ struct rtw89_chip_ops {
                           struct ieee80211_rx_status *status);
        void (*convert_rpl_to_rssi)(struct rtw89_dev *rtwdev,
                                    struct rtw89_rx_phy_ppdu *phy_ppdu);
+       void (*phy_rpt_to_rssi)(struct rtw89_dev *rtwdev,
+                               struct rtw89_rx_desc_info *desc_info,
+                               struct ieee80211_rx_status *rx_status);
        void (*ctrl_nbtg_bt_tx)(struct rtw89_dev *rtwdev, bool en,
                                enum rtw89_phy_idx phy_idx);
        void (*cfg_txrx_path)(struct rtw89_dev *rtwdev);
@@ -6706,6 +6715,16 @@ static inline void rtw89_chip_convert_rpl_to_rssi(struct rtw89_dev *rtwdev,
                chip->ops->convert_rpl_to_rssi(rtwdev, phy_ppdu);
 }
 
+static inline void rtw89_chip_phy_rpt_to_rssi(struct rtw89_dev *rtwdev,
+                                             struct rtw89_rx_desc_info *desc_info,
+                                             struct ieee80211_rx_status *rx_status)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       if (chip->ops->phy_rpt_to_rssi)
+               chip->ops->phy_rpt_to_rssi(rtwdev, desc_info, rx_status);
+}
+
 static inline void rtw89_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
                                         enum rtw89_phy_idx phy_idx)
 {
index 95f2beb89fe6a4643e8a4f7b800c97ff5a64a099..bb4f58118e05ada2813504bd989df3766f77b825 100644 (file)
@@ -6736,6 +6736,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
 
        .typ_fltr_opt = rtw89_mac_typ_fltr_opt_ax,
        .cfg_ppdu_status = rtw89_mac_cfg_ppdu_status_ax,
+       .cfg_phy_rpt = NULL,
 
        .dle_mix_cfg = dle_mix_cfg_ax,
        .chk_dle_rdy = chk_dle_rdy_ax,
index 81507274a97e24513c400c1a87c689466122ca5f..8edea96d037f64b62bba527d88160d2f1747e92c 100644 (file)
@@ -169,6 +169,20 @@ enum rtw89_mac_ax_l0_to_l1_event {
        MAC_AX_L0_TO_L1_EVENT_MAX = 15,
 };
 
+enum rtw89_mac_phy_rpt_size {
+       MAC_AX_PHY_RPT_SIZE_0 = 0,
+       MAC_AX_PHY_RPT_SIZE_8 = 1,
+       MAC_AX_PHY_RPT_SIZE_16 = 2,
+       MAC_AX_PHY_RPT_SIZE_24 = 3,
+};
+
+enum rtw89_mac_hdr_cnv_size {
+       MAC_AX_HDR_CNV_SIZE_0 = 0,
+       MAC_AX_HDR_CNV_SIZE_32 = 1,
+       MAC_AX_HDR_CNV_SIZE_64 = 2,
+       MAC_AX_HDR_CNV_SIZE_96 = 3,
+};
+
 enum rtw89_mac_wow_fw_status {
        WOWLAN_NOT_READY = 0x00,
        WOWLAN_SLEEP_READY = 0x01,
@@ -968,6 +982,7 @@ struct rtw89_mac_gen_def {
                            enum rtw89_mac_fwd_target fwd_target,
                            u8 mac_idx);
        int (*cfg_ppdu_status)(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable);
+       void (*cfg_phy_rpt)(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable);
 
        int (*dle_mix_cfg)(struct rtw89_dev *rtwdev, const struct rtw89_dle_mem *cfg);
        int (*chk_dle_rdy)(struct rtw89_dev *rtwdev, bool wde_or_ple);
@@ -1223,6 +1238,27 @@ int rtw89_mac_stop_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx,
 int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
 int rtw89_mac_resume_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
 int rtw89_mac_resume_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
+void rtw89_mac_cfg_phy_rpt_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable);
+
+static inline
+void rtw89_mac_cfg_phy_rpt(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
+{
+       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+
+       if (mac->cfg_phy_rpt)
+               mac->cfg_phy_rpt(rtwdev, mac_idx, enable);
+}
+
+static inline
+void rtw89_mac_cfg_phy_rpt_bands(struct rtw89_dev *rtwdev, bool enable)
+{
+       rtw89_mac_cfg_phy_rpt(rtwdev, RTW89_MAC_0, enable);
+
+       if (!rtwdev->dbcc_en)
+               return;
+
+       rtw89_mac_cfg_phy_rpt(rtwdev, RTW89_MAC_1, enable);
+}
 
 static inline
 int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
index f7a396c8a3cd50ecf398b4944bd4edd3788b035e..2dbdeae904adedf294b318fe50ebb66c88d1af1e 100644 (file)
@@ -1988,6 +1988,20 @@ int rtw89_mac_resume_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
 }
 EXPORT_SYMBOL(rtw89_mac_resume_sch_tx_v2);
 
+void rtw89_mac_cfg_phy_rpt_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
+{
+       u32 reg, val;
+
+       reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RCR, mac_idx);
+       val = enable ? MAC_AX_PHY_RPT_SIZE_8 : MAC_AX_PHY_RPT_SIZE_0;
+       rtw89_write32_mask(rtwdev, reg, B_BE_PHY_RPT_SZ_MASK, val);
+       rtw89_write32_mask(rtwdev, reg, B_BE_HDR_CNV_SZ_MASK, MAC_AX_HDR_CNV_SIZE_0);
+
+       reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_DRV_INFO_OPTION, mac_idx);
+       rtw89_write32_mask(rtwdev, reg, B_BE_DRV_INFO_PHYRPT_EN, enable);
+}
+EXPORT_SYMBOL(rtw89_mac_cfg_phy_rpt_be);
+
 static
 int rtw89_mac_cfg_ppdu_status_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
 {
@@ -2583,6 +2597,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
 
        .typ_fltr_opt = rtw89_mac_typ_fltr_opt_be,
        .cfg_ppdu_status = rtw89_mac_cfg_ppdu_status_be,
+       .cfg_phy_rpt = rtw89_mac_cfg_phy_rpt_be,
 
        .dle_mix_cfg = dle_mix_cfg_be,
        .chk_dle_rdy = chk_dle_rdy_be,
index 18ec7c0252fb8e14fad850ec0b2d568e94e64d76..10d0efa7a58efd7313faadbf7cb2d30bbb45f4cb 100644 (file)
 #define B_BE_CSIPRT_HESU_AID_EN BIT(25)
 #define B_BE_CSIPRT_VHTSU_AID_EN BIT(24)
 
+#define R_BE_DRV_INFO_OPTION 0x11470
+#define R_BE_DRV_INFO_OPTION_C1 0x15470
+#define B_BE_DRV_INFO_PHYRPT_EN BIT(0)
+
 #define R_BE_RX_ERR_ISR 0x114F4
 #define R_BE_RX_ERR_ISR_C1 0x154F4
 #define B_BE_RX_ERR_TRIG_ACT_TO BIT(9)
index 1ed4e64cbd2c88d4166d9a2f6c27f14d022bfa8f..c56f70267882a63a3a45306b4a79a5b812cf72d2 100644 (file)
@@ -2298,7 +2298,8 @@ static void rtw8851b_query_ppdu(struct rtw89_dev *rtwdev,
        u8 path;
        u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal = RTW89_RSSI_RAW_TO_DBM(rx_power[RF_PATH_A]);
+       if (!status->signal)
+               status->signal = RTW89_RSSI_RAW_TO_DBM(rx_power[RF_PATH_A]);
 
        for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
                status->chains |= BIT(path);
@@ -2391,6 +2392,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
        .ctrl_btg_bt_rx         = rtw8851b_ctrl_btg_bt_rx,
        .query_ppdu             = rtw8851b_query_ppdu,
        .convert_rpl_to_rssi    = NULL,
+       .phy_rpt_to_rssi        = NULL,
        .ctrl_nbtg_bt_tx        = rtw8851b_ctrl_nbtg_bt_tx,
        .cfg_txrx_path          = rtw8851b_bb_cfg_txrx_path,
        .set_txpwr_ul_tb_offset = rtw8851b_set_txpwr_ul_tb_offset,
index a7105a288bc477e396369ce79b5e5b30acc118dd..9bd2842c27d50f6a79f324eeb95962bdde95e2e3 100644 (file)
@@ -2068,7 +2068,9 @@ static void rtw8852a_query_ppdu(struct rtw89_dev *rtwdev,
        u8 path;
        u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
+       if (!status->signal)
+               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] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
@@ -2116,6 +2118,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .ctrl_btg_bt_rx         = rtw8852a_ctrl_btg_bt_rx,
        .query_ppdu             = rtw8852a_query_ppdu,
        .convert_rpl_to_rssi    = NULL,
+       .phy_rpt_to_rssi        = NULL,
        .ctrl_nbtg_bt_tx        = rtw8852a_ctrl_nbtg_bt_tx,
        .cfg_txrx_path          = NULL,
        .set_txpwr_ul_tb_offset = rtw8852a_set_txpwr_ul_tb_offset,
index ebc853a905dd286e3ce2d0d7369bf135414754bb..dfb2bf61b0b834adeadc845f86d0ddecaeef3132 100644 (file)
@@ -745,6 +745,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
        .ctrl_btg_bt_rx         = rtw8852bx_ctrl_btg_bt_rx,
        .query_ppdu             = rtw8852bx_query_ppdu,
        .convert_rpl_to_rssi    = rtw8852bx_convert_rpl_to_rssi,
+       .phy_rpt_to_rssi        = NULL,
        .ctrl_nbtg_bt_tx        = rtw8852bx_ctrl_nbtg_bt_tx,
        .cfg_txrx_path          = rtw8852bx_bb_cfg_txrx_path,
        .set_txpwr_ul_tb_offset = rtw8852bx_set_txpwr_ul_tb_offset,
index 012739d97f71a16b73f4f2a2deec4fbdffc2ad9c..0e094ce9c9b08bacc7014ccbc17e0e41813e5d68 100644 (file)
@@ -1950,7 +1950,9 @@ static void __rtw8852bx_query_ppdu(struct rtw89_dev *rtwdev,
        u8 path;
        u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
+       if (!status->signal)
+               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] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
index cd1385ff800306e45b903e3f8ee4da80df1cf4ed..bde3e1fb7ca62857ce29241a10eaa0ef72daf7f9 100644 (file)
@@ -679,6 +679,7 @@ static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
        .ctrl_btg_bt_rx         = rtw8852bx_ctrl_btg_bt_rx,
        .query_ppdu             = rtw8852bx_query_ppdu,
        .convert_rpl_to_rssi    = rtw8852bx_convert_rpl_to_rssi,
+       .phy_rpt_to_rssi        = NULL,
        .ctrl_nbtg_bt_tx        = rtw8852bx_ctrl_nbtg_bt_tx,
        .cfg_txrx_path          = rtw8852bx_bb_cfg_txrx_path,
        .set_txpwr_ul_tb_offset = rtw8852bx_set_txpwr_ul_tb_offset,
index c7d39499ca75a8cda126e6a53a599059b94c0415..bc84b15e7826dd173aab2bc8ade663a084e79a55 100644 (file)
@@ -2807,7 +2807,10 @@ static void rtw8852c_query_ppdu(struct rtw89_dev *rtwdev,
        u8 path;
        u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
+       if (!status->signal)
+               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] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
@@ -2907,6 +2910,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .ctrl_btg_bt_rx         = rtw8852c_ctrl_btg_bt_rx,
        .query_ppdu             = rtw8852c_query_ppdu,
        .convert_rpl_to_rssi    = NULL,
+       .phy_rpt_to_rssi        = NULL,
        .ctrl_nbtg_bt_tx        = rtw8852c_ctrl_nbtg_bt_tx,
        .cfg_txrx_path          = rtw8852c_bb_cfg_txrx_path,
        .set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset,
index a96b58ce65926b13bfe60ee46888a5c625c5aa14..f04cb3b1137228292adfa15ceff8dc0d2eced1a1 100644 (file)
@@ -2565,8 +2565,10 @@ static void rtw8922a_query_ppdu(struct rtw89_dev *rtwdev,
        u8 path;
        u8 *rx_power = phy_ppdu->rssi;
 
-       status->signal =
-               RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
+       if (!status->signal)
+               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] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
@@ -2607,6 +2609,16 @@ static void rtw8922a_convert_rpl_to_rssi(struct rtw89_dev *rtwdev,
        phy_ppdu->rssi_avg = phy_ppdu->rpl_avg;
 }
 
+static void rtw8922a_phy_rpt_to_rssi(struct rtw89_dev *rtwdev,
+                                    struct rtw89_rx_desc_info *desc_info,
+                                    struct ieee80211_rx_status *rx_status)
+{
+       if (desc_info->rssi <= 0x1 || (desc_info->rssi >> 2) > MAX_RSSI)
+               return;
+
+       rx_status->signal = (desc_info->rssi >> 2) - MAX_RSSI;
+}
+
 static int rtw8922a_mac_enable_bb_rf(struct rtw89_dev *rtwdev)
 {
        rtw89_write8_set(rtwdev, R_BE_FEN_RST_ENABLE,
@@ -2665,6 +2677,7 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
        .ctrl_btg_bt_rx         = rtw8922a_ctrl_btg_bt_rx,
        .query_ppdu             = rtw8922a_query_ppdu,
        .convert_rpl_to_rssi    = rtw8922a_convert_rpl_to_rssi,
+       .phy_rpt_to_rssi        = rtw8922a_phy_rpt_to_rssi,
        .ctrl_nbtg_bt_tx        = rtw8922a_ctrl_nbtg_bt_tx,
        .cfg_txrx_path          = rtw8922a_bb_cfg_txrx_path,
        .set_txpwr_ul_tb_offset = NULL,
index b2e47829983fee3a976a3d3325392ec3c4a71faa..70fe7cebc9d53386aface6d154ca49200a518e25 100644 (file)
@@ -560,6 +560,9 @@ struct rtw89_phy_sts_iehdr {
 #define BE_RXD_HDR_OFFSET_MASK GENMASK(20, 16)
 #define BE_RXD_WL_HD_IV_LEN_MASK GENMASK(26, 21)
 
+/* BE RXD - PHY RPT dword0 */
+#define BE_RXD_PHY_RSSI GENMASK(11, 0)
+
 struct rtw89_phy_sts_ie00 {
        __le32 w0;
        __le32 w1;