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