wmi.c (0aea30a07ec6b50de0fc5f5b2ec34a68ead86b61) wmi.c (ba9177fcef21fa98406e73c472b5ac2eb4ec5f31)
1// SPDX-License-Identifier: BSD-3-Clause-Clear
2/*
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 */
5#include <linux/skbuff.h>
6#include <linux/ctype.h>
7#include <net/mac80211.h>
8#include <net/cfg80211.h>

--- 8221 unchanged lines hidden (view full) ---

8230 FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
8231 cmd->prob_req_oui = prob_req_oui;
8232
8233 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, "wmi scan prob req oui %d\n",
8234 prob_req_oui);
8235
8236 return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_SCAN_PROB_REQ_OUI_CMDID);
8237}
1// SPDX-License-Identifier: BSD-3-Clause-Clear
2/*
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 */
5#include <linux/skbuff.h>
6#include <linux/ctype.h>
7#include <net/mac80211.h>
8#include <net/cfg80211.h>

--- 8221 unchanged lines hidden (view full) ---

8230 FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
8231 cmd->prob_req_oui = prob_req_oui;
8232
8233 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, "wmi scan prob req oui %d\n",
8234 prob_req_oui);
8235
8236 return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_SCAN_PROB_REQ_OUI_CMDID);
8237}
8238
8239int ath11k_wmi_wow_add_wakeup_event(struct ath11k *ar, u32 vdev_id,
8240 enum wmi_wow_wakeup_event event,
8241 u32 enable)
8242{
8243 struct wmi_wow_add_del_event_cmd *cmd;
8244 struct sk_buff *skb;
8245 size_t len;
8246
8247 len = sizeof(*cmd);
8248 skb = ath11k_wmi_alloc_skb(ar->wmi->wmi_ab, len);
8249 if (!skb)
8250 return -ENOMEM;
8251
8252 cmd = (struct wmi_wow_add_del_event_cmd *)skb->data;
8253 cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_WOW_ADD_DEL_EVT_CMD) |
8254 FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
8255
8256 cmd->vdev_id = vdev_id;
8257 cmd->is_add = enable;
8258 cmd->event_bitmap = (1 << event);
8259
8260 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, "wmi tlv wow add wakeup event %s enable %d vdev_id %d\n",
8261 wow_wakeup_event(event), enable, vdev_id);
8262
8263 return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID);
8264}
8265
8266int ath11k_wmi_wow_add_pattern(struct ath11k *ar, u32 vdev_id, u32 pattern_id,
8267 const u8 *pattern, const u8 *mask,
8268 int pattern_len, int pattern_offset)
8269{
8270 struct wmi_wow_add_pattern_cmd *cmd;
8271 struct wmi_wow_bitmap_pattern *bitmap;
8272 struct wmi_tlv *tlv;
8273 struct sk_buff *skb;
8274 u8 *ptr;
8275 size_t len;
8276
8277 len = sizeof(*cmd) +
8278 sizeof(*tlv) + /* array struct */
8279 sizeof(*bitmap) + /* bitmap */
8280 sizeof(*tlv) + /* empty ipv4 sync */
8281 sizeof(*tlv) + /* empty ipv6 sync */
8282 sizeof(*tlv) + /* empty magic */
8283 sizeof(*tlv) + /* empty info timeout */
8284 sizeof(*tlv) + sizeof(u32); /* ratelimit interval */
8285
8286 skb = ath11k_wmi_alloc_skb(ar->wmi->wmi_ab, len);
8287 if (!skb)
8288 return -ENOMEM;
8289
8290 /* cmd */
8291 ptr = (u8 *)skb->data;
8292 cmd = (struct wmi_wow_add_pattern_cmd *)ptr;
8293 cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG,
8294 WMI_TAG_WOW_ADD_PATTERN_CMD) |
8295 FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
8296
8297 cmd->vdev_id = vdev_id;
8298 cmd->pattern_id = pattern_id;
8299 cmd->pattern_type = WOW_BITMAP_PATTERN;
8300
8301 ptr += sizeof(*cmd);
8302
8303 /* bitmap */
8304 tlv = (struct wmi_tlv *)ptr;
8305 tlv->header = FIELD_PREP(WMI_TLV_TAG,
8306 WMI_TAG_ARRAY_STRUCT) |
8307 FIELD_PREP(WMI_TLV_LEN, sizeof(*bitmap));
8308
8309 ptr += sizeof(*tlv);
8310
8311 bitmap = (struct wmi_wow_bitmap_pattern *)ptr;
8312 bitmap->tlv_header = FIELD_PREP(WMI_TLV_TAG,
8313 WMI_TAG_WOW_BITMAP_PATTERN_T) |
8314 FIELD_PREP(WMI_TLV_LEN, sizeof(*bitmap) - TLV_HDR_SIZE);
8315
8316 memcpy(bitmap->patternbuf, pattern, pattern_len);
8317 ath11k_ce_byte_swap(bitmap->patternbuf, roundup(pattern_len, 4));
8318 memcpy(bitmap->bitmaskbuf, mask, pattern_len);
8319 ath11k_ce_byte_swap(bitmap->bitmaskbuf, roundup(pattern_len, 4));
8320 bitmap->pattern_offset = pattern_offset;
8321 bitmap->pattern_len = pattern_len;
8322 bitmap->bitmask_len = pattern_len;
8323 bitmap->pattern_id = pattern_id;
8324
8325 ptr += sizeof(*bitmap);
8326
8327 /* ipv4 sync */
8328 tlv = (struct wmi_tlv *)ptr;
8329 tlv->header = FIELD_PREP(WMI_TLV_TAG,
8330 WMI_TAG_ARRAY_STRUCT) |
8331 FIELD_PREP(WMI_TLV_LEN, 0);
8332
8333 ptr += sizeof(*tlv);
8334
8335 /* ipv6 sync */
8336 tlv = (struct wmi_tlv *)ptr;
8337 tlv->header = FIELD_PREP(WMI_TLV_TAG,
8338 WMI_TAG_ARRAY_STRUCT) |
8339 FIELD_PREP(WMI_TLV_LEN, 0);
8340
8341 ptr += sizeof(*tlv);
8342
8343 /* magic */
8344 tlv = (struct wmi_tlv *)ptr;
8345 tlv->header = FIELD_PREP(WMI_TLV_TAG,
8346 WMI_TAG_ARRAY_STRUCT) |
8347 FIELD_PREP(WMI_TLV_LEN, 0);
8348
8349 ptr += sizeof(*tlv);
8350
8351 /* pattern info timeout */
8352 tlv = (struct wmi_tlv *)ptr;
8353 tlv->header = FIELD_PREP(WMI_TLV_TAG,
8354 WMI_TAG_ARRAY_UINT32) |
8355 FIELD_PREP(WMI_TLV_LEN, 0);
8356
8357 ptr += sizeof(*tlv);
8358
8359 /* ratelimit interval */
8360 tlv = (struct wmi_tlv *)ptr;
8361 tlv->header = FIELD_PREP(WMI_TLV_TAG,
8362 WMI_TAG_ARRAY_UINT32) |
8363 FIELD_PREP(WMI_TLV_LEN, sizeof(u32));
8364
8365 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, "wmi tlv wow add pattern vdev_id %d pattern_id %d pattern_offset %d\n",
8366 vdev_id, pattern_id, pattern_offset);
8367
8368 return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_WOW_ADD_WAKE_PATTERN_CMDID);
8369}
8370
8371int ath11k_wmi_wow_del_pattern(struct ath11k *ar, u32 vdev_id, u32 pattern_id)
8372{
8373 struct wmi_wow_del_pattern_cmd *cmd;
8374 struct sk_buff *skb;
8375 size_t len;
8376
8377 len = sizeof(*cmd);
8378 skb = ath11k_wmi_alloc_skb(ar->wmi->wmi_ab, len);
8379 if (!skb)
8380 return -ENOMEM;
8381
8382 cmd = (struct wmi_wow_del_pattern_cmd *)skb->data;
8383 cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG,
8384 WMI_TAG_WOW_DEL_PATTERN_CMD) |
8385 FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
8386
8387 cmd->vdev_id = vdev_id;
8388 cmd->pattern_id = pattern_id;
8389 cmd->pattern_type = WOW_BITMAP_PATTERN;
8390
8391 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, "wmi tlv wow del pattern vdev_id %d pattern_id %d\n",
8392 vdev_id, pattern_id);
8393
8394 return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_WOW_DEL_WAKE_PATTERN_CMDID);
8395}