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} |
|