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