]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: fw: recognize firmware type B by AID
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 13 Feb 2026 06:15:42 +0000 (14:15 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 3 Mar 2026 02:29:45 +0000 (10:29 +0800)
Select a firmware suit including normal and WoWLAN firmware by chip AID
from multiple firmware, because coming RTL8922D has variant hardware with
different chip AID.

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

index 5cb8aacf7644e183842c60777ed82f8a42003506..d1f58bf953a96c6176fbaefcc4090a8c50853d63 100644 (file)
@@ -4155,6 +4155,7 @@ struct rtw89_reg_imr {
 struct rtw89_fw_def {
        const char *fw_basename;
        u8 fw_format_max;
+       u16 fw_b_aid;
 };
 
 struct rtw89_phy_table {
@@ -4729,6 +4730,8 @@ enum rtw89_fw_type {
        RTW89_FW_NORMAL = 1,
        RTW89_FW_WOWLAN = 3,
        RTW89_FW_NORMAL_CE = 5,
+       RTW89_FW_NORMAL_B = 14,
+       RTW89_FW_WOWLAN_B = 15,
        RTW89_FW_BBMCU0 = 64,
        RTW89_FW_BBMCU1 = 65,
        RTW89_FW_LOGFMT = 255,
@@ -7562,6 +7565,7 @@ static inline struct rtw89_fw_suit *rtw89_fw_suit_get(struct rtw89_dev *rtwdev,
 
        switch (type) {
        case RTW89_FW_WOWLAN:
+       case RTW89_FW_WOWLAN_B:
                return &fw_info->wowlan;
        case RTW89_FW_LOGFMT:
                return &fw_info->log.suit;
index aa42e5c60eb714f5ed57f9ce626feb2980ad0554..130ebe33cef0aaed5e2f4ec7212dcb03e2ae3b2d 100644 (file)
@@ -1027,16 +1027,25 @@ static int rtw89_fw_validate_ver_required(struct rtw89_dev *rtwdev)
 
 int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
 {
+       const struct rtw89_fw_def *fw_def = rtw89_chip_get_fw_def(rtwdev);
        const struct rtw89_chip_info *chip = rtwdev->chip;
+       const struct rtw89_hal *hal = &rtwdev->hal;
+       enum rtw89_fw_type normal_fw_type = RTW89_FW_NORMAL;
+       enum rtw89_fw_type wowlan_fw_type = RTW89_FW_WOWLAN;
        int ret;
 
+       if (fw_def->fw_b_aid && fw_def->fw_b_aid == hal->aid) {
+               normal_fw_type = RTW89_FW_NORMAL_B;
+               wowlan_fw_type = RTW89_FW_WOWLAN_B;
+       }
+
        if (chip->try_ce_fw) {
                ret = __rtw89_fw_recognize(rtwdev, RTW89_FW_NORMAL_CE, true);
                if (!ret)
                        goto normal_done;
        }
 
-       ret = __rtw89_fw_recognize(rtwdev, RTW89_FW_NORMAL, false);
+       ret = __rtw89_fw_recognize(rtwdev, normal_fw_type, false);
        if (ret)
                return ret;
 
@@ -1046,7 +1055,7 @@ normal_done:
                return ret;
 
        /* It still works if wowlan firmware isn't existing. */
-       __rtw89_fw_recognize(rtwdev, RTW89_FW_WOWLAN, false);
+       __rtw89_fw_recognize(rtwdev, wowlan_fw_type, false);
 
        /* It still works if log format file isn't existing. */
        __rtw89_fw_recognize(rtwdev, RTW89_FW_LOGFMT, true);
index fdb053fabae6b5cc63c41ec6e3851c5565798813..8352380b4be544fcf129a14e34b02256c5a3d7d7 100644 (file)
@@ -2583,6 +2583,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
        .fw_def                 = {
                .fw_basename    = RTW8851B_FW_BASENAME,
                .fw_format_max  = RTW8851B_FW_FORMAT_MAX,
+               .fw_b_aid       = 0,
        },
        .try_ce_fw              = true,
        .bbmcu_nr               = 0,
index 36d66f4e2dd0d0b847f153b31f7b8ea5acfa8830..32644c40ae2888e829b68e0ed0ba4b4ca8c8f16e 100644 (file)
@@ -2268,6 +2268,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
        .fw_def                 = {
                .fw_basename    = RTW8852A_FW_BASENAME,
                .fw_format_max  = RTW8852A_FW_FORMAT_MAX,
+               .fw_b_aid       = 0,
        },
        .try_ce_fw              = false,
        .bbmcu_nr               = 0,
index 5a41ff1f18f47659411eecd682bb05f22c9dcab4..66cd46fbee4a7b5b216c3ad84ca705dca014cf7f 100644 (file)
@@ -914,6 +914,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
        .fw_def                 = {
                .fw_basename    = RTW8852B_FW_BASENAME,
                .fw_format_max  = RTW8852B_FW_FORMAT_MAX,
+               .fw_b_aid       = 0,
        },
        .try_ce_fw              = true,
        .bbmcu_nr               = 0,
index 514861e48c253e27aa319df51580545e90b02f62..0acdf64395f048f977afbf9363c61069de59e684 100644 (file)
@@ -760,6 +760,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
        .fw_def                 = {
                .fw_basename    = RTW8852BT_FW_BASENAME,
                .fw_format_max  = RTW8852BT_FW_FORMAT_MAX,
+               .fw_b_aid       = 0,
        },
        .try_ce_fw              = true,
        .bbmcu_nr               = 0,
index 70ca8c3950d91be31a39e76e60b264e6e7f2bb2a..9f0dd6a3956f9b4e928c147f20ce8c209556c0e0 100644 (file)
@@ -3109,6 +3109,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .fw_def                 = {
                .fw_basename    = RTW8852C_FW_BASENAME,
                .fw_format_max  = RTW8852C_FW_FORMAT_MAX,
+               .fw_b_aid       = 0,
        },
        .try_ce_fw              = false,
        .bbmcu_nr               = 0,
index fd1b171b106cad3fd98682132420870e0b8a0268..1c9db283cff9cf9611653ffdc0c772affa5a1ca9 100644 (file)
@@ -2919,6 +2919,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
        .fw_def                 = {
                .fw_basename    = RTW8922A_FW_BASENAME,
                .fw_format_max  = RTW8922A_FW_FORMAT_MAX,
+               .fw_b_aid       = 0,
        },
        .try_ce_fw              = false,
        .bbmcu_nr               = 1,