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 
21 struct ath10k;
22 struct sk_buff;
23 
24 struct 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 
153 int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
154 
155 static inline int
156 ath10k_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 
165 static inline int
166 ath10k_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 
176 static inline int
177 ath10k_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 
186 static inline int
187 ath10k_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 
196 static inline int
197 ath10k_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 
206 static inline int
207 ath10k_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 
216 static inline int
217 ath10k_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 
226 static inline int
227 ath10k_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 
236 static inline int
237 ath10k_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 
246 static inline int
247 ath10k_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 
256 static inline int
257 ath10k_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 
266 static inline int
267 ath10k_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 
276 static inline int
277 ath10k_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 
302 static inline int
303 ath10k_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 
321 static inline int
322 ath10k_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 
336 static inline int
337 ath10k_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 
351 static inline int
352 ath10k_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 
366 static inline int
367 ath10k_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 
381 static inline int
382 ath10k_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 
397 static inline int
398 ath10k_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 
412 static inline int
413 ath10k_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 
430 static inline int
431 ath10k_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 
445 static inline int
446 ath10k_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 
462 static inline int
463 ath10k_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 
479 static inline int
480 ath10k_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 
494 static inline int
495 ath10k_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 
509 static inline int
510 ath10k_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 
524 static inline int
525 ath10k_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 
541 static inline int
542 ath10k_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 
558 static inline int
559 ath10k_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 
573 static inline int
574 ath10k_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 
589 static inline int
590 ath10k_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 
610 static inline int
611 ath10k_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 
625 static inline int
626 ath10k_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 
641 static inline int
642 ath10k_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 
657 static inline int
658 ath10k_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 
673 static inline int
674 ath10k_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 
690 static inline int
691 ath10k_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 
707 static inline int
708 ath10k_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 
724 static inline int
725 ath10k_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 
741 static inline int
742 ath10k_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 
757 static inline int
758 ath10k_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 
773 static inline int
774 ath10k_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 
800 static inline int
801 ath10k_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 
817 static inline int
818 ath10k_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 
832 static inline int
833 ath10k_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 
848 static inline int
849 ath10k_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 
863 static inline int
864 ath10k_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 
878 static inline int
879 ath10k_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 
894 static inline int
895 ath10k_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 
912 static inline int
913 ath10k_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 
928 static inline int
929 ath10k_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 
944 static inline int
945 ath10k_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 
961 static inline int
962 ath10k_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 
978 static inline int
979 ath10k_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 
996 static inline int
997 ath10k_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 
1015 static inline int
1016 ath10k_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 
1030 static inline int
1031 ath10k_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 
1045 static inline int
1046 ath10k_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