]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: align RA H2C format v1 for RTL8922A
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 14 Nov 2025 06:01:24 +0000 (14:01 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 18 Nov 2025 01:25:00 +0000 (09:25 +0800)
For RTL8922A, the bits [16:31] of word 3 of v1 format isn't as WiFi 6
chips. Instead, it only needs to fill additional band type and partial
bandwidth ER.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20251114060128.35363-11-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/phy.c

index 8943166de52cf248e9547be071d4244d3bc6b3e8..1f99d5f264d2eae58e0f9807b2ad51bb76243012 100644 (file)
@@ -3384,11 +3384,18 @@ struct rtw89_ra_info {
        u8 cr_tbl_sel:1;
        u8 fix_giltf_en:1;
        u8 fix_giltf:3;
-       u8 rsvd2:1;
+       u8 partial_bw_er:1;
        u8 csi_mcs_ss_idx;
        u8 csi_mode:2;
        u8 csi_gi_ltf:3;
        u8 csi_bw:3;
+       /* after v1 */
+       u8 is_noisy:1;
+       u8 psra_en:1;
+       u8 rsvd0:1;
+       u8 macid_msb:2;
+       u8 band:2; /* enum rtw89_band */
+       u8 is_new_dbgreg:1;
 };
 
 #define RTW89_PPDU_MAC_INFO_USR_SIZE 4
index b234df10963486c70ee3c570a46cc64128c3219b..0dc5aa5ed218ba01c20663dcabf122b33dbda512 100644 (file)
@@ -4739,13 +4739,16 @@ int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi
        struct rtw89_h2c_ra_v1 *h2c_v1;
        struct rtw89_h2c_ra *h2c;
        u32 len = sizeof(*h2c);
-       bool format_v1 = false;
        struct sk_buff *skb;
+       u8 ver = U8_MAX;
        int ret;
 
-       if (chip->chip_gen == RTW89_CHIP_BE) {
+       if (chip->chip_gen == RTW89_CHIP_AX) {
+               len = sizeof(*h2c);
+               ver = 0;
+       } else {
                len = sizeof(*h2c_v1);
-               format_v1 = true;
+               ver = 1;
        }
 
        skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
@@ -4777,16 +4780,8 @@ int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi
        h2c->w3 = le32_encode_bits(ra->fix_giltf_en, RTW89_H2C_RA_W3_FIX_GILTF_EN) |
                  le32_encode_bits(ra->fix_giltf, RTW89_H2C_RA_W3_FIX_GILTF);
 
-       if (!format_v1)
-               goto csi;
-
-       h2c_v1 = (struct rtw89_h2c_ra_v1 *)h2c;
-       h2c_v1->w4 = le32_encode_bits(ra->mode_ctrl, RTW89_H2C_RA_V1_W4_MODE_EHT) |
-                    le32_encode_bits(ra->bw_cap, RTW89_H2C_RA_V1_W4_BW_EHT);
-
-csi:
-       if (!csi)
-               goto done;
+       if (!csi || ver >= 1)
+               goto next_v1;
 
        h2c->w2 |= le32_encode_bits(1, RTW89_H2C_RA_W2_BFEE_CSI_CTL);
        h2c->w3 |= le32_encode_bits(ra->band_num, RTW89_H2C_RA_W3_BAND_NUM) |
@@ -4798,6 +4793,18 @@ csi:
                   le32_encode_bits(ra->csi_gi_ltf, RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF) |
                   le32_encode_bits(ra->csi_bw, RTW89_H2C_RA_W3_FIXED_CSI_BW);
 
+next_v1:
+       if (ver < 1)
+               goto done;
+
+       h2c->w3 |= le32_encode_bits(ra->partial_bw_er,
+                                   RTW89_H2C_RA_V1_W3_PARTIAL_BW_SU_ER) |
+                  le32_encode_bits(ra->band, RTW89_H2C_RA_V1_W3_BAND);
+
+       h2c_v1 = (struct rtw89_h2c_ra_v1 *)h2c;
+       h2c_v1->w4 = le32_encode_bits(ra->mode_ctrl, RTW89_H2C_RA_V1_W4_MODE_EHT) |
+                    le32_encode_bits(ra->bw_cap, RTW89_H2C_RA_V1_W4_BW_EHT);
+
 done:
        rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
                              H2C_CAT_OUTSRC, H2C_CL_OUTSRC_RA,
index bb3e7bbb41debd0080ad891fcc5883d6625efaa7..e62b61f584fbd28cf65d61697cc976edac0b19e0 100644 (file)
@@ -447,6 +447,13 @@ struct rtw89_h2c_ra {
 #define RTW89_H2C_RA_W3_FIXED_CSI_MODE GENMASK(25, 24)
 #define RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF GENMASK(28, 26)
 #define RTW89_H2C_RA_W3_FIXED_CSI_BW GENMASK(31, 29)
+#define RTW89_H2C_RA_V1_W3_PARTIAL_BW_SU_ER BIT(15)
+#define RTW89_H2C_RA_V1_W3_FIXED_CSI_RATE_L GENMASK(23, 16)
+#define RTW89_H2C_RA_V1_W3_IS_NOISY BIT(24)
+#define RTW89_H2C_RA_V1_W3_PSRA_EN BIT(25)
+#define RTW89_H2C_RA_V1_W3_MACID_MSB GENMASK(28, 27)
+#define RTW89_H2C_RA_V1_W3_BAND GENMASK(30, 29)
+#define RTW89_H2C_RA_V1_W3_NEW_DBGREG BIT(31)
 
 struct rtw89_h2c_ra_v1 {
        struct rtw89_h2c_ra v0;
index 08eb3fa6b3470e9b5083e31d326d53e888ad0ba9..9f418b1fb7ed0b807ce25d5e3c49bbd04e02392b 100644 (file)
@@ -476,6 +476,10 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
        ra->ra_mask = ra_mask;
        ra->fix_giltf_en = fix_giltf_en;
        ra->fix_giltf = fix_giltf;
+       ra->partial_bw_er = link_sta->he_cap.has_he ?
+                           !!(link_sta->he_cap.he_cap_elem.phy_cap_info[6] &
+                              IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE) : 0;
+       ra->band = chan->band_type;
 
        if (!csi)
                return;