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