mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
wifi: rtw89: wow: add WOW_CAM update function for 8922D
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
This commit is contained in:
parent
355f38849e
commit
295c47806b
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -8772,6 +8772,65 @@ int rtw89_fw_h2c_wow_cam_update(struct rtw89_dev *rtwdev,
|
|||
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -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().
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user