1d7579d12SMichal Kazior /*
2d7579d12SMichal Kazior  * Copyright (c) 2005-2011 Atheros Communications Inc.
3d7579d12SMichal Kazior  * Copyright (c) 2011-2014 Qualcomm Atheros, Inc.
4d7579d12SMichal Kazior  *
5d7579d12SMichal Kazior  * Permission to use, copy, modify, and/or distribute this software for any
6d7579d12SMichal Kazior  * purpose with or without fee is hereby granted, provided that the above
7d7579d12SMichal Kazior  * copyright notice and this permission notice appear in all copies.
8d7579d12SMichal Kazior  *
9d7579d12SMichal Kazior  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10d7579d12SMichal Kazior  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11d7579d12SMichal Kazior  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12d7579d12SMichal Kazior  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13d7579d12SMichal Kazior  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14d7579d12SMichal Kazior  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15d7579d12SMichal Kazior  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16d7579d12SMichal Kazior  */
17d7579d12SMichal Kazior 
18d7579d12SMichal Kazior #ifndef _WMI_OPS_H_
19d7579d12SMichal Kazior #define _WMI_OPS_H_
20d7579d12SMichal Kazior 
21d7579d12SMichal Kazior struct ath10k;
22d7579d12SMichal Kazior struct sk_buff;
23d7579d12SMichal Kazior 
24d7579d12SMichal Kazior struct wmi_ops {
25d7579d12SMichal Kazior 	void (*rx)(struct ath10k *ar, struct sk_buff *skb);
26d7579d12SMichal Kazior 	void (*map_svc)(const __le32 *in, unsigned long *out, size_t len);
27d7579d12SMichal Kazior 
28d7579d12SMichal Kazior 	int (*pull_scan)(struct ath10k *ar, struct sk_buff *skb,
29d7579d12SMichal Kazior 			 struct wmi_scan_ev_arg *arg);
30d7579d12SMichal Kazior 	int (*pull_mgmt_rx)(struct ath10k *ar, struct sk_buff *skb,
31d7579d12SMichal Kazior 			    struct wmi_mgmt_rx_ev_arg *arg);
32d7579d12SMichal Kazior 	int (*pull_ch_info)(struct ath10k *ar, struct sk_buff *skb,
33d7579d12SMichal Kazior 			    struct wmi_ch_info_ev_arg *arg);
34d7579d12SMichal Kazior 	int (*pull_vdev_start)(struct ath10k *ar, struct sk_buff *skb,
35d7579d12SMichal Kazior 			       struct wmi_vdev_start_ev_arg *arg);
36d7579d12SMichal Kazior 	int (*pull_peer_kick)(struct ath10k *ar, struct sk_buff *skb,
37d7579d12SMichal Kazior 			      struct wmi_peer_kick_ev_arg *arg);
38d7579d12SMichal Kazior 	int (*pull_swba)(struct ath10k *ar, struct sk_buff *skb,
39d7579d12SMichal Kazior 			 struct wmi_swba_ev_arg *arg);
40d7579d12SMichal Kazior 	int (*pull_phyerr)(struct ath10k *ar, struct sk_buff *skb,
41d7579d12SMichal Kazior 			   struct wmi_phyerr_ev_arg *arg);
42d7579d12SMichal Kazior 	int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb,
43d7579d12SMichal Kazior 			    struct wmi_svc_rdy_ev_arg *arg);
44d7579d12SMichal Kazior 	int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb,
45d7579d12SMichal Kazior 			struct wmi_rdy_ev_arg *arg);
46d7579d12SMichal Kazior 	int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb,
47d7579d12SMichal Kazior 			     struct ath10k_fw_stats *stats);
48c1a4654aSMichal Kazior 	int (*pull_roam_ev)(struct ath10k *ar, struct sk_buff *skb,
49c1a4654aSMichal Kazior 			    struct wmi_roam_ev_arg *arg);
50d7579d12SMichal Kazior 
51d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);
52d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);
53d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,
54d7579d12SMichal Kazior 					   u16 rd5g, u16 ctl2g, u16 ctl5g,
55d7579d12SMichal Kazior 					   enum wmi_dfs_region dfs_reg);
56d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id,
57d7579d12SMichal Kazior 					      u32 value);
58d7579d12SMichal Kazior 	struct sk_buff *(*gen_init)(struct ath10k *ar);
59d7579d12SMichal Kazior 	struct sk_buff *(*gen_start_scan)(struct ath10k *ar,
60d7579d12SMichal Kazior 					  const struct wmi_start_scan_arg *arg);
61d7579d12SMichal Kazior 	struct sk_buff *(*gen_stop_scan)(struct ath10k *ar,
62d7579d12SMichal Kazior 					 const struct wmi_stop_scan_arg *arg);
63d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id,
64d7579d12SMichal Kazior 					   enum wmi_vdev_type type,
65d7579d12SMichal Kazior 					   enum wmi_vdev_subtype subtype,
66d7579d12SMichal Kazior 					   const u8 macaddr[ETH_ALEN]);
67d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id);
68d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_start)(struct ath10k *ar,
69d7579d12SMichal Kazior 					  const struct wmi_vdev_start_request_arg *arg,
70d7579d12SMichal Kazior 					  bool restart);
71d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id);
72d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid,
73d7579d12SMichal Kazior 				       const u8 *bssid);
74d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id);
75d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id,
76d7579d12SMichal Kazior 					      u32 param_id, u32 param_value);
77d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar,
78d7579d12SMichal Kazior 						const struct wmi_vdev_install_key_arg *arg);
79d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar,
80d7579d12SMichal Kazior 						  const struct wmi_vdev_spectral_conf_arg *arg);
81d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id,
82d7579d12SMichal Kazior 						    u32 trigger, u32 enable);
836d492fe2SMichal Kazior 	struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id,
846d492fe2SMichal Kazior 					     const struct wmi_wmm_params_all_arg *arg);
85d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id,
86d7579d12SMichal Kazior 					   const u8 peer_addr[ETH_ALEN]);
87d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id,
88d7579d12SMichal Kazior 					   const u8 peer_addr[ETH_ALEN]);
89d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id,
90d7579d12SMichal Kazior 					  const u8 peer_addr[ETH_ALEN],
91d7579d12SMichal Kazior 					  u32 tid_bitmap);
92d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id,
93d7579d12SMichal Kazior 					      const u8 *peer_addr,
94d7579d12SMichal Kazior 					      enum wmi_peer_param param_id,
95d7579d12SMichal Kazior 					      u32 param_value);
96d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar,
97d7579d12SMichal Kazior 					  const struct wmi_peer_assoc_complete_arg *arg);
98d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id,
99d7579d12SMichal Kazior 					  enum wmi_sta_ps_mode psmode);
100d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id,
101d7579d12SMichal Kazior 					  enum wmi_sta_powersave_param param_id,
102d7579d12SMichal Kazior 					  u32 value);
103d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id,
104d7579d12SMichal Kazior 					 const u8 *mac,
105d7579d12SMichal Kazior 					 enum wmi_ap_ps_peer_param param_id,
106d7579d12SMichal Kazior 					 u32 value);
107d7579d12SMichal Kazior 	struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar,
108d7579d12SMichal Kazior 					      const struct wmi_scan_chan_list_arg *arg);
1099ad50182SMichal Kazior 	struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id,
1109ad50182SMichal Kazior 					  const void *bcn, size_t bcn_len,
1119ad50182SMichal Kazior 					  u32 bcn_paddr, bool dtim_zero,
1129ad50182SMichal Kazior 					  bool deliver_cab);
113d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
1145e752e42SMichal Kazior 					    const struct wmi_wmm_params_all_arg *arg);
115de23d3efSMichal Kazior 	struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask);
116d7579d12SMichal Kazior 	struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
117d7579d12SMichal Kazior 					     enum wmi_force_fw_hang_type type,
118d7579d12SMichal Kazior 					     u32 delay_ms);
119d7579d12SMichal Kazior 	struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);
120467210a6SSenthilKumar Jegadeesan 	struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable,
121467210a6SSenthilKumar Jegadeesan 					  u32 log_level);
122d7579d12SMichal Kazior 	struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);
123d7579d12SMichal Kazior 	struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);
124ffdd738dSRajkumar Manoharan 	struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,
125ffdd738dSRajkumar Manoharan 						   u32 period, u32 duration,
126ffdd738dSRajkumar Manoharan 						   u32 next_offset,
127ffdd738dSRajkumar Manoharan 						   u32 enabled);
128a57a6a27SRajkumar Manoharan 	struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar);
129dc8ab278SRajkumar Manoharan 	struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id,
130dc8ab278SRajkumar Manoharan 						const u8 *mac);
13165c0893dSRajkumar Manoharan 	struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id,
13265c0893dSRajkumar Manoharan 					  const u8 *mac, u32 tid, u32 buf_size);
13311597413SRajkumar Manoharan 	struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id,
13411597413SRajkumar Manoharan 					      const u8 *mac, u32 tid,
13511597413SRajkumar Manoharan 					      u32 status);
13650abef85SRajkumar Manoharan 	struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id,
13750abef85SRajkumar Manoharan 					  const u8 *mac, u32 tid, u32 initiator,
13850abef85SRajkumar Manoharan 					  u32 reason);
139be9ce9d8SMichal Kazior 	struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id,
140be9ce9d8SMichal Kazior 					u32 tim_ie_offset, struct sk_buff *bcn,
141be9ce9d8SMichal Kazior 					u32 prb_caps, u32 prb_erp,
142be9ce9d8SMichal Kazior 					void *prb_ies, size_t prb_ies_len);
1434c4955feSMichal Kazior 	struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id,
1444c4955feSMichal Kazior 					struct sk_buff *bcn);
145369242b4SMichal Kazior 	struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id,
146369242b4SMichal Kazior 					     const u8 *p2p_ie);
1470c7e477cSJanusz Dziedzic 	struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id,
1480c7e477cSJanusz Dziedzic 					      const u8 peer_addr[ETH_ALEN],
1490c7e477cSJanusz Dziedzic 					      const struct wmi_sta_uapsd_auto_trig_arg *args,
1500c7e477cSJanusz Dziedzic 					      u32 num_ac);
1516e8b188bSJanusz Dziedzic 	struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar,
1526e8b188bSJanusz Dziedzic 					     const struct wmi_sta_keepalive_arg *arg);
153d7579d12SMichal Kazior };
154d7579d12SMichal Kazior 
155d7579d12SMichal Kazior int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
156d7579d12SMichal Kazior 
157d7579d12SMichal Kazior static inline int
158d7579d12SMichal Kazior ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb)
159d7579d12SMichal Kazior {
160d7579d12SMichal Kazior 	if (WARN_ON_ONCE(!ar->wmi.ops->rx))
161d7579d12SMichal Kazior 		return -EOPNOTSUPP;
162d7579d12SMichal Kazior 
163d7579d12SMichal Kazior 	ar->wmi.ops->rx(ar, skb);
164d7579d12SMichal Kazior 	return 0;
165d7579d12SMichal Kazior }
166d7579d12SMichal Kazior 
167d7579d12SMichal Kazior static inline int
168d7579d12SMichal Kazior ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out,
169d7579d12SMichal Kazior 		   size_t len)
170d7579d12SMichal Kazior {
171d7579d12SMichal Kazior 	if (!ar->wmi.ops->map_svc)
172d7579d12SMichal Kazior 		return -EOPNOTSUPP;
173d7579d12SMichal Kazior 
174d7579d12SMichal Kazior 	ar->wmi.ops->map_svc(in, out, len);
175d7579d12SMichal Kazior 	return 0;
176d7579d12SMichal Kazior }
177d7579d12SMichal Kazior 
178d7579d12SMichal Kazior static inline int
179d7579d12SMichal Kazior ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb,
180d7579d12SMichal Kazior 		     struct wmi_scan_ev_arg *arg)
181d7579d12SMichal Kazior {
182d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_scan)
183d7579d12SMichal Kazior 		return -EOPNOTSUPP;
184d7579d12SMichal Kazior 
185d7579d12SMichal Kazior 	return ar->wmi.ops->pull_scan(ar, skb, arg);
186d7579d12SMichal Kazior }
187d7579d12SMichal Kazior 
188d7579d12SMichal Kazior static inline int
189d7579d12SMichal Kazior ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,
190d7579d12SMichal Kazior 			struct wmi_mgmt_rx_ev_arg *arg)
191d7579d12SMichal Kazior {
192d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_mgmt_rx)
193d7579d12SMichal Kazior 		return -EOPNOTSUPP;
194d7579d12SMichal Kazior 
195d7579d12SMichal Kazior 	return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg);
196d7579d12SMichal Kazior }
197d7579d12SMichal Kazior 
198d7579d12SMichal Kazior static inline int
199d7579d12SMichal Kazior ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb,
200d7579d12SMichal Kazior 			struct wmi_ch_info_ev_arg *arg)
201d7579d12SMichal Kazior {
202d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_ch_info)
203d7579d12SMichal Kazior 		return -EOPNOTSUPP;
204d7579d12SMichal Kazior 
205d7579d12SMichal Kazior 	return ar->wmi.ops->pull_ch_info(ar, skb, arg);
206d7579d12SMichal Kazior }
207d7579d12SMichal Kazior 
208d7579d12SMichal Kazior static inline int
209d7579d12SMichal Kazior ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb,
210d7579d12SMichal Kazior 			   struct wmi_vdev_start_ev_arg *arg)
211d7579d12SMichal Kazior {
212d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_vdev_start)
213d7579d12SMichal Kazior 		return -EOPNOTSUPP;
214d7579d12SMichal Kazior 
215d7579d12SMichal Kazior 	return ar->wmi.ops->pull_vdev_start(ar, skb, arg);
216d7579d12SMichal Kazior }
217d7579d12SMichal Kazior 
218d7579d12SMichal Kazior static inline int
219d7579d12SMichal Kazior ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb,
220d7579d12SMichal Kazior 			  struct wmi_peer_kick_ev_arg *arg)
221d7579d12SMichal Kazior {
222d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_peer_kick)
223d7579d12SMichal Kazior 		return -EOPNOTSUPP;
224d7579d12SMichal Kazior 
225d7579d12SMichal Kazior 	return ar->wmi.ops->pull_peer_kick(ar, skb, arg);
226d7579d12SMichal Kazior }
227d7579d12SMichal Kazior 
228d7579d12SMichal Kazior static inline int
229d7579d12SMichal Kazior ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb,
230d7579d12SMichal Kazior 		     struct wmi_swba_ev_arg *arg)
231d7579d12SMichal Kazior {
232d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_swba)
233d7579d12SMichal Kazior 		return -EOPNOTSUPP;
234d7579d12SMichal Kazior 
235d7579d12SMichal Kazior 	return ar->wmi.ops->pull_swba(ar, skb, arg);
236d7579d12SMichal Kazior }
237d7579d12SMichal Kazior 
238d7579d12SMichal Kazior static inline int
239d7579d12SMichal Kazior ath10k_wmi_pull_phyerr(struct ath10k *ar, struct sk_buff *skb,
240d7579d12SMichal Kazior 		       struct wmi_phyerr_ev_arg *arg)
241d7579d12SMichal Kazior {
242d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_phyerr)
243d7579d12SMichal Kazior 		return -EOPNOTSUPP;
244d7579d12SMichal Kazior 
245d7579d12SMichal Kazior 	return ar->wmi.ops->pull_phyerr(ar, skb, arg);
246d7579d12SMichal Kazior }
247d7579d12SMichal Kazior 
248d7579d12SMichal Kazior static inline int
249d7579d12SMichal Kazior ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb,
250d7579d12SMichal Kazior 			struct wmi_svc_rdy_ev_arg *arg)
251d7579d12SMichal Kazior {
252d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_svc_rdy)
253d7579d12SMichal Kazior 		return -EOPNOTSUPP;
254d7579d12SMichal Kazior 
255d7579d12SMichal Kazior 	return ar->wmi.ops->pull_svc_rdy(ar, skb, arg);
256d7579d12SMichal Kazior }
257d7579d12SMichal Kazior 
258d7579d12SMichal Kazior static inline int
259d7579d12SMichal Kazior ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb,
260d7579d12SMichal Kazior 		    struct wmi_rdy_ev_arg *arg)
261d7579d12SMichal Kazior {
262d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_rdy)
263d7579d12SMichal Kazior 		return -EOPNOTSUPP;
264d7579d12SMichal Kazior 
265d7579d12SMichal Kazior 	return ar->wmi.ops->pull_rdy(ar, skb, arg);
266d7579d12SMichal Kazior }
267d7579d12SMichal Kazior 
268d7579d12SMichal Kazior static inline int
269d7579d12SMichal Kazior ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
270d7579d12SMichal Kazior 			 struct ath10k_fw_stats *stats)
271d7579d12SMichal Kazior {
272d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_fw_stats)
273d7579d12SMichal Kazior 		return -EOPNOTSUPP;
274d7579d12SMichal Kazior 
275d7579d12SMichal Kazior 	return ar->wmi.ops->pull_fw_stats(ar, skb, stats);
276d7579d12SMichal Kazior }
277d7579d12SMichal Kazior 
278d7579d12SMichal Kazior static inline int
279c1a4654aSMichal Kazior ath10k_wmi_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
280c1a4654aSMichal Kazior 			struct wmi_roam_ev_arg *arg)
281c1a4654aSMichal Kazior {
282c1a4654aSMichal Kazior 	if (!ar->wmi.ops->pull_roam_ev)
283c1a4654aSMichal Kazior 		return -EOPNOTSUPP;
284c1a4654aSMichal Kazior 
285c1a4654aSMichal Kazior 	return ar->wmi.ops->pull_roam_ev(ar, skb, arg);
286c1a4654aSMichal Kazior }
287c1a4654aSMichal Kazior 
288c1a4654aSMichal Kazior static inline int
289d7579d12SMichal Kazior ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
290d7579d12SMichal Kazior {
291d7579d12SMichal Kazior 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
292d7579d12SMichal Kazior 	struct sk_buff *skb;
293d7579d12SMichal Kazior 	int ret;
294d7579d12SMichal Kazior 
295d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_mgmt_tx)
296d7579d12SMichal Kazior 		return -EOPNOTSUPP;
297d7579d12SMichal Kazior 
298d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu);
299d7579d12SMichal Kazior 	if (IS_ERR(skb))
300d7579d12SMichal Kazior 		return PTR_ERR(skb);
301d7579d12SMichal Kazior 
302d7579d12SMichal Kazior 	ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid);
303d7579d12SMichal Kazior 	if (ret)
304d7579d12SMichal Kazior 		return ret;
305d7579d12SMichal Kazior 
306d7579d12SMichal Kazior 	/* FIXME There's no ACK event for Management Tx. This probably
307d7579d12SMichal Kazior 	 * shouldn't be called here either. */
308d7579d12SMichal Kazior 	info->flags |= IEEE80211_TX_STAT_ACK;
309d7579d12SMichal Kazior 	ieee80211_tx_status_irqsafe(ar->hw, msdu);
310d7579d12SMichal Kazior 
311d7579d12SMichal Kazior 	return 0;
312d7579d12SMichal Kazior }
313d7579d12SMichal Kazior 
314d7579d12SMichal Kazior static inline int
315d7579d12SMichal Kazior ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
316d7579d12SMichal Kazior 			      u16 ctl2g, u16 ctl5g,
317d7579d12SMichal Kazior 			      enum wmi_dfs_region dfs_reg)
318d7579d12SMichal Kazior {
319d7579d12SMichal Kazior 	struct sk_buff *skb;
320d7579d12SMichal Kazior 
321d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_rd)
322d7579d12SMichal Kazior 		return -EOPNOTSUPP;
323d7579d12SMichal Kazior 
324d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g,
325d7579d12SMichal Kazior 					   dfs_reg);
326d7579d12SMichal Kazior 	if (IS_ERR(skb))
327d7579d12SMichal Kazior 		return PTR_ERR(skb);
328d7579d12SMichal Kazior 
329d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
330d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_set_regdomain_cmdid);
331d7579d12SMichal Kazior }
332d7579d12SMichal Kazior 
333d7579d12SMichal Kazior static inline int
334d7579d12SMichal Kazior ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)
335d7579d12SMichal Kazior {
336d7579d12SMichal Kazior 	struct sk_buff *skb;
337d7579d12SMichal Kazior 
338d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_suspend)
339d7579d12SMichal Kazior 		return -EOPNOTSUPP;
340d7579d12SMichal Kazior 
341d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt);
342d7579d12SMichal Kazior 	if (IS_ERR(skb))
343d7579d12SMichal Kazior 		return PTR_ERR(skb);
344d7579d12SMichal Kazior 
345d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
346d7579d12SMichal Kazior }
347d7579d12SMichal Kazior 
348d7579d12SMichal Kazior static inline int
349d7579d12SMichal Kazior ath10k_wmi_pdev_resume_target(struct ath10k *ar)
350d7579d12SMichal Kazior {
351d7579d12SMichal Kazior 	struct sk_buff *skb;
352d7579d12SMichal Kazior 
353d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_resume)
354d7579d12SMichal Kazior 		return -EOPNOTSUPP;
355d7579d12SMichal Kazior 
356d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_resume(ar);
357d7579d12SMichal Kazior 	if (IS_ERR(skb))
358d7579d12SMichal Kazior 		return PTR_ERR(skb);
359d7579d12SMichal Kazior 
360d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
361d7579d12SMichal Kazior }
362d7579d12SMichal Kazior 
363d7579d12SMichal Kazior static inline int
364d7579d12SMichal Kazior ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
365d7579d12SMichal Kazior {
366d7579d12SMichal Kazior 	struct sk_buff *skb;
367d7579d12SMichal Kazior 
368d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_param)
369d7579d12SMichal Kazior 		return -EOPNOTSUPP;
370d7579d12SMichal Kazior 
371d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value);
372d7579d12SMichal Kazior 	if (IS_ERR(skb))
373d7579d12SMichal Kazior 		return PTR_ERR(skb);
374d7579d12SMichal Kazior 
375d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
376d7579d12SMichal Kazior }
377d7579d12SMichal Kazior 
378d7579d12SMichal Kazior static inline int
379d7579d12SMichal Kazior ath10k_wmi_cmd_init(struct ath10k *ar)
380d7579d12SMichal Kazior {
381d7579d12SMichal Kazior 	struct sk_buff *skb;
382d7579d12SMichal Kazior 
383d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_init)
384d7579d12SMichal Kazior 		return -EOPNOTSUPP;
385d7579d12SMichal Kazior 
386d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_init(ar);
387d7579d12SMichal Kazior 	if (IS_ERR(skb))
388d7579d12SMichal Kazior 		return PTR_ERR(skb);
389d7579d12SMichal Kazior 
390d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid);
391d7579d12SMichal Kazior }
392d7579d12SMichal Kazior 
393d7579d12SMichal Kazior static inline int
394d7579d12SMichal Kazior ath10k_wmi_start_scan(struct ath10k *ar,
395d7579d12SMichal Kazior 		      const struct wmi_start_scan_arg *arg)
396d7579d12SMichal Kazior {
397d7579d12SMichal Kazior 	struct sk_buff *skb;
398d7579d12SMichal Kazior 
399d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_start_scan)
400d7579d12SMichal Kazior 		return -EOPNOTSUPP;
401d7579d12SMichal Kazior 
402d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_start_scan(ar, arg);
403d7579d12SMichal Kazior 	if (IS_ERR(skb))
404d7579d12SMichal Kazior 		return PTR_ERR(skb);
405d7579d12SMichal Kazior 
406d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
407d7579d12SMichal Kazior }
408d7579d12SMichal Kazior 
409d7579d12SMichal Kazior static inline int
410d7579d12SMichal Kazior ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
411d7579d12SMichal Kazior {
412d7579d12SMichal Kazior 	struct sk_buff *skb;
413d7579d12SMichal Kazior 
414d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_stop_scan)
415d7579d12SMichal Kazior 		return -EOPNOTSUPP;
416d7579d12SMichal Kazior 
417d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_stop_scan(ar, arg);
418d7579d12SMichal Kazior 	if (IS_ERR(skb))
419d7579d12SMichal Kazior 		return PTR_ERR(skb);
420d7579d12SMichal Kazior 
421d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
422d7579d12SMichal Kazior }
423d7579d12SMichal Kazior 
424d7579d12SMichal Kazior static inline int
425d7579d12SMichal Kazior ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
426d7579d12SMichal Kazior 		       enum wmi_vdev_type type,
427d7579d12SMichal Kazior 		       enum wmi_vdev_subtype subtype,
428d7579d12SMichal Kazior 		       const u8 macaddr[ETH_ALEN])
429d7579d12SMichal Kazior {
430d7579d12SMichal Kazior 	struct sk_buff *skb;
431d7579d12SMichal Kazior 
432d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_create)
433d7579d12SMichal Kazior 		return -EOPNOTSUPP;
434d7579d12SMichal Kazior 
435d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr);
436d7579d12SMichal Kazior 	if (IS_ERR(skb))
437d7579d12SMichal Kazior 		return PTR_ERR(skb);
438d7579d12SMichal Kazior 
439d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
440d7579d12SMichal Kazior }
441d7579d12SMichal Kazior 
442d7579d12SMichal Kazior static inline int
443d7579d12SMichal Kazior ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
444d7579d12SMichal Kazior {
445d7579d12SMichal Kazior 	struct sk_buff *skb;
446d7579d12SMichal Kazior 
447d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_delete)
448d7579d12SMichal Kazior 		return -EOPNOTSUPP;
449d7579d12SMichal Kazior 
450d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id);
451d7579d12SMichal Kazior 	if (IS_ERR(skb))
452d7579d12SMichal Kazior 		return PTR_ERR(skb);
453d7579d12SMichal Kazior 
454d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
455d7579d12SMichal Kazior }
456d7579d12SMichal Kazior 
457d7579d12SMichal Kazior static inline int
458d7579d12SMichal Kazior ath10k_wmi_vdev_start(struct ath10k *ar,
459d7579d12SMichal Kazior 		      const struct wmi_vdev_start_request_arg *arg)
460d7579d12SMichal Kazior {
461d7579d12SMichal Kazior 	struct sk_buff *skb;
462d7579d12SMichal Kazior 
463d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_start)
464d7579d12SMichal Kazior 		return -EOPNOTSUPP;
465d7579d12SMichal Kazior 
466d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_start(ar, arg, false);
467d7579d12SMichal Kazior 	if (IS_ERR(skb))
468d7579d12SMichal Kazior 		return PTR_ERR(skb);
469d7579d12SMichal Kazior 
470d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
471d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_start_request_cmdid);
472d7579d12SMichal Kazior }
473d7579d12SMichal Kazior 
474d7579d12SMichal Kazior static inline int
475d7579d12SMichal Kazior ath10k_wmi_vdev_restart(struct ath10k *ar,
476d7579d12SMichal Kazior 			const struct wmi_vdev_start_request_arg *arg)
477d7579d12SMichal Kazior {
478d7579d12SMichal Kazior 	struct sk_buff *skb;
479d7579d12SMichal Kazior 
480d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_start)
481d7579d12SMichal Kazior 		return -EOPNOTSUPP;
482d7579d12SMichal Kazior 
483d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_start(ar, arg, true);
484d7579d12SMichal Kazior 	if (IS_ERR(skb))
485d7579d12SMichal Kazior 		return PTR_ERR(skb);
486d7579d12SMichal Kazior 
487d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
488d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_restart_request_cmdid);
489d7579d12SMichal Kazior }
490d7579d12SMichal Kazior 
491d7579d12SMichal Kazior static inline int
492d7579d12SMichal Kazior ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
493d7579d12SMichal Kazior {
494d7579d12SMichal Kazior 	struct sk_buff *skb;
495d7579d12SMichal Kazior 
496d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_stop)
497d7579d12SMichal Kazior 		return -EOPNOTSUPP;
498d7579d12SMichal Kazior 
499d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id);
500d7579d12SMichal Kazior 	if (IS_ERR(skb))
501d7579d12SMichal Kazior 		return PTR_ERR(skb);
502d7579d12SMichal Kazior 
503d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);
504d7579d12SMichal Kazior }
505d7579d12SMichal Kazior 
506d7579d12SMichal Kazior static inline int
507d7579d12SMichal Kazior ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
508d7579d12SMichal Kazior {
509d7579d12SMichal Kazior 	struct sk_buff *skb;
510d7579d12SMichal Kazior 
511d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_up)
512d7579d12SMichal Kazior 		return -EOPNOTSUPP;
513d7579d12SMichal Kazior 
514d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid);
515d7579d12SMichal Kazior 	if (IS_ERR(skb))
516d7579d12SMichal Kazior 		return PTR_ERR(skb);
517d7579d12SMichal Kazior 
518d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);
519d7579d12SMichal Kazior }
520d7579d12SMichal Kazior 
521d7579d12SMichal Kazior static inline int
522d7579d12SMichal Kazior ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
523d7579d12SMichal Kazior {
524d7579d12SMichal Kazior 	struct sk_buff *skb;
525d7579d12SMichal Kazior 
526d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_down)
527d7579d12SMichal Kazior 		return -EOPNOTSUPP;
528d7579d12SMichal Kazior 
529d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id);
530d7579d12SMichal Kazior 	if (IS_ERR(skb))
531d7579d12SMichal Kazior 		return PTR_ERR(skb);
532d7579d12SMichal Kazior 
533d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
534d7579d12SMichal Kazior }
535d7579d12SMichal Kazior 
536d7579d12SMichal Kazior static inline int
537d7579d12SMichal Kazior ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id,
538d7579d12SMichal Kazior 			  u32 param_value)
539d7579d12SMichal Kazior {
540d7579d12SMichal Kazior 	struct sk_buff *skb;
541d7579d12SMichal Kazior 
542d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_set_param)
543d7579d12SMichal Kazior 		return -EOPNOTSUPP;
544d7579d12SMichal Kazior 
545d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id,
546d7579d12SMichal Kazior 					      param_value);
547d7579d12SMichal Kazior 	if (IS_ERR(skb))
548d7579d12SMichal Kazior 		return PTR_ERR(skb);
549d7579d12SMichal Kazior 
550d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
551d7579d12SMichal Kazior }
552d7579d12SMichal Kazior 
553d7579d12SMichal Kazior static inline int
554d7579d12SMichal Kazior ath10k_wmi_vdev_install_key(struct ath10k *ar,
555d7579d12SMichal Kazior 			    const struct wmi_vdev_install_key_arg *arg)
556d7579d12SMichal Kazior {
557d7579d12SMichal Kazior 	struct sk_buff *skb;
558d7579d12SMichal Kazior 
559d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_install_key)
560d7579d12SMichal Kazior 		return -EOPNOTSUPP;
561d7579d12SMichal Kazior 
562d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_install_key(ar, arg);
563d7579d12SMichal Kazior 	if (IS_ERR(skb))
564d7579d12SMichal Kazior 		return PTR_ERR(skb);
565d7579d12SMichal Kazior 
566d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
567d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_install_key_cmdid);
568d7579d12SMichal Kazior }
569d7579d12SMichal Kazior 
570d7579d12SMichal Kazior static inline int
571d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,
572d7579d12SMichal Kazior 			      const struct wmi_vdev_spectral_conf_arg *arg)
573d7579d12SMichal Kazior {
574d7579d12SMichal Kazior 	struct sk_buff *skb;
575d7579d12SMichal Kazior 	u32 cmd_id;
576d7579d12SMichal Kazior 
577d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg);
578d7579d12SMichal Kazior 	if (IS_ERR(skb))
579d7579d12SMichal Kazior 		return PTR_ERR(skb);
580d7579d12SMichal Kazior 
581d7579d12SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid;
582d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
583d7579d12SMichal Kazior }
584d7579d12SMichal Kazior 
585d7579d12SMichal Kazior static inline int
586d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,
587d7579d12SMichal Kazior 				u32 enable)
588d7579d12SMichal Kazior {
589d7579d12SMichal Kazior 	struct sk_buff *skb;
590d7579d12SMichal Kazior 	u32 cmd_id;
591d7579d12SMichal Kazior 
592d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger,
593d7579d12SMichal Kazior 						    enable);
594d7579d12SMichal Kazior 	if (IS_ERR(skb))
595d7579d12SMichal Kazior 		return PTR_ERR(skb);
596d7579d12SMichal Kazior 
597d7579d12SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid;
598d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
599d7579d12SMichal Kazior }
600d7579d12SMichal Kazior 
601d7579d12SMichal Kazior static inline int
6020c7e477cSJanusz Dziedzic ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id,
6030c7e477cSJanusz Dziedzic 			  const u8 peer_addr[ETH_ALEN],
6040c7e477cSJanusz Dziedzic 			  const struct wmi_sta_uapsd_auto_trig_arg *args,
6050c7e477cSJanusz Dziedzic 			  u32 num_ac)
6060c7e477cSJanusz Dziedzic {
6070c7e477cSJanusz Dziedzic 	struct sk_buff *skb;
6080c7e477cSJanusz Dziedzic 	u32 cmd_id;
6090c7e477cSJanusz Dziedzic 
6100c7e477cSJanusz Dziedzic 	if (!ar->wmi.ops->gen_vdev_sta_uapsd)
6110c7e477cSJanusz Dziedzic 		return -EOPNOTSUPP;
6120c7e477cSJanusz Dziedzic 
6130c7e477cSJanusz Dziedzic 	skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args,
6140c7e477cSJanusz Dziedzic 					      num_ac);
6150c7e477cSJanusz Dziedzic 	if (IS_ERR(skb))
6160c7e477cSJanusz Dziedzic 		return PTR_ERR(skb);
6170c7e477cSJanusz Dziedzic 
6180c7e477cSJanusz Dziedzic 	cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid;
6190c7e477cSJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
6200c7e477cSJanusz Dziedzic }
6210c7e477cSJanusz Dziedzic 
6220c7e477cSJanusz Dziedzic static inline int
6236d492fe2SMichal Kazior ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,
6246d492fe2SMichal Kazior 			 const struct wmi_wmm_params_all_arg *arg)
6256d492fe2SMichal Kazior {
6266d492fe2SMichal Kazior 	struct sk_buff *skb;
6276d492fe2SMichal Kazior 	u32 cmd_id;
6286d492fe2SMichal Kazior 
6296d492fe2SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg);
6306d492fe2SMichal Kazior 	if (IS_ERR(skb))
6316d492fe2SMichal Kazior 		return PTR_ERR(skb);
6326d492fe2SMichal Kazior 
6336d492fe2SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid;
6346d492fe2SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
6356d492fe2SMichal Kazior }
6366d492fe2SMichal Kazior 
6376d492fe2SMichal Kazior static inline int
638d7579d12SMichal Kazior ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
639d7579d12SMichal Kazior 		       const u8 peer_addr[ETH_ALEN])
640d7579d12SMichal Kazior {
641d7579d12SMichal Kazior 	struct sk_buff *skb;
642d7579d12SMichal Kazior 
643d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_create)
644d7579d12SMichal Kazior 		return -EOPNOTSUPP;
645d7579d12SMichal Kazior 
646d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr);
647d7579d12SMichal Kazior 	if (IS_ERR(skb))
648d7579d12SMichal Kazior 		return PTR_ERR(skb);
649d7579d12SMichal Kazior 
650d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
651d7579d12SMichal Kazior }
652d7579d12SMichal Kazior 
653d7579d12SMichal Kazior static inline int
654d7579d12SMichal Kazior ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
655d7579d12SMichal Kazior 		       const u8 peer_addr[ETH_ALEN])
656d7579d12SMichal Kazior {
657d7579d12SMichal Kazior 	struct sk_buff *skb;
658d7579d12SMichal Kazior 
659d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_delete)
660d7579d12SMichal Kazior 		return -EOPNOTSUPP;
661d7579d12SMichal Kazior 
662d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr);
663d7579d12SMichal Kazior 	if (IS_ERR(skb))
664d7579d12SMichal Kazior 		return PTR_ERR(skb);
665d7579d12SMichal Kazior 
666d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);
667d7579d12SMichal Kazior }
668d7579d12SMichal Kazior 
669d7579d12SMichal Kazior static inline int
670d7579d12SMichal Kazior ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
671d7579d12SMichal Kazior 		      const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
672d7579d12SMichal Kazior {
673d7579d12SMichal Kazior 	struct sk_buff *skb;
674d7579d12SMichal Kazior 
675d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_flush)
676d7579d12SMichal Kazior 		return -EOPNOTSUPP;
677d7579d12SMichal Kazior 
678d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap);
679d7579d12SMichal Kazior 	if (IS_ERR(skb))
680d7579d12SMichal Kazior 		return PTR_ERR(skb);
681d7579d12SMichal Kazior 
682d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
683d7579d12SMichal Kazior }
684d7579d12SMichal Kazior 
685d7579d12SMichal Kazior static inline int
686d7579d12SMichal Kazior ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr,
687d7579d12SMichal Kazior 			  enum wmi_peer_param param_id, u32 param_value)
688d7579d12SMichal Kazior {
689d7579d12SMichal Kazior 	struct sk_buff *skb;
690d7579d12SMichal Kazior 
691d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_set_param)
692d7579d12SMichal Kazior 		return -EOPNOTSUPP;
693d7579d12SMichal Kazior 
694d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id,
695d7579d12SMichal Kazior 					      param_value);
696d7579d12SMichal Kazior 	if (IS_ERR(skb))
697d7579d12SMichal Kazior 		return PTR_ERR(skb);
698d7579d12SMichal Kazior 
699d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
700d7579d12SMichal Kazior }
701d7579d12SMichal Kazior 
702d7579d12SMichal Kazior static inline int
703d7579d12SMichal Kazior ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
704d7579d12SMichal Kazior 		      enum wmi_sta_ps_mode psmode)
705d7579d12SMichal Kazior {
706d7579d12SMichal Kazior 	struct sk_buff *skb;
707d7579d12SMichal Kazior 
708d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_psmode)
709d7579d12SMichal Kazior 		return -EOPNOTSUPP;
710d7579d12SMichal Kazior 
711d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode);
712d7579d12SMichal Kazior 	if (IS_ERR(skb))
713d7579d12SMichal Kazior 		return PTR_ERR(skb);
714d7579d12SMichal Kazior 
715d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
716d7579d12SMichal Kazior 				   ar->wmi.cmd->sta_powersave_mode_cmdid);
717d7579d12SMichal Kazior }
718d7579d12SMichal Kazior 
719d7579d12SMichal Kazior static inline int
720d7579d12SMichal Kazior ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
721d7579d12SMichal Kazior 			    enum wmi_sta_powersave_param param_id, u32 value)
722d7579d12SMichal Kazior {
723d7579d12SMichal Kazior 	struct sk_buff *skb;
724d7579d12SMichal Kazior 
725d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_sta_ps)
726d7579d12SMichal Kazior 		return -EOPNOTSUPP;
727d7579d12SMichal Kazior 
728d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value);
729d7579d12SMichal Kazior 	if (IS_ERR(skb))
730d7579d12SMichal Kazior 		return PTR_ERR(skb);
731d7579d12SMichal Kazior 
732d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
733d7579d12SMichal Kazior 				   ar->wmi.cmd->sta_powersave_param_cmdid);
734d7579d12SMichal Kazior }
735d7579d12SMichal Kazior 
736d7579d12SMichal Kazior static inline int
737d7579d12SMichal Kazior ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
738d7579d12SMichal Kazior 			   enum wmi_ap_ps_peer_param param_id, u32 value)
739d7579d12SMichal Kazior {
740d7579d12SMichal Kazior 	struct sk_buff *skb;
741d7579d12SMichal Kazior 
742d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_ap_ps)
743d7579d12SMichal Kazior 		return -EOPNOTSUPP;
744d7579d12SMichal Kazior 
745d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value);
746d7579d12SMichal Kazior 	if (IS_ERR(skb))
747d7579d12SMichal Kazior 		return PTR_ERR(skb);
748d7579d12SMichal Kazior 
749d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
750d7579d12SMichal Kazior 				   ar->wmi.cmd->ap_ps_peer_param_cmdid);
751d7579d12SMichal Kazior }
752d7579d12SMichal Kazior 
753d7579d12SMichal Kazior static inline int
754d7579d12SMichal Kazior ath10k_wmi_scan_chan_list(struct ath10k *ar,
755d7579d12SMichal Kazior 			  const struct wmi_scan_chan_list_arg *arg)
756d7579d12SMichal Kazior {
757d7579d12SMichal Kazior 	struct sk_buff *skb;
758d7579d12SMichal Kazior 
759d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_scan_chan_list)
760d7579d12SMichal Kazior 		return -EOPNOTSUPP;
761d7579d12SMichal Kazior 
762d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_scan_chan_list(ar, arg);
763d7579d12SMichal Kazior 	if (IS_ERR(skb))
764d7579d12SMichal Kazior 		return PTR_ERR(skb);
765d7579d12SMichal Kazior 
766d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
767d7579d12SMichal Kazior }
768d7579d12SMichal Kazior 
769d7579d12SMichal Kazior static inline int
770d7579d12SMichal Kazior ath10k_wmi_peer_assoc(struct ath10k *ar,
771d7579d12SMichal Kazior 		      const struct wmi_peer_assoc_complete_arg *arg)
772d7579d12SMichal Kazior {
773d7579d12SMichal Kazior 	struct sk_buff *skb;
774d7579d12SMichal Kazior 
775d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_assoc)
776d7579d12SMichal Kazior 		return -EOPNOTSUPP;
777d7579d12SMichal Kazior 
778d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_assoc(ar, arg);
779d7579d12SMichal Kazior 	if (IS_ERR(skb))
780d7579d12SMichal Kazior 		return PTR_ERR(skb);
781d7579d12SMichal Kazior 
782d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
783d7579d12SMichal Kazior }
784d7579d12SMichal Kazior 
785d7579d12SMichal Kazior static inline int
7869ad50182SMichal Kazior ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id,
7879ad50182SMichal Kazior 				  const void *bcn, size_t bcn_len,
7889ad50182SMichal Kazior 				  u32 bcn_paddr, bool dtim_zero,
7899ad50182SMichal Kazior 				  bool deliver_cab)
790d7579d12SMichal Kazior {
791d7579d12SMichal Kazior 	struct sk_buff *skb;
792d7579d12SMichal Kazior 	int ret;
793d7579d12SMichal Kazior 
794d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_beacon_dma)
795d7579d12SMichal Kazior 		return -EOPNOTSUPP;
796d7579d12SMichal Kazior 
7979ad50182SMichal Kazior 	skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr,
7989ad50182SMichal Kazior 					  dtim_zero, deliver_cab);
799d7579d12SMichal Kazior 	if (IS_ERR(skb))
800d7579d12SMichal Kazior 		return PTR_ERR(skb);
801d7579d12SMichal Kazior 
802d7579d12SMichal Kazior 	ret = ath10k_wmi_cmd_send_nowait(ar, skb,
803d7579d12SMichal Kazior 					 ar->wmi.cmd->pdev_send_bcn_cmdid);
804d7579d12SMichal Kazior 	if (ret) {
805d7579d12SMichal Kazior 		dev_kfree_skb(skb);
806d7579d12SMichal Kazior 		return ret;
807d7579d12SMichal Kazior 	}
808d7579d12SMichal Kazior 
809d7579d12SMichal Kazior 	return 0;
810d7579d12SMichal Kazior }
811d7579d12SMichal Kazior 
812d7579d12SMichal Kazior static inline int
813d7579d12SMichal Kazior ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
8145e752e42SMichal Kazior 			       const struct wmi_wmm_params_all_arg *arg)
815d7579d12SMichal Kazior {
816d7579d12SMichal Kazior 	struct sk_buff *skb;
817d7579d12SMichal Kazior 
818d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_wmm)
819d7579d12SMichal Kazior 		return -EOPNOTSUPP;
820d7579d12SMichal Kazior 
821d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg);
822d7579d12SMichal Kazior 	if (IS_ERR(skb))
823d7579d12SMichal Kazior 		return PTR_ERR(skb);
824d7579d12SMichal Kazior 
825d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
826d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_set_wmm_params_cmdid);
827d7579d12SMichal Kazior }
828d7579d12SMichal Kazior 
829d7579d12SMichal Kazior static inline int
830de23d3efSMichal Kazior ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask)
831d7579d12SMichal Kazior {
832d7579d12SMichal Kazior 	struct sk_buff *skb;
833d7579d12SMichal Kazior 
834d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_request_stats)
835d7579d12SMichal Kazior 		return -EOPNOTSUPP;
836d7579d12SMichal Kazior 
837de23d3efSMichal Kazior 	skb = ar->wmi.ops->gen_request_stats(ar, stats_mask);
838d7579d12SMichal Kazior 	if (IS_ERR(skb))
839d7579d12SMichal Kazior 		return PTR_ERR(skb);
840d7579d12SMichal Kazior 
841d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
842d7579d12SMichal Kazior }
843d7579d12SMichal Kazior 
844d7579d12SMichal Kazior static inline int
845d7579d12SMichal Kazior ath10k_wmi_force_fw_hang(struct ath10k *ar,
846d7579d12SMichal Kazior 			 enum wmi_force_fw_hang_type type, u32 delay_ms)
847d7579d12SMichal Kazior {
848d7579d12SMichal Kazior 	struct sk_buff *skb;
849d7579d12SMichal Kazior 
850d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_force_fw_hang)
851d7579d12SMichal Kazior 		return -EOPNOTSUPP;
852d7579d12SMichal Kazior 
853d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms);
854d7579d12SMichal Kazior 	if (IS_ERR(skb))
855d7579d12SMichal Kazior 		return PTR_ERR(skb);
856d7579d12SMichal Kazior 
857d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
858d7579d12SMichal Kazior }
859d7579d12SMichal Kazior 
860d7579d12SMichal Kazior static inline int
861467210a6SSenthilKumar Jegadeesan ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level)
862d7579d12SMichal Kazior {
863d7579d12SMichal Kazior 	struct sk_buff *skb;
864d7579d12SMichal Kazior 
865d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_dbglog_cfg)
866d7579d12SMichal Kazior 		return -EOPNOTSUPP;
867d7579d12SMichal Kazior 
868467210a6SSenthilKumar Jegadeesan 	skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level);
869d7579d12SMichal Kazior 	if (IS_ERR(skb))
870d7579d12SMichal Kazior 		return PTR_ERR(skb);
871d7579d12SMichal Kazior 
872d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);
873d7579d12SMichal Kazior }
874d7579d12SMichal Kazior 
875d7579d12SMichal Kazior static inline int
876d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter)
877d7579d12SMichal Kazior {
878d7579d12SMichal Kazior 	struct sk_buff *skb;
879d7579d12SMichal Kazior 
880d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pktlog_enable)
881d7579d12SMichal Kazior 		return -EOPNOTSUPP;
882d7579d12SMichal Kazior 
883d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pktlog_enable(ar, filter);
884d7579d12SMichal Kazior 	if (IS_ERR(skb))
885d7579d12SMichal Kazior 		return PTR_ERR(skb);
886d7579d12SMichal Kazior 
887d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid);
888d7579d12SMichal Kazior }
889d7579d12SMichal Kazior 
890d7579d12SMichal Kazior static inline int
891d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar)
892d7579d12SMichal Kazior {
893d7579d12SMichal Kazior 	struct sk_buff *skb;
894d7579d12SMichal Kazior 
895d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pktlog_disable)
896d7579d12SMichal Kazior 		return -EOPNOTSUPP;
897d7579d12SMichal Kazior 
898d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pktlog_disable(ar);
899d7579d12SMichal Kazior 	if (IS_ERR(skb))
900d7579d12SMichal Kazior 		return PTR_ERR(skb);
901d7579d12SMichal Kazior 
902d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
903d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_pktlog_disable_cmdid);
904d7579d12SMichal Kazior }
905d7579d12SMichal Kazior 
906ffdd738dSRajkumar Manoharan static inline int
907ffdd738dSRajkumar Manoharan ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration,
908ffdd738dSRajkumar Manoharan 			       u32 next_offset, u32 enabled)
909ffdd738dSRajkumar Manoharan {
910ffdd738dSRajkumar Manoharan 	struct sk_buff *skb;
911ffdd738dSRajkumar Manoharan 
912ffdd738dSRajkumar Manoharan 	if (!ar->wmi.ops->gen_pdev_set_quiet_mode)
913ffdd738dSRajkumar Manoharan 		return -EOPNOTSUPP;
914ffdd738dSRajkumar Manoharan 
915ffdd738dSRajkumar Manoharan 	skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration,
916ffdd738dSRajkumar Manoharan 						   next_offset, enabled);
917ffdd738dSRajkumar Manoharan 	if (IS_ERR(skb))
918ffdd738dSRajkumar Manoharan 		return PTR_ERR(skb);
919ffdd738dSRajkumar Manoharan 
920ffdd738dSRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
921ffdd738dSRajkumar Manoharan 				   ar->wmi.cmd->pdev_set_quiet_mode_cmdid);
922ffdd738dSRajkumar Manoharan }
923ffdd738dSRajkumar Manoharan 
924a57a6a27SRajkumar Manoharan static inline int
925a57a6a27SRajkumar Manoharan ath10k_wmi_pdev_get_temperature(struct ath10k *ar)
926a57a6a27SRajkumar Manoharan {
927a57a6a27SRajkumar Manoharan 	struct sk_buff *skb;
928a57a6a27SRajkumar Manoharan 
929a57a6a27SRajkumar Manoharan 	if (!ar->wmi.ops->gen_pdev_get_temperature)
930a57a6a27SRajkumar Manoharan 		return -EOPNOTSUPP;
931a57a6a27SRajkumar Manoharan 
932a57a6a27SRajkumar Manoharan 	skb = ar->wmi.ops->gen_pdev_get_temperature(ar);
933a57a6a27SRajkumar Manoharan 	if (IS_ERR(skb))
934a57a6a27SRajkumar Manoharan 		return PTR_ERR(skb);
935a57a6a27SRajkumar Manoharan 
936a57a6a27SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
937a57a6a27SRajkumar Manoharan 				   ar->wmi.cmd->pdev_get_temperature_cmdid);
938a57a6a27SRajkumar Manoharan }
939a57a6a27SRajkumar Manoharan 
940dc8ab278SRajkumar Manoharan static inline int
941dc8ab278SRajkumar Manoharan ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac)
942dc8ab278SRajkumar Manoharan {
943dc8ab278SRajkumar Manoharan 	struct sk_buff *skb;
944dc8ab278SRajkumar Manoharan 
945dc8ab278SRajkumar Manoharan 	if (!ar->wmi.ops->gen_addba_clear_resp)
946dc8ab278SRajkumar Manoharan 		return -EOPNOTSUPP;
947dc8ab278SRajkumar Manoharan 
948dc8ab278SRajkumar Manoharan 	skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac);
949dc8ab278SRajkumar Manoharan 	if (IS_ERR(skb))
950dc8ab278SRajkumar Manoharan 		return PTR_ERR(skb);
951dc8ab278SRajkumar Manoharan 
952dc8ab278SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
953dc8ab278SRajkumar Manoharan 				   ar->wmi.cmd->addba_clear_resp_cmdid);
954dc8ab278SRajkumar Manoharan }
955dc8ab278SRajkumar Manoharan 
95665c0893dSRajkumar Manoharan static inline int
95765c0893dSRajkumar Manoharan ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
95865c0893dSRajkumar Manoharan 		      u32 tid, u32 buf_size)
95965c0893dSRajkumar Manoharan {
96065c0893dSRajkumar Manoharan 	struct sk_buff *skb;
96165c0893dSRajkumar Manoharan 
96265c0893dSRajkumar Manoharan 	if (!ar->wmi.ops->gen_addba_send)
96365c0893dSRajkumar Manoharan 		return -EOPNOTSUPP;
96465c0893dSRajkumar Manoharan 
96565c0893dSRajkumar Manoharan 	skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size);
96665c0893dSRajkumar Manoharan 	if (IS_ERR(skb))
96765c0893dSRajkumar Manoharan 		return PTR_ERR(skb);
96865c0893dSRajkumar Manoharan 
96965c0893dSRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
97065c0893dSRajkumar Manoharan 				   ar->wmi.cmd->addba_send_cmdid);
97165c0893dSRajkumar Manoharan }
97265c0893dSRajkumar Manoharan 
97311597413SRajkumar Manoharan static inline int
97411597413SRajkumar Manoharan ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
97511597413SRajkumar Manoharan 			  u32 tid, u32 status)
97611597413SRajkumar Manoharan {
97711597413SRajkumar Manoharan 	struct sk_buff *skb;
97811597413SRajkumar Manoharan 
97911597413SRajkumar Manoharan 	if (!ar->wmi.ops->gen_addba_set_resp)
98011597413SRajkumar Manoharan 		return -EOPNOTSUPP;
98111597413SRajkumar Manoharan 
98211597413SRajkumar Manoharan 	skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status);
98311597413SRajkumar Manoharan 	if (IS_ERR(skb))
98411597413SRajkumar Manoharan 		return PTR_ERR(skb);
98511597413SRajkumar Manoharan 
98611597413SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
98711597413SRajkumar Manoharan 				   ar->wmi.cmd->addba_set_resp_cmdid);
98811597413SRajkumar Manoharan }
98911597413SRajkumar Manoharan 
99050abef85SRajkumar Manoharan static inline int
99150abef85SRajkumar Manoharan ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
99250abef85SRajkumar Manoharan 		      u32 tid, u32 initiator, u32 reason)
99350abef85SRajkumar Manoharan {
99450abef85SRajkumar Manoharan 	struct sk_buff *skb;
99550abef85SRajkumar Manoharan 
99650abef85SRajkumar Manoharan 	if (!ar->wmi.ops->gen_delba_send)
99750abef85SRajkumar Manoharan 		return -EOPNOTSUPP;
99850abef85SRajkumar Manoharan 
99950abef85SRajkumar Manoharan 	skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator,
100050abef85SRajkumar Manoharan 					  reason);
100150abef85SRajkumar Manoharan 	if (IS_ERR(skb))
100250abef85SRajkumar Manoharan 		return PTR_ERR(skb);
100350abef85SRajkumar Manoharan 
100450abef85SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
100550abef85SRajkumar Manoharan 				   ar->wmi.cmd->delba_send_cmdid);
100650abef85SRajkumar Manoharan }
100750abef85SRajkumar Manoharan 
1008be9ce9d8SMichal Kazior static inline int
1009be9ce9d8SMichal Kazior ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset,
1010be9ce9d8SMichal Kazior 		    struct sk_buff *bcn, u32 prb_caps, u32 prb_erp,
1011be9ce9d8SMichal Kazior 		    void *prb_ies, size_t prb_ies_len)
1012be9ce9d8SMichal Kazior {
1013be9ce9d8SMichal Kazior 	struct sk_buff *skb;
1014be9ce9d8SMichal Kazior 
1015be9ce9d8SMichal Kazior 	if (!ar->wmi.ops->gen_bcn_tmpl)
1016be9ce9d8SMichal Kazior 		return -EOPNOTSUPP;
1017be9ce9d8SMichal Kazior 
1018be9ce9d8SMichal Kazior 	skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn,
1019be9ce9d8SMichal Kazior 					prb_caps, prb_erp, prb_ies,
1020be9ce9d8SMichal Kazior 					prb_ies_len);
1021be9ce9d8SMichal Kazior 	if (IS_ERR(skb))
1022be9ce9d8SMichal Kazior 		return PTR_ERR(skb);
1023be9ce9d8SMichal Kazior 
1024be9ce9d8SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid);
1025be9ce9d8SMichal Kazior }
1026be9ce9d8SMichal Kazior 
10274c4955feSMichal Kazior static inline int
10284c4955feSMichal Kazior ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb)
10294c4955feSMichal Kazior {
10304c4955feSMichal Kazior 	struct sk_buff *skb;
10314c4955feSMichal Kazior 
10324c4955feSMichal Kazior 	if (!ar->wmi.ops->gen_prb_tmpl)
10334c4955feSMichal Kazior 		return -EOPNOTSUPP;
10344c4955feSMichal Kazior 
10354c4955feSMichal Kazior 	skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb);
10364c4955feSMichal Kazior 	if (IS_ERR(skb))
10374c4955feSMichal Kazior 		return PTR_ERR(skb);
10384c4955feSMichal Kazior 
10394c4955feSMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid);
10404c4955feSMichal Kazior }
10414c4955feSMichal Kazior 
1042369242b4SMichal Kazior static inline int
1043369242b4SMichal Kazior ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie)
1044369242b4SMichal Kazior {
1045369242b4SMichal Kazior 	struct sk_buff *skb;
1046369242b4SMichal Kazior 
1047369242b4SMichal Kazior 	if (!ar->wmi.ops->gen_p2p_go_bcn_ie)
1048369242b4SMichal Kazior 		return -EOPNOTSUPP;
1049369242b4SMichal Kazior 
1050369242b4SMichal Kazior 	skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie);
1051369242b4SMichal Kazior 	if (IS_ERR(skb))
1052369242b4SMichal Kazior 		return PTR_ERR(skb);
1053369242b4SMichal Kazior 
1054369242b4SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie);
1055369242b4SMichal Kazior }
1056369242b4SMichal Kazior 
10576e8b188bSJanusz Dziedzic static inline int
10586e8b188bSJanusz Dziedzic ath10k_wmi_sta_keepalive(struct ath10k *ar,
10596e8b188bSJanusz Dziedzic 			 const struct wmi_sta_keepalive_arg *arg)
10606e8b188bSJanusz Dziedzic {
10616e8b188bSJanusz Dziedzic 	struct sk_buff *skb;
10626e8b188bSJanusz Dziedzic 	u32 cmd_id;
10636e8b188bSJanusz Dziedzic 
10646e8b188bSJanusz Dziedzic 	if (!ar->wmi.ops->gen_sta_keepalive)
10656e8b188bSJanusz Dziedzic 		return -EOPNOTSUPP;
10666e8b188bSJanusz Dziedzic 
10676e8b188bSJanusz Dziedzic 	skb = ar->wmi.ops->gen_sta_keepalive(ar, arg);
10686e8b188bSJanusz Dziedzic 	if (IS_ERR(skb))
10696e8b188bSJanusz Dziedzic 		return PTR_ERR(skb);
10706e8b188bSJanusz Dziedzic 
10716e8b188bSJanusz Dziedzic 	cmd_id = ar->wmi.cmd->sta_keepalive_cmd;
10726e8b188bSJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
10736e8b188bSJanusz Dziedzic }
10746e8b188bSJanusz Dziedzic 
1075d7579d12SMichal Kazior #endif
1076