mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
wifi: mt76: mt7925: support new WoW pattern TLV
Newer mt7925 firmware uses a shorter WoW pattern TLV with rsv[3]. Select the v2 layout based on the firmware build date, while keeping the old layout for older firmware. This also makes the WoW pattern handling compatible with newer devices such as MT7928. Tested-by: Stella Liu <[email protected]> Signed-off-by: Sean Wang <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
+27
-3
@@ -10,6 +10,24 @@
|
|||||||
|
|
||||||
#define MT_STA_BFER BIT(0)
|
#define MT_STA_BFER BIT(0)
|
||||||
#define MT_STA_BFEE BIT(1)
|
#define MT_STA_BFEE BIT(1)
|
||||||
|
#define MT7925_WOW_PATTERN_NEW_FW_DATE "20260414153105"
|
||||||
|
|
||||||
|
static bool mt7925_mcu_wow_pattern_old_tlv(struct mt76_dev *dev)
|
||||||
|
{
|
||||||
|
const char *fw_version = dev->hw->wiphy->fw_version;
|
||||||
|
const char *build_date = strrchr(fw_version, '-');
|
||||||
|
|
||||||
|
if (!is_mt7925(dev))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!build_date)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
build_date++;
|
||||||
|
|
||||||
|
return strncmp(build_date, MT7925_WOW_PATTERN_NEW_FW_DATE,
|
||||||
|
strlen(MT7925_WOW_PATTERN_NEW_FW_DATE)) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
|
int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
|
||||||
struct sk_buff *skb, int seq)
|
struct sk_buff *skb, int seq)
|
||||||
@@ -230,6 +248,8 @@ mt7925_mcu_set_wow_pattern(struct mt76_dev *dev,
|
|||||||
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
|
struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv;
|
||||||
struct mt7925_wow_pattern_tlv *tlv;
|
struct mt7925_wow_pattern_tlv *tlv;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
int tlv_len;
|
||||||
|
bool old_tlv;
|
||||||
struct {
|
struct {
|
||||||
u8 bss_idx;
|
u8 bss_idx;
|
||||||
u8 pad[3];
|
u8 pad[3];
|
||||||
@@ -237,14 +257,18 @@ mt7925_mcu_set_wow_pattern(struct mt76_dev *dev,
|
|||||||
.bss_idx = mvif->idx,
|
.bss_idx = mvif->idx,
|
||||||
};
|
};
|
||||||
|
|
||||||
skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*tlv));
|
old_tlv = mt7925_mcu_wow_pattern_old_tlv(dev);
|
||||||
|
tlv_len = old_tlv ? sizeof(struct mt7925_wow_pattern_tlv) :
|
||||||
|
MT7925_WOW_PATTERN_TLV_V2_SIZE;
|
||||||
|
|
||||||
|
skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + tlv_len);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
skb_put_data(skb, &hdr, sizeof(hdr));
|
skb_put_data(skb, &hdr, sizeof(hdr));
|
||||||
tlv = (struct mt7925_wow_pattern_tlv *)skb_put(skb, sizeof(*tlv));
|
tlv = (struct mt7925_wow_pattern_tlv *)skb_put_zero(skb, tlv_len);
|
||||||
tlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
|
tlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
|
||||||
tlv->len = cpu_to_le16(sizeof(*tlv));
|
tlv->len = cpu_to_le16(tlv_len);
|
||||||
tlv->bss_idx = 0xF;
|
tlv->bss_idx = 0xF;
|
||||||
tlv->data_len = pattern->pattern_len;
|
tlv->data_len = pattern->pattern_len;
|
||||||
tlv->enable = enable;
|
tlv->enable = enable;
|
||||||
|
|||||||
@@ -608,6 +608,9 @@ struct mt7925_wow_pattern_tlv {
|
|||||||
u8 rsv[4];
|
u8 rsv[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MT7925_WOW_PATTERN_TLV_V2_SIZE \
|
||||||
|
(offsetof(struct mt7925_wow_pattern_tlv, rsv) + 3)
|
||||||
|
|
||||||
struct roc_acquire_tlv {
|
struct roc_acquire_tlv {
|
||||||
__le16 tag;
|
__le16 tag;
|
||||||
__le16 len;
|
__le16 len;
|
||||||
|
|||||||
Reference in New Issue
Block a user