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