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.
29 struct wmi_tlv_policy
{
33 static const struct wmi_tlv_policy wmi_tlv_policies
[] = {
34 [WMI_TLV_TAG_ARRAY_BYTE
]
35 = { .min_len
= sizeof(u8
) },
36 [WMI_TLV_TAG_ARRAY_UINT32
]
37 = { .min_len
= sizeof(u32
) },
38 [WMI_TLV_TAG_STRUCT_SCAN_EVENT
]
39 = { .min_len
= sizeof(struct wmi_scan_event
) },
40 [WMI_TLV_TAG_STRUCT_MGMT_RX_HDR
]
41 = { .min_len
= sizeof(struct wmi_tlv_mgmt_rx_ev
) },
42 [WMI_TLV_TAG_STRUCT_CHAN_INFO_EVENT
]
43 = { .min_len
= sizeof(struct wmi_chan_info_event
) },
44 [WMI_TLV_TAG_STRUCT_VDEV_START_RESPONSE_EVENT
]
45 = { .min_len
= sizeof(struct wmi_vdev_start_response_event
) },
46 [WMI_TLV_TAG_STRUCT_PEER_STA_KICKOUT_EVENT
]
47 = { .min_len
= sizeof(struct wmi_peer_sta_kickout_event
) },
48 [WMI_TLV_TAG_STRUCT_HOST_SWBA_EVENT
]
49 = { .min_len
= sizeof(struct wmi_host_swba_event
) },
50 [WMI_TLV_TAG_STRUCT_TIM_INFO
]
51 = { .min_len
= sizeof(struct wmi_tim_info
) },
52 [WMI_TLV_TAG_STRUCT_P2P_NOA_INFO
]
53 = { .min_len
= sizeof(struct wmi_p2p_noa_info
) },
54 [WMI_TLV_TAG_STRUCT_SERVICE_READY_EVENT
]
55 = { .min_len
= sizeof(struct wmi_tlv_svc_rdy_ev
) },
56 [WMI_TLV_TAG_STRUCT_HAL_REG_CAPABILITIES
]
57 = { .min_len
= sizeof(struct hal_reg_capabilities
) },
58 [WMI_TLV_TAG_STRUCT_WLAN_HOST_MEM_REQ
]
59 = { .min_len
= sizeof(struct wlan_host_mem_req
) },
60 [WMI_TLV_TAG_STRUCT_READY_EVENT
]
61 = { .min_len
= sizeof(struct wmi_tlv_rdy_ev
) },
62 [WMI_TLV_TAG_STRUCT_OFFLOAD_BCN_TX_STATUS_EVENT
]
63 = { .min_len
= sizeof(struct wmi_tlv_bcn_tx_status_ev
) },
64 [WMI_TLV_TAG_STRUCT_DIAG_DATA_CONTAINER_EVENT
]
65 = { .min_len
= sizeof(struct wmi_tlv_diag_data_ev
) },
69 ath10k_wmi_tlv_iter(struct ath10k
*ar
, const void *ptr
, size_t len
,
70 int (*iter
)(struct ath10k
*ar
, u16 tag
, u16 len
,
71 const void *ptr
, void *data
),
74 const void *begin
= ptr
;
75 const struct wmi_tlv
*tlv
;
80 if (len
< sizeof(*tlv
)) {
81 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
82 "wmi tlv parse failure at byte %zd (%zu bytes left, %zu expected)\n",
83 ptr
- begin
, len
, sizeof(*tlv
));
88 tlv_tag
= __le16_to_cpu(tlv
->tag
);
89 tlv_len
= __le16_to_cpu(tlv
->len
);
94 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
95 "wmi tlv parse failure of tag %hhu at byte %zd (%zu bytes left, %hhu expected)\n",
96 tlv_tag
, ptr
- begin
, len
, tlv_len
);
100 if (tlv_tag
< ARRAY_SIZE(wmi_tlv_policies
) &&
101 wmi_tlv_policies
[tlv_tag
].min_len
&&
102 wmi_tlv_policies
[tlv_tag
].min_len
> tlv_len
) {
103 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
104 "wmi tlv parse failure of tag %hhu at byte %zd (%hhu bytes is less than min length %zu)\n",
105 tlv_tag
, ptr
- begin
, tlv_len
,
106 wmi_tlv_policies
[tlv_tag
].min_len
);
110 ret
= iter(ar
, tlv_tag
, tlv_len
, ptr
, data
);
121 static int ath10k_wmi_tlv_iter_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
122 const void *ptr
, void *data
)
124 const void **tb
= data
;
126 if (tag
< WMI_TLV_TAG_MAX
)
132 static int ath10k_wmi_tlv_parse(struct ath10k
*ar
, const void **tb
,
133 const void *ptr
, size_t len
)
135 return ath10k_wmi_tlv_iter(ar
, ptr
, len
, ath10k_wmi_tlv_iter_parse
,
140 ath10k_wmi_tlv_parse_alloc(struct ath10k
*ar
, const void *ptr
,
141 size_t len
, gfp_t gfp
)
146 tb
= kzalloc(sizeof(*tb
) * WMI_TLV_TAG_MAX
, gfp
);
148 return ERR_PTR(-ENOMEM
);
150 ret
= ath10k_wmi_tlv_parse(ar
, tb
, ptr
, len
);
159 static u16
ath10k_wmi_tlv_len(const void *ptr
)
161 return __le16_to_cpu((((const struct wmi_tlv
*)ptr
) - 1)->len
);
167 static int ath10k_wmi_tlv_event_bcn_tx_status(struct ath10k
*ar
,
171 const struct wmi_tlv_bcn_tx_status_ev
*ev
;
172 struct ath10k_vif
*arvif
;
173 u32 vdev_id
, tx_status
;
176 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
179 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
183 ev
= tb
[WMI_TLV_TAG_STRUCT_OFFLOAD_BCN_TX_STATUS_EVENT
];
189 tx_status
= __le32_to_cpu(ev
->tx_status
);
190 vdev_id
= __le32_to_cpu(ev
->vdev_id
);
193 case WMI_TLV_BCN_TX_STATUS_OK
:
195 case WMI_TLV_BCN_TX_STATUS_XRETRY
:
196 case WMI_TLV_BCN_TX_STATUS_DROP
:
197 case WMI_TLV_BCN_TX_STATUS_FILTERED
:
198 /* FIXME: It's probably worth telling mac80211 to stop the
199 * interface as it is crippled.
201 ath10k_warn(ar
, "received bcn tmpl tx status on vdev %i: %d",
206 spin_lock_bh(&ar
->data_lock
);
207 arvif
= ath10k_get_arvif(ar
, vdev_id
);
208 if (arvif
&& arvif
->is_up
)
209 ieee80211_queue_work(ar
->hw
, &arvif
->ap_csa_work
);
210 spin_unlock_bh(&ar
->data_lock
);
216 static int ath10k_wmi_tlv_event_diag_data(struct ath10k
*ar
,
220 const struct wmi_tlv_diag_data_ev
*ev
;
221 const struct wmi_tlv_diag_item
*item
;
223 int ret
, num_items
, len
;
225 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
228 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
232 ev
= tb
[WMI_TLV_TAG_STRUCT_DIAG_DATA_CONTAINER_EVENT
];
233 data
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
239 num_items
= __le32_to_cpu(ev
->num_items
);
240 len
= ath10k_wmi_tlv_len(data
);
242 while (num_items
--) {
245 if (len
< sizeof(*item
)) {
246 ath10k_warn(ar
, "failed to parse diag data: can't fit item header\n");
252 if (len
< sizeof(*item
) + __le16_to_cpu(item
->len
)) {
253 ath10k_warn(ar
, "failed to parse diag data: item is too long\n");
257 trace_ath10k_wmi_diag_container(ar
,
259 __le32_to_cpu(item
->timestamp
),
260 __le32_to_cpu(item
->code
),
261 __le16_to_cpu(item
->len
),
264 len
-= sizeof(*item
);
265 len
-= roundup(__le16_to_cpu(item
->len
), 4);
267 data
+= sizeof(*item
);
268 data
+= roundup(__le16_to_cpu(item
->len
), 4);
271 if (num_items
!= -1 || len
!= 0)
272 ath10k_warn(ar
, "failed to parse diag data event: num_items %d len %d\n",
279 static int ath10k_wmi_tlv_event_diag(struct ath10k
*ar
,
286 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
289 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
293 data
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
298 len
= ath10k_wmi_tlv_len(data
);
300 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv diag event len %d\n", len
);
301 trace_ath10k_wmi_diag(ar
, data
, len
);
311 static void ath10k_wmi_tlv_op_rx(struct ath10k
*ar
, struct sk_buff
*skb
)
313 struct wmi_cmd_hdr
*cmd_hdr
;
314 enum wmi_tlv_event_id id
;
316 cmd_hdr
= (struct wmi_cmd_hdr
*)skb
->data
;
317 id
= MS(__le32_to_cpu(cmd_hdr
->cmd_id
), WMI_CMD_HDR_CMD_ID
);
319 if (skb_pull(skb
, sizeof(struct wmi_cmd_hdr
)) == NULL
)
322 trace_ath10k_wmi_event(ar
, id
, skb
->data
, skb
->len
);
325 case WMI_TLV_MGMT_RX_EVENTID
:
326 ath10k_wmi_event_mgmt_rx(ar
, skb
);
327 /* mgmt_rx() owns the skb now! */
329 case WMI_TLV_SCAN_EVENTID
:
330 ath10k_wmi_event_scan(ar
, skb
);
332 case WMI_TLV_CHAN_INFO_EVENTID
:
333 ath10k_wmi_event_chan_info(ar
, skb
);
335 case WMI_TLV_ECHO_EVENTID
:
336 ath10k_wmi_event_echo(ar
, skb
);
338 case WMI_TLV_DEBUG_MESG_EVENTID
:
339 ath10k_wmi_event_debug_mesg(ar
, skb
);
341 case WMI_TLV_UPDATE_STATS_EVENTID
:
342 ath10k_wmi_event_update_stats(ar
, skb
);
344 case WMI_TLV_VDEV_START_RESP_EVENTID
:
345 ath10k_wmi_event_vdev_start_resp(ar
, skb
);
347 case WMI_TLV_VDEV_STOPPED_EVENTID
:
348 ath10k_wmi_event_vdev_stopped(ar
, skb
);
350 case WMI_TLV_PEER_STA_KICKOUT_EVENTID
:
351 ath10k_wmi_event_peer_sta_kickout(ar
, skb
);
353 case WMI_TLV_HOST_SWBA_EVENTID
:
354 ath10k_wmi_event_host_swba(ar
, skb
);
356 case WMI_TLV_TBTTOFFSET_UPDATE_EVENTID
:
357 ath10k_wmi_event_tbttoffset_update(ar
, skb
);
359 case WMI_TLV_PHYERR_EVENTID
:
360 ath10k_wmi_event_phyerr(ar
, skb
);
362 case WMI_TLV_ROAM_EVENTID
:
363 ath10k_wmi_event_roam(ar
, skb
);
365 case WMI_TLV_PROFILE_MATCH
:
366 ath10k_wmi_event_profile_match(ar
, skb
);
368 case WMI_TLV_DEBUG_PRINT_EVENTID
:
369 ath10k_wmi_event_debug_print(ar
, skb
);
371 case WMI_TLV_PDEV_QVIT_EVENTID
:
372 ath10k_wmi_event_pdev_qvit(ar
, skb
);
374 case WMI_TLV_WLAN_PROFILE_DATA_EVENTID
:
375 ath10k_wmi_event_wlan_profile_data(ar
, skb
);
377 case WMI_TLV_RTT_MEASUREMENT_REPORT_EVENTID
:
378 ath10k_wmi_event_rtt_measurement_report(ar
, skb
);
380 case WMI_TLV_TSF_MEASUREMENT_REPORT_EVENTID
:
381 ath10k_wmi_event_tsf_measurement_report(ar
, skb
);
383 case WMI_TLV_RTT_ERROR_REPORT_EVENTID
:
384 ath10k_wmi_event_rtt_error_report(ar
, skb
);
386 case WMI_TLV_WOW_WAKEUP_HOST_EVENTID
:
387 ath10k_wmi_event_wow_wakeup_host(ar
, skb
);
389 case WMI_TLV_DCS_INTERFERENCE_EVENTID
:
390 ath10k_wmi_event_dcs_interference(ar
, skb
);
392 case WMI_TLV_PDEV_TPC_CONFIG_EVENTID
:
393 ath10k_wmi_event_pdev_tpc_config(ar
, skb
);
395 case WMI_TLV_PDEV_FTM_INTG_EVENTID
:
396 ath10k_wmi_event_pdev_ftm_intg(ar
, skb
);
398 case WMI_TLV_GTK_OFFLOAD_STATUS_EVENTID
:
399 ath10k_wmi_event_gtk_offload_status(ar
, skb
);
401 case WMI_TLV_GTK_REKEY_FAIL_EVENTID
:
402 ath10k_wmi_event_gtk_rekey_fail(ar
, skb
);
404 case WMI_TLV_TX_DELBA_COMPLETE_EVENTID
:
405 ath10k_wmi_event_delba_complete(ar
, skb
);
407 case WMI_TLV_TX_ADDBA_COMPLETE_EVENTID
:
408 ath10k_wmi_event_addba_complete(ar
, skb
);
410 case WMI_TLV_VDEV_INSTALL_KEY_COMPLETE_EVENTID
:
411 ath10k_wmi_event_vdev_install_key_complete(ar
, skb
);
413 case WMI_TLV_SERVICE_READY_EVENTID
:
414 ath10k_wmi_event_service_ready(ar
, skb
);
416 case WMI_TLV_READY_EVENTID
:
417 ath10k_wmi_event_ready(ar
, skb
);
419 case WMI_TLV_OFFLOAD_BCN_TX_STATUS_EVENTID
:
420 ath10k_wmi_tlv_event_bcn_tx_status(ar
, skb
);
422 case WMI_TLV_DIAG_DATA_CONTAINER_EVENTID
:
423 ath10k_wmi_tlv_event_diag_data(ar
, skb
);
425 case WMI_TLV_DIAG_EVENTID
:
426 ath10k_wmi_tlv_event_diag(ar
, skb
);
429 ath10k_warn(ar
, "Unknown eventid: %d\n", id
);
436 static int ath10k_wmi_tlv_op_pull_scan_ev(struct ath10k
*ar
,
438 struct wmi_scan_ev_arg
*arg
)
441 const struct wmi_scan_event
*ev
;
444 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
447 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
451 ev
= tb
[WMI_TLV_TAG_STRUCT_SCAN_EVENT
];
457 arg
->event_type
= ev
->event_type
;
458 arg
->reason
= ev
->reason
;
459 arg
->channel_freq
= ev
->channel_freq
;
460 arg
->scan_req_id
= ev
->scan_req_id
;
461 arg
->scan_id
= ev
->scan_id
;
462 arg
->vdev_id
= ev
->vdev_id
;
468 static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev(struct ath10k
*ar
,
470 struct wmi_mgmt_rx_ev_arg
*arg
)
473 const struct wmi_tlv_mgmt_rx_ev
*ev
;
478 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
481 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
485 ev
= tb
[WMI_TLV_TAG_STRUCT_MGMT_RX_HDR
];
486 frame
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
493 arg
->channel
= ev
->channel
;
494 arg
->buf_len
= ev
->buf_len
;
495 arg
->status
= ev
->status
;
497 arg
->phy_mode
= ev
->phy_mode
;
498 arg
->rate
= ev
->rate
;
500 msdu_len
= __le32_to_cpu(arg
->buf_len
);
502 if (skb
->len
< (frame
- skb
->data
) + msdu_len
) {
507 /* shift the sk_buff to point to `frame` */
509 skb_put(skb
, frame
- skb
->data
);
510 skb_pull(skb
, frame
- skb
->data
);
511 skb_put(skb
, msdu_len
);
517 static int ath10k_wmi_tlv_op_pull_ch_info_ev(struct ath10k
*ar
,
519 struct wmi_ch_info_ev_arg
*arg
)
522 const struct wmi_chan_info_event
*ev
;
525 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
528 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
532 ev
= tb
[WMI_TLV_TAG_STRUCT_CHAN_INFO_EVENT
];
538 arg
->err_code
= ev
->err_code
;
539 arg
->freq
= ev
->freq
;
540 arg
->cmd_flags
= ev
->cmd_flags
;
541 arg
->noise_floor
= ev
->noise_floor
;
542 arg
->rx_clear_count
= ev
->rx_clear_count
;
543 arg
->cycle_count
= ev
->cycle_count
;
550 ath10k_wmi_tlv_op_pull_vdev_start_ev(struct ath10k
*ar
, struct sk_buff
*skb
,
551 struct wmi_vdev_start_ev_arg
*arg
)
554 const struct wmi_vdev_start_response_event
*ev
;
557 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
560 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
564 ev
= tb
[WMI_TLV_TAG_STRUCT_VDEV_START_RESPONSE_EVENT
];
570 skb_pull(skb
, sizeof(*ev
));
571 arg
->vdev_id
= ev
->vdev_id
;
572 arg
->req_id
= ev
->req_id
;
573 arg
->resp_type
= ev
->resp_type
;
574 arg
->status
= ev
->status
;
580 static int ath10k_wmi_tlv_op_pull_peer_kick_ev(struct ath10k
*ar
,
582 struct wmi_peer_kick_ev_arg
*arg
)
585 const struct wmi_peer_sta_kickout_event
*ev
;
588 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
591 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
595 ev
= tb
[WMI_TLV_TAG_STRUCT_PEER_STA_KICKOUT_EVENT
];
601 arg
->mac_addr
= ev
->peer_macaddr
.addr
;
607 struct wmi_tlv_swba_parse
{
608 const struct wmi_host_swba_event
*ev
;
613 struct wmi_swba_ev_arg
*arg
;
616 static int ath10k_wmi_tlv_swba_tim_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
617 const void *ptr
, void *data
)
619 struct wmi_tlv_swba_parse
*swba
= data
;
621 if (tag
!= WMI_TLV_TAG_STRUCT_TIM_INFO
)
624 if (swba
->n_tim
>= ARRAY_SIZE(swba
->arg
->tim_info
))
627 swba
->arg
->tim_info
[swba
->n_tim
++] = ptr
;
631 static int ath10k_wmi_tlv_swba_noa_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
632 const void *ptr
, void *data
)
634 struct wmi_tlv_swba_parse
*swba
= data
;
636 if (tag
!= WMI_TLV_TAG_STRUCT_P2P_NOA_INFO
)
639 if (swba
->n_noa
>= ARRAY_SIZE(swba
->arg
->noa_info
))
642 swba
->arg
->noa_info
[swba
->n_noa
++] = ptr
;
646 static int ath10k_wmi_tlv_swba_parse(struct ath10k
*ar
, u16 tag
, u16 len
,
647 const void *ptr
, void *data
)
649 struct wmi_tlv_swba_parse
*swba
= data
;
653 case WMI_TLV_TAG_STRUCT_HOST_SWBA_EVENT
:
656 case WMI_TLV_TAG_ARRAY_STRUCT
:
657 if (!swba
->tim_done
) {
658 swba
->tim_done
= true;
659 ret
= ath10k_wmi_tlv_iter(ar
, ptr
, len
,
660 ath10k_wmi_tlv_swba_tim_parse
,
664 } else if (!swba
->noa_done
) {
665 swba
->noa_done
= true;
666 ret
= ath10k_wmi_tlv_iter(ar
, ptr
, len
,
667 ath10k_wmi_tlv_swba_noa_parse
,
679 static int ath10k_wmi_tlv_op_pull_swba_ev(struct ath10k
*ar
,
681 struct wmi_swba_ev_arg
*arg
)
683 struct wmi_tlv_swba_parse swba
= { .arg
= arg
};
688 ret
= ath10k_wmi_tlv_iter(ar
, skb
->data
, skb
->len
,
689 ath10k_wmi_tlv_swba_parse
, &swba
);
691 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
698 arg
->vdev_map
= swba
.ev
->vdev_map
;
700 for (map
= __le32_to_cpu(arg
->vdev_map
), n_vdevs
= 0; map
; map
>>= 1)
704 if (n_vdevs
!= swba
.n_tim
||
705 n_vdevs
!= swba
.n_noa
)
711 static int ath10k_wmi_tlv_op_pull_phyerr_ev(struct ath10k
*ar
,
713 struct wmi_phyerr_ev_arg
*arg
)
716 const struct wmi_tlv_phyerr_ev
*ev
;
720 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
723 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
727 ev
= tb
[WMI_TLV_TAG_STRUCT_COMB_PHYERR_RX_HDR
];
728 phyerrs
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
730 if (!ev
|| !phyerrs
) {
735 arg
->num_phyerrs
= ev
->num_phyerrs
;
736 arg
->tsf_l32
= ev
->tsf_l32
;
737 arg
->tsf_u32
= ev
->tsf_u32
;
738 arg
->buf_len
= ev
->buf_len
;
739 arg
->phyerrs
= phyerrs
;
745 #define WMI_TLV_ABI_VER_NS0 0x5F414351
746 #define WMI_TLV_ABI_VER_NS1 0x00004C4D
747 #define WMI_TLV_ABI_VER_NS2 0x00000000
748 #define WMI_TLV_ABI_VER_NS3 0x00000000
750 #define WMI_TLV_ABI_VER0_MAJOR 1
751 #define WMI_TLV_ABI_VER0_MINOR 0
752 #define WMI_TLV_ABI_VER0 ((((WMI_TLV_ABI_VER0_MAJOR) << 24) & 0xFF000000) | \
753 (((WMI_TLV_ABI_VER0_MINOR) << 0) & 0x00FFFFFF))
754 #define WMI_TLV_ABI_VER1 53
757 ath10k_wmi_tlv_parse_mem_reqs(struct ath10k
*ar
, u16 tag
, u16 len
,
758 const void *ptr
, void *data
)
760 struct wmi_svc_rdy_ev_arg
*arg
= data
;
763 if (tag
!= WMI_TLV_TAG_STRUCT_WLAN_HOST_MEM_REQ
)
766 for (i
= 0; i
< ARRAY_SIZE(arg
->mem_reqs
); i
++) {
767 if (!arg
->mem_reqs
[i
]) {
768 arg
->mem_reqs
[i
] = ptr
;
776 static int ath10k_wmi_tlv_op_pull_svc_rdy_ev(struct ath10k
*ar
,
778 struct wmi_svc_rdy_ev_arg
*arg
)
781 const struct hal_reg_capabilities
*reg
;
782 const struct wmi_tlv_svc_rdy_ev
*ev
;
783 const __le32
*svc_bmap
;
784 const struct wlan_host_mem_req
*mem_reqs
;
787 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
790 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
794 ev
= tb
[WMI_TLV_TAG_STRUCT_SERVICE_READY_EVENT
];
795 reg
= tb
[WMI_TLV_TAG_STRUCT_HAL_REG_CAPABILITIES
];
796 svc_bmap
= tb
[WMI_TLV_TAG_ARRAY_UINT32
];
797 mem_reqs
= tb
[WMI_TLV_TAG_ARRAY_STRUCT
];
799 if (!ev
|| !reg
|| !svc_bmap
|| !mem_reqs
) {
804 /* This is an internal ABI compatibility check for WMI TLV so check it
805 * here instead of the generic WMI code.
807 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
808 "wmi tlv abi 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x, 0x%08x ?= 0x%08x\n",
809 __le32_to_cpu(ev
->abi
.abi_ver0
), WMI_TLV_ABI_VER0
,
810 __le32_to_cpu(ev
->abi
.abi_ver_ns0
), WMI_TLV_ABI_VER_NS0
,
811 __le32_to_cpu(ev
->abi
.abi_ver_ns1
), WMI_TLV_ABI_VER_NS1
,
812 __le32_to_cpu(ev
->abi
.abi_ver_ns2
), WMI_TLV_ABI_VER_NS2
,
813 __le32_to_cpu(ev
->abi
.abi_ver_ns3
), WMI_TLV_ABI_VER_NS3
);
815 if (__le32_to_cpu(ev
->abi
.abi_ver0
) != WMI_TLV_ABI_VER0
||
816 __le32_to_cpu(ev
->abi
.abi_ver_ns0
) != WMI_TLV_ABI_VER_NS0
||
817 __le32_to_cpu(ev
->abi
.abi_ver_ns1
) != WMI_TLV_ABI_VER_NS1
||
818 __le32_to_cpu(ev
->abi
.abi_ver_ns2
) != WMI_TLV_ABI_VER_NS2
||
819 __le32_to_cpu(ev
->abi
.abi_ver_ns3
) != WMI_TLV_ABI_VER_NS3
) {
824 arg
->min_tx_power
= ev
->hw_min_tx_power
;
825 arg
->max_tx_power
= ev
->hw_max_tx_power
;
826 arg
->ht_cap
= ev
->ht_cap_info
;
827 arg
->vht_cap
= ev
->vht_cap_info
;
828 arg
->sw_ver0
= ev
->abi
.abi_ver0
;
829 arg
->sw_ver1
= ev
->abi
.abi_ver1
;
830 arg
->fw_build
= ev
->fw_build_vers
;
831 arg
->phy_capab
= ev
->phy_capability
;
832 arg
->num_rf_chains
= ev
->num_rf_chains
;
833 arg
->eeprom_rd
= reg
->eeprom_rd
;
834 arg
->num_mem_reqs
= ev
->num_mem_reqs
;
835 arg
->service_map
= svc_bmap
;
836 arg
->service_map_len
= ath10k_wmi_tlv_len(svc_bmap
);
838 ret
= ath10k_wmi_tlv_iter(ar
, mem_reqs
, ath10k_wmi_tlv_len(mem_reqs
),
839 ath10k_wmi_tlv_parse_mem_reqs
, arg
);
842 ath10k_warn(ar
, "failed to parse mem_reqs tlv: %d\n", ret
);
850 static int ath10k_wmi_tlv_op_pull_rdy_ev(struct ath10k
*ar
,
852 struct wmi_rdy_ev_arg
*arg
)
855 const struct wmi_tlv_rdy_ev
*ev
;
858 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
861 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
865 ev
= tb
[WMI_TLV_TAG_STRUCT_READY_EVENT
];
871 arg
->sw_version
= ev
->abi
.abi_ver0
;
872 arg
->abi_version
= ev
->abi
.abi_ver1
;
873 arg
->status
= ev
->status
;
874 arg
->mac_addr
= ev
->mac_addr
.addr
;
880 static void ath10k_wmi_tlv_pull_vdev_stats(const struct wmi_tlv_vdev_stats
*src
,
881 struct ath10k_fw_stats_vdev
*dst
)
885 dst
->vdev_id
= __le32_to_cpu(src
->vdev_id
);
886 dst
->beacon_snr
= __le32_to_cpu(src
->beacon_snr
);
887 dst
->data_snr
= __le32_to_cpu(src
->data_snr
);
888 dst
->num_rx_frames
= __le32_to_cpu(src
->num_rx_frames
);
889 dst
->num_rts_fail
= __le32_to_cpu(src
->num_rts_fail
);
890 dst
->num_rts_success
= __le32_to_cpu(src
->num_rts_success
);
891 dst
->num_rx_err
= __le32_to_cpu(src
->num_rx_err
);
892 dst
->num_rx_discard
= __le32_to_cpu(src
->num_rx_discard
);
893 dst
->num_tx_not_acked
= __le32_to_cpu(src
->num_tx_not_acked
);
895 for (i
= 0; i
< ARRAY_SIZE(src
->num_tx_frames
); i
++)
896 dst
->num_tx_frames
[i
] =
897 __le32_to_cpu(src
->num_tx_frames
[i
]);
899 for (i
= 0; i
< ARRAY_SIZE(src
->num_tx_frames_retries
); i
++)
900 dst
->num_tx_frames_retries
[i
] =
901 __le32_to_cpu(src
->num_tx_frames_retries
[i
]);
903 for (i
= 0; i
< ARRAY_SIZE(src
->num_tx_frames_failures
); i
++)
904 dst
->num_tx_frames_failures
[i
] =
905 __le32_to_cpu(src
->num_tx_frames_failures
[i
]);
907 for (i
= 0; i
< ARRAY_SIZE(src
->tx_rate_history
); i
++)
908 dst
->tx_rate_history
[i
] =
909 __le32_to_cpu(src
->tx_rate_history
[i
]);
911 for (i
= 0; i
< ARRAY_SIZE(src
->beacon_rssi_history
); i
++)
912 dst
->beacon_rssi_history
[i
] =
913 __le32_to_cpu(src
->beacon_rssi_history
[i
]);
916 static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k
*ar
,
918 struct ath10k_fw_stats
*stats
)
921 const struct wmi_tlv_stats_ev
*ev
;
926 u32 num_bcnflt_stats
;
932 tb
= ath10k_wmi_tlv_parse_alloc(ar
, skb
->data
, skb
->len
, GFP_ATOMIC
);
935 ath10k_warn(ar
, "failed to parse tlv: %d\n", ret
);
939 ev
= tb
[WMI_TLV_TAG_STRUCT_STATS_EVENT
];
940 data
= tb
[WMI_TLV_TAG_ARRAY_BYTE
];
947 data_len
= ath10k_wmi_tlv_len(data
);
948 num_pdev_stats
= __le32_to_cpu(ev
->num_pdev_stats
);
949 num_vdev_stats
= __le32_to_cpu(ev
->num_vdev_stats
);
950 num_peer_stats
= __le32_to_cpu(ev
->num_peer_stats
);
951 num_bcnflt_stats
= __le32_to_cpu(ev
->num_bcnflt_stats
);
952 num_chan_stats
= __le32_to_cpu(ev
->num_chan_stats
);
954 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
955 "wmi tlv stats update pdev %i vdev %i peer %i bcnflt %i chan %i\n",
956 num_pdev_stats
, num_vdev_stats
, num_peer_stats
,
957 num_bcnflt_stats
, num_chan_stats
);
959 for (i
= 0; i
< num_pdev_stats
; i
++) {
960 const struct wmi_pdev_stats
*src
;
961 struct ath10k_fw_stats_pdev
*dst
;
964 if (data_len
< sizeof(*src
))
967 data
+= sizeof(*src
);
968 data_len
-= sizeof(*src
);
970 dst
= kzalloc(sizeof(*dst
), GFP_ATOMIC
);
974 ath10k_wmi_pull_pdev_stats_base(&src
->base
, dst
);
975 ath10k_wmi_pull_pdev_stats_tx(&src
->tx
, dst
);
976 ath10k_wmi_pull_pdev_stats_rx(&src
->rx
, dst
);
977 list_add_tail(&dst
->list
, &stats
->pdevs
);
980 for (i
= 0; i
< num_vdev_stats
; i
++) {
981 const struct wmi_tlv_vdev_stats
*src
;
982 struct ath10k_fw_stats_vdev
*dst
;
985 if (data_len
< sizeof(*src
))
988 data
+= sizeof(*src
);
989 data_len
-= sizeof(*src
);
991 dst
= kzalloc(sizeof(*dst
), GFP_ATOMIC
);
995 ath10k_wmi_tlv_pull_vdev_stats(src
, dst
);
996 list_add_tail(&dst
->list
, &stats
->vdevs
);
999 for (i
= 0; i
< num_peer_stats
; i
++) {
1000 const struct wmi_10x_peer_stats
*src
;
1001 struct ath10k_fw_stats_peer
*dst
;
1004 if (data_len
< sizeof(*src
))
1007 data
+= sizeof(*src
);
1008 data_len
-= sizeof(*src
);
1010 dst
= kzalloc(sizeof(*dst
), GFP_ATOMIC
);
1014 ath10k_wmi_pull_peer_stats(&src
->old
, dst
);
1015 dst
->peer_rx_rate
= __le32_to_cpu(src
->peer_rx_rate
);
1016 list_add_tail(&dst
->list
, &stats
->peers
);
1023 static struct sk_buff
*
1024 ath10k_wmi_tlv_op_gen_pdev_suspend(struct ath10k
*ar
, u32 opt
)
1026 struct wmi_tlv_pdev_suspend
*cmd
;
1027 struct wmi_tlv
*tlv
;
1028 struct sk_buff
*skb
;
1030 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1032 return ERR_PTR(-ENOMEM
);
1034 tlv
= (void *)skb
->data
;
1035 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SUSPEND_CMD
);
1036 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1037 cmd
= (void *)tlv
->value
;
1038 cmd
->opt
= __cpu_to_le32(opt
);
1040 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev suspend\n");
1044 static struct sk_buff
*
1045 ath10k_wmi_tlv_op_gen_pdev_resume(struct ath10k
*ar
)
1047 struct wmi_tlv_resume_cmd
*cmd
;
1048 struct wmi_tlv
*tlv
;
1049 struct sk_buff
*skb
;
1051 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1053 return ERR_PTR(-ENOMEM
);
1055 tlv
= (void *)skb
->data
;
1056 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_RESUME_CMD
);
1057 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1058 cmd
= (void *)tlv
->value
;
1059 cmd
->reserved
= __cpu_to_le32(0);
1061 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev resume\n");
1065 static struct sk_buff
*
1066 ath10k_wmi_tlv_op_gen_pdev_set_rd(struct ath10k
*ar
,
1067 u16 rd
, u16 rd2g
, u16 rd5g
,
1068 u16 ctl2g
, u16 ctl5g
,
1069 enum wmi_dfs_region dfs_reg
)
1071 struct wmi_tlv_pdev_set_rd_cmd
*cmd
;
1072 struct wmi_tlv
*tlv
;
1073 struct sk_buff
*skb
;
1075 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1077 return ERR_PTR(-ENOMEM
);
1079 tlv
= (void *)skb
->data
;
1080 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SET_REGDOMAIN_CMD
);
1081 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1082 cmd
= (void *)tlv
->value
;
1083 cmd
->regd
= __cpu_to_le32(rd
);
1084 cmd
->regd_2ghz
= __cpu_to_le32(rd2g
);
1085 cmd
->regd_5ghz
= __cpu_to_le32(rd5g
);
1086 cmd
->conform_limit_2ghz
= __cpu_to_le32(rd2g
);
1087 cmd
->conform_limit_5ghz
= __cpu_to_le32(rd5g
);
1089 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev set rd\n");
1093 static struct sk_buff
*
1094 ath10k_wmi_tlv_op_gen_pdev_set_param(struct ath10k
*ar
, u32 param_id
,
1097 struct wmi_tlv_pdev_set_param_cmd
*cmd
;
1098 struct wmi_tlv
*tlv
;
1099 struct sk_buff
*skb
;
1101 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1103 return ERR_PTR(-ENOMEM
);
1105 tlv
= (void *)skb
->data
;
1106 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SET_PARAM_CMD
);
1107 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1108 cmd
= (void *)tlv
->value
;
1109 cmd
->param_id
= __cpu_to_le32(param_id
);
1110 cmd
->param_value
= __cpu_to_le32(param_value
);
1112 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev set param\n");
1116 static struct sk_buff
*ath10k_wmi_tlv_op_gen_init(struct ath10k
*ar
)
1118 struct sk_buff
*skb
;
1119 struct wmi_tlv
*tlv
;
1120 struct wmi_tlv_init_cmd
*cmd
;
1121 struct wmi_tlv_resource_config
*cfg
;
1122 struct wmi_host_mem_chunks
*chunks
;
1123 size_t len
, chunks_len
;
1126 chunks_len
= ar
->wmi
.num_mem_chunks
* sizeof(struct host_memory_chunk
);
1127 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1128 (sizeof(*tlv
) + sizeof(*cfg
)) +
1129 (sizeof(*tlv
) + chunks_len
);
1131 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1133 return ERR_PTR(-ENOMEM
);
1138 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_INIT_CMD
);
1139 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1140 cmd
= (void *)tlv
->value
;
1141 ptr
+= sizeof(*tlv
);
1142 ptr
+= sizeof(*cmd
);
1145 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_RESOURCE_CONFIG
);
1146 tlv
->len
= __cpu_to_le16(sizeof(*cfg
));
1147 cfg
= (void *)tlv
->value
;
1148 ptr
+= sizeof(*tlv
);
1149 ptr
+= sizeof(*cfg
);
1152 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
1153 tlv
->len
= __cpu_to_le16(chunks_len
);
1154 chunks
= (void *)tlv
->value
;
1156 ptr
+= sizeof(*tlv
);
1159 cmd
->abi
.abi_ver0
= __cpu_to_le32(WMI_TLV_ABI_VER0
);
1160 cmd
->abi
.abi_ver1
= __cpu_to_le32(WMI_TLV_ABI_VER1
);
1161 cmd
->abi
.abi_ver_ns0
= __cpu_to_le32(WMI_TLV_ABI_VER_NS0
);
1162 cmd
->abi
.abi_ver_ns1
= __cpu_to_le32(WMI_TLV_ABI_VER_NS1
);
1163 cmd
->abi
.abi_ver_ns2
= __cpu_to_le32(WMI_TLV_ABI_VER_NS2
);
1164 cmd
->abi
.abi_ver_ns3
= __cpu_to_le32(WMI_TLV_ABI_VER_NS3
);
1165 cmd
->num_host_mem_chunks
= __cpu_to_le32(ar
->wmi
.num_mem_chunks
);
1167 cfg
->num_vdevs
= __cpu_to_le32(TARGET_TLV_NUM_VDEVS
);
1168 cfg
->num_peers
= __cpu_to_le32(TARGET_TLV_NUM_PEERS
);
1170 if (test_bit(WMI_SERVICE_RX_FULL_REORDER
, ar
->wmi
.svc_map
)) {
1171 cfg
->num_offload_peers
= __cpu_to_le32(3);
1172 cfg
->num_offload_reorder_bufs
= __cpu_to_le32(3);
1174 cfg
->num_offload_peers
= __cpu_to_le32(0);
1175 cfg
->num_offload_reorder_bufs
= __cpu_to_le32(0);
1178 cfg
->num_peer_keys
= __cpu_to_le32(2);
1179 cfg
->num_tids
= __cpu_to_le32(TARGET_TLV_NUM_TIDS
);
1180 cfg
->ast_skid_limit
= __cpu_to_le32(0x10);
1181 cfg
->tx_chain_mask
= __cpu_to_le32(0x7);
1182 cfg
->rx_chain_mask
= __cpu_to_le32(0x7);
1183 cfg
->rx_timeout_pri
[0] = __cpu_to_le32(0x64);
1184 cfg
->rx_timeout_pri
[1] = __cpu_to_le32(0x64);
1185 cfg
->rx_timeout_pri
[2] = __cpu_to_le32(0x64);
1186 cfg
->rx_timeout_pri
[3] = __cpu_to_le32(0x28);
1187 cfg
->rx_decap_mode
= __cpu_to_le32(1);
1188 cfg
->scan_max_pending_reqs
= __cpu_to_le32(4);
1189 cfg
->bmiss_offload_max_vdev
= __cpu_to_le32(3);
1190 cfg
->roam_offload_max_vdev
= __cpu_to_le32(3);
1191 cfg
->roam_offload_max_ap_profiles
= __cpu_to_le32(8);
1192 cfg
->num_mcast_groups
= __cpu_to_le32(0);
1193 cfg
->num_mcast_table_elems
= __cpu_to_le32(0);
1194 cfg
->mcast2ucast_mode
= __cpu_to_le32(0);
1195 cfg
->tx_dbg_log_size
= __cpu_to_le32(0x400);
1196 cfg
->num_wds_entries
= __cpu_to_le32(0x20);
1197 cfg
->dma_burst_size
= __cpu_to_le32(0);
1198 cfg
->mac_aggr_delim
= __cpu_to_le32(0);
1199 cfg
->rx_skip_defrag_timeout_dup_detection_check
= __cpu_to_le32(0);
1200 cfg
->vow_config
= __cpu_to_le32(0);
1201 cfg
->gtk_offload_max_vdev
= __cpu_to_le32(2);
1202 cfg
->num_msdu_desc
= __cpu_to_le32(TARGET_TLV_NUM_MSDU_DESC
);
1203 cfg
->max_frag_entries
= __cpu_to_le32(2);
1204 cfg
->num_tdls_vdevs
= __cpu_to_le32(1);
1205 cfg
->num_tdls_conn_table_entries
= __cpu_to_le32(0x20);
1206 cfg
->beacon_tx_offload_max_vdev
= __cpu_to_le32(2);
1207 cfg
->num_multicast_filter_entries
= __cpu_to_le32(5);
1208 cfg
->num_wow_filters
= __cpu_to_le32(0x16);
1209 cfg
->num_keep_alive_pattern
= __cpu_to_le32(6);
1210 cfg
->keep_alive_pattern_size
= __cpu_to_le32(0);
1211 cfg
->max_tdls_concurrent_sleep_sta
= __cpu_to_le32(1);
1212 cfg
->max_tdls_concurrent_buffer_sta
= __cpu_to_le32(1);
1214 ath10k_wmi_put_host_mem_chunks(ar
, chunks
);
1216 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv init\n");
1220 static struct sk_buff
*
1221 ath10k_wmi_tlv_op_gen_start_scan(struct ath10k
*ar
,
1222 const struct wmi_start_scan_arg
*arg
)
1224 struct wmi_tlv_start_scan_cmd
*cmd
;
1225 struct wmi_tlv
*tlv
;
1226 struct sk_buff
*skb
;
1227 size_t len
, chan_len
, ssid_len
, bssid_len
, ie_len
;
1229 struct wmi_ssid
*ssids
;
1230 struct wmi_mac_addr
*addrs
;
1234 ret
= ath10k_wmi_start_scan_verify(arg
);
1236 return ERR_PTR(ret
);
1238 chan_len
= arg
->n_channels
* sizeof(__le32
);
1239 ssid_len
= arg
->n_ssids
* sizeof(struct wmi_ssid
);
1240 bssid_len
= arg
->n_bssids
* sizeof(struct wmi_mac_addr
);
1241 ie_len
= roundup(arg
->ie_len
, 4);
1242 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1243 (arg
->n_channels
? sizeof(*tlv
) + chan_len
: 0) +
1244 (arg
->n_ssids
? sizeof(*tlv
) + ssid_len
: 0) +
1245 (arg
->n_bssids
? sizeof(*tlv
) + bssid_len
: 0) +
1246 (arg
->ie_len
? sizeof(*tlv
) + ie_len
: 0);
1248 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1250 return ERR_PTR(-ENOMEM
);
1252 ptr
= (void *)skb
->data
;
1254 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_START_SCAN_CMD
);
1255 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1256 cmd
= (void *)tlv
->value
;
1258 ath10k_wmi_put_start_scan_common(&cmd
->common
, arg
);
1259 cmd
->burst_duration_ms
= __cpu_to_le32(0);
1260 cmd
->num_channels
= __cpu_to_le32(arg
->n_channels
);
1261 cmd
->num_ssids
= __cpu_to_le32(arg
->n_ssids
);
1262 cmd
->num_bssids
= __cpu_to_le32(arg
->n_bssids
);
1263 cmd
->ie_len
= __cpu_to_le32(arg
->ie_len
);
1264 cmd
->num_probes
= __cpu_to_le32(3);
1266 /* FIXME: There are some scan flag inconsistencies across firmwares,
1267 * e.g. WMI-TLV inverts the logic behind the following flag.
1269 cmd
->common
.scan_ctrl_flags
^= __cpu_to_le32(WMI_SCAN_FILTER_PROBE_REQ
);
1271 ptr
+= sizeof(*tlv
);
1272 ptr
+= sizeof(*cmd
);
1275 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_UINT32
);
1276 tlv
->len
= __cpu_to_le16(chan_len
);
1277 chans
= (void *)tlv
->value
;
1278 for (i
= 0; i
< arg
->n_channels
; i
++)
1279 chans
[i
] = __cpu_to_le32(arg
->channels
[i
]);
1281 ptr
+= sizeof(*tlv
);
1285 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_FIXED_STRUCT
);
1286 tlv
->len
= __cpu_to_le16(ssid_len
);
1287 ssids
= (void *)tlv
->value
;
1288 for (i
= 0; i
< arg
->n_ssids
; i
++) {
1289 ssids
[i
].ssid_len
= __cpu_to_le32(arg
->ssids
[i
].len
);
1290 memcpy(ssids
[i
].ssid
, arg
->ssids
[i
].ssid
, arg
->ssids
[i
].len
);
1293 ptr
+= sizeof(*tlv
);
1297 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_FIXED_STRUCT
);
1298 tlv
->len
= __cpu_to_le16(bssid_len
);
1299 addrs
= (void *)tlv
->value
;
1300 for (i
= 0; i
< arg
->n_bssids
; i
++)
1301 ether_addr_copy(addrs
[i
].addr
, arg
->bssids
[i
].bssid
);
1303 ptr
+= sizeof(*tlv
);
1307 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1308 tlv
->len
= __cpu_to_le16(ie_len
);
1309 memcpy(tlv
->value
, arg
->ie
, arg
->ie_len
);
1311 ptr
+= sizeof(*tlv
);
1314 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv start scan\n");
1318 static struct sk_buff
*
1319 ath10k_wmi_tlv_op_gen_stop_scan(struct ath10k
*ar
,
1320 const struct wmi_stop_scan_arg
*arg
)
1322 struct wmi_stop_scan_cmd
*cmd
;
1323 struct wmi_tlv
*tlv
;
1324 struct sk_buff
*skb
;
1328 if (arg
->req_id
> 0xFFF)
1329 return ERR_PTR(-EINVAL
);
1330 if (arg
->req_type
== WMI_SCAN_STOP_ONE
&& arg
->u
.scan_id
> 0xFFF)
1331 return ERR_PTR(-EINVAL
);
1333 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1335 return ERR_PTR(-ENOMEM
);
1337 scan_id
= arg
->u
.scan_id
;
1338 scan_id
|= WMI_HOST_SCAN_REQ_ID_PREFIX
;
1340 req_id
= arg
->req_id
;
1341 req_id
|= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX
;
1343 tlv
= (void *)skb
->data
;
1344 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STOP_SCAN_CMD
);
1345 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1346 cmd
= (void *)tlv
->value
;
1347 cmd
->req_type
= __cpu_to_le32(arg
->req_type
);
1348 cmd
->vdev_id
= __cpu_to_le32(arg
->u
.vdev_id
);
1349 cmd
->scan_id
= __cpu_to_le32(scan_id
);
1350 cmd
->scan_req_id
= __cpu_to_le32(req_id
);
1352 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv stop scan\n");
1356 static struct sk_buff
*
1357 ath10k_wmi_tlv_op_gen_vdev_create(struct ath10k
*ar
,
1359 enum wmi_vdev_type vdev_type
,
1360 enum wmi_vdev_subtype vdev_subtype
,
1361 const u8 mac_addr
[ETH_ALEN
])
1363 struct wmi_vdev_create_cmd
*cmd
;
1364 struct wmi_tlv
*tlv
;
1365 struct sk_buff
*skb
;
1367 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1369 return ERR_PTR(-ENOMEM
);
1371 tlv
= (void *)skb
->data
;
1372 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_CREATE_CMD
);
1373 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1374 cmd
= (void *)tlv
->value
;
1375 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1376 cmd
->vdev_type
= __cpu_to_le32(vdev_type
);
1377 cmd
->vdev_subtype
= __cpu_to_le32(vdev_subtype
);
1378 ether_addr_copy(cmd
->vdev_macaddr
.addr
, mac_addr
);
1380 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev create\n");
1384 static struct sk_buff
*
1385 ath10k_wmi_tlv_op_gen_vdev_delete(struct ath10k
*ar
, u32 vdev_id
)
1387 struct wmi_vdev_delete_cmd
*cmd
;
1388 struct wmi_tlv
*tlv
;
1389 struct sk_buff
*skb
;
1391 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1393 return ERR_PTR(-ENOMEM
);
1395 tlv
= (void *)skb
->data
;
1396 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_DELETE_CMD
);
1397 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1398 cmd
= (void *)tlv
->value
;
1399 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1401 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev delete\n");
1405 static struct sk_buff
*
1406 ath10k_wmi_tlv_op_gen_vdev_start(struct ath10k
*ar
,
1407 const struct wmi_vdev_start_request_arg
*arg
,
1410 struct wmi_tlv_vdev_start_cmd
*cmd
;
1411 struct wmi_channel
*ch
;
1412 struct wmi_p2p_noa_descriptor
*noa
;
1413 struct wmi_tlv
*tlv
;
1414 struct sk_buff
*skb
;
1419 if (WARN_ON(arg
->ssid
&& arg
->ssid_len
== 0))
1420 return ERR_PTR(-EINVAL
);
1421 if (WARN_ON(arg
->hidden_ssid
&& !arg
->ssid
))
1422 return ERR_PTR(-EINVAL
);
1423 if (WARN_ON(arg
->ssid_len
> sizeof(cmd
->ssid
.ssid
)))
1424 return ERR_PTR(-EINVAL
);
1426 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1427 (sizeof(*tlv
) + sizeof(*ch
)) +
1429 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1431 return ERR_PTR(-ENOMEM
);
1433 if (arg
->hidden_ssid
)
1434 flags
|= WMI_VDEV_START_HIDDEN_SSID
;
1435 if (arg
->pmf_enabled
)
1436 flags
|= WMI_VDEV_START_PMF_ENABLED
;
1438 ptr
= (void *)skb
->data
;
1441 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_START_REQUEST_CMD
);
1442 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1443 cmd
= (void *)tlv
->value
;
1444 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1445 cmd
->bcn_intval
= __cpu_to_le32(arg
->bcn_intval
);
1446 cmd
->dtim_period
= __cpu_to_le32(arg
->dtim_period
);
1447 cmd
->flags
= __cpu_to_le32(flags
);
1448 cmd
->bcn_tx_rate
= __cpu_to_le32(arg
->bcn_tx_rate
);
1449 cmd
->bcn_tx_power
= __cpu_to_le32(arg
->bcn_tx_power
);
1450 cmd
->disable_hw_ack
= __cpu_to_le32(arg
->disable_hw_ack
);
1453 cmd
->ssid
.ssid_len
= __cpu_to_le32(arg
->ssid_len
);
1454 memcpy(cmd
->ssid
.ssid
, arg
->ssid
, arg
->ssid_len
);
1457 ptr
+= sizeof(*tlv
);
1458 ptr
+= sizeof(*cmd
);
1461 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_CHANNEL
);
1462 tlv
->len
= __cpu_to_le16(sizeof(*ch
));
1463 ch
= (void *)tlv
->value
;
1464 ath10k_wmi_put_wmi_channel(ch
, &arg
->channel
);
1466 ptr
+= sizeof(*tlv
);
1470 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
1472 noa
= (void *)tlv
->value
;
1474 /* Note: This is a nested TLV containing:
1475 * [wmi_tlv][wmi_p2p_noa_descriptor][wmi_tlv]..
1478 ptr
+= sizeof(*tlv
);
1481 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev start\n");
1485 static struct sk_buff
*
1486 ath10k_wmi_tlv_op_gen_vdev_stop(struct ath10k
*ar
, u32 vdev_id
)
1488 struct wmi_vdev_stop_cmd
*cmd
;
1489 struct wmi_tlv
*tlv
;
1490 struct sk_buff
*skb
;
1492 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1494 return ERR_PTR(-ENOMEM
);
1496 tlv
= (void *)skb
->data
;
1497 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_STOP_CMD
);
1498 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1499 cmd
= (void *)tlv
->value
;
1500 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1502 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev stop\n");
1506 static struct sk_buff
*
1507 ath10k_wmi_tlv_op_gen_vdev_up(struct ath10k
*ar
, u32 vdev_id
, u32 aid
,
1511 struct wmi_vdev_up_cmd
*cmd
;
1512 struct wmi_tlv
*tlv
;
1513 struct sk_buff
*skb
;
1515 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1517 return ERR_PTR(-ENOMEM
);
1519 tlv
= (void *)skb
->data
;
1520 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_UP_CMD
);
1521 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1522 cmd
= (void *)tlv
->value
;
1523 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1524 cmd
->vdev_assoc_id
= __cpu_to_le32(aid
);
1525 ether_addr_copy(cmd
->vdev_bssid
.addr
, bssid
);
1527 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev up\n");
1531 static struct sk_buff
*
1532 ath10k_wmi_tlv_op_gen_vdev_down(struct ath10k
*ar
, u32 vdev_id
)
1534 struct wmi_vdev_down_cmd
*cmd
;
1535 struct wmi_tlv
*tlv
;
1536 struct sk_buff
*skb
;
1538 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1540 return ERR_PTR(-ENOMEM
);
1542 tlv
= (void *)skb
->data
;
1543 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_DOWN_CMD
);
1544 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1545 cmd
= (void *)tlv
->value
;
1546 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1548 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev down\n");
1552 static struct sk_buff
*
1553 ath10k_wmi_tlv_op_gen_vdev_set_param(struct ath10k
*ar
, u32 vdev_id
,
1554 u32 param_id
, u32 param_value
)
1556 struct wmi_vdev_set_param_cmd
*cmd
;
1557 struct wmi_tlv
*tlv
;
1558 struct sk_buff
*skb
;
1560 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1562 return ERR_PTR(-ENOMEM
);
1564 tlv
= (void *)skb
->data
;
1565 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_SET_PARAM_CMD
);
1566 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1567 cmd
= (void *)tlv
->value
;
1568 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1569 cmd
->param_id
= __cpu_to_le32(param_id
);
1570 cmd
->param_value
= __cpu_to_le32(param_value
);
1572 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev set param\n");
1576 static struct sk_buff
*
1577 ath10k_wmi_tlv_op_gen_vdev_install_key(struct ath10k
*ar
,
1578 const struct wmi_vdev_install_key_arg
*arg
)
1580 struct wmi_vdev_install_key_cmd
*cmd
;
1581 struct wmi_tlv
*tlv
;
1582 struct sk_buff
*skb
;
1586 if (arg
->key_cipher
== WMI_CIPHER_NONE
&& arg
->key_data
!= NULL
)
1587 return ERR_PTR(-EINVAL
);
1588 if (arg
->key_cipher
!= WMI_CIPHER_NONE
&& arg
->key_data
== NULL
)
1589 return ERR_PTR(-EINVAL
);
1591 len
= sizeof(*tlv
) + sizeof(*cmd
) +
1592 sizeof(*tlv
) + roundup(arg
->key_len
, sizeof(__le32
));
1593 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1595 return ERR_PTR(-ENOMEM
);
1597 ptr
= (void *)skb
->data
;
1599 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_INSTALL_KEY_CMD
);
1600 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1601 cmd
= (void *)tlv
->value
;
1602 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1603 cmd
->key_idx
= __cpu_to_le32(arg
->key_idx
);
1604 cmd
->key_flags
= __cpu_to_le32(arg
->key_flags
);
1605 cmd
->key_cipher
= __cpu_to_le32(arg
->key_cipher
);
1606 cmd
->key_len
= __cpu_to_le32(arg
->key_len
);
1607 cmd
->key_txmic_len
= __cpu_to_le32(arg
->key_txmic_len
);
1608 cmd
->key_rxmic_len
= __cpu_to_le32(arg
->key_rxmic_len
);
1611 ether_addr_copy(cmd
->peer_macaddr
.addr
, arg
->macaddr
);
1613 ptr
+= sizeof(*tlv
);
1614 ptr
+= sizeof(*cmd
);
1617 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1618 tlv
->len
= __cpu_to_le16(roundup(arg
->key_len
, sizeof(__le32
)));
1620 memcpy(tlv
->value
, arg
->key_data
, arg
->key_len
);
1622 ptr
+= sizeof(*tlv
);
1623 ptr
+= roundup(arg
->key_len
, sizeof(__le32
));
1625 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev install key\n");
1629 static void *ath10k_wmi_tlv_put_uapsd_ac(struct ath10k
*ar
, void *ptr
,
1630 const struct wmi_sta_uapsd_auto_trig_arg
*arg
)
1632 struct wmi_sta_uapsd_auto_trig_param
*ac
;
1633 struct wmi_tlv
*tlv
;
1636 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_UAPSD_AUTO_TRIG_PARAM
);
1637 tlv
->len
= __cpu_to_le16(sizeof(*ac
));
1638 ac
= (void *)tlv
->value
;
1640 ac
->wmm_ac
= __cpu_to_le32(arg
->wmm_ac
);
1641 ac
->user_priority
= __cpu_to_le32(arg
->user_priority
);
1642 ac
->service_interval
= __cpu_to_le32(arg
->service_interval
);
1643 ac
->suspend_interval
= __cpu_to_le32(arg
->suspend_interval
);
1644 ac
->delay_interval
= __cpu_to_le32(arg
->delay_interval
);
1646 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
1647 "wmi tlv vdev sta uapsd auto trigger ac %d prio %d svc int %d susp int %d delay int %d\n",
1648 ac
->wmm_ac
, ac
->user_priority
, ac
->service_interval
,
1649 ac
->suspend_interval
, ac
->delay_interval
);
1651 return ptr
+ sizeof(*tlv
) + sizeof(*ac
);
1654 static struct sk_buff
*
1655 ath10k_wmi_tlv_op_gen_vdev_sta_uapsd(struct ath10k
*ar
, u32 vdev_id
,
1656 const u8 peer_addr
[ETH_ALEN
],
1657 const struct wmi_sta_uapsd_auto_trig_arg
*args
,
1660 struct wmi_sta_uapsd_auto_trig_cmd_fixed_param
*cmd
;
1661 struct wmi_sta_uapsd_auto_trig_param
*ac
;
1662 struct wmi_tlv
*tlv
;
1663 struct sk_buff
*skb
;
1669 ac_tlv_len
= num_ac
* (sizeof(*tlv
) + sizeof(*ac
));
1670 len
= sizeof(*tlv
) + sizeof(*cmd
) +
1671 sizeof(*tlv
) + ac_tlv_len
;
1672 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1674 return ERR_PTR(-ENOMEM
);
1676 ptr
= (void *)skb
->data
;
1678 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_UAPSD_AUTO_TRIG_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
->num_ac
= __cpu_to_le32(num_ac
);
1683 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1685 ptr
+= sizeof(*tlv
);
1686 ptr
+= sizeof(*cmd
);
1689 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
1690 tlv
->len
= __cpu_to_le16(ac_tlv_len
);
1691 ac
= (void *)tlv
->value
;
1693 ptr
+= sizeof(*tlv
);
1694 for (i
= 0; i
< num_ac
; i
++)
1695 ptr
= ath10k_wmi_tlv_put_uapsd_ac(ar
, ptr
, &args
[i
]);
1697 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev sta uapsd auto trigger\n");
1701 static void *ath10k_wmi_tlv_put_wmm(void *ptr
,
1702 const struct wmi_wmm_params_arg
*arg
)
1704 struct wmi_wmm_params
*wmm
;
1705 struct wmi_tlv
*tlv
;
1708 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_WMM_PARAMS
);
1709 tlv
->len
= __cpu_to_le16(sizeof(*wmm
));
1710 wmm
= (void *)tlv
->value
;
1711 ath10k_wmi_set_wmm_param(wmm
, arg
);
1713 return ptr
+ sizeof(*tlv
) + sizeof(*wmm
);
1716 static struct sk_buff
*
1717 ath10k_wmi_tlv_op_gen_vdev_wmm_conf(struct ath10k
*ar
, u32 vdev_id
,
1718 const struct wmi_wmm_params_all_arg
*arg
)
1720 struct wmi_tlv_vdev_set_wmm_cmd
*cmd
;
1721 struct wmi_tlv
*tlv
;
1722 struct sk_buff
*skb
;
1726 len
= sizeof(*tlv
) + sizeof(*cmd
);
1727 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1729 return ERR_PTR(-ENOMEM
);
1731 ptr
= (void *)skb
->data
;
1733 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VDEV_SET_WMM_PARAMS_CMD
);
1734 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1735 cmd
= (void *)tlv
->value
;
1736 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1738 ath10k_wmi_set_wmm_param(&cmd
->vdev_wmm_params
[0].params
, &arg
->ac_be
);
1739 ath10k_wmi_set_wmm_param(&cmd
->vdev_wmm_params
[1].params
, &arg
->ac_bk
);
1740 ath10k_wmi_set_wmm_param(&cmd
->vdev_wmm_params
[2].params
, &arg
->ac_vi
);
1741 ath10k_wmi_set_wmm_param(&cmd
->vdev_wmm_params
[3].params
, &arg
->ac_vo
);
1743 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv vdev wmm conf\n");
1747 static struct sk_buff
*
1748 ath10k_wmi_tlv_op_gen_sta_keepalive(struct ath10k
*ar
,
1749 const struct wmi_sta_keepalive_arg
*arg
)
1751 struct wmi_tlv_sta_keepalive_cmd
*cmd
;
1752 struct wmi_sta_keepalive_arp_resp
*arp
;
1753 struct sk_buff
*skb
;
1754 struct wmi_tlv
*tlv
;
1758 len
= sizeof(*tlv
) + sizeof(*cmd
) +
1759 sizeof(*tlv
) + sizeof(*arp
);
1760 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1762 return ERR_PTR(-ENOMEM
);
1764 ptr
= (void *)skb
->data
;
1766 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_KEEPALIVE_CMD
);
1767 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1768 cmd
= (void *)tlv
->value
;
1769 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1770 cmd
->enabled
= __cpu_to_le32(arg
->enabled
);
1771 cmd
->method
= __cpu_to_le32(arg
->method
);
1772 cmd
->interval
= __cpu_to_le32(arg
->interval
);
1774 ptr
+= sizeof(*tlv
);
1775 ptr
+= sizeof(*cmd
);
1778 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_KEEPALVE_ARP_RESPONSE
);
1779 tlv
->len
= __cpu_to_le16(sizeof(*arp
));
1780 arp
= (void *)tlv
->value
;
1782 arp
->src_ip4_addr
= arg
->src_ip4_addr
;
1783 arp
->dest_ip4_addr
= arg
->dest_ip4_addr
;
1784 ether_addr_copy(arp
->dest_mac_addr
.addr
, arg
->dest_mac_addr
);
1786 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv sta keepalive vdev %d enabled %d method %d inverval %d\n",
1787 arg
->vdev_id
, arg
->enabled
, arg
->method
, arg
->interval
);
1791 static struct sk_buff
*
1792 ath10k_wmi_tlv_op_gen_peer_create(struct ath10k
*ar
, u32 vdev_id
,
1793 const u8 peer_addr
[ETH_ALEN
])
1795 struct wmi_tlv_peer_create_cmd
*cmd
;
1796 struct wmi_tlv
*tlv
;
1797 struct sk_buff
*skb
;
1799 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1801 return ERR_PTR(-ENOMEM
);
1803 tlv
= (void *)skb
->data
;
1804 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_CREATE_CMD
);
1805 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1806 cmd
= (void *)tlv
->value
;
1807 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1808 cmd
->peer_type
= __cpu_to_le32(WMI_TLV_PEER_TYPE_DEFAULT
); /* FIXME */
1809 ether_addr_copy(cmd
->peer_addr
.addr
, peer_addr
);
1811 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer create\n");
1815 static struct sk_buff
*
1816 ath10k_wmi_tlv_op_gen_peer_delete(struct ath10k
*ar
, u32 vdev_id
,
1817 const u8 peer_addr
[ETH_ALEN
])
1819 struct wmi_peer_delete_cmd
*cmd
;
1820 struct wmi_tlv
*tlv
;
1821 struct sk_buff
*skb
;
1823 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1825 return ERR_PTR(-ENOMEM
);
1827 tlv
= (void *)skb
->data
;
1828 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_DELETE_CMD
);
1829 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1830 cmd
= (void *)tlv
->value
;
1831 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1832 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1834 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer delete\n");
1838 static struct sk_buff
*
1839 ath10k_wmi_tlv_op_gen_peer_flush(struct ath10k
*ar
, u32 vdev_id
,
1840 const u8 peer_addr
[ETH_ALEN
], u32 tid_bitmap
)
1842 struct wmi_peer_flush_tids_cmd
*cmd
;
1843 struct wmi_tlv
*tlv
;
1844 struct sk_buff
*skb
;
1846 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1848 return ERR_PTR(-ENOMEM
);
1850 tlv
= (void *)skb
->data
;
1851 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_FLUSH_TIDS_CMD
);
1852 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1853 cmd
= (void *)tlv
->value
;
1854 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1855 cmd
->peer_tid_bitmap
= __cpu_to_le32(tid_bitmap
);
1856 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1858 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer flush\n");
1862 static struct sk_buff
*
1863 ath10k_wmi_tlv_op_gen_peer_set_param(struct ath10k
*ar
, u32 vdev_id
,
1864 const u8
*peer_addr
,
1865 enum wmi_peer_param param_id
,
1868 struct wmi_peer_set_param_cmd
*cmd
;
1869 struct wmi_tlv
*tlv
;
1870 struct sk_buff
*skb
;
1872 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1874 return ERR_PTR(-ENOMEM
);
1876 tlv
= (void *)skb
->data
;
1877 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_SET_PARAM_CMD
);
1878 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1879 cmd
= (void *)tlv
->value
;
1880 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1881 cmd
->param_id
= __cpu_to_le32(param_id
);
1882 cmd
->param_value
= __cpu_to_le32(param_value
);
1883 ether_addr_copy(cmd
->peer_macaddr
.addr
, peer_addr
);
1885 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer set param\n");
1889 static struct sk_buff
*
1890 ath10k_wmi_tlv_op_gen_peer_assoc(struct ath10k
*ar
,
1891 const struct wmi_peer_assoc_complete_arg
*arg
)
1893 struct wmi_tlv_peer_assoc_cmd
*cmd
;
1894 struct wmi_vht_rate_set
*vht_rate
;
1895 struct wmi_tlv
*tlv
;
1896 struct sk_buff
*skb
;
1897 size_t len
, legacy_rate_len
, ht_rate_len
;
1900 if (arg
->peer_mpdu_density
> 16)
1901 return ERR_PTR(-EINVAL
);
1902 if (arg
->peer_legacy_rates
.num_rates
> MAX_SUPPORTED_RATES
)
1903 return ERR_PTR(-EINVAL
);
1904 if (arg
->peer_ht_rates
.num_rates
> MAX_SUPPORTED_RATES
)
1905 return ERR_PTR(-EINVAL
);
1907 legacy_rate_len
= roundup(arg
->peer_legacy_rates
.num_rates
,
1909 ht_rate_len
= roundup(arg
->peer_ht_rates
.num_rates
, sizeof(__le32
));
1910 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
1911 (sizeof(*tlv
) + legacy_rate_len
) +
1912 (sizeof(*tlv
) + ht_rate_len
) +
1913 (sizeof(*tlv
) + sizeof(*vht_rate
));
1914 skb
= ath10k_wmi_alloc_skb(ar
, len
);
1916 return ERR_PTR(-ENOMEM
);
1918 ptr
= (void *)skb
->data
;
1920 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PEER_ASSOC_COMPLETE_CMD
);
1921 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1922 cmd
= (void *)tlv
->value
;
1924 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1925 cmd
->new_assoc
= __cpu_to_le32(arg
->peer_reassoc
? 0 : 1);
1926 cmd
->assoc_id
= __cpu_to_le32(arg
->peer_aid
);
1927 cmd
->flags
= __cpu_to_le32(arg
->peer_flags
);
1928 cmd
->caps
= __cpu_to_le32(arg
->peer_caps
);
1929 cmd
->listen_intval
= __cpu_to_le32(arg
->peer_listen_intval
);
1930 cmd
->ht_caps
= __cpu_to_le32(arg
->peer_ht_caps
);
1931 cmd
->max_mpdu
= __cpu_to_le32(arg
->peer_max_mpdu
);
1932 cmd
->mpdu_density
= __cpu_to_le32(arg
->peer_mpdu_density
);
1933 cmd
->rate_caps
= __cpu_to_le32(arg
->peer_rate_caps
);
1934 cmd
->nss
= __cpu_to_le32(arg
->peer_num_spatial_streams
);
1935 cmd
->vht_caps
= __cpu_to_le32(arg
->peer_vht_caps
);
1936 cmd
->phy_mode
= __cpu_to_le32(arg
->peer_phymode
);
1937 cmd
->num_legacy_rates
= __cpu_to_le32(arg
->peer_legacy_rates
.num_rates
);
1938 cmd
->num_ht_rates
= __cpu_to_le32(arg
->peer_ht_rates
.num_rates
);
1939 ether_addr_copy(cmd
->mac_addr
.addr
, arg
->addr
);
1941 ptr
+= sizeof(*tlv
);
1942 ptr
+= sizeof(*cmd
);
1945 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1946 tlv
->len
= __cpu_to_le16(legacy_rate_len
);
1947 memcpy(tlv
->value
, arg
->peer_legacy_rates
.rates
,
1948 arg
->peer_legacy_rates
.num_rates
);
1950 ptr
+= sizeof(*tlv
);
1951 ptr
+= legacy_rate_len
;
1954 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
1955 tlv
->len
= __cpu_to_le16(ht_rate_len
);
1956 memcpy(tlv
->value
, arg
->peer_ht_rates
.rates
,
1957 arg
->peer_ht_rates
.num_rates
);
1959 ptr
+= sizeof(*tlv
);
1963 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_VHT_RATE_SET
);
1964 tlv
->len
= __cpu_to_le16(sizeof(*vht_rate
));
1965 vht_rate
= (void *)tlv
->value
;
1967 vht_rate
->rx_max_rate
= __cpu_to_le32(arg
->peer_vht_rates
.rx_max_rate
);
1968 vht_rate
->rx_mcs_set
= __cpu_to_le32(arg
->peer_vht_rates
.rx_mcs_set
);
1969 vht_rate
->tx_max_rate
= __cpu_to_le32(arg
->peer_vht_rates
.tx_max_rate
);
1970 vht_rate
->tx_mcs_set
= __cpu_to_le32(arg
->peer_vht_rates
.tx_mcs_set
);
1972 ptr
+= sizeof(*tlv
);
1973 ptr
+= sizeof(*vht_rate
);
1975 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv peer assoc\n");
1979 static struct sk_buff
*
1980 ath10k_wmi_tlv_op_gen_set_psmode(struct ath10k
*ar
, u32 vdev_id
,
1981 enum wmi_sta_ps_mode psmode
)
1983 struct wmi_sta_powersave_mode_cmd
*cmd
;
1984 struct wmi_tlv
*tlv
;
1985 struct sk_buff
*skb
;
1987 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
1989 return ERR_PTR(-ENOMEM
);
1991 tlv
= (void *)skb
->data
;
1992 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_POWERSAVE_MODE_CMD
);
1993 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
1994 cmd
= (void *)tlv
->value
;
1995 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1996 cmd
->sta_ps_mode
= __cpu_to_le32(psmode
);
1998 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv set psmode\n");
2002 static struct sk_buff
*
2003 ath10k_wmi_tlv_op_gen_set_sta_ps(struct ath10k
*ar
, u32 vdev_id
,
2004 enum wmi_sta_powersave_param param_id
,
2007 struct wmi_sta_powersave_param_cmd
*cmd
;
2008 struct wmi_tlv
*tlv
;
2009 struct sk_buff
*skb
;
2011 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
2013 return ERR_PTR(-ENOMEM
);
2015 tlv
= (void *)skb
->data
;
2016 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_STA_POWERSAVE_PARAM_CMD
);
2017 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2018 cmd
= (void *)tlv
->value
;
2019 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2020 cmd
->param_id
= __cpu_to_le32(param_id
);
2021 cmd
->param_value
= __cpu_to_le32(param_value
);
2023 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv set sta ps\n");
2027 static struct sk_buff
*
2028 ath10k_wmi_tlv_op_gen_set_ap_ps(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
2029 enum wmi_ap_ps_peer_param param_id
, u32 value
)
2031 struct wmi_ap_ps_peer_cmd
*cmd
;
2032 struct wmi_tlv
*tlv
;
2033 struct sk_buff
*skb
;
2036 return ERR_PTR(-EINVAL
);
2038 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
2040 return ERR_PTR(-ENOMEM
);
2042 tlv
= (void *)skb
->data
;
2043 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_AP_PS_PEER_CMD
);
2044 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2045 cmd
= (void *)tlv
->value
;
2046 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2047 cmd
->param_id
= __cpu_to_le32(param_id
);
2048 cmd
->param_value
= __cpu_to_le32(value
);
2049 ether_addr_copy(cmd
->peer_macaddr
.addr
, mac
);
2051 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv ap ps param\n");
2055 static struct sk_buff
*
2056 ath10k_wmi_tlv_op_gen_scan_chan_list(struct ath10k
*ar
,
2057 const struct wmi_scan_chan_list_arg
*arg
)
2059 struct wmi_tlv_scan_chan_list_cmd
*cmd
;
2060 struct wmi_channel
*ci
;
2061 struct wmi_channel_arg
*ch
;
2062 struct wmi_tlv
*tlv
;
2063 struct sk_buff
*skb
;
2064 size_t chans_len
, len
;
2068 chans_len
= arg
->n_channels
* (sizeof(*tlv
) + sizeof(*ci
));
2069 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
2070 (sizeof(*tlv
) + chans_len
);
2072 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2074 return ERR_PTR(-ENOMEM
);
2076 ptr
= (void *)skb
->data
;
2078 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_SCAN_CHAN_LIST_CMD
);
2079 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2080 cmd
= (void *)tlv
->value
;
2081 cmd
->num_scan_chans
= __cpu_to_le32(arg
->n_channels
);
2083 ptr
+= sizeof(*tlv
);
2084 ptr
+= sizeof(*cmd
);
2087 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_STRUCT
);
2088 tlv
->len
= __cpu_to_le16(chans_len
);
2089 chans
= (void *)tlv
->value
;
2091 for (i
= 0; i
< arg
->n_channels
; i
++) {
2092 ch
= &arg
->channels
[i
];
2095 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_CHANNEL
);
2096 tlv
->len
= __cpu_to_le16(sizeof(*ci
));
2097 ci
= (void *)tlv
->value
;
2099 ath10k_wmi_put_wmi_channel(ci
, ch
);
2101 chans
+= sizeof(*tlv
);
2102 chans
+= sizeof(*ci
);
2105 ptr
+= sizeof(*tlv
);
2108 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv scan chan list\n");
2112 static struct sk_buff
*
2113 ath10k_wmi_tlv_op_gen_beacon_dma(struct ath10k
*ar
, u32 vdev_id
,
2114 const void *bcn
, size_t bcn_len
,
2115 u32 bcn_paddr
, bool dtim_zero
,
2119 struct wmi_bcn_tx_ref_cmd
*cmd
;
2120 struct wmi_tlv
*tlv
;
2121 struct sk_buff
*skb
;
2122 struct ieee80211_hdr
*hdr
;
2125 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
2127 return ERR_PTR(-ENOMEM
);
2129 hdr
= (struct ieee80211_hdr
*)bcn
;
2130 fc
= le16_to_cpu(hdr
->frame_control
);
2132 tlv
= (void *)skb
->data
;
2133 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_SEND_FROM_HOST_CMD
);
2134 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2135 cmd
= (void *)tlv
->value
;
2136 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2137 cmd
->data_len
= __cpu_to_le32(bcn_len
);
2138 cmd
->data_ptr
= __cpu_to_le32(bcn_paddr
);
2140 cmd
->frame_control
= __cpu_to_le32(fc
);
2144 cmd
->flags
|= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO
);
2147 cmd
->flags
|= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB
);
2149 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv beacon dma\n");
2153 static struct sk_buff
*
2154 ath10k_wmi_tlv_op_gen_pdev_set_wmm(struct ath10k
*ar
,
2155 const struct wmi_wmm_params_all_arg
*arg
)
2157 struct wmi_tlv_pdev_set_wmm_cmd
*cmd
;
2158 struct wmi_wmm_params
*wmm
;
2159 struct wmi_tlv
*tlv
;
2160 struct sk_buff
*skb
;
2164 len
= (sizeof(*tlv
) + sizeof(*cmd
)) +
2165 (4 * (sizeof(*tlv
) + sizeof(*wmm
)));
2166 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2168 return ERR_PTR(-ENOMEM
);
2170 ptr
= (void *)skb
->data
;
2173 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_SET_WMM_PARAMS_CMD
);
2174 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2175 cmd
= (void *)tlv
->value
;
2177 /* nothing to set here */
2179 ptr
+= sizeof(*tlv
);
2180 ptr
+= sizeof(*cmd
);
2182 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_be
);
2183 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_bk
);
2184 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_vi
);
2185 ptr
= ath10k_wmi_tlv_put_wmm(ptr
, &arg
->ac_vo
);
2187 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pdev set wmm\n");
2191 static struct sk_buff
*
2192 ath10k_wmi_tlv_op_gen_request_stats(struct ath10k
*ar
, u32 stats_mask
)
2194 struct wmi_request_stats_cmd
*cmd
;
2195 struct wmi_tlv
*tlv
;
2196 struct sk_buff
*skb
;
2198 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
2200 return ERR_PTR(-ENOMEM
);
2202 tlv
= (void *)skb
->data
;
2203 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_REQUEST_STATS_CMD
);
2204 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2205 cmd
= (void *)tlv
->value
;
2206 cmd
->stats_id
= __cpu_to_le32(stats_mask
);
2208 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv request stats\n");
2212 static struct sk_buff
*
2213 ath10k_wmi_tlv_op_gen_force_fw_hang(struct ath10k
*ar
,
2214 enum wmi_force_fw_hang_type type
,
2217 struct wmi_force_fw_hang_cmd
*cmd
;
2218 struct wmi_tlv
*tlv
;
2219 struct sk_buff
*skb
;
2221 skb
= ath10k_wmi_alloc_skb(ar
, sizeof(*tlv
) + sizeof(*cmd
));
2223 return ERR_PTR(-ENOMEM
);
2225 tlv
= (void *)skb
->data
;
2226 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_FORCE_FW_HANG_CMD
);
2227 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2228 cmd
= (void *)tlv
->value
;
2229 cmd
->type
= __cpu_to_le32(type
);
2230 cmd
->delay_ms
= __cpu_to_le32(delay_ms
);
2232 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv force fw hang\n");
2236 static struct sk_buff
*
2237 ath10k_wmi_tlv_op_gen_dbglog_cfg(struct ath10k
*ar
, u32 module_enable
,
2239 struct wmi_tlv_dbglog_cmd
*cmd
;
2240 struct wmi_tlv
*tlv
;
2241 struct sk_buff
*skb
;
2242 size_t len
, bmap_len
;
2246 if (module_enable
) {
2247 value
= WMI_TLV_DBGLOG_LOG_LEVEL_VALUE(
2249 WMI_TLV_DBGLOG_LOG_LEVEL_VERBOSE
);
2251 value
= WMI_TLV_DBGLOG_LOG_LEVEL_VALUE(
2252 WMI_TLV_DBGLOG_ALL_MODULES
,
2253 WMI_TLV_DBGLOG_LOG_LEVEL_WARN
);
2257 len
= sizeof(*tlv
) + sizeof(*cmd
) + sizeof(*tlv
) + bmap_len
;
2258 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2260 return ERR_PTR(-ENOMEM
);
2262 ptr
= (void *)skb
->data
;
2265 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_DEBUG_LOG_CONFIG_CMD
);
2266 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2267 cmd
= (void *)tlv
->value
;
2268 cmd
->param
= __cpu_to_le32(WMI_TLV_DBGLOG_PARAM_LOG_LEVEL
);
2269 cmd
->value
= __cpu_to_le32(value
);
2271 ptr
+= sizeof(*tlv
);
2272 ptr
+= sizeof(*cmd
);
2275 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_UINT32
);
2276 tlv
->len
= __cpu_to_le16(bmap_len
);
2278 /* nothing to do here */
2280 ptr
+= sizeof(*tlv
);
2281 ptr
+= sizeof(bmap_len
);
2283 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv dbglog value 0x%08x\n", value
);
2287 static struct sk_buff
*
2288 ath10k_wmi_tlv_op_gen_pktlog_enable(struct ath10k
*ar
, u32 filter
)
2290 struct wmi_tlv_pktlog_enable
*cmd
;
2291 struct wmi_tlv
*tlv
;
2292 struct sk_buff
*skb
;
2296 len
= sizeof(*tlv
) + sizeof(*cmd
);
2297 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2299 return ERR_PTR(-ENOMEM
);
2301 ptr
= (void *)skb
->data
;
2303 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_PKTLOG_ENABLE_CMD
);
2304 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2305 cmd
= (void *)tlv
->value
;
2306 cmd
->filter
= __cpu_to_le32(filter
);
2308 ptr
+= sizeof(*tlv
);
2309 ptr
+= sizeof(*cmd
);
2311 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pktlog enable filter 0x%08x\n",
2316 static struct sk_buff
*
2317 ath10k_wmi_tlv_op_gen_pktlog_disable(struct ath10k
*ar
)
2319 struct wmi_tlv_pktlog_disable
*cmd
;
2320 struct wmi_tlv
*tlv
;
2321 struct sk_buff
*skb
;
2325 len
= sizeof(*tlv
) + sizeof(*cmd
);
2326 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2328 return ERR_PTR(-ENOMEM
);
2330 ptr
= (void *)skb
->data
;
2332 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_PKTLOG_DISABLE_CMD
);
2333 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2334 cmd
= (void *)tlv
->value
;
2336 ptr
+= sizeof(*tlv
);
2337 ptr
+= sizeof(*cmd
);
2339 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv pktlog disable\n");
2343 static struct sk_buff
*
2344 ath10k_wmi_tlv_op_gen_bcn_tmpl(struct ath10k
*ar
, u32 vdev_id
,
2345 u32 tim_ie_offset
, struct sk_buff
*bcn
,
2346 u32 prb_caps
, u32 prb_erp
, void *prb_ies
,
2349 struct wmi_tlv_bcn_tmpl_cmd
*cmd
;
2350 struct wmi_tlv_bcn_prb_info
*info
;
2351 struct wmi_tlv
*tlv
;
2352 struct sk_buff
*skb
;
2356 if (WARN_ON(prb_ies_len
> 0 && !prb_ies
))
2357 return ERR_PTR(-EINVAL
);
2359 len
= sizeof(*tlv
) + sizeof(*cmd
) +
2360 sizeof(*tlv
) + sizeof(*info
) + prb_ies_len
+
2361 sizeof(*tlv
) + roundup(bcn
->len
, 4);
2362 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2364 return ERR_PTR(-ENOMEM
);
2366 ptr
= (void *)skb
->data
;
2368 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_TMPL_CMD
);
2369 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2370 cmd
= (void *)tlv
->value
;
2371 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2372 cmd
->tim_ie_offset
= __cpu_to_le32(tim_ie_offset
);
2373 cmd
->buf_len
= __cpu_to_le32(bcn
->len
);
2375 ptr
+= sizeof(*tlv
);
2376 ptr
+= sizeof(*cmd
);
2378 /* FIXME: prb_ies_len should be probably aligned to 4byte boundary but
2379 * then it is then impossible to pass original ie len.
2380 * This chunk is not used yet so if setting probe resp template yields
2381 * problems with beaconing or crashes firmware look here.
2384 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_PRB_INFO
);
2385 tlv
->len
= __cpu_to_le16(sizeof(*info
) + prb_ies_len
);
2386 info
= (void *)tlv
->value
;
2387 info
->caps
= __cpu_to_le32(prb_caps
);
2388 info
->erp
= __cpu_to_le32(prb_erp
);
2389 memcpy(info
->ies
, prb_ies
, prb_ies_len
);
2391 ptr
+= sizeof(*tlv
);
2392 ptr
+= sizeof(*info
);
2396 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
2397 tlv
->len
= __cpu_to_le16(roundup(bcn
->len
, 4));
2398 memcpy(tlv
->value
, bcn
->data
, bcn
->len
);
2400 /* FIXME: Adjust TSF? */
2402 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv bcn tmpl vdev_id %i\n",
2407 static struct sk_buff
*
2408 ath10k_wmi_tlv_op_gen_prb_tmpl(struct ath10k
*ar
, u32 vdev_id
,
2409 struct sk_buff
*prb
)
2411 struct wmi_tlv_prb_tmpl_cmd
*cmd
;
2412 struct wmi_tlv_bcn_prb_info
*info
;
2413 struct wmi_tlv
*tlv
;
2414 struct sk_buff
*skb
;
2418 len
= sizeof(*tlv
) + sizeof(*cmd
) +
2419 sizeof(*tlv
) + sizeof(*info
) +
2420 sizeof(*tlv
) + roundup(prb
->len
, 4);
2421 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2423 return ERR_PTR(-ENOMEM
);
2425 ptr
= (void *)skb
->data
;
2427 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_PRB_TMPL_CMD
);
2428 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2429 cmd
= (void *)tlv
->value
;
2430 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2431 cmd
->buf_len
= __cpu_to_le32(prb
->len
);
2433 ptr
+= sizeof(*tlv
);
2434 ptr
+= sizeof(*cmd
);
2437 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_BCN_PRB_INFO
);
2438 tlv
->len
= __cpu_to_le16(sizeof(*info
));
2439 info
= (void *)tlv
->value
;
2443 ptr
+= sizeof(*tlv
);
2444 ptr
+= sizeof(*info
);
2447 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
2448 tlv
->len
= __cpu_to_le16(roundup(prb
->len
, 4));
2449 memcpy(tlv
->value
, prb
->data
, prb
->len
);
2451 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv prb tmpl vdev_id %i\n",
2456 static struct sk_buff
*
2457 ath10k_wmi_tlv_op_gen_p2p_go_bcn_ie(struct ath10k
*ar
, u32 vdev_id
,
2460 struct wmi_tlv_p2p_go_bcn_ie
*cmd
;
2461 struct wmi_tlv
*tlv
;
2462 struct sk_buff
*skb
;
2466 len
= sizeof(*tlv
) + sizeof(*cmd
) +
2467 sizeof(*tlv
) + roundup(p2p_ie
[1] + 2, 4);
2468 skb
= ath10k_wmi_alloc_skb(ar
, len
);
2470 return ERR_PTR(-ENOMEM
);
2472 ptr
= (void *)skb
->data
;
2474 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_STRUCT_P2P_GO_SET_BEACON_IE
);
2475 tlv
->len
= __cpu_to_le16(sizeof(*cmd
));
2476 cmd
= (void *)tlv
->value
;
2477 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
2478 cmd
->ie_len
= __cpu_to_le32(p2p_ie
[1] + 2);
2480 ptr
+= sizeof(*tlv
);
2481 ptr
+= sizeof(*cmd
);
2484 tlv
->tag
= __cpu_to_le16(WMI_TLV_TAG_ARRAY_BYTE
);
2485 tlv
->len
= __cpu_to_le16(roundup(p2p_ie
[1] + 2, 4));
2486 memcpy(tlv
->value
, p2p_ie
, p2p_ie
[1] + 2);
2488 ptr
+= sizeof(*tlv
);
2489 ptr
+= roundup(p2p_ie
[1] + 2, 4);
2491 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "wmi tlv p2p go bcn ie for vdev %i\n",
2500 static struct wmi_cmd_map wmi_tlv_cmd_map
= {
2501 .init_cmdid
= WMI_TLV_INIT_CMDID
,
2502 .start_scan_cmdid
= WMI_TLV_START_SCAN_CMDID
,
2503 .stop_scan_cmdid
= WMI_TLV_STOP_SCAN_CMDID
,
2504 .scan_chan_list_cmdid
= WMI_TLV_SCAN_CHAN_LIST_CMDID
,
2505 .scan_sch_prio_tbl_cmdid
= WMI_TLV_SCAN_SCH_PRIO_TBL_CMDID
,
2506 .pdev_set_regdomain_cmdid
= WMI_TLV_PDEV_SET_REGDOMAIN_CMDID
,
2507 .pdev_set_channel_cmdid
= WMI_TLV_PDEV_SET_CHANNEL_CMDID
,
2508 .pdev_set_param_cmdid
= WMI_TLV_PDEV_SET_PARAM_CMDID
,
2509 .pdev_pktlog_enable_cmdid
= WMI_TLV_PDEV_PKTLOG_ENABLE_CMDID
,
2510 .pdev_pktlog_disable_cmdid
= WMI_TLV_PDEV_PKTLOG_DISABLE_CMDID
,
2511 .pdev_set_wmm_params_cmdid
= WMI_TLV_PDEV_SET_WMM_PARAMS_CMDID
,
2512 .pdev_set_ht_cap_ie_cmdid
= WMI_TLV_PDEV_SET_HT_CAP_IE_CMDID
,
2513 .pdev_set_vht_cap_ie_cmdid
= WMI_TLV_PDEV_SET_VHT_CAP_IE_CMDID
,
2514 .pdev_set_dscp_tid_map_cmdid
= WMI_TLV_PDEV_SET_DSCP_TID_MAP_CMDID
,
2515 .pdev_set_quiet_mode_cmdid
= WMI_TLV_PDEV_SET_QUIET_MODE_CMDID
,
2516 .pdev_green_ap_ps_enable_cmdid
= WMI_TLV_PDEV_GREEN_AP_PS_ENABLE_CMDID
,
2517 .pdev_get_tpc_config_cmdid
= WMI_TLV_PDEV_GET_TPC_CONFIG_CMDID
,
2518 .pdev_set_base_macaddr_cmdid
= WMI_TLV_PDEV_SET_BASE_MACADDR_CMDID
,
2519 .vdev_create_cmdid
= WMI_TLV_VDEV_CREATE_CMDID
,
2520 .vdev_delete_cmdid
= WMI_TLV_VDEV_DELETE_CMDID
,
2521 .vdev_start_request_cmdid
= WMI_TLV_VDEV_START_REQUEST_CMDID
,
2522 .vdev_restart_request_cmdid
= WMI_TLV_VDEV_RESTART_REQUEST_CMDID
,
2523 .vdev_up_cmdid
= WMI_TLV_VDEV_UP_CMDID
,
2524 .vdev_stop_cmdid
= WMI_TLV_VDEV_STOP_CMDID
,
2525 .vdev_down_cmdid
= WMI_TLV_VDEV_DOWN_CMDID
,
2526 .vdev_set_param_cmdid
= WMI_TLV_VDEV_SET_PARAM_CMDID
,
2527 .vdev_install_key_cmdid
= WMI_TLV_VDEV_INSTALL_KEY_CMDID
,
2528 .peer_create_cmdid
= WMI_TLV_PEER_CREATE_CMDID
,
2529 .peer_delete_cmdid
= WMI_TLV_PEER_DELETE_CMDID
,
2530 .peer_flush_tids_cmdid
= WMI_TLV_PEER_FLUSH_TIDS_CMDID
,
2531 .peer_set_param_cmdid
= WMI_TLV_PEER_SET_PARAM_CMDID
,
2532 .peer_assoc_cmdid
= WMI_TLV_PEER_ASSOC_CMDID
,
2533 .peer_add_wds_entry_cmdid
= WMI_TLV_PEER_ADD_WDS_ENTRY_CMDID
,
2534 .peer_remove_wds_entry_cmdid
= WMI_TLV_PEER_REMOVE_WDS_ENTRY_CMDID
,
2535 .peer_mcast_group_cmdid
= WMI_TLV_PEER_MCAST_GROUP_CMDID
,
2536 .bcn_tx_cmdid
= WMI_TLV_BCN_TX_CMDID
,
2537 .pdev_send_bcn_cmdid
= WMI_TLV_PDEV_SEND_BCN_CMDID
,
2538 .bcn_tmpl_cmdid
= WMI_TLV_BCN_TMPL_CMDID
,
2539 .bcn_filter_rx_cmdid
= WMI_TLV_BCN_FILTER_RX_CMDID
,
2540 .prb_req_filter_rx_cmdid
= WMI_TLV_PRB_REQ_FILTER_RX_CMDID
,
2541 .mgmt_tx_cmdid
= WMI_TLV_MGMT_TX_CMDID
,
2542 .prb_tmpl_cmdid
= WMI_TLV_PRB_TMPL_CMDID
,
2543 .addba_clear_resp_cmdid
= WMI_TLV_ADDBA_CLEAR_RESP_CMDID
,
2544 .addba_send_cmdid
= WMI_TLV_ADDBA_SEND_CMDID
,
2545 .addba_status_cmdid
= WMI_TLV_ADDBA_STATUS_CMDID
,
2546 .delba_send_cmdid
= WMI_TLV_DELBA_SEND_CMDID
,
2547 .addba_set_resp_cmdid
= WMI_TLV_ADDBA_SET_RESP_CMDID
,
2548 .send_singleamsdu_cmdid
= WMI_TLV_SEND_SINGLEAMSDU_CMDID
,
2549 .sta_powersave_mode_cmdid
= WMI_TLV_STA_POWERSAVE_MODE_CMDID
,
2550 .sta_powersave_param_cmdid
= WMI_TLV_STA_POWERSAVE_PARAM_CMDID
,
2551 .sta_mimo_ps_mode_cmdid
= WMI_TLV_STA_MIMO_PS_MODE_CMDID
,
2552 .pdev_dfs_enable_cmdid
= WMI_TLV_PDEV_DFS_ENABLE_CMDID
,
2553 .pdev_dfs_disable_cmdid
= WMI_TLV_PDEV_DFS_DISABLE_CMDID
,
2554 .roam_scan_mode
= WMI_TLV_ROAM_SCAN_MODE
,
2555 .roam_scan_rssi_threshold
= WMI_TLV_ROAM_SCAN_RSSI_THRESHOLD
,
2556 .roam_scan_period
= WMI_TLV_ROAM_SCAN_PERIOD
,
2557 .roam_scan_rssi_change_threshold
=
2558 WMI_TLV_ROAM_SCAN_RSSI_CHANGE_THRESHOLD
,
2559 .roam_ap_profile
= WMI_TLV_ROAM_AP_PROFILE
,
2560 .ofl_scan_add_ap_profile
= WMI_TLV_ROAM_AP_PROFILE
,
2561 .ofl_scan_remove_ap_profile
= WMI_TLV_OFL_SCAN_REMOVE_AP_PROFILE
,
2562 .ofl_scan_period
= WMI_TLV_OFL_SCAN_PERIOD
,
2563 .p2p_dev_set_device_info
= WMI_TLV_P2P_DEV_SET_DEVICE_INFO
,
2564 .p2p_dev_set_discoverability
= WMI_TLV_P2P_DEV_SET_DISCOVERABILITY
,
2565 .p2p_go_set_beacon_ie
= WMI_TLV_P2P_GO_SET_BEACON_IE
,
2566 .p2p_go_set_probe_resp_ie
= WMI_TLV_P2P_GO_SET_PROBE_RESP_IE
,
2567 .p2p_set_vendor_ie_data_cmdid
= WMI_TLV_P2P_SET_VENDOR_IE_DATA_CMDID
,
2568 .ap_ps_peer_param_cmdid
= WMI_TLV_AP_PS_PEER_PARAM_CMDID
,
2569 .ap_ps_peer_uapsd_coex_cmdid
= WMI_TLV_AP_PS_PEER_UAPSD_COEX_CMDID
,
2570 .peer_rate_retry_sched_cmdid
= WMI_TLV_PEER_RATE_RETRY_SCHED_CMDID
,
2571 .wlan_profile_trigger_cmdid
= WMI_TLV_WLAN_PROFILE_TRIGGER_CMDID
,
2572 .wlan_profile_set_hist_intvl_cmdid
=
2573 WMI_TLV_WLAN_PROFILE_SET_HIST_INTVL_CMDID
,
2574 .wlan_profile_get_profile_data_cmdid
=
2575 WMI_TLV_WLAN_PROFILE_GET_PROFILE_DATA_CMDID
,
2576 .wlan_profile_enable_profile_id_cmdid
=
2577 WMI_TLV_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID
,
2578 .wlan_profile_list_profile_id_cmdid
=
2579 WMI_TLV_WLAN_PROFILE_LIST_PROFILE_ID_CMDID
,
2580 .pdev_suspend_cmdid
= WMI_TLV_PDEV_SUSPEND_CMDID
,
2581 .pdev_resume_cmdid
= WMI_TLV_PDEV_RESUME_CMDID
,
2582 .add_bcn_filter_cmdid
= WMI_TLV_ADD_BCN_FILTER_CMDID
,
2583 .rmv_bcn_filter_cmdid
= WMI_TLV_RMV_BCN_FILTER_CMDID
,
2584 .wow_add_wake_pattern_cmdid
= WMI_TLV_WOW_ADD_WAKE_PATTERN_CMDID
,
2585 .wow_del_wake_pattern_cmdid
= WMI_TLV_WOW_DEL_WAKE_PATTERN_CMDID
,
2586 .wow_enable_disable_wake_event_cmdid
=
2587 WMI_TLV_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID
,
2588 .wow_enable_cmdid
= WMI_TLV_WOW_ENABLE_CMDID
,
2589 .wow_hostwakeup_from_sleep_cmdid
=
2590 WMI_TLV_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID
,
2591 .rtt_measreq_cmdid
= WMI_TLV_RTT_MEASREQ_CMDID
,
2592 .rtt_tsf_cmdid
= WMI_TLV_RTT_TSF_CMDID
,
2593 .vdev_spectral_scan_configure_cmdid
= WMI_TLV_SPECTRAL_SCAN_CONF_CMDID
,
2594 .vdev_spectral_scan_enable_cmdid
= WMI_TLV_SPECTRAL_SCAN_ENABLE_CMDID
,
2595 .request_stats_cmdid
= WMI_TLV_REQUEST_STATS_CMDID
,
2596 .set_arp_ns_offload_cmdid
= WMI_TLV_SET_ARP_NS_OFFLOAD_CMDID
,
2597 .network_list_offload_config_cmdid
=
2598 WMI_TLV_NETWORK_LIST_OFFLOAD_CONFIG_CMDID
,
2599 .gtk_offload_cmdid
= WMI_TLV_GTK_OFFLOAD_CMDID
,
2600 .csa_offload_enable_cmdid
= WMI_TLV_CSA_OFFLOAD_ENABLE_CMDID
,
2601 .csa_offload_chanswitch_cmdid
= WMI_TLV_CSA_OFFLOAD_CHANSWITCH_CMDID
,
2602 .chatter_set_mode_cmdid
= WMI_TLV_CHATTER_SET_MODE_CMDID
,
2603 .peer_tid_addba_cmdid
= WMI_TLV_PEER_TID_ADDBA_CMDID
,
2604 .peer_tid_delba_cmdid
= WMI_TLV_PEER_TID_DELBA_CMDID
,
2605 .sta_dtim_ps_method_cmdid
= WMI_TLV_STA_DTIM_PS_METHOD_CMDID
,
2606 .sta_uapsd_auto_trig_cmdid
= WMI_TLV_STA_UAPSD_AUTO_TRIG_CMDID
,
2607 .sta_keepalive_cmd
= WMI_TLV_STA_KEEPALIVE_CMDID
,
2608 .echo_cmdid
= WMI_TLV_ECHO_CMDID
,
2609 .pdev_utf_cmdid
= WMI_TLV_PDEV_UTF_CMDID
,
2610 .dbglog_cfg_cmdid
= WMI_TLV_DBGLOG_CFG_CMDID
,
2611 .pdev_qvit_cmdid
= WMI_TLV_PDEV_QVIT_CMDID
,
2612 .pdev_ftm_intg_cmdid
= WMI_TLV_PDEV_FTM_INTG_CMDID
,
2613 .vdev_set_keepalive_cmdid
= WMI_TLV_VDEV_SET_KEEPALIVE_CMDID
,
2614 .vdev_get_keepalive_cmdid
= WMI_TLV_VDEV_GET_KEEPALIVE_CMDID
,
2615 .force_fw_hang_cmdid
= WMI_TLV_FORCE_FW_HANG_CMDID
,
2616 .gpio_config_cmdid
= WMI_TLV_GPIO_CONFIG_CMDID
,
2617 .gpio_output_cmdid
= WMI_TLV_GPIO_OUTPUT_CMDID
,
2618 .pdev_get_temperature_cmdid
= WMI_TLV_CMD_UNSUPPORTED
,
2619 .vdev_set_wmm_params_cmdid
= WMI_TLV_VDEV_SET_WMM_PARAMS_CMDID
,
2622 static struct wmi_pdev_param_map wmi_tlv_pdev_param_map
= {
2623 .tx_chain_mask
= WMI_TLV_PDEV_PARAM_TX_CHAIN_MASK
,
2624 .rx_chain_mask
= WMI_TLV_PDEV_PARAM_RX_CHAIN_MASK
,
2625 .txpower_limit2g
= WMI_TLV_PDEV_PARAM_TXPOWER_LIMIT2G
,
2626 .txpower_limit5g
= WMI_TLV_PDEV_PARAM_TXPOWER_LIMIT5G
,
2627 .txpower_scale
= WMI_TLV_PDEV_PARAM_TXPOWER_SCALE
,
2628 .beacon_gen_mode
= WMI_TLV_PDEV_PARAM_BEACON_GEN_MODE
,
2629 .beacon_tx_mode
= WMI_TLV_PDEV_PARAM_BEACON_TX_MODE
,
2630 .resmgr_offchan_mode
= WMI_TLV_PDEV_PARAM_RESMGR_OFFCHAN_MODE
,
2631 .protection_mode
= WMI_TLV_PDEV_PARAM_PROTECTION_MODE
,
2632 .dynamic_bw
= WMI_TLV_PDEV_PARAM_DYNAMIC_BW
,
2633 .non_agg_sw_retry_th
= WMI_TLV_PDEV_PARAM_NON_AGG_SW_RETRY_TH
,
2634 .agg_sw_retry_th
= WMI_TLV_PDEV_PARAM_AGG_SW_RETRY_TH
,
2635 .sta_kickout_th
= WMI_TLV_PDEV_PARAM_STA_KICKOUT_TH
,
2636 .ac_aggrsize_scaling
= WMI_TLV_PDEV_PARAM_AC_AGGRSIZE_SCALING
,
2637 .ltr_enable
= WMI_TLV_PDEV_PARAM_LTR_ENABLE
,
2638 .ltr_ac_latency_be
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_BE
,
2639 .ltr_ac_latency_bk
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_BK
,
2640 .ltr_ac_latency_vi
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_VI
,
2641 .ltr_ac_latency_vo
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_VO
,
2642 .ltr_ac_latency_timeout
= WMI_TLV_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT
,
2643 .ltr_sleep_override
= WMI_TLV_PDEV_PARAM_LTR_SLEEP_OVERRIDE
,
2644 .ltr_rx_override
= WMI_TLV_PDEV_PARAM_LTR_RX_OVERRIDE
,
2645 .ltr_tx_activity_timeout
= WMI_TLV_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT
,
2646 .l1ss_enable
= WMI_TLV_PDEV_PARAM_L1SS_ENABLE
,
2647 .dsleep_enable
= WMI_TLV_PDEV_PARAM_DSLEEP_ENABLE
,
2648 .pcielp_txbuf_flush
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_FLUSH
,
2649 .pcielp_txbuf_watermark
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_TMO_EN
,
2650 .pcielp_txbuf_tmo_en
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_TMO_EN
,
2651 .pcielp_txbuf_tmo_value
= WMI_TLV_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE
,
2652 .pdev_stats_update_period
= WMI_TLV_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD
,
2653 .vdev_stats_update_period
= WMI_TLV_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD
,
2654 .peer_stats_update_period
= WMI_TLV_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD
,
2655 .bcnflt_stats_update_period
=
2656 WMI_TLV_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD
,
2657 .pmf_qos
= WMI_TLV_PDEV_PARAM_PMF_QOS
,
2658 .arp_ac_override
= WMI_TLV_PDEV_PARAM_ARP_AC_OVERRIDE
,
2659 .dcs
= WMI_TLV_PDEV_PARAM_DCS
,
2660 .ani_enable
= WMI_TLV_PDEV_PARAM_ANI_ENABLE
,
2661 .ani_poll_period
= WMI_TLV_PDEV_PARAM_ANI_POLL_PERIOD
,
2662 .ani_listen_period
= WMI_TLV_PDEV_PARAM_ANI_LISTEN_PERIOD
,
2663 .ani_ofdm_level
= WMI_TLV_PDEV_PARAM_ANI_OFDM_LEVEL
,
2664 .ani_cck_level
= WMI_TLV_PDEV_PARAM_ANI_CCK_LEVEL
,
2665 .dyntxchain
= WMI_TLV_PDEV_PARAM_DYNTXCHAIN
,
2666 .proxy_sta
= WMI_TLV_PDEV_PARAM_PROXY_STA
,
2667 .idle_ps_config
= WMI_TLV_PDEV_PARAM_IDLE_PS_CONFIG
,
2668 .power_gating_sleep
= WMI_TLV_PDEV_PARAM_POWER_GATING_SLEEP
,
2669 .fast_channel_reset
= WMI_TLV_PDEV_PARAM_UNSUPPORTED
,
2670 .burst_dur
= WMI_TLV_PDEV_PARAM_BURST_DUR
,
2671 .burst_enable
= WMI_TLV_PDEV_PARAM_BURST_ENABLE
,
2672 .cal_period
= WMI_PDEV_PARAM_UNSUPPORTED
,
2675 static struct wmi_vdev_param_map wmi_tlv_vdev_param_map
= {
2676 .rts_threshold
= WMI_TLV_VDEV_PARAM_RTS_THRESHOLD
,
2677 .fragmentation_threshold
= WMI_TLV_VDEV_PARAM_FRAGMENTATION_THRESHOLD
,
2678 .beacon_interval
= WMI_TLV_VDEV_PARAM_BEACON_INTERVAL
,
2679 .listen_interval
= WMI_TLV_VDEV_PARAM_LISTEN_INTERVAL
,
2680 .multicast_rate
= WMI_TLV_VDEV_PARAM_MULTICAST_RATE
,
2681 .mgmt_tx_rate
= WMI_TLV_VDEV_PARAM_MGMT_TX_RATE
,
2682 .slot_time
= WMI_TLV_VDEV_PARAM_SLOT_TIME
,
2683 .preamble
= WMI_TLV_VDEV_PARAM_PREAMBLE
,
2684 .swba_time
= WMI_TLV_VDEV_PARAM_SWBA_TIME
,
2685 .wmi_vdev_stats_update_period
= WMI_TLV_VDEV_STATS_UPDATE_PERIOD
,
2686 .wmi_vdev_pwrsave_ageout_time
= WMI_TLV_VDEV_PWRSAVE_AGEOUT_TIME
,
2687 .wmi_vdev_host_swba_interval
= WMI_TLV_VDEV_HOST_SWBA_INTERVAL
,
2688 .dtim_period
= WMI_TLV_VDEV_PARAM_DTIM_PERIOD
,
2689 .wmi_vdev_oc_scheduler_air_time_limit
=
2690 WMI_TLV_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT
,
2691 .wds
= WMI_TLV_VDEV_PARAM_WDS
,
2692 .atim_window
= WMI_TLV_VDEV_PARAM_ATIM_WINDOW
,
2693 .bmiss_count_max
= WMI_TLV_VDEV_PARAM_BMISS_COUNT_MAX
,
2694 .bmiss_first_bcnt
= WMI_TLV_VDEV_PARAM_BMISS_FIRST_BCNT
,
2695 .bmiss_final_bcnt
= WMI_TLV_VDEV_PARAM_BMISS_FINAL_BCNT
,
2696 .feature_wmm
= WMI_TLV_VDEV_PARAM_FEATURE_WMM
,
2697 .chwidth
= WMI_TLV_VDEV_PARAM_CHWIDTH
,
2698 .chextoffset
= WMI_TLV_VDEV_PARAM_CHEXTOFFSET
,
2699 .disable_htprotection
= WMI_TLV_VDEV_PARAM_DISABLE_HTPROTECTION
,
2700 .sta_quickkickout
= WMI_TLV_VDEV_PARAM_STA_QUICKKICKOUT
,
2701 .mgmt_rate
= WMI_TLV_VDEV_PARAM_MGMT_RATE
,
2702 .protection_mode
= WMI_TLV_VDEV_PARAM_PROTECTION_MODE
,
2703 .fixed_rate
= WMI_TLV_VDEV_PARAM_FIXED_RATE
,
2704 .sgi
= WMI_TLV_VDEV_PARAM_SGI
,
2705 .ldpc
= WMI_TLV_VDEV_PARAM_LDPC
,
2706 .tx_stbc
= WMI_TLV_VDEV_PARAM_TX_STBC
,
2707 .rx_stbc
= WMI_TLV_VDEV_PARAM_RX_STBC
,
2708 .intra_bss_fwd
= WMI_TLV_VDEV_PARAM_INTRA_BSS_FWD
,
2709 .def_keyid
= WMI_TLV_VDEV_PARAM_DEF_KEYID
,
2710 .nss
= WMI_TLV_VDEV_PARAM_NSS
,
2711 .bcast_data_rate
= WMI_TLV_VDEV_PARAM_BCAST_DATA_RATE
,
2712 .mcast_data_rate
= WMI_TLV_VDEV_PARAM_MCAST_DATA_RATE
,
2713 .mcast_indicate
= WMI_TLV_VDEV_PARAM_MCAST_INDICATE
,
2714 .dhcp_indicate
= WMI_TLV_VDEV_PARAM_DHCP_INDICATE
,
2715 .unknown_dest_indicate
= WMI_TLV_VDEV_PARAM_UNKNOWN_DEST_INDICATE
,
2716 .ap_keepalive_min_idle_inactive_time_secs
=
2717 WMI_TLV_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS
,
2718 .ap_keepalive_max_idle_inactive_time_secs
=
2719 WMI_TLV_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS
,
2720 .ap_keepalive_max_unresponsive_time_secs
=
2721 WMI_TLV_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS
,
2722 .ap_enable_nawds
= WMI_TLV_VDEV_PARAM_AP_ENABLE_NAWDS
,
2723 .mcast2ucast_set
= WMI_TLV_VDEV_PARAM_UNSUPPORTED
,
2724 .enable_rtscts
= WMI_TLV_VDEV_PARAM_ENABLE_RTSCTS
,
2725 .txbf
= WMI_TLV_VDEV_PARAM_TXBF
,
2726 .packet_powersave
= WMI_TLV_VDEV_PARAM_PACKET_POWERSAVE
,
2727 .drop_unencry
= WMI_TLV_VDEV_PARAM_DROP_UNENCRY
,
2728 .tx_encap_type
= WMI_TLV_VDEV_PARAM_TX_ENCAP_TYPE
,
2729 .ap_detect_out_of_sync_sleeping_sta_time_secs
=
2730 WMI_TLV_VDEV_PARAM_UNSUPPORTED
,
2733 static const struct wmi_ops wmi_tlv_ops
= {
2734 .rx
= ath10k_wmi_tlv_op_rx
,
2735 .map_svc
= wmi_tlv_svc_map
,
2737 .pull_scan
= ath10k_wmi_tlv_op_pull_scan_ev
,
2738 .pull_mgmt_rx
= ath10k_wmi_tlv_op_pull_mgmt_rx_ev
,
2739 .pull_ch_info
= ath10k_wmi_tlv_op_pull_ch_info_ev
,
2740 .pull_vdev_start
= ath10k_wmi_tlv_op_pull_vdev_start_ev
,
2741 .pull_peer_kick
= ath10k_wmi_tlv_op_pull_peer_kick_ev
,
2742 .pull_swba
= ath10k_wmi_tlv_op_pull_swba_ev
,
2743 .pull_phyerr
= ath10k_wmi_tlv_op_pull_phyerr_ev
,
2744 .pull_svc_rdy
= ath10k_wmi_tlv_op_pull_svc_rdy_ev
,
2745 .pull_rdy
= ath10k_wmi_tlv_op_pull_rdy_ev
,
2746 .pull_fw_stats
= ath10k_wmi_tlv_op_pull_fw_stats
,
2748 .gen_pdev_suspend
= ath10k_wmi_tlv_op_gen_pdev_suspend
,
2749 .gen_pdev_resume
= ath10k_wmi_tlv_op_gen_pdev_resume
,
2750 .gen_pdev_set_rd
= ath10k_wmi_tlv_op_gen_pdev_set_rd
,
2751 .gen_pdev_set_param
= ath10k_wmi_tlv_op_gen_pdev_set_param
,
2752 .gen_init
= ath10k_wmi_tlv_op_gen_init
,
2753 .gen_start_scan
= ath10k_wmi_tlv_op_gen_start_scan
,
2754 .gen_stop_scan
= ath10k_wmi_tlv_op_gen_stop_scan
,
2755 .gen_vdev_create
= ath10k_wmi_tlv_op_gen_vdev_create
,
2756 .gen_vdev_delete
= ath10k_wmi_tlv_op_gen_vdev_delete
,
2757 .gen_vdev_start
= ath10k_wmi_tlv_op_gen_vdev_start
,
2758 .gen_vdev_stop
= ath10k_wmi_tlv_op_gen_vdev_stop
,
2759 .gen_vdev_up
= ath10k_wmi_tlv_op_gen_vdev_up
,
2760 .gen_vdev_down
= ath10k_wmi_tlv_op_gen_vdev_down
,
2761 .gen_vdev_set_param
= ath10k_wmi_tlv_op_gen_vdev_set_param
,
2762 .gen_vdev_install_key
= ath10k_wmi_tlv_op_gen_vdev_install_key
,
2763 .gen_vdev_wmm_conf
= ath10k_wmi_tlv_op_gen_vdev_wmm_conf
,
2764 .gen_peer_create
= ath10k_wmi_tlv_op_gen_peer_create
,
2765 .gen_peer_delete
= ath10k_wmi_tlv_op_gen_peer_delete
,
2766 .gen_peer_flush
= ath10k_wmi_tlv_op_gen_peer_flush
,
2767 .gen_peer_set_param
= ath10k_wmi_tlv_op_gen_peer_set_param
,
2768 .gen_peer_assoc
= ath10k_wmi_tlv_op_gen_peer_assoc
,
2769 .gen_set_psmode
= ath10k_wmi_tlv_op_gen_set_psmode
,
2770 .gen_set_sta_ps
= ath10k_wmi_tlv_op_gen_set_sta_ps
,
2771 .gen_set_ap_ps
= ath10k_wmi_tlv_op_gen_set_ap_ps
,
2772 .gen_scan_chan_list
= ath10k_wmi_tlv_op_gen_scan_chan_list
,
2773 .gen_beacon_dma
= ath10k_wmi_tlv_op_gen_beacon_dma
,
2774 .gen_pdev_set_wmm
= ath10k_wmi_tlv_op_gen_pdev_set_wmm
,
2775 .gen_request_stats
= ath10k_wmi_tlv_op_gen_request_stats
,
2776 .gen_force_fw_hang
= ath10k_wmi_tlv_op_gen_force_fw_hang
,
2777 /* .gen_mgmt_tx = not implemented; HTT is used */
2778 .gen_dbglog_cfg
= ath10k_wmi_tlv_op_gen_dbglog_cfg
,
2779 .gen_pktlog_enable
= ath10k_wmi_tlv_op_gen_pktlog_enable
,
2780 .gen_pktlog_disable
= ath10k_wmi_tlv_op_gen_pktlog_disable
,
2781 /* .gen_pdev_set_quiet_mode not implemented */
2782 /* .gen_pdev_get_temperature not implemented */
2783 /* .gen_addba_clear_resp not implemented */
2784 /* .gen_addba_send not implemented */
2785 /* .gen_addba_set_resp not implemented */
2786 /* .gen_delba_send not implemented */
2787 .gen_bcn_tmpl
= ath10k_wmi_tlv_op_gen_bcn_tmpl
,
2788 .gen_prb_tmpl
= ath10k_wmi_tlv_op_gen_prb_tmpl
,
2789 .gen_p2p_go_bcn_ie
= ath10k_wmi_tlv_op_gen_p2p_go_bcn_ie
,
2790 .gen_vdev_sta_uapsd
= ath10k_wmi_tlv_op_gen_vdev_sta_uapsd
,
2791 .gen_sta_keepalive
= ath10k_wmi_tlv_op_gen_sta_keepalive
,
2798 void ath10k_wmi_tlv_attach(struct ath10k
*ar
)
2800 ar
->wmi
.cmd
= &wmi_tlv_cmd_map
;
2801 ar
->wmi
.vdev_param
= &wmi_tlv_vdev_param_map
;
2802 ar
->wmi
.pdev_param
= &wmi_tlv_pdev_param_map
;
2803 ar
->wmi
.ops
= &wmi_tlv_ops
;