wifi: rtw89: fw: introduce helper for disabling FW feature configuration

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
This commit is contained in:
Zong-Zhe Yang 2025-12-31 17:06:41 +08:00 committed by Ping-Ke Shih
parent c5e5519fd9
commit 2d986cf3cc
2 changed files with 38 additions and 1 deletions

View 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);

View 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);
}
}