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)(struct ath10k *ar, struct sk_buff *skb,
41			   struct wmi_phyerr_ev_arg *arg);
42	int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb,
43			    struct wmi_svc_rdy_ev_arg *arg);
44	int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb,
45			struct wmi_rdy_ev_arg *arg);
46	int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb,
47			     struct ath10k_fw_stats *stats);
48
49	struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);
50	struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);
51	struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,
52					   u16 rd5g, u16 ctl2g, u16 ctl5g,
53					   enum wmi_dfs_region dfs_reg);
54	struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id,
55					      u32 value);
56	struct sk_buff *(*gen_init)(struct ath10k *ar);
57	struct sk_buff *(*gen_start_scan)(struct ath10k *ar,
58					  const struct wmi_start_scan_arg *arg);
59	struct sk_buff *(*gen_stop_scan)(struct ath10k *ar,
60					 const struct wmi_stop_scan_arg *arg);
61	struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id,
62					   enum wmi_vdev_type type,
63					   enum wmi_vdev_subtype subtype,
64					   const u8 macaddr[ETH_ALEN]);
65	struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id);
66	struct sk_buff *(*gen_vdev_start)(struct ath10k *ar,
67					  const struct wmi_vdev_start_request_arg *arg,
68					  bool restart);
69	struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id);
70	struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid,
71				       const u8 *bssid);
72	struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id);
73	struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id,
74					      u32 param_id, u32 param_value);
75	struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar,
76						const struct wmi_vdev_install_key_arg *arg);
77	struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar,
78						  const struct wmi_vdev_spectral_conf_arg *arg);
79	struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id,
80						    u32 trigger, u32 enable);
81	struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id,
82					     const struct wmi_wmm_params_all_arg *arg);
83	struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id,
84					   const u8 peer_addr[ETH_ALEN]);
85	struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id,
86					   const u8 peer_addr[ETH_ALEN]);
87	struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id,
88					  const u8 peer_addr[ETH_ALEN],
89					  u32 tid_bitmap);
90	struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id,
91					      const u8 *peer_addr,
92					      enum wmi_peer_param param_id,
93					      u32 param_value);
94	struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar,
95					  const struct wmi_peer_assoc_complete_arg *arg);
96	struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id,
97					  enum wmi_sta_ps_mode psmode);
98	struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id,
99					  enum wmi_sta_powersave_param param_id,
100					  u32 value);
101	struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id,
102					 const u8 *mac,
103					 enum wmi_ap_ps_peer_param param_id,
104					 u32 value);
105	struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar,
106					      const struct wmi_scan_chan_list_arg *arg);
107	struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id,
108					  const void *bcn, size_t bcn_len,
109					  u32 bcn_paddr, bool dtim_zero,
110					  bool deliver_cab);
111	struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
112					    const struct wmi_wmm_params_all_arg *arg);
113	struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask);
114	struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
115					     enum wmi_force_fw_hang_type type,
116					     u32 delay_ms);
117	struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);
118	struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable,
119					  u32 log_level);
120	struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);
121	struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);
122	struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,
123						   u32 period, u32 duration,
124						   u32 next_offset,
125						   u32 enabled);
126	struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar);
127	struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id,
128						const u8 *mac);
129	struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id,
130					  const u8 *mac, u32 tid, u32 buf_size);
131	struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id,
132					      const u8 *mac, u32 tid,
133					      u32 status);
134	struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id,
135					  const u8 *mac, u32 tid, u32 initiator,
136					  u32 reason);
137	struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id,
138					u32 tim_ie_offset, struct sk_buff *bcn,
139					u32 prb_caps, u32 prb_erp,
140					void *prb_ies, size_t prb_ies_len);
141	struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id,
142					struct sk_buff *bcn);
143	struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id,
144					     const u8 *p2p_ie);
145	struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id,
146					      const u8 peer_addr[ETH_ALEN],
147					      const struct wmi_sta_uapsd_auto_trig_arg *args,
148					      u32 num_ac);
149	struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar,
150					     const struct wmi_sta_keepalive_arg *arg);
151};
152
153int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
154
155static inline int
156ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb)
157{
158	if (WARN_ON_ONCE(!ar->wmi.ops->rx))
159		return -EOPNOTSUPP;
160
161	ar->wmi.ops->rx(ar, skb);
162	return 0;
163}
164
165static inline int
166ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out,
167		   size_t len)
168{
169	if (!ar->wmi.ops->map_svc)
170		return -EOPNOTSUPP;
171
172	ar->wmi.ops->map_svc(in, out, len);
173	return 0;
174}
175
176static inline int
177ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb,
178		     struct wmi_scan_ev_arg *arg)
179{
180	if (!ar->wmi.ops->pull_scan)
181		return -EOPNOTSUPP;
182
183	return ar->wmi.ops->pull_scan(ar, skb, arg);
184}
185
186static inline int
187ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,
188			struct wmi_mgmt_rx_ev_arg *arg)
189{
190	if (!ar->wmi.ops->pull_mgmt_rx)
191		return -EOPNOTSUPP;
192
193	return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg);
194}
195
196static inline int
197ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb,
198			struct wmi_ch_info_ev_arg *arg)
199{
200	if (!ar->wmi.ops->pull_ch_info)
201		return -EOPNOTSUPP;
202
203	return ar->wmi.ops->pull_ch_info(ar, skb, arg);
204}
205
206static inline int
207ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb,
208			   struct wmi_vdev_start_ev_arg *arg)
209{
210	if (!ar->wmi.ops->pull_vdev_start)
211		return -EOPNOTSUPP;
212
213	return ar->wmi.ops->pull_vdev_start(ar, skb, arg);
214}
215
216static inline int
217ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb,
218			  struct wmi_peer_kick_ev_arg *arg)
219{
220	if (!ar->wmi.ops->pull_peer_kick)
221		return -EOPNOTSUPP;
222
223	return ar->wmi.ops->pull_peer_kick(ar, skb, arg);
224}
225
226static inline int
227ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb,
228		     struct wmi_swba_ev_arg *arg)
229{
230	if (!ar->wmi.ops->pull_swba)
231		return -EOPNOTSUPP;
232
233	return ar->wmi.ops->pull_swba(ar, skb, arg);
234}
235
236static inline int
237ath10k_wmi_pull_phyerr(struct ath10k *ar, struct sk_buff *skb,
238		       struct wmi_phyerr_ev_arg *arg)
239{
240	if (!ar->wmi.ops->pull_phyerr)
241		return -EOPNOTSUPP;
242
243	return ar->wmi.ops->pull_phyerr(ar, skb, arg);
244}
245
246static inline int
247ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb,
248			struct wmi_svc_rdy_ev_arg *arg)
249{
250	if (!ar->wmi.ops->pull_svc_rdy)
251		return -EOPNOTSUPP;
252
253	return ar->wmi.ops->pull_svc_rdy(ar, skb, arg);
254}
255
256static inline int
257ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb,
258		    struct wmi_rdy_ev_arg *arg)
259{
260	if (!ar->wmi.ops->pull_rdy)
261		return -EOPNOTSUPP;
262
263	return ar->wmi.ops->pull_rdy(ar, skb, arg);
264}
265
266static inline int
267ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
268			 struct ath10k_fw_stats *stats)
269{
270	if (!ar->wmi.ops->pull_fw_stats)
271		return -EOPNOTSUPP;
272
273	return ar->wmi.ops->pull_fw_stats(ar, skb, stats);
274}
275
276static inline int
277ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
278{
279	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
280	struct sk_buff *skb;
281	int ret;
282
283	if (!ar->wmi.ops->gen_mgmt_tx)
284		return -EOPNOTSUPP;
285
286	skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu);
287	if (IS_ERR(skb))
288		return PTR_ERR(skb);
289
290	ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid);
291	if (ret)
292		return ret;
293
294	/* FIXME There's no ACK event for Management Tx. This probably
295	 * shouldn't be called here either. */
296	info->flags |= IEEE80211_TX_STAT_ACK;
297	ieee80211_tx_status_irqsafe(ar->hw, msdu);
298
299	return 0;
300}
301
302static inline int
303ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
304			      u16 ctl2g, u16 ctl5g,
305			      enum wmi_dfs_region dfs_reg)
306{
307	struct sk_buff *skb;
308
309	if (!ar->wmi.ops->gen_pdev_set_rd)
310		return -EOPNOTSUPP;
311
312	skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g,
313					   dfs_reg);
314	if (IS_ERR(skb))
315		return PTR_ERR(skb);
316
317	return ath10k_wmi_cmd_send(ar, skb,
318				   ar->wmi.cmd->pdev_set_regdomain_cmdid);
319}
320
321static inline int
322ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)
323{
324	struct sk_buff *skb;
325
326	if (!ar->wmi.ops->gen_pdev_suspend)
327		return -EOPNOTSUPP;
328
329	skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt);
330	if (IS_ERR(skb))
331		return PTR_ERR(skb);
332
333	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
334}
335
336static inline int
337ath10k_wmi_pdev_resume_target(struct ath10k *ar)
338{
339	struct sk_buff *skb;
340
341	if (!ar->wmi.ops->gen_pdev_resume)
342		return -EOPNOTSUPP;
343
344	skb = ar->wmi.ops->gen_pdev_resume(ar);
345	if (IS_ERR(skb))
346		return PTR_ERR(skb);
347
348	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
349}
350
351static inline int
352ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
353{
354	struct sk_buff *skb;
355
356	if (!ar->wmi.ops->gen_pdev_set_param)
357		return -EOPNOTSUPP;
358
359	skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value);
360	if (IS_ERR(skb))
361		return PTR_ERR(skb);
362
363	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
364}
365
366static inline int
367ath10k_wmi_cmd_init(struct ath10k *ar)
368{
369	struct sk_buff *skb;
370
371	if (!ar->wmi.ops->gen_init)
372		return -EOPNOTSUPP;
373
374	skb = ar->wmi.ops->gen_init(ar);
375	if (IS_ERR(skb))
376		return PTR_ERR(skb);
377
378	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid);
379}
380
381static inline int
382ath10k_wmi_start_scan(struct ath10k *ar,
383		      const struct wmi_start_scan_arg *arg)
384{
385	struct sk_buff *skb;
386
387	if (!ar->wmi.ops->gen_start_scan)
388		return -EOPNOTSUPP;
389
390	skb = ar->wmi.ops->gen_start_scan(ar, arg);
391	if (IS_ERR(skb))
392		return PTR_ERR(skb);
393
394	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
395}
396
397static inline int
398ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
399{
400	struct sk_buff *skb;
401
402	if (!ar->wmi.ops->gen_stop_scan)
403		return -EOPNOTSUPP;
404
405	skb = ar->wmi.ops->gen_stop_scan(ar, arg);
406	if (IS_ERR(skb))
407		return PTR_ERR(skb);
408
409	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
410}
411
412static inline int
413ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
414		       enum wmi_vdev_type type,
415		       enum wmi_vdev_subtype subtype,
416		       const u8 macaddr[ETH_ALEN])
417{
418	struct sk_buff *skb;
419
420	if (!ar->wmi.ops->gen_vdev_create)
421		return -EOPNOTSUPP;
422
423	skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr);
424	if (IS_ERR(skb))
425		return PTR_ERR(skb);
426
427	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
428}
429
430static inline int
431ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
432{
433	struct sk_buff *skb;
434
435	if (!ar->wmi.ops->gen_vdev_delete)
436		return -EOPNOTSUPP;
437
438	skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id);
439	if (IS_ERR(skb))
440		return PTR_ERR(skb);
441
442	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
443}
444
445static inline int
446ath10k_wmi_vdev_start(struct ath10k *ar,
447		      const struct wmi_vdev_start_request_arg *arg)
448{
449	struct sk_buff *skb;
450
451	if (!ar->wmi.ops->gen_vdev_start)
452		return -EOPNOTSUPP;
453
454	skb = ar->wmi.ops->gen_vdev_start(ar, arg, false);
455	if (IS_ERR(skb))
456		return PTR_ERR(skb);
457
458	return ath10k_wmi_cmd_send(ar, skb,
459				   ar->wmi.cmd->vdev_start_request_cmdid);
460}
461
462static inline int
463ath10k_wmi_vdev_restart(struct ath10k *ar,
464			const struct wmi_vdev_start_request_arg *arg)
465{
466	struct sk_buff *skb;
467
468	if (!ar->wmi.ops->gen_vdev_start)
469		return -EOPNOTSUPP;
470
471	skb = ar->wmi.ops->gen_vdev_start(ar, arg, true);
472	if (IS_ERR(skb))
473		return PTR_ERR(skb);
474
475	return ath10k_wmi_cmd_send(ar, skb,
476				   ar->wmi.cmd->vdev_restart_request_cmdid);
477}
478
479static inline int
480ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
481{
482	struct sk_buff *skb;
483
484	if (!ar->wmi.ops->gen_vdev_stop)
485		return -EOPNOTSUPP;
486
487	skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id);
488	if (IS_ERR(skb))
489		return PTR_ERR(skb);
490
491	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);
492}
493
494static inline int
495ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
496{
497	struct sk_buff *skb;
498
499	if (!ar->wmi.ops->gen_vdev_up)
500		return -EOPNOTSUPP;
501
502	skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid);
503	if (IS_ERR(skb))
504		return PTR_ERR(skb);
505
506	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);
507}
508
509static inline int
510ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
511{
512	struct sk_buff *skb;
513
514	if (!ar->wmi.ops->gen_vdev_down)
515		return -EOPNOTSUPP;
516
517	skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id);
518	if (IS_ERR(skb))
519		return PTR_ERR(skb);
520
521	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
522}
523
524static inline int
525ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id,
526			  u32 param_value)
527{
528	struct sk_buff *skb;
529
530	if (!ar->wmi.ops->gen_vdev_set_param)
531		return -EOPNOTSUPP;
532
533	skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id,
534					      param_value);
535	if (IS_ERR(skb))
536		return PTR_ERR(skb);
537
538	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
539}
540
541static inline int
542ath10k_wmi_vdev_install_key(struct ath10k *ar,
543			    const struct wmi_vdev_install_key_arg *arg)
544{
545	struct sk_buff *skb;
546
547	if (!ar->wmi.ops->gen_vdev_install_key)
548		return -EOPNOTSUPP;
549
550	skb = ar->wmi.ops->gen_vdev_install_key(ar, arg);
551	if (IS_ERR(skb))
552		return PTR_ERR(skb);
553
554	return ath10k_wmi_cmd_send(ar, skb,
555				   ar->wmi.cmd->vdev_install_key_cmdid);
556}
557
558static inline int
559ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,
560			      const struct wmi_vdev_spectral_conf_arg *arg)
561{
562	struct sk_buff *skb;
563	u32 cmd_id;
564
565	skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg);
566	if (IS_ERR(skb))
567		return PTR_ERR(skb);
568
569	cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid;
570	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
571}
572
573static inline int
574ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,
575				u32 enable)
576{
577	struct sk_buff *skb;
578	u32 cmd_id;
579
580	skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger,
581						    enable);
582	if (IS_ERR(skb))
583		return PTR_ERR(skb);
584
585	cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid;
586	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
587}
588
589static inline int
590ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id,
591			  const u8 peer_addr[ETH_ALEN],
592			  const struct wmi_sta_uapsd_auto_trig_arg *args,
593			  u32 num_ac)
594{
595	struct sk_buff *skb;
596	u32 cmd_id;
597
598	if (!ar->wmi.ops->gen_vdev_sta_uapsd)
599		return -EOPNOTSUPP;
600
601	skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args,
602					      num_ac);
603	if (IS_ERR(skb))
604		return PTR_ERR(skb);
605
606	cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid;
607	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
608}
609
610static inline int
611ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,
612			 const struct wmi_wmm_params_all_arg *arg)
613{
614	struct sk_buff *skb;
615	u32 cmd_id;
616
617	skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg);
618	if (IS_ERR(skb))
619		return PTR_ERR(skb);
620
621	cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid;
622	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
623}
624
625static inline int
626ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
627		       const u8 peer_addr[ETH_ALEN])
628{
629	struct sk_buff *skb;
630
631	if (!ar->wmi.ops->gen_peer_create)
632		return -EOPNOTSUPP;
633
634	skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr);
635	if (IS_ERR(skb))
636		return PTR_ERR(skb);
637
638	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
639}
640
641static inline int
642ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
643		       const u8 peer_addr[ETH_ALEN])
644{
645	struct sk_buff *skb;
646
647	if (!ar->wmi.ops->gen_peer_delete)
648		return -EOPNOTSUPP;
649
650	skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr);
651	if (IS_ERR(skb))
652		return PTR_ERR(skb);
653
654	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);
655}
656
657static inline int
658ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
659		      const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
660{
661	struct sk_buff *skb;
662
663	if (!ar->wmi.ops->gen_peer_flush)
664		return -EOPNOTSUPP;
665
666	skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap);
667	if (IS_ERR(skb))
668		return PTR_ERR(skb);
669
670	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
671}
672
673static inline int
674ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr,
675			  enum wmi_peer_param param_id, u32 param_value)
676{
677	struct sk_buff *skb;
678
679	if (!ar->wmi.ops->gen_peer_set_param)
680		return -EOPNOTSUPP;
681
682	skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id,
683					      param_value);
684	if (IS_ERR(skb))
685		return PTR_ERR(skb);
686
687	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
688}
689
690static inline int
691ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
692		      enum wmi_sta_ps_mode psmode)
693{
694	struct sk_buff *skb;
695
696	if (!ar->wmi.ops->gen_set_psmode)
697		return -EOPNOTSUPP;
698
699	skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode);
700	if (IS_ERR(skb))
701		return PTR_ERR(skb);
702
703	return ath10k_wmi_cmd_send(ar, skb,
704				   ar->wmi.cmd->sta_powersave_mode_cmdid);
705}
706
707static inline int
708ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
709			    enum wmi_sta_powersave_param param_id, u32 value)
710{
711	struct sk_buff *skb;
712
713	if (!ar->wmi.ops->gen_set_sta_ps)
714		return -EOPNOTSUPP;
715
716	skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value);
717	if (IS_ERR(skb))
718		return PTR_ERR(skb);
719
720	return ath10k_wmi_cmd_send(ar, skb,
721				   ar->wmi.cmd->sta_powersave_param_cmdid);
722}
723
724static inline int
725ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
726			   enum wmi_ap_ps_peer_param param_id, u32 value)
727{
728	struct sk_buff *skb;
729
730	if (!ar->wmi.ops->gen_set_ap_ps)
731		return -EOPNOTSUPP;
732
733	skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value);
734	if (IS_ERR(skb))
735		return PTR_ERR(skb);
736
737	return ath10k_wmi_cmd_send(ar, skb,
738				   ar->wmi.cmd->ap_ps_peer_param_cmdid);
739}
740
741static inline int
742ath10k_wmi_scan_chan_list(struct ath10k *ar,
743			  const struct wmi_scan_chan_list_arg *arg)
744{
745	struct sk_buff *skb;
746
747	if (!ar->wmi.ops->gen_scan_chan_list)
748		return -EOPNOTSUPP;
749
750	skb = ar->wmi.ops->gen_scan_chan_list(ar, arg);
751	if (IS_ERR(skb))
752		return PTR_ERR(skb);
753
754	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
755}
756
757static inline int
758ath10k_wmi_peer_assoc(struct ath10k *ar,
759		      const struct wmi_peer_assoc_complete_arg *arg)
760{
761	struct sk_buff *skb;
762
763	if (!ar->wmi.ops->gen_peer_assoc)
764		return -EOPNOTSUPP;
765
766	skb = ar->wmi.ops->gen_peer_assoc(ar, arg);
767	if (IS_ERR(skb))
768		return PTR_ERR(skb);
769
770	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
771}
772
773static inline int
774ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id,
775				  const void *bcn, size_t bcn_len,
776				  u32 bcn_paddr, bool dtim_zero,
777				  bool deliver_cab)
778{
779	struct sk_buff *skb;
780	int ret;
781
782	if (!ar->wmi.ops->gen_beacon_dma)
783		return -EOPNOTSUPP;
784
785	skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr,
786					  dtim_zero, deliver_cab);
787	if (IS_ERR(skb))
788		return PTR_ERR(skb);
789
790	ret = ath10k_wmi_cmd_send_nowait(ar, skb,
791					 ar->wmi.cmd->pdev_send_bcn_cmdid);
792	if (ret) {
793		dev_kfree_skb(skb);
794		return ret;
795	}
796
797	return 0;
798}
799
800static inline int
801ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
802			       const struct wmi_wmm_params_all_arg *arg)
803{
804	struct sk_buff *skb;
805
806	if (!ar->wmi.ops->gen_pdev_set_wmm)
807		return -EOPNOTSUPP;
808
809	skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg);
810	if (IS_ERR(skb))
811		return PTR_ERR(skb);
812
813	return ath10k_wmi_cmd_send(ar, skb,
814				   ar->wmi.cmd->pdev_set_wmm_params_cmdid);
815}
816
817static inline int
818ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask)
819{
820	struct sk_buff *skb;
821
822	if (!ar->wmi.ops->gen_request_stats)
823		return -EOPNOTSUPP;
824
825	skb = ar->wmi.ops->gen_request_stats(ar, stats_mask);
826	if (IS_ERR(skb))
827		return PTR_ERR(skb);
828
829	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
830}
831
832static inline int
833ath10k_wmi_force_fw_hang(struct ath10k *ar,
834			 enum wmi_force_fw_hang_type type, u32 delay_ms)
835{
836	struct sk_buff *skb;
837
838	if (!ar->wmi.ops->gen_force_fw_hang)
839		return -EOPNOTSUPP;
840
841	skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms);
842	if (IS_ERR(skb))
843		return PTR_ERR(skb);
844
845	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
846}
847
848static inline int
849ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level)
850{
851	struct sk_buff *skb;
852
853	if (!ar->wmi.ops->gen_dbglog_cfg)
854		return -EOPNOTSUPP;
855
856	skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level);
857	if (IS_ERR(skb))
858		return PTR_ERR(skb);
859
860	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);
861}
862
863static inline int
864ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter)
865{
866	struct sk_buff *skb;
867
868	if (!ar->wmi.ops->gen_pktlog_enable)
869		return -EOPNOTSUPP;
870
871	skb = ar->wmi.ops->gen_pktlog_enable(ar, filter);
872	if (IS_ERR(skb))
873		return PTR_ERR(skb);
874
875	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid);
876}
877
878static inline int
879ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar)
880{
881	struct sk_buff *skb;
882
883	if (!ar->wmi.ops->gen_pktlog_disable)
884		return -EOPNOTSUPP;
885
886	skb = ar->wmi.ops->gen_pktlog_disable(ar);
887	if (IS_ERR(skb))
888		return PTR_ERR(skb);
889
890	return ath10k_wmi_cmd_send(ar, skb,
891				   ar->wmi.cmd->pdev_pktlog_disable_cmdid);
892}
893
894static inline int
895ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration,
896			       u32 next_offset, u32 enabled)
897{
898	struct sk_buff *skb;
899
900	if (!ar->wmi.ops->gen_pdev_set_quiet_mode)
901		return -EOPNOTSUPP;
902
903	skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration,
904						   next_offset, enabled);
905	if (IS_ERR(skb))
906		return PTR_ERR(skb);
907
908	return ath10k_wmi_cmd_send(ar, skb,
909				   ar->wmi.cmd->pdev_set_quiet_mode_cmdid);
910}
911
912static inline int
913ath10k_wmi_pdev_get_temperature(struct ath10k *ar)
914{
915	struct sk_buff *skb;
916
917	if (!ar->wmi.ops->gen_pdev_get_temperature)
918		return -EOPNOTSUPP;
919
920	skb = ar->wmi.ops->gen_pdev_get_temperature(ar);
921	if (IS_ERR(skb))
922		return PTR_ERR(skb);
923
924	return ath10k_wmi_cmd_send(ar, skb,
925				   ar->wmi.cmd->pdev_get_temperature_cmdid);
926}
927
928static inline int
929ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac)
930{
931	struct sk_buff *skb;
932
933	if (!ar->wmi.ops->gen_addba_clear_resp)
934		return -EOPNOTSUPP;
935
936	skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac);
937	if (IS_ERR(skb))
938		return PTR_ERR(skb);
939
940	return ath10k_wmi_cmd_send(ar, skb,
941				   ar->wmi.cmd->addba_clear_resp_cmdid);
942}
943
944static inline int
945ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
946		      u32 tid, u32 buf_size)
947{
948	struct sk_buff *skb;
949
950	if (!ar->wmi.ops->gen_addba_send)
951		return -EOPNOTSUPP;
952
953	skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size);
954	if (IS_ERR(skb))
955		return PTR_ERR(skb);
956
957	return ath10k_wmi_cmd_send(ar, skb,
958				   ar->wmi.cmd->addba_send_cmdid);
959}
960
961static inline int
962ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
963			  u32 tid, u32 status)
964{
965	struct sk_buff *skb;
966
967	if (!ar->wmi.ops->gen_addba_set_resp)
968		return -EOPNOTSUPP;
969
970	skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status);
971	if (IS_ERR(skb))
972		return PTR_ERR(skb);
973
974	return ath10k_wmi_cmd_send(ar, skb,
975				   ar->wmi.cmd->addba_set_resp_cmdid);
976}
977
978static inline int
979ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
980		      u32 tid, u32 initiator, u32 reason)
981{
982	struct sk_buff *skb;
983
984	if (!ar->wmi.ops->gen_delba_send)
985		return -EOPNOTSUPP;
986
987	skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator,
988					  reason);
989	if (IS_ERR(skb))
990		return PTR_ERR(skb);
991
992	return ath10k_wmi_cmd_send(ar, skb,
993				   ar->wmi.cmd->delba_send_cmdid);
994}
995
996static inline int
997ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset,
998		    struct sk_buff *bcn, u32 prb_caps, u32 prb_erp,
999		    void *prb_ies, size_t prb_ies_len)
1000{
1001	struct sk_buff *skb;
1002
1003	if (!ar->wmi.ops->gen_bcn_tmpl)
1004		return -EOPNOTSUPP;
1005
1006	skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn,
1007					prb_caps, prb_erp, prb_ies,
1008					prb_ies_len);
1009	if (IS_ERR(skb))
1010		return PTR_ERR(skb);
1011
1012	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid);
1013}
1014
1015static inline int
1016ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb)
1017{
1018	struct sk_buff *skb;
1019
1020	if (!ar->wmi.ops->gen_prb_tmpl)
1021		return -EOPNOTSUPP;
1022
1023	skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb);
1024	if (IS_ERR(skb))
1025		return PTR_ERR(skb);
1026
1027	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid);
1028}
1029
1030static inline int
1031ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie)
1032{
1033	struct sk_buff *skb;
1034
1035	if (!ar->wmi.ops->gen_p2p_go_bcn_ie)
1036		return -EOPNOTSUPP;
1037
1038	skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie);
1039	if (IS_ERR(skb))
1040		return PTR_ERR(skb);
1041
1042	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie);
1043}
1044
1045static inline int
1046ath10k_wmi_sta_keepalive(struct ath10k *ar,
1047			 const struct wmi_sta_keepalive_arg *arg)
1048{
1049	struct sk_buff *skb;
1050	u32 cmd_id;
1051
1052	if (!ar->wmi.ops->gen_sta_keepalive)
1053		return -EOPNOTSUPP;
1054
1055	skb = ar->wmi.ops->gen_sta_keepalive(ar, arg);
1056	if (IS_ERR(skb))
1057		return PTR_ERR(skb);
1058
1059	cmd_id = ar->wmi.cmd->sta_keepalive_cmd;
1060	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1061}
1062
1063#endif
1064