]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: wow: use struct style to fill WOW CAM H2C command
authorChin-Yen Lee <timlee@realtek.com>
Mon, 29 Dec 2025 03:09:15 +0000 (11:09 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 31 Dec 2025 08:14:07 +0000 (16:14 +0800)
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
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/wow.c

index fd49e651aeed5e2e186f096cca0fc80a30294451..bb6f2802446e885a6a4a5beb31f15b511aa1ffe5 100644 (file)
@@ -8717,44 +8717,48 @@ fail:
        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, H2C_WOW_CAM_UPD_LEN);
-
-       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);
+       skb_put(skb, len);
+       h2c = (struct rtw89_h2c_wow_cam_update *)skb->data;
+
+       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);
+
+       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) {
index dfae652686cddb12a57a155b3fae83b599783aed..8d8d82b51f43ff21345167cb8cae07b2d9a13bdb 100644 (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));
-}
-
-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));
-}
+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_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);
index 46aba4cb2ee9e5059fb043e4d979e11da077b80f..417720067e78c7a46d58b1d8f84b778666f2404b 100644 (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)