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);
40991adf71SRaja Mani 	int (*pull_phyerr_hdr)(struct ath10k *ar, struct sk_buff *skb,
41991adf71SRaja Mani 			       struct wmi_phyerr_hdr_arg *arg);
42991adf71SRaja Mani 	int (*pull_phyerr)(struct ath10k *ar, const void *phyerr_buf,
43991adf71SRaja Mani 			   int left_len, struct wmi_phyerr_ev_arg *arg);
44d7579d12SMichal Kazior 	int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb,
45d7579d12SMichal Kazior 			    struct wmi_svc_rdy_ev_arg *arg);
46d7579d12SMichal Kazior 	int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb,
47d7579d12SMichal Kazior 			struct wmi_rdy_ev_arg *arg);
48d7579d12SMichal Kazior 	int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb,
49d7579d12SMichal Kazior 			     struct ath10k_fw_stats *stats);
50c1a4654aSMichal Kazior 	int (*pull_roam_ev)(struct ath10k *ar, struct sk_buff *skb,
51c1a4654aSMichal Kazior 			    struct wmi_roam_ev_arg *arg);
52f5431e87SJanusz Dziedzic 	int (*pull_wow_event)(struct ath10k *ar, struct sk_buff *skb,
53f5431e87SJanusz Dziedzic 			      struct wmi_wow_ev_arg *arg);
5408e75ea8SVivek Natarajan 	enum wmi_txbf_conf (*get_txbf_conf_scheme)(struct ath10k *ar);
55d7579d12SMichal Kazior 
56d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);
57d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);
58d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,
59d7579d12SMichal Kazior 					   u16 rd5g, u16 ctl2g, u16 ctl5g,
60d7579d12SMichal Kazior 					   enum wmi_dfs_region dfs_reg);
61d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id,
62d7579d12SMichal Kazior 					      u32 value);
63d7579d12SMichal Kazior 	struct sk_buff *(*gen_init)(struct ath10k *ar);
64d7579d12SMichal Kazior 	struct sk_buff *(*gen_start_scan)(struct ath10k *ar,
65d7579d12SMichal Kazior 					  const struct wmi_start_scan_arg *arg);
66d7579d12SMichal Kazior 	struct sk_buff *(*gen_stop_scan)(struct ath10k *ar,
67d7579d12SMichal Kazior 					 const struct wmi_stop_scan_arg *arg);
68d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id,
69d7579d12SMichal Kazior 					   enum wmi_vdev_type type,
70d7579d12SMichal Kazior 					   enum wmi_vdev_subtype subtype,
71d7579d12SMichal Kazior 					   const u8 macaddr[ETH_ALEN]);
72d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id);
73d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_start)(struct ath10k *ar,
74d7579d12SMichal Kazior 					  const struct wmi_vdev_start_request_arg *arg,
75d7579d12SMichal Kazior 					  bool restart);
76d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id);
77d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid,
78d7579d12SMichal Kazior 				       const u8 *bssid);
79d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id);
80d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id,
81d7579d12SMichal Kazior 					      u32 param_id, u32 param_value);
82d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar,
83d7579d12SMichal Kazior 						const struct wmi_vdev_install_key_arg *arg);
84d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar,
85d7579d12SMichal Kazior 						  const struct wmi_vdev_spectral_conf_arg *arg);
86d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id,
87d7579d12SMichal Kazior 						    u32 trigger, u32 enable);
886d492fe2SMichal Kazior 	struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id,
896d492fe2SMichal Kazior 					     const struct wmi_wmm_params_all_arg *arg);
90d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id,
917390ed34SMarek Puzyniak 					   const u8 peer_addr[ETH_ALEN],
927390ed34SMarek Puzyniak 					   enum wmi_peer_type peer_type);
93d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id,
94d7579d12SMichal Kazior 					   const u8 peer_addr[ETH_ALEN]);
95d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id,
96d7579d12SMichal Kazior 					  const u8 peer_addr[ETH_ALEN],
97d7579d12SMichal Kazior 					  u32 tid_bitmap);
98d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id,
99d7579d12SMichal Kazior 					      const u8 *peer_addr,
100d7579d12SMichal Kazior 					      enum wmi_peer_param param_id,
101d7579d12SMichal Kazior 					      u32 param_value);
102d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar,
103d7579d12SMichal Kazior 					  const struct wmi_peer_assoc_complete_arg *arg);
104d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id,
105d7579d12SMichal Kazior 					  enum wmi_sta_ps_mode psmode);
106d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id,
107d7579d12SMichal Kazior 					  enum wmi_sta_powersave_param param_id,
108d7579d12SMichal Kazior 					  u32 value);
109d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id,
110d7579d12SMichal Kazior 					 const u8 *mac,
111d7579d12SMichal Kazior 					 enum wmi_ap_ps_peer_param param_id,
112d7579d12SMichal Kazior 					 u32 value);
113d7579d12SMichal Kazior 	struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar,
114d7579d12SMichal Kazior 					      const struct wmi_scan_chan_list_arg *arg);
1159ad50182SMichal Kazior 	struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id,
1169ad50182SMichal Kazior 					  const void *bcn, size_t bcn_len,
1179ad50182SMichal Kazior 					  u32 bcn_paddr, bool dtim_zero,
1189ad50182SMichal Kazior 					  bool deliver_cab);
119d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
1205e752e42SMichal Kazior 					    const struct wmi_wmm_params_all_arg *arg);
121de23d3efSMichal Kazior 	struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask);
122d7579d12SMichal Kazior 	struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
123d7579d12SMichal Kazior 					     enum wmi_force_fw_hang_type type,
124d7579d12SMichal Kazior 					     u32 delay_ms);
125d7579d12SMichal Kazior 	struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);
126467210a6SSenthilKumar Jegadeesan 	struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable,
127467210a6SSenthilKumar Jegadeesan 					  u32 log_level);
128d7579d12SMichal Kazior 	struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);
129d7579d12SMichal Kazior 	struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);
130ffdd738dSRajkumar Manoharan 	struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,
131ffdd738dSRajkumar Manoharan 						   u32 period, u32 duration,
132ffdd738dSRajkumar Manoharan 						   u32 next_offset,
133ffdd738dSRajkumar Manoharan 						   u32 enabled);
134a57a6a27SRajkumar Manoharan 	struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar);
135dc8ab278SRajkumar Manoharan 	struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id,
136dc8ab278SRajkumar Manoharan 						const u8 *mac);
13765c0893dSRajkumar Manoharan 	struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id,
13865c0893dSRajkumar Manoharan 					  const u8 *mac, u32 tid, u32 buf_size);
13911597413SRajkumar Manoharan 	struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id,
14011597413SRajkumar Manoharan 					      const u8 *mac, u32 tid,
14111597413SRajkumar Manoharan 					      u32 status);
14250abef85SRajkumar Manoharan 	struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id,
14350abef85SRajkumar Manoharan 					  const u8 *mac, u32 tid, u32 initiator,
14450abef85SRajkumar Manoharan 					  u32 reason);
145be9ce9d8SMichal Kazior 	struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id,
146be9ce9d8SMichal Kazior 					u32 tim_ie_offset, struct sk_buff *bcn,
147be9ce9d8SMichal Kazior 					u32 prb_caps, u32 prb_erp,
148be9ce9d8SMichal Kazior 					void *prb_ies, size_t prb_ies_len);
1494c4955feSMichal Kazior 	struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id,
1504c4955feSMichal Kazior 					struct sk_buff *bcn);
151369242b4SMichal Kazior 	struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id,
152369242b4SMichal Kazior 					     const u8 *p2p_ie);
1530c7e477cSJanusz Dziedzic 	struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id,
1540c7e477cSJanusz Dziedzic 					      const u8 peer_addr[ETH_ALEN],
1550c7e477cSJanusz Dziedzic 					      const struct wmi_sta_uapsd_auto_trig_arg *args,
1560c7e477cSJanusz Dziedzic 					      u32 num_ac);
1576e8b188bSJanusz Dziedzic 	struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar,
1586e8b188bSJanusz Dziedzic 					     const struct wmi_sta_keepalive_arg *arg);
159f5431e87SJanusz Dziedzic 	struct sk_buff *(*gen_wow_enable)(struct ath10k *ar);
160f5431e87SJanusz Dziedzic 	struct sk_buff *(*gen_wow_add_wakeup_event)(struct ath10k *ar, u32 vdev_id,
161f5431e87SJanusz Dziedzic 						    enum wmi_wow_wakeup_event event,
162f5431e87SJanusz Dziedzic 						    u32 enable);
163f5431e87SJanusz Dziedzic 	struct sk_buff *(*gen_wow_host_wakeup_ind)(struct ath10k *ar);
164d4976104SJanusz Dziedzic 	struct sk_buff *(*gen_wow_add_pattern)(struct ath10k *ar, u32 vdev_id,
165d4976104SJanusz Dziedzic 					       u32 pattern_id,
166d4976104SJanusz Dziedzic 					       const u8 *pattern,
167d4976104SJanusz Dziedzic 					       const u8 *mask,
168d4976104SJanusz Dziedzic 					       int pattern_len,
169d4976104SJanusz Dziedzic 					       int pattern_offset);
170d4976104SJanusz Dziedzic 	struct sk_buff *(*gen_wow_del_pattern)(struct ath10k *ar, u32 vdev_id,
171d4976104SJanusz Dziedzic 					       u32 pattern_id);
172ad45c888SMarek Puzyniak 	struct sk_buff *(*gen_update_fw_tdls_state)(struct ath10k *ar,
173ad45c888SMarek Puzyniak 						    u32 vdev_id,
174ad45c888SMarek Puzyniak 						    enum wmi_tdls_state state);
175ad45c888SMarek Puzyniak 	struct sk_buff *(*gen_tdls_peer_update)(struct ath10k *ar,
176ad45c888SMarek Puzyniak 						const struct wmi_tdls_peer_update_cmd_arg *arg,
177ad45c888SMarek Puzyniak 						const struct wmi_tdls_peer_capab_arg *cap,
178ad45c888SMarek Puzyniak 						const struct wmi_channel_arg *chan);
1795b272e30SMichal Kazior 	struct sk_buff *(*gen_adaptive_qcs)(struct ath10k *ar, bool enable);
180d7579d12SMichal Kazior };
181d7579d12SMichal Kazior 
182d7579d12SMichal Kazior int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
183d7579d12SMichal Kazior 
184d7579d12SMichal Kazior static inline int
185d7579d12SMichal Kazior ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb)
186d7579d12SMichal Kazior {
187d7579d12SMichal Kazior 	if (WARN_ON_ONCE(!ar->wmi.ops->rx))
188d7579d12SMichal Kazior 		return -EOPNOTSUPP;
189d7579d12SMichal Kazior 
190d7579d12SMichal Kazior 	ar->wmi.ops->rx(ar, skb);
191d7579d12SMichal Kazior 	return 0;
192d7579d12SMichal Kazior }
193d7579d12SMichal Kazior 
194d7579d12SMichal Kazior static inline int
195d7579d12SMichal Kazior ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out,
196d7579d12SMichal Kazior 		   size_t len)
197d7579d12SMichal Kazior {
198d7579d12SMichal Kazior 	if (!ar->wmi.ops->map_svc)
199d7579d12SMichal Kazior 		return -EOPNOTSUPP;
200d7579d12SMichal Kazior 
201d7579d12SMichal Kazior 	ar->wmi.ops->map_svc(in, out, len);
202d7579d12SMichal Kazior 	return 0;
203d7579d12SMichal Kazior }
204d7579d12SMichal Kazior 
205d7579d12SMichal Kazior static inline int
206d7579d12SMichal Kazior ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb,
207d7579d12SMichal Kazior 		     struct wmi_scan_ev_arg *arg)
208d7579d12SMichal Kazior {
209d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_scan)
210d7579d12SMichal Kazior 		return -EOPNOTSUPP;
211d7579d12SMichal Kazior 
212d7579d12SMichal Kazior 	return ar->wmi.ops->pull_scan(ar, skb, arg);
213d7579d12SMichal Kazior }
214d7579d12SMichal Kazior 
215d7579d12SMichal Kazior static inline int
216d7579d12SMichal Kazior ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,
217d7579d12SMichal Kazior 			struct wmi_mgmt_rx_ev_arg *arg)
218d7579d12SMichal Kazior {
219d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_mgmt_rx)
220d7579d12SMichal Kazior 		return -EOPNOTSUPP;
221d7579d12SMichal Kazior 
222d7579d12SMichal Kazior 	return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg);
223d7579d12SMichal Kazior }
224d7579d12SMichal Kazior 
225d7579d12SMichal Kazior static inline int
226d7579d12SMichal Kazior ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb,
227d7579d12SMichal Kazior 			struct wmi_ch_info_ev_arg *arg)
228d7579d12SMichal Kazior {
229d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_ch_info)
230d7579d12SMichal Kazior 		return -EOPNOTSUPP;
231d7579d12SMichal Kazior 
232d7579d12SMichal Kazior 	return ar->wmi.ops->pull_ch_info(ar, skb, arg);
233d7579d12SMichal Kazior }
234d7579d12SMichal Kazior 
235d7579d12SMichal Kazior static inline int
236d7579d12SMichal Kazior ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb,
237d7579d12SMichal Kazior 			   struct wmi_vdev_start_ev_arg *arg)
238d7579d12SMichal Kazior {
239d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_vdev_start)
240d7579d12SMichal Kazior 		return -EOPNOTSUPP;
241d7579d12SMichal Kazior 
242d7579d12SMichal Kazior 	return ar->wmi.ops->pull_vdev_start(ar, skb, arg);
243d7579d12SMichal Kazior }
244d7579d12SMichal Kazior 
245d7579d12SMichal Kazior static inline int
246d7579d12SMichal Kazior ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb,
247d7579d12SMichal Kazior 			  struct wmi_peer_kick_ev_arg *arg)
248d7579d12SMichal Kazior {
249d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_peer_kick)
250d7579d12SMichal Kazior 		return -EOPNOTSUPP;
251d7579d12SMichal Kazior 
252d7579d12SMichal Kazior 	return ar->wmi.ops->pull_peer_kick(ar, skb, arg);
253d7579d12SMichal Kazior }
254d7579d12SMichal Kazior 
255d7579d12SMichal Kazior static inline int
256d7579d12SMichal Kazior ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb,
257d7579d12SMichal Kazior 		     struct wmi_swba_ev_arg *arg)
258d7579d12SMichal Kazior {
259d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_swba)
260d7579d12SMichal Kazior 		return -EOPNOTSUPP;
261d7579d12SMichal Kazior 
262d7579d12SMichal Kazior 	return ar->wmi.ops->pull_swba(ar, skb, arg);
263d7579d12SMichal Kazior }
264d7579d12SMichal Kazior 
265d7579d12SMichal Kazior static inline int
266991adf71SRaja Mani ath10k_wmi_pull_phyerr_hdr(struct ath10k *ar, struct sk_buff *skb,
267991adf71SRaja Mani 			   struct wmi_phyerr_hdr_arg *arg)
268991adf71SRaja Mani {
269991adf71SRaja Mani 	if (!ar->wmi.ops->pull_phyerr_hdr)
270991adf71SRaja Mani 		return -EOPNOTSUPP;
271991adf71SRaja Mani 
272991adf71SRaja Mani 	return ar->wmi.ops->pull_phyerr_hdr(ar, skb, arg);
273991adf71SRaja Mani }
274991adf71SRaja Mani 
275991adf71SRaja Mani static inline int
276991adf71SRaja Mani ath10k_wmi_pull_phyerr(struct ath10k *ar, const void *phyerr_buf,
277991adf71SRaja Mani 		       int left_len, struct wmi_phyerr_ev_arg *arg)
278d7579d12SMichal Kazior {
279d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_phyerr)
280d7579d12SMichal Kazior 		return -EOPNOTSUPP;
281d7579d12SMichal Kazior 
282991adf71SRaja Mani 	return ar->wmi.ops->pull_phyerr(ar, phyerr_buf, left_len, arg);
283d7579d12SMichal Kazior }
284d7579d12SMichal Kazior 
285d7579d12SMichal Kazior static inline int
286d7579d12SMichal Kazior ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb,
287d7579d12SMichal Kazior 			struct wmi_svc_rdy_ev_arg *arg)
288d7579d12SMichal Kazior {
289d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_svc_rdy)
290d7579d12SMichal Kazior 		return -EOPNOTSUPP;
291d7579d12SMichal Kazior 
292d7579d12SMichal Kazior 	return ar->wmi.ops->pull_svc_rdy(ar, skb, arg);
293d7579d12SMichal Kazior }
294d7579d12SMichal Kazior 
295d7579d12SMichal Kazior static inline int
296d7579d12SMichal Kazior ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb,
297d7579d12SMichal Kazior 		    struct wmi_rdy_ev_arg *arg)
298d7579d12SMichal Kazior {
299d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_rdy)
300d7579d12SMichal Kazior 		return -EOPNOTSUPP;
301d7579d12SMichal Kazior 
302d7579d12SMichal Kazior 	return ar->wmi.ops->pull_rdy(ar, skb, arg);
303d7579d12SMichal Kazior }
304d7579d12SMichal Kazior 
305d7579d12SMichal Kazior static inline int
306d7579d12SMichal Kazior ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
307d7579d12SMichal Kazior 			 struct ath10k_fw_stats *stats)
308d7579d12SMichal Kazior {
309d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_fw_stats)
310d7579d12SMichal Kazior 		return -EOPNOTSUPP;
311d7579d12SMichal Kazior 
312d7579d12SMichal Kazior 	return ar->wmi.ops->pull_fw_stats(ar, skb, stats);
313d7579d12SMichal Kazior }
314d7579d12SMichal Kazior 
315d7579d12SMichal Kazior static inline int
316c1a4654aSMichal Kazior ath10k_wmi_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
317c1a4654aSMichal Kazior 			struct wmi_roam_ev_arg *arg)
318c1a4654aSMichal Kazior {
319c1a4654aSMichal Kazior 	if (!ar->wmi.ops->pull_roam_ev)
320c1a4654aSMichal Kazior 		return -EOPNOTSUPP;
321c1a4654aSMichal Kazior 
322c1a4654aSMichal Kazior 	return ar->wmi.ops->pull_roam_ev(ar, skb, arg);
323c1a4654aSMichal Kazior }
324c1a4654aSMichal Kazior 
325c1a4654aSMichal Kazior static inline int
326f5431e87SJanusz Dziedzic ath10k_wmi_pull_wow_event(struct ath10k *ar, struct sk_buff *skb,
327f5431e87SJanusz Dziedzic 			  struct wmi_wow_ev_arg *arg)
328f5431e87SJanusz Dziedzic {
329f5431e87SJanusz Dziedzic 	if (!ar->wmi.ops->pull_wow_event)
330f5431e87SJanusz Dziedzic 		return -EOPNOTSUPP;
331f5431e87SJanusz Dziedzic 
332f5431e87SJanusz Dziedzic 	return ar->wmi.ops->pull_wow_event(ar, skb, arg);
333f5431e87SJanusz Dziedzic }
334f5431e87SJanusz Dziedzic 
33508e75ea8SVivek Natarajan static inline enum wmi_txbf_conf
33608e75ea8SVivek Natarajan ath10k_wmi_get_txbf_conf_scheme(struct ath10k *ar)
33708e75ea8SVivek Natarajan {
33808e75ea8SVivek Natarajan 	if (!ar->wmi.ops->get_txbf_conf_scheme)
33908e75ea8SVivek Natarajan 		return WMI_TXBF_CONF_UNSUPPORTED;
34008e75ea8SVivek Natarajan 
34108e75ea8SVivek Natarajan 	return ar->wmi.ops->get_txbf_conf_scheme(ar);
34208e75ea8SVivek Natarajan }
34308e75ea8SVivek Natarajan 
344f5431e87SJanusz Dziedzic static inline int
345d7579d12SMichal Kazior ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
346d7579d12SMichal Kazior {
347d7579d12SMichal Kazior 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
348d7579d12SMichal Kazior 	struct sk_buff *skb;
349d7579d12SMichal Kazior 	int ret;
350d7579d12SMichal Kazior 
351d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_mgmt_tx)
352d7579d12SMichal Kazior 		return -EOPNOTSUPP;
353d7579d12SMichal Kazior 
354d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu);
355d7579d12SMichal Kazior 	if (IS_ERR(skb))
356d7579d12SMichal Kazior 		return PTR_ERR(skb);
357d7579d12SMichal Kazior 
358d7579d12SMichal Kazior 	ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid);
359d7579d12SMichal Kazior 	if (ret)
360d7579d12SMichal Kazior 		return ret;
361d7579d12SMichal Kazior 
362d7579d12SMichal Kazior 	/* FIXME There's no ACK event for Management Tx. This probably
363d7579d12SMichal Kazior 	 * shouldn't be called here either. */
364d7579d12SMichal Kazior 	info->flags |= IEEE80211_TX_STAT_ACK;
365d7579d12SMichal Kazior 	ieee80211_tx_status_irqsafe(ar->hw, msdu);
366d7579d12SMichal Kazior 
367d7579d12SMichal Kazior 	return 0;
368d7579d12SMichal Kazior }
369d7579d12SMichal Kazior 
370d7579d12SMichal Kazior static inline int
371d7579d12SMichal Kazior ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
372d7579d12SMichal Kazior 			      u16 ctl2g, u16 ctl5g,
373d7579d12SMichal Kazior 			      enum wmi_dfs_region dfs_reg)
374d7579d12SMichal Kazior {
375d7579d12SMichal Kazior 	struct sk_buff *skb;
376d7579d12SMichal Kazior 
377d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_rd)
378d7579d12SMichal Kazior 		return -EOPNOTSUPP;
379d7579d12SMichal Kazior 
380d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g,
381d7579d12SMichal Kazior 					   dfs_reg);
382d7579d12SMichal Kazior 	if (IS_ERR(skb))
383d7579d12SMichal Kazior 		return PTR_ERR(skb);
384d7579d12SMichal Kazior 
385d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
386d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_set_regdomain_cmdid);
387d7579d12SMichal Kazior }
388d7579d12SMichal Kazior 
389d7579d12SMichal Kazior static inline int
390d7579d12SMichal Kazior ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)
391d7579d12SMichal Kazior {
392d7579d12SMichal Kazior 	struct sk_buff *skb;
393d7579d12SMichal Kazior 
394d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_suspend)
395d7579d12SMichal Kazior 		return -EOPNOTSUPP;
396d7579d12SMichal Kazior 
397d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt);
398d7579d12SMichal Kazior 	if (IS_ERR(skb))
399d7579d12SMichal Kazior 		return PTR_ERR(skb);
400d7579d12SMichal Kazior 
401d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
402d7579d12SMichal Kazior }
403d7579d12SMichal Kazior 
404d7579d12SMichal Kazior static inline int
405d7579d12SMichal Kazior ath10k_wmi_pdev_resume_target(struct ath10k *ar)
406d7579d12SMichal Kazior {
407d7579d12SMichal Kazior 	struct sk_buff *skb;
408d7579d12SMichal Kazior 
409d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_resume)
410d7579d12SMichal Kazior 		return -EOPNOTSUPP;
411d7579d12SMichal Kazior 
412d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_resume(ar);
413d7579d12SMichal Kazior 	if (IS_ERR(skb))
414d7579d12SMichal Kazior 		return PTR_ERR(skb);
415d7579d12SMichal Kazior 
416d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
417d7579d12SMichal Kazior }
418d7579d12SMichal Kazior 
419d7579d12SMichal Kazior static inline int
420d7579d12SMichal Kazior ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
421d7579d12SMichal Kazior {
422d7579d12SMichal Kazior 	struct sk_buff *skb;
423d7579d12SMichal Kazior 
424d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_param)
425d7579d12SMichal Kazior 		return -EOPNOTSUPP;
426d7579d12SMichal Kazior 
427d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value);
428d7579d12SMichal Kazior 	if (IS_ERR(skb))
429d7579d12SMichal Kazior 		return PTR_ERR(skb);
430d7579d12SMichal Kazior 
431d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
432d7579d12SMichal Kazior }
433d7579d12SMichal Kazior 
434d7579d12SMichal Kazior static inline int
435d7579d12SMichal Kazior ath10k_wmi_cmd_init(struct ath10k *ar)
436d7579d12SMichal Kazior {
437d7579d12SMichal Kazior 	struct sk_buff *skb;
438d7579d12SMichal Kazior 
439d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_init)
440d7579d12SMichal Kazior 		return -EOPNOTSUPP;
441d7579d12SMichal Kazior 
442d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_init(ar);
443d7579d12SMichal Kazior 	if (IS_ERR(skb))
444d7579d12SMichal Kazior 		return PTR_ERR(skb);
445d7579d12SMichal Kazior 
446d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid);
447d7579d12SMichal Kazior }
448d7579d12SMichal Kazior 
449d7579d12SMichal Kazior static inline int
450d7579d12SMichal Kazior ath10k_wmi_start_scan(struct ath10k *ar,
451d7579d12SMichal Kazior 		      const struct wmi_start_scan_arg *arg)
452d7579d12SMichal Kazior {
453d7579d12SMichal Kazior 	struct sk_buff *skb;
454d7579d12SMichal Kazior 
455d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_start_scan)
456d7579d12SMichal Kazior 		return -EOPNOTSUPP;
457d7579d12SMichal Kazior 
458d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_start_scan(ar, arg);
459d7579d12SMichal Kazior 	if (IS_ERR(skb))
460d7579d12SMichal Kazior 		return PTR_ERR(skb);
461d7579d12SMichal Kazior 
462d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
463d7579d12SMichal Kazior }
464d7579d12SMichal Kazior 
465d7579d12SMichal Kazior static inline int
466d7579d12SMichal Kazior ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
467d7579d12SMichal Kazior {
468d7579d12SMichal Kazior 	struct sk_buff *skb;
469d7579d12SMichal Kazior 
470d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_stop_scan)
471d7579d12SMichal Kazior 		return -EOPNOTSUPP;
472d7579d12SMichal Kazior 
473d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_stop_scan(ar, arg);
474d7579d12SMichal Kazior 	if (IS_ERR(skb))
475d7579d12SMichal Kazior 		return PTR_ERR(skb);
476d7579d12SMichal Kazior 
477d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
478d7579d12SMichal Kazior }
479d7579d12SMichal Kazior 
480d7579d12SMichal Kazior static inline int
481d7579d12SMichal Kazior ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
482d7579d12SMichal Kazior 		       enum wmi_vdev_type type,
483d7579d12SMichal Kazior 		       enum wmi_vdev_subtype subtype,
484d7579d12SMichal Kazior 		       const u8 macaddr[ETH_ALEN])
485d7579d12SMichal Kazior {
486d7579d12SMichal Kazior 	struct sk_buff *skb;
487d7579d12SMichal Kazior 
488d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_create)
489d7579d12SMichal Kazior 		return -EOPNOTSUPP;
490d7579d12SMichal Kazior 
491d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr);
492d7579d12SMichal Kazior 	if (IS_ERR(skb))
493d7579d12SMichal Kazior 		return PTR_ERR(skb);
494d7579d12SMichal Kazior 
495d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
496d7579d12SMichal Kazior }
497d7579d12SMichal Kazior 
498d7579d12SMichal Kazior static inline int
499d7579d12SMichal Kazior ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
500d7579d12SMichal Kazior {
501d7579d12SMichal Kazior 	struct sk_buff *skb;
502d7579d12SMichal Kazior 
503d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_delete)
504d7579d12SMichal Kazior 		return -EOPNOTSUPP;
505d7579d12SMichal Kazior 
506d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id);
507d7579d12SMichal Kazior 	if (IS_ERR(skb))
508d7579d12SMichal Kazior 		return PTR_ERR(skb);
509d7579d12SMichal Kazior 
510d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
511d7579d12SMichal Kazior }
512d7579d12SMichal Kazior 
513d7579d12SMichal Kazior static inline int
514d7579d12SMichal Kazior ath10k_wmi_vdev_start(struct ath10k *ar,
515d7579d12SMichal Kazior 		      const struct wmi_vdev_start_request_arg *arg)
516d7579d12SMichal Kazior {
517d7579d12SMichal Kazior 	struct sk_buff *skb;
518d7579d12SMichal Kazior 
519d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_start)
520d7579d12SMichal Kazior 		return -EOPNOTSUPP;
521d7579d12SMichal Kazior 
522d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_start(ar, arg, false);
523d7579d12SMichal Kazior 	if (IS_ERR(skb))
524d7579d12SMichal Kazior 		return PTR_ERR(skb);
525d7579d12SMichal Kazior 
526d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
527d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_start_request_cmdid);
528d7579d12SMichal Kazior }
529d7579d12SMichal Kazior 
530d7579d12SMichal Kazior static inline int
531d7579d12SMichal Kazior ath10k_wmi_vdev_restart(struct ath10k *ar,
532d7579d12SMichal Kazior 			const struct wmi_vdev_start_request_arg *arg)
533d7579d12SMichal Kazior {
534d7579d12SMichal Kazior 	struct sk_buff *skb;
535d7579d12SMichal Kazior 
536d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_start)
537d7579d12SMichal Kazior 		return -EOPNOTSUPP;
538d7579d12SMichal Kazior 
539d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_start(ar, arg, true);
540d7579d12SMichal Kazior 	if (IS_ERR(skb))
541d7579d12SMichal Kazior 		return PTR_ERR(skb);
542d7579d12SMichal Kazior 
543d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
544d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_restart_request_cmdid);
545d7579d12SMichal Kazior }
546d7579d12SMichal Kazior 
547d7579d12SMichal Kazior static inline int
548d7579d12SMichal Kazior ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
549d7579d12SMichal Kazior {
550d7579d12SMichal Kazior 	struct sk_buff *skb;
551d7579d12SMichal Kazior 
552d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_stop)
553d7579d12SMichal Kazior 		return -EOPNOTSUPP;
554d7579d12SMichal Kazior 
555d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id);
556d7579d12SMichal Kazior 	if (IS_ERR(skb))
557d7579d12SMichal Kazior 		return PTR_ERR(skb);
558d7579d12SMichal Kazior 
559d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);
560d7579d12SMichal Kazior }
561d7579d12SMichal Kazior 
562d7579d12SMichal Kazior static inline int
563d7579d12SMichal Kazior ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
564d7579d12SMichal Kazior {
565d7579d12SMichal Kazior 	struct sk_buff *skb;
566d7579d12SMichal Kazior 
567d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_up)
568d7579d12SMichal Kazior 		return -EOPNOTSUPP;
569d7579d12SMichal Kazior 
570d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid);
571d7579d12SMichal Kazior 	if (IS_ERR(skb))
572d7579d12SMichal Kazior 		return PTR_ERR(skb);
573d7579d12SMichal Kazior 
574d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);
575d7579d12SMichal Kazior }
576d7579d12SMichal Kazior 
577d7579d12SMichal Kazior static inline int
578d7579d12SMichal Kazior ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
579d7579d12SMichal Kazior {
580d7579d12SMichal Kazior 	struct sk_buff *skb;
581d7579d12SMichal Kazior 
582d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_down)
583d7579d12SMichal Kazior 		return -EOPNOTSUPP;
584d7579d12SMichal Kazior 
585d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id);
586d7579d12SMichal Kazior 	if (IS_ERR(skb))
587d7579d12SMichal Kazior 		return PTR_ERR(skb);
588d7579d12SMichal Kazior 
589d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
590d7579d12SMichal Kazior }
591d7579d12SMichal Kazior 
592d7579d12SMichal Kazior static inline int
593d7579d12SMichal Kazior ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id,
594d7579d12SMichal Kazior 			  u32 param_value)
595d7579d12SMichal Kazior {
596d7579d12SMichal Kazior 	struct sk_buff *skb;
597d7579d12SMichal Kazior 
598d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_set_param)
599d7579d12SMichal Kazior 		return -EOPNOTSUPP;
600d7579d12SMichal Kazior 
601d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id,
602d7579d12SMichal Kazior 					      param_value);
603d7579d12SMichal Kazior 	if (IS_ERR(skb))
604d7579d12SMichal Kazior 		return PTR_ERR(skb);
605d7579d12SMichal Kazior 
606d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
607d7579d12SMichal Kazior }
608d7579d12SMichal Kazior 
609d7579d12SMichal Kazior static inline int
610d7579d12SMichal Kazior ath10k_wmi_vdev_install_key(struct ath10k *ar,
611d7579d12SMichal Kazior 			    const struct wmi_vdev_install_key_arg *arg)
612d7579d12SMichal Kazior {
613d7579d12SMichal Kazior 	struct sk_buff *skb;
614d7579d12SMichal Kazior 
615d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_install_key)
616d7579d12SMichal Kazior 		return -EOPNOTSUPP;
617d7579d12SMichal Kazior 
618d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_install_key(ar, arg);
619d7579d12SMichal Kazior 	if (IS_ERR(skb))
620d7579d12SMichal Kazior 		return PTR_ERR(skb);
621d7579d12SMichal Kazior 
622d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
623d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_install_key_cmdid);
624d7579d12SMichal Kazior }
625d7579d12SMichal Kazior 
626d7579d12SMichal Kazior static inline int
627d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,
628d7579d12SMichal Kazior 			      const struct wmi_vdev_spectral_conf_arg *arg)
629d7579d12SMichal Kazior {
630d7579d12SMichal Kazior 	struct sk_buff *skb;
631d7579d12SMichal Kazior 	u32 cmd_id;
632d7579d12SMichal Kazior 
633d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg);
634d7579d12SMichal Kazior 	if (IS_ERR(skb))
635d7579d12SMichal Kazior 		return PTR_ERR(skb);
636d7579d12SMichal Kazior 
637d7579d12SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid;
638d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
639d7579d12SMichal Kazior }
640d7579d12SMichal Kazior 
641d7579d12SMichal Kazior static inline int
642d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,
643d7579d12SMichal Kazior 				u32 enable)
644d7579d12SMichal Kazior {
645d7579d12SMichal Kazior 	struct sk_buff *skb;
646d7579d12SMichal Kazior 	u32 cmd_id;
647d7579d12SMichal Kazior 
648d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger,
649d7579d12SMichal Kazior 						    enable);
650d7579d12SMichal Kazior 	if (IS_ERR(skb))
651d7579d12SMichal Kazior 		return PTR_ERR(skb);
652d7579d12SMichal Kazior 
653d7579d12SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid;
654d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
655d7579d12SMichal Kazior }
656d7579d12SMichal Kazior 
657d7579d12SMichal Kazior static inline int
6580c7e477cSJanusz Dziedzic ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id,
6590c7e477cSJanusz Dziedzic 			  const u8 peer_addr[ETH_ALEN],
6600c7e477cSJanusz Dziedzic 			  const struct wmi_sta_uapsd_auto_trig_arg *args,
6610c7e477cSJanusz Dziedzic 			  u32 num_ac)
6620c7e477cSJanusz Dziedzic {
6630c7e477cSJanusz Dziedzic 	struct sk_buff *skb;
6640c7e477cSJanusz Dziedzic 	u32 cmd_id;
6650c7e477cSJanusz Dziedzic 
6660c7e477cSJanusz Dziedzic 	if (!ar->wmi.ops->gen_vdev_sta_uapsd)
6670c7e477cSJanusz Dziedzic 		return -EOPNOTSUPP;
6680c7e477cSJanusz Dziedzic 
6690c7e477cSJanusz Dziedzic 	skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args,
6700c7e477cSJanusz Dziedzic 					      num_ac);
6710c7e477cSJanusz Dziedzic 	if (IS_ERR(skb))
6720c7e477cSJanusz Dziedzic 		return PTR_ERR(skb);
6730c7e477cSJanusz Dziedzic 
6740c7e477cSJanusz Dziedzic 	cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid;
6750c7e477cSJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
6760c7e477cSJanusz Dziedzic }
6770c7e477cSJanusz Dziedzic 
6780c7e477cSJanusz Dziedzic static inline int
6796d492fe2SMichal Kazior ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,
6806d492fe2SMichal Kazior 			 const struct wmi_wmm_params_all_arg *arg)
6816d492fe2SMichal Kazior {
6826d492fe2SMichal Kazior 	struct sk_buff *skb;
6836d492fe2SMichal Kazior 	u32 cmd_id;
6846d492fe2SMichal Kazior 
6856d492fe2SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg);
6866d492fe2SMichal Kazior 	if (IS_ERR(skb))
6876d492fe2SMichal Kazior 		return PTR_ERR(skb);
6886d492fe2SMichal Kazior 
6896d492fe2SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid;
6906d492fe2SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
6916d492fe2SMichal Kazior }
6926d492fe2SMichal Kazior 
6936d492fe2SMichal Kazior static inline int
694d7579d12SMichal Kazior ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
6957390ed34SMarek Puzyniak 		       const u8 peer_addr[ETH_ALEN],
6967390ed34SMarek Puzyniak 		       enum wmi_peer_type peer_type)
697d7579d12SMichal Kazior {
698d7579d12SMichal Kazior 	struct sk_buff *skb;
699d7579d12SMichal Kazior 
700d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_create)
701d7579d12SMichal Kazior 		return -EOPNOTSUPP;
702d7579d12SMichal Kazior 
7037390ed34SMarek Puzyniak 	skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr, peer_type);
704d7579d12SMichal Kazior 	if (IS_ERR(skb))
705d7579d12SMichal Kazior 		return PTR_ERR(skb);
706d7579d12SMichal Kazior 
707d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
708d7579d12SMichal Kazior }
709d7579d12SMichal Kazior 
710d7579d12SMichal Kazior static inline int
711d7579d12SMichal Kazior ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
712d7579d12SMichal Kazior 		       const u8 peer_addr[ETH_ALEN])
713d7579d12SMichal Kazior {
714d7579d12SMichal Kazior 	struct sk_buff *skb;
715d7579d12SMichal Kazior 
716d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_delete)
717d7579d12SMichal Kazior 		return -EOPNOTSUPP;
718d7579d12SMichal Kazior 
719d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr);
720d7579d12SMichal Kazior 	if (IS_ERR(skb))
721d7579d12SMichal Kazior 		return PTR_ERR(skb);
722d7579d12SMichal Kazior 
723d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);
724d7579d12SMichal Kazior }
725d7579d12SMichal Kazior 
726d7579d12SMichal Kazior static inline int
727d7579d12SMichal Kazior ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
728d7579d12SMichal Kazior 		      const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
729d7579d12SMichal Kazior {
730d7579d12SMichal Kazior 	struct sk_buff *skb;
731d7579d12SMichal Kazior 
732d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_flush)
733d7579d12SMichal Kazior 		return -EOPNOTSUPP;
734d7579d12SMichal Kazior 
735d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap);
736d7579d12SMichal Kazior 	if (IS_ERR(skb))
737d7579d12SMichal Kazior 		return PTR_ERR(skb);
738d7579d12SMichal Kazior 
739d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
740d7579d12SMichal Kazior }
741d7579d12SMichal Kazior 
742d7579d12SMichal Kazior static inline int
743d7579d12SMichal Kazior ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr,
744d7579d12SMichal Kazior 			  enum wmi_peer_param param_id, u32 param_value)
745d7579d12SMichal Kazior {
746d7579d12SMichal Kazior 	struct sk_buff *skb;
747d7579d12SMichal Kazior 
748d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_set_param)
749d7579d12SMichal Kazior 		return -EOPNOTSUPP;
750d7579d12SMichal Kazior 
751d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id,
752d7579d12SMichal Kazior 					      param_value);
753d7579d12SMichal Kazior 	if (IS_ERR(skb))
754d7579d12SMichal Kazior 		return PTR_ERR(skb);
755d7579d12SMichal Kazior 
756d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
757d7579d12SMichal Kazior }
758d7579d12SMichal Kazior 
759d7579d12SMichal Kazior static inline int
760d7579d12SMichal Kazior ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
761d7579d12SMichal Kazior 		      enum wmi_sta_ps_mode psmode)
762d7579d12SMichal Kazior {
763d7579d12SMichal Kazior 	struct sk_buff *skb;
764d7579d12SMichal Kazior 
765d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_psmode)
766d7579d12SMichal Kazior 		return -EOPNOTSUPP;
767d7579d12SMichal Kazior 
768d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode);
769d7579d12SMichal Kazior 	if (IS_ERR(skb))
770d7579d12SMichal Kazior 		return PTR_ERR(skb);
771d7579d12SMichal Kazior 
772d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
773d7579d12SMichal Kazior 				   ar->wmi.cmd->sta_powersave_mode_cmdid);
774d7579d12SMichal Kazior }
775d7579d12SMichal Kazior 
776d7579d12SMichal Kazior static inline int
777d7579d12SMichal Kazior ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
778d7579d12SMichal Kazior 			    enum wmi_sta_powersave_param param_id, u32 value)
779d7579d12SMichal Kazior {
780d7579d12SMichal Kazior 	struct sk_buff *skb;
781d7579d12SMichal Kazior 
782d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_sta_ps)
783d7579d12SMichal Kazior 		return -EOPNOTSUPP;
784d7579d12SMichal Kazior 
785d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value);
786d7579d12SMichal Kazior 	if (IS_ERR(skb))
787d7579d12SMichal Kazior 		return PTR_ERR(skb);
788d7579d12SMichal Kazior 
789d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
790d7579d12SMichal Kazior 				   ar->wmi.cmd->sta_powersave_param_cmdid);
791d7579d12SMichal Kazior }
792d7579d12SMichal Kazior 
793d7579d12SMichal Kazior static inline int
794d7579d12SMichal Kazior ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
795d7579d12SMichal Kazior 			   enum wmi_ap_ps_peer_param param_id, u32 value)
796d7579d12SMichal Kazior {
797d7579d12SMichal Kazior 	struct sk_buff *skb;
798d7579d12SMichal Kazior 
799d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_ap_ps)
800d7579d12SMichal Kazior 		return -EOPNOTSUPP;
801d7579d12SMichal Kazior 
802d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value);
803d7579d12SMichal Kazior 	if (IS_ERR(skb))
804d7579d12SMichal Kazior 		return PTR_ERR(skb);
805d7579d12SMichal Kazior 
806d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
807d7579d12SMichal Kazior 				   ar->wmi.cmd->ap_ps_peer_param_cmdid);
808d7579d12SMichal Kazior }
809d7579d12SMichal Kazior 
810d7579d12SMichal Kazior static inline int
811d7579d12SMichal Kazior ath10k_wmi_scan_chan_list(struct ath10k *ar,
812d7579d12SMichal Kazior 			  const struct wmi_scan_chan_list_arg *arg)
813d7579d12SMichal Kazior {
814d7579d12SMichal Kazior 	struct sk_buff *skb;
815d7579d12SMichal Kazior 
816d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_scan_chan_list)
817d7579d12SMichal Kazior 		return -EOPNOTSUPP;
818d7579d12SMichal Kazior 
819d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_scan_chan_list(ar, arg);
820d7579d12SMichal Kazior 	if (IS_ERR(skb))
821d7579d12SMichal Kazior 		return PTR_ERR(skb);
822d7579d12SMichal Kazior 
823d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
824d7579d12SMichal Kazior }
825d7579d12SMichal Kazior 
826d7579d12SMichal Kazior static inline int
827d7579d12SMichal Kazior ath10k_wmi_peer_assoc(struct ath10k *ar,
828d7579d12SMichal Kazior 		      const struct wmi_peer_assoc_complete_arg *arg)
829d7579d12SMichal Kazior {
830d7579d12SMichal Kazior 	struct sk_buff *skb;
831d7579d12SMichal Kazior 
832d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_assoc)
833d7579d12SMichal Kazior 		return -EOPNOTSUPP;
834d7579d12SMichal Kazior 
835d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_assoc(ar, arg);
836d7579d12SMichal Kazior 	if (IS_ERR(skb))
837d7579d12SMichal Kazior 		return PTR_ERR(skb);
838d7579d12SMichal Kazior 
839d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
840d7579d12SMichal Kazior }
841d7579d12SMichal Kazior 
842d7579d12SMichal Kazior static inline int
8439ad50182SMichal Kazior ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id,
8449ad50182SMichal Kazior 				  const void *bcn, size_t bcn_len,
8459ad50182SMichal Kazior 				  u32 bcn_paddr, bool dtim_zero,
8469ad50182SMichal Kazior 				  bool deliver_cab)
847d7579d12SMichal Kazior {
848d7579d12SMichal Kazior 	struct sk_buff *skb;
849d7579d12SMichal Kazior 	int ret;
850d7579d12SMichal Kazior 
851d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_beacon_dma)
852d7579d12SMichal Kazior 		return -EOPNOTSUPP;
853d7579d12SMichal Kazior 
8549ad50182SMichal Kazior 	skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr,
8559ad50182SMichal Kazior 					  dtim_zero, deliver_cab);
856d7579d12SMichal Kazior 	if (IS_ERR(skb))
857d7579d12SMichal Kazior 		return PTR_ERR(skb);
858d7579d12SMichal Kazior 
859d7579d12SMichal Kazior 	ret = ath10k_wmi_cmd_send_nowait(ar, skb,
860d7579d12SMichal Kazior 					 ar->wmi.cmd->pdev_send_bcn_cmdid);
861d7579d12SMichal Kazior 	if (ret) {
862d7579d12SMichal Kazior 		dev_kfree_skb(skb);
863d7579d12SMichal Kazior 		return ret;
864d7579d12SMichal Kazior 	}
865d7579d12SMichal Kazior 
866d7579d12SMichal Kazior 	return 0;
867d7579d12SMichal Kazior }
868d7579d12SMichal Kazior 
869d7579d12SMichal Kazior static inline int
870d7579d12SMichal Kazior ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
8715e752e42SMichal Kazior 			       const struct wmi_wmm_params_all_arg *arg)
872d7579d12SMichal Kazior {
873d7579d12SMichal Kazior 	struct sk_buff *skb;
874d7579d12SMichal Kazior 
875d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_wmm)
876d7579d12SMichal Kazior 		return -EOPNOTSUPP;
877d7579d12SMichal Kazior 
878d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg);
879d7579d12SMichal Kazior 	if (IS_ERR(skb))
880d7579d12SMichal Kazior 		return PTR_ERR(skb);
881d7579d12SMichal Kazior 
882d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
883d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_set_wmm_params_cmdid);
884d7579d12SMichal Kazior }
885d7579d12SMichal Kazior 
886d7579d12SMichal Kazior static inline int
887de23d3efSMichal Kazior ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask)
888d7579d12SMichal Kazior {
889d7579d12SMichal Kazior 	struct sk_buff *skb;
890d7579d12SMichal Kazior 
891d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_request_stats)
892d7579d12SMichal Kazior 		return -EOPNOTSUPP;
893d7579d12SMichal Kazior 
894de23d3efSMichal Kazior 	skb = ar->wmi.ops->gen_request_stats(ar, stats_mask);
895d7579d12SMichal Kazior 	if (IS_ERR(skb))
896d7579d12SMichal Kazior 		return PTR_ERR(skb);
897d7579d12SMichal Kazior 
898d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
899d7579d12SMichal Kazior }
900d7579d12SMichal Kazior 
901d7579d12SMichal Kazior static inline int
902d7579d12SMichal Kazior ath10k_wmi_force_fw_hang(struct ath10k *ar,
903d7579d12SMichal Kazior 			 enum wmi_force_fw_hang_type type, u32 delay_ms)
904d7579d12SMichal Kazior {
905d7579d12SMichal Kazior 	struct sk_buff *skb;
906d7579d12SMichal Kazior 
907d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_force_fw_hang)
908d7579d12SMichal Kazior 		return -EOPNOTSUPP;
909d7579d12SMichal Kazior 
910d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms);
911d7579d12SMichal Kazior 	if (IS_ERR(skb))
912d7579d12SMichal Kazior 		return PTR_ERR(skb);
913d7579d12SMichal Kazior 
914d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
915d7579d12SMichal Kazior }
916d7579d12SMichal Kazior 
917d7579d12SMichal Kazior static inline int
918467210a6SSenthilKumar Jegadeesan ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level)
919d7579d12SMichal Kazior {
920d7579d12SMichal Kazior 	struct sk_buff *skb;
921d7579d12SMichal Kazior 
922d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_dbglog_cfg)
923d7579d12SMichal Kazior 		return -EOPNOTSUPP;
924d7579d12SMichal Kazior 
925467210a6SSenthilKumar Jegadeesan 	skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level);
926d7579d12SMichal Kazior 	if (IS_ERR(skb))
927d7579d12SMichal Kazior 		return PTR_ERR(skb);
928d7579d12SMichal Kazior 
929d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);
930d7579d12SMichal Kazior }
931d7579d12SMichal Kazior 
932d7579d12SMichal Kazior static inline int
933d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter)
934d7579d12SMichal Kazior {
935d7579d12SMichal Kazior 	struct sk_buff *skb;
936d7579d12SMichal Kazior 
937d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pktlog_enable)
938d7579d12SMichal Kazior 		return -EOPNOTSUPP;
939d7579d12SMichal Kazior 
940d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pktlog_enable(ar, filter);
941d7579d12SMichal Kazior 	if (IS_ERR(skb))
942d7579d12SMichal Kazior 		return PTR_ERR(skb);
943d7579d12SMichal Kazior 
944d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid);
945d7579d12SMichal Kazior }
946d7579d12SMichal Kazior 
947d7579d12SMichal Kazior static inline int
948d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar)
949d7579d12SMichal Kazior {
950d7579d12SMichal Kazior 	struct sk_buff *skb;
951d7579d12SMichal Kazior 
952d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pktlog_disable)
953d7579d12SMichal Kazior 		return -EOPNOTSUPP;
954d7579d12SMichal Kazior 
955d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pktlog_disable(ar);
956d7579d12SMichal Kazior 	if (IS_ERR(skb))
957d7579d12SMichal Kazior 		return PTR_ERR(skb);
958d7579d12SMichal Kazior 
959d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
960d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_pktlog_disable_cmdid);
961d7579d12SMichal Kazior }
962d7579d12SMichal Kazior 
963ffdd738dSRajkumar Manoharan static inline int
964ffdd738dSRajkumar Manoharan ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration,
965ffdd738dSRajkumar Manoharan 			       u32 next_offset, u32 enabled)
966ffdd738dSRajkumar Manoharan {
967ffdd738dSRajkumar Manoharan 	struct sk_buff *skb;
968ffdd738dSRajkumar Manoharan 
969ffdd738dSRajkumar Manoharan 	if (!ar->wmi.ops->gen_pdev_set_quiet_mode)
970ffdd738dSRajkumar Manoharan 		return -EOPNOTSUPP;
971ffdd738dSRajkumar Manoharan 
972ffdd738dSRajkumar Manoharan 	skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration,
973ffdd738dSRajkumar Manoharan 						   next_offset, enabled);
974ffdd738dSRajkumar Manoharan 	if (IS_ERR(skb))
975ffdd738dSRajkumar Manoharan 		return PTR_ERR(skb);
976ffdd738dSRajkumar Manoharan 
977ffdd738dSRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
978ffdd738dSRajkumar Manoharan 				   ar->wmi.cmd->pdev_set_quiet_mode_cmdid);
979ffdd738dSRajkumar Manoharan }
980ffdd738dSRajkumar Manoharan 
981a57a6a27SRajkumar Manoharan static inline int
982a57a6a27SRajkumar Manoharan ath10k_wmi_pdev_get_temperature(struct ath10k *ar)
983a57a6a27SRajkumar Manoharan {
984a57a6a27SRajkumar Manoharan 	struct sk_buff *skb;
985a57a6a27SRajkumar Manoharan 
986a57a6a27SRajkumar Manoharan 	if (!ar->wmi.ops->gen_pdev_get_temperature)
987a57a6a27SRajkumar Manoharan 		return -EOPNOTSUPP;
988a57a6a27SRajkumar Manoharan 
989a57a6a27SRajkumar Manoharan 	skb = ar->wmi.ops->gen_pdev_get_temperature(ar);
990a57a6a27SRajkumar Manoharan 	if (IS_ERR(skb))
991a57a6a27SRajkumar Manoharan 		return PTR_ERR(skb);
992a57a6a27SRajkumar Manoharan 
993a57a6a27SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
994a57a6a27SRajkumar Manoharan 				   ar->wmi.cmd->pdev_get_temperature_cmdid);
995a57a6a27SRajkumar Manoharan }
996a57a6a27SRajkumar Manoharan 
997dc8ab278SRajkumar Manoharan static inline int
998dc8ab278SRajkumar Manoharan ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac)
999dc8ab278SRajkumar Manoharan {
1000dc8ab278SRajkumar Manoharan 	struct sk_buff *skb;
1001dc8ab278SRajkumar Manoharan 
1002dc8ab278SRajkumar Manoharan 	if (!ar->wmi.ops->gen_addba_clear_resp)
1003dc8ab278SRajkumar Manoharan 		return -EOPNOTSUPP;
1004dc8ab278SRajkumar Manoharan 
1005dc8ab278SRajkumar Manoharan 	skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac);
1006dc8ab278SRajkumar Manoharan 	if (IS_ERR(skb))
1007dc8ab278SRajkumar Manoharan 		return PTR_ERR(skb);
1008dc8ab278SRajkumar Manoharan 
1009dc8ab278SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
1010dc8ab278SRajkumar Manoharan 				   ar->wmi.cmd->addba_clear_resp_cmdid);
1011dc8ab278SRajkumar Manoharan }
1012dc8ab278SRajkumar Manoharan 
101365c0893dSRajkumar Manoharan static inline int
101465c0893dSRajkumar Manoharan ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
101565c0893dSRajkumar Manoharan 		      u32 tid, u32 buf_size)
101665c0893dSRajkumar Manoharan {
101765c0893dSRajkumar Manoharan 	struct sk_buff *skb;
101865c0893dSRajkumar Manoharan 
101965c0893dSRajkumar Manoharan 	if (!ar->wmi.ops->gen_addba_send)
102065c0893dSRajkumar Manoharan 		return -EOPNOTSUPP;
102165c0893dSRajkumar Manoharan 
102265c0893dSRajkumar Manoharan 	skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size);
102365c0893dSRajkumar Manoharan 	if (IS_ERR(skb))
102465c0893dSRajkumar Manoharan 		return PTR_ERR(skb);
102565c0893dSRajkumar Manoharan 
102665c0893dSRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
102765c0893dSRajkumar Manoharan 				   ar->wmi.cmd->addba_send_cmdid);
102865c0893dSRajkumar Manoharan }
102965c0893dSRajkumar Manoharan 
103011597413SRajkumar Manoharan static inline int
103111597413SRajkumar Manoharan ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
103211597413SRajkumar Manoharan 			  u32 tid, u32 status)
103311597413SRajkumar Manoharan {
103411597413SRajkumar Manoharan 	struct sk_buff *skb;
103511597413SRajkumar Manoharan 
103611597413SRajkumar Manoharan 	if (!ar->wmi.ops->gen_addba_set_resp)
103711597413SRajkumar Manoharan 		return -EOPNOTSUPP;
103811597413SRajkumar Manoharan 
103911597413SRajkumar Manoharan 	skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status);
104011597413SRajkumar Manoharan 	if (IS_ERR(skb))
104111597413SRajkumar Manoharan 		return PTR_ERR(skb);
104211597413SRajkumar Manoharan 
104311597413SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
104411597413SRajkumar Manoharan 				   ar->wmi.cmd->addba_set_resp_cmdid);
104511597413SRajkumar Manoharan }
104611597413SRajkumar Manoharan 
104750abef85SRajkumar Manoharan static inline int
104850abef85SRajkumar Manoharan ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
104950abef85SRajkumar Manoharan 		      u32 tid, u32 initiator, u32 reason)
105050abef85SRajkumar Manoharan {
105150abef85SRajkumar Manoharan 	struct sk_buff *skb;
105250abef85SRajkumar Manoharan 
105350abef85SRajkumar Manoharan 	if (!ar->wmi.ops->gen_delba_send)
105450abef85SRajkumar Manoharan 		return -EOPNOTSUPP;
105550abef85SRajkumar Manoharan 
105650abef85SRajkumar Manoharan 	skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator,
105750abef85SRajkumar Manoharan 					  reason);
105850abef85SRajkumar Manoharan 	if (IS_ERR(skb))
105950abef85SRajkumar Manoharan 		return PTR_ERR(skb);
106050abef85SRajkumar Manoharan 
106150abef85SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
106250abef85SRajkumar Manoharan 				   ar->wmi.cmd->delba_send_cmdid);
106350abef85SRajkumar Manoharan }
106450abef85SRajkumar Manoharan 
1065be9ce9d8SMichal Kazior static inline int
1066be9ce9d8SMichal Kazior ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset,
1067be9ce9d8SMichal Kazior 		    struct sk_buff *bcn, u32 prb_caps, u32 prb_erp,
1068be9ce9d8SMichal Kazior 		    void *prb_ies, size_t prb_ies_len)
1069be9ce9d8SMichal Kazior {
1070be9ce9d8SMichal Kazior 	struct sk_buff *skb;
1071be9ce9d8SMichal Kazior 
1072be9ce9d8SMichal Kazior 	if (!ar->wmi.ops->gen_bcn_tmpl)
1073be9ce9d8SMichal Kazior 		return -EOPNOTSUPP;
1074be9ce9d8SMichal Kazior 
1075be9ce9d8SMichal Kazior 	skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn,
1076be9ce9d8SMichal Kazior 					prb_caps, prb_erp, prb_ies,
1077be9ce9d8SMichal Kazior 					prb_ies_len);
1078be9ce9d8SMichal Kazior 	if (IS_ERR(skb))
1079be9ce9d8SMichal Kazior 		return PTR_ERR(skb);
1080be9ce9d8SMichal Kazior 
1081be9ce9d8SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid);
1082be9ce9d8SMichal Kazior }
1083be9ce9d8SMichal Kazior 
10844c4955feSMichal Kazior static inline int
10854c4955feSMichal Kazior ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb)
10864c4955feSMichal Kazior {
10874c4955feSMichal Kazior 	struct sk_buff *skb;
10884c4955feSMichal Kazior 
10894c4955feSMichal Kazior 	if (!ar->wmi.ops->gen_prb_tmpl)
10904c4955feSMichal Kazior 		return -EOPNOTSUPP;
10914c4955feSMichal Kazior 
10924c4955feSMichal Kazior 	skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb);
10934c4955feSMichal Kazior 	if (IS_ERR(skb))
10944c4955feSMichal Kazior 		return PTR_ERR(skb);
10954c4955feSMichal Kazior 
10964c4955feSMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid);
10974c4955feSMichal Kazior }
10984c4955feSMichal Kazior 
1099369242b4SMichal Kazior static inline int
1100369242b4SMichal Kazior ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie)
1101369242b4SMichal Kazior {
1102369242b4SMichal Kazior 	struct sk_buff *skb;
1103369242b4SMichal Kazior 
1104369242b4SMichal Kazior 	if (!ar->wmi.ops->gen_p2p_go_bcn_ie)
1105369242b4SMichal Kazior 		return -EOPNOTSUPP;
1106369242b4SMichal Kazior 
1107369242b4SMichal Kazior 	skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie);
1108369242b4SMichal Kazior 	if (IS_ERR(skb))
1109369242b4SMichal Kazior 		return PTR_ERR(skb);
1110369242b4SMichal Kazior 
1111369242b4SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie);
1112369242b4SMichal Kazior }
1113369242b4SMichal Kazior 
11146e8b188bSJanusz Dziedzic static inline int
11156e8b188bSJanusz Dziedzic ath10k_wmi_sta_keepalive(struct ath10k *ar,
11166e8b188bSJanusz Dziedzic 			 const struct wmi_sta_keepalive_arg *arg)
11176e8b188bSJanusz Dziedzic {
11186e8b188bSJanusz Dziedzic 	struct sk_buff *skb;
11196e8b188bSJanusz Dziedzic 	u32 cmd_id;
11206e8b188bSJanusz Dziedzic 
11216e8b188bSJanusz Dziedzic 	if (!ar->wmi.ops->gen_sta_keepalive)
11226e8b188bSJanusz Dziedzic 		return -EOPNOTSUPP;
11236e8b188bSJanusz Dziedzic 
11246e8b188bSJanusz Dziedzic 	skb = ar->wmi.ops->gen_sta_keepalive(ar, arg);
11256e8b188bSJanusz Dziedzic 	if (IS_ERR(skb))
11266e8b188bSJanusz Dziedzic 		return PTR_ERR(skb);
11276e8b188bSJanusz Dziedzic 
11286e8b188bSJanusz Dziedzic 	cmd_id = ar->wmi.cmd->sta_keepalive_cmd;
11296e8b188bSJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
11306e8b188bSJanusz Dziedzic }
11316e8b188bSJanusz Dziedzic 
1132f5431e87SJanusz Dziedzic static inline int
1133f5431e87SJanusz Dziedzic ath10k_wmi_wow_enable(struct ath10k *ar)
1134f5431e87SJanusz Dziedzic {
1135f5431e87SJanusz Dziedzic 	struct sk_buff *skb;
1136f5431e87SJanusz Dziedzic 	u32 cmd_id;
1137f5431e87SJanusz Dziedzic 
1138f5431e87SJanusz Dziedzic 	if (!ar->wmi.ops->gen_wow_enable)
1139f5431e87SJanusz Dziedzic 		return -EOPNOTSUPP;
1140f5431e87SJanusz Dziedzic 
1141f5431e87SJanusz Dziedzic 	skb = ar->wmi.ops->gen_wow_enable(ar);
1142f5431e87SJanusz Dziedzic 	if (IS_ERR(skb))
1143f5431e87SJanusz Dziedzic 		return PTR_ERR(skb);
1144f5431e87SJanusz Dziedzic 
1145f5431e87SJanusz Dziedzic 	cmd_id = ar->wmi.cmd->wow_enable_cmdid;
1146f5431e87SJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1147f5431e87SJanusz Dziedzic }
1148f5431e87SJanusz Dziedzic 
1149f5431e87SJanusz Dziedzic static inline int
1150f5431e87SJanusz Dziedzic ath10k_wmi_wow_add_wakeup_event(struct ath10k *ar, u32 vdev_id,
1151f5431e87SJanusz Dziedzic 				enum wmi_wow_wakeup_event event,
1152f5431e87SJanusz Dziedzic 				u32 enable)
1153f5431e87SJanusz Dziedzic {
1154f5431e87SJanusz Dziedzic 	struct sk_buff *skb;
1155f5431e87SJanusz Dziedzic 	u32 cmd_id;
1156f5431e87SJanusz Dziedzic 
1157f5431e87SJanusz Dziedzic 	if (!ar->wmi.ops->gen_wow_add_wakeup_event)
1158f5431e87SJanusz Dziedzic 		return -EOPNOTSUPP;
1159f5431e87SJanusz Dziedzic 
1160f5431e87SJanusz Dziedzic 	skb = ar->wmi.ops->gen_wow_add_wakeup_event(ar, vdev_id, event, enable);
1161f5431e87SJanusz Dziedzic 	if (IS_ERR(skb))
1162f5431e87SJanusz Dziedzic 		return PTR_ERR(skb);
1163f5431e87SJanusz Dziedzic 
1164f5431e87SJanusz Dziedzic 	cmd_id = ar->wmi.cmd->wow_enable_disable_wake_event_cmdid;
1165f5431e87SJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1166f5431e87SJanusz Dziedzic }
1167f5431e87SJanusz Dziedzic 
1168f5431e87SJanusz Dziedzic static inline int
1169f5431e87SJanusz Dziedzic ath10k_wmi_wow_host_wakeup_ind(struct ath10k *ar)
1170f5431e87SJanusz Dziedzic {
1171f5431e87SJanusz Dziedzic 	struct sk_buff *skb;
1172f5431e87SJanusz Dziedzic 	u32 cmd_id;
1173f5431e87SJanusz Dziedzic 
1174f5431e87SJanusz Dziedzic 	if (!ar->wmi.ops->gen_wow_host_wakeup_ind)
1175f5431e87SJanusz Dziedzic 		return -EOPNOTSUPP;
1176f5431e87SJanusz Dziedzic 
1177f5431e87SJanusz Dziedzic 	skb = ar->wmi.ops->gen_wow_host_wakeup_ind(ar);
1178f5431e87SJanusz Dziedzic 	if (IS_ERR(skb))
1179f5431e87SJanusz Dziedzic 		return PTR_ERR(skb);
1180f5431e87SJanusz Dziedzic 
1181f5431e87SJanusz Dziedzic 	cmd_id = ar->wmi.cmd->wow_hostwakeup_from_sleep_cmdid;
1182f5431e87SJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1183f5431e87SJanusz Dziedzic }
1184f5431e87SJanusz Dziedzic 
1185d4976104SJanusz Dziedzic static inline int
1186d4976104SJanusz Dziedzic ath10k_wmi_wow_add_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id,
1187d4976104SJanusz Dziedzic 			   const u8 *pattern, const u8 *mask,
1188d4976104SJanusz Dziedzic 			   int pattern_len, int pattern_offset)
1189d4976104SJanusz Dziedzic {
1190d4976104SJanusz Dziedzic 	struct sk_buff *skb;
1191d4976104SJanusz Dziedzic 	u32 cmd_id;
1192d4976104SJanusz Dziedzic 
1193d4976104SJanusz Dziedzic 	if (!ar->wmi.ops->gen_wow_add_pattern)
1194d4976104SJanusz Dziedzic 		return -EOPNOTSUPP;
1195d4976104SJanusz Dziedzic 
1196d4976104SJanusz Dziedzic 	skb = ar->wmi.ops->gen_wow_add_pattern(ar, vdev_id, pattern_id,
1197d4976104SJanusz Dziedzic 					       pattern, mask, pattern_len,
1198d4976104SJanusz Dziedzic 					       pattern_offset);
1199d4976104SJanusz Dziedzic 	if (IS_ERR(skb))
1200d4976104SJanusz Dziedzic 		return PTR_ERR(skb);
1201d4976104SJanusz Dziedzic 
1202d4976104SJanusz Dziedzic 	cmd_id = ar->wmi.cmd->wow_add_wake_pattern_cmdid;
1203d4976104SJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1204d4976104SJanusz Dziedzic }
1205d4976104SJanusz Dziedzic 
1206d4976104SJanusz Dziedzic static inline int
1207d4976104SJanusz Dziedzic ath10k_wmi_wow_del_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id)
1208d4976104SJanusz Dziedzic {
1209d4976104SJanusz Dziedzic 	struct sk_buff *skb;
1210d4976104SJanusz Dziedzic 	u32 cmd_id;
1211d4976104SJanusz Dziedzic 
1212d4976104SJanusz Dziedzic 	if (!ar->wmi.ops->gen_wow_del_pattern)
1213d4976104SJanusz Dziedzic 		return -EOPNOTSUPP;
1214d4976104SJanusz Dziedzic 
1215d4976104SJanusz Dziedzic 	skb = ar->wmi.ops->gen_wow_del_pattern(ar, vdev_id, pattern_id);
1216d4976104SJanusz Dziedzic 	if (IS_ERR(skb))
1217d4976104SJanusz Dziedzic 		return PTR_ERR(skb);
1218d4976104SJanusz Dziedzic 
1219d4976104SJanusz Dziedzic 	cmd_id = ar->wmi.cmd->wow_del_wake_pattern_cmdid;
1220d4976104SJanusz Dziedzic 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
1221d4976104SJanusz Dziedzic }
1222ad45c888SMarek Puzyniak 
1223ad45c888SMarek Puzyniak static inline int
1224ad45c888SMarek Puzyniak ath10k_wmi_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
1225ad45c888SMarek Puzyniak 				enum wmi_tdls_state state)
1226ad45c888SMarek Puzyniak {
1227ad45c888SMarek Puzyniak 	struct sk_buff *skb;
1228ad45c888SMarek Puzyniak 
1229ad45c888SMarek Puzyniak 	if (!ar->wmi.ops->gen_update_fw_tdls_state)
1230ad45c888SMarek Puzyniak 		return -EOPNOTSUPP;
1231ad45c888SMarek Puzyniak 
1232ad45c888SMarek Puzyniak 	skb = ar->wmi.ops->gen_update_fw_tdls_state(ar, vdev_id, state);
1233ad45c888SMarek Puzyniak 	if (IS_ERR(skb))
1234ad45c888SMarek Puzyniak 		return PTR_ERR(skb);
1235ad45c888SMarek Puzyniak 
1236ad45c888SMarek Puzyniak 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->tdls_set_state_cmdid);
1237ad45c888SMarek Puzyniak }
1238ad45c888SMarek Puzyniak 
1239ad45c888SMarek Puzyniak static inline int
1240ad45c888SMarek Puzyniak ath10k_wmi_tdls_peer_update(struct ath10k *ar,
1241ad45c888SMarek Puzyniak 			    const struct wmi_tdls_peer_update_cmd_arg *arg,
1242ad45c888SMarek Puzyniak 			    const struct wmi_tdls_peer_capab_arg *cap,
1243ad45c888SMarek Puzyniak 			    const struct wmi_channel_arg *chan)
1244ad45c888SMarek Puzyniak {
1245ad45c888SMarek Puzyniak 	struct sk_buff *skb;
1246ad45c888SMarek Puzyniak 
1247ad45c888SMarek Puzyniak 	if (!ar->wmi.ops->gen_tdls_peer_update)
1248ad45c888SMarek Puzyniak 		return -EOPNOTSUPP;
1249ad45c888SMarek Puzyniak 
1250ad45c888SMarek Puzyniak 	skb = ar->wmi.ops->gen_tdls_peer_update(ar, arg, cap, chan);
1251ad45c888SMarek Puzyniak 	if (IS_ERR(skb))
1252ad45c888SMarek Puzyniak 		return PTR_ERR(skb);
1253ad45c888SMarek Puzyniak 
1254ad45c888SMarek Puzyniak 	return ath10k_wmi_cmd_send(ar, skb,
1255ad45c888SMarek Puzyniak 				   ar->wmi.cmd->tdls_peer_update_cmdid);
1256ad45c888SMarek Puzyniak }
1257ad45c888SMarek Puzyniak 
12585b272e30SMichal Kazior static inline int
12595b272e30SMichal Kazior ath10k_wmi_adaptive_qcs(struct ath10k *ar, bool enable)
12605b272e30SMichal Kazior {
12615b272e30SMichal Kazior 	struct sk_buff *skb;
12625b272e30SMichal Kazior 
12635b272e30SMichal Kazior 	if (!ar->wmi.ops->gen_adaptive_qcs)
12645b272e30SMichal Kazior 		return -EOPNOTSUPP;
12655b272e30SMichal Kazior 
12665b272e30SMichal Kazior 	skb = ar->wmi.ops->gen_adaptive_qcs(ar, enable);
12675b272e30SMichal Kazior 	if (IS_ERR(skb))
12685b272e30SMichal Kazior 		return PTR_ERR(skb);
12695b272e30SMichal Kazior 
12705b272e30SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->adaptive_qcs_cmdid);
12715b272e30SMichal Kazior }
12725b272e30SMichal Kazior 
1273d7579d12SMichal Kazior #endif
1274