]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: wow: add WOW_CAM update function for 8922D
authorChin-Yen Lee <timlee@realtek.com>
Mon, 29 Dec 2025 03:09:17 +0000 (11:09 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 31 Dec 2025 08:16:57 +0000 (16:16 +0800)
For WOW_CAM update function, 8922DE use different H2C command from 8922AE.
Use chip to distinguish them.

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-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
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
drivers/net/wireless/realtek/rtw89/wow.c

index 6c4dbab999cd2a8d4446c0bad387e8c8dc87c2f2..5b4f998e19788384e139840e5682d542dbf24ae0 100644 (file)
@@ -25,6 +25,7 @@ struct rtw89_fw_txpwr_track_cfg;
 struct rtw89_phy_rfk_log_fmt;
 struct rtw89_debugfs;
 struct rtw89_regd_data;
+struct rtw89_wow_cam_info;
 
 extern const struct ieee80211_ops rtw89_ops;
 
@@ -3835,6 +3836,8 @@ struct rtw89_chip_ops {
                          struct rtw89_vif_link *rtwvif_link,
                          struct rtw89_sta_link *rtwsta_link,
                          bool valid, struct ieee80211_ampdu_params *params);
+       int (*h2c_wow_cam_update)(struct rtw89_dev *rtwdev,
+                                 struct rtw89_wow_cam_info *cam_info);
 
        void (*btc_set_rfe)(struct rtw89_dev *rtwdev);
        void (*btc_init_cfg)(struct rtw89_dev *rtwdev);
index c8ea4a9f24e070d17537f32b329e8033d9de011c..9b3a9fc7c6291e9ae3db70576bdf75e238ca3ae5 100644 (file)
@@ -8772,6 +8772,65 @@ fail:
 
        return ret;
 }
+EXPORT_SYMBOL(rtw89_fw_h2c_wow_cam_update);
+
+int rtw89_fw_h2c_wow_cam_update_v1(struct rtw89_dev *rtwdev,
+                                  struct rtw89_wow_cam_info *cam_info)
+{
+       struct rtw89_h2c_wow_payload_cam_update *h2c;
+       u32 len = sizeof(*h2c);
+       struct sk_buff *skb;
+       int ret;
+
+       skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+       if (!skb) {
+               rtw89_err(rtwdev, "failed to alloc skb for wow payload cam update\n");
+               return -ENOMEM;
+       }
+       skb_put(skb, len);
+       h2c = (struct rtw89_h2c_wow_payload_cam_update *)skb->data;
+
+       h2c->w0 = le32_encode_bits(cam_info->r_w, RTW89_H2C_WOW_PLD_CAM_UPD_W0_R_W) |
+                 le32_encode_bits(cam_info->idx, RTW89_H2C_WOW_PLD_CAM_UPD_W0_IDX);
+       h2c->w8 = le32_encode_bits(cam_info->valid, RTW89_H2C_WOW_PLD_CAM_UPD_W8_VALID) |
+                 le32_encode_bits(1, RTW89_H2C_WOW_PLD_CAM_UPD_W8_WOW_PTR);
+
+       if (!cam_info->valid)
+               goto done;
+
+       h2c->wkfm0 = cam_info->mask[0];
+       h2c->wkfm1 = cam_info->mask[1];
+       h2c->wkfm2 = cam_info->mask[2];
+       h2c->wkfm3 = cam_info->mask[3];
+       h2c->w5 = le32_encode_bits(cam_info->uc, RTW89_H2C_WOW_PLD_CAM_UPD_W5_UC) |
+                 le32_encode_bits(cam_info->mc, RTW89_H2C_WOW_PLD_CAM_UPD_W5_MC) |
+                 le32_encode_bits(cam_info->bc, RTW89_H2C_WOW_PLD_CAM_UPD_W5_BC) |
+                 le32_encode_bits(cam_info->skip_mac_hdr,
+                                  RTW89_H2C_WOW_PLD_CAM_UPD_W5_SKIP_MAC_HDR);
+       h2c->w6 = le32_encode_bits(cam_info->crc, RTW89_H2C_WOW_PLD_CAM_UPD_W6_CRC);
+       h2c->w7 = le32_encode_bits(cam_info->negative_pattern_match,
+                                  RTW89_H2C_WOW_PLD_CAM_UPD_W7_NEGATIVE_PATTERN_MATCH);
+
+done:
+       rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+                             H2C_CAT_MAC,
+                             H2C_CL_MAC_WOW,
+                             H2C_FUNC_WOW_PLD_CAM_UPD, 0, 1,
+                             len);
+
+       ret = rtw89_h2c_tx(rtwdev, skb, false);
+       if (ret) {
+               rtw89_err(rtwdev, "failed to send h2c\n");
+               goto fail;
+       }
+
+       return 0;
+fail:
+       dev_kfree_skb_any(skb);
+
+       return ret;
+}
+EXPORT_SYMBOL(rtw89_fw_h2c_wow_cam_update_v1);
 
 int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
                              struct rtw89_vif_link *rtwvif_link,
index 8d8d82b51f43ff21345167cb8cae07b2d9a13bdb..3a72ab3f189535b8cb7980a53826123edc2f0bca 100644 (file)
@@ -2076,6 +2076,33 @@ struct rtw89_h2c_wow_cam_update {
 #define RTW89_H2C_WOW_CAM_UPD_W5_BC BIT(26)
 #define RTW89_H2C_WOW_CAM_UPD_W5_VALID BIT(31)
 
+struct rtw89_h2c_wow_payload_cam_update {
+       __le32 w0;
+       __le32 wkfm0;
+       __le32 wkfm1;
+       __le32 wkfm2;
+       __le32 wkfm3;
+       __le32 w5;
+       __le32 w6;
+       __le32 w7;
+       __le32 w8;
+} __packed;
+
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W0_R_W BIT(0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W0_IDX GENMASK(7, 1)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_WKFM0 GENMASK(31, 0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_WKFM1 GENMASK(31, 0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_WKFM2 GENMASK(31, 0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_WKFM3 GENMASK(31, 0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W5_UC BIT(0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W5_MC BIT(1)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W5_BC BIT(2)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W5_SKIP_MAC_HDR BIT(7)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W6_CRC GENMASK(15, 0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W7_NEGATIVE_PATTERN_MATCH BIT(0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W8_VALID BIT(0)
+#define RTW89_H2C_WOW_PLD_CAM_UPD_W8_WOW_PTR BIT(1)
+
 struct rtw89_h2c_wow_gtk_ofld {
        __le32 w0;
        __le32 w1;
@@ -4266,6 +4293,7 @@ enum rtw89_wow_h2c_func {
        H2C_FUNC_WAKEUP_CTRL            = 0x8,
        H2C_FUNC_WOW_CAM_UPD            = 0xC,
        H2C_FUNC_AOAC_REPORT_REQ        = 0xD,
+       H2C_FUNC_WOW_PLD_CAM_UPD        = 0x12,
 
        NUM_OF_RTW89_WOW_H2C_FUNC,
 };
@@ -5015,6 +5043,8 @@ int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
                                 struct rtw89_vif_link *rtwvif_link, bool enable);
 int rtw89_fw_h2c_wow_cam_update(struct rtw89_dev *rtwdev,
                                struct rtw89_wow_cam_info *cam_info);
+int rtw89_fw_h2c_wow_cam_update_v1(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);
@@ -5178,6 +5208,15 @@ int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
        return 0;
 }
 
+static inline
+int rtw89_chip_h2c_wow_cam_update(struct rtw89_dev *rtwdev,
+                                 struct rtw89_wow_cam_info *cam_info)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       return chip->ops->h2c_wow_cam_update(rtwdev, cam_info);
+}
+
 /* Must consider compatibility; don't insert new in the mid.
  * Fill each field's default value in rtw89_regd_entcpy().
  */
index 84b628d23882db27c188d9583b0a799e9b2c0af3..97254fe638d19800007feae33ce78515671fef5e 100644 (file)
@@ -2553,6 +2553,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
+       .h2c_wow_cam_update     = rtw89_fw_h2c_wow_cam_update,
 
        .btc_set_rfe            = rtw8851b_btc_set_rfe,
        .btc_init_cfg           = rtw8851b_btc_init_cfg,
index 8677723e3561c1b961ec5f9546a0b3603a8adbd3..f44ea4cd4c9ee62fb10c78708081b104ea80be48 100644 (file)
@@ -2247,6 +2247,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
+       .h2c_wow_cam_update     = rtw89_fw_h2c_wow_cam_update,
 
        .btc_set_rfe            = rtw8852a_btc_set_rfe,
        .btc_init_cfg           = rtw8852a_btc_init_cfg,
index 70fb05bc5e980de8fee9fe9d3acbe33169db2ed5..b1ea0a6e38c289570661b8ebfebde99dda06d987 100644 (file)
@@ -858,6 +858,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
+       .h2c_wow_cam_update     = rtw89_fw_h2c_wow_cam_update,
 
        .btc_set_rfe            = rtw8852b_btc_set_rfe,
        .btc_init_cfg           = rtw8852bx_btc_init_cfg,
index f956474c3b722a451a443982b04b888ac6681d17..362d92d86aa1c205f3ec2a66ef03827c866edc17 100644 (file)
@@ -724,6 +724,7 @@ static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
+       .h2c_wow_cam_update     = rtw89_fw_h2c_wow_cam_update,
 
        .btc_set_rfe            = rtw8852bt_btc_set_rfe,
        .btc_init_cfg           = rtw8852bx_btc_init_cfg,
index db99450e91589e260babbd8c00db26f7a4b97d17..bc31f563ad938775f26e2168dce8187de81baa4b 100644 (file)
@@ -3088,6 +3088,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
+       .h2c_wow_cam_update     = rtw89_fw_h2c_wow_cam_update,
 
        .btc_set_rfe            = rtw8852c_btc_set_rfe,
        .btc_init_cfg           = rtw8852c_btc_init_cfg,
index 4bcf20612a45538babd425b0fc48f08b0a506aa9..cfd42b0145d3c2fe4a80470b3cb9f1cd28a65d25 100644 (file)
@@ -2861,6 +2861,7 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
        .h2c_default_dmac_tbl   = rtw89_fw_h2c_default_dmac_tbl_v2,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon_be,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam_v1,
+       .h2c_wow_cam_update     = rtw89_fw_h2c_wow_cam_update,
 
        .btc_set_rfe            = rtw8922a_btc_set_rfe,
        .btc_init_cfg           = rtw8922a_btc_init_cfg,
index 417720067e78c7a46d58b1d8f84b778666f2404b..8224f0e3fb9acc4c9dca084fdf30d5baef491195 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_h2c_wow_cam_update(rtwdev, rtw_pattern);
+               rtw89_chip_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_h2c_wow_cam_update(rtwdev, rtw_pattern + i);
+               rtw89_chip_h2c_wow_cam_update(rtwdev, rtw_pattern + i);
 }
 
 static void rtw89_wow_pattern_clear(struct rtw89_dev *rtwdev)