]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: read chip ID for RTL8922D variants
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 29 Dec 2025 03:09:21 +0000 (11:09 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 31 Dec 2025 08:21:57 +0000 (16:21 +0800)
The coming RTL8922D has many kinds of hardware variants. Read chips ID
ahead, so we can configure proper hardware settings accordingly.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20251229030926.27004-8-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.h
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_common.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c

index 51aa3d0eb2ef8944beefc48dd6c4acd17d55729e..78cbfd6677e1270b7fc91192c0a2a150db10c136 100644 (file)
@@ -6081,7 +6081,9 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
 static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
 {
        const struct rtw89_chip_info *chip = rtwdev->chip;
+       struct rtw89_hal *hal = &rtwdev->hal;
        int ret;
+       u8 val2;
        u8 val;
        u8 cv;
 
@@ -6093,14 +6095,28 @@ static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
                        cv = CHIP_CBV;
        }
 
-       rtwdev->hal.cv = cv;
+       hal->cv = cv;
 
-       if (rtw89_is_rtl885xb(rtwdev)) {
+       if (rtw89_is_rtl885xb(rtwdev) || chip->chip_gen >= RTW89_CHIP_BE) {
                ret = rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_CV, &val);
                if (ret)
                        return;
 
-               rtwdev->hal.acv = u8_get_bits(val, XTAL_SI_ACV_MASK);
+               hal->acv = u8_get_bits(val, XTAL_SI_ACV_MASK);
+       }
+
+       if (chip->chip_gen >= RTW89_CHIP_BE) {
+               hal->cid =
+                       rtw89_read32_mask(rtwdev, R_BE_SYS_CHIPINFO, B_BE_HW_ID_MASK);
+
+               ret = rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_CHIP_ID_L, &val);
+               if (ret)
+                       return;
+               ret = rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_CHIP_ID_H, &val2);
+               if (ret)
+                       return;
+
+               hal->aid = val | val2 << 8;
        }
 }
 
@@ -6310,6 +6326,8 @@ void rtw89_core_rfkill_poll(struct rtw89_dev *rtwdev, bool force)
 
 int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)
 {
+       struct rtw89_efuse *efuse = &rtwdev->efuse;
+       struct rtw89_hal *hal = &rtwdev->hal;
        int ret;
 
        rtw89_read_chip_ver(rtwdev);
@@ -6349,6 +6367,9 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)
        rtw89_core_setup_rfe_parms(rtwdev);
        rtwdev->ps_mode = rtw89_update_ps_mode(rtwdev);
 
+       rtw89_info(rtwdev, "chip info CID: %x, CV: %x, AID: %x, ACV: %x, RFE: %d\n",
+                  hal->cid, hal->cv, hal->aid, hal->acv, efuse->rfe_type);
+
 out:
        rtw89_mac_pwr_off(rtwdev);
 
index 8f9c49d2ec5b957fecc425985c9ead1c50f9457d..6e39894990bf8574e833e6738ecf3e98a50b15b6 100644 (file)
@@ -159,6 +159,17 @@ enum rtw89_core_chip_id {
        RTL8922D,
 };
 
+enum rtw89_core_chip_cid {
+       RTL8922D_CID7025 = 0x74,
+       RTL8922D_CID7090 = 0x79,
+};
+
+enum rtw89_core_chip_aid {
+       RTL8922D_AID1348 = 0x1348,
+       RTL8922D_AID7060 = 0x7060,
+       RTL8922D_AID7102 = 0x7102,
+};
+
 enum rtw89_chip_gen {
        RTW89_CHIP_AX,
        RTW89_CHIP_BE,
@@ -5034,7 +5045,9 @@ enum rtw89_dm_type {
 struct rtw89_hal {
        u32 rx_fltr;
        u8 cv;
+       u8 cid; /* enum rtw89_core_chip_cid */
        u8 acv;
+       u16 aid; /* enum rtw89_core_chip_aid */
        u32 antenna_tx;
        u32 antenna_rx;
        u8 tx_nss;
index 2f3138b155f9eef001329bb987746a6491eeed2c..79755032df2ce2b474bb10cd96fa331ca62c8b13 100644 (file)
@@ -1573,6 +1573,8 @@ enum rtw89_mac_xtal_si_offset {
        XTAL_SI_APBT = 0xD1,
        XTAL_SI_PLL = 0xE0,
        XTAL_SI_PLL_1 = 0xE1,
+       XTAL_SI_CHIP_ID_L = 0xFD,
+       XTAL_SI_CHIP_ID_H = 0xFE,
 };
 
 static inline
index 28ceab7726c623880599f250b2f886ab579688a8..081623f84dd9cc90ce0f8c7a2e9baf1458739c12 100644 (file)
 #define R_BE_PCIE_MIO_INTD 0x00E8
 #define B_BE_PCIE_MIO_DATA_MASK GENMASK(31, 0)
 
+#define R_BE_SYS_CHIPINFO 0x00FC
+#define B_BE_USB2_SEL BIT(31)
+#define B_BE_U3PHY_RST_V1 BIT(30)
+#define B_BE_U3_TERM_DETECT BIT(29)
+#define B_BE_VERIFY_ENV_MASK GENMASK(9, 8)
+#define B_BE_HW_ID_MASK GENMASK(7, 0)
+
 #define R_BE_HALT_H2C_CTRL 0x0160
 #define B_BE_HALT_H2C_TRIGGER BIT(0)
 
index 7e97220b723a2daecf13cabb7330130e62b67f05..e3933946d1cac00fe58b0eb63bc0bc70ac6e278f 100644 (file)
@@ -633,8 +633,6 @@ static int rtw8851b_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
        efuse->rfe_type = map->rfe_type;
        efuse->xtal_cap = map->xtal_k;
 
-       rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
-
        return 0;
 }
 
index 58e041016c26923bcffc985da706740c330755dd..46f5e9c50222a3e577c9da71856ac6a1dc213caf 100644 (file)
@@ -678,8 +678,6 @@ static int rtw8852a_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
        efuse->rfe_type = map->rfe_type;
        efuse->xtal_cap = map->xtal_k;
 
-       rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
-
        return 0;
 }
 
index 4e72f49618372da206eac3f7d68b3f29109eeb34..65b839323e3e3157082da5527ac6d5cdc3aba1ea 100644 (file)
@@ -265,8 +265,6 @@ static int __rtw8852bx_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
        efuse->rfe_type = map->rfe_type;
        efuse->xtal_cap = map->xtal_k;
 
-       rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
-
        return 0;
 }
 
index 2110c714394dd3bf373d0069e979ae4e3b717d24..c20c732d2f6aeaa3d3556c08ee6b1730dbe52005 100644 (file)
@@ -600,8 +600,6 @@ static int rtw8852c_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
        efuse->rfe_type = map->rfe_type;
        efuse->xtal_cap = map->xtal_k;
 
-       rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
-
        return 0;
 }
 
index 0383c3bd60dd126ce1b6b4d609bbe2cf36ac4928..795c00d65d5ed436979a45513e3a2da08be98ff5 100644 (file)
@@ -628,8 +628,6 @@ static int rtw8922a_read_efuse_rf(struct rtw89_dev *rtwdev, u8 *log_map)
        rtw8922a_efuse_parsing_tssi(rtwdev, map);
        rtw8922a_efuse_parsing_gain_offset(rtwdev, map);
 
-       rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
-
        return 0;
 }