|
@@ -2671,6 +2671,134 @@ ath10k_wmi_tlv_gen_wow_host_wakeup_ind(struct ath10k *ar)
|
|
return skb;
|
|
return skb;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static struct sk_buff *
|
|
|
|
+ath10k_wmi_tlv_op_gen_wow_add_pattern(struct ath10k *ar, u32 vdev_id,
|
|
|
|
+ u32 pattern_id, const u8 *pattern,
|
|
|
|
+ const u8 *bitmask, int pattern_len,
|
|
|
|
+ int pattern_offset)
|
|
|
|
+{
|
|
|
|
+ struct wmi_tlv_wow_add_pattern_cmd *cmd;
|
|
|
|
+ struct wmi_tlv_wow_bitmap_pattern *bitmap;
|
|
|
|
+ struct wmi_tlv *tlv;
|
|
|
|
+ struct sk_buff *skb;
|
|
|
|
+ void *ptr;
|
|
|
|
+ size_t len;
|
|
|
|
+
|
|
|
|
+ len = sizeof(*tlv) + sizeof(*cmd) +
|
|
|
|
+ sizeof(*tlv) + /* array struct */
|
|
|
|
+ sizeof(*tlv) + sizeof(*bitmap) + /* bitmap */
|
|
|
|
+ sizeof(*tlv) + /* empty ipv4 sync */
|
|
|
|
+ sizeof(*tlv) + /* empty ipv6 sync */
|
|
|
|
+ sizeof(*tlv) + /* empty magic */
|
|
|
|
+ sizeof(*tlv) + /* empty info timeout */
|
|
|
|
+ sizeof(*tlv) + sizeof(u32); /* ratelimit interval */
|
|
|
|
+
|
|
|
|
+ skb = ath10k_wmi_alloc_skb(ar, len);
|
|
|
|
+ if (!skb)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+
|
|
|
|
+ /* cmd */
|
|
|
|
+ ptr = (void *)skb->data;
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_WOW_ADD_PATTERN_CMD);
|
|
|
|
+ tlv->len = __cpu_to_le16(sizeof(*cmd));
|
|
|
|
+ cmd = (void *)tlv->value;
|
|
|
|
+
|
|
|
|
+ cmd->vdev_id = __cpu_to_le32(vdev_id);
|
|
|
|
+ cmd->pattern_id = __cpu_to_le32(pattern_id);
|
|
|
|
+ cmd->pattern_type = __cpu_to_le32(WOW_BITMAP_PATTERN);
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+ ptr += sizeof(*cmd);
|
|
|
|
+
|
|
|
|
+ /* bitmap */
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT);
|
|
|
|
+ tlv->len = __cpu_to_le16(sizeof(*tlv) + sizeof(*bitmap));
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_WOW_BITMAP_PATTERN_T);
|
|
|
|
+ tlv->len = __cpu_to_le16(sizeof(*bitmap));
|
|
|
|
+ bitmap = (void *)tlv->value;
|
|
|
|
+
|
|
|
|
+ memcpy(bitmap->patternbuf, pattern, pattern_len);
|
|
|
|
+ memcpy(bitmap->bitmaskbuf, bitmask, pattern_len);
|
|
|
|
+ bitmap->pattern_offset = __cpu_to_le32(pattern_offset);
|
|
|
|
+ bitmap->pattern_len = __cpu_to_le32(pattern_len);
|
|
|
|
+ bitmap->bitmask_len = __cpu_to_le32(pattern_len);
|
|
|
|
+ bitmap->pattern_id = __cpu_to_le32(pattern_id);
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+ ptr += sizeof(*bitmap);
|
|
|
|
+
|
|
|
|
+ /* ipv4 sync */
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT);
|
|
|
|
+ tlv->len = __cpu_to_le16(0);
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+
|
|
|
|
+ /* ipv6 sync */
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT);
|
|
|
|
+ tlv->len = __cpu_to_le16(0);
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+
|
|
|
|
+ /* magic */
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT);
|
|
|
|
+ tlv->len = __cpu_to_le16(0);
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+
|
|
|
|
+ /* pattern info timeout */
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_ARRAY_UINT32);
|
|
|
|
+ tlv->len = __cpu_to_le16(0);
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*tlv);
|
|
|
|
+
|
|
|
|
+ /* ratelimit interval */
|
|
|
|
+ tlv = ptr;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_ARRAY_UINT32);
|
|
|
|
+ tlv->len = __cpu_to_le16(sizeof(u32));
|
|
|
|
+
|
|
|
|
+ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv wow add pattern vdev_id %d pattern_id %d, pattern_offset %d\n",
|
|
|
|
+ vdev_id, pattern_id, pattern_offset);
|
|
|
|
+ return skb;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct sk_buff *
|
|
|
|
+ath10k_wmi_tlv_op_gen_wow_del_pattern(struct ath10k *ar, u32 vdev_id,
|
|
|
|
+ u32 pattern_id)
|
|
|
|
+{
|
|
|
|
+ struct wmi_tlv_wow_del_pattern_cmd *cmd;
|
|
|
|
+ struct wmi_tlv *tlv;
|
|
|
|
+ struct sk_buff *skb;
|
|
|
|
+ size_t len;
|
|
|
|
+
|
|
|
|
+ len = sizeof(*tlv) + sizeof(*cmd);
|
|
|
|
+ skb = ath10k_wmi_alloc_skb(ar, len);
|
|
|
|
+ if (!skb)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+
|
|
|
|
+ tlv = (struct wmi_tlv *)skb->data;
|
|
|
|
+ tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_WOW_DEL_PATTERN_CMD);
|
|
|
|
+ tlv->len = __cpu_to_le16(sizeof(*cmd));
|
|
|
|
+ cmd = (void *)tlv->value;
|
|
|
|
+
|
|
|
|
+ cmd->vdev_id = __cpu_to_le32(vdev_id);
|
|
|
|
+ cmd->pattern_id = __cpu_to_le32(pattern_id);
|
|
|
|
+ cmd->pattern_type = __cpu_to_le32(WOW_BITMAP_PATTERN);
|
|
|
|
+
|
|
|
|
+ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv wow del pattern vdev_id %d pattern_id %d\n",
|
|
|
|
+ vdev_id, pattern_id);
|
|
|
|
+ return skb;
|
|
|
|
+}
|
|
|
|
+
|
|
/****************/
|
|
/****************/
|
|
/* TLV mappings */
|
|
/* TLV mappings */
|
|
/****************/
|
|
/****************/
|
|
@@ -2972,6 +3100,8 @@ static const struct wmi_ops wmi_tlv_ops = {
|
|
.gen_wow_enable = ath10k_wmi_tlv_op_gen_wow_enable,
|
|
.gen_wow_enable = ath10k_wmi_tlv_op_gen_wow_enable,
|
|
.gen_wow_add_wakeup_event = ath10k_wmi_tlv_op_gen_wow_add_wakeup_event,
|
|
.gen_wow_add_wakeup_event = ath10k_wmi_tlv_op_gen_wow_add_wakeup_event,
|
|
.gen_wow_host_wakeup_ind = ath10k_wmi_tlv_gen_wow_host_wakeup_ind,
|
|
.gen_wow_host_wakeup_ind = ath10k_wmi_tlv_gen_wow_host_wakeup_ind,
|
|
|
|
+ .gen_wow_add_pattern = ath10k_wmi_tlv_op_gen_wow_add_pattern,
|
|
|
|
+ .gen_wow_del_pattern = ath10k_wmi_tlv_op_gen_wow_del_pattern,
|
|
};
|
|
};
|
|
|
|
|
|
/************/
|
|
/************/
|