2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2014 Qualcomm Atheros, Inc.
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.
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.
25 void (*rx
)(struct ath10k
*ar
, struct sk_buff
*skb
);
26 void (*map_svc
)(const __le32
*in
, unsigned long *out
, size_t len
);
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 int (*pull_roam_ev
)(struct ath10k
*ar
, struct sk_buff
*skb
,
49 struct wmi_roam_ev_arg
*arg
);
50 int (*pull_wow_event
)(struct ath10k
*ar
, struct sk_buff
*skb
,
51 struct wmi_wow_ev_arg
*arg
);
53 struct sk_buff
*(*gen_pdev_suspend
)(struct ath10k
*ar
, u32 suspend_opt
);
54 struct sk_buff
*(*gen_pdev_resume
)(struct ath10k
*ar
);
55 struct sk_buff
*(*gen_pdev_set_rd
)(struct ath10k
*ar
, u16 rd
, u16 rd2g
,
56 u16 rd5g
, u16 ctl2g
, u16 ctl5g
,
57 enum wmi_dfs_region dfs_reg
);
58 struct sk_buff
*(*gen_pdev_set_param
)(struct ath10k
*ar
, u32 id
,
60 struct sk_buff
*(*gen_init
)(struct ath10k
*ar
);
61 struct sk_buff
*(*gen_start_scan
)(struct ath10k
*ar
,
62 const struct wmi_start_scan_arg
*arg
);
63 struct sk_buff
*(*gen_stop_scan
)(struct ath10k
*ar
,
64 const struct wmi_stop_scan_arg
*arg
);
65 struct sk_buff
*(*gen_vdev_create
)(struct ath10k
*ar
, u32 vdev_id
,
66 enum wmi_vdev_type type
,
67 enum wmi_vdev_subtype subtype
,
68 const u8 macaddr
[ETH_ALEN
]);
69 struct sk_buff
*(*gen_vdev_delete
)(struct ath10k
*ar
, u32 vdev_id
);
70 struct sk_buff
*(*gen_vdev_start
)(struct ath10k
*ar
,
71 const struct wmi_vdev_start_request_arg
*arg
,
73 struct sk_buff
*(*gen_vdev_stop
)(struct ath10k
*ar
, u32 vdev_id
);
74 struct sk_buff
*(*gen_vdev_up
)(struct ath10k
*ar
, u32 vdev_id
, u32 aid
,
76 struct sk_buff
*(*gen_vdev_down
)(struct ath10k
*ar
, u32 vdev_id
);
77 struct sk_buff
*(*gen_vdev_set_param
)(struct ath10k
*ar
, u32 vdev_id
,
78 u32 param_id
, u32 param_value
);
79 struct sk_buff
*(*gen_vdev_install_key
)(struct ath10k
*ar
,
80 const struct wmi_vdev_install_key_arg
*arg
);
81 struct sk_buff
*(*gen_vdev_spectral_conf
)(struct ath10k
*ar
,
82 const struct wmi_vdev_spectral_conf_arg
*arg
);
83 struct sk_buff
*(*gen_vdev_spectral_enable
)(struct ath10k
*ar
, u32 vdev_id
,
84 u32 trigger
, u32 enable
);
85 struct sk_buff
*(*gen_vdev_wmm_conf
)(struct ath10k
*ar
, u32 vdev_id
,
86 const struct wmi_wmm_params_all_arg
*arg
);
87 struct sk_buff
*(*gen_peer_create
)(struct ath10k
*ar
, u32 vdev_id
,
88 const u8 peer_addr
[ETH_ALEN
],
89 enum wmi_peer_type peer_type
);
90 struct sk_buff
*(*gen_peer_delete
)(struct ath10k
*ar
, u32 vdev_id
,
91 const u8 peer_addr
[ETH_ALEN
]);
92 struct sk_buff
*(*gen_peer_flush
)(struct ath10k
*ar
, u32 vdev_id
,
93 const u8 peer_addr
[ETH_ALEN
],
95 struct sk_buff
*(*gen_peer_set_param
)(struct ath10k
*ar
, u32 vdev_id
,
97 enum wmi_peer_param param_id
,
99 struct sk_buff
*(*gen_peer_assoc
)(struct ath10k
*ar
,
100 const struct wmi_peer_assoc_complete_arg
*arg
);
101 struct sk_buff
*(*gen_set_psmode
)(struct ath10k
*ar
, u32 vdev_id
,
102 enum wmi_sta_ps_mode psmode
);
103 struct sk_buff
*(*gen_set_sta_ps
)(struct ath10k
*ar
, u32 vdev_id
,
104 enum wmi_sta_powersave_param param_id
,
106 struct sk_buff
*(*gen_set_ap_ps
)(struct ath10k
*ar
, u32 vdev_id
,
108 enum wmi_ap_ps_peer_param param_id
,
110 struct sk_buff
*(*gen_scan_chan_list
)(struct ath10k
*ar
,
111 const struct wmi_scan_chan_list_arg
*arg
);
112 struct sk_buff
*(*gen_beacon_dma
)(struct ath10k
*ar
, u32 vdev_id
,
113 const void *bcn
, size_t bcn_len
,
114 u32 bcn_paddr
, bool dtim_zero
,
116 struct sk_buff
*(*gen_pdev_set_wmm
)(struct ath10k
*ar
,
117 const struct wmi_wmm_params_all_arg
*arg
);
118 struct sk_buff
*(*gen_request_stats
)(struct ath10k
*ar
, u32 stats_mask
);
119 struct sk_buff
*(*gen_force_fw_hang
)(struct ath10k
*ar
,
120 enum wmi_force_fw_hang_type type
,
122 struct sk_buff
*(*gen_mgmt_tx
)(struct ath10k
*ar
, struct sk_buff
*skb
);
123 struct sk_buff
*(*gen_dbglog_cfg
)(struct ath10k
*ar
, u32 module_enable
,
125 struct sk_buff
*(*gen_pktlog_enable
)(struct ath10k
*ar
, u32 filter
);
126 struct sk_buff
*(*gen_pktlog_disable
)(struct ath10k
*ar
);
127 struct sk_buff
*(*gen_pdev_set_quiet_mode
)(struct ath10k
*ar
,
128 u32 period
, u32 duration
,
131 struct sk_buff
*(*gen_pdev_get_temperature
)(struct ath10k
*ar
);
132 struct sk_buff
*(*gen_addba_clear_resp
)(struct ath10k
*ar
, u32 vdev_id
,
134 struct sk_buff
*(*gen_addba_send
)(struct ath10k
*ar
, u32 vdev_id
,
135 const u8
*mac
, u32 tid
, u32 buf_size
);
136 struct sk_buff
*(*gen_addba_set_resp
)(struct ath10k
*ar
, u32 vdev_id
,
137 const u8
*mac
, u32 tid
,
139 struct sk_buff
*(*gen_delba_send
)(struct ath10k
*ar
, u32 vdev_id
,
140 const u8
*mac
, u32 tid
, u32 initiator
,
142 struct sk_buff
*(*gen_bcn_tmpl
)(struct ath10k
*ar
, u32 vdev_id
,
143 u32 tim_ie_offset
, struct sk_buff
*bcn
,
144 u32 prb_caps
, u32 prb_erp
,
145 void *prb_ies
, size_t prb_ies_len
);
146 struct sk_buff
*(*gen_prb_tmpl
)(struct ath10k
*ar
, u32 vdev_id
,
147 struct sk_buff
*bcn
);
148 struct sk_buff
*(*gen_p2p_go_bcn_ie
)(struct ath10k
*ar
, u32 vdev_id
,
150 struct sk_buff
*(*gen_vdev_sta_uapsd
)(struct ath10k
*ar
, u32 vdev_id
,
151 const u8 peer_addr
[ETH_ALEN
],
152 const struct wmi_sta_uapsd_auto_trig_arg
*args
,
154 struct sk_buff
*(*gen_sta_keepalive
)(struct ath10k
*ar
,
155 const struct wmi_sta_keepalive_arg
*arg
);
156 struct sk_buff
*(*gen_wow_enable
)(struct ath10k
*ar
);
157 struct sk_buff
*(*gen_wow_add_wakeup_event
)(struct ath10k
*ar
, u32 vdev_id
,
158 enum wmi_wow_wakeup_event event
,
160 struct sk_buff
*(*gen_wow_host_wakeup_ind
)(struct ath10k
*ar
);
161 struct sk_buff
*(*gen_wow_add_pattern
)(struct ath10k
*ar
, u32 vdev_id
,
167 struct sk_buff
*(*gen_wow_del_pattern
)(struct ath10k
*ar
, u32 vdev_id
,
169 struct sk_buff
*(*gen_update_fw_tdls_state
)(struct ath10k
*ar
,
171 enum wmi_tdls_state state
);
172 struct sk_buff
*(*gen_tdls_peer_update
)(struct ath10k
*ar
,
173 const struct wmi_tdls_peer_update_cmd_arg
*arg
,
174 const struct wmi_tdls_peer_capab_arg
*cap
,
175 const struct wmi_channel_arg
*chan
);
178 int ath10k_wmi_cmd_send(struct ath10k
*ar
, struct sk_buff
*skb
, u32 cmd_id
);
181 ath10k_wmi_rx(struct ath10k
*ar
, struct sk_buff
*skb
)
183 if (WARN_ON_ONCE(!ar
->wmi
.ops
->rx
))
186 ar
->wmi
.ops
->rx(ar
, skb
);
191 ath10k_wmi_map_svc(struct ath10k
*ar
, const __le32
*in
, unsigned long *out
,
194 if (!ar
->wmi
.ops
->map_svc
)
197 ar
->wmi
.ops
->map_svc(in
, out
, len
);
202 ath10k_wmi_pull_scan(struct ath10k
*ar
, struct sk_buff
*skb
,
203 struct wmi_scan_ev_arg
*arg
)
205 if (!ar
->wmi
.ops
->pull_scan
)
208 return ar
->wmi
.ops
->pull_scan(ar
, skb
, arg
);
212 ath10k_wmi_pull_mgmt_rx(struct ath10k
*ar
, struct sk_buff
*skb
,
213 struct wmi_mgmt_rx_ev_arg
*arg
)
215 if (!ar
->wmi
.ops
->pull_mgmt_rx
)
218 return ar
->wmi
.ops
->pull_mgmt_rx(ar
, skb
, arg
);
222 ath10k_wmi_pull_ch_info(struct ath10k
*ar
, struct sk_buff
*skb
,
223 struct wmi_ch_info_ev_arg
*arg
)
225 if (!ar
->wmi
.ops
->pull_ch_info
)
228 return ar
->wmi
.ops
->pull_ch_info(ar
, skb
, arg
);
232 ath10k_wmi_pull_vdev_start(struct ath10k
*ar
, struct sk_buff
*skb
,
233 struct wmi_vdev_start_ev_arg
*arg
)
235 if (!ar
->wmi
.ops
->pull_vdev_start
)
238 return ar
->wmi
.ops
->pull_vdev_start(ar
, skb
, arg
);
242 ath10k_wmi_pull_peer_kick(struct ath10k
*ar
, struct sk_buff
*skb
,
243 struct wmi_peer_kick_ev_arg
*arg
)
245 if (!ar
->wmi
.ops
->pull_peer_kick
)
248 return ar
->wmi
.ops
->pull_peer_kick(ar
, skb
, arg
);
252 ath10k_wmi_pull_swba(struct ath10k
*ar
, struct sk_buff
*skb
,
253 struct wmi_swba_ev_arg
*arg
)
255 if (!ar
->wmi
.ops
->pull_swba
)
258 return ar
->wmi
.ops
->pull_swba(ar
, skb
, arg
);
262 ath10k_wmi_pull_phyerr(struct ath10k
*ar
, struct sk_buff
*skb
,
263 struct wmi_phyerr_ev_arg
*arg
)
265 if (!ar
->wmi
.ops
->pull_phyerr
)
268 return ar
->wmi
.ops
->pull_phyerr(ar
, skb
, arg
);
272 ath10k_wmi_pull_svc_rdy(struct ath10k
*ar
, struct sk_buff
*skb
,
273 struct wmi_svc_rdy_ev_arg
*arg
)
275 if (!ar
->wmi
.ops
->pull_svc_rdy
)
278 return ar
->wmi
.ops
->pull_svc_rdy(ar
, skb
, arg
);
282 ath10k_wmi_pull_rdy(struct ath10k
*ar
, struct sk_buff
*skb
,
283 struct wmi_rdy_ev_arg
*arg
)
285 if (!ar
->wmi
.ops
->pull_rdy
)
288 return ar
->wmi
.ops
->pull_rdy(ar
, skb
, arg
);
292 ath10k_wmi_pull_fw_stats(struct ath10k
*ar
, struct sk_buff
*skb
,
293 struct ath10k_fw_stats
*stats
)
295 if (!ar
->wmi
.ops
->pull_fw_stats
)
298 return ar
->wmi
.ops
->pull_fw_stats(ar
, skb
, stats
);
302 ath10k_wmi_pull_roam_ev(struct ath10k
*ar
, struct sk_buff
*skb
,
303 struct wmi_roam_ev_arg
*arg
)
305 if (!ar
->wmi
.ops
->pull_roam_ev
)
308 return ar
->wmi
.ops
->pull_roam_ev(ar
, skb
, arg
);
312 ath10k_wmi_pull_wow_event(struct ath10k
*ar
, struct sk_buff
*skb
,
313 struct wmi_wow_ev_arg
*arg
)
315 if (!ar
->wmi
.ops
->pull_wow_event
)
318 return ar
->wmi
.ops
->pull_wow_event(ar
, skb
, arg
);
322 ath10k_wmi_mgmt_tx(struct ath10k
*ar
, struct sk_buff
*msdu
)
324 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(msdu
);
328 if (!ar
->wmi
.ops
->gen_mgmt_tx
)
331 skb
= ar
->wmi
.ops
->gen_mgmt_tx(ar
, msdu
);
335 ret
= ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->mgmt_tx_cmdid
);
339 /* FIXME There's no ACK event for Management Tx. This probably
340 * shouldn't be called here either. */
341 info
->flags
|= IEEE80211_TX_STAT_ACK
;
342 ieee80211_tx_status_irqsafe(ar
->hw
, msdu
);
348 ath10k_wmi_pdev_set_regdomain(struct ath10k
*ar
, u16 rd
, u16 rd2g
, u16 rd5g
,
349 u16 ctl2g
, u16 ctl5g
,
350 enum wmi_dfs_region dfs_reg
)
354 if (!ar
->wmi
.ops
->gen_pdev_set_rd
)
357 skb
= ar
->wmi
.ops
->gen_pdev_set_rd(ar
, rd
, rd2g
, rd5g
, ctl2g
, ctl5g
,
362 return ath10k_wmi_cmd_send(ar
, skb
,
363 ar
->wmi
.cmd
->pdev_set_regdomain_cmdid
);
367 ath10k_wmi_pdev_suspend_target(struct ath10k
*ar
, u32 suspend_opt
)
371 if (!ar
->wmi
.ops
->gen_pdev_suspend
)
374 skb
= ar
->wmi
.ops
->gen_pdev_suspend(ar
, suspend_opt
);
378 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->pdev_suspend_cmdid
);
382 ath10k_wmi_pdev_resume_target(struct ath10k
*ar
)
386 if (!ar
->wmi
.ops
->gen_pdev_resume
)
389 skb
= ar
->wmi
.ops
->gen_pdev_resume(ar
);
393 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->pdev_resume_cmdid
);
397 ath10k_wmi_pdev_set_param(struct ath10k
*ar
, u32 id
, u32 value
)
401 if (!ar
->wmi
.ops
->gen_pdev_set_param
)
404 skb
= ar
->wmi
.ops
->gen_pdev_set_param(ar
, id
, value
);
408 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->pdev_set_param_cmdid
);
412 ath10k_wmi_cmd_init(struct ath10k
*ar
)
416 if (!ar
->wmi
.ops
->gen_init
)
419 skb
= ar
->wmi
.ops
->gen_init(ar
);
423 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->init_cmdid
);
427 ath10k_wmi_start_scan(struct ath10k
*ar
,
428 const struct wmi_start_scan_arg
*arg
)
432 if (!ar
->wmi
.ops
->gen_start_scan
)
435 skb
= ar
->wmi
.ops
->gen_start_scan(ar
, arg
);
439 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->start_scan_cmdid
);
443 ath10k_wmi_stop_scan(struct ath10k
*ar
, const struct wmi_stop_scan_arg
*arg
)
447 if (!ar
->wmi
.ops
->gen_stop_scan
)
450 skb
= ar
->wmi
.ops
->gen_stop_scan(ar
, arg
);
454 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->stop_scan_cmdid
);
458 ath10k_wmi_vdev_create(struct ath10k
*ar
, u32 vdev_id
,
459 enum wmi_vdev_type type
,
460 enum wmi_vdev_subtype subtype
,
461 const u8 macaddr
[ETH_ALEN
])
465 if (!ar
->wmi
.ops
->gen_vdev_create
)
468 skb
= ar
->wmi
.ops
->gen_vdev_create(ar
, vdev_id
, type
, subtype
, macaddr
);
472 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->vdev_create_cmdid
);
476 ath10k_wmi_vdev_delete(struct ath10k
*ar
, u32 vdev_id
)
480 if (!ar
->wmi
.ops
->gen_vdev_delete
)
483 skb
= ar
->wmi
.ops
->gen_vdev_delete(ar
, vdev_id
);
487 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->vdev_delete_cmdid
);
491 ath10k_wmi_vdev_start(struct ath10k
*ar
,
492 const struct wmi_vdev_start_request_arg
*arg
)
496 if (!ar
->wmi
.ops
->gen_vdev_start
)
499 skb
= ar
->wmi
.ops
->gen_vdev_start(ar
, arg
, false);
503 return ath10k_wmi_cmd_send(ar
, skb
,
504 ar
->wmi
.cmd
->vdev_start_request_cmdid
);
508 ath10k_wmi_vdev_restart(struct ath10k
*ar
,
509 const struct wmi_vdev_start_request_arg
*arg
)
513 if (!ar
->wmi
.ops
->gen_vdev_start
)
516 skb
= ar
->wmi
.ops
->gen_vdev_start(ar
, arg
, true);
520 return ath10k_wmi_cmd_send(ar
, skb
,
521 ar
->wmi
.cmd
->vdev_restart_request_cmdid
);
525 ath10k_wmi_vdev_stop(struct ath10k
*ar
, u32 vdev_id
)
529 if (!ar
->wmi
.ops
->gen_vdev_stop
)
532 skb
= ar
->wmi
.ops
->gen_vdev_stop(ar
, vdev_id
);
536 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->vdev_stop_cmdid
);
540 ath10k_wmi_vdev_up(struct ath10k
*ar
, u32 vdev_id
, u32 aid
, const u8
*bssid
)
544 if (!ar
->wmi
.ops
->gen_vdev_up
)
547 skb
= ar
->wmi
.ops
->gen_vdev_up(ar
, vdev_id
, aid
, bssid
);
551 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->vdev_up_cmdid
);
555 ath10k_wmi_vdev_down(struct ath10k
*ar
, u32 vdev_id
)
559 if (!ar
->wmi
.ops
->gen_vdev_down
)
562 skb
= ar
->wmi
.ops
->gen_vdev_down(ar
, vdev_id
);
566 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->vdev_down_cmdid
);
570 ath10k_wmi_vdev_set_param(struct ath10k
*ar
, u32 vdev_id
, u32 param_id
,
575 if (!ar
->wmi
.ops
->gen_vdev_set_param
)
578 skb
= ar
->wmi
.ops
->gen_vdev_set_param(ar
, vdev_id
, param_id
,
583 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->vdev_set_param_cmdid
);
587 ath10k_wmi_vdev_install_key(struct ath10k
*ar
,
588 const struct wmi_vdev_install_key_arg
*arg
)
592 if (!ar
->wmi
.ops
->gen_vdev_install_key
)
595 skb
= ar
->wmi
.ops
->gen_vdev_install_key(ar
, arg
);
599 return ath10k_wmi_cmd_send(ar
, skb
,
600 ar
->wmi
.cmd
->vdev_install_key_cmdid
);
604 ath10k_wmi_vdev_spectral_conf(struct ath10k
*ar
,
605 const struct wmi_vdev_spectral_conf_arg
*arg
)
610 skb
= ar
->wmi
.ops
->gen_vdev_spectral_conf(ar
, arg
);
614 cmd_id
= ar
->wmi
.cmd
->vdev_spectral_scan_configure_cmdid
;
615 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
619 ath10k_wmi_vdev_spectral_enable(struct ath10k
*ar
, u32 vdev_id
, u32 trigger
,
625 skb
= ar
->wmi
.ops
->gen_vdev_spectral_enable(ar
, vdev_id
, trigger
,
630 cmd_id
= ar
->wmi
.cmd
->vdev_spectral_scan_enable_cmdid
;
631 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
635 ath10k_wmi_vdev_sta_uapsd(struct ath10k
*ar
, u32 vdev_id
,
636 const u8 peer_addr
[ETH_ALEN
],
637 const struct wmi_sta_uapsd_auto_trig_arg
*args
,
643 if (!ar
->wmi
.ops
->gen_vdev_sta_uapsd
)
646 skb
= ar
->wmi
.ops
->gen_vdev_sta_uapsd(ar
, vdev_id
, peer_addr
, args
,
651 cmd_id
= ar
->wmi
.cmd
->sta_uapsd_auto_trig_cmdid
;
652 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
656 ath10k_wmi_vdev_wmm_conf(struct ath10k
*ar
, u32 vdev_id
,
657 const struct wmi_wmm_params_all_arg
*arg
)
662 skb
= ar
->wmi
.ops
->gen_vdev_wmm_conf(ar
, vdev_id
, arg
);
666 cmd_id
= ar
->wmi
.cmd
->vdev_set_wmm_params_cmdid
;
667 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
671 ath10k_wmi_peer_create(struct ath10k
*ar
, u32 vdev_id
,
672 const u8 peer_addr
[ETH_ALEN
],
673 enum wmi_peer_type peer_type
)
677 if (!ar
->wmi
.ops
->gen_peer_create
)
680 skb
= ar
->wmi
.ops
->gen_peer_create(ar
, vdev_id
, peer_addr
, peer_type
);
684 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->peer_create_cmdid
);
688 ath10k_wmi_peer_delete(struct ath10k
*ar
, u32 vdev_id
,
689 const u8 peer_addr
[ETH_ALEN
])
693 if (!ar
->wmi
.ops
->gen_peer_delete
)
696 skb
= ar
->wmi
.ops
->gen_peer_delete(ar
, vdev_id
, peer_addr
);
700 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->peer_delete_cmdid
);
704 ath10k_wmi_peer_flush(struct ath10k
*ar
, u32 vdev_id
,
705 const u8 peer_addr
[ETH_ALEN
], u32 tid_bitmap
)
709 if (!ar
->wmi
.ops
->gen_peer_flush
)
712 skb
= ar
->wmi
.ops
->gen_peer_flush(ar
, vdev_id
, peer_addr
, tid_bitmap
);
716 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->peer_flush_tids_cmdid
);
720 ath10k_wmi_peer_set_param(struct ath10k
*ar
, u32 vdev_id
, const u8
*peer_addr
,
721 enum wmi_peer_param param_id
, u32 param_value
)
725 if (!ar
->wmi
.ops
->gen_peer_set_param
)
728 skb
= ar
->wmi
.ops
->gen_peer_set_param(ar
, vdev_id
, peer_addr
, param_id
,
733 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->peer_set_param_cmdid
);
737 ath10k_wmi_set_psmode(struct ath10k
*ar
, u32 vdev_id
,
738 enum wmi_sta_ps_mode psmode
)
742 if (!ar
->wmi
.ops
->gen_set_psmode
)
745 skb
= ar
->wmi
.ops
->gen_set_psmode(ar
, vdev_id
, psmode
);
749 return ath10k_wmi_cmd_send(ar
, skb
,
750 ar
->wmi
.cmd
->sta_powersave_mode_cmdid
);
754 ath10k_wmi_set_sta_ps_param(struct ath10k
*ar
, u32 vdev_id
,
755 enum wmi_sta_powersave_param param_id
, u32 value
)
759 if (!ar
->wmi
.ops
->gen_set_sta_ps
)
762 skb
= ar
->wmi
.ops
->gen_set_sta_ps(ar
, vdev_id
, param_id
, value
);
766 return ath10k_wmi_cmd_send(ar
, skb
,
767 ar
->wmi
.cmd
->sta_powersave_param_cmdid
);
771 ath10k_wmi_set_ap_ps_param(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
772 enum wmi_ap_ps_peer_param param_id
, u32 value
)
776 if (!ar
->wmi
.ops
->gen_set_ap_ps
)
779 skb
= ar
->wmi
.ops
->gen_set_ap_ps(ar
, vdev_id
, mac
, param_id
, value
);
783 return ath10k_wmi_cmd_send(ar
, skb
,
784 ar
->wmi
.cmd
->ap_ps_peer_param_cmdid
);
788 ath10k_wmi_scan_chan_list(struct ath10k
*ar
,
789 const struct wmi_scan_chan_list_arg
*arg
)
793 if (!ar
->wmi
.ops
->gen_scan_chan_list
)
796 skb
= ar
->wmi
.ops
->gen_scan_chan_list(ar
, arg
);
800 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->scan_chan_list_cmdid
);
804 ath10k_wmi_peer_assoc(struct ath10k
*ar
,
805 const struct wmi_peer_assoc_complete_arg
*arg
)
809 if (!ar
->wmi
.ops
->gen_peer_assoc
)
812 skb
= ar
->wmi
.ops
->gen_peer_assoc(ar
, arg
);
816 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->peer_assoc_cmdid
);
820 ath10k_wmi_beacon_send_ref_nowait(struct ath10k
*ar
, u32 vdev_id
,
821 const void *bcn
, size_t bcn_len
,
822 u32 bcn_paddr
, bool dtim_zero
,
828 if (!ar
->wmi
.ops
->gen_beacon_dma
)
831 skb
= ar
->wmi
.ops
->gen_beacon_dma(ar
, vdev_id
, bcn
, bcn_len
, bcn_paddr
,
832 dtim_zero
, deliver_cab
);
836 ret
= ath10k_wmi_cmd_send_nowait(ar
, skb
,
837 ar
->wmi
.cmd
->pdev_send_bcn_cmdid
);
847 ath10k_wmi_pdev_set_wmm_params(struct ath10k
*ar
,
848 const struct wmi_wmm_params_all_arg
*arg
)
852 if (!ar
->wmi
.ops
->gen_pdev_set_wmm
)
855 skb
= ar
->wmi
.ops
->gen_pdev_set_wmm(ar
, arg
);
859 return ath10k_wmi_cmd_send(ar
, skb
,
860 ar
->wmi
.cmd
->pdev_set_wmm_params_cmdid
);
864 ath10k_wmi_request_stats(struct ath10k
*ar
, u32 stats_mask
)
868 if (!ar
->wmi
.ops
->gen_request_stats
)
871 skb
= ar
->wmi
.ops
->gen_request_stats(ar
, stats_mask
);
875 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->request_stats_cmdid
);
879 ath10k_wmi_force_fw_hang(struct ath10k
*ar
,
880 enum wmi_force_fw_hang_type type
, u32 delay_ms
)
884 if (!ar
->wmi
.ops
->gen_force_fw_hang
)
887 skb
= ar
->wmi
.ops
->gen_force_fw_hang(ar
, type
, delay_ms
);
891 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->force_fw_hang_cmdid
);
895 ath10k_wmi_dbglog_cfg(struct ath10k
*ar
, u32 module_enable
, u32 log_level
)
899 if (!ar
->wmi
.ops
->gen_dbglog_cfg
)
902 skb
= ar
->wmi
.ops
->gen_dbglog_cfg(ar
, module_enable
, log_level
);
906 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->dbglog_cfg_cmdid
);
910 ath10k_wmi_pdev_pktlog_enable(struct ath10k
*ar
, u32 filter
)
914 if (!ar
->wmi
.ops
->gen_pktlog_enable
)
917 skb
= ar
->wmi
.ops
->gen_pktlog_enable(ar
, filter
);
921 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->pdev_pktlog_enable_cmdid
);
925 ath10k_wmi_pdev_pktlog_disable(struct ath10k
*ar
)
929 if (!ar
->wmi
.ops
->gen_pktlog_disable
)
932 skb
= ar
->wmi
.ops
->gen_pktlog_disable(ar
);
936 return ath10k_wmi_cmd_send(ar
, skb
,
937 ar
->wmi
.cmd
->pdev_pktlog_disable_cmdid
);
941 ath10k_wmi_pdev_set_quiet_mode(struct ath10k
*ar
, u32 period
, u32 duration
,
942 u32 next_offset
, u32 enabled
)
946 if (!ar
->wmi
.ops
->gen_pdev_set_quiet_mode
)
949 skb
= ar
->wmi
.ops
->gen_pdev_set_quiet_mode(ar
, period
, duration
,
950 next_offset
, enabled
);
954 return ath10k_wmi_cmd_send(ar
, skb
,
955 ar
->wmi
.cmd
->pdev_set_quiet_mode_cmdid
);
959 ath10k_wmi_pdev_get_temperature(struct ath10k
*ar
)
963 if (!ar
->wmi
.ops
->gen_pdev_get_temperature
)
966 skb
= ar
->wmi
.ops
->gen_pdev_get_temperature(ar
);
970 return ath10k_wmi_cmd_send(ar
, skb
,
971 ar
->wmi
.cmd
->pdev_get_temperature_cmdid
);
975 ath10k_wmi_addba_clear_resp(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
)
979 if (!ar
->wmi
.ops
->gen_addba_clear_resp
)
982 skb
= ar
->wmi
.ops
->gen_addba_clear_resp(ar
, vdev_id
, mac
);
986 return ath10k_wmi_cmd_send(ar
, skb
,
987 ar
->wmi
.cmd
->addba_clear_resp_cmdid
);
991 ath10k_wmi_addba_send(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
992 u32 tid
, u32 buf_size
)
996 if (!ar
->wmi
.ops
->gen_addba_send
)
999 skb
= ar
->wmi
.ops
->gen_addba_send(ar
, vdev_id
, mac
, tid
, buf_size
);
1001 return PTR_ERR(skb
);
1003 return ath10k_wmi_cmd_send(ar
, skb
,
1004 ar
->wmi
.cmd
->addba_send_cmdid
);
1008 ath10k_wmi_addba_set_resp(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
1009 u32 tid
, u32 status
)
1011 struct sk_buff
*skb
;
1013 if (!ar
->wmi
.ops
->gen_addba_set_resp
)
1016 skb
= ar
->wmi
.ops
->gen_addba_set_resp(ar
, vdev_id
, mac
, tid
, status
);
1018 return PTR_ERR(skb
);
1020 return ath10k_wmi_cmd_send(ar
, skb
,
1021 ar
->wmi
.cmd
->addba_set_resp_cmdid
);
1025 ath10k_wmi_delba_send(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
1026 u32 tid
, u32 initiator
, u32 reason
)
1028 struct sk_buff
*skb
;
1030 if (!ar
->wmi
.ops
->gen_delba_send
)
1033 skb
= ar
->wmi
.ops
->gen_delba_send(ar
, vdev_id
, mac
, tid
, initiator
,
1036 return PTR_ERR(skb
);
1038 return ath10k_wmi_cmd_send(ar
, skb
,
1039 ar
->wmi
.cmd
->delba_send_cmdid
);
1043 ath10k_wmi_bcn_tmpl(struct ath10k
*ar
, u32 vdev_id
, u32 tim_ie_offset
,
1044 struct sk_buff
*bcn
, u32 prb_caps
, u32 prb_erp
,
1045 void *prb_ies
, size_t prb_ies_len
)
1047 struct sk_buff
*skb
;
1049 if (!ar
->wmi
.ops
->gen_bcn_tmpl
)
1052 skb
= ar
->wmi
.ops
->gen_bcn_tmpl(ar
, vdev_id
, tim_ie_offset
, bcn
,
1053 prb_caps
, prb_erp
, prb_ies
,
1056 return PTR_ERR(skb
);
1058 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->bcn_tmpl_cmdid
);
1062 ath10k_wmi_prb_tmpl(struct ath10k
*ar
, u32 vdev_id
, struct sk_buff
*prb
)
1064 struct sk_buff
*skb
;
1066 if (!ar
->wmi
.ops
->gen_prb_tmpl
)
1069 skb
= ar
->wmi
.ops
->gen_prb_tmpl(ar
, vdev_id
, prb
);
1071 return PTR_ERR(skb
);
1073 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->prb_tmpl_cmdid
);
1077 ath10k_wmi_p2p_go_bcn_ie(struct ath10k
*ar
, u32 vdev_id
, const u8
*p2p_ie
)
1079 struct sk_buff
*skb
;
1081 if (!ar
->wmi
.ops
->gen_p2p_go_bcn_ie
)
1084 skb
= ar
->wmi
.ops
->gen_p2p_go_bcn_ie(ar
, vdev_id
, p2p_ie
);
1086 return PTR_ERR(skb
);
1088 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->p2p_go_set_beacon_ie
);
1092 ath10k_wmi_sta_keepalive(struct ath10k
*ar
,
1093 const struct wmi_sta_keepalive_arg
*arg
)
1095 struct sk_buff
*skb
;
1098 if (!ar
->wmi
.ops
->gen_sta_keepalive
)
1101 skb
= ar
->wmi
.ops
->gen_sta_keepalive(ar
, arg
);
1103 return PTR_ERR(skb
);
1105 cmd_id
= ar
->wmi
.cmd
->sta_keepalive_cmd
;
1106 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1110 ath10k_wmi_wow_enable(struct ath10k
*ar
)
1112 struct sk_buff
*skb
;
1115 if (!ar
->wmi
.ops
->gen_wow_enable
)
1118 skb
= ar
->wmi
.ops
->gen_wow_enable(ar
);
1120 return PTR_ERR(skb
);
1122 cmd_id
= ar
->wmi
.cmd
->wow_enable_cmdid
;
1123 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1127 ath10k_wmi_wow_add_wakeup_event(struct ath10k
*ar
, u32 vdev_id
,
1128 enum wmi_wow_wakeup_event event
,
1131 struct sk_buff
*skb
;
1134 if (!ar
->wmi
.ops
->gen_wow_add_wakeup_event
)
1137 skb
= ar
->wmi
.ops
->gen_wow_add_wakeup_event(ar
, vdev_id
, event
, enable
);
1139 return PTR_ERR(skb
);
1141 cmd_id
= ar
->wmi
.cmd
->wow_enable_disable_wake_event_cmdid
;
1142 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1146 ath10k_wmi_wow_host_wakeup_ind(struct ath10k
*ar
)
1148 struct sk_buff
*skb
;
1151 if (!ar
->wmi
.ops
->gen_wow_host_wakeup_ind
)
1154 skb
= ar
->wmi
.ops
->gen_wow_host_wakeup_ind(ar
);
1156 return PTR_ERR(skb
);
1158 cmd_id
= ar
->wmi
.cmd
->wow_hostwakeup_from_sleep_cmdid
;
1159 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1163 ath10k_wmi_wow_add_pattern(struct ath10k
*ar
, u32 vdev_id
, u32 pattern_id
,
1164 const u8
*pattern
, const u8
*mask
,
1165 int pattern_len
, int pattern_offset
)
1167 struct sk_buff
*skb
;
1170 if (!ar
->wmi
.ops
->gen_wow_add_pattern
)
1173 skb
= ar
->wmi
.ops
->gen_wow_add_pattern(ar
, vdev_id
, pattern_id
,
1174 pattern
, mask
, pattern_len
,
1177 return PTR_ERR(skb
);
1179 cmd_id
= ar
->wmi
.cmd
->wow_add_wake_pattern_cmdid
;
1180 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1184 ath10k_wmi_wow_del_pattern(struct ath10k
*ar
, u32 vdev_id
, u32 pattern_id
)
1186 struct sk_buff
*skb
;
1189 if (!ar
->wmi
.ops
->gen_wow_del_pattern
)
1192 skb
= ar
->wmi
.ops
->gen_wow_del_pattern(ar
, vdev_id
, pattern_id
);
1194 return PTR_ERR(skb
);
1196 cmd_id
= ar
->wmi
.cmd
->wow_del_wake_pattern_cmdid
;
1197 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1201 ath10k_wmi_update_fw_tdls_state(struct ath10k
*ar
, u32 vdev_id
,
1202 enum wmi_tdls_state state
)
1204 struct sk_buff
*skb
;
1206 if (!ar
->wmi
.ops
->gen_update_fw_tdls_state
)
1209 skb
= ar
->wmi
.ops
->gen_update_fw_tdls_state(ar
, vdev_id
, state
);
1211 return PTR_ERR(skb
);
1213 return ath10k_wmi_cmd_send(ar
, skb
, ar
->wmi
.cmd
->tdls_set_state_cmdid
);
1217 ath10k_wmi_tdls_peer_update(struct ath10k
*ar
,
1218 const struct wmi_tdls_peer_update_cmd_arg
*arg
,
1219 const struct wmi_tdls_peer_capab_arg
*cap
,
1220 const struct wmi_channel_arg
*chan
)
1222 struct sk_buff
*skb
;
1224 if (!ar
->wmi
.ops
->gen_tdls_peer_update
)
1227 skb
= ar
->wmi
.ops
->gen_tdls_peer_update(ar
, arg
, cap
, chan
);
1229 return PTR_ERR(skb
);
1231 return ath10k_wmi_cmd_send(ar
, skb
,
1232 ar
->wmi
.cmd
->tdls_peer_update_cmdid
);