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