2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2014 Qualcomm Atheros, Inc.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
28 struct wmi_tlv_policy
{
32 static const struct wmi_tlv_policy wmi_tlv_policies
[] = {
33 [WMI_TLV_TAG_ARRAY_BYTE
]
34 = { .min_len
= sizeof(u8
) },
35 [WMI_TLV_TAG_ARRAY_UINT32
]
36 = { .min_len
= sizeof(u32
) },
37 [WMI_TLV_TAG_STRUCT_SCAN_EVENT
]
38 = { .min_len
= sizeof(struct wmi_scan_event
) },
39 [WMI_TLV_TAG_STRUCT_MGMT_RX_HDR
]
40 = { .min_len
= sizeof(struct wmi_tlv_mgmt_rx_ev
) },
41 [WMI_TLV_TAG_STRUCT_CHAN_INFO_EVENT
]
42 = { .min_len
= sizeof(struct wmi_chan_info_event
) },
43 [WMI_TLV_TAG_STRUCT_VDEV_START_RESPONSE_EVENT
]
44 = { .min_len
= sizeof(struct wmi_vdev_start_response_event
) },
45 [WMI_TLV_TAG_STRUCT_PEER_STA_KICKOUT_EVENT
]
46 = { .min_len
= sizeof(struct wmi_peer_sta_kickout_event
) },
47 [WMI_TLV_TAG_STRUCT_HOST_SWBA_EVENT
]
48 = { .min_len
= sizeof(struct wmi_host_swba_event
) },
49 [WMI_TLV_TAG_STRUCT_TIM_INFO
]
50 = { .min_len
= sizeof(struct wmi_tim_info
) },
51 [WMI_TLV_TAG_STRUCT_P2P_NOA_INFO
]
52 = { .min_len
= sizeof(struct wmi_p2p_noa_info
) },
53 [WMI_TLV_TAG_STRUCT_SERVICE_READY_EVENT
]
54 = { .min_len
= sizeof(struct wmi_tlv_svc_rdy_ev
) },
55 [WMI_TLV_TAG_STRUCT_HAL_REG_CAPABILITIES
]
56 = { .min_len
= sizeof(struct hal_reg_capabilities
) },
57 [WMI_TLV_TAG_STRUCT_WLAN_HOST_MEM_REQ
]
58 = { .min_len
= sizeof(struct wlan_host_mem_req
) },
59 [WMI_TLV_TAG_STRUCT_READY_EVENT
]
60 = { .min_len
= sizeof(struct wmi_tlv_rdy_ev
) },
61 [WMI_TLV_TAG_STRUCT_OFFLOAD_BCN_TX_STATUS_EVENT
]
62 = { .min_len
= sizeof(struct wmi_tlv_bcn_tx_status_ev
) },
63 [WMI_TLV_TAG_STRUCT_DIAG_DATA_CONTAINER_EVENT
]
64 = { .min_len
= sizeof(struct wmi_tlv_diag_data_ev
) },
68 ath10k_wmi_tlv_iter(struct ath10k
*ar
, const void *ptr
, size_t len
,
69 int (*iter
)(struct ath10k
*ar
, u16 tag
, u16 len
,
70 const void *ptr
, void *data
),
73 const void *begin
= ptr
;
74 const struct wmi_tlv
*tlv
;
79 if (len
< sizeof(*tlv
)) {
80 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
81 "wmi tlv parse failure at byte %zd (%zu bytes left, %zu expected)\n",
82 ptr
- begin
, len
, sizeof(*tlv
));
87 tlv_tag
= __le16_to_cpu(tlv
->tag
);
88 tlv_len
= __le16_to_cpu(tlv
->len
);
93 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
94 "wmi tlv parse failure of tag %hhu at byte %zd (%zu bytes left, %hhu expected)\n",
95 tlv_tag
, ptr
- begin
, len
, tlv_len
);
99 if (tlv_tag
< ARRAY_SIZE(wmi_tlv_policies
) &&
100 wmi_tlv_policies
[tlv_tag
].min_len
&&
101 wmi_tlv_policies
[tlv_tag
].min_len
> tlv_len
) {
102 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
103 "wmi tlv parse failure of tag %hhu at byte %zd (%hhu bytes is less than min length %zu)\n",
104 tlv_tag
, ptr
- begin
, tlv_len
,
105 wmi_tlv_policies
[tlv_tag
].min_len
);
109 ret
= iter(ar
, tlv_tag
, tlv_len
, ptr
, data
);
120 static int ath10k_wmi_tlv_iter_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
121 const void *ptr
, void *data
)
123 const void **tb
= data
;
125 if (tag
< WMI_TLV_TAG_MAX
)
131 static int ath10k_wmi_tlv_parse(struct ath10k
*ar
, const void **tb
,
132 const void *ptr
, size_t len
)
134 return ath10k_wmi_tlv_iter(ar
, ptr
, len
, ath10k_wmi_tlv_iter_parse
,
139 ath10k_wmi_tlv_parse_alloc(struct ath10k
*ar
, const void *ptr
,
140 size_t len
, gfp_t gfp
)
145 tb
= kzalloc(sizeof(*tb
) * WMI_TLV_TAG_MAX
, gfp
);
147 return ERR_PTR(-ENOMEM
);
149 ret
= ath10k_wmi_tlv_parse(ar
, tb
, ptr
, len
);
158 static u16
ath10k_wmi_tlv_len(const void *ptr
)
160 return __le16_to_cpu((((const struct wmi_tlv
*)ptr
) - 1)->len
);
166 static int ath10k_wmi_tlv_event_bcn_tx_status(struct ath10k
*ar
,
170 const struct wmi_tlv_bcn_tx_status_ev
*ev
;
171 u32 vdev_id
, tx_status
;
174 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
177 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
181 ev
= tb
[WMI_TLV_TAG_STRUCT_OFFLOAD_BCN_TX_STATUS_EVENT
];
187 tx_status
= __le32_to_cpu(ev
->tx_status
);
188 vdev_id
= __le32_to_cpu(ev
->vdev_id
);
191 case WMI_TLV_BCN_TX_STATUS_OK
:
193 case WMI_TLV_BCN_TX_STATUS_XRETRY
:
194 case WMI_TLV_BCN_TX_STATUS_DROP
:
195 case WMI_TLV_BCN_TX_STATUS_FILTERED
:
196 /* FIXME: It's probably worth telling mac80211 to stop the
197 * interface as it is crippled.
199 ath10k_warn(ar
, "received bcn tmpl tx status on vdev %i: %d",
208 static int ath10k_wmi_tlv_event_diag_data(struct ath10k
*ar
,
212 const struct wmi_tlv_diag_data_ev
*ev
;
213 const struct wmi_tlv_diag_item
*item
;
215 int ret
, num_items
, len
;
217 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
220 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
224 ev
= tb
[WMI_TLV_TAG_STRUCT_DIAG_DATA_CONTAINER_EVENT
];
225 data
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
231 num_items
= __le32_to_cpu(ev
->num_items
);
232 len
= ath10k_wmi_tlv_len(data
);
234 while (num_items
--) {
237 if (len
< sizeof(*item
)) {
238 ath10k_warn(ar
, "failed to parse diag data: can't fit item header\n");
244 if (len
< sizeof(*item
) + __le16_to_cpu(item
->len
)) {
245 ath10k_warn(ar
, "failed to parse diag data: item is too long\n");
249 trace_ath10k_wmi_diag_container(ar
,
251 __le32_to_cpu(item
->timestamp
),
252 __le32_to_cpu(item
->code
),
253 __le16_to_cpu(item
->len
),
256 len
-= sizeof(*item
);
257 len
-= roundup(__le16_to_cpu(item
->len
), 4);
259 data
+= sizeof(*item
);
260 data
+= roundup(__le16_to_cpu(item
->len
), 4);
263 if (num_items
!= -1 || len
!= 0)
264 ath10k_warn(ar
, "failed to parse diag data event: num_items %d len %d\n",
275 static void ath10k_wmi_tlv_op_rx(struct ath10k
*ar
, struct sk_buff
*skb
)
277 struct wmi_cmd_hdr
*cmd_hdr
;
278 enum wmi_tlv_event_id id
;
280 cmd_hdr
= (struct wmi_cmd_hdr
*)skb
->data
;
281 id
= MS(__le32_to_cpu(cmd_hdr
->cmd_id
), WMI_CMD_HDR_CMD_ID
);
283 if (skb_pull(skb
, sizeof(struct wmi_cmd_hdr
)) == NULL
)
286 trace_ath10k_wmi_event(ar
, id
, skb
->data
, skb
->len
);
289 case WMI_TLV_MGMT_RX_EVENTID
:
290 ath10k_wmi_event_mgmt_rx(ar
, skb
);
291 /* mgmt_rx() owns the skb now! */
293 case WMI_TLV_SCAN_EVENTID
:
294 ath10k_wmi_event_scan(ar
, skb
);
296 case WMI_TLV_CHAN_INFO_EVENTID
:
297 ath10k_wmi_event_chan_info(ar
, skb
);
299 case WMI_TLV_ECHO_EVENTID
:
300 ath10k_wmi_event_echo(ar
, skb
);
302 case WMI_TLV_DEBUG_MESG_EVENTID
:
303 ath10k_wmi_event_debug_mesg(ar
, skb
);
305 case WMI_TLV_UPDATE_STATS_EVENTID
:
306 ath10k_wmi_event_update_stats(ar
, skb
);
308 case WMI_TLV_VDEV_START_RESP_EVENTID
:
309 ath10k_wmi_event_vdev_start_resp(ar
, skb
);
311 case WMI_TLV_VDEV_STOPPED_EVENTID
:
312 ath10k_wmi_event_vdev_stopped(ar
, skb
);
314 case WMI_TLV_PEER_STA_KICKOUT_EVENTID
:
315 ath10k_wmi_event_peer_sta_kickout(ar
, skb
);
317 case WMI_TLV_HOST_SWBA_EVENTID
:
318 ath10k_wmi_event_host_swba(ar
, skb
);
320 case WMI_TLV_TBTTOFFSET_UPDATE_EVENTID
:
321 ath10k_wmi_event_tbttoffset_update(ar
, skb
);
323 case WMI_TLV_PHYERR_EVENTID
:
324 ath10k_wmi_event_phyerr(ar
, skb
);
326 case WMI_TLV_ROAM_EVENTID
:
327 ath10k_wmi_event_roam(ar
, skb
);
329 case WMI_TLV_PROFILE_MATCH
:
330 ath10k_wmi_event_profile_match(ar
, skb
);
332 case WMI_TLV_DEBUG_PRINT_EVENTID
:
333 ath10k_wmi_event_debug_print(ar
, skb
);
335 case WMI_TLV_PDEV_QVIT_EVENTID
:
336 ath10k_wmi_event_pdev_qvit(ar
, skb
);
338 case WMI_TLV_WLAN_PROFILE_DATA_EVENTID
:
339 ath10k_wmi_event_wlan_profile_data(ar
, skb
);
341 case WMI_TLV_RTT_MEASUREMENT_REPORT_EVENTID
:
342 ath10k_wmi_event_rtt_measurement_report(ar
, skb
);
344 case WMI_TLV_TSF_MEASUREMENT_REPORT_EVENTID
:
345 ath10k_wmi_event_tsf_measurement_report(ar
, skb
);
347 case WMI_TLV_RTT_ERROR_REPORT_EVENTID
:
348 ath10k_wmi_event_rtt_error_report(ar
, skb
);
350 case WMI_TLV_WOW_WAKEUP_HOST_EVENTID
:
351 ath10k_wmi_event_wow_wakeup_host(ar
, skb
);
353 case WMI_TLV_DCS_INTERFERENCE_EVENTID
:
354 ath10k_wmi_event_dcs_interference(ar
, skb
);
356 case WMI_TLV_PDEV_TPC_CONFIG_EVENTID
:
357 ath10k_wmi_event_pdev_tpc_config(ar
, skb
);
359 case WMI_TLV_PDEV_FTM_INTG_EVENTID
:
360 ath10k_wmi_event_pdev_ftm_intg(ar
, skb
);
362 case WMI_TLV_GTK_OFFLOAD_STATUS_EVENTID
:
363 ath10k_wmi_event_gtk_offload_status(ar
, skb
);
365 case WMI_TLV_GTK_REKEY_FAIL_EVENTID
:
366 ath10k_wmi_event_gtk_rekey_fail(ar
, skb
);
368 case WMI_TLV_TX_DELBA_COMPLETE_EVENTID
:
369 ath10k_wmi_event_delba_complete(ar
, skb
);
371 case WMI_TLV_TX_ADDBA_COMPLETE_EVENTID
:
372 ath10k_wmi_event_addba_complete(ar
, skb
);
374 case WMI_TLV_VDEV_INSTALL_KEY_COMPLETE_EVENTID
:
375 ath10k_wmi_event_vdev_install_key_complete(ar
, skb
);
377 case WMI_TLV_SERVICE_READY_EVENTID
:
378 ath10k_wmi_event_service_ready(ar
, skb
);
380 case WMI_TLV_READY_EVENTID
:
381 ath10k_wmi_event_ready(ar
, skb
);
383 case WMI_TLV_OFFLOAD_BCN_TX_STATUS_EVENTID
:
384 ath10k_wmi_tlv_event_bcn_tx_status(ar
, skb
);
386 case WMI_TLV_DIAG_DATA_CONTAINER_EVENTID
:
387 ath10k_wmi_tlv_event_diag_data(ar
, skb
);
390 ath10k_warn(ar
, "Unknown eventid: %d\n", id
);
397 static int ath10k_wmi_tlv_op_pull_scan_ev(struct ath10k
*ar
,
399 struct wmi_scan_ev_arg
*arg
)
402 const struct wmi_scan_event
*ev
;
405 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
408 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
412 ev
= tb
[WMI_TLV_TAG_STRUCT_SCAN_EVENT
];
418 arg
->event_type
= ev
->event_type
;
419 arg
->reason
= ev
->reason
;
420 arg
->channel_freq
= ev
->channel_freq
;
421 arg
->scan_req_id
= ev
->scan_req_id
;
422 arg
->scan_id
= ev
->scan_id
;
423 arg
->vdev_id
= ev
->vdev_id
;
429 static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev(struct ath10k
*ar
,
431 struct wmi_mgmt_rx_ev_arg
*arg
)
434 const struct wmi_tlv_mgmt_rx_ev
*ev
;
439 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
442 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
446 ev
= tb
[WMI_TLV_TAG_STRUCT_MGMT_RX_HDR
];
447 frame
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
454 arg
->channel
= ev
->channel
;
455 arg
->buf_len
= ev
->buf_len
;
456 arg
->status
= ev
->status
;
458 arg
->phy_mode
= ev
->phy_mode
;
459 arg
->rate
= ev
->rate
;
461 msdu_len
= __le32_to_cpu(arg
->buf_len
);
463 if (skb
->len
< (frame
- skb
->data
) + msdu_len
) {
468 /* shift the sk_buff to point to `frame` */
470 skb_put(skb
, frame
- skb
->data
);
471 skb_pull(skb
, frame
- skb
->data
);
472 skb_put(skb
, msdu_len
);
478 static int ath10k_wmi_tlv_op_pull_ch_info_ev(struct ath10k
*ar
,
480 struct wmi_ch_info_ev_arg
*arg
)
483 const struct wmi_chan_info_event
*ev
;
486 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
489 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
493 ev
= tb
[WMI_TLV_TAG_STRUCT_CHAN_INFO_EVENT
];
499 arg
->err_code
= ev
->err_code
;
500 arg
->freq
= ev
->freq
;
501 arg
->cmd_flags
= ev
->cmd_flags
;
502 arg
->noise_floor
= ev
->noise_floor
;
503 arg
->rx_clear_count
= ev
->rx_clear_count
;
504 arg
->cycle_count
= ev
->cycle_count
;
511 ath10k_wmi_tlv_op_pull_vdev_start_ev(struct ath10k
*ar
, struct sk_buff
*skb
,
512 struct wmi_vdev_start_ev_arg
*arg
)
515 const struct wmi_vdev_start_response_event
*ev
;
518 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
521 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
525 ev
= tb
[WMI_TLV_TAG_STRUCT_VDEV_START_RESPONSE_EVENT
];
531 skb_pull(skb
, sizeof(*ev
));
532 arg
->vdev_id
= ev
->vdev_id
;
533 arg
->req_id
= ev
->req_id
;
534 arg
->resp_type
= ev
->resp_type
;
535 arg
->status
= ev
->status
;
541 static int ath10k_wmi_tlv_op_pull_peer_kick_ev(struct ath10k
*ar
,
543 struct wmi_peer_kick_ev_arg
*arg
)
546 const struct wmi_peer_sta_kickout_event
*ev
;
549 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
552 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
556 ev
= tb
[WMI_TLV_TAG_STRUCT_PEER_STA_KICKOUT_EVENT
];
562 arg
->mac_addr
= ev
->peer_macaddr
.addr
;
568 struct wmi_tlv_swba_parse
{
569 const struct wmi_host_swba_event
*ev
;
574 struct wmi_swba_ev_arg
*arg
;
577 static int ath10k_wmi_tlv_swba_tim_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
578 const void *ptr
, void *data
)
580 struct wmi_tlv_swba_parse
*swba
= data
;
582 if (tag
!= WMI_TLV_TAG_STRUCT_TIM_INFO
)
585 if (swba
->n_tim
>= ARRAY_SIZE(swba
->arg
->tim_info
))
588 swba
->arg
->tim_info
[swba
->n_tim
++] = ptr
;
592 static int ath10k_wmi_tlv_swba_noa_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
593 const void *ptr
, void *data
)
595 struct wmi_tlv_swba_parse
*swba
= data
;
597 if (tag
!= WMI_TLV_TAG_STRUCT_P2P_NOA_INFO
)
600 if (swba
->n_noa
>= ARRAY_SIZE(swba
->arg
->noa_info
))
603 swba
->arg
->noa_info
[swba
->n_noa
++] = ptr
;
607 static int ath10k_wmi_tlv_swba_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
608 const void *ptr
, void *data
)
610 struct wmi_tlv_swba_parse
*swba
= data
;
614 case WMI_TLV_TAG_STRUCT_HOST_SWBA_EVENT
:
617 case WMI_TLV_TAG_ARRAY_STRUCT
:
618 if (!swba
->tim_done
) {
619 swba
->tim_done
= true;
620 ret
= ath10k_wmi_tlv_iter(ar
, ptr
, len
,
621 ath10k_wmi_tlv_swba_tim_parse
,
625 } else if (!swba
->noa_done
) {
626 swba
->noa_done
= true;
627 ret
= ath10k_wmi_tlv_iter(ar
, ptr
, len
,
628 ath10k_wmi_tlv_swba_noa_parse
,
640 static int ath10k_wmi_tlv_op_pull_swba_ev(struct ath10k
*ar
,
642 struct wmi_swba_ev_arg
*arg
)
644 struct wmi_tlv_swba_parse swba
= { .arg
= arg
};
649 ret
= ath10k_wmi_tlv_iter(ar
, skb
->data
, skb
->len
,
650 ath10k_wmi_tlv_swba_parse
, &swba
);
652 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
659 arg
->vdev_map
= swba
.ev
->vdev_map
;
661 for (map
= __le32_to_cpu(arg
->vdev_map
), n_vdevs
= 0; map
; map
>>= 1)
665 if (n_vdevs
!= swba
.n_tim
||
666 n_vdevs
!= swba
.n_noa
)
672 static int ath10k_wmi_tlv_op_pull_phyerr_ev(struct ath10k
*ar
,
674 struct wmi_phyerr_ev_arg
*arg
)
677 const struct wmi_tlv_phyerr_ev
*ev
;
681 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
684 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
688 ev
= tb
[WMI_TLV_TAG_STRUCT_COMB_PHYERR_RX_HDR
];
689 phyerrs
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
691 if (!ev
|| !phyerrs
) {
696 arg
->num_phyerrs
= ev
->num_phyerrs
;
697 arg
->tsf_l32
= ev
->tsf_l32
;
698 arg
->tsf_u32
= ev
->tsf_u32
;
699 arg
->buf_len
= ev
->buf_len
;
700 arg
->phyerrs
= phyerrs
;
706 #define WMI_TLV_ABI_VER_NS0 0x5F414351
707 #define WMI_TLV_ABI_VER_NS1 0x00004C4D
708 #define WMI_TLV_ABI_VER_NS2 0x00000000
709 #define WMI_TLV_ABI_VER_NS3 0x00000000
711 #define WMI_TLV_ABI_VER0_MAJOR 1
712 #define WMI_TLV_ABI_VER0_MINOR 0
713 #define WMI_TLV_ABI_VER0 ((((WMI_TLV_ABI_VER0_MAJOR) << 24) & 0xFF000000) | \
714 (((WMI_TLV_ABI_VER0_MINOR) << 0) & 0x00FFFFFF))
715 #define WMI_TLV_ABI_VER1 53
718 ath10k_wmi_tlv_parse_mem_reqs(struct ath10k
*ar
, u16 tag
, u16 len
,
719 const void *ptr
, void *data
)
721 struct wmi_svc_rdy_ev_arg
*arg
= data
;
724 if (tag
!= WMI_TLV_TAG_STRUCT_WLAN_HOST_MEM_REQ
)
727 for (i
= 0; i
< ARRAY_SIZE(arg
->mem_reqs
); i
++) {
728 if (!arg
->mem_reqs
[i
]) {
729 arg
->mem_reqs
[i
] = ptr
;
737 static int ath10k_wmi_tlv_op_pull_svc_rdy_ev(struct ath10k
*ar
,
739 struct wmi_svc_rdy_ev_arg
*arg
)
742 const struct hal_reg_capabilities
*reg
;
743 const struct wmi_tlv_svc_rdy_ev
*ev
;
744 const __le32
*svc_bmap
;
745 const struct wlan_host_mem_req
*mem_reqs
;
748 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
751 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
755 ev
= tb
[WMI_TLV_TAG_STRUCT_SERVICE_READY_EVENT
];
756 reg
= tb
[WMI_TLV_TAG_STRUCT_HAL_REG_CAPABILITIES
];
757 svc_bmap
= tb
[WMI_TLV_TAG_ARRAY_UINT32
];
758 mem_reqs
= tb
[WMI_TLV_TAG_ARRAY_STRUCT
];
760 if (!ev
|| !reg
|| !svc_bmap
|| !mem_reqs
) {
765 /* This is an internal ABI compatibility check for WMI TLV so check it
766 * here instead of the generic WMI code.
768 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
769 "wmi tlv abi 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x\n",
770 __le32_to_cpu(ev
->abi
.abi_ver0
), WMI_TLV_ABI_VER0
,
771 __le32_to_cpu(ev
->abi
.abi_ver_ns0
), WMI_TLV_ABI_VER_NS0
,
772 __le32_to_cpu(ev
->abi
.abi_ver_ns1
), WMI_TLV_ABI_VER_NS1
,
773 __le32_to_cpu(ev
->abi
.abi_ver_ns2
), WMI_TLV_ABI_VER_NS2
,
774 __le32_to_cpu(ev
->abi
.abi_ver_ns3
), WMI_TLV_ABI_VER_NS3
);
776 if (__le32_to_cpu(ev
->abi
.abi_ver0
) != WMI_TLV_ABI_VER0
||
777 __le32_to_cpu(ev
->abi
.abi_ver_ns0
) != WMI_TLV_ABI_VER_NS0
||
778 __le32_to_cpu(ev
->abi
.abi_ver_ns1
) != WMI_TLV_ABI_VER_NS1
||
779 __le32_to_cpu(ev
->abi
.abi_ver_ns2
) != WMI_TLV_ABI_VER_NS2
||
780 __le32_to_cpu(ev
->abi
.abi_ver_ns3
) != WMI_TLV_ABI_VER_NS3
) {
785 arg
->min_tx_power
= ev
->hw_min_tx_power
;
786 arg
->max_tx_power
= ev
->hw_max_tx_power
;
787 arg
->ht_cap
= ev
->ht_cap_info
;
788 arg
->vht_cap
= ev
->vht_cap_info
;
789 arg
->sw_ver0
= ev
->abi
.abi_ver0
;
790 arg
->sw_ver1
= ev
->abi
.abi_ver1
;
791 arg
->fw_build
= ev
->fw_build_vers
;
792 arg
->phy_capab
= ev
->phy_capability
;
793 arg
->num_rf_chains
= ev
->num_rf_chains
;
794 arg
->eeprom_rd
= reg
->eeprom_rd
;
795 arg
->num_mem_reqs
= ev
->num_mem_reqs
;
796 arg
->service_map
= svc_bmap
;
797 arg
->service_map_len
= ath10k_wmi_tlv_len(svc_bmap
);
799 ret
= ath10k_wmi_tlv_iter(ar
, mem_reqs
, ath10k_wmi_tlv_len(mem_reqs
),
800 ath10k_wmi_tlv_parse_mem_reqs
, arg
);
803 ath10k_warn(ar
, "failed to parse mem_reqs tlv: %d\n", ret
);
811 static int ath10k_wmi_tlv_op_pull_rdy_ev(struct ath10k
*ar
,
813 struct wmi_rdy_ev_arg
*arg
)
816 const struct wmi_tlv_rdy_ev
*ev
;
819 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
822 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
826 ev
= tb
[WMI_TLV_TAG_STRUCT_READY_EVENT
];
832 arg
->sw_version
= ev
->abi
.abi_ver0
;
833 arg
->abi_version
= ev
->abi
.abi_ver1
;
834 arg
->status
= ev
->status
;
835 arg
->mac_addr
= ev
->mac_addr
.addr
;
841 static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k
*ar
,
843 struct ath10k_fw_stats
*stats
)
846 const struct wmi_stats_event
*ev
;
848 u32 num_pdev_stats
, num_vdev_stats
, num_peer_stats
;
852 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
855 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
859 ev
= tb
[WMI_TLV_TAG_STRUCT_STATS_EVENT
];
860 data
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
867 data_len
= ath10k_wmi_tlv_len(data
);
868 num_pdev_stats
= __le32_to_cpu(ev
->num_pdev_stats
);
869 num_vdev_stats
= __le32_to_cpu(ev
->num_vdev_stats
);
870 num_peer_stats
= __le32_to_cpu(ev
->num_peer_stats
);
872 WARN_ON(1); /* FIXME: not implemented yet */
878 static struct sk_buff
*
879 ath10k_wmi_tlv_op_gen_pdev_suspend(struct ath10k
*ar
, u32 opt
)
881 struct wmi_tlv_pdev_suspend
*cmd
;
885 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
887 return ERR_PTR(-ENOMEM
);
889 tlv
= (void *)skb
->data
;
890 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SUSPEND_CMD
);
891 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
892 cmd
= (void *)tlv
->value
;
893 cmd
->opt
= __cpu_to_le32(opt
);
895 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev suspend\n");
899 static struct sk_buff
*
900 ath10k_wmi_tlv_op_gen_pdev_resume(struct ath10k
*ar
)
902 struct wmi_tlv_resume_cmd
*cmd
;
906 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
908 return ERR_PTR(-ENOMEM
);
910 tlv
= (void *)skb
->data
;
911 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_RESUME_CMD
);
912 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
913 cmd
= (void *)tlv
->value
;
914 cmd
->reserved
= __cpu_to_le32(0);
916 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev resume\n");
920 static struct sk_buff
*
921 ath10k_wmi_tlv_op_gen_pdev_set_rd(struct ath10k
*ar
,
922 u16 rd
, u16 rd2g
, u16 rd5g
,
923 u16 ctl2g
, u16 ctl5g
,
924 enum wmi_dfs_region dfs_reg
)
926 struct wmi_tlv_pdev_set_rd_cmd
*cmd
;
930 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
932 return ERR_PTR(-ENOMEM
);
934 tlv
= (void *)skb
->data
;
935 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SET_REGDOMAIN_CMD
);
936 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
937 cmd
= (void *)tlv
->value
;
938 cmd
->regd
= __cpu_to_le32(rd
);
939 cmd
->regd_2ghz
= __cpu_to_le32(rd2g
);
940 cmd
->regd_5ghz
= __cpu_to_le32(rd5g
);
941 cmd
->conform_limit_2ghz
= __cpu_to_le32(rd2g
);
942 cmd
->conform_limit_5ghz
= __cpu_to_le32(rd5g
);
944 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev set rd\n");
948 static struct sk_buff
*
949 ath10k_wmi_tlv_op_gen_pdev_set_param(struct ath10k
*ar
, u32 param_id
,
952 struct wmi_tlv_pdev_set_param_cmd
*cmd
;
956 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
958 return ERR_PTR(-ENOMEM
);
960 tlv
= (void *)skb
->data
;
961 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SET_PARAM_CMD
);
962 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
963 cmd
= (void *)tlv
->value
;
964 cmd
->param_id
= __cpu_to_le32(param_id
);
965 cmd
->param_value
= __cpu_to_le32(param_value
);
967 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev set param\n");
971 static struct sk_buff
*ath10k_wmi_tlv_op_gen_init(struct ath10k
*ar
)
975 struct wmi_tlv_init_cmd
*cmd
;
976 struct wmi_tlv_resource_config
*cfg
;
977 struct wmi_host_mem_chunks
*chunks
;
978 size_t len
, chunks_len
;
981 chunks_len
= ar
->wmi
.num_mem_chunks
* sizeof(struct host_memory_chunk
);
982 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
983 (sizeof(*tlv
) + sizeof(*cfg
)) +
984 (sizeof(*tlv
) + chunks_len
);
986 skb
= ath10k_wmi_alloc_skb(ar
, len
);
988 return ERR_PTR(-ENOMEM
);
993 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_INIT_CMD
);
994 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
995 cmd
= (void *)tlv
->value
;
1000 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_RESOURCE_CONFIG
);
1001 tlv
->len
= __cpu_to_le16(sizeof(*cfg
));
1002 cfg
= (void *)tlv
->value
;
1003 ptr
+= sizeof(*tlv
);
1004 ptr
+= sizeof(*cfg
);
1007 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
1008 tlv
->len
= __cpu_to_le16(chunks_len
);
1009 chunks
= (void *)tlv
->value
;
1011 ptr
+= sizeof(*tlv
);
1014 cmd
->abi
.abi_ver0
= __cpu_to_le32(WMI_TLV_ABI_VER0
);
1015 cmd
->abi
.abi_ver1
= __cpu_to_le32(WMI_TLV_ABI_VER1
);
1016 cmd
->abi
.abi_ver_ns0
= __cpu_to_le32(WMI_TLV_ABI_VER_NS0
);
1017 cmd
->abi
.abi_ver_ns1
= __cpu_to_le32(WMI_TLV_ABI_VER_NS1
);
1018 cmd
->abi
.abi_ver_ns2
= __cpu_to_le32(WMI_TLV_ABI_VER_NS2
);
1019 cmd
->abi
.abi_ver_ns3
= __cpu_to_le32(WMI_TLV_ABI_VER_NS3
);
1020 cmd
->num_host_mem_chunks
= __cpu_to_le32(ar
->wmi
.num_mem_chunks
);
1022 cfg
->num_vdevs
= __cpu_to_le32(TARGET_TLV_NUM_VDEVS
);
1023 cfg
->num_peers
= __cpu_to_le32(TARGET_TLV_NUM_PEERS
);
1024 cfg
->num_offload_peers
= __cpu_to_le32(0);
1025 cfg
->num_offload_reorder_bufs
= __cpu_to_le32(0);
1026 cfg
->num_peer_keys
= __cpu_to_le32(2);
1027 cfg
->num_tids
= __cpu_to_le32(TARGET_TLV_NUM_TIDS
);
1028 cfg
->ast_skid_limit
= __cpu_to_le32(0x10);
1029 cfg
->tx_chain_mask
= __cpu_to_le32(0x7);
1030 cfg
->rx_chain_mask
= __cpu_to_le32(0x7);
1031 cfg
->rx_timeout_pri
[0] = __cpu_to_le32(0x64);
1032 cfg
->rx_timeout_pri
[1] = __cpu_to_le32(0x64);
1033 cfg
->rx_timeout_pri
[2] = __cpu_to_le32(0x64);
1034 cfg
->rx_timeout_pri
[3] = __cpu_to_le32(0x28);
1035 cfg
->rx_decap_mode
= __cpu_to_le32(1);
1036 cfg
->scan_max_pending_reqs
= __cpu_to_le32(4);
1037 cfg
->bmiss_offload_max_vdev
= __cpu_to_le32(3);
1038 cfg
->roam_offload_max_vdev
= __cpu_to_le32(3);
1039 cfg
->roam_offload_max_ap_profiles
= __cpu_to_le32(8);
1040 cfg
->num_mcast_groups
= __cpu_to_le32(0);
1041 cfg
->num_mcast_table_elems
= __cpu_to_le32(0);
1042 cfg
->mcast2ucast_mode
= __cpu_to_le32(0);
1043 cfg
->tx_dbg_log_size
= __cpu_to_le32(0x400);
1044 cfg
->num_wds_entries
= __cpu_to_le32(0x20);
1045 cfg
->dma_burst_size
= __cpu_to_le32(0);
1046 cfg
->mac_aggr_delim
= __cpu_to_le32(0);
1047 cfg
->rx_skip_defrag_timeout_dup_detection_check
= __cpu_to_le32(0);
1048 cfg
->vow_config
= __cpu_to_le32(0);
1049 cfg
->gtk_offload_max_vdev
= __cpu_to_le32(2);
1050 cfg
->num_msdu_desc
= __cpu_to_le32(TARGET_TLV_NUM_MSDU_DESC
);
1051 cfg
->max_frag_entries
= __cpu_to_le32(2);
1052 cfg
->num_tdls_vdevs
= __cpu_to_le32(1);
1053 cfg
->num_tdls_conn_table_entries
= __cpu_to_le32(0x20);
1054 cfg
->beacon_tx_offload_max_vdev
= __cpu_to_le32(2);
1055 cfg
->num_multicast_filter_entries
= __cpu_to_le32(5);
1056 cfg
->num_wow_filters
= __cpu_to_le32(0x16);
1057 cfg
->num_keep_alive_pattern
= __cpu_to_le32(6);
1058 cfg
->keep_alive_pattern_size
= __cpu_to_le32(0);
1059 cfg
->max_tdls_concurrent_sleep_sta
= __cpu_to_le32(1);
1060 cfg
->max_tdls_concurrent_buffer_sta
= __cpu_to_le32(1);
1062 ath10k_wmi_put_host_mem_chunks(ar
, chunks
);
1064 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv init\n");
1068 static struct sk_buff
*
1069 ath10k_wmi_tlv_op_gen_start_scan(struct ath10k
*ar
,
1070 const struct wmi_start_scan_arg
*arg
)
1072 struct wmi_tlv_start_scan_cmd
*cmd
;
1073 struct wmi_tlv
*tlv
;
1074 struct sk_buff
*skb
;
1075 size_t len
, chan_len
, ssid_len
, bssid_len
, ie_len
;
1077 struct wmi_ssid
*ssids
;
1078 struct wmi_mac_addr
*addrs
;
1082 ret
= ath10k_wmi_start_scan_verify(arg
);
1084 return ERR_PTR(ret
);
1086 chan_len
= arg
->n_channels
* sizeof(__le32
);
1087 ssid_len
= arg
->n_ssids
* sizeof(struct wmi_ssid
);
1088 bssid_len
= arg
->n_bssids
* sizeof(struct wmi_mac_addr
);
1089 ie_len
= roundup(arg
->ie_len
, 4);
1090 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1091 (arg
->n_channels
? sizeof(*tlv
) + chan_len
: 0) +
1092 (arg
->n_ssids
? sizeof(*tlv
) + ssid_len
: 0) +
1093 (arg
->n_bssids
? sizeof(*tlv
) + bssid_len
: 0) +
1094 (arg
->ie_len
? sizeof(*tlv
) + ie_len
: 0);
1096 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1098 return ERR_PTR(-ENOMEM
);
1100 ptr
= (void *)skb
->data
;
1102 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_START_SCAN_CMD
);
1103 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1104 cmd
= (void *)tlv
->value
;
1106 ath10k_wmi_put_start_scan_common(&cmd
->common
, arg
);
1107 cmd
->burst_duration_ms
= __cpu_to_le32(0);
1108 cmd
->num_channels
= __cpu_to_le32(arg
->n_channels
);
1109 cmd
->num_ssids
= __cpu_to_le32(arg
->n_ssids
);
1110 cmd
->num_bssids
= __cpu_to_le32(arg
->n_bssids
);
1111 cmd
->ie_len
= __cpu_to_le32(arg
->ie_len
);
1112 cmd
->num_probes
= __cpu_to_le32(3);
1114 /* FIXME: There are some scan flag inconsistencies across firmwares,
1115 * e.g. WMI-TLV inverts the logic behind the following flag.
1117 cmd
->common
.scan_ctrl_flags
^= __cpu_to_le32(WMI_SCAN_FILTER_PROBE_REQ
);
1119 ptr
+= sizeof(*tlv
);
1120 ptr
+= sizeof(*cmd
);
1123 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_UINT32
);
1124 tlv
->len
= __cpu_to_le16(chan_len
);
1125 chans
= (void *)tlv
->value
;
1126 for (i
= 0; i
< arg
->n_channels
; i
++)
1127 chans
[i
] = __cpu_to_le32(arg
->channels
[i
]);
1129 ptr
+= sizeof(*tlv
);
1133 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_FIXED_STRUCT
);
1134 tlv
->len
= __cpu_to_le16(ssid_len
);
1135 ssids
= (void *)tlv
->value
;
1136 for (i
= 0; i
< arg
->n_ssids
; i
++) {
1137 ssids
[i
].ssid_len
= __cpu_to_le32(arg
->ssids
[i
].len
);
1138 memcpy(ssids
[i
].ssid
, arg
->ssids
[i
].ssid
, arg
->ssids
[i
].len
);
1141 ptr
+= sizeof(*tlv
);
1145 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_FIXED_STRUCT
);
1146 tlv
->len
= __cpu_to_le16(bssid_len
);
1147 addrs
= (void *)tlv
->value
;
1148 for (i
= 0; i
< arg
->n_bssids
; i
++)
1149 ether_addr_copy(addrs
[i
].addr
, arg
->bssids
[i
].bssid
);
1151 ptr
+= sizeof(*tlv
);
1155 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1156 tlv
->len
= __cpu_to_le16(ie_len
);
1157 memcpy(tlv
->value
, arg
->ie
, arg
->ie_len
);
1159 ptr
+= sizeof(*tlv
);
1162 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv start scan\n");
1166 static struct sk_buff
*
1167 ath10k_wmi_tlv_op_gen_stop_scan(struct ath10k
*ar
,
1168 const struct wmi_stop_scan_arg
*arg
)
1170 struct wmi_stop_scan_cmd
*cmd
;
1171 struct wmi_tlv
*tlv
;
1172 struct sk_buff
*skb
;
1176 if (arg
->req_id
> 0xFFF)
1177 return ERR_PTR(-EINVAL
);
1178 if (arg
->req_type
== WMI_SCAN_STOP_ONE
&& arg
->u
.scan_id
> 0xFFF)
1179 return ERR_PTR(-EINVAL
);
1181 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1183 return ERR_PTR(-ENOMEM
);
1185 scan_id
= arg
->u
.scan_id
;
1186 scan_id
|= WMI_HOST_SCAN_REQ_ID_PREFIX
;
1188 req_id
= arg
->req_id
;
1189 req_id
|= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX
;
1191 tlv
= (void *)skb
->data
;
1192 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STOP_SCAN_CMD
);
1193 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1194 cmd
= (void *)tlv
->value
;
1195 cmd
->req_type
= __cpu_to_le32(arg
->req_type
);
1196 cmd
->vdev_id
= __cpu_to_le32(arg
->u
.vdev_id
);
1197 cmd
->scan_id
= __cpu_to_le32(scan_id
);
1198 cmd
->scan_req_id
= __cpu_to_le32(req_id
);
1200 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv stop scan\n");
1204 static struct sk_buff
*
1205 ath10k_wmi_tlv_op_gen_vdev_create(struct ath10k
*ar
,
1207 enum wmi_vdev_type vdev_type
,
1208 enum wmi_vdev_subtype vdev_subtype
,
1209 const u8 mac_addr
[ETH_ALEN
])
1211 struct wmi_vdev_create_cmd
*cmd
;
1212 struct wmi_tlv
*tlv
;
1213 struct sk_buff
*skb
;
1215 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1217 return ERR_PTR(-ENOMEM
);
1219 tlv
= (void *)skb
->data
;
1220 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_CREATE_CMD
);
1221 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1222 cmd
= (void *)tlv
->value
;
1223 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1224 cmd
->vdev_type
= __cpu_to_le32(vdev_type
);
1225 cmd
->vdev_subtype
= __cpu_to_le32(vdev_subtype
);
1226 ether_addr_copy(cmd
->vdev_macaddr
.addr
, mac_addr
);
1228 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev create\n");
1232 static struct sk_buff
*
1233 ath10k_wmi_tlv_op_gen_vdev_delete(struct ath10k
*ar
, u32 vdev_id
)
1235 struct wmi_vdev_delete_cmd
*cmd
;
1236 struct wmi_tlv
*tlv
;
1237 struct sk_buff
*skb
;
1239 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1241 return ERR_PTR(-ENOMEM
);
1243 tlv
= (void *)skb
->data
;
1244 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_DELETE_CMD
);
1245 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1246 cmd
= (void *)tlv
->value
;
1247 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1249 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev delete\n");
1253 static struct sk_buff
*
1254 ath10k_wmi_tlv_op_gen_vdev_start(struct ath10k
*ar
,
1255 const struct wmi_vdev_start_request_arg
*arg
,
1258 struct wmi_tlv_vdev_start_cmd
*cmd
;
1259 struct wmi_channel
*ch
;
1260 struct wmi_p2p_noa_descriptor
*noa
;
1261 struct wmi_tlv
*tlv
;
1262 struct sk_buff
*skb
;
1267 if (WARN_ON(arg
->ssid
&& arg
->ssid_len
== 0))
1268 return ERR_PTR(-EINVAL
);
1269 if (WARN_ON(arg
->hidden_ssid
&& !arg
->ssid
))
1270 return ERR_PTR(-EINVAL
);
1271 if (WARN_ON(arg
->ssid_len
> sizeof(cmd
->ssid
.ssid
)))
1272 return ERR_PTR(-EINVAL
);
1274 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1275 (sizeof(*tlv
) + sizeof(*ch
)) +
1277 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1279 return ERR_PTR(-ENOMEM
);
1281 if (arg
->hidden_ssid
)
1282 flags
|= WMI_VDEV_START_HIDDEN_SSID
;
1283 if (arg
->pmf_enabled
)
1284 flags
|= WMI_VDEV_START_PMF_ENABLED
;
1286 ptr
= (void *)skb
->data
;
1289 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_START_REQUEST_CMD
);
1290 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1291 cmd
= (void *)tlv
->value
;
1292 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1293 cmd
->bcn_intval
= __cpu_to_le32(arg
->bcn_intval
);
1294 cmd
->dtim_period
= __cpu_to_le32(arg
->dtim_period
);
1295 cmd
->flags
= __cpu_to_le32(flags
);
1296 cmd
->bcn_tx_rate
= __cpu_to_le32(arg
->bcn_tx_rate
);
1297 cmd
->bcn_tx_power
= __cpu_to_le32(arg
->bcn_tx_power
);
1298 cmd
->disable_hw_ack
= __cpu_to_le32(arg
->disable_hw_ack
);
1301 cmd
->ssid
.ssid_len
= __cpu_to_le32(arg
->ssid_len
);
1302 memcpy(cmd
->ssid
.ssid
, arg
->ssid
, arg
->ssid_len
);
1305 ptr
+= sizeof(*tlv
);
1306 ptr
+= sizeof(*cmd
);
1309 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_CHANNEL
);
1310 tlv
->len
= __cpu_to_le16(sizeof(*ch
));
1311 ch
= (void *)tlv
->value
;
1312 ath10k_wmi_put_wmi_channel(ch
, &arg
->channel
);
1314 ptr
+= sizeof(*tlv
);
1318 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
1320 noa
= (void *)tlv
->value
;
1322 /* Note: This is a nested TLV containing:
1323 * [wmi_tlv][wmi_p2p_noa_descriptor][wmi_tlv]..
1326 ptr
+= sizeof(*tlv
);
1329 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev start\n");
1333 static struct sk_buff
*
1334 ath10k_wmi_tlv_op_gen_vdev_stop(struct ath10k
*ar
, u32 vdev_id
)
1336 struct wmi_vdev_stop_cmd
*cmd
;
1337 struct wmi_tlv
*tlv
;
1338 struct sk_buff
*skb
;
1340 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1342 return ERR_PTR(-ENOMEM
);
1344 tlv
= (void *)skb
->data
;
1345 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_STOP_CMD
);
1346 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1347 cmd
= (void *)tlv
->value
;
1348 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1350 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev stop\n");
1354 static struct sk_buff
*
1355 ath10k_wmi_tlv_op_gen_vdev_up(struct ath10k
*ar
, u32 vdev_id
, u32 aid
,
1359 struct wmi_vdev_up_cmd
*cmd
;
1360 struct wmi_tlv
*tlv
;
1361 struct sk_buff
*skb
;
1363 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1365 return ERR_PTR(-ENOMEM
);
1367 tlv
= (void *)skb
->data
;
1368 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_UP_CMD
);
1369 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1370 cmd
= (void *)tlv
->value
;
1371 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1372 cmd
->vdev_assoc_id
= __cpu_to_le32(aid
);
1373 ether_addr_copy(cmd
->vdev_bssid
.addr
, bssid
);
1375 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev up\n");
1379 static struct sk_buff
*
1380 ath10k_wmi_tlv_op_gen_vdev_down(struct ath10k
*ar
, u32 vdev_id
)
1382 struct wmi_vdev_down_cmd
*cmd
;
1383 struct wmi_tlv
*tlv
;
1384 struct sk_buff
*skb
;
1386 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1388 return ERR_PTR(-ENOMEM
);
1390 tlv
= (void *)skb
->data
;
1391 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_DOWN_CMD
);
1392 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1393 cmd
= (void *)tlv
->value
;
1394 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1396 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev down\n");
1400 static struct sk_buff
*
1401 ath10k_wmi_tlv_op_gen_vdev_set_param(struct ath10k
*ar
, u32 vdev_id
,
1402 u32 param_id
, u32 param_value
)
1404 struct wmi_vdev_set_param_cmd
*cmd
;
1405 struct wmi_tlv
*tlv
;
1406 struct sk_buff
*skb
;
1408 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1410 return ERR_PTR(-ENOMEM
);
1412 tlv
= (void *)skb
->data
;
1413 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_SET_PARAM_CMD
);
1414 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1415 cmd
= (void *)tlv
->value
;
1416 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1417 cmd
->param_id
= __cpu_to_le32(param_id
);
1418 cmd
->param_value
= __cpu_to_le32(param_value
);
1420 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev set param\n");
1424 static struct sk_buff
*
1425 ath10k_wmi_tlv_op_gen_vdev_install_key(struct ath10k
*ar
,
1426 const struct wmi_vdev_install_key_arg
*arg
)
1428 struct wmi_vdev_install_key_cmd
*cmd
;
1429 struct wmi_tlv
*tlv
;
1430 struct sk_buff
*skb
;
1434 if (arg
->key_cipher
== WMI_CIPHER_NONE
&& arg
->key_data
!= NULL
)
1435 return ERR_PTR(-EINVAL
);
1436 if (arg
->key_cipher
!= WMI_CIPHER_NONE
&& arg
->key_data
== NULL
)
1437 return ERR_PTR(-EINVAL
);
1439 len
= sizeof(*tlv
) + sizeof(*cmd
) +
1440 sizeof(*tlv
) + roundup(arg
->key_len
, sizeof(__le32
));
1441 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1443 return ERR_PTR(-ENOMEM
);
1445 ptr
= (void *)skb
->data
;
1447 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_INSTALL_KEY_CMD
);
1448 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1449 cmd
= (void *)tlv
->value
;
1450 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1451 cmd
->key_idx
= __cpu_to_le32(arg
->key_idx
);
1452 cmd
->key_flags
= __cpu_to_le32(arg
->key_flags
);
1453 cmd
->key_cipher
= __cpu_to_le32(arg
->key_cipher
);
1454 cmd
->key_len
= __cpu_to_le32(arg
->key_len
);
1455 cmd
->key_txmic_len
= __cpu_to_le32(arg
->key_txmic_len
);
1456 cmd
->key_rxmic_len
= __cpu_to_le32(arg
->key_rxmic_len
);
1459 ether_addr_copy(cmd
->peer_macaddr
.addr
, arg
->macaddr
);
1461 ptr
+= sizeof(*tlv
);
1462 ptr
+= sizeof(*cmd
);
1465 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1466 tlv
->len
= __cpu_to_le16(roundup(arg
->key_len
, sizeof(__le32
)));
1468 memcpy(tlv
->value
, arg
->key_data
, arg
->key_len
);
1470 ptr
+= sizeof(*tlv
);
1471 ptr
+= roundup(arg
->key_len
, sizeof(__le32
));
1473 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev install key\n");
1477 static struct sk_buff
*
1478 ath10k_wmi_tlv_op_gen_peer_create(struct ath10k
*ar
, u32 vdev_id
,
1479 const u8 peer_addr
[ETH_ALEN
])
1481 struct wmi_tlv_peer_create_cmd
*cmd
;
1482 struct wmi_tlv
*tlv
;
1483 struct sk_buff
*skb
;
1485 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1487 return ERR_PTR(-ENOMEM
);
1489 tlv
= (void *)skb
->data
;
1490 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_CREATE_CMD
);
1491 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1492 cmd
= (void *)tlv
->value
;
1493 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1494 cmd
->peer_type
= __cpu_to_le32(WMI_TLV_PEER_TYPE_DEFAULT
); /* FIXME */
1495 ether_addr_copy(cmd
->peer_addr
.addr
, peer_addr
);
1497 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer create\n");
1501 static struct sk_buff
*
1502 ath10k_wmi_tlv_op_gen_peer_delete(struct ath10k
*ar
, u32 vdev_id
,
1503 const u8 peer_addr
[ETH_ALEN
])
1505 struct wmi_peer_delete_cmd
*cmd
;
1506 struct wmi_tlv
*tlv
;
1507 struct sk_buff
*skb
;
1509 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1511 return ERR_PTR(-ENOMEM
);
1513 tlv
= (void *)skb
->data
;
1514 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_DELETE_CMD
);
1515 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1516 cmd
= (void *)tlv
->value
;
1517 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1518 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1520 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer delete\n");
1524 static struct sk_buff
*
1525 ath10k_wmi_tlv_op_gen_peer_flush(struct ath10k
*ar
, u32 vdev_id
,
1526 const u8 peer_addr
[ETH_ALEN
], u32 tid_bitmap
)
1528 struct wmi_peer_flush_tids_cmd
*cmd
;
1529 struct wmi_tlv
*tlv
;
1530 struct sk_buff
*skb
;
1532 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1534 return ERR_PTR(-ENOMEM
);
1536 tlv
= (void *)skb
->data
;
1537 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_FLUSH_TIDS_CMD
);
1538 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1539 cmd
= (void *)tlv
->value
;
1540 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1541 cmd
->peer_tid_bitmap
= __cpu_to_le32(tid_bitmap
);
1542 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1544 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer flush\n");
1548 static struct sk_buff
*
1549 ath10k_wmi_tlv_op_gen_peer_set_param(struct ath10k
*ar
, u32 vdev_id
,
1550 const u8
*peer_addr
,
1551 enum wmi_peer_param param_id
,
1554 struct wmi_peer_set_param_cmd
*cmd
;
1555 struct wmi_tlv
*tlv
;
1556 struct sk_buff
*skb
;
1558 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1560 return ERR_PTR(-ENOMEM
);
1562 tlv
= (void *)skb
->data
;
1563 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_SET_PARAM_CMD
);
1564 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1565 cmd
= (void *)tlv
->value
;
1566 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1567 cmd
->param_id
= __cpu_to_le32(param_id
);
1568 cmd
->param_value
= __cpu_to_le32(param_value
);
1569 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1571 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer set param\n");
1575 static struct sk_buff
*
1576 ath10k_wmi_tlv_op_gen_peer_assoc(struct ath10k
*ar
,
1577 const struct wmi_peer_assoc_complete_arg
*arg
)
1579 struct wmi_tlv_peer_assoc_cmd
*cmd
;
1580 struct wmi_vht_rate_set
*vht_rate
;
1581 struct wmi_tlv
*tlv
;
1582 struct sk_buff
*skb
;
1583 size_t len
, legacy_rate_len
, ht_rate_len
;
1586 if (arg
->peer_mpdu_density
> 16)
1587 return ERR_PTR(-EINVAL
);
1588 if (arg
->peer_legacy_rates
.num_rates
> MAX_SUPPORTED_RATES
)
1589 return ERR_PTR(-EINVAL
);
1590 if (arg
->peer_ht_rates
.num_rates
> MAX_SUPPORTED_RATES
)
1591 return ERR_PTR(-EINVAL
);
1593 legacy_rate_len
= roundup(arg
->peer_legacy_rates
.num_rates
,
1595 ht_rate_len
= roundup(arg
->peer_ht_rates
.num_rates
, sizeof(__le32
));
1596 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1597 (sizeof(*tlv
) + legacy_rate_len
) +
1598 (sizeof(*tlv
) + ht_rate_len
) +
1599 (sizeof(*tlv
) + sizeof(*vht_rate
));
1600 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1602 return ERR_PTR(-ENOMEM
);
1604 ptr
= (void *)skb
->data
;
1606 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_ASSOC_COMPLETE_CMD
);
1607 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1608 cmd
= (void *)tlv
->value
;
1610 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1611 cmd
->new_assoc
= __cpu_to_le32(arg
->peer_reassoc
? 0 : 1);
1612 cmd
->assoc_id
= __cpu_to_le32(arg
->peer_aid
);
1613 cmd
->flags
= __cpu_to_le32(arg
->peer_flags
);
1614 cmd
->caps
= __cpu_to_le32(arg
->peer_caps
);
1615 cmd
->listen_intval
= __cpu_to_le32(arg
->peer_listen_intval
);
1616 cmd
->ht_caps
= __cpu_to_le32(arg
->peer_ht_caps
);
1617 cmd
->max_mpdu
= __cpu_to_le32(arg
->peer_max_mpdu
);
1618 cmd
->mpdu_density
= __cpu_to_le32(arg
->peer_mpdu_density
);
1619 cmd
->rate_caps
= __cpu_to_le32(arg
->peer_rate_caps
);
1620 cmd
->nss
= __cpu_to_le32(arg
->peer_num_spatial_streams
);
1621 cmd
->vht_caps
= __cpu_to_le32(arg
->peer_vht_caps
);
1622 cmd
->phy_mode
= __cpu_to_le32(arg
->peer_phymode
);
1623 cmd
->num_legacy_rates
= __cpu_to_le32(arg
->peer_legacy_rates
.num_rates
);
1624 cmd
->num_ht_rates
= __cpu_to_le32(arg
->peer_ht_rates
.num_rates
);
1625 ether_addr_copy(cmd
->mac_addr
.addr
, arg
->addr
);
1627 ptr
+= sizeof(*tlv
);
1628 ptr
+= sizeof(*cmd
);
1631 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1632 tlv
->len
= __cpu_to_le16(legacy_rate_len
);
1633 memcpy(tlv
->value
, arg
->peer_legacy_rates
.rates
,
1634 arg
->peer_legacy_rates
.num_rates
);
1636 ptr
+= sizeof(*tlv
);
1637 ptr
+= legacy_rate_len
;
1640 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1641 tlv
->len
= __cpu_to_le16(ht_rate_len
);
1642 memcpy(tlv
->value
, arg
->peer_ht_rates
.rates
,
1643 arg
->peer_ht_rates
.num_rates
);
1645 ptr
+= sizeof(*tlv
);
1649 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VHT_RATE_SET
);
1650 tlv
->len
= __cpu_to_le16(sizeof(*vht_rate
));
1651 vht_rate
= (void *)tlv
->value
;
1653 vht_rate
->rx_max_rate
= __cpu_to_le32(arg
->peer_vht_rates
.rx_max_rate
);
1654 vht_rate
->rx_mcs_set
= __cpu_to_le32(arg
->peer_vht_rates
.rx_mcs_set
);
1655 vht_rate
->tx_max_rate
= __cpu_to_le32(arg
->peer_vht_rates
.tx_max_rate
);
1656 vht_rate
->tx_mcs_set
= __cpu_to_le32(arg
->peer_vht_rates
.tx_mcs_set
);
1658 ptr
+= sizeof(*tlv
);
1659 ptr
+= sizeof(*vht_rate
);
1661 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer assoc\n");
1665 static struct sk_buff
*
1666 ath10k_wmi_tlv_op_gen_set_psmode(struct ath10k
*ar
, u32 vdev_id
,
1667 enum wmi_sta_ps_mode psmode
)
1669 struct wmi_sta_powersave_mode_cmd
*cmd
;
1670 struct wmi_tlv
*tlv
;
1671 struct sk_buff
*skb
;
1673 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1675 return ERR_PTR(-ENOMEM
);
1677 tlv
= (void *)skb
->data
;
1678 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_POWERSAVE_MODE_CMD
);
1679 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1680 cmd
= (void *)tlv
->value
;
1681 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1682 cmd
->sta_ps_mode
= __cpu_to_le32(psmode
);
1684 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv set psmode\n");
1688 static struct sk_buff
*
1689 ath10k_wmi_tlv_op_gen_set_sta_ps(struct ath10k
*ar
, u32 vdev_id
,
1690 enum wmi_sta_powersave_param param_id
,
1693 struct wmi_sta_powersave_param_cmd
*cmd
;
1694 struct wmi_tlv
*tlv
;
1695 struct sk_buff
*skb
;
1697 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1699 return ERR_PTR(-ENOMEM
);
1701 tlv
= (void *)skb
->data
;
1702 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_POWERSAVE_PARAM_CMD
);
1703 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1704 cmd
= (void *)tlv
->value
;
1705 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1706 cmd
->param_id
= __cpu_to_le32(param_id
);
1707 cmd
->param_value
= __cpu_to_le32(param_value
);
1709 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv set sta ps\n");
1713 static struct sk_buff
*
1714 ath10k_wmi_tlv_op_gen_set_ap_ps(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
1715 enum wmi_ap_ps_peer_param param_id
, u32 value
)
1717 struct wmi_ap_ps_peer_cmd
*cmd
;
1718 struct wmi_tlv
*tlv
;
1719 struct sk_buff
*skb
;
1722 return ERR_PTR(-EINVAL
);
1724 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*cmd
));
1726 return ERR_PTR(-ENOMEM
);
1728 tlv
= (void *)skb
->data
;
1729 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_AP_PS_PEER_CMD
);
1730 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1731 cmd
= (void *)tlv
->value
;
1732 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1733 cmd
->param_id
= __cpu_to_le32(param_id
);
1734 cmd
->param_value
= __cpu_to_le32(value
);
1735 ether_addr_copy(cmd
->peer_macaddr
.addr
, mac
);
1737 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv ap ps param\n");
1741 static struct sk_buff
*
1742 ath10k_wmi_tlv_op_gen_scan_chan_list(struct ath10k
*ar
,
1743 const struct wmi_scan_chan_list_arg
*arg
)
1745 struct wmi_tlv_scan_chan_list_cmd
*cmd
;
1746 struct wmi_channel
*ci
;
1747 struct wmi_channel_arg
*ch
;
1748 struct wmi_tlv
*tlv
;
1749 struct sk_buff
*skb
;
1750 size_t chans_len
, len
;
1754 chans_len
= arg
->n_channels
* (sizeof(*tlv
) + sizeof(*ci
));
1755 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1756 (sizeof(*tlv
) + chans_len
);
1758 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1760 return ERR_PTR(-ENOMEM
);
1762 ptr
= (void *)skb
->data
;
1764 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_SCAN_CHAN_LIST_CMD
);
1765 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1766 cmd
= (void *)tlv
->value
;
1767 cmd
->num_scan_chans
= __cpu_to_le32(arg
->n_channels
);
1769 ptr
+= sizeof(*tlv
);
1770 ptr
+= sizeof(*cmd
);
1773 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
1774 tlv
->len
= __cpu_to_le16(chans_len
);
1775 chans
= (void *)tlv
->value
;
1777 for (i
= 0; i
< arg
->n_channels
; i
++) {
1778 ch
= &arg
->channels
[i
];
1781 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_CHANNEL
);
1782 tlv
->len
= __cpu_to_le16(sizeof(*ci
));
1783 ci
= (void *)tlv
->value
;
1785 ath10k_wmi_put_wmi_channel(ci
, ch
);
1787 chans
+= sizeof(*tlv
);
1788 chans
+= sizeof(*ci
);
1791 ptr
+= sizeof(*tlv
);
1794 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv scan chan list\n");
1798 static struct sk_buff
*
1799 ath10k_wmi_tlv_op_gen_beacon_dma(struct ath10k_vif
*arvif
)
1801 struct ath10k
*ar
= arvif
->ar
;
1802 struct wmi_bcn_tx_ref_cmd
*cmd
;
1803 struct wmi_tlv
*tlv
;
1804 struct sk_buff
*skb
;
1805 struct sk_buff
*beacon
= arvif
->beacon
;
1806 struct ieee80211_hdr
*hdr
;
1809 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1811 return ERR_PTR(-ENOMEM
);
1813 hdr
= (struct ieee80211_hdr
*)beacon
->data
;
1814 fc
= le16_to_cpu(hdr
->frame_control
);
1816 tlv
= (void *)skb
->data
;
1817 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_SEND_FROM_HOST_CMD
);
1818 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1819 cmd
= (void *)tlv
->value
;
1820 cmd
->vdev_id
= __cpu_to_le32(arvif
->vdev_id
);
1821 cmd
->data_len
= __cpu_to_le32(beacon
->len
);
1822 cmd
->data_ptr
= __cpu_to_le32(ATH10K_SKB_CB(beacon
)->paddr
);
1824 cmd
->frame_control
= __cpu_to_le32(fc
);
1827 if (ATH10K_SKB_CB(beacon
)->bcn
.dtim_zero
)
1828 cmd
->flags
|= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO
);
1830 if (ATH10K_SKB_CB(beacon
)->bcn
.deliver_cab
)
1831 cmd
->flags
|= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB
);
1833 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv beacon dma\n");
1837 static void *ath10k_wmi_tlv_put_wmm(void *ptr
,
1838 const struct wmi_wmm_params_arg
*arg
)
1840 struct wmi_wmm_params
*wmm
;
1841 struct wmi_tlv
*tlv
;
1844 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_WMM_PARAMS
);
1845 tlv
->len
= __cpu_to_le16(sizeof(*wmm
));
1846 wmm
= (void *)tlv
->value
;
1847 ath10k_wmi_pdev_set_wmm_param(wmm
, arg
);
1849 return ptr
+ sizeof(*tlv
) + sizeof(*wmm
);
1852 static struct sk_buff
*
1853 ath10k_wmi_tlv_op_gen_pdev_set_wmm(struct ath10k
*ar
,
1854 const struct wmi_pdev_set_wmm_params_arg
*arg
)
1856 struct wmi_tlv_pdev_set_wmm_cmd
*cmd
;
1857 struct wmi_wmm_params
*wmm
;
1858 struct wmi_tlv
*tlv
;
1859 struct sk_buff
*skb
;
1863 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1864 (4 * (sizeof(*tlv
) + sizeof(*wmm
)));
1865 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1867 return ERR_PTR(-ENOMEM
);
1869 ptr
= (void *)skb
->data
;
1872 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SET_WMM_PARAMS_CMD
);
1873 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1874 cmd
= (void *)tlv
->value
;
1876 /* nothing to set here */
1878 ptr
+= sizeof(*tlv
);
1879 ptr
+= sizeof(*cmd
);
1881 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_be
);
1882 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_bk
);
1883 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_vi
);
1884 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_vo
);
1886 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev set wmm\n");
1890 static struct sk_buff
*
1891 ath10k_wmi_tlv_op_gen_request_stats(struct ath10k
*ar
,
1892 enum wmi_stats_id stats_id
)
1894 struct wmi_request_stats_cmd
*cmd
;
1895 struct wmi_tlv
*tlv
;
1896 struct sk_buff
*skb
;
1898 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1900 return ERR_PTR(-ENOMEM
);
1902 tlv
= (void *)skb
->data
;
1903 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_REQUEST_STATS_CMD
);
1904 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1905 cmd
= (void *)tlv
->value
;
1906 cmd
->stats_id
= __cpu_to_le32(stats_id
);
1908 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv request stats\n");
1912 static struct sk_buff
*
1913 ath10k_wmi_tlv_op_gen_force_fw_hang(struct ath10k
*ar
,
1914 enum wmi_force_fw_hang_type type
,
1917 struct wmi_force_fw_hang_cmd
*cmd
;
1918 struct wmi_tlv
*tlv
;
1919 struct sk_buff
*skb
;
1921 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1923 return ERR_PTR(-ENOMEM
);
1925 tlv
= (void *)skb
->data
;
1926 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_FORCE_FW_HANG_CMD
);
1927 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1928 cmd
= (void *)tlv
->value
;
1929 cmd
->type
= __cpu_to_le32(type
);
1930 cmd
->delay_ms
= __cpu_to_le32(delay_ms
);
1932 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv force fw hang\n");
1936 static struct sk_buff
*
1937 ath10k_wmi_tlv_op_gen_dbglog_cfg(struct ath10k
*ar
, u32 module_enable
)
1939 struct wmi_tlv_dbglog_cmd
*cmd
;
1940 struct wmi_tlv
*tlv
;
1941 struct sk_buff
*skb
;
1942 size_t len
, bmap_len
;
1946 if (module_enable
) {
1947 value
= WMI_TLV_DBGLOG_LOG_LEVEL_VALUE(
1949 WMI_TLV_DBGLOG_LOG_LEVEL_VERBOSE
);
1951 value
= WMI_TLV_DBGLOG_LOG_LEVEL_VALUE(
1952 WMI_TLV_DBGLOG_ALL_MODULES
,
1953 WMI_TLV_DBGLOG_LOG_LEVEL_WARN
);
1957 len
= sizeof(*tlv
) + sizeof(*cmd
) + sizeof(*tlv
) + bmap_len
;
1958 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1960 return ERR_PTR(-ENOMEM
);
1962 ptr
= (void *)skb
->data
;
1965 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_DEBUG_LOG_CONFIG_CMD
);
1966 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1967 cmd
= (void *)tlv
->value
;
1968 cmd
->param
= __cpu_to_le32(WMI_TLV_DBGLOG_PARAM_LOG_LEVEL
);
1969 cmd
->value
= __cpu_to_le32(value
);
1971 ptr
+= sizeof(*tlv
);
1972 ptr
+= sizeof(*cmd
);
1975 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_UINT32
);
1976 tlv
->len
= __cpu_to_le16(bmap_len
);
1978 /* nothing to do here */
1980 ptr
+= sizeof(*tlv
);
1981 ptr
+= sizeof(bmap_len
);
1983 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv dbglog value 0x%08x\n", value
);
1987 static struct sk_buff
*
1988 ath10k_wmi_tlv_op_gen_pktlog_enable(struct ath10k
*ar
, u32 filter
)
1990 struct wmi_tlv_pktlog_enable
*cmd
;
1991 struct wmi_tlv
*tlv
;
1992 struct sk_buff
*skb
;
1996 len
= sizeof(*tlv
) + sizeof(*cmd
);
1997 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1999 return ERR_PTR(-ENOMEM
);
2001 ptr
= (void *)skb
->data
;
2003 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_PKTLOG_ENABLE_CMD
);
2004 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2005 cmd
= (void *)tlv
->value
;
2006 cmd
->filter
= __cpu_to_le32(filter
);
2008 ptr
+= sizeof(*tlv
);
2009 ptr
+= sizeof(*cmd
);
2011 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pktlog enable filter 0x%08x\n",
2016 static struct sk_buff
*
2017 ath10k_wmi_tlv_op_gen_pktlog_disable(struct ath10k
*ar
)
2019 struct wmi_tlv_pktlog_disable
*cmd
;
2020 struct wmi_tlv
*tlv
;
2021 struct sk_buff
*skb
;
2025 len
= sizeof(*tlv
) + sizeof(*cmd
);
2026 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2028 return ERR_PTR(-ENOMEM
);
2030 ptr
= (void *)skb
->data
;
2032 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_PKTLOG_DISABLE_CMD
);
2033 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2034 cmd
= (void *)tlv
->value
;
2036 ptr
+= sizeof(*tlv
);
2037 ptr
+= sizeof(*cmd
);
2039 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pktlog disable\n");
2043 static struct sk_buff
*
2044 ath10k_wmi_tlv_op_gen_bcn_tmpl(struct ath10k
*ar
, u32 vdev_id
,
2045 u32 tim_ie_offset
, struct sk_buff
*bcn
,
2046 u32 prb_caps
, u32 prb_erp
, void *prb_ies
,
2049 struct wmi_tlv_bcn_tmpl_cmd
*cmd
;
2050 struct wmi_tlv_bcn_prb_info
*info
;
2051 struct wmi_tlv
*tlv
;
2052 struct sk_buff
*skb
;
2056 if (WARN_ON(prb_ies_len
> 0 && !prb_ies
))
2057 return ERR_PTR(-EINVAL
);
2059 len
= sizeof(*tlv
) + sizeof(*cmd
) +
2060 sizeof(*tlv
) + sizeof(*info
) + prb_ies_len
+
2061 sizeof(*tlv
) + roundup(bcn
->len
, 4);
2062 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2064 return ERR_PTR(-ENOMEM
);
2066 ptr
= (void *)skb
->data
;
2068 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_TMPL_CMD
);
2069 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2070 cmd
= (void *)tlv
->value
;
2071 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2072 cmd
->tim_ie_offset
= __cpu_to_le32(tim_ie_offset
);
2073 cmd
->buf_len
= __cpu_to_le32(bcn
->len
);
2075 ptr
+= sizeof(*tlv
);
2076 ptr
+= sizeof(*cmd
);
2078 /* FIXME: prb_ies_len should be probably aligned to 4byte boundary but
2079 * then it is then impossible to pass original ie len.
2080 * This chunk is not used yet so if setting probe resp template yields
2081 * problems with beaconing or crashes firmware look here.
2084 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_PRB_INFO
);
2085 tlv
->len
= __cpu_to_le16(sizeof(*info
) + prb_ies_len
);
2086 info
= (void *)tlv
->value
;
2087 info
->caps
= __cpu_to_le32(prb_caps
);
2088 info
->erp
= __cpu_to_le32(prb_erp
);
2089 memcpy(info
->ies
, prb_ies
, prb_ies_len
);
2091 ptr
+= sizeof(*tlv
);
2092 ptr
+= sizeof(*info
);
2096 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
2097 tlv
->len
= __cpu_to_le16(roundup(bcn
->len
, 4));
2098 memcpy(tlv
->value
, bcn
->data
, bcn
->len
);
2100 /* FIXME: Adjust TSF? */
2102 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv bcn tmpl vdev_id %i\n",
2107 static struct sk_buff
*
2108 ath10k_wmi_tlv_op_gen_prb_tmpl(struct ath10k
*ar
, u32 vdev_id
,
2109 struct sk_buff
*prb
)
2111 struct wmi_tlv_prb_tmpl_cmd
*cmd
;
2112 struct wmi_tlv_bcn_prb_info
*info
;
2113 struct wmi_tlv
*tlv
;
2114 struct sk_buff
*skb
;
2118 len
= sizeof(*tlv
) + sizeof(*cmd
) +
2119 sizeof(*tlv
) + sizeof(*info
) +
2120 sizeof(*tlv
) + roundup(prb
->len
, 4);
2121 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2123 return ERR_PTR(-ENOMEM
);
2125 ptr
= (void *)skb
->data
;
2127 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PRB_TMPL_CMD
);
2128 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2129 cmd
= (void *)tlv
->value
;
2130 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2131 cmd
->buf_len
= __cpu_to_le32(prb
->len
);
2133 ptr
+= sizeof(*tlv
);
2134 ptr
+= sizeof(*cmd
);
2137 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_PRB_INFO
);
2138 tlv
->len
= __cpu_to_le16(sizeof(*info
));
2139 info
= (void *)tlv
->value
;
2143 ptr
+= sizeof(*tlv
);
2144 ptr
+= sizeof(*info
);
2147 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
2148 tlv
->len
= __cpu_to_le16(roundup(prb
->len
, 4));
2149 memcpy(tlv
->value
, prb
->data
, prb
->len
);
2151 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv prb tmpl vdev_id %i\n",
2156 static struct sk_buff
*
2157 ath10k_wmi_tlv_op_gen_p2p_go_bcn_ie(struct ath10k
*ar
, u32 vdev_id
,
2160 struct wmi_tlv_p2p_go_bcn_ie
*cmd
;
2161 struct wmi_tlv
*tlv
;
2162 struct sk_buff
*skb
;
2166 len
= sizeof(*tlv
) + sizeof(*cmd
) +
2167 sizeof(*tlv
) + roundup(p2p_ie
[1] + 2, 4);
2168 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2170 return ERR_PTR(-ENOMEM
);
2172 ptr
= (void *)skb
->data
;
2174 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_P2P_GO_SET_BEACON_IE
);
2175 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2176 cmd
= (void *)tlv
->value
;
2177 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2178 cmd
->ie_len
= __cpu_to_le32(p2p_ie
[1] + 2);
2180 ptr
+= sizeof(*tlv
);
2181 ptr
+= sizeof(*cmd
);
2184 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
2185 tlv
->len
= __cpu_to_le16(roundup(p2p_ie
[1] + 2, 4));
2186 memcpy(tlv
->value
, p2p_ie
, p2p_ie
[1] + 2);
2188 ptr
+= sizeof(*tlv
);
2189 ptr
+= roundup(p2p_ie
[1] + 2, 4);
2191 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv p2p go bcn ie for vdev %i\n",
2200 static struct wmi_cmd_map wmi_tlv_cmd_map
= {
2201 .init_cmdid
= WMI_TLV_INIT_CMDID
,
2202 .start_scan_cmdid
= WMI_TLV_START_SCAN_CMDID
,
2203 .stop_scan_cmdid
= WMI_TLV_STOP_SCAN_CMDID
,
2204 .scan_chan_list_cmdid
= WMI_TLV_SCAN_CHAN_LIST_CMDID
,
2205 .scan_sch_prio_tbl_cmdid
= WMI_TLV_SCAN_SCH_PRIO_TBL_CMDID
,
2206 .pdev_set_regdomain_cmdid
= WMI_TLV_PDEV_SET_REGDOMAIN_CMDID
,
2207 .pdev_set_channel_cmdid
= WMI_TLV_PDEV_SET_CHANNEL_CMDID
,
2208 .pdev_set_param_cmdid
= WMI_TLV_PDEV_SET_PARAM_CMDID
,
2209 .pdev_pktlog_enable_cmdid
= WMI_TLV_PDEV_PKTLOG_ENABLE_CMDID
,
2210 .pdev_pktlog_disable_cmdid
= WMI_TLV_PDEV_PKTLOG_DISABLE_CMDID
,
2211 .pdev_set_wmm_params_cmdid
= WMI_TLV_PDEV_SET_WMM_PARAMS_CMDID
,
2212 .pdev_set_ht_cap_ie_cmdid
= WMI_TLV_PDEV_SET_HT_CAP_IE_CMDID
,
2213 .pdev_set_vht_cap_ie_cmdid
= WMI_TLV_PDEV_SET_VHT_CAP_IE_CMDID
,
2214 .pdev_set_dscp_tid_map_cmdid
= WMI_TLV_PDEV_SET_DSCP_TID_MAP_CMDID
,
2215 .pdev_set_quiet_mode_cmdid
= WMI_TLV_PDEV_SET_QUIET_MODE_CMDID
,
2216 .pdev_green_ap_ps_enable_cmdid
= WMI_TLV_PDEV_GREEN_AP_PS_ENABLE_CMDID
,
2217 .pdev_get_tpc_config_cmdid
= WMI_TLV_PDEV_GET_TPC_CONFIG_CMDID
,
2218 .pdev_set_base_macaddr_cmdid
= WMI_TLV_PDEV_SET_BASE_MACADDR_CMDID
,
2219 .vdev_create_cmdid
= WMI_TLV_VDEV_CREATE_CMDID
,
2220 .vdev_delete_cmdid
= WMI_TLV_VDEV_DELETE_CMDID
,
2221 .vdev_start_request_cmdid
= WMI_TLV_VDEV_START_REQUEST_CMDID
,
2222 .vdev_restart_request_cmdid
= WMI_TLV_VDEV_RESTART_REQUEST_CMDID
,
2223 .vdev_up_cmdid
= WMI_TLV_VDEV_UP_CMDID
,
2224 .vdev_stop_cmdid
= WMI_TLV_VDEV_STOP_CMDID
,
2225 .vdev_down_cmdid
= WMI_TLV_VDEV_DOWN_CMDID
,
2226 .vdev_set_param_cmdid
= WMI_TLV_VDEV_SET_PARAM_CMDID
,
2227 .vdev_install_key_cmdid
= WMI_TLV_VDEV_INSTALL_KEY_CMDID
,
2228 .peer_create_cmdid
= WMI_TLV_PEER_CREATE_CMDID
,
2229 .peer_delete_cmdid
= WMI_TLV_PEER_DELETE_CMDID
,
2230 .peer_flush_tids_cmdid
= WMI_TLV_PEER_FLUSH_TIDS_CMDID
,
2231 .peer_set_param_cmdid
= WMI_TLV_PEER_SET_PARAM_CMDID
,
2232 .peer_assoc_cmdid
= WMI_TLV_PEER_ASSOC_CMDID
,
2233 .peer_add_wds_entry_cmdid
= WMI_TLV_PEER_ADD_WDS_ENTRY_CMDID
,
2234 .peer_remove_wds_entry_cmdid
= WMI_TLV_PEER_REMOVE_WDS_ENTRY_CMDID
,
2235 .peer_mcast_group_cmdid
= WMI_TLV_PEER_MCAST_GROUP_CMDID
,
2236 .bcn_tx_cmdid
= WMI_TLV_BCN_TX_CMDID
,
2237 .pdev_send_bcn_cmdid
= WMI_TLV_PDEV_SEND_BCN_CMDID
,
2238 .bcn_tmpl_cmdid
= WMI_TLV_BCN_TMPL_CMDID
,
2239 .bcn_filter_rx_cmdid
= WMI_TLV_BCN_FILTER_RX_CMDID
,
2240 .prb_req_filter_rx_cmdid
= WMI_TLV_PRB_REQ_FILTER_RX_CMDID
,
2241 .mgmt_tx_cmdid
= WMI_TLV_MGMT_TX_CMDID
,
2242 .prb_tmpl_cmdid
= WMI_TLV_PRB_TMPL_CMDID
,
2243 .addba_clear_resp_cmdid
= WMI_TLV_ADDBA_CLEAR_RESP_CMDID
,
2244 .addba_send_cmdid
= WMI_TLV_ADDBA_SEND_CMDID
,
2245 .addba_status_cmdid
= WMI_TLV_ADDBA_STATUS_CMDID
,
2246 .delba_send_cmdid
= WMI_TLV_DELBA_SEND_CMDID
,
2247 .addba_set_resp_cmdid
= WMI_TLV_ADDBA_SET_RESP_CMDID
,
2248 .send_singleamsdu_cmdid
= WMI_TLV_SEND_SINGLEAMSDU_CMDID
,
2249 .sta_powersave_mode_cmdid
= WMI_TLV_STA_POWERSAVE_MODE_CMDID
,
2250 .sta_powersave_param_cmdid
= WMI_TLV_STA_POWERSAVE_PARAM_CMDID
,
2251 .sta_mimo_ps_mode_cmdid
= WMI_TLV_STA_MIMO_PS_MODE_CMDID
,
2252 .pdev_dfs_enable_cmdid
= WMI_TLV_PDEV_DFS_ENABLE_CMDID
,
2253 .pdev_dfs_disable_cmdid
= WMI_TLV_PDEV_DFS_DISABLE_CMDID
,
2254 .roam_scan_mode
= WMI_TLV_ROAM_SCAN_MODE
,
2255 .roam_scan_rssi_threshold
= WMI_TLV_ROAM_SCAN_RSSI_THRESHOLD
,
2256 .roam_scan_period
= WMI_TLV_ROAM_SCAN_PERIOD
,
2257 .roam_scan_rssi_change_threshold
=
2258 WMI_TLV_ROAM_SCAN_RSSI_CHANGE_THRESHOLD
,
2259 .roam_ap_profile
= WMI_TLV_ROAM_AP_PROFILE
,
2260 .ofl_scan_add_ap_profile
= WMI_TLV_ROAM_AP_PROFILE
,
2261 .ofl_scan_remove_ap_profile
= WMI_TLV_OFL_SCAN_REMOVE_AP_PROFILE
,
2262 .ofl_scan_period
= WMI_TLV_OFL_SCAN_PERIOD
,
2263 .p2p_dev_set_device_info
= WMI_TLV_P2P_DEV_SET_DEVICE_INFO
,
2264 .p2p_dev_set_discoverability
= WMI_TLV_P2P_DEV_SET_DISCOVERABILITY
,
2265 .p2p_go_set_beacon_ie
= WMI_TLV_P2P_GO_SET_BEACON_IE
,
2266 .p2p_go_set_probe_resp_ie
= WMI_TLV_P2P_GO_SET_PROBE_RESP_IE
,
2267 .p2p_set_vendor_ie_data_cmdid
= WMI_TLV_P2P_SET_VENDOR_IE_DATA_CMDID
,
2268 .ap_ps_peer_param_cmdid
= WMI_TLV_AP_PS_PEER_PARAM_CMDID
,
2269 .ap_ps_peer_uapsd_coex_cmdid
= WMI_TLV_AP_PS_PEER_UAPSD_COEX_CMDID
,
2270 .peer_rate_retry_sched_cmdid
= WMI_TLV_PEER_RATE_RETRY_SCHED_CMDID
,
2271 .wlan_profile_trigger_cmdid
= WMI_TLV_WLAN_PROFILE_TRIGGER_CMDID
,
2272 .wlan_profile_set_hist_intvl_cmdid
=
2273 WMI_TLV_WLAN_PROFILE_SET_HIST_INTVL_CMDID
,
2274 .wlan_profile_get_profile_data_cmdid
=
2275 WMI_TLV_WLAN_PROFILE_GET_PROFILE_DATA_CMDID
,
2276 .wlan_profile_enable_profile_id_cmdid
=
2277 WMI_TLV_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID
,
2278 .wlan_profile_list_profile_id_cmdid
=
2279 WMI_TLV_WLAN_PROFILE_LIST_PROFILE_ID_CMDID
,
2280 .pdev_suspend_cmdid
= WMI_TLV_PDEV_SUSPEND_CMDID
,
2281 .pdev_resume_cmdid
= WMI_TLV_PDEV_RESUME_CMDID
,
2282 .add_bcn_filter_cmdid
= WMI_TLV_ADD_BCN_FILTER_CMDID
,
2283 .rmv_bcn_filter_cmdid
= WMI_TLV_RMV_BCN_FILTER_CMDID
,
2284 .wow_add_wake_pattern_cmdid
= WMI_TLV_WOW_ADD_WAKE_PATTERN_CMDID
,
2285 .wow_del_wake_pattern_cmdid
= WMI_TLV_WOW_DEL_WAKE_PATTERN_CMDID
,
2286 .wow_enable_disable_wake_event_cmdid
=
2287 WMI_TLV_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID
,
2288 .wow_enable_cmdid
= WMI_TLV_WOW_ENABLE_CMDID
,
2289 .wow_hostwakeup_from_sleep_cmdid
=
2290 WMI_TLV_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID
,
2291 .rtt_measreq_cmdid
= WMI_TLV_RTT_MEASREQ_CMDID
,
2292 .rtt_tsf_cmdid
= WMI_TLV_RTT_TSF_CMDID
,
2293 .vdev_spectral_scan_configure_cmdid
= WMI_TLV_SPECTRAL_SCAN_CONF_CMDID
,
2294 .vdev_spectral_scan_enable_cmdid
= WMI_TLV_SPECTRAL_SCAN_ENABLE_CMDID
,
2295 .request_stats_cmdid
= WMI_TLV_REQUEST_STATS_CMDID
,
2296 .set_arp_ns_offload_cmdid
= WMI_TLV_SET_ARP_NS_OFFLOAD_CMDID
,
2297 .network_list_offload_config_cmdid
=
2298 WMI_TLV_NETWORK_LIST_OFFLOAD_CONFIG_CMDID
,
2299 .gtk_offload_cmdid
= WMI_TLV_GTK_OFFLOAD_CMDID
,
2300 .csa_offload_enable_cmdid
= WMI_TLV_CSA_OFFLOAD_ENABLE_CMDID
,
2301 .csa_offload_chanswitch_cmdid
= WMI_TLV_CSA_OFFLOAD_CHANSWITCH_CMDID
,
2302 .chatter_set_mode_cmdid
= WMI_TLV_CHATTER_SET_MODE_CMDID
,
2303 .peer_tid_addba_cmdid
= WMI_TLV_PEER_TID_ADDBA_CMDID
,
2304 .peer_tid_delba_cmdid
= WMI_TLV_PEER_TID_DELBA_CMDID
,
2305 .sta_dtim_ps_method_cmdid
= WMI_TLV_STA_DTIM_PS_METHOD_CMDID
,
2306 .sta_uapsd_auto_trig_cmdid
= WMI_TLV_STA_UAPSD_AUTO_TRIG_CMDID
,
2307 .sta_keepalive_cmd
= WMI_TLV_STA_KEEPALIVE_CMDID
,
2308 .echo_cmdid
= WMI_TLV_ECHO_CMDID
,
2309 .pdev_utf_cmdid
= WMI_TLV_PDEV_UTF_CMDID
,
2310 .dbglog_cfg_cmdid
= WMI_TLV_DBGLOG_CFG_CMDID
,
2311 .pdev_qvit_cmdid
= WMI_TLV_PDEV_QVIT_CMDID
,
2312 .pdev_ftm_intg_cmdid
= WMI_TLV_PDEV_FTM_INTG_CMDID
,
2313 .vdev_set_keepalive_cmdid
= WMI_TLV_VDEV_SET_KEEPALIVE_CMDID
,
2314 .vdev_get_keepalive_cmdid
= WMI_TLV_VDEV_GET_KEEPALIVE_CMDID
,
2315 .force_fw_hang_cmdid
= WMI_TLV_FORCE_FW_HANG_CMDID
,
2316 .gpio_config_cmdid
= WMI_TLV_GPIO_CONFIG_CMDID
,
2317 .gpio_output_cmdid
= WMI_TLV_GPIO_OUTPUT_CMDID
,
2318 .pdev_get_temperature_cmdid
= WMI_TLV_CMD_UNSUPPORTED
,
2321 static struct wmi_pdev_param_map wmi_tlv_pdev_param_map
= {
2322 .tx_chain_mask
= WMI_TLV_PDEV_PARAM_TX_CHAIN_MASK
,
2323 .rx_chain_mask
= WMI_TLV_PDEV_PARAM_RX_CHAIN_MASK
,
2324 .txpower_limit2g
= WMI_TLV_PDEV_PARAM_TXPOWER_LIMIT2G
,
2325 .txpower_limit5g
= WMI_TLV_PDEV_PARAM_TXPOWER_LIMIT5G
,
2326 .txpower_scale
= WMI_TLV_PDEV_PARAM_TXPOWER_SCALE
,
2327 .beacon_gen_mode
= WMI_TLV_PDEV_PARAM_BEACON_GEN_MODE
,
2328 .beacon_tx_mode
= WMI_TLV_PDEV_PARAM_BEACON_TX_MODE
,
2329 .resmgr_offchan_mode
= WMI_TLV_PDEV_PARAM_RESMGR_OFFCHAN_MODE
,
2330 .protection_mode
= WMI_TLV_PDEV_PARAM_PROTECTION_MODE
,
2331 .dynamic_bw
= WMI_TLV_PDEV_PARAM_DYNAMIC_BW
,
2332 .non_agg_sw_retry_th
= WMI_TLV_PDEV_PARAM_NON_AGG_SW_RETRY_TH
,
2333 .agg_sw_retry_th
= WMI_TLV_PDEV_PARAM_AGG_SW_RETRY_TH
,
2334 .sta_kickout_th
= WMI_TLV_PDEV_PARAM_STA_KICKOUT_TH
,
2335 .ac_aggrsize_scaling
= WMI_TLV_PDEV_PARAM_AC_AGGRSIZE_SCALING
,
2336 .ltr_enable
= WMI_TLV_PDEV_PARAM_LTR_ENABLE
,
2337 .ltr_ac_latency_be
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_BE
,
2338 .ltr_ac_latency_bk
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_BK
,
2339 .ltr_ac_latency_vi
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_VI
,
2340 .ltr_ac_latency_vo
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_VO
,
2341 .ltr_ac_latency_timeout
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT
,
2342 .ltr_sleep_override
= WMI_TLV_PDEV_PARAM_LTR_SLEEP_OVERRIDE
,
2343 .ltr_rx_override
= WMI_TLV_PDEV_PARAM_LTR_RX_OVERRIDE
,
2344 .ltr_tx_activity_timeout
= WMI_TLV_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT
,
2345 .l1ss_enable
= WMI_TLV_PDEV_PARAM_L1SS_ENABLE
,
2346 .dsleep_enable
= WMI_TLV_PDEV_PARAM_DSLEEP_ENABLE
,
2347 .pcielp_txbuf_flush
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_FLUSH
,
2348 .pcielp_txbuf_watermark
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_TMO_EN
,
2349 .pcielp_txbuf_tmo_en
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_TMO_EN
,
2350 .pcielp_txbuf_tmo_value
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE
,
2351 .pdev_stats_update_period
= WMI_TLV_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD
,
2352 .vdev_stats_update_period
= WMI_TLV_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD
,
2353 .peer_stats_update_period
= WMI_TLV_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD
,
2354 .bcnflt_stats_update_period
=
2355 WMI_TLV_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD
,
2356 .pmf_qos
= WMI_TLV_PDEV_PARAM_PMF_QOS
,
2357 .arp_ac_override
= WMI_TLV_PDEV_PARAM_ARP_AC_OVERRIDE
,
2358 .dcs
= WMI_TLV_PDEV_PARAM_DCS
,
2359 .ani_enable
= WMI_TLV_PDEV_PARAM_ANI_ENABLE
,
2360 .ani_poll_period
= WMI_TLV_PDEV_PARAM_ANI_POLL_PERIOD
,
2361 .ani_listen_period
= WMI_TLV_PDEV_PARAM_ANI_LISTEN_PERIOD
,
2362 .ani_ofdm_level
= WMI_TLV_PDEV_PARAM_ANI_OFDM_LEVEL
,
2363 .ani_cck_level
= WMI_TLV_PDEV_PARAM_ANI_CCK_LEVEL
,
2364 .dyntxchain
= WMI_TLV_PDEV_PARAM_DYNTXCHAIN
,
2365 .proxy_sta
= WMI_TLV_PDEV_PARAM_PROXY_STA
,
2366 .idle_ps_config
= WMI_TLV_PDEV_PARAM_IDLE_PS_CONFIG
,
2367 .power_gating_sleep
= WMI_TLV_PDEV_PARAM_POWER_GATING_SLEEP
,
2368 .fast_channel_reset
= WMI_TLV_PDEV_PARAM_UNSUPPORTED
,
2369 .burst_dur
= WMI_TLV_PDEV_PARAM_BURST_DUR
,
2370 .burst_enable
= WMI_TLV_PDEV_PARAM_BURST_ENABLE
,
2371 .cal_period
= WMI_PDEV_PARAM_UNSUPPORTED
,
2374 static struct wmi_vdev_param_map wmi_tlv_vdev_param_map
= {
2375 .rts_threshold
= WMI_TLV_VDEV_PARAM_RTS_THRESHOLD
,
2376 .fragmentation_threshold
= WMI_TLV_VDEV_PARAM_FRAGMENTATION_THRESHOLD
,
2377 .beacon_interval
= WMI_TLV_VDEV_PARAM_BEACON_INTERVAL
,
2378 .listen_interval
= WMI_TLV_VDEV_PARAM_LISTEN_INTERVAL
,
2379 .multicast_rate
= WMI_TLV_VDEV_PARAM_MULTICAST_RATE
,
2380 .mgmt_tx_rate
= WMI_TLV_VDEV_PARAM_MGMT_TX_RATE
,
2381 .slot_time
= WMI_TLV_VDEV_PARAM_SLOT_TIME
,
2382 .preamble
= WMI_TLV_VDEV_PARAM_PREAMBLE
,
2383 .swba_time
= WMI_TLV_VDEV_PARAM_SWBA_TIME
,
2384 .wmi_vdev_stats_update_period
= WMI_TLV_VDEV_STATS_UPDATE_PERIOD
,
2385 .wmi_vdev_pwrsave_ageout_time
= WMI_TLV_VDEV_PWRSAVE_AGEOUT_TIME
,
2386 .wmi_vdev_host_swba_interval
= WMI_TLV_VDEV_HOST_SWBA_INTERVAL
,
2387 .dtim_period
= WMI_TLV_VDEV_PARAM_DTIM_PERIOD
,
2388 .wmi_vdev_oc_scheduler_air_time_limit
=
2389 WMI_TLV_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT
,
2390 .wds
= WMI_TLV_VDEV_PARAM_WDS
,
2391 .atim_window
= WMI_TLV_VDEV_PARAM_ATIM_WINDOW
,
2392 .bmiss_count_max
= WMI_TLV_VDEV_PARAM_BMISS_COUNT_MAX
,
2393 .bmiss_first_bcnt
= WMI_TLV_VDEV_PARAM_BMISS_FIRST_BCNT
,
2394 .bmiss_final_bcnt
= WMI_TLV_VDEV_PARAM_BMISS_FINAL_BCNT
,
2395 .feature_wmm
= WMI_TLV_VDEV_PARAM_FEATURE_WMM
,
2396 .chwidth
= WMI_TLV_VDEV_PARAM_CHWIDTH
,
2397 .chextoffset
= WMI_TLV_VDEV_PARAM_CHEXTOFFSET
,
2398 .disable_htprotection
= WMI_TLV_VDEV_PARAM_DISABLE_HTPROTECTION
,
2399 .sta_quickkickout
= WMI_TLV_VDEV_PARAM_STA_QUICKKICKOUT
,
2400 .mgmt_rate
= WMI_TLV_VDEV_PARAM_MGMT_RATE
,
2401 .protection_mode
= WMI_TLV_VDEV_PARAM_PROTECTION_MODE
,
2402 .fixed_rate
= WMI_TLV_VDEV_PARAM_FIXED_RATE
,
2403 .sgi
= WMI_TLV_VDEV_PARAM_SGI
,
2404 .ldpc
= WMI_TLV_VDEV_PARAM_LDPC
,
2405 .tx_stbc
= WMI_TLV_VDEV_PARAM_TX_STBC
,
2406 .rx_stbc
= WMI_TLV_VDEV_PARAM_RX_STBC
,
2407 .intra_bss_fwd
= WMI_TLV_VDEV_PARAM_INTRA_BSS_FWD
,
2408 .def_keyid
= WMI_TLV_VDEV_PARAM_DEF_KEYID
,
2409 .nss
= WMI_TLV_VDEV_PARAM_NSS
,
2410 .bcast_data_rate
= WMI_TLV_VDEV_PARAM_BCAST_DATA_RATE
,
2411 .mcast_data_rate
= WMI_TLV_VDEV_PARAM_MCAST_DATA_RATE
,
2412 .mcast_indicate
= WMI_TLV_VDEV_PARAM_MCAST_INDICATE
,
2413 .dhcp_indicate
= WMI_TLV_VDEV_PARAM_DHCP_INDICATE
,
2414 .unknown_dest_indicate
= WMI_TLV_VDEV_PARAM_UNKNOWN_DEST_INDICATE
,
2415 .ap_keepalive_min_idle_inactive_time_secs
=
2416 WMI_TLV_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS
,
2417 .ap_keepalive_max_idle_inactive_time_secs
=
2418 WMI_TLV_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS
,
2419 .ap_keepalive_max_unresponsive_time_secs
=
2420 WMI_TLV_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS
,
2421 .ap_enable_nawds
= WMI_TLV_VDEV_PARAM_AP_ENABLE_NAWDS
,
2422 .mcast2ucast_set
= WMI_TLV_VDEV_PARAM_UNSUPPORTED
,
2423 .enable_rtscts
= WMI_TLV_VDEV_PARAM_ENABLE_RTSCTS
,
2424 .txbf
= WMI_TLV_VDEV_PARAM_TXBF
,
2425 .packet_powersave
= WMI_TLV_VDEV_PARAM_PACKET_POWERSAVE
,
2426 .drop_unencry
= WMI_TLV_VDEV_PARAM_DROP_UNENCRY
,
2427 .tx_encap_type
= WMI_TLV_VDEV_PARAM_TX_ENCAP_TYPE
,
2428 .ap_detect_out_of_sync_sleeping_sta_time_secs
=
2429 WMI_TLV_VDEV_PARAM_UNSUPPORTED
,
2432 static const struct wmi_ops wmi_tlv_ops
= {
2433 .rx
= ath10k_wmi_tlv_op_rx
,
2434 .map_svc
= wmi_tlv_svc_map
,
2436 .pull_scan
= ath10k_wmi_tlv_op_pull_scan_ev
,
2437 .pull_mgmt_rx
= ath10k_wmi_tlv_op_pull_mgmt_rx_ev
,
2438 .pull_ch_info
= ath10k_wmi_tlv_op_pull_ch_info_ev
,
2439 .pull_vdev_start
= ath10k_wmi_tlv_op_pull_vdev_start_ev
,
2440 .pull_peer_kick
= ath10k_wmi_tlv_op_pull_peer_kick_ev
,
2441 .pull_swba
= ath10k_wmi_tlv_op_pull_swba_ev
,
2442 .pull_phyerr
= ath10k_wmi_tlv_op_pull_phyerr_ev
,
2443 .pull_svc_rdy
= ath10k_wmi_tlv_op_pull_svc_rdy_ev
,
2444 .pull_rdy
= ath10k_wmi_tlv_op_pull_rdy_ev
,
2445 .pull_fw_stats
= ath10k_wmi_tlv_op_pull_fw_stats
,
2447 .gen_pdev_suspend
= ath10k_wmi_tlv_op_gen_pdev_suspend
,
2448 .gen_pdev_resume
= ath10k_wmi_tlv_op_gen_pdev_resume
,
2449 .gen_pdev_set_rd
= ath10k_wmi_tlv_op_gen_pdev_set_rd
,
2450 .gen_pdev_set_param
= ath10k_wmi_tlv_op_gen_pdev_set_param
,
2451 .gen_init
= ath10k_wmi_tlv_op_gen_init
,
2452 .gen_start_scan
= ath10k_wmi_tlv_op_gen_start_scan
,
2453 .gen_stop_scan
= ath10k_wmi_tlv_op_gen_stop_scan
,
2454 .gen_vdev_create
= ath10k_wmi_tlv_op_gen_vdev_create
,
2455 .gen_vdev_delete
= ath10k_wmi_tlv_op_gen_vdev_delete
,
2456 .gen_vdev_start
= ath10k_wmi_tlv_op_gen_vdev_start
,
2457 .gen_vdev_stop
= ath10k_wmi_tlv_op_gen_vdev_stop
,
2458 .gen_vdev_up
= ath10k_wmi_tlv_op_gen_vdev_up
,
2459 .gen_vdev_down
= ath10k_wmi_tlv_op_gen_vdev_down
,
2460 .gen_vdev_set_param
= ath10k_wmi_tlv_op_gen_vdev_set_param
,
2461 .gen_vdev_install_key
= ath10k_wmi_tlv_op_gen_vdev_install_key
,
2462 .gen_peer_create
= ath10k_wmi_tlv_op_gen_peer_create
,
2463 .gen_peer_delete
= ath10k_wmi_tlv_op_gen_peer_delete
,
2464 .gen_peer_flush
= ath10k_wmi_tlv_op_gen_peer_flush
,
2465 .gen_peer_set_param
= ath10k_wmi_tlv_op_gen_peer_set_param
,
2466 .gen_peer_assoc
= ath10k_wmi_tlv_op_gen_peer_assoc
,
2467 .gen_set_psmode
= ath10k_wmi_tlv_op_gen_set_psmode
,
2468 .gen_set_sta_ps
= ath10k_wmi_tlv_op_gen_set_sta_ps
,
2469 .gen_set_ap_ps
= ath10k_wmi_tlv_op_gen_set_ap_ps
,
2470 .gen_scan_chan_list
= ath10k_wmi_tlv_op_gen_scan_chan_list
,
2471 .gen_beacon_dma
= ath10k_wmi_tlv_op_gen_beacon_dma
,
2472 .gen_pdev_set_wmm
= ath10k_wmi_tlv_op_gen_pdev_set_wmm
,
2473 .gen_request_stats
= ath10k_wmi_tlv_op_gen_request_stats
,
2474 .gen_force_fw_hang
= ath10k_wmi_tlv_op_gen_force_fw_hang
,
2475 /* .gen_mgmt_tx = not implemented; HTT is used */
2476 .gen_dbglog_cfg
= ath10k_wmi_tlv_op_gen_dbglog_cfg
,
2477 .gen_pktlog_enable
= ath10k_wmi_tlv_op_gen_pktlog_enable
,
2478 .gen_pktlog_disable
= ath10k_wmi_tlv_op_gen_pktlog_disable
,
2479 /* .gen_pdev_set_quiet_mode not implemented */
2480 /* .gen_pdev_get_temperature not implemented */
2481 /* .gen_addba_clear_resp not implemented */
2482 /* .gen_addba_send not implemented */
2483 /* .gen_addba_set_resp not implemented */
2484 /* .gen_delba_send not implemented */
2485 .gen_bcn_tmpl
= ath10k_wmi_tlv_op_gen_bcn_tmpl
,
2486 .gen_prb_tmpl
= ath10k_wmi_tlv_op_gen_prb_tmpl
,
2487 .gen_p2p_go_bcn_ie
= ath10k_wmi_tlv_op_gen_p2p_go_bcn_ie
,
2494 void ath10k_wmi_tlv_attach(struct ath10k
*ar
)
2496 ar
->wmi
.cmd
= &wmi_tlv_cmd_map
;
2497 ar
->wmi
.vdev_param
= &wmi_tlv_vdev_param_map
;
2498 ar
->wmi
.pdev_param
= &wmi_tlv_pdev_param_map
;
2499 ar
->wmi
.ops
= &wmi_tlv_ops
;