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