wifi: rtw89: wow: use struct style to fill WOW CAM H2C command

The WOW CAM H2C command is used to tell firmware the content
of pattern match. Use struct instead of macros to fill the data.

Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20251229030926.27004-2-pkshih@realtek.com
This commit is contained in:
Chin-Yen Lee 2025-12-29 11:09:15 +08:00 committed by Ping-Ke Shih
parent 86c946bcc0
commit 0b92c2cc48
3 changed files with 53 additions and 91 deletions

View File

@ -8717,44 +8717,48 @@ int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
return ret;
}
#define H2C_WOW_CAM_UPD_LEN 24
int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
struct rtw89_wow_cam_info *cam_info)
int rtw89_fw_h2c_wow_cam_update(struct rtw89_dev *rtwdev,
struct rtw89_wow_cam_info *cam_info)
{
struct rtw89_h2c_wow_cam_update *h2c;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
int ret;
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_WOW_CAM_UPD_LEN);
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
if (!skb) {
rtw89_err(rtwdev, "failed to alloc skb for keep alive\n");
rtw89_err(rtwdev, "failed to alloc skb for wow cam update\n");
return -ENOMEM;
}
skb_put(skb, len);
h2c = (struct rtw89_h2c_wow_cam_update *)skb->data;
skb_put(skb, H2C_WOW_CAM_UPD_LEN);
h2c->w0 = le32_encode_bits(cam_info->r_w, RTW89_H2C_WOW_CAM_UPD_W0_R_W) |
le32_encode_bits(cam_info->idx, RTW89_H2C_WOW_CAM_UPD_W0_IDX);
RTW89_SET_WOW_CAM_UPD_R_W(skb->data, cam_info->r_w);
RTW89_SET_WOW_CAM_UPD_IDX(skb->data, cam_info->idx);
if (cam_info->valid) {
RTW89_SET_WOW_CAM_UPD_WKFM1(skb->data, cam_info->mask[0]);
RTW89_SET_WOW_CAM_UPD_WKFM2(skb->data, cam_info->mask[1]);
RTW89_SET_WOW_CAM_UPD_WKFM3(skb->data, cam_info->mask[2]);
RTW89_SET_WOW_CAM_UPD_WKFM4(skb->data, cam_info->mask[3]);
RTW89_SET_WOW_CAM_UPD_CRC(skb->data, cam_info->crc);
RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(skb->data,
cam_info->negative_pattern_match);
RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(skb->data,
cam_info->skip_mac_hdr);
RTW89_SET_WOW_CAM_UPD_UC(skb->data, cam_info->uc);
RTW89_SET_WOW_CAM_UPD_MC(skb->data, cam_info->mc);
RTW89_SET_WOW_CAM_UPD_BC(skb->data, cam_info->bc);
}
RTW89_SET_WOW_CAM_UPD_VALID(skb->data, cam_info->valid);
if (!cam_info->valid)
goto fill_valid;
h2c->wkfm0 = le32_encode_bits(cam_info->mask[0], RTW89_H2C_WOW_CAM_UPD_WKFM0);
h2c->wkfm1 = le32_encode_bits(cam_info->mask[1], RTW89_H2C_WOW_CAM_UPD_WKFM1);
h2c->wkfm2 = le32_encode_bits(cam_info->mask[2], RTW89_H2C_WOW_CAM_UPD_WKFM2);
h2c->wkfm3 = le32_encode_bits(cam_info->mask[3], RTW89_H2C_WOW_CAM_UPD_WKFM3);
h2c->w5 = le32_encode_bits(cam_info->crc, RTW89_H2C_WOW_CAM_UPD_W5_CRC) |
le32_encode_bits(cam_info->negative_pattern_match,
RTW89_H2C_WOW_CAM_UPD_W5_NEGATIVE_PATTERN_MATCH) |
le32_encode_bits(cam_info->skip_mac_hdr,
RTW89_H2C_WOW_CAM_UPD_W5_SKIP_MAC_HDR) |
le32_encode_bits(cam_info->uc, RTW89_H2C_WOW_CAM_UPD_W5_UC) |
le32_encode_bits(cam_info->mc, RTW89_H2C_WOW_CAM_UPD_W5_MC) |
le32_encode_bits(cam_info->bc, RTW89_H2C_WOW_CAM_UPD_W5_BC);
fill_valid:
h2c->w5 |= le32_encode_bits(cam_info->valid, RTW89_H2C_WOW_CAM_UPD_W5_VALID);
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_MAC,
H2C_CL_MAC_WOW,
H2C_FUNC_WOW_CAM_UPD, 0, 1,
H2C_WOW_CAM_UPD_LEN);
len);
ret = rtw89_h2c_tx(rtwdev, skb, false);
if (ret) {

View File

@ -2053,70 +2053,28 @@ static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(void *h2c, u32 val)
le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
}
static inline void RTW89_SET_WOW_CAM_UPD_R_W(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(0));
}
struct rtw89_h2c_wow_cam_update {
__le32 w0;
__le32 wkfm0;
__le32 wkfm1;
__le32 wkfm2;
__le32 wkfm3;
__le32 w5;
} __packed;
static inline void RTW89_SET_WOW_CAM_UPD_IDX(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 1));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM1(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 1, val, GENMASK(31, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM2(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 2, val, GENMASK(31, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM3(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 3, val, GENMASK(31, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM4(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 4, val, GENMASK(31, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_CRC(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, GENMASK(15, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, BIT(22));
}
static inline void RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, BIT(23));
}
static inline void RTW89_SET_WOW_CAM_UPD_UC(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, BIT(24));
}
static inline void RTW89_SET_WOW_CAM_UPD_MC(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, BIT(25));
}
static inline void RTW89_SET_WOW_CAM_UPD_BC(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, BIT(26));
}
static inline void RTW89_SET_WOW_CAM_UPD_VALID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 5, val, BIT(31));
}
#define RTW89_H2C_WOW_CAM_UPD_W0_R_W BIT(0)
#define RTW89_H2C_WOW_CAM_UPD_W0_IDX GENMASK(7, 1)
#define RTW89_H2C_WOW_CAM_UPD_WKFM0 GENMASK(31, 0)
#define RTW89_H2C_WOW_CAM_UPD_WKFM1 GENMASK(31, 0)
#define RTW89_H2C_WOW_CAM_UPD_WKFM2 GENMASK(31, 0)
#define RTW89_H2C_WOW_CAM_UPD_WKFM3 GENMASK(31, 0)
#define RTW89_H2C_WOW_CAM_UPD_W5_CRC GENMASK(15, 0)
#define RTW89_H2C_WOW_CAM_UPD_W5_NEGATIVE_PATTERN_MATCH BIT(22)
#define RTW89_H2C_WOW_CAM_UPD_W5_SKIP_MAC_HDR BIT(23)
#define RTW89_H2C_WOW_CAM_UPD_W5_UC BIT(24)
#define RTW89_H2C_WOW_CAM_UPD_W5_MC BIT(25)
#define RTW89_H2C_WOW_CAM_UPD_W5_BC BIT(26)
#define RTW89_H2C_WOW_CAM_UPD_W5_VALID BIT(31)
struct rtw89_h2c_wow_gtk_ofld {
__le32 w0;
@ -5055,8 +5013,8 @@ int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtw
bool enable);
int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link, bool enable);
int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
struct rtw89_wow_cam_info *cam_info);
int rtw89_fw_h2c_wow_cam_update(struct rtw89_dev *rtwdev,
struct rtw89_wow_cam_info *cam_info);
int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
bool enable);

View File

@ -1070,7 +1070,7 @@ static void rtw89_wow_pattern_clear_cam(struct rtw89_dev *rtwdev)
for (i = 0; i < rtw_wow->pattern_cnt; i++) {
rtw_pattern = &rtw_wow->patterns[i];
rtw_pattern->valid = false;
rtw89_fw_wow_cam_update(rtwdev, rtw_pattern);
rtw89_fw_h2c_wow_cam_update(rtwdev, rtw_pattern);
}
}
@ -1081,7 +1081,7 @@ static void rtw89_wow_pattern_write(struct rtw89_dev *rtwdev)
int i;
for (i = 0; i < rtw_wow->pattern_cnt; i++)
rtw89_fw_wow_cam_update(rtwdev, rtw_pattern + i);
rtw89_fw_h2c_wow_cam_update(rtwdev, rtw_pattern + i);
}
static void rtw89_wow_pattern_clear(struct rtw89_dev *rtwdev)