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