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);
48d7579d12SMichal Kazior 
49d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);
50d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);
51d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,
52d7579d12SMichal Kazior 					   u16 rd5g, u16 ctl2g, u16 ctl5g,
53d7579d12SMichal Kazior 					   enum wmi_dfs_region dfs_reg);
54d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id,
55d7579d12SMichal Kazior 					      u32 value);
56d7579d12SMichal Kazior 	struct sk_buff *(*gen_init)(struct ath10k *ar);
57d7579d12SMichal Kazior 	struct sk_buff *(*gen_start_scan)(struct ath10k *ar,
58d7579d12SMichal Kazior 					  const struct wmi_start_scan_arg *arg);
59d7579d12SMichal Kazior 	struct sk_buff *(*gen_stop_scan)(struct ath10k *ar,
60d7579d12SMichal Kazior 					 const struct wmi_stop_scan_arg *arg);
61d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id,
62d7579d12SMichal Kazior 					   enum wmi_vdev_type type,
63d7579d12SMichal Kazior 					   enum wmi_vdev_subtype subtype,
64d7579d12SMichal Kazior 					   const u8 macaddr[ETH_ALEN]);
65d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id);
66d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_start)(struct ath10k *ar,
67d7579d12SMichal Kazior 					  const struct wmi_vdev_start_request_arg *arg,
68d7579d12SMichal Kazior 					  bool restart);
69d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id);
70d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid,
71d7579d12SMichal Kazior 				       const u8 *bssid);
72d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id);
73d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id,
74d7579d12SMichal Kazior 					      u32 param_id, u32 param_value);
75d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar,
76d7579d12SMichal Kazior 						const struct wmi_vdev_install_key_arg *arg);
77d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar,
78d7579d12SMichal Kazior 						  const struct wmi_vdev_spectral_conf_arg *arg);
79d7579d12SMichal Kazior 	struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id,
80d7579d12SMichal Kazior 						    u32 trigger, u32 enable);
81d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id,
82d7579d12SMichal Kazior 					   const u8 peer_addr[ETH_ALEN]);
83d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id,
84d7579d12SMichal Kazior 					   const u8 peer_addr[ETH_ALEN]);
85d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id,
86d7579d12SMichal Kazior 					  const u8 peer_addr[ETH_ALEN],
87d7579d12SMichal Kazior 					  u32 tid_bitmap);
88d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id,
89d7579d12SMichal Kazior 					      const u8 *peer_addr,
90d7579d12SMichal Kazior 					      enum wmi_peer_param param_id,
91d7579d12SMichal Kazior 					      u32 param_value);
92d7579d12SMichal Kazior 	struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar,
93d7579d12SMichal Kazior 					  const struct wmi_peer_assoc_complete_arg *arg);
94d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id,
95d7579d12SMichal Kazior 					  enum wmi_sta_ps_mode psmode);
96d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id,
97d7579d12SMichal Kazior 					  enum wmi_sta_powersave_param param_id,
98d7579d12SMichal Kazior 					  u32 value);
99d7579d12SMichal Kazior 	struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id,
100d7579d12SMichal Kazior 					 const u8 *mac,
101d7579d12SMichal Kazior 					 enum wmi_ap_ps_peer_param param_id,
102d7579d12SMichal Kazior 					 u32 value);
103d7579d12SMichal Kazior 	struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar,
104d7579d12SMichal Kazior 					      const struct wmi_scan_chan_list_arg *arg);
105d7579d12SMichal Kazior 	struct sk_buff *(*gen_beacon_dma)(struct ath10k_vif *arvif);
106d7579d12SMichal Kazior 	struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
107d7579d12SMichal Kazior 					    const struct wmi_pdev_set_wmm_params_arg *arg);
108d7579d12SMichal Kazior 	struct sk_buff *(*gen_request_stats)(struct ath10k *ar,
109d7579d12SMichal Kazior 					     enum wmi_stats_id stats_id);
110d7579d12SMichal Kazior 	struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
111d7579d12SMichal Kazior 					     enum wmi_force_fw_hang_type type,
112d7579d12SMichal Kazior 					     u32 delay_ms);
113d7579d12SMichal Kazior 	struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);
114d7579d12SMichal Kazior 	struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable);
115d7579d12SMichal Kazior 	struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);
116d7579d12SMichal Kazior 	struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);
117ffdd738dSRajkumar Manoharan 	struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,
118ffdd738dSRajkumar Manoharan 						   u32 period, u32 duration,
119ffdd738dSRajkumar Manoharan 						   u32 next_offset,
120ffdd738dSRajkumar Manoharan 						   u32 enabled);
121a57a6a27SRajkumar Manoharan 	struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar);
122d7579d12SMichal Kazior };
123d7579d12SMichal Kazior 
124d7579d12SMichal Kazior int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
125d7579d12SMichal Kazior 
126d7579d12SMichal Kazior static inline int
127d7579d12SMichal Kazior ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb)
128d7579d12SMichal Kazior {
129d7579d12SMichal Kazior 	if (WARN_ON_ONCE(!ar->wmi.ops->rx))
130d7579d12SMichal Kazior 		return -EOPNOTSUPP;
131d7579d12SMichal Kazior 
132d7579d12SMichal Kazior 	ar->wmi.ops->rx(ar, skb);
133d7579d12SMichal Kazior 	return 0;
134d7579d12SMichal Kazior }
135d7579d12SMichal Kazior 
136d7579d12SMichal Kazior static inline int
137d7579d12SMichal Kazior ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out,
138d7579d12SMichal Kazior 		   size_t len)
139d7579d12SMichal Kazior {
140d7579d12SMichal Kazior 	if (!ar->wmi.ops->map_svc)
141d7579d12SMichal Kazior 		return -EOPNOTSUPP;
142d7579d12SMichal Kazior 
143d7579d12SMichal Kazior 	ar->wmi.ops->map_svc(in, out, len);
144d7579d12SMichal Kazior 	return 0;
145d7579d12SMichal Kazior }
146d7579d12SMichal Kazior 
147d7579d12SMichal Kazior static inline int
148d7579d12SMichal Kazior ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb,
149d7579d12SMichal Kazior 		     struct wmi_scan_ev_arg *arg)
150d7579d12SMichal Kazior {
151d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_scan)
152d7579d12SMichal Kazior 		return -EOPNOTSUPP;
153d7579d12SMichal Kazior 
154d7579d12SMichal Kazior 	return ar->wmi.ops->pull_scan(ar, skb, arg);
155d7579d12SMichal Kazior }
156d7579d12SMichal Kazior 
157d7579d12SMichal Kazior static inline int
158d7579d12SMichal Kazior ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,
159d7579d12SMichal Kazior 			struct wmi_mgmt_rx_ev_arg *arg)
160d7579d12SMichal Kazior {
161d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_mgmt_rx)
162d7579d12SMichal Kazior 		return -EOPNOTSUPP;
163d7579d12SMichal Kazior 
164d7579d12SMichal Kazior 	return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg);
165d7579d12SMichal Kazior }
166d7579d12SMichal Kazior 
167d7579d12SMichal Kazior static inline int
168d7579d12SMichal Kazior ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb,
169d7579d12SMichal Kazior 			struct wmi_ch_info_ev_arg *arg)
170d7579d12SMichal Kazior {
171d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_ch_info)
172d7579d12SMichal Kazior 		return -EOPNOTSUPP;
173d7579d12SMichal Kazior 
174d7579d12SMichal Kazior 	return ar->wmi.ops->pull_ch_info(ar, skb, arg);
175d7579d12SMichal Kazior }
176d7579d12SMichal Kazior 
177d7579d12SMichal Kazior static inline int
178d7579d12SMichal Kazior ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb,
179d7579d12SMichal Kazior 			   struct wmi_vdev_start_ev_arg *arg)
180d7579d12SMichal Kazior {
181d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_vdev_start)
182d7579d12SMichal Kazior 		return -EOPNOTSUPP;
183d7579d12SMichal Kazior 
184d7579d12SMichal Kazior 	return ar->wmi.ops->pull_vdev_start(ar, skb, arg);
185d7579d12SMichal Kazior }
186d7579d12SMichal Kazior 
187d7579d12SMichal Kazior static inline int
188d7579d12SMichal Kazior ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb,
189d7579d12SMichal Kazior 			  struct wmi_peer_kick_ev_arg *arg)
190d7579d12SMichal Kazior {
191d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_peer_kick)
192d7579d12SMichal Kazior 		return -EOPNOTSUPP;
193d7579d12SMichal Kazior 
194d7579d12SMichal Kazior 	return ar->wmi.ops->pull_peer_kick(ar, skb, arg);
195d7579d12SMichal Kazior }
196d7579d12SMichal Kazior 
197d7579d12SMichal Kazior static inline int
198d7579d12SMichal Kazior ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb,
199d7579d12SMichal Kazior 		     struct wmi_swba_ev_arg *arg)
200d7579d12SMichal Kazior {
201d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_swba)
202d7579d12SMichal Kazior 		return -EOPNOTSUPP;
203d7579d12SMichal Kazior 
204d7579d12SMichal Kazior 	return ar->wmi.ops->pull_swba(ar, skb, arg);
205d7579d12SMichal Kazior }
206d7579d12SMichal Kazior 
207d7579d12SMichal Kazior static inline int
208d7579d12SMichal Kazior ath10k_wmi_pull_phyerr(struct ath10k *ar, struct sk_buff *skb,
209d7579d12SMichal Kazior 		       struct wmi_phyerr_ev_arg *arg)
210d7579d12SMichal Kazior {
211d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_phyerr)
212d7579d12SMichal Kazior 		return -EOPNOTSUPP;
213d7579d12SMichal Kazior 
214d7579d12SMichal Kazior 	return ar->wmi.ops->pull_phyerr(ar, skb, arg);
215d7579d12SMichal Kazior }
216d7579d12SMichal Kazior 
217d7579d12SMichal Kazior static inline int
218d7579d12SMichal Kazior ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb,
219d7579d12SMichal Kazior 			struct wmi_svc_rdy_ev_arg *arg)
220d7579d12SMichal Kazior {
221d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_svc_rdy)
222d7579d12SMichal Kazior 		return -EOPNOTSUPP;
223d7579d12SMichal Kazior 
224d7579d12SMichal Kazior 	return ar->wmi.ops->pull_svc_rdy(ar, skb, arg);
225d7579d12SMichal Kazior }
226d7579d12SMichal Kazior 
227d7579d12SMichal Kazior static inline int
228d7579d12SMichal Kazior ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb,
229d7579d12SMichal Kazior 		    struct wmi_rdy_ev_arg *arg)
230d7579d12SMichal Kazior {
231d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_rdy)
232d7579d12SMichal Kazior 		return -EOPNOTSUPP;
233d7579d12SMichal Kazior 
234d7579d12SMichal Kazior 	return ar->wmi.ops->pull_rdy(ar, skb, arg);
235d7579d12SMichal Kazior }
236d7579d12SMichal Kazior 
237d7579d12SMichal Kazior static inline int
238d7579d12SMichal Kazior ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
239d7579d12SMichal Kazior 			 struct ath10k_fw_stats *stats)
240d7579d12SMichal Kazior {
241d7579d12SMichal Kazior 	if (!ar->wmi.ops->pull_fw_stats)
242d7579d12SMichal Kazior 		return -EOPNOTSUPP;
243d7579d12SMichal Kazior 
244d7579d12SMichal Kazior 	return ar->wmi.ops->pull_fw_stats(ar, skb, stats);
245d7579d12SMichal Kazior }
246d7579d12SMichal Kazior 
247d7579d12SMichal Kazior static inline int
248d7579d12SMichal Kazior ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
249d7579d12SMichal Kazior {
250d7579d12SMichal Kazior 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
251d7579d12SMichal Kazior 	struct sk_buff *skb;
252d7579d12SMichal Kazior 	int ret;
253d7579d12SMichal Kazior 
254d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_mgmt_tx)
255d7579d12SMichal Kazior 		return -EOPNOTSUPP;
256d7579d12SMichal Kazior 
257d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu);
258d7579d12SMichal Kazior 	if (IS_ERR(skb))
259d7579d12SMichal Kazior 		return PTR_ERR(skb);
260d7579d12SMichal Kazior 
261d7579d12SMichal Kazior 	ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid);
262d7579d12SMichal Kazior 	if (ret)
263d7579d12SMichal Kazior 		return ret;
264d7579d12SMichal Kazior 
265d7579d12SMichal Kazior 	/* FIXME There's no ACK event for Management Tx. This probably
266d7579d12SMichal Kazior 	 * shouldn't be called here either. */
267d7579d12SMichal Kazior 	info->flags |= IEEE80211_TX_STAT_ACK;
268d7579d12SMichal Kazior 	ieee80211_tx_status_irqsafe(ar->hw, msdu);
269d7579d12SMichal Kazior 
270d7579d12SMichal Kazior 	return 0;
271d7579d12SMichal Kazior }
272d7579d12SMichal Kazior 
273d7579d12SMichal Kazior static inline int
274d7579d12SMichal Kazior ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
275d7579d12SMichal Kazior 			      u16 ctl2g, u16 ctl5g,
276d7579d12SMichal Kazior 			      enum wmi_dfs_region dfs_reg)
277d7579d12SMichal Kazior {
278d7579d12SMichal Kazior 	struct sk_buff *skb;
279d7579d12SMichal Kazior 
280d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_rd)
281d7579d12SMichal Kazior 		return -EOPNOTSUPP;
282d7579d12SMichal Kazior 
283d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g,
284d7579d12SMichal Kazior 					   dfs_reg);
285d7579d12SMichal Kazior 	if (IS_ERR(skb))
286d7579d12SMichal Kazior 		return PTR_ERR(skb);
287d7579d12SMichal Kazior 
288d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
289d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_set_regdomain_cmdid);
290d7579d12SMichal Kazior }
291d7579d12SMichal Kazior 
292d7579d12SMichal Kazior static inline int
293d7579d12SMichal Kazior ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)
294d7579d12SMichal Kazior {
295d7579d12SMichal Kazior 	struct sk_buff *skb;
296d7579d12SMichal Kazior 
297d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_suspend)
298d7579d12SMichal Kazior 		return -EOPNOTSUPP;
299d7579d12SMichal Kazior 
300d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt);
301d7579d12SMichal Kazior 	if (IS_ERR(skb))
302d7579d12SMichal Kazior 		return PTR_ERR(skb);
303d7579d12SMichal Kazior 
304d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
305d7579d12SMichal Kazior }
306d7579d12SMichal Kazior 
307d7579d12SMichal Kazior static inline int
308d7579d12SMichal Kazior ath10k_wmi_pdev_resume_target(struct ath10k *ar)
309d7579d12SMichal Kazior {
310d7579d12SMichal Kazior 	struct sk_buff *skb;
311d7579d12SMichal Kazior 
312d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_resume)
313d7579d12SMichal Kazior 		return -EOPNOTSUPP;
314d7579d12SMichal Kazior 
315d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_resume(ar);
316d7579d12SMichal Kazior 	if (IS_ERR(skb))
317d7579d12SMichal Kazior 		return PTR_ERR(skb);
318d7579d12SMichal Kazior 
319d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
320d7579d12SMichal Kazior }
321d7579d12SMichal Kazior 
322d7579d12SMichal Kazior static inline int
323d7579d12SMichal Kazior ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
324d7579d12SMichal Kazior {
325d7579d12SMichal Kazior 	struct sk_buff *skb;
326d7579d12SMichal Kazior 
327d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_param)
328d7579d12SMichal Kazior 		return -EOPNOTSUPP;
329d7579d12SMichal Kazior 
330d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value);
331d7579d12SMichal Kazior 	if (IS_ERR(skb))
332d7579d12SMichal Kazior 		return PTR_ERR(skb);
333d7579d12SMichal Kazior 
334d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
335d7579d12SMichal Kazior }
336d7579d12SMichal Kazior 
337d7579d12SMichal Kazior static inline int
338d7579d12SMichal Kazior ath10k_wmi_cmd_init(struct ath10k *ar)
339d7579d12SMichal Kazior {
340d7579d12SMichal Kazior 	struct sk_buff *skb;
341d7579d12SMichal Kazior 
342d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_init)
343d7579d12SMichal Kazior 		return -EOPNOTSUPP;
344d7579d12SMichal Kazior 
345d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_init(ar);
346d7579d12SMichal Kazior 	if (IS_ERR(skb))
347d7579d12SMichal Kazior 		return PTR_ERR(skb);
348d7579d12SMichal Kazior 
349d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid);
350d7579d12SMichal Kazior }
351d7579d12SMichal Kazior 
352d7579d12SMichal Kazior static inline int
353d7579d12SMichal Kazior ath10k_wmi_start_scan(struct ath10k *ar,
354d7579d12SMichal Kazior 		      const struct wmi_start_scan_arg *arg)
355d7579d12SMichal Kazior {
356d7579d12SMichal Kazior 	struct sk_buff *skb;
357d7579d12SMichal Kazior 
358d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_start_scan)
359d7579d12SMichal Kazior 		return -EOPNOTSUPP;
360d7579d12SMichal Kazior 
361d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_start_scan(ar, arg);
362d7579d12SMichal Kazior 	if (IS_ERR(skb))
363d7579d12SMichal Kazior 		return PTR_ERR(skb);
364d7579d12SMichal Kazior 
365d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
366d7579d12SMichal Kazior }
367d7579d12SMichal Kazior 
368d7579d12SMichal Kazior static inline int
369d7579d12SMichal Kazior ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
370d7579d12SMichal Kazior {
371d7579d12SMichal Kazior 	struct sk_buff *skb;
372d7579d12SMichal Kazior 
373d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_stop_scan)
374d7579d12SMichal Kazior 		return -EOPNOTSUPP;
375d7579d12SMichal Kazior 
376d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_stop_scan(ar, arg);
377d7579d12SMichal Kazior 	if (IS_ERR(skb))
378d7579d12SMichal Kazior 		return PTR_ERR(skb);
379d7579d12SMichal Kazior 
380d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
381d7579d12SMichal Kazior }
382d7579d12SMichal Kazior 
383d7579d12SMichal Kazior static inline int
384d7579d12SMichal Kazior ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
385d7579d12SMichal Kazior 		       enum wmi_vdev_type type,
386d7579d12SMichal Kazior 		       enum wmi_vdev_subtype subtype,
387d7579d12SMichal Kazior 		       const u8 macaddr[ETH_ALEN])
388d7579d12SMichal Kazior {
389d7579d12SMichal Kazior 	struct sk_buff *skb;
390d7579d12SMichal Kazior 
391d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_create)
392d7579d12SMichal Kazior 		return -EOPNOTSUPP;
393d7579d12SMichal Kazior 
394d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr);
395d7579d12SMichal Kazior 	if (IS_ERR(skb))
396d7579d12SMichal Kazior 		return PTR_ERR(skb);
397d7579d12SMichal Kazior 
398d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
399d7579d12SMichal Kazior }
400d7579d12SMichal Kazior 
401d7579d12SMichal Kazior static inline int
402d7579d12SMichal Kazior ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
403d7579d12SMichal Kazior {
404d7579d12SMichal Kazior 	struct sk_buff *skb;
405d7579d12SMichal Kazior 
406d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_delete)
407d7579d12SMichal Kazior 		return -EOPNOTSUPP;
408d7579d12SMichal Kazior 
409d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id);
410d7579d12SMichal Kazior 	if (IS_ERR(skb))
411d7579d12SMichal Kazior 		return PTR_ERR(skb);
412d7579d12SMichal Kazior 
413d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
414d7579d12SMichal Kazior }
415d7579d12SMichal Kazior 
416d7579d12SMichal Kazior static inline int
417d7579d12SMichal Kazior ath10k_wmi_vdev_start(struct ath10k *ar,
418d7579d12SMichal Kazior 		      const struct wmi_vdev_start_request_arg *arg)
419d7579d12SMichal Kazior {
420d7579d12SMichal Kazior 	struct sk_buff *skb;
421d7579d12SMichal Kazior 
422d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_start)
423d7579d12SMichal Kazior 		return -EOPNOTSUPP;
424d7579d12SMichal Kazior 
425d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_start(ar, arg, false);
426d7579d12SMichal Kazior 	if (IS_ERR(skb))
427d7579d12SMichal Kazior 		return PTR_ERR(skb);
428d7579d12SMichal Kazior 
429d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
430d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_start_request_cmdid);
431d7579d12SMichal Kazior }
432d7579d12SMichal Kazior 
433d7579d12SMichal Kazior static inline int
434d7579d12SMichal Kazior ath10k_wmi_vdev_restart(struct ath10k *ar,
435d7579d12SMichal Kazior 			const struct wmi_vdev_start_request_arg *arg)
436d7579d12SMichal Kazior {
437d7579d12SMichal Kazior 	struct sk_buff *skb;
438d7579d12SMichal Kazior 
439d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_start)
440d7579d12SMichal Kazior 		return -EOPNOTSUPP;
441d7579d12SMichal Kazior 
442d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_start(ar, arg, true);
443d7579d12SMichal Kazior 	if (IS_ERR(skb))
444d7579d12SMichal Kazior 		return PTR_ERR(skb);
445d7579d12SMichal Kazior 
446d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
447d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_restart_request_cmdid);
448d7579d12SMichal Kazior }
449d7579d12SMichal Kazior 
450d7579d12SMichal Kazior static inline int
451d7579d12SMichal Kazior ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
452d7579d12SMichal Kazior {
453d7579d12SMichal Kazior 	struct sk_buff *skb;
454d7579d12SMichal Kazior 
455d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_stop)
456d7579d12SMichal Kazior 		return -EOPNOTSUPP;
457d7579d12SMichal Kazior 
458d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id);
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->vdev_stop_cmdid);
463d7579d12SMichal Kazior }
464d7579d12SMichal Kazior 
465d7579d12SMichal Kazior static inline int
466d7579d12SMichal Kazior ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
467d7579d12SMichal Kazior {
468d7579d12SMichal Kazior 	struct sk_buff *skb;
469d7579d12SMichal Kazior 
470d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_up)
471d7579d12SMichal Kazior 		return -EOPNOTSUPP;
472d7579d12SMichal Kazior 
473d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid);
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->vdev_up_cmdid);
478d7579d12SMichal Kazior }
479d7579d12SMichal Kazior 
480d7579d12SMichal Kazior static inline int
481d7579d12SMichal Kazior ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
482d7579d12SMichal Kazior {
483d7579d12SMichal Kazior 	struct sk_buff *skb;
484d7579d12SMichal Kazior 
485d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_down)
486d7579d12SMichal Kazior 		return -EOPNOTSUPP;
487d7579d12SMichal Kazior 
488d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id);
489d7579d12SMichal Kazior 	if (IS_ERR(skb))
490d7579d12SMichal Kazior 		return PTR_ERR(skb);
491d7579d12SMichal Kazior 
492d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
493d7579d12SMichal Kazior }
494d7579d12SMichal Kazior 
495d7579d12SMichal Kazior static inline int
496d7579d12SMichal Kazior ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id,
497d7579d12SMichal Kazior 			  u32 param_value)
498d7579d12SMichal Kazior {
499d7579d12SMichal Kazior 	struct sk_buff *skb;
500d7579d12SMichal Kazior 
501d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_set_param)
502d7579d12SMichal Kazior 		return -EOPNOTSUPP;
503d7579d12SMichal Kazior 
504d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id,
505d7579d12SMichal Kazior 					      param_value);
506d7579d12SMichal Kazior 	if (IS_ERR(skb))
507d7579d12SMichal Kazior 		return PTR_ERR(skb);
508d7579d12SMichal Kazior 
509d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
510d7579d12SMichal Kazior }
511d7579d12SMichal Kazior 
512d7579d12SMichal Kazior static inline int
513d7579d12SMichal Kazior ath10k_wmi_vdev_install_key(struct ath10k *ar,
514d7579d12SMichal Kazior 			    const struct wmi_vdev_install_key_arg *arg)
515d7579d12SMichal Kazior {
516d7579d12SMichal Kazior 	struct sk_buff *skb;
517d7579d12SMichal Kazior 
518d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_vdev_install_key)
519d7579d12SMichal Kazior 		return -EOPNOTSUPP;
520d7579d12SMichal Kazior 
521d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_install_key(ar, arg);
522d7579d12SMichal Kazior 	if (IS_ERR(skb))
523d7579d12SMichal Kazior 		return PTR_ERR(skb);
524d7579d12SMichal Kazior 
525d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
526d7579d12SMichal Kazior 				   ar->wmi.cmd->vdev_install_key_cmdid);
527d7579d12SMichal Kazior }
528d7579d12SMichal Kazior 
529d7579d12SMichal Kazior static inline int
530d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,
531d7579d12SMichal Kazior 			      const struct wmi_vdev_spectral_conf_arg *arg)
532d7579d12SMichal Kazior {
533d7579d12SMichal Kazior 	struct sk_buff *skb;
534d7579d12SMichal Kazior 	u32 cmd_id;
535d7579d12SMichal Kazior 
536d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg);
537d7579d12SMichal Kazior 	if (IS_ERR(skb))
538d7579d12SMichal Kazior 		return PTR_ERR(skb);
539d7579d12SMichal Kazior 
540d7579d12SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid;
541d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
542d7579d12SMichal Kazior }
543d7579d12SMichal Kazior 
544d7579d12SMichal Kazior static inline int
545d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,
546d7579d12SMichal Kazior 				u32 enable)
547d7579d12SMichal Kazior {
548d7579d12SMichal Kazior 	struct sk_buff *skb;
549d7579d12SMichal Kazior 	u32 cmd_id;
550d7579d12SMichal Kazior 
551d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger,
552d7579d12SMichal Kazior 						    enable);
553d7579d12SMichal Kazior 	if (IS_ERR(skb))
554d7579d12SMichal Kazior 		return PTR_ERR(skb);
555d7579d12SMichal Kazior 
556d7579d12SMichal Kazior 	cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid;
557d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, cmd_id);
558d7579d12SMichal Kazior }
559d7579d12SMichal Kazior 
560d7579d12SMichal Kazior static inline int
561d7579d12SMichal Kazior ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
562d7579d12SMichal Kazior 		       const u8 peer_addr[ETH_ALEN])
563d7579d12SMichal Kazior {
564d7579d12SMichal Kazior 	struct sk_buff *skb;
565d7579d12SMichal Kazior 
566d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_create)
567d7579d12SMichal Kazior 		return -EOPNOTSUPP;
568d7579d12SMichal Kazior 
569d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr);
570d7579d12SMichal Kazior 	if (IS_ERR(skb))
571d7579d12SMichal Kazior 		return PTR_ERR(skb);
572d7579d12SMichal Kazior 
573d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
574d7579d12SMichal Kazior }
575d7579d12SMichal Kazior 
576d7579d12SMichal Kazior static inline int
577d7579d12SMichal Kazior ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
578d7579d12SMichal Kazior 		       const u8 peer_addr[ETH_ALEN])
579d7579d12SMichal Kazior {
580d7579d12SMichal Kazior 	struct sk_buff *skb;
581d7579d12SMichal Kazior 
582d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_delete)
583d7579d12SMichal Kazior 		return -EOPNOTSUPP;
584d7579d12SMichal Kazior 
585d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr);
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->peer_delete_cmdid);
590d7579d12SMichal Kazior }
591d7579d12SMichal Kazior 
592d7579d12SMichal Kazior static inline int
593d7579d12SMichal Kazior ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
594d7579d12SMichal Kazior 		      const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
595d7579d12SMichal Kazior {
596d7579d12SMichal Kazior 	struct sk_buff *skb;
597d7579d12SMichal Kazior 
598d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_flush)
599d7579d12SMichal Kazior 		return -EOPNOTSUPP;
600d7579d12SMichal Kazior 
601d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap);
602d7579d12SMichal Kazior 	if (IS_ERR(skb))
603d7579d12SMichal Kazior 		return PTR_ERR(skb);
604d7579d12SMichal Kazior 
605d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
606d7579d12SMichal Kazior }
607d7579d12SMichal Kazior 
608d7579d12SMichal Kazior static inline int
609d7579d12SMichal Kazior ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr,
610d7579d12SMichal Kazior 			  enum wmi_peer_param param_id, u32 param_value)
611d7579d12SMichal Kazior {
612d7579d12SMichal Kazior 	struct sk_buff *skb;
613d7579d12SMichal Kazior 
614d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_set_param)
615d7579d12SMichal Kazior 		return -EOPNOTSUPP;
616d7579d12SMichal Kazior 
617d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id,
618d7579d12SMichal Kazior 					      param_value);
619d7579d12SMichal Kazior 	if (IS_ERR(skb))
620d7579d12SMichal Kazior 		return PTR_ERR(skb);
621d7579d12SMichal Kazior 
622d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
623d7579d12SMichal Kazior }
624d7579d12SMichal Kazior 
625d7579d12SMichal Kazior static inline int
626d7579d12SMichal Kazior ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
627d7579d12SMichal Kazior 		      enum wmi_sta_ps_mode psmode)
628d7579d12SMichal Kazior {
629d7579d12SMichal Kazior 	struct sk_buff *skb;
630d7579d12SMichal Kazior 
631d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_psmode)
632d7579d12SMichal Kazior 		return -EOPNOTSUPP;
633d7579d12SMichal Kazior 
634d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode);
635d7579d12SMichal Kazior 	if (IS_ERR(skb))
636d7579d12SMichal Kazior 		return PTR_ERR(skb);
637d7579d12SMichal Kazior 
638d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
639d7579d12SMichal Kazior 				   ar->wmi.cmd->sta_powersave_mode_cmdid);
640d7579d12SMichal Kazior }
641d7579d12SMichal Kazior 
642d7579d12SMichal Kazior static inline int
643d7579d12SMichal Kazior ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
644d7579d12SMichal Kazior 			    enum wmi_sta_powersave_param param_id, u32 value)
645d7579d12SMichal Kazior {
646d7579d12SMichal Kazior 	struct sk_buff *skb;
647d7579d12SMichal Kazior 
648d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_sta_ps)
649d7579d12SMichal Kazior 		return -EOPNOTSUPP;
650d7579d12SMichal Kazior 
651d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value);
652d7579d12SMichal Kazior 	if (IS_ERR(skb))
653d7579d12SMichal Kazior 		return PTR_ERR(skb);
654d7579d12SMichal Kazior 
655d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
656d7579d12SMichal Kazior 				   ar->wmi.cmd->sta_powersave_param_cmdid);
657d7579d12SMichal Kazior }
658d7579d12SMichal Kazior 
659d7579d12SMichal Kazior static inline int
660d7579d12SMichal Kazior ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
661d7579d12SMichal Kazior 			   enum wmi_ap_ps_peer_param param_id, u32 value)
662d7579d12SMichal Kazior {
663d7579d12SMichal Kazior 	struct sk_buff *skb;
664d7579d12SMichal Kazior 
665d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_set_ap_ps)
666d7579d12SMichal Kazior 		return -EOPNOTSUPP;
667d7579d12SMichal Kazior 
668d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value);
669d7579d12SMichal Kazior 	if (IS_ERR(skb))
670d7579d12SMichal Kazior 		return PTR_ERR(skb);
671d7579d12SMichal Kazior 
672d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
673d7579d12SMichal Kazior 				   ar->wmi.cmd->ap_ps_peer_param_cmdid);
674d7579d12SMichal Kazior }
675d7579d12SMichal Kazior 
676d7579d12SMichal Kazior static inline int
677d7579d12SMichal Kazior ath10k_wmi_scan_chan_list(struct ath10k *ar,
678d7579d12SMichal Kazior 			  const struct wmi_scan_chan_list_arg *arg)
679d7579d12SMichal Kazior {
680d7579d12SMichal Kazior 	struct sk_buff *skb;
681d7579d12SMichal Kazior 
682d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_scan_chan_list)
683d7579d12SMichal Kazior 		return -EOPNOTSUPP;
684d7579d12SMichal Kazior 
685d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_scan_chan_list(ar, arg);
686d7579d12SMichal Kazior 	if (IS_ERR(skb))
687d7579d12SMichal Kazior 		return PTR_ERR(skb);
688d7579d12SMichal Kazior 
689d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
690d7579d12SMichal Kazior }
691d7579d12SMichal Kazior 
692d7579d12SMichal Kazior static inline int
693d7579d12SMichal Kazior ath10k_wmi_peer_assoc(struct ath10k *ar,
694d7579d12SMichal Kazior 		      const struct wmi_peer_assoc_complete_arg *arg)
695d7579d12SMichal Kazior {
696d7579d12SMichal Kazior 	struct sk_buff *skb;
697d7579d12SMichal Kazior 
698d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_peer_assoc)
699d7579d12SMichal Kazior 		return -EOPNOTSUPP;
700d7579d12SMichal Kazior 
701d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_peer_assoc(ar, arg);
702d7579d12SMichal Kazior 	if (IS_ERR(skb))
703d7579d12SMichal Kazior 		return PTR_ERR(skb);
704d7579d12SMichal Kazior 
705d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
706d7579d12SMichal Kazior }
707d7579d12SMichal Kazior 
708d7579d12SMichal Kazior static inline int
709d7579d12SMichal Kazior ath10k_wmi_beacon_send_ref_nowait(struct ath10k_vif *arvif)
710d7579d12SMichal Kazior {
711d7579d12SMichal Kazior 	struct ath10k *ar = arvif->ar;
712d7579d12SMichal Kazior 	struct sk_buff *skb;
713d7579d12SMichal Kazior 	int ret;
714d7579d12SMichal Kazior 
715d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_beacon_dma)
716d7579d12SMichal Kazior 		return -EOPNOTSUPP;
717d7579d12SMichal Kazior 
718d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_beacon_dma(arvif);
719d7579d12SMichal Kazior 	if (IS_ERR(skb))
720d7579d12SMichal Kazior 		return PTR_ERR(skb);
721d7579d12SMichal Kazior 
722d7579d12SMichal Kazior 	ret = ath10k_wmi_cmd_send_nowait(ar, skb,
723d7579d12SMichal Kazior 					 ar->wmi.cmd->pdev_send_bcn_cmdid);
724d7579d12SMichal Kazior 	if (ret) {
725d7579d12SMichal Kazior 		dev_kfree_skb(skb);
726d7579d12SMichal Kazior 		return ret;
727d7579d12SMichal Kazior 	}
728d7579d12SMichal Kazior 
729d7579d12SMichal Kazior 	return 0;
730d7579d12SMichal Kazior }
731d7579d12SMichal Kazior 
732d7579d12SMichal Kazior static inline int
733d7579d12SMichal Kazior ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
734d7579d12SMichal Kazior 			       const struct wmi_pdev_set_wmm_params_arg *arg)
735d7579d12SMichal Kazior {
736d7579d12SMichal Kazior 	struct sk_buff *skb;
737d7579d12SMichal Kazior 
738d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pdev_set_wmm)
739d7579d12SMichal Kazior 		return -EOPNOTSUPP;
740d7579d12SMichal Kazior 
741d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg);
742d7579d12SMichal Kazior 	if (IS_ERR(skb))
743d7579d12SMichal Kazior 		return PTR_ERR(skb);
744d7579d12SMichal Kazior 
745d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
746d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_set_wmm_params_cmdid);
747d7579d12SMichal Kazior }
748d7579d12SMichal Kazior 
749d7579d12SMichal Kazior static inline int
750d7579d12SMichal Kazior ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
751d7579d12SMichal Kazior {
752d7579d12SMichal Kazior 	struct sk_buff *skb;
753d7579d12SMichal Kazior 
754d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_request_stats)
755d7579d12SMichal Kazior 		return -EOPNOTSUPP;
756d7579d12SMichal Kazior 
757d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_request_stats(ar, stats_id);
758d7579d12SMichal Kazior 	if (IS_ERR(skb))
759d7579d12SMichal Kazior 		return PTR_ERR(skb);
760d7579d12SMichal Kazior 
761d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
762d7579d12SMichal Kazior }
763d7579d12SMichal Kazior 
764d7579d12SMichal Kazior static inline int
765d7579d12SMichal Kazior ath10k_wmi_force_fw_hang(struct ath10k *ar,
766d7579d12SMichal Kazior 			 enum wmi_force_fw_hang_type type, u32 delay_ms)
767d7579d12SMichal Kazior {
768d7579d12SMichal Kazior 	struct sk_buff *skb;
769d7579d12SMichal Kazior 
770d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_force_fw_hang)
771d7579d12SMichal Kazior 		return -EOPNOTSUPP;
772d7579d12SMichal Kazior 
773d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms);
774d7579d12SMichal Kazior 	if (IS_ERR(skb))
775d7579d12SMichal Kazior 		return PTR_ERR(skb);
776d7579d12SMichal Kazior 
777d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
778d7579d12SMichal Kazior }
779d7579d12SMichal Kazior 
780d7579d12SMichal Kazior static inline int
781d7579d12SMichal Kazior ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable)
782d7579d12SMichal Kazior {
783d7579d12SMichal Kazior 	struct sk_buff *skb;
784d7579d12SMichal Kazior 
785d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_dbglog_cfg)
786d7579d12SMichal Kazior 		return -EOPNOTSUPP;
787d7579d12SMichal Kazior 
788d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable);
789d7579d12SMichal Kazior 	if (IS_ERR(skb))
790d7579d12SMichal Kazior 		return PTR_ERR(skb);
791d7579d12SMichal Kazior 
792d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);
793d7579d12SMichal Kazior }
794d7579d12SMichal Kazior 
795d7579d12SMichal Kazior static inline int
796d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter)
797d7579d12SMichal Kazior {
798d7579d12SMichal Kazior 	struct sk_buff *skb;
799d7579d12SMichal Kazior 
800d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pktlog_enable)
801d7579d12SMichal Kazior 		return -EOPNOTSUPP;
802d7579d12SMichal Kazior 
803d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pktlog_enable(ar, filter);
804d7579d12SMichal Kazior 	if (IS_ERR(skb))
805d7579d12SMichal Kazior 		return PTR_ERR(skb);
806d7579d12SMichal Kazior 
807d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid);
808d7579d12SMichal Kazior }
809d7579d12SMichal Kazior 
810d7579d12SMichal Kazior static inline int
811d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar)
812d7579d12SMichal Kazior {
813d7579d12SMichal Kazior 	struct sk_buff *skb;
814d7579d12SMichal Kazior 
815d7579d12SMichal Kazior 	if (!ar->wmi.ops->gen_pktlog_disable)
816d7579d12SMichal Kazior 		return -EOPNOTSUPP;
817d7579d12SMichal Kazior 
818d7579d12SMichal Kazior 	skb = ar->wmi.ops->gen_pktlog_disable(ar);
819d7579d12SMichal Kazior 	if (IS_ERR(skb))
820d7579d12SMichal Kazior 		return PTR_ERR(skb);
821d7579d12SMichal Kazior 
822d7579d12SMichal Kazior 	return ath10k_wmi_cmd_send(ar, skb,
823d7579d12SMichal Kazior 				   ar->wmi.cmd->pdev_pktlog_disable_cmdid);
824d7579d12SMichal Kazior }
825d7579d12SMichal Kazior 
826ffdd738dSRajkumar Manoharan static inline int
827ffdd738dSRajkumar Manoharan ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration,
828ffdd738dSRajkumar Manoharan 			       u32 next_offset, u32 enabled)
829ffdd738dSRajkumar Manoharan {
830ffdd738dSRajkumar Manoharan 	struct sk_buff *skb;
831ffdd738dSRajkumar Manoharan 
832ffdd738dSRajkumar Manoharan 	if (!ar->wmi.ops->gen_pdev_set_quiet_mode)
833ffdd738dSRajkumar Manoharan 		return -EOPNOTSUPP;
834ffdd738dSRajkumar Manoharan 
835ffdd738dSRajkumar Manoharan 	skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration,
836ffdd738dSRajkumar Manoharan 						   next_offset, enabled);
837ffdd738dSRajkumar Manoharan 	if (IS_ERR(skb))
838ffdd738dSRajkumar Manoharan 		return PTR_ERR(skb);
839ffdd738dSRajkumar Manoharan 
840ffdd738dSRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
841ffdd738dSRajkumar Manoharan 				   ar->wmi.cmd->pdev_set_quiet_mode_cmdid);
842ffdd738dSRajkumar Manoharan }
843ffdd738dSRajkumar Manoharan 
844a57a6a27SRajkumar Manoharan static inline int
845a57a6a27SRajkumar Manoharan ath10k_wmi_pdev_get_temperature(struct ath10k *ar)
846a57a6a27SRajkumar Manoharan {
847a57a6a27SRajkumar Manoharan 	struct sk_buff *skb;
848a57a6a27SRajkumar Manoharan 
849a57a6a27SRajkumar Manoharan 	if (!ar->wmi.ops->gen_pdev_get_temperature)
850a57a6a27SRajkumar Manoharan 		return -EOPNOTSUPP;
851a57a6a27SRajkumar Manoharan 
852a57a6a27SRajkumar Manoharan 	skb = ar->wmi.ops->gen_pdev_get_temperature(ar);
853a57a6a27SRajkumar Manoharan 	if (IS_ERR(skb))
854a57a6a27SRajkumar Manoharan 		return PTR_ERR(skb);
855a57a6a27SRajkumar Manoharan 
856a57a6a27SRajkumar Manoharan 	return ath10k_wmi_cmd_send(ar, skb,
857a57a6a27SRajkumar Manoharan 				   ar->wmi.cmd->pdev_get_temperature_cmdid);
858a57a6a27SRajkumar Manoharan }
859a57a6a27SRajkumar Manoharan 
860d7579d12SMichal Kazior #endif
861