1/*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2014 Qualcomm Atheros, Inc.
4 *
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.
8 *
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.
16 */
17
18#ifndef _WMI_OPS_H_
19#define _WMI_OPS_H_
20
21struct ath10k;
22struct sk_buff;
23
24struct wmi_ops {
25	void (*rx)(struct ath10k *ar, struct sk_buff *skb);
26	void (*map_svc)(const __le32 *in, unsigned long *out, size_t len);
27
28	int (*pull_scan)(struct ath10k *ar, struct sk_buff *skb,
29			 struct wmi_scan_ev_arg *arg);
30	int (*pull_mgmt_rx)(struct ath10k *ar, struct sk_buff *skb,
31			    struct wmi_mgmt_rx_ev_arg *arg);
32	int (*pull_ch_info)(struct ath10k *ar, struct sk_buff *skb,
33			    struct wmi_ch_info_ev_arg *arg);
34	int (*pull_vdev_start)(struct ath10k *ar, struct sk_buff *skb,
35			       struct wmi_vdev_start_ev_arg *arg);
36	int (*pull_peer_kick)(struct ath10k *ar, struct sk_buff *skb,
37			      struct wmi_peer_kick_ev_arg *arg);
38	int (*pull_swba)(struct ath10k *ar, struct sk_buff *skb,
39			 struct wmi_swba_ev_arg *arg);
40	int (*pull_phyerr_hdr)(struct ath10k *ar, struct sk_buff *skb,
41			       struct wmi_phyerr_hdr_arg *arg);
42	int (*pull_phyerr)(struct ath10k *ar, const void *phyerr_buf,
43			   int left_len, struct wmi_phyerr_ev_arg *arg);
44	int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb,
45			    struct wmi_svc_rdy_ev_arg *arg);
46	int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb,
47			struct wmi_rdy_ev_arg *arg);
48	int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb,
49			     struct ath10k_fw_stats *stats);
50	int (*pull_roam_ev)(struct ath10k *ar, struct sk_buff *skb,
51			    struct wmi_roam_ev_arg *arg);
52	int (*pull_wow_event)(struct ath10k *ar, struct sk_buff *skb,
53			      struct wmi_wow_ev_arg *arg);
54	enum wmi_txbf_conf (*get_txbf_conf_scheme)(struct ath10k *ar);
55
56	struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);
57	struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);
58	struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,
59					   u16 rd5g, u16 ctl2g, u16 ctl5g,
60					   enum wmi_dfs_region dfs_reg);
61	struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id,
62					      u32 value);
63	struct sk_buff *(*gen_init)(struct ath10k *ar);
64	struct sk_buff *(*gen_start_scan)(struct ath10k *ar,
65					  const struct wmi_start_scan_arg *arg);
66	struct sk_buff *(*gen_stop_scan)(struct ath10k *ar,
67					 const struct wmi_stop_scan_arg *arg);
68	struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id,
69					   enum wmi_vdev_type type,
70					   enum wmi_vdev_subtype subtype,
71					   const u8 macaddr[ETH_ALEN]);
72	struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id);
73	struct sk_buff *(*gen_vdev_start)(struct ath10k *ar,
74					  const struct wmi_vdev_start_request_arg *arg,
75					  bool restart);
76	struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id);
77	struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid,
78				       const u8 *bssid);
79	struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id);
80	struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id,
81					      u32 param_id, u32 param_value);
82	struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar,
83						const struct wmi_vdev_install_key_arg *arg);
84	struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar,
85						  const struct wmi_vdev_spectral_conf_arg *arg);
86	struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id,
87						    u32 trigger, u32 enable);
88	struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id,
89					     const struct wmi_wmm_params_all_arg *arg);
90	struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id,
91					   const u8 peer_addr[ETH_ALEN],
92					   enum wmi_peer_type peer_type);
93	struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id,
94					   const u8 peer_addr[ETH_ALEN]);
95	struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id,
96					  const u8 peer_addr[ETH_ALEN],
97					  u32 tid_bitmap);
98	struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id,
99					      const u8 *peer_addr,
100					      enum wmi_peer_param param_id,
101					      u32 param_value);
102	struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar,
103					  const struct wmi_peer_assoc_complete_arg *arg);
104	struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id,
105					  enum wmi_sta_ps_mode psmode);
106	struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id,
107					  enum wmi_sta_powersave_param param_id,
108					  u32 value);
109	struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id,
110					 const u8 *mac,
111					 enum wmi_ap_ps_peer_param param_id,
112					 u32 value);
113	struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar,
114					      const struct wmi_scan_chan_list_arg *arg);
115	struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id,
116					  const void *bcn, size_t bcn_len,
117					  u32 bcn_paddr, bool dtim_zero,
118					  bool deliver_cab);
119	struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
120					    const struct wmi_wmm_params_all_arg *arg);
121	struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask);
122	struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
123					     enum wmi_force_fw_hang_type type,
124					     u32 delay_ms);
125	struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);
126	struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable,
127					  u32 log_level);
128	struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);
129	struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);
130	struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,
131						   u32 period, u32 duration,
132						   u32 next_offset,
133						   u32 enabled);
134	struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar);
135	struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id,
136						const u8 *mac);
137	struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id,
138					  const u8 *mac, u32 tid, u32 buf_size);
139	struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id,
140					      const u8 *mac, u32 tid,
141					      u32 status);
142	struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id,
143					  const u8 *mac, u32 tid, u32 initiator,
144					  u32 reason);
145	struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id,
146					u32 tim_ie_offset, struct sk_buff *bcn,
147					u32 prb_caps, u32 prb_erp,
148					void *prb_ies, size_t prb_ies_len);
149	struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id,
150					struct sk_buff *bcn);
151	struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id,
152					     const u8 *p2p_ie);
153	struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id,
154					      const u8 peer_addr[ETH_ALEN],
155					      const struct wmi_sta_uapsd_auto_trig_arg *args,
156					      u32 num_ac);
157	struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar,
158					     const struct wmi_sta_keepalive_arg *arg);
159	struct sk_buff *(*gen_wow_enable)(struct ath10k *ar);
160	struct sk_buff *(*gen_wow_add_wakeup_event)(struct ath10k *ar, u32 vdev_id,
161						    enum wmi_wow_wakeup_event event,
162						    u32 enable);
163	struct sk_buff *(*gen_wow_host_wakeup_ind)(struct ath10k *ar);
164	struct sk_buff *(*gen_wow_add_pattern)(struct ath10k *ar, u32 vdev_id,
165					       u32 pattern_id,
166					       const u8 *pattern,
167					       const u8 *mask,
168					       int pattern_len,
169					       int pattern_offset);
170	struct sk_buff *(*gen_wow_del_pattern)(struct ath10k *ar, u32 vdev_id,
171					       u32 pattern_id);
172	struct sk_buff *(*gen_update_fw_tdls_state)(struct ath10k *ar,
173						    u32 vdev_id,
174						    enum wmi_tdls_state state);
175	struct sk_buff *(*gen_tdls_peer_update)(struct ath10k *ar,
176						const struct wmi_tdls_peer_update_cmd_arg *arg,
177						const struct wmi_tdls_peer_capab_arg *cap,
178						const struct wmi_channel_arg *chan);
179	struct sk_buff *(*gen_adaptive_qcs)(struct ath10k *ar, bool enable);
180	struct sk_buff *(*gen_pdev_get_tpc_config)(struct ath10k *ar,
181						   u32 param);
182	void (*fw_stats_fill)(struct ath10k *ar,
183			      struct ath10k_fw_stats *fw_stats,
184			      char *buf);
185	struct sk_buff *(*gen_pdev_enable_adaptive_cca)(struct ath10k *ar,
186							u8 enable,
187							u32 detect_level,
188							u32 detect_margin);
189};
190
191int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
192
193static inline int
194ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb)
195{
196	if (WARN_ON_ONCE(!ar->wmi.ops->rx))
197		return -EOPNOTSUPP;
198
199	ar->wmi.ops->rx(ar, skb);
200	return 0;
201}
202
203static inline int
204ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out,
205		   size_t len)
206{
207	if (!ar->wmi.ops->map_svc)
208		return -EOPNOTSUPP;
209
210	ar->wmi.ops->map_svc(in, out, len);
211	return 0;
212}
213
214static inline int
215ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb,
216		     struct wmi_scan_ev_arg *arg)
217{
218	if (!ar->wmi.ops->pull_scan)
219		return -EOPNOTSUPP;
220
221	return ar->wmi.ops->pull_scan(ar, skb, arg);
222}
223
224static inline int
225ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,
226			struct wmi_mgmt_rx_ev_arg *arg)
227{
228	if (!ar->wmi.ops->pull_mgmt_rx)
229		return -EOPNOTSUPP;
230
231	return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg);
232}
233
234static inline int
235ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb,
236			struct wmi_ch_info_ev_arg *arg)
237{
238	if (!ar->wmi.ops->pull_ch_info)
239		return -EOPNOTSUPP;
240
241	return ar->wmi.ops->pull_ch_info(ar, skb, arg);
242}
243
244static inline int
245ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb,
246			   struct wmi_vdev_start_ev_arg *arg)
247{
248	if (!ar->wmi.ops->pull_vdev_start)
249		return -EOPNOTSUPP;
250
251	return ar->wmi.ops->pull_vdev_start(ar, skb, arg);
252}
253
254static inline int
255ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb,
256			  struct wmi_peer_kick_ev_arg *arg)
257{
258	if (!ar->wmi.ops->pull_peer_kick)
259		return -EOPNOTSUPP;
260
261	return ar->wmi.ops->pull_peer_kick(ar, skb, arg);
262}
263
264static inline int
265ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb,
266		     struct wmi_swba_ev_arg *arg)
267{
268	if (!ar->wmi.ops->pull_swba)
269		return -EOPNOTSUPP;
270
271	return ar->wmi.ops->pull_swba(ar, skb, arg);
272}
273
274static inline int
275ath10k_wmi_pull_phyerr_hdr(struct ath10k *ar, struct sk_buff *skb,
276			   struct wmi_phyerr_hdr_arg *arg)
277{
278	if (!ar->wmi.ops->pull_phyerr_hdr)
279		return -EOPNOTSUPP;
280
281	return ar->wmi.ops->pull_phyerr_hdr(ar, skb, arg);
282}
283
284static inline int
285ath10k_wmi_pull_phyerr(struct ath10k *ar, const void *phyerr_buf,
286		       int left_len, struct wmi_phyerr_ev_arg *arg)
287{
288	if (!ar->wmi.ops->pull_phyerr)
289		return -EOPNOTSUPP;
290
291	return ar->wmi.ops->pull_phyerr(ar, phyerr_buf, left_len, arg);
292}
293
294static inline int
295ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb,
296			struct wmi_svc_rdy_ev_arg *arg)
297{
298	if (!ar->wmi.ops->pull_svc_rdy)
299		return -EOPNOTSUPP;
300
301	return ar->wmi.ops->pull_svc_rdy(ar, skb, arg);
302}
303
304static inline int
305ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb,
306		    struct wmi_rdy_ev_arg *arg)
307{
308	if (!ar->wmi.ops->pull_rdy)
309		return -EOPNOTSUPP;
310
311	return ar->wmi.ops->pull_rdy(ar, skb, arg);
312}
313
314static inline int
315ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
316			 struct ath10k_fw_stats *stats)
317{
318	if (!ar->wmi.ops->pull_fw_stats)
319		return -EOPNOTSUPP;
320
321	return ar->wmi.ops->pull_fw_stats(ar, skb, stats);
322}
323
324static inline int
325ath10k_wmi_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
326			struct wmi_roam_ev_arg *arg)
327{
328	if (!ar->wmi.ops->pull_roam_ev)
329		return -EOPNOTSUPP;
330
331	return ar->wmi.ops->pull_roam_ev(ar, skb, arg);
332}
333
334static inline int
335ath10k_wmi_pull_wow_event(struct ath10k *ar, struct sk_buff *skb,
336			  struct wmi_wow_ev_arg *arg)
337{
338	if (!ar->wmi.ops->pull_wow_event)
339		return -EOPNOTSUPP;
340
341	return ar->wmi.ops->pull_wow_event(ar, skb, arg);
342}
343
344static inline enum wmi_txbf_conf
345ath10k_wmi_get_txbf_conf_scheme(struct ath10k *ar)
346{
347	if (!ar->wmi.ops->get_txbf_conf_scheme)
348		return WMI_TXBF_CONF_UNSUPPORTED;
349
350	return ar->wmi.ops->get_txbf_conf_scheme(ar);
351}
352
353static inline int
354ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
355{
356	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
357	struct sk_buff *skb;
358	int ret;
359
360	if (!ar->wmi.ops->gen_mgmt_tx)
361		return -EOPNOTSUPP;
362
363	skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu);
364	if (IS_ERR(skb))
365		return PTR_ERR(skb);
366
367	ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid);
368	if (ret)
369		return ret;
370
371	/* FIXME There's no ACK event for Management Tx. This probably
372	 * shouldn't be called here either. */
373	info->flags |= IEEE80211_TX_STAT_ACK;
374	ieee80211_tx_status_irqsafe(ar->hw, msdu);
375
376	return 0;
377}
378
379static inline int
380ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
381			      u16 ctl2g, u16 ctl5g,
382			      enum wmi_dfs_region dfs_reg)
383{
384	struct sk_buff *skb;
385
386	if (!ar->wmi.ops->gen_pdev_set_rd)
387		return -EOPNOTSUPP;
388
389	skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g,
390					   dfs_reg);
391	if (IS_ERR(skb))
392		return PTR_ERR(skb);
393
394	return ath10k_wmi_cmd_send(ar, skb,
395				   ar->wmi.cmd->pdev_set_regdomain_cmdid);
396}
397
398static inline int
399ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)
400{
401	struct sk_buff *skb;
402
403	if (!ar->wmi.ops->gen_pdev_suspend)
404		return -EOPNOTSUPP;
405
406	skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt);
407	if (IS_ERR(skb))
408		return PTR_ERR(skb);
409
410	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
411}
412
413static inline int
414ath10k_wmi_pdev_resume_target(struct ath10k *ar)
415{
416	struct sk_buff *skb;
417
418	if (!ar->wmi.ops->gen_pdev_resume)
419		return -EOPNOTSUPP;
420
421	skb = ar->wmi.ops->gen_pdev_resume(ar);
422	if (IS_ERR(skb))
423		return PTR_ERR(skb);
424
425	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
426}
427
428static inline int
429ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
430{
431	struct sk_buff *skb;
432
433	if (!ar->wmi.ops->gen_pdev_set_param)
434		return -EOPNOTSUPP;
435
436	skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value);
437	if (IS_ERR(skb))
438		return PTR_ERR(skb);
439
440	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
441}
442
443static inline int
444ath10k_wmi_cmd_init(struct ath10k *ar)
445{
446	struct sk_buff *skb;
447
448	if (!ar->wmi.ops->gen_init)
449		return -EOPNOTSUPP;
450
451	skb = ar->wmi.ops->gen_init(ar);
452	if (IS_ERR(skb))
453		return PTR_ERR(skb);
454
455	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid);
456}
457
458static inline int
459ath10k_wmi_start_scan(struct ath10k *ar,
460		      const struct wmi_start_scan_arg *arg)
461{
462	struct sk_buff *skb;
463
464	if (!ar->wmi.ops->gen_start_scan)
465		return -EOPNOTSUPP;
466
467	skb = ar->wmi.ops->gen_start_scan(ar, arg);
468	if (IS_ERR(skb))
469		return PTR_ERR(skb);
470
471	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
472}
473
474static inline int
475ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
476{
477	struct sk_buff *skb;
478
479	if (!ar->wmi.ops->gen_stop_scan)
480		return -EOPNOTSUPP;
481
482	skb = ar->wmi.ops->gen_stop_scan(ar, arg);
483	if (IS_ERR(skb))
484		return PTR_ERR(skb);
485
486	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
487}
488
489static inline int
490ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
491		       enum wmi_vdev_type type,
492		       enum wmi_vdev_subtype subtype,
493		       const u8 macaddr[ETH_ALEN])
494{
495	struct sk_buff *skb;
496
497	if (!ar->wmi.ops->gen_vdev_create)
498		return -EOPNOTSUPP;
499
500	skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr);
501	if (IS_ERR(skb))
502		return PTR_ERR(skb);
503
504	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
505}
506
507static inline int
508ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
509{
510	struct sk_buff *skb;
511
512	if (!ar->wmi.ops->gen_vdev_delete)
513		return -EOPNOTSUPP;
514
515	skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id);
516	if (IS_ERR(skb))
517		return PTR_ERR(skb);
518
519	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
520}
521
522static inline int
523ath10k_wmi_vdev_start(struct ath10k *ar,
524		      const struct wmi_vdev_start_request_arg *arg)
525{
526	struct sk_buff *skb;
527
528	if (!ar->wmi.ops->gen_vdev_start)
529		return -EOPNOTSUPP;
530
531	skb = ar->wmi.ops->gen_vdev_start(ar, arg, false);
532	if (IS_ERR(skb))
533		return PTR_ERR(skb);
534
535	return ath10k_wmi_cmd_send(ar, skb,
536				   ar->wmi.cmd->vdev_start_request_cmdid);
537}
538
539static inline int
540ath10k_wmi_vdev_restart(struct ath10k *ar,
541			const struct wmi_vdev_start_request_arg *arg)
542{
543	struct sk_buff *skb;
544
545	if (!ar->wmi.ops->gen_vdev_start)
546		return -EOPNOTSUPP;
547
548	skb = ar->wmi.ops->gen_vdev_start(ar, arg, true);
549	if (IS_ERR(skb))
550		return PTR_ERR(skb);
551
552	return ath10k_wmi_cmd_send(ar, skb,
553				   ar->wmi.cmd->vdev_restart_request_cmdid);
554}
555
556static inline int
557ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
558{
559	struct sk_buff *skb;
560
561	if (!ar->wmi.ops->gen_vdev_stop)
562		return -EOPNOTSUPP;
563
564	skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id);
565	if (IS_ERR(skb))
566		return PTR_ERR(skb);
567
568	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);
569}
570
571static inline int
572ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
573{
574	struct sk_buff *skb;
575
576	if (!ar->wmi.ops->gen_vdev_up)
577		return -EOPNOTSUPP;
578
579	skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid);
580	if (IS_ERR(skb))
581		return PTR_ERR(skb);
582
583	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);
584}
585
586static inline int
587ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
588{
589	struct sk_buff *skb;
590
591	if (!ar->wmi.ops->gen_vdev_down)
592		return -EOPNOTSUPP;
593
594	skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id);
595	if (IS_ERR(skb))
596		return PTR_ERR(skb);
597
598	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
599}
600
601static inline int
602ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id,
603			  u32 param_value)
604{
605	struct sk_buff *skb;
606
607	if (!ar->wmi.ops->gen_vdev_set_param)
608		return -EOPNOTSUPP;
609
610	skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id,
611					      param_value);
612	if (IS_ERR(skb))
613		return PTR_ERR(skb);
614
615	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
616}
617
618static inline int
619ath10k_wmi_vdev_install_key(struct ath10k *ar,
620			    const struct wmi_vdev_install_key_arg *arg)
621{
622	struct sk_buff *skb;
623
624	if (!ar->wmi.ops->gen_vdev_install_key)
625		return -EOPNOTSUPP;
626
627	skb = ar->wmi.ops->gen_vdev_install_key(ar, arg);
628	if (IS_ERR(skb))
629		return PTR_ERR(skb);
630
631	return ath10k_wmi_cmd_send(ar, skb,
632				   ar->wmi.cmd->vdev_install_key_cmdid);
633}
634
635static inline int
636ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,
637			      const struct wmi_vdev_spectral_conf_arg *arg)
638{
639	struct sk_buff *skb;
640	u32 cmd_id;
641
642	skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg);
643	if (IS_ERR(skb))
644		return PTR_ERR(skb);
645
646	cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid;
647	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
648}
649
650static inline int
651ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,
652				u32 enable)
653{
654	struct sk_buff *skb;
655	u32 cmd_id;
656
657	skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger,
658						    enable);
659	if (IS_ERR(skb))
660		return PTR_ERR(skb);
661
662	cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid;
663	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
664}
665
666static inline int
667ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id,
668			  const u8 peer_addr[ETH_ALEN],
669			  const struct wmi_sta_uapsd_auto_trig_arg *args,
670			  u32 num_ac)
671{
672	struct sk_buff *skb;
673	u32 cmd_id;
674
675	if (!ar->wmi.ops->gen_vdev_sta_uapsd)
676		return -EOPNOTSUPP;
677
678	skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args,
679					      num_ac);
680	if (IS_ERR(skb))
681		return PTR_ERR(skb);
682
683	cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid;
684	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
685}
686
687static inline int
688ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,
689			 const struct wmi_wmm_params_all_arg *arg)
690{
691	struct sk_buff *skb;
692	u32 cmd_id;
693
694	skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg);
695	if (IS_ERR(skb))
696		return PTR_ERR(skb);
697
698	cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid;
699	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
700}
701
702static inline int
703ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
704		       const u8 peer_addr[ETH_ALEN],
705		       enum wmi_peer_type peer_type)
706{
707	struct sk_buff *skb;
708
709	if (!ar->wmi.ops->gen_peer_create)
710		return -EOPNOTSUPP;
711
712	skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr, peer_type);
713	if (IS_ERR(skb))
714		return PTR_ERR(skb);
715
716	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
717}
718
719static inline int
720ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
721		       const u8 peer_addr[ETH_ALEN])
722{
723	struct sk_buff *skb;
724
725	if (!ar->wmi.ops->gen_peer_delete)
726		return -EOPNOTSUPP;
727
728	skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr);
729	if (IS_ERR(skb))
730		return PTR_ERR(skb);
731
732	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);
733}
734
735static inline int
736ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
737		      const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
738{
739	struct sk_buff *skb;
740
741	if (!ar->wmi.ops->gen_peer_flush)
742		return -EOPNOTSUPP;
743
744	skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap);
745	if (IS_ERR(skb))
746		return PTR_ERR(skb);
747
748	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
749}
750
751static inline int
752ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr,
753			  enum wmi_peer_param param_id, u32 param_value)
754{
755	struct sk_buff *skb;
756
757	if (!ar->wmi.ops->gen_peer_set_param)
758		return -EOPNOTSUPP;
759
760	skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id,
761					      param_value);
762	if (IS_ERR(skb))
763		return PTR_ERR(skb);
764
765	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
766}
767
768static inline int
769ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
770		      enum wmi_sta_ps_mode psmode)
771{
772	struct sk_buff *skb;
773
774	if (!ar->wmi.ops->gen_set_psmode)
775		return -EOPNOTSUPP;
776
777	skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode);
778	if (IS_ERR(skb))
779		return PTR_ERR(skb);
780
781	return ath10k_wmi_cmd_send(ar, skb,
782				   ar->wmi.cmd->sta_powersave_mode_cmdid);
783}
784
785static inline int
786ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
787			    enum wmi_sta_powersave_param param_id, u32 value)
788{
789	struct sk_buff *skb;
790
791	if (!ar->wmi.ops->gen_set_sta_ps)
792		return -EOPNOTSUPP;
793
794	skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value);
795	if (IS_ERR(skb))
796		return PTR_ERR(skb);
797
798	return ath10k_wmi_cmd_send(ar, skb,
799				   ar->wmi.cmd->sta_powersave_param_cmdid);
800}
801
802static inline int
803ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
804			   enum wmi_ap_ps_peer_param param_id, u32 value)
805{
806	struct sk_buff *skb;
807
808	if (!ar->wmi.ops->gen_set_ap_ps)
809		return -EOPNOTSUPP;
810
811	skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value);
812	if (IS_ERR(skb))
813		return PTR_ERR(skb);
814
815	return ath10k_wmi_cmd_send(ar, skb,
816				   ar->wmi.cmd->ap_ps_peer_param_cmdid);
817}
818
819static inline int
820ath10k_wmi_scan_chan_list(struct ath10k *ar,
821			  const struct wmi_scan_chan_list_arg *arg)
822{
823	struct sk_buff *skb;
824
825	if (!ar->wmi.ops->gen_scan_chan_list)
826		return -EOPNOTSUPP;
827
828	skb = ar->wmi.ops->gen_scan_chan_list(ar, arg);
829	if (IS_ERR(skb))
830		return PTR_ERR(skb);
831
832	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
833}
834
835static inline int
836ath10k_wmi_peer_assoc(struct ath10k *ar,
837		      const struct wmi_peer_assoc_complete_arg *arg)
838{
839	struct sk_buff *skb;
840
841	if (!ar->wmi.ops->gen_peer_assoc)
842		return -EOPNOTSUPP;
843
844	skb = ar->wmi.ops->gen_peer_assoc(ar, arg);
845	if (IS_ERR(skb))
846		return PTR_ERR(skb);
847
848	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
849}
850
851static inline int
852ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id,
853				  const void *bcn, size_t bcn_len,
854				  u32 bcn_paddr, bool dtim_zero,
855				  bool deliver_cab)
856{
857	struct sk_buff *skb;
858	int ret;
859
860	if (!ar->wmi.ops->gen_beacon_dma)
861		return -EOPNOTSUPP;
862
863	skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr,
864					  dtim_zero, deliver_cab);
865	if (IS_ERR(skb))
866		return PTR_ERR(skb);
867
868	ret = ath10k_wmi_cmd_send_nowait(ar, skb,
869					 ar->wmi.cmd->pdev_send_bcn_cmdid);
870	if (ret) {
871		dev_kfree_skb(skb);
872		return ret;
873	}
874
875	return 0;
876}
877
878static inline int
879ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
880			       const struct wmi_wmm_params_all_arg *arg)
881{
882	struct sk_buff *skb;
883
884	if (!ar->wmi.ops->gen_pdev_set_wmm)
885		return -EOPNOTSUPP;
886
887	skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg);
888	if (IS_ERR(skb))
889		return PTR_ERR(skb);
890
891	return ath10k_wmi_cmd_send(ar, skb,
892				   ar->wmi.cmd->pdev_set_wmm_params_cmdid);
893}
894
895static inline int
896ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask)
897{
898	struct sk_buff *skb;
899
900	if (!ar->wmi.ops->gen_request_stats)
901		return -EOPNOTSUPP;
902
903	skb = ar->wmi.ops->gen_request_stats(ar, stats_mask);
904	if (IS_ERR(skb))
905		return PTR_ERR(skb);
906
907	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
908}
909
910static inline int
911ath10k_wmi_force_fw_hang(struct ath10k *ar,
912			 enum wmi_force_fw_hang_type type, u32 delay_ms)
913{
914	struct sk_buff *skb;
915
916	if (!ar->wmi.ops->gen_force_fw_hang)
917		return -EOPNOTSUPP;
918
919	skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms);
920	if (IS_ERR(skb))
921		return PTR_ERR(skb);
922
923	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
924}
925
926static inline int
927ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level)
928{
929	struct sk_buff *skb;
930
931	if (!ar->wmi.ops->gen_dbglog_cfg)
932		return -EOPNOTSUPP;
933
934	skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level);
935	if (IS_ERR(skb))
936		return PTR_ERR(skb);
937
938	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);
939}
940
941static inline int
942ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter)
943{
944	struct sk_buff *skb;
945
946	if (!ar->wmi.ops->gen_pktlog_enable)
947		return -EOPNOTSUPP;
948
949	skb = ar->wmi.ops->gen_pktlog_enable(ar, filter);
950	if (IS_ERR(skb))
951		return PTR_ERR(skb);
952
953	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid);
954}
955
956static inline int
957ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar)
958{
959	struct sk_buff *skb;
960
961	if (!ar->wmi.ops->gen_pktlog_disable)
962		return -EOPNOTSUPP;
963
964	skb = ar->wmi.ops->gen_pktlog_disable(ar);
965	if (IS_ERR(skb))
966		return PTR_ERR(skb);
967
968	return ath10k_wmi_cmd_send(ar, skb,
969				   ar->wmi.cmd->pdev_pktlog_disable_cmdid);
970}
971
972static inline int
973ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration,
974			       u32 next_offset, u32 enabled)
975{
976	struct sk_buff *skb;
977
978	if (!ar->wmi.ops->gen_pdev_set_quiet_mode)
979		return -EOPNOTSUPP;
980
981	skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration,
982						   next_offset, enabled);
983	if (IS_ERR(skb))
984		return PTR_ERR(skb);
985
986	return ath10k_wmi_cmd_send(ar, skb,
987				   ar->wmi.cmd->pdev_set_quiet_mode_cmdid);
988}
989
990static inline int
991ath10k_wmi_pdev_get_temperature(struct ath10k *ar)
992{
993	struct sk_buff *skb;
994
995	if (!ar->wmi.ops->gen_pdev_get_temperature)
996		return -EOPNOTSUPP;
997
998	skb = ar->wmi.ops->gen_pdev_get_temperature(ar);
999	if (IS_ERR(skb))
1000		return PTR_ERR(skb);
1001
1002	return ath10k_wmi_cmd_send(ar, skb,
1003				   ar->wmi.cmd->pdev_get_temperature_cmdid);
1004}
1005
1006static inline int
1007ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac)
1008{
1009	struct sk_buff *skb;
1010
1011	if (!ar->wmi.ops->gen_addba_clear_resp)
1012		return -EOPNOTSUPP;
1013
1014	skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac);
1015	if (IS_ERR(skb))
1016		return PTR_ERR(skb);
1017
1018	return ath10k_wmi_cmd_send(ar, skb,
1019				   ar->wmi.cmd->addba_clear_resp_cmdid);
1020}
1021
1022static inline int
1023ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
1024		      u32 tid, u32 buf_size)
1025{
1026	struct sk_buff *skb;
1027
1028	if (!ar->wmi.ops->gen_addba_send)
1029		return -EOPNOTSUPP;
1030
1031	skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size);
1032	if (IS_ERR(skb))
1033		return PTR_ERR(skb);
1034
1035	return ath10k_wmi_cmd_send(ar, skb,
1036				   ar->wmi.cmd->addba_send_cmdid);
1037}
1038
1039static inline int
1040ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
1041			  u32 tid, u32 status)
1042{
1043	struct sk_buff *skb;
1044
1045	if (!ar->wmi.ops->gen_addba_set_resp)
1046		return -EOPNOTSUPP;
1047
1048	skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status);
1049	if (IS_ERR(skb))
1050		return PTR_ERR(skb);
1051
1052	return ath10k_wmi_cmd_send(ar, skb,
1053				   ar->wmi.cmd->addba_set_resp_cmdid);
1054}
1055
1056static inline int
1057ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
1058		      u32 tid, u32 initiator, u32 reason)
1059{
1060	struct sk_buff *skb;
1061
1062	if (!ar->wmi.ops->gen_delba_send)
1063		return -EOPNOTSUPP;
1064
1065	skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator,
1066					  reason);
1067	if (IS_ERR(skb))
1068		return PTR_ERR(skb);
1069
1070	return ath10k_wmi_cmd_send(ar, skb,
1071				   ar->wmi.cmd->delba_send_cmdid);
1072}
1073
1074static inline int
1075ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset,
1076		    struct sk_buff *bcn, u32 prb_caps, u32 prb_erp,
1077		    void *prb_ies, size_t prb_ies_len)
1078{
1079	struct sk_buff *skb;
1080
1081	if (!ar->wmi.ops->gen_bcn_tmpl)
1082		return -EOPNOTSUPP;
1083
1084	skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn,
1085					prb_caps, prb_erp, prb_ies,
1086					prb_ies_len);
1087	if (IS_ERR(skb))
1088		return PTR_ERR(skb);
1089
1090	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid);
1091}
1092
1093static inline int
1094ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb)
1095{
1096	struct sk_buff *skb;
1097
1098	if (!ar->wmi.ops->gen_prb_tmpl)
1099		return -EOPNOTSUPP;
1100
1101	skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb);
1102	if (IS_ERR(skb))
1103		return PTR_ERR(skb);
1104
1105	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid);
1106}
1107
1108static inline int
1109ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie)
1110{
1111	struct sk_buff *skb;
1112
1113	if (!ar->wmi.ops->gen_p2p_go_bcn_ie)
1114		return -EOPNOTSUPP;
1115
1116	skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie);
1117	if (IS_ERR(skb))
1118		return PTR_ERR(skb);
1119
1120	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie);
1121}
1122
1123static inline int
1124ath10k_wmi_sta_keepalive(struct ath10k *ar,
1125			 const struct wmi_sta_keepalive_arg *arg)
1126{
1127	struct sk_buff *skb;
1128	u32 cmd_id;
1129
1130	if (!ar->wmi.ops->gen_sta_keepalive)
1131		return -EOPNOTSUPP;
1132
1133	skb = ar->wmi.ops->gen_sta_keepalive(ar, arg);
1134	if (IS_ERR(skb))
1135		return PTR_ERR(skb);
1136
1137	cmd_id = ar->wmi.cmd->sta_keepalive_cmd;
1138	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1139}
1140
1141static inline int
1142ath10k_wmi_wow_enable(struct ath10k *ar)
1143{
1144	struct sk_buff *skb;
1145	u32 cmd_id;
1146
1147	if (!ar->wmi.ops->gen_wow_enable)
1148		return -EOPNOTSUPP;
1149
1150	skb = ar->wmi.ops->gen_wow_enable(ar);
1151	if (IS_ERR(skb))
1152		return PTR_ERR(skb);
1153
1154	cmd_id = ar->wmi.cmd->wow_enable_cmdid;
1155	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1156}
1157
1158static inline int
1159ath10k_wmi_wow_add_wakeup_event(struct ath10k *ar, u32 vdev_id,
1160				enum wmi_wow_wakeup_event event,
1161				u32 enable)
1162{
1163	struct sk_buff *skb;
1164	u32 cmd_id;
1165
1166	if (!ar->wmi.ops->gen_wow_add_wakeup_event)
1167		return -EOPNOTSUPP;
1168
1169	skb = ar->wmi.ops->gen_wow_add_wakeup_event(ar, vdev_id, event, enable);
1170	if (IS_ERR(skb))
1171		return PTR_ERR(skb);
1172
1173	cmd_id = ar->wmi.cmd->wow_enable_disable_wake_event_cmdid;
1174	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1175}
1176
1177static inline int
1178ath10k_wmi_wow_host_wakeup_ind(struct ath10k *ar)
1179{
1180	struct sk_buff *skb;
1181	u32 cmd_id;
1182
1183	if (!ar->wmi.ops->gen_wow_host_wakeup_ind)
1184		return -EOPNOTSUPP;
1185
1186	skb = ar->wmi.ops->gen_wow_host_wakeup_ind(ar);
1187	if (IS_ERR(skb))
1188		return PTR_ERR(skb);
1189
1190	cmd_id = ar->wmi.cmd->wow_hostwakeup_from_sleep_cmdid;
1191	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1192}
1193
1194static inline int
1195ath10k_wmi_wow_add_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id,
1196			   const u8 *pattern, const u8 *mask,
1197			   int pattern_len, int pattern_offset)
1198{
1199	struct sk_buff *skb;
1200	u32 cmd_id;
1201
1202	if (!ar->wmi.ops->gen_wow_add_pattern)
1203		return -EOPNOTSUPP;
1204
1205	skb = ar->wmi.ops->gen_wow_add_pattern(ar, vdev_id, pattern_id,
1206					       pattern, mask, pattern_len,
1207					       pattern_offset);
1208	if (IS_ERR(skb))
1209		return PTR_ERR(skb);
1210
1211	cmd_id = ar->wmi.cmd->wow_add_wake_pattern_cmdid;
1212	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1213}
1214
1215static inline int
1216ath10k_wmi_wow_del_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id)
1217{
1218	struct sk_buff *skb;
1219	u32 cmd_id;
1220
1221	if (!ar->wmi.ops->gen_wow_del_pattern)
1222		return -EOPNOTSUPP;
1223
1224	skb = ar->wmi.ops->gen_wow_del_pattern(ar, vdev_id, pattern_id);
1225	if (IS_ERR(skb))
1226		return PTR_ERR(skb);
1227
1228	cmd_id = ar->wmi.cmd->wow_del_wake_pattern_cmdid;
1229	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1230}
1231
1232static inline int
1233ath10k_wmi_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
1234				enum wmi_tdls_state state)
1235{
1236	struct sk_buff *skb;
1237
1238	if (!ar->wmi.ops->gen_update_fw_tdls_state)
1239		return -EOPNOTSUPP;
1240
1241	skb = ar->wmi.ops->gen_update_fw_tdls_state(ar, vdev_id, state);
1242	if (IS_ERR(skb))
1243		return PTR_ERR(skb);
1244
1245	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->tdls_set_state_cmdid);
1246}
1247
1248static inline int
1249ath10k_wmi_tdls_peer_update(struct ath10k *ar,
1250			    const struct wmi_tdls_peer_update_cmd_arg *arg,
1251			    const struct wmi_tdls_peer_capab_arg *cap,
1252			    const struct wmi_channel_arg *chan)
1253{
1254	struct sk_buff *skb;
1255
1256	if (!ar->wmi.ops->gen_tdls_peer_update)
1257		return -EOPNOTSUPP;
1258
1259	skb = ar->wmi.ops->gen_tdls_peer_update(ar, arg, cap, chan);
1260	if (IS_ERR(skb))
1261		return PTR_ERR(skb);
1262
1263	return ath10k_wmi_cmd_send(ar, skb,
1264				   ar->wmi.cmd->tdls_peer_update_cmdid);
1265}
1266
1267static inline int
1268ath10k_wmi_adaptive_qcs(struct ath10k *ar, bool enable)
1269{
1270	struct sk_buff *skb;
1271
1272	if (!ar->wmi.ops->gen_adaptive_qcs)
1273		return -EOPNOTSUPP;
1274
1275	skb = ar->wmi.ops->gen_adaptive_qcs(ar, enable);
1276	if (IS_ERR(skb))
1277		return PTR_ERR(skb);
1278
1279	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->adaptive_qcs_cmdid);
1280}
1281
1282static inline int
1283ath10k_wmi_pdev_get_tpc_config(struct ath10k *ar, u32 param)
1284{
1285	struct sk_buff *skb;
1286
1287	if (!ar->wmi.ops->gen_pdev_get_tpc_config)
1288		return -EOPNOTSUPP;
1289
1290	skb = ar->wmi.ops->gen_pdev_get_tpc_config(ar, param);
1291
1292	if (IS_ERR(skb))
1293		return PTR_ERR(skb);
1294
1295	return ath10k_wmi_cmd_send(ar, skb,
1296				   ar->wmi.cmd->pdev_get_tpc_config_cmdid);
1297}
1298
1299static inline int
1300ath10k_wmi_fw_stats_fill(struct ath10k *ar, struct ath10k_fw_stats *fw_stats,
1301			 char *buf)
1302{
1303	if (!ar->wmi.ops->fw_stats_fill)
1304		return -EOPNOTSUPP;
1305
1306	ar->wmi.ops->fw_stats_fill(ar, fw_stats, buf);
1307	return 0;
1308}
1309
1310static inline int
1311ath10k_wmi_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
1312				    u32 detect_level, u32 detect_margin)
1313{
1314	struct sk_buff *skb;
1315
1316	if (!ar->wmi.ops->gen_pdev_enable_adaptive_cca)
1317		return -EOPNOTSUPP;
1318
1319	skb = ar->wmi.ops->gen_pdev_enable_adaptive_cca(ar, enable,
1320							detect_level,
1321							detect_margin);
1322
1323	if (IS_ERR(skb))
1324		return PTR_ERR(skb);
1325
1326	return ath10k_wmi_cmd_send(ar, skb,
1327				   ar->wmi.cmd->pdev_enable_adaptive_cca_cmdid);
1328}
1329
1330#endif
1331