]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: fw: introduce helper for disabling FW feature configuration
authorZong-Zhe Yang <kevin_yang@realtek.com>
Wed, 31 Dec 2025 09:06:41 +0000 (17:06 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 7 Jan 2026 07:47:45 +0000 (15:47 +0800)
Some FW features (groups) may be valid only in a range of FW versions,
i.e. after some FW versions, they can no longer be used. So, introduce
some helper macros to configure this kind of things in FW feature table.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20251231090647.56407-6-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c

index 7b6dfab8e56cc3f58e3b13dc03b8ea54e8478752..8010ee070108c4ddf8e56bfe14cc4db07402b08f 100644 (file)
@@ -4815,6 +4815,9 @@ struct rtw89_fw_info {
 #define RTW89_SET_FW_FEATURE(_fw_feature, _fw) \
        set_bit(_fw_feature, (_fw)->feature_map)
 
+#define RTW89_CLR_FW_FEATURE(_fw_feature, _fw) \
+       clear_bit(_fw_feature, (_fw)->feature_map)
+
 struct rtw89_cam_info {
        DECLARE_BITMAP(addr_cam_map, RTW89_MAX_ADDR_CAM_NUM);
        DECLARE_BITMAP(bssid_cam_map, RTW89_MAX_BSSID_CAM_NUM);
index d13c93fafb34eef5b3c264de48772e8a5e3161da..8804f5da88b179ec4f73b2d93fbe1fb280586993 100644 (file)
@@ -812,6 +812,8 @@ struct __fw_feat_cfg {
        enum rtw89_fw_feature feature;
        u32 ver_code;
        bool (*cond)(u32 suit_ver_code, u32 comp_ver_code);
+       bool disable;
+       int size;
 };
 
 #define __CFG_FW_FEAT(_chip, _cond, _maj, _min, _sub, _idx, _feat) \
@@ -822,6 +824,30 @@ struct __fw_feat_cfg {
                .cond = __fw_feat_cond_ ## _cond, \
        }
 
+#define __S_DIS_FW_FEAT(_chip, _cond, _maj, _min, _sub, _idx, _feat) \
+       { \
+               .chip_id = _chip, \
+               .feature = RTW89_FW_FEATURE_ ## _feat, \
+               .ver_code = RTW89_FW_VER_CODE(_maj, _min, _sub, _idx), \
+               .cond = __fw_feat_cond_ ## _cond, \
+               .disable = true, \
+               .size = 1, \
+       }
+
+#define __G_DIS_FW_FEAT(_chip, _cond, _maj, _min, _sub, _idx, _grp) \
+       { \
+               .chip_id = _chip, \
+               .feature = RTW89_FW_FEATURE_ ## _grp ## _MIN, \
+               .ver_code = RTW89_FW_VER_CODE(_maj, _min, _sub, _idx), \
+               .cond = __fw_feat_cond_ ## _cond, \
+               .disable = true, \
+               .size = RTW89_FW_FEATURE_ ## _grp ## _MAX - \
+                       RTW89_FW_FEATURE_ ## _grp ## _MIN + 1, \
+       }
+
+#define __DIS_FW_FEAT(_chip, _cond, _maj, _min, _sub, _idx, _feat, _type) \
+       __##_type##_DIS_FW_FEAT(_chip, _cond, _maj, _min, _sub, _idx, _feat)
+
 static const struct __fw_feat_cfg fw_feat_tbl[] = {
        __CFG_FW_FEAT(RTL8851B, ge, 0, 29, 37, 1, TX_WAKE),
        __CFG_FW_FEAT(RTL8851B, ge, 0, 29, 37, 1, SCAN_OFFLOAD),
@@ -908,8 +934,16 @@ static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
                if (chip->chip_id != ent->chip_id)
                        continue;
 
-               if (ent->cond(ver_code, ent->ver_code))
+               if (!ent->cond(ver_code, ent->ver_code))
+                       continue;
+
+               if (!ent->disable) {
                        RTW89_SET_FW_FEATURE(ent->feature, fw);
+                       continue;
+               }
+
+               for (int n = 0; n < ent->size; n++)
+                       RTW89_CLR_FW_FEATURE(ent->feature + n, fw);
        }
 }