]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: ps: update H2C command with more info for PS
authorEric Huang <echuang@realtek.com>
Mon, 3 Feb 2025 07:29:09 +0000 (15:29 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 10 Feb 2025 03:00:31 +0000 (11:00 +0800)
Adding beacon BW offset, OP1dB table and rfe_type to lps_ml_cmn_info.
These information will help FW to configure RX more accurately.

Signed-off-by: Eric Huang <echuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250203072911.47313-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h

index ad28f11f2d2418e519a7fab79b8bac0e08b32c63..8d5dc22fb5080079eb8e5324401c8149851b7288 100644 (file)
@@ -2192,8 +2192,11 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,
                }
                pkt_stat->beacon_nr++;
 
-               if (phy_ppdu)
+               if (phy_ppdu) {
                        ewma_rssi_add(&rtwdev->phystat.bcn_rssi, phy_ppdu->rssi_avg);
+                       if (!test_bit(RTW89_FLAG_LOW_POWER_MODE, rtwdev->flags))
+                               rtwvif_link->bcn_bw_idx = phy_ppdu->bw_idx;
+               }
 
                pkt_stat->beacon_rate = desc_info->data_rate;
        }
index 61fe2705cac6c168e8bce0ca27c2cd2a9736c4d5..b3fdd8eded2108294dae50e3a33f6b9a721f39d8 100644 (file)
@@ -3501,6 +3501,7 @@ struct rtw89_vif_link {
        u8 self_role;
        u8 wmm;
        u8 bcn_hit_cond;
+       u8 bcn_bw_idx;
        u8 hit_rule;
        u8 last_noa_nr;
        u64 sync_bcn_tsf;
index 1afce0a0b9053d4b41a6c68639ccee7f47201eff..c86a0d3284356b88e8aa8f45a1bf67a6576ce75a 100644 (file)
@@ -2795,7 +2795,9 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
 {
        const struct rtw89_phy_bb_gain_info_be *gain = &rtwdev->bb_gain.be;
        struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.cur_pkt_stat;
+       static const u8 bcn_bw_ofst[] = {0, 0, 0, 3, 6, 9, 0, 12};
        const struct rtw89_chip_info *chip = rtwdev->chip;
+       struct rtw89_efuse *efuse = &rtwdev->efuse;
        struct rtw89_h2c_lps_ml_cmn_info *h2c;
        struct rtw89_vif_link *rtwvif_link;
        const struct rtw89_chan *chan;
@@ -2803,6 +2805,7 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
        u32 len = sizeof(*h2c);
        unsigned int link_id;
        struct sk_buff *skb;
+       u8 beacon_bw_ofst;
        u8 gain_band;
        u32 done;
        u8 path;
@@ -2820,9 +2823,10 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
        skb_put(skb, len);
        h2c = (struct rtw89_h2c_lps_ml_cmn_info *)skb->data;
 
-       h2c->fmt_id = 0x1;
+       h2c->fmt_id = 0x3;
 
        h2c->mlo_dbcc_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
+       h2c->rfe_type = efuse->rfe_type;
 
        rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
                path = rtwvif_link->phy_idx == RTW89_PHY_1 ? RF_PATH_B : RF_PATH_A;
@@ -2843,9 +2847,21 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
                        h2c->tia_gain[rtwvif_link->phy_idx][i] =
                                cpu_to_le16(gain->tia_gain[gain_band][bw_idx][path][i]);
                }
+
+               if (rtwvif_link->bcn_bw_idx < ARRAY_SIZE(bcn_bw_ofst)) {
+                       beacon_bw_ofst = bcn_bw_ofst[rtwvif_link->bcn_bw_idx];
+                       h2c->dup_bcn_ofst[rtwvif_link->phy_idx] = beacon_bw_ofst;
+               }
+
                memcpy(h2c->lna_gain[rtwvif_link->phy_idx],
                       gain->lna_gain[gain_band][bw_idx][path],
                       LNA_GAIN_NUM);
+               memcpy(h2c->tia_lna_op1db[rtwvif_link->phy_idx],
+                      gain->tia_lna_op1db[gain_band][bw_idx][path],
+                      LNA_GAIN_NUM + 1);
+               memcpy(h2c->lna_op1db[rtwvif_link->phy_idx],
+                      gain->lna_op1db[gain_band][bw_idx][path],
+                      LNA_GAIN_NUM);
        }
 
        rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
index fb107c0a29d7f9db01398b9d4d5365a59a2bc10d..994d109a9c3c9bece320130d9ed5176820b6adde 100644 (file)
@@ -1801,7 +1801,8 @@ struct rtw89_h2c_lps_ch_info {
 
 struct rtw89_h2c_lps_ml_cmn_info {
        u8 fmt_id;
-       u8 rsvd0[3];
+       u8 rfe_type;
+       u8 rsvd0[2];
        __le32 mlo_dbcc_mode;
        u8 central_ch[RTW89_PHY_NUM];
        u8 pri_ch[RTW89_PHY_NUM];
@@ -1812,6 +1813,9 @@ struct rtw89_h2c_lps_ml_cmn_info {
        __le16 tia_gain[RTW89_PHY_NUM][TIA_GAIN_NUM];
        u8 lna_gain[RTW89_PHY_NUM][LNA_GAIN_NUM];
        u8 rsvd2[2];
+       u8 tia_lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM + 1];
+       u8 lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM];
+       u8 dup_bcn_ofst[RTW89_PHY_NUM];
 } __packed;
 
 static inline void RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(void *cmd, u32 val)