Merge tag 'powerpc-5.0-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[sfrench/cifs-2.6.git] / drivers / net / wireless / ath / ath10k / wmi.c
1 /*
2  * Copyright (c) 2005-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
4  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18
19 #include <linux/skbuff.h>
20 #include <linux/ctype.h>
21
22 #include "core.h"
23 #include "htc.h"
24 #include "debug.h"
25 #include "wmi.h"
26 #include "wmi-tlv.h"
27 #include "mac.h"
28 #include "testmode.h"
29 #include "wmi-ops.h"
30 #include "p2p.h"
31 #include "hw.h"
32 #include "hif.h"
33 #include "txrx.h"
34
35 #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9
36 #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ)
37 #define ATH10K_WMI_DFS_CONF_TIMEOUT_HZ (HZ / 6)
38
39 /* MAIN WMI cmd track */
40 static struct wmi_cmd_map wmi_cmd_map = {
41         .init_cmdid = WMI_INIT_CMDID,
42         .start_scan_cmdid = WMI_START_SCAN_CMDID,
43         .stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
44         .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
45         .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
46         .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
47         .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
48         .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
49         .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
50         .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
51         .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
52         .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
53         .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
54         .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
55         .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
56         .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
57         .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
58         .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
59         .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
60         .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
61         .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
62         .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
63         .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
64         .vdev_up_cmdid = WMI_VDEV_UP_CMDID,
65         .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
66         .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
67         .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
68         .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
69         .peer_create_cmdid = WMI_PEER_CREATE_CMDID,
70         .peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
71         .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
72         .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
73         .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
74         .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
75         .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
76         .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
77         .bcn_tx_cmdid = WMI_BCN_TX_CMDID,
78         .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
79         .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
80         .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
81         .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
82         .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
83         .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
84         .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
85         .addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
86         .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
87         .delba_send_cmdid = WMI_DELBA_SEND_CMDID,
88         .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
89         .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
90         .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
91         .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
92         .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
93         .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
94         .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
95         .roam_scan_mode = WMI_ROAM_SCAN_MODE,
96         .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
97         .roam_scan_period = WMI_ROAM_SCAN_PERIOD,
98         .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
99         .roam_ap_profile = WMI_ROAM_AP_PROFILE,
100         .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
101         .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
102         .ofl_scan_period = WMI_OFL_SCAN_PERIOD,
103         .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
104         .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
105         .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
106         .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
107         .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
108         .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
109         .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
110         .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
111         .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
112         .wlan_profile_set_hist_intvl_cmdid =
113                                 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
114         .wlan_profile_get_profile_data_cmdid =
115                                 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
116         .wlan_profile_enable_profile_id_cmdid =
117                                 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
118         .wlan_profile_list_profile_id_cmdid =
119                                 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
120         .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
121         .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
122         .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
123         .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
124         .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
125         .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
126         .wow_enable_disable_wake_event_cmdid =
127                                 WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
128         .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
129         .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
130         .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
131         .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
132         .vdev_spectral_scan_configure_cmdid =
133                                 WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
134         .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
135         .request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
136         .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
137         .network_list_offload_config_cmdid =
138                                 WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
139         .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
140         .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
141         .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
142         .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
143         .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
144         .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
145         .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
146         .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
147         .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
148         .echo_cmdid = WMI_ECHO_CMDID,
149         .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
150         .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
151         .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
152         .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
153         .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
154         .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
155         .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
156         .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
157         .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
158         .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
159         .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
160         .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
161         .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
162         .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
163         .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
164         .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
165         .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
166         .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
167         .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
168         .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
169         .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
170         .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
171         .nan_cmdid = WMI_CMD_UNSUPPORTED,
172         .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
173         .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
174         .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
175         .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
176         .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
177         .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
178         .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
179         .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
180         .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
181         .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
182         .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
183         .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
184         .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
185         .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
186         .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
187         .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
188         .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
189         .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
190         .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
191         .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
192         .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
193         .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
194         .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
195         .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
196         .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
197         .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
198         .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
199         .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
200         .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
201         .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
202         .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
203         .radar_found_cmdid = WMI_CMD_UNSUPPORTED,
204 };
205
206 /* 10.X WMI cmd track */
207 static struct wmi_cmd_map wmi_10x_cmd_map = {
208         .init_cmdid = WMI_10X_INIT_CMDID,
209         .start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
210         .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
211         .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
212         .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
213         .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
214         .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
215         .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
216         .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
217         .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
218         .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
219         .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
220         .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
221         .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
222         .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
223         .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
224         .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
225         .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
226         .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
227         .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
228         .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
229         .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
230         .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
231         .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
232         .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
233         .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
234         .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
235         .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
236         .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
237         .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
238         .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
239         .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
240         .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
241         .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
242         .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
243         .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
244         .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
245         .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
246         .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
247         .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
248         .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
249         .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
250         .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
251         .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
252         .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
253         .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
254         .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
255         .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
256         .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
257         .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
258         .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
259         .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
260         .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
261         .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
262         .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
263         .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
264         .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
265         .roam_scan_rssi_change_threshold =
266                                 WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
267         .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
268         .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
269         .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
270         .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
271         .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
272         .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
273         .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
274         .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
275         .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
276         .ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID,
277         .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
278         .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
279         .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
280         .wlan_profile_set_hist_intvl_cmdid =
281                                 WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
282         .wlan_profile_get_profile_data_cmdid =
283                                 WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
284         .wlan_profile_enable_profile_id_cmdid =
285                                 WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
286         .wlan_profile_list_profile_id_cmdid =
287                                 WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
288         .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
289         .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
290         .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
291         .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
292         .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
293         .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
294         .wow_enable_disable_wake_event_cmdid =
295                                 WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
296         .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
297         .wow_hostwakeup_from_sleep_cmdid =
298                                 WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
299         .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
300         .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
301         .vdev_spectral_scan_configure_cmdid =
302                                 WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
303         .vdev_spectral_scan_enable_cmdid =
304                                 WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
305         .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
306         .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
307         .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
308         .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
309         .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
310         .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
311         .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
312         .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
313         .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
314         .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
315         .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
316         .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
317         .echo_cmdid = WMI_10X_ECHO_CMDID,
318         .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
319         .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
320         .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
321         .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
322         .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
323         .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
324         .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
325         .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
326         .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
327         .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
328         .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
329         .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
330         .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
331         .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
332         .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
333         .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
334         .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
335         .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
336         .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
337         .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
338         .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
339         .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
340         .nan_cmdid = WMI_CMD_UNSUPPORTED,
341         .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
342         .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
343         .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
344         .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
345         .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
346         .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
347         .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
348         .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
349         .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
350         .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
351         .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
352         .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
353         .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
354         .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
355         .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
356         .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
357         .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
358         .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
359         .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
360         .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
361         .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
362         .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
363         .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
364         .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
365         .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
366         .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
367         .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
368         .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
369         .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
370         .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
371         .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
372         .radar_found_cmdid = WMI_CMD_UNSUPPORTED,
373 };
374
375 /* 10.2.4 WMI cmd track */
376 static struct wmi_cmd_map wmi_10_2_4_cmd_map = {
377         .init_cmdid = WMI_10_2_INIT_CMDID,
378         .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
379         .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
380         .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
381         .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
382         .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
383         .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
384         .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
385         .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
386         .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
387         .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
388         .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
389         .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
390         .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
391         .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
392         .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
393         .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
394         .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
395         .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
396         .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
397         .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
398         .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
399         .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
400         .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
401         .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
402         .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
403         .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
404         .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
405         .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
406         .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
407         .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
408         .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
409         .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
410         .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
411         .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
412         .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
413         .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
414         .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
415         .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
416         .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
417         .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
418         .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
419         .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
420         .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
421         .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
422         .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
423         .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
424         .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
425         .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
426         .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
427         .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
428         .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
429         .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
430         .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
431         .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
432         .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
433         .roam_scan_rssi_change_threshold =
434                                 WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
435         .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
436         .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
437         .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
438         .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
439         .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
440         .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
441         .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
442         .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
443         .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
444         .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
445         .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
446         .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
447         .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
448         .wlan_profile_set_hist_intvl_cmdid =
449                                 WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
450         .wlan_profile_get_profile_data_cmdid =
451                                 WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
452         .wlan_profile_enable_profile_id_cmdid =
453                                 WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
454         .wlan_profile_list_profile_id_cmdid =
455                                 WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
456         .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
457         .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
458         .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
459         .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
460         .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
461         .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
462         .wow_enable_disable_wake_event_cmdid =
463                                 WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
464         .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
465         .wow_hostwakeup_from_sleep_cmdid =
466                                 WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
467         .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
468         .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
469         .vdev_spectral_scan_configure_cmdid =
470                                 WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
471         .vdev_spectral_scan_enable_cmdid =
472                                 WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
473         .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
474         .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
475         .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
476         .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
477         .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
478         .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
479         .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
480         .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
481         .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
482         .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
483         .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
484         .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
485         .echo_cmdid = WMI_10_2_ECHO_CMDID,
486         .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
487         .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
488         .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
489         .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
490         .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
491         .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
492         .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
493         .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
494         .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
495         .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID,
496         .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS,
497         .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
498         .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
499         .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
500         .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
501         .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
502         .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
503         .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
504         .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
505         .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
506         .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
507         .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
508         .nan_cmdid = WMI_CMD_UNSUPPORTED,
509         .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
510         .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
511         .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
512         .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
513         .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
514         .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
515         .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
516         .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
517         .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
518         .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
519         .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
520         .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
521         .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
522         .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
523         .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
524         .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
525         .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
526         .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
527         .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
528         .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
529         .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
530         .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
531         .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
532         .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
533         .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
534         .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
535         .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
536         .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
537         .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
538         .pdev_bss_chan_info_request_cmdid =
539                 WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
540         .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
541         .radar_found_cmdid = WMI_CMD_UNSUPPORTED,
542         .set_bb_timing_cmdid = WMI_10_2_PDEV_SET_BB_TIMING_CONFIG_CMDID,
543 };
544
545 /* 10.4 WMI cmd track */
546 static struct wmi_cmd_map wmi_10_4_cmd_map = {
547         .init_cmdid = WMI_10_4_INIT_CMDID,
548         .start_scan_cmdid = WMI_10_4_START_SCAN_CMDID,
549         .stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID,
550         .scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID,
551         .scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID,
552         .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
553         .pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID,
554         .pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID,
555         .pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID,
556         .pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID,
557         .pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID,
558         .pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID,
559         .pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID,
560         .pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID,
561         .pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID,
562         .pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID,
563         .pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID,
564         .pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID,
565         .pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID,
566         .vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID,
567         .vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID,
568         .vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID,
569         .vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID,
570         .vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID,
571         .vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID,
572         .vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID,
573         .vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID,
574         .vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID,
575         .peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID,
576         .peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID,
577         .peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID,
578         .peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID,
579         .peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID,
580         .peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID,
581         .peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID,
582         .peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID,
583         .bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID,
584         .pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID,
585         .bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID,
586         .bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID,
587         .prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID,
588         .mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID,
589         .prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID,
590         .addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID,
591         .addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID,
592         .addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID,
593         .delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID,
594         .addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID,
595         .send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID,
596         .sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID,
597         .sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID,
598         .sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID,
599         .pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID,
600         .pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID,
601         .roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE,
602         .roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD,
603         .roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD,
604         .roam_scan_rssi_change_threshold =
605                                 WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
606         .roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE,
607         .ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE,
608         .ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE,
609         .ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD,
610         .p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO,
611         .p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY,
612         .p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE,
613         .p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE,
614         .p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID,
615         .ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID,
616         .ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID,
617         .peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID,
618         .wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID,
619         .wlan_profile_set_hist_intvl_cmdid =
620                                 WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
621         .wlan_profile_get_profile_data_cmdid =
622                                 WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
623         .wlan_profile_enable_profile_id_cmdid =
624                                 WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
625         .wlan_profile_list_profile_id_cmdid =
626                                 WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
627         .pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID,
628         .pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID,
629         .add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID,
630         .rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID,
631         .wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID,
632         .wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID,
633         .wow_enable_disable_wake_event_cmdid =
634                                 WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
635         .wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID,
636         .wow_hostwakeup_from_sleep_cmdid =
637                                 WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
638         .rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID,
639         .rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID,
640         .vdev_spectral_scan_configure_cmdid =
641                                 WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
642         .vdev_spectral_scan_enable_cmdid =
643                                 WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
644         .request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID,
645         .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
646         .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
647         .gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID,
648         .csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID,
649         .csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID,
650         .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
651         .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
652         .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
653         .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
654         .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
655         .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
656         .echo_cmdid = WMI_10_4_ECHO_CMDID,
657         .pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID,
658         .dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID,
659         .pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID,
660         .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
661         .vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID,
662         .vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID,
663         .force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID,
664         .gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID,
665         .gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID,
666         .pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID,
667         .vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED,
668         .adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED,
669         .scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID,
670         .vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID,
671         .vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID,
672         .wlan_peer_caching_add_peer_cmdid =
673                         WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID,
674         .wlan_peer_caching_evict_peer_cmdid =
675                         WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID,
676         .wlan_peer_caching_restore_peer_cmdid =
677                         WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID,
678         .wlan_peer_caching_print_all_peers_info_cmdid =
679                         WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID,
680         .peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID,
681         .peer_add_proxy_sta_entry_cmdid =
682                         WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID,
683         .rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID,
684         .oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID,
685         .nan_cmdid = WMI_10_4_NAN_CMDID,
686         .vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID,
687         .qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID,
688         .pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID,
689         .pdev_smart_ant_set_rx_antenna_cmdid =
690                         WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID,
691         .peer_smart_ant_set_tx_antenna_cmdid =
692                         WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID,
693         .peer_smart_ant_set_train_info_cmdid =
694                         WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID,
695         .peer_smart_ant_set_node_config_ops_cmdid =
696                         WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID,
697         .pdev_set_antenna_switch_table_cmdid =
698                         WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID,
699         .pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID,
700         .pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID,
701         .pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID,
702         .pdev_ratepwr_chainmsk_table_cmdid =
703                         WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID,
704         .pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID,
705         .tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID,
706         .fwtest_cmdid = WMI_10_4_FWTEST_CMDID,
707         .vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID,
708         .peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID,
709         .pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID,
710         .pdev_get_ani_ofdm_config_cmdid =
711                         WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID,
712         .pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID,
713         .pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID,
714         .pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID,
715         .pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID,
716         .vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID,
717         .pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID,
718         .vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID,
719         .vdev_filter_neighbor_rx_packets_cmdid =
720                         WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID,
721         .mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID,
722         .set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID,
723         .pdev_bss_chan_info_request_cmdid =
724                         WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
725         .ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID,
726         .vdev_set_ie_cmdid = WMI_10_4_VDEV_SET_IE_CMDID,
727         .set_lteu_config_cmdid = WMI_10_4_SET_LTEU_CONFIG_CMDID,
728         .atf_ssid_grouping_request_cmdid =
729                         WMI_10_4_ATF_SSID_GROUPING_REQUEST_CMDID,
730         .peer_atf_ext_request_cmdid = WMI_10_4_PEER_ATF_EXT_REQUEST_CMDID,
731         .set_periodic_channel_stats_cfg_cmdid =
732                         WMI_10_4_SET_PERIODIC_CHANNEL_STATS_CONFIG,
733         .peer_bwf_request_cmdid = WMI_10_4_PEER_BWF_REQUEST_CMDID,
734         .btcoex_cfg_cmdid = WMI_10_4_BTCOEX_CFG_CMDID,
735         .peer_tx_mu_txmit_count_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_COUNT_CMDID,
736         .peer_tx_mu_txmit_rstcnt_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_RSTCNT_CMDID,
737         .peer_gid_userpos_list_cmdid = WMI_10_4_PEER_GID_USERPOS_LIST_CMDID,
738         .pdev_check_cal_version_cmdid = WMI_10_4_PDEV_CHECK_CAL_VERSION_CMDID,
739         .coex_version_cfg_cmid = WMI_10_4_COEX_VERSION_CFG_CMID,
740         .pdev_get_rx_filter_cmdid = WMI_10_4_PDEV_GET_RX_FILTER_CMDID,
741         .pdev_extended_nss_cfg_cmdid = WMI_10_4_PDEV_EXTENDED_NSS_CFG_CMDID,
742         .vdev_set_scan_nac_rssi_cmdid = WMI_10_4_VDEV_SET_SCAN_NAC_RSSI_CMDID,
743         .prog_gpio_band_select_cmdid = WMI_10_4_PROG_GPIO_BAND_SELECT_CMDID,
744         .config_smart_logging_cmdid = WMI_10_4_CONFIG_SMART_LOGGING_CMDID,
745         .debug_fatal_condition_cmdid = WMI_10_4_DEBUG_FATAL_CONDITION_CMDID,
746         .get_tsf_timer_cmdid = WMI_10_4_GET_TSF_TIMER_CMDID,
747         .pdev_get_tpc_table_cmdid = WMI_10_4_PDEV_GET_TPC_TABLE_CMDID,
748         .vdev_sifs_trigger_time_cmdid = WMI_10_4_VDEV_SIFS_TRIGGER_TIME_CMDID,
749         .pdev_wds_entry_list_cmdid = WMI_10_4_PDEV_WDS_ENTRY_LIST_CMDID,
750         .tdls_set_state_cmdid = WMI_10_4_TDLS_SET_STATE_CMDID,
751         .tdls_peer_update_cmdid = WMI_10_4_TDLS_PEER_UPDATE_CMDID,
752         .tdls_set_offchan_mode_cmdid = WMI_10_4_TDLS_SET_OFFCHAN_MODE_CMDID,
753         .radar_found_cmdid = WMI_10_4_RADAR_FOUND_CMDID,
754 };
755
756 /* MAIN WMI VDEV param map */
757 static struct wmi_vdev_param_map wmi_vdev_param_map = {
758         .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
759         .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
760         .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL,
761         .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL,
762         .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE,
763         .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE,
764         .slot_time = WMI_VDEV_PARAM_SLOT_TIME,
765         .preamble = WMI_VDEV_PARAM_PREAMBLE,
766         .swba_time = WMI_VDEV_PARAM_SWBA_TIME,
767         .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD,
768         .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME,
769         .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL,
770         .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD,
771         .wmi_vdev_oc_scheduler_air_time_limit =
772                                         WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
773         .wds = WMI_VDEV_PARAM_WDS,
774         .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW,
775         .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX,
776         .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
777         .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
778         .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM,
779         .chwidth = WMI_VDEV_PARAM_CHWIDTH,
780         .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET,
781         .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION,
782         .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT,
783         .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE,
784         .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE,
785         .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE,
786         .sgi = WMI_VDEV_PARAM_SGI,
787         .ldpc = WMI_VDEV_PARAM_LDPC,
788         .tx_stbc = WMI_VDEV_PARAM_TX_STBC,
789         .rx_stbc = WMI_VDEV_PARAM_RX_STBC,
790         .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD,
791         .def_keyid = WMI_VDEV_PARAM_DEF_KEYID,
792         .nss = WMI_VDEV_PARAM_NSS,
793         .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE,
794         .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE,
795         .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE,
796         .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE,
797         .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
798         .ap_keepalive_min_idle_inactive_time_secs =
799                         WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
800         .ap_keepalive_max_idle_inactive_time_secs =
801                         WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
802         .ap_keepalive_max_unresponsive_time_secs =
803                         WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
804         .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS,
805         .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED,
806         .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS,
807         .txbf = WMI_VDEV_PARAM_TXBF,
808         .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE,
809         .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY,
810         .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE,
811         .ap_detect_out_of_sync_sleeping_sta_time_secs =
812                                         WMI_VDEV_PARAM_UNSUPPORTED,
813         .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
814         .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
815         .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
816         .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
817         .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
818         .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
819         .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
820         .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
821         .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
822         .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
823         .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
824         .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
825         .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
826         .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
827         .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
828         .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
829         .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
830 };
831
832 /* 10.X WMI VDEV param map */
833 static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
834         .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
835         .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
836         .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
837         .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
838         .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
839         .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
840         .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
841         .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
842         .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
843         .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
844         .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
845         .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
846         .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
847         .wmi_vdev_oc_scheduler_air_time_limit =
848                                 WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
849         .wds = WMI_10X_VDEV_PARAM_WDS,
850         .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
851         .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
852         .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
853         .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
854         .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
855         .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
856         .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
857         .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
858         .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
859         .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
860         .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
861         .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
862         .sgi = WMI_10X_VDEV_PARAM_SGI,
863         .ldpc = WMI_10X_VDEV_PARAM_LDPC,
864         .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
865         .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
866         .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
867         .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
868         .nss = WMI_10X_VDEV_PARAM_NSS,
869         .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
870         .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
871         .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
872         .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
873         .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
874         .ap_keepalive_min_idle_inactive_time_secs =
875                 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
876         .ap_keepalive_max_idle_inactive_time_secs =
877                 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
878         .ap_keepalive_max_unresponsive_time_secs =
879                 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
880         .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
881         .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
882         .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
883         .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
884         .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
885         .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
886         .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
887         .ap_detect_out_of_sync_sleeping_sta_time_secs =
888                 WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
889         .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
890         .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
891         .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
892         .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
893         .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
894         .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
895         .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
896         .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
897         .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
898         .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
899         .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
900         .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
901         .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
902         .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
903         .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
904         .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
905         .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
906 };
907
908 static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
909         .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
910         .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
911         .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
912         .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
913         .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
914         .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
915         .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
916         .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
917         .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
918         .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
919         .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
920         .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
921         .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
922         .wmi_vdev_oc_scheduler_air_time_limit =
923                                 WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
924         .wds = WMI_10X_VDEV_PARAM_WDS,
925         .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
926         .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
927         .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
928         .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
929         .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
930         .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
931         .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
932         .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
933         .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
934         .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
935         .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
936         .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
937         .sgi = WMI_10X_VDEV_PARAM_SGI,
938         .ldpc = WMI_10X_VDEV_PARAM_LDPC,
939         .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
940         .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
941         .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
942         .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
943         .nss = WMI_10X_VDEV_PARAM_NSS,
944         .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
945         .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
946         .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
947         .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
948         .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
949         .ap_keepalive_min_idle_inactive_time_secs =
950                 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
951         .ap_keepalive_max_idle_inactive_time_secs =
952                 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
953         .ap_keepalive_max_unresponsive_time_secs =
954                 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
955         .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
956         .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
957         .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
958         .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
959         .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
960         .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
961         .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
962         .ap_detect_out_of_sync_sleeping_sta_time_secs =
963                 WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
964         .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
965         .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
966         .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
967         .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
968         .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
969         .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
970         .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
971         .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
972         .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
973         .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
974         .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
975         .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
976         .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
977         .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
978         .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
979         .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
980         .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
981 };
982
983 static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
984         .rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD,
985         .fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
986         .beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL,
987         .listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL,
988         .multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE,
989         .mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE,
990         .slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME,
991         .preamble = WMI_10_4_VDEV_PARAM_PREAMBLE,
992         .swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME,
993         .wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD,
994         .wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME,
995         .wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL,
996         .dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD,
997         .wmi_vdev_oc_scheduler_air_time_limit =
998                WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
999         .wds = WMI_10_4_VDEV_PARAM_WDS,
1000         .atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW,
1001         .bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX,
1002         .bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT,
1003         .bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT,
1004         .feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM,
1005         .chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH,
1006         .chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET,
1007         .disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION,
1008         .sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT,
1009         .mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE,
1010         .protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE,
1011         .fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE,
1012         .sgi = WMI_10_4_VDEV_PARAM_SGI,
1013         .ldpc = WMI_10_4_VDEV_PARAM_LDPC,
1014         .tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC,
1015         .rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC,
1016         .intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD,
1017         .def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID,
1018         .nss = WMI_10_4_VDEV_PARAM_NSS,
1019         .bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE,
1020         .mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE,
1021         .mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE,
1022         .dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE,
1023         .unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
1024         .ap_keepalive_min_idle_inactive_time_secs =
1025                WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
1026         .ap_keepalive_max_idle_inactive_time_secs =
1027                WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
1028         .ap_keepalive_max_unresponsive_time_secs =
1029                WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
1030         .ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS,
1031         .mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET,
1032         .enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS,
1033         .txbf = WMI_10_4_VDEV_PARAM_TXBF,
1034         .packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE,
1035         .drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY,
1036         .tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE,
1037         .ap_detect_out_of_sync_sleeping_sta_time_secs =
1038                WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
1039         .rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES,
1040         .cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR,
1041         .mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET,
1042         .rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE,
1043         .vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK,
1044         .vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK,
1045         .early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
1046         .early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
1047         .early_rx_bmiss_sample_cycle =
1048                WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
1049         .early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP,
1050         .early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP,
1051         .early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
1052         .proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA,
1053         .meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC,
1054         .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE,
1055         .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK,
1056         .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
1057         .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
1058         .disable_4addr_src_lrn = WMI_10_4_VDEV_PARAM_DISABLE_4_ADDR_SRC_LRN,
1059 };
1060
1061 static struct wmi_pdev_param_map wmi_pdev_param_map = {
1062         .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
1063         .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
1064         .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
1065         .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
1066         .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
1067         .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
1068         .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
1069         .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1070         .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
1071         .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
1072         .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1073         .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
1074         .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
1075         .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1076         .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
1077         .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
1078         .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
1079         .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
1080         .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
1081         .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1082         .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1083         .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
1084         .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1085         .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
1086         .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
1087         .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1088         .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1089         .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1090         .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1091         .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1092         .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1093         .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1094         .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1095         .pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
1096         .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
1097         .dcs = WMI_PDEV_PARAM_DCS,
1098         .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
1099         .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
1100         .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
1101         .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
1102         .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
1103         .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
1104         .proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
1105         .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
1106         .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
1107         .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1108         .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
1109         .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1110         .cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
1111         .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1112         .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1113         .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1114         .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1115         .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1116         .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1117         .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1118         .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1119         .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1120         .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1121         .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1122         .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1123         .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1124         .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1125         .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1126         .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1127         .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1128         .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1129         .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1130         .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1131         .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1132         .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1133         .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1134         .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1135         .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1136         .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1137         .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1138         .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1139         .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1140         .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1141         .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1142         .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1143         .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1144         .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1145         .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1146         .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1147         .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1148         .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1149         .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1150         .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1151         .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1152         .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1153         .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1154 };
1155
1156 static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
1157         .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
1158         .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
1159         .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
1160         .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
1161         .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
1162         .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
1163         .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
1164         .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1165         .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
1166         .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
1167         .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1168         .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
1169         .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
1170         .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1171         .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
1172         .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
1173         .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
1174         .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
1175         .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
1176         .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1177         .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1178         .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
1179         .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1180         .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
1181         .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
1182         .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
1183         .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
1184         .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
1185         .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
1186         .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1187         .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1188         .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1189         .bcnflt_stats_update_period =
1190                                 WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1191         .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
1192         .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
1193         .dcs = WMI_10X_PDEV_PARAM_DCS,
1194         .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
1195         .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
1196         .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
1197         .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
1198         .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
1199         .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
1200         .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
1201         .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
1202         .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
1203         .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
1204         .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
1205         .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
1206         .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1207         .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1208         .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1209         .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1210         .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1211         .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1212         .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1213         .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1214         .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1215         .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1216         .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1217         .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1218         .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1219         .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1220         .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1221         .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1222         .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1223         .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1224         .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1225         .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1226         .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1227         .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1228         .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1229         .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1230         .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1231         .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1232         .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1233         .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1234         .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1235         .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1236         .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1237         .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1238         .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1239         .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1240         .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1241         .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1242         .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1243         .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1244         .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1245         .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1246         .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1247         .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1248         .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1249         .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1250 };
1251
1252 static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = {
1253         .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
1254         .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
1255         .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
1256         .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
1257         .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
1258         .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
1259         .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
1260         .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1261         .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
1262         .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
1263         .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1264         .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
1265         .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
1266         .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1267         .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
1268         .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
1269         .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
1270         .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
1271         .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
1272         .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1273         .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1274         .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
1275         .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1276         .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
1277         .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
1278         .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
1279         .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
1280         .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
1281         .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
1282         .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1283         .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1284         .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1285         .bcnflt_stats_update_period =
1286                                 WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1287         .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
1288         .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
1289         .dcs = WMI_10X_PDEV_PARAM_DCS,
1290         .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
1291         .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
1292         .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
1293         .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
1294         .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
1295         .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
1296         .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
1297         .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
1298         .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
1299         .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
1300         .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
1301         .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
1302         .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1303         .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1304         .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1305         .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1306         .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1307         .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1308         .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1309         .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1310         .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1311         .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1312         .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1313         .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1314         .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1315         .peer_sta_ps_statechg_enable =
1316                                 WMI_10X_PDEV_PARAM_PEER_STA_PS_STATECHG_ENABLE,
1317         .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1318         .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1319         .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1320         .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1321         .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1322         .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1323         .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1324         .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1325         .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1326         .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1327         .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1328         .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1329         .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1330         .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1331         .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1332         .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1333         .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1334         .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1335         .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1336         .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1337         .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1338         .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1339         .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1340         .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1341         .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1342         .pdev_reset = WMI_10X_PDEV_PARAM_PDEV_RESET,
1343         .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1344         .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1345         .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1346         .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1347 };
1348
1349 /* firmware 10.2 specific mappings */
1350 static struct wmi_cmd_map wmi_10_2_cmd_map = {
1351         .init_cmdid = WMI_10_2_INIT_CMDID,
1352         .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
1353         .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
1354         .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
1355         .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
1356         .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
1357         .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
1358         .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
1359         .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
1360         .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
1361         .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
1362         .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
1363         .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
1364         .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
1365         .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
1366         .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
1367         .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
1368         .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
1369         .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
1370         .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
1371         .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
1372         .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
1373         .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
1374         .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
1375         .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
1376         .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
1377         .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
1378         .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
1379         .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
1380         .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
1381         .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
1382         .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
1383         .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
1384         .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
1385         .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
1386         .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
1387         .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
1388         .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
1389         .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
1390         .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
1391         .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
1392         .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
1393         .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
1394         .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
1395         .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
1396         .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
1397         .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
1398         .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
1399         .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
1400         .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
1401         .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
1402         .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
1403         .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
1404         .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
1405         .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
1406         .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
1407         .roam_scan_rssi_change_threshold =
1408                                 WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
1409         .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
1410         .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
1411         .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
1412         .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
1413         .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
1414         .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
1415         .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
1416         .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
1417         .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
1418         .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
1419         .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
1420         .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
1421         .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
1422         .wlan_profile_set_hist_intvl_cmdid =
1423                                 WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1424         .wlan_profile_get_profile_data_cmdid =
1425                                 WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1426         .wlan_profile_enable_profile_id_cmdid =
1427                                 WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1428         .wlan_profile_list_profile_id_cmdid =
1429                                 WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1430         .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
1431         .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
1432         .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
1433         .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
1434         .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
1435         .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
1436         .wow_enable_disable_wake_event_cmdid =
1437                                 WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
1438         .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
1439         .wow_hostwakeup_from_sleep_cmdid =
1440                                 WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
1441         .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
1442         .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
1443         .vdev_spectral_scan_configure_cmdid =
1444                                 WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
1445         .vdev_spectral_scan_enable_cmdid =
1446                                 WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
1447         .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
1448         .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
1449         .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
1450         .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
1451         .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
1452         .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
1453         .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
1454         .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
1455         .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
1456         .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
1457         .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
1458         .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
1459         .echo_cmdid = WMI_10_2_ECHO_CMDID,
1460         .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
1461         .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
1462         .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
1463         .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
1464         .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1465         .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1466         .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
1467         .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
1468         .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
1469         .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
1470         .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
1471         .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
1472         .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
1473         .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
1474         .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
1475         .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
1476         .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
1477         .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
1478         .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
1479         .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
1480         .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1481         .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
1482         .nan_cmdid = WMI_CMD_UNSUPPORTED,
1483         .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
1484         .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
1485         .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
1486         .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1487         .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1488         .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
1489         .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
1490         .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
1491         .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
1492         .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
1493         .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
1494         .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
1495         .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
1496         .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
1497         .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
1498         .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1499         .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1500         .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
1501         .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
1502         .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
1503         .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
1504         .radar_found_cmdid = WMI_CMD_UNSUPPORTED,
1505 };
1506
1507 static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
1508         .tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK,
1509         .rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK,
1510         .txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G,
1511         .txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G,
1512         .txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE,
1513         .beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE,
1514         .beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE,
1515         .resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1516         .protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE,
1517         .dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW,
1518         .non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1519         .agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH,
1520         .sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH,
1521         .ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1522         .ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE,
1523         .ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE,
1524         .ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK,
1525         .ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI,
1526         .ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO,
1527         .ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1528         .ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1529         .ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE,
1530         .ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1531         .l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE,
1532         .dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE,
1533         .pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1534         .pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK,
1535         .pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1536         .pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1537         .pdev_stats_update_period =
1538                         WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1539         .vdev_stats_update_period =
1540                         WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1541         .peer_stats_update_period =
1542                         WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1543         .bcnflt_stats_update_period =
1544                         WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1545         .pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS,
1546         .arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE,
1547         .dcs = WMI_10_4_PDEV_PARAM_DCS,
1548         .ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE,
1549         .ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD,
1550         .ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD,
1551         .ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL,
1552         .ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL,
1553         .dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN,
1554         .proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA,
1555         .idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG,
1556         .power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP,
1557         .fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET,
1558         .burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR,
1559         .burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE,
1560         .cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD,
1561         .aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST,
1562         .rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE,
1563         .smart_antenna_default_antenna =
1564                         WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA,
1565         .igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE,
1566         .igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID,
1567         .antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN,
1568         .rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER,
1569         .set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID,
1570         .proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE,
1571         .set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE,
1572         .set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER,
1573         .remove_mcast2ucast_buffer =
1574                         WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER,
1575         .peer_sta_ps_statechg_enable =
1576                         WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE,
1577         .igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE,
1578         .block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS,
1579         .set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID,
1580         .set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID,
1581         .set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID,
1582         .txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID,
1583         .set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID,
1584         .set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID,
1585         .en_stats = WMI_10_4_PDEV_PARAM_EN_STATS,
1586         .mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY,
1587         .noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION,
1588         .noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD,
1589         .dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE,
1590         .set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO,
1591         .atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH,
1592         .atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION,
1593         .ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN,
1594         .mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT,
1595         .sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL,
1596         .signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G,
1597         .signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G,
1598         .enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU,
1599         .enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU,
1600         .cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD,
1601         .rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE,
1602         .pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET,
1603         .wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET,
1604         .arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR,
1605         .arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR,
1606         .enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
1607 };
1608
1609 static const struct wmi_peer_flags_map wmi_peer_flags_map = {
1610         .auth = WMI_PEER_AUTH,
1611         .qos = WMI_PEER_QOS,
1612         .need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY,
1613         .need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY,
1614         .apsd = WMI_PEER_APSD,
1615         .ht = WMI_PEER_HT,
1616         .bw40 = WMI_PEER_40MHZ,
1617         .stbc = WMI_PEER_STBC,
1618         .ldbc = WMI_PEER_LDPC,
1619         .dyn_mimops = WMI_PEER_DYN_MIMOPS,
1620         .static_mimops = WMI_PEER_STATIC_MIMOPS,
1621         .spatial_mux = WMI_PEER_SPATIAL_MUX,
1622         .vht = WMI_PEER_VHT,
1623         .bw80 = WMI_PEER_80MHZ,
1624         .vht_2g = WMI_PEER_VHT_2G,
1625         .pmf = WMI_PEER_PMF,
1626         .bw160 = WMI_PEER_160MHZ,
1627 };
1628
1629 static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = {
1630         .auth = WMI_10X_PEER_AUTH,
1631         .qos = WMI_10X_PEER_QOS,
1632         .need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY,
1633         .need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY,
1634         .apsd = WMI_10X_PEER_APSD,
1635         .ht = WMI_10X_PEER_HT,
1636         .bw40 = WMI_10X_PEER_40MHZ,
1637         .stbc = WMI_10X_PEER_STBC,
1638         .ldbc = WMI_10X_PEER_LDPC,
1639         .dyn_mimops = WMI_10X_PEER_DYN_MIMOPS,
1640         .static_mimops = WMI_10X_PEER_STATIC_MIMOPS,
1641         .spatial_mux = WMI_10X_PEER_SPATIAL_MUX,
1642         .vht = WMI_10X_PEER_VHT,
1643         .bw80 = WMI_10X_PEER_80MHZ,
1644         .bw160 = WMI_10X_PEER_160MHZ,
1645 };
1646
1647 static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = {
1648         .auth = WMI_10_2_PEER_AUTH,
1649         .qos = WMI_10_2_PEER_QOS,
1650         .need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY,
1651         .need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY,
1652         .apsd = WMI_10_2_PEER_APSD,
1653         .ht = WMI_10_2_PEER_HT,
1654         .bw40 = WMI_10_2_PEER_40MHZ,
1655         .stbc = WMI_10_2_PEER_STBC,
1656         .ldbc = WMI_10_2_PEER_LDPC,
1657         .dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS,
1658         .static_mimops = WMI_10_2_PEER_STATIC_MIMOPS,
1659         .spatial_mux = WMI_10_2_PEER_SPATIAL_MUX,
1660         .vht = WMI_10_2_PEER_VHT,
1661         .bw80 = WMI_10_2_PEER_80MHZ,
1662         .vht_2g = WMI_10_2_PEER_VHT_2G,
1663         .pmf = WMI_10_2_PEER_PMF,
1664         .bw160 = WMI_10_2_PEER_160MHZ,
1665 };
1666
1667 void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
1668                                 const struct wmi_channel_arg *arg)
1669 {
1670         u32 flags = 0;
1671
1672         memset(ch, 0, sizeof(*ch));
1673
1674         if (arg->passive)
1675                 flags |= WMI_CHAN_FLAG_PASSIVE;
1676         if (arg->allow_ibss)
1677                 flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
1678         if (arg->allow_ht)
1679                 flags |= WMI_CHAN_FLAG_ALLOW_HT;
1680         if (arg->allow_vht)
1681                 flags |= WMI_CHAN_FLAG_ALLOW_VHT;
1682         if (arg->ht40plus)
1683                 flags |= WMI_CHAN_FLAG_HT40_PLUS;
1684         if (arg->chan_radar)
1685                 flags |= WMI_CHAN_FLAG_DFS;
1686
1687         ch->mhz = __cpu_to_le32(arg->freq);
1688         ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1);
1689         if (arg->mode == MODE_11AC_VHT80_80)
1690                 ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq2);
1691         else
1692                 ch->band_center_freq2 = 0;
1693         ch->min_power = arg->min_power;
1694         ch->max_power = arg->max_power;
1695         ch->reg_power = arg->max_reg_power;
1696         ch->antenna_max = arg->max_antenna_gain;
1697         ch->max_tx_power = arg->max_power;
1698
1699         /* mode & flags share storage */
1700         ch->mode = arg->mode;
1701         ch->flags |= __cpu_to_le32(flags);
1702 }
1703
1704 int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
1705 {
1706         unsigned long time_left;
1707
1708         time_left = wait_for_completion_timeout(&ar->wmi.service_ready,
1709                                                 WMI_SERVICE_READY_TIMEOUT_HZ);
1710         if (!time_left)
1711                 return -ETIMEDOUT;
1712         return 0;
1713 }
1714
1715 int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
1716 {
1717         unsigned long time_left;
1718
1719         time_left = wait_for_completion_timeout(&ar->wmi.unified_ready,
1720                                                 WMI_UNIFIED_READY_TIMEOUT_HZ);
1721         if (!time_left)
1722                 return -ETIMEDOUT;
1723         return 0;
1724 }
1725
1726 struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len)
1727 {
1728         struct sk_buff *skb;
1729         u32 round_len = roundup(len, 4);
1730
1731         skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len);
1732         if (!skb)
1733                 return NULL;
1734
1735         skb_reserve(skb, WMI_SKB_HEADROOM);
1736         if (!IS_ALIGNED((unsigned long)skb->data, 4))
1737                 ath10k_warn(ar, "Unaligned WMI skb\n");
1738
1739         skb_put(skb, round_len);
1740         memset(skb->data, 0, round_len);
1741
1742         return skb;
1743 }
1744
1745 static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
1746 {
1747         dev_kfree_skb(skb);
1748 }
1749
1750 int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
1751                                u32 cmd_id)
1752 {
1753         struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
1754         struct wmi_cmd_hdr *cmd_hdr;
1755         int ret;
1756         u32 cmd = 0;
1757
1758         if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
1759                 return -ENOMEM;
1760
1761         cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID);
1762
1763         cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
1764         cmd_hdr->cmd_id = __cpu_to_le32(cmd);
1765
1766         memset(skb_cb, 0, sizeof(*skb_cb));
1767         trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len);
1768         ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
1769
1770         if (ret)
1771                 goto err_pull;
1772
1773         return 0;
1774
1775 err_pull:
1776         skb_pull(skb, sizeof(struct wmi_cmd_hdr));
1777         return ret;
1778 }
1779
1780 static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
1781 {
1782         struct ath10k *ar = arvif->ar;
1783         struct ath10k_skb_cb *cb;
1784         struct sk_buff *bcn;
1785         bool dtim_zero;
1786         bool deliver_cab;
1787         int ret;
1788
1789         spin_lock_bh(&ar->data_lock);
1790
1791         bcn = arvif->beacon;
1792
1793         if (!bcn)
1794                 goto unlock;
1795
1796         cb = ATH10K_SKB_CB(bcn);
1797
1798         switch (arvif->beacon_state) {
1799         case ATH10K_BEACON_SENDING:
1800         case ATH10K_BEACON_SENT:
1801                 break;
1802         case ATH10K_BEACON_SCHEDULED:
1803                 arvif->beacon_state = ATH10K_BEACON_SENDING;
1804                 spin_unlock_bh(&ar->data_lock);
1805
1806                 dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO);
1807                 deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB);
1808                 ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar,
1809                                                         arvif->vdev_id,
1810                                                         bcn->data, bcn->len,
1811                                                         cb->paddr,
1812                                                         dtim_zero,
1813                                                         deliver_cab);
1814
1815                 spin_lock_bh(&ar->data_lock);
1816
1817                 if (ret == 0)
1818                         arvif->beacon_state = ATH10K_BEACON_SENT;
1819                 else
1820                         arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
1821         }
1822
1823 unlock:
1824         spin_unlock_bh(&ar->data_lock);
1825 }
1826
1827 static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
1828                                        struct ieee80211_vif *vif)
1829 {
1830         struct ath10k_vif *arvif = (void *)vif->drv_priv;
1831
1832         ath10k_wmi_tx_beacon_nowait(arvif);
1833 }
1834
1835 static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar)
1836 {
1837         ieee80211_iterate_active_interfaces_atomic(ar->hw,
1838                                                    IEEE80211_IFACE_ITER_NORMAL,
1839                                                    ath10k_wmi_tx_beacons_iter,
1840                                                    NULL);
1841 }
1842
1843 static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
1844 {
1845         /* try to send pending beacons first. they take priority */
1846         ath10k_wmi_tx_beacons_nowait(ar);
1847
1848         wake_up(&ar->wmi.tx_credits_wq);
1849 }
1850
1851 int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
1852 {
1853         int ret = -EOPNOTSUPP;
1854
1855         might_sleep();
1856
1857         if (cmd_id == WMI_CMD_UNSUPPORTED) {
1858                 ath10k_warn(ar, "wmi command %d is not supported by firmware\n",
1859                             cmd_id);
1860                 return ret;
1861         }
1862
1863         wait_event_timeout(ar->wmi.tx_credits_wq, ({
1864                 /* try to send pending beacons first. they take priority */
1865                 ath10k_wmi_tx_beacons_nowait(ar);
1866
1867                 ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
1868
1869                 if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
1870                         ret = -ESHUTDOWN;
1871
1872                 (ret != -EAGAIN);
1873         }), 3 * HZ);
1874
1875         if (ret)
1876                 dev_kfree_skb_any(skb);
1877
1878         if (ret == -EAGAIN) {
1879                 ath10k_warn(ar, "wmi command %d timeout, restarting hardware\n",
1880                             cmd_id);
1881                 queue_work(ar->workqueue, &ar->restart_work);
1882         }
1883
1884         return ret;
1885 }
1886
1887 static struct sk_buff *
1888 ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
1889 {
1890         struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
1891         struct ath10k_vif *arvif;
1892         struct wmi_mgmt_tx_cmd *cmd;
1893         struct ieee80211_hdr *hdr;
1894         struct sk_buff *skb;
1895         int len;
1896         u32 vdev_id;
1897         u32 buf_len = msdu->len;
1898         u16 fc;
1899
1900         hdr = (struct ieee80211_hdr *)msdu->data;
1901         fc = le16_to_cpu(hdr->frame_control);
1902
1903         if (cb->vif) {
1904                 arvif = (void *)cb->vif->drv_priv;
1905                 vdev_id = arvif->vdev_id;
1906         } else {
1907                 vdev_id = 0;
1908         }
1909
1910         if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
1911                 return ERR_PTR(-EINVAL);
1912
1913         len = sizeof(cmd->hdr) + msdu->len;
1914
1915         if ((ieee80211_is_action(hdr->frame_control) ||
1916              ieee80211_is_deauth(hdr->frame_control) ||
1917              ieee80211_is_disassoc(hdr->frame_control)) &&
1918              ieee80211_has_protected(hdr->frame_control)) {
1919                 len += IEEE80211_CCMP_MIC_LEN;
1920                 buf_len += IEEE80211_CCMP_MIC_LEN;
1921         }
1922
1923         len = round_up(len, 4);
1924
1925         skb = ath10k_wmi_alloc_skb(ar, len);
1926         if (!skb)
1927                 return ERR_PTR(-ENOMEM);
1928
1929         cmd = (struct wmi_mgmt_tx_cmd *)skb->data;
1930
1931         cmd->hdr.vdev_id = __cpu_to_le32(vdev_id);
1932         cmd->hdr.tx_rate = 0;
1933         cmd->hdr.tx_power = 0;
1934         cmd->hdr.buf_len = __cpu_to_le32(buf_len);
1935
1936         ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr));
1937         memcpy(cmd->buf, msdu->data, msdu->len);
1938
1939         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n",
1940                    msdu, skb->len, fc & IEEE80211_FCTL_FTYPE,
1941                    fc & IEEE80211_FCTL_STYPE);
1942         trace_ath10k_tx_hdr(ar, skb->data, skb->len);
1943         trace_ath10k_tx_payload(ar, skb->data, skb->len);
1944
1945         return skb;
1946 }
1947
1948 static void ath10k_wmi_event_scan_started(struct ath10k *ar)
1949 {
1950         lockdep_assert_held(&ar->data_lock);
1951
1952         switch (ar->scan.state) {
1953         case ATH10K_SCAN_IDLE:
1954         case ATH10K_SCAN_RUNNING:
1955         case ATH10K_SCAN_ABORTING:
1956                 ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n",
1957                             ath10k_scan_state_str(ar->scan.state),
1958                             ar->scan.state);
1959                 break;
1960         case ATH10K_SCAN_STARTING:
1961                 ar->scan.state = ATH10K_SCAN_RUNNING;
1962
1963                 if (ar->scan.is_roc)
1964                         ieee80211_ready_on_channel(ar->hw);
1965
1966                 complete(&ar->scan.started);
1967                 break;
1968         }
1969 }
1970
1971 static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
1972 {
1973         lockdep_assert_held(&ar->data_lock);
1974
1975         switch (ar->scan.state) {
1976         case ATH10K_SCAN_IDLE:
1977         case ATH10K_SCAN_RUNNING:
1978         case ATH10K_SCAN_ABORTING:
1979                 ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
1980                             ath10k_scan_state_str(ar->scan.state),
1981                             ar->scan.state);
1982                 break;
1983         case ATH10K_SCAN_STARTING:
1984                 complete(&ar->scan.started);
1985                 __ath10k_scan_finish(ar);
1986                 break;
1987         }
1988 }
1989
1990 static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
1991 {
1992         lockdep_assert_held(&ar->data_lock);
1993
1994         switch (ar->scan.state) {
1995         case ATH10K_SCAN_IDLE:
1996         case ATH10K_SCAN_STARTING:
1997                 /* One suspected reason scan can be completed while starting is
1998                  * if firmware fails to deliver all scan events to the host,
1999                  * e.g. when transport pipe is full. This has been observed
2000                  * with spectral scan phyerr events starving wmi transport
2001                  * pipe. In such case the "scan completed" event should be (and
2002                  * is) ignored by the host as it may be just firmware's scan
2003                  * state machine recovering.
2004                  */
2005                 ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n",
2006                             ath10k_scan_state_str(ar->scan.state),
2007                             ar->scan.state);
2008                 break;
2009         case ATH10K_SCAN_RUNNING:
2010         case ATH10K_SCAN_ABORTING:
2011                 __ath10k_scan_finish(ar);
2012                 break;
2013         }
2014 }
2015
2016 static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar)
2017 {
2018         lockdep_assert_held(&ar->data_lock);
2019
2020         switch (ar->scan.state) {
2021         case ATH10K_SCAN_IDLE:
2022         case ATH10K_SCAN_STARTING:
2023                 ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n",
2024                             ath10k_scan_state_str(ar->scan.state),
2025                             ar->scan.state);
2026                 break;
2027         case ATH10K_SCAN_RUNNING:
2028         case ATH10K_SCAN_ABORTING:
2029                 ar->scan_channel = NULL;
2030                 break;
2031         }
2032 }
2033
2034 static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq)
2035 {
2036         lockdep_assert_held(&ar->data_lock);
2037
2038         switch (ar->scan.state) {
2039         case ATH10K_SCAN_IDLE:
2040         case ATH10K_SCAN_STARTING:
2041                 ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n",
2042                             ath10k_scan_state_str(ar->scan.state),
2043                             ar->scan.state);
2044                 break;
2045         case ATH10K_SCAN_RUNNING:
2046         case ATH10K_SCAN_ABORTING:
2047                 ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);
2048
2049                 if (ar->scan.is_roc && ar->scan.roc_freq == freq)
2050                         complete(&ar->scan.on_channel);
2051                 break;
2052         }
2053 }
2054
2055 static const char *
2056 ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type,
2057                                enum wmi_scan_completion_reason reason)
2058 {
2059         switch (type) {
2060         case WMI_SCAN_EVENT_STARTED:
2061                 return "started";
2062         case WMI_SCAN_EVENT_COMPLETED:
2063                 switch (reason) {
2064                 case WMI_SCAN_REASON_COMPLETED:
2065                         return "completed";
2066                 case WMI_SCAN_REASON_CANCELLED:
2067                         return "completed [cancelled]";
2068                 case WMI_SCAN_REASON_PREEMPTED:
2069                         return "completed [preempted]";
2070                 case WMI_SCAN_REASON_TIMEDOUT:
2071                         return "completed [timedout]";
2072                 case WMI_SCAN_REASON_INTERNAL_FAILURE:
2073                         return "completed [internal err]";
2074                 case WMI_SCAN_REASON_MAX:
2075                         break;
2076                 }
2077                 return "completed [unknown]";
2078         case WMI_SCAN_EVENT_BSS_CHANNEL:
2079                 return "bss channel";
2080         case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
2081                 return "foreign channel";
2082         case WMI_SCAN_EVENT_DEQUEUED:
2083                 return "dequeued";
2084         case WMI_SCAN_EVENT_PREEMPTED:
2085                 return "preempted";
2086         case WMI_SCAN_EVENT_START_FAILED:
2087                 return "start failed";
2088         case WMI_SCAN_EVENT_RESTARTED:
2089                 return "restarted";
2090         case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
2091                 return "foreign channel exit";
2092         default:
2093                 return "unknown";
2094         }
2095 }
2096
2097 static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb,
2098                                       struct wmi_scan_ev_arg *arg)
2099 {
2100         struct wmi_scan_event *ev = (void *)skb->data;
2101
2102         if (skb->len < sizeof(*ev))
2103                 return -EPROTO;
2104
2105         skb_pull(skb, sizeof(*ev));
2106         arg->event_type = ev->event_type;
2107         arg->reason = ev->reason;
2108         arg->channel_freq = ev->channel_freq;
2109         arg->scan_req_id = ev->scan_req_id;
2110         arg->scan_id = ev->scan_id;
2111         arg->vdev_id = ev->vdev_id;
2112
2113         return 0;
2114 }
2115
2116 int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
2117 {
2118         struct wmi_scan_ev_arg arg = {};
2119         enum wmi_scan_event_type event_type;
2120         enum wmi_scan_completion_reason reason;
2121         u32 freq;
2122         u32 req_id;
2123         u32 scan_id;
2124         u32 vdev_id;
2125         int ret;
2126
2127         ret = ath10k_wmi_pull_scan(ar, skb, &arg);
2128         if (ret) {
2129                 ath10k_warn(ar, "failed to parse scan event: %d\n", ret);
2130                 return ret;
2131         }
2132
2133         event_type = __le32_to_cpu(arg.event_type);
2134         reason = __le32_to_cpu(arg.reason);
2135         freq = __le32_to_cpu(arg.channel_freq);
2136         req_id = __le32_to_cpu(arg.scan_req_id);
2137         scan_id = __le32_to_cpu(arg.scan_id);
2138         vdev_id = __le32_to_cpu(arg.vdev_id);
2139
2140         spin_lock_bh(&ar->data_lock);
2141
2142         ath10k_dbg(ar, ATH10K_DBG_WMI,
2143                    "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n",
2144                    ath10k_wmi_event_scan_type_str(event_type, reason),
2145                    event_type, reason, freq, req_id, scan_id, vdev_id,
2146                    ath10k_scan_state_str(ar->scan.state), ar->scan.state);
2147
2148         switch (event_type) {
2149         case WMI_SCAN_EVENT_STARTED:
2150                 ath10k_wmi_event_scan_started(ar);
2151                 break;
2152         case WMI_SCAN_EVENT_COMPLETED:
2153                 ath10k_wmi_event_scan_completed(ar);
2154                 break;
2155         case WMI_SCAN_EVENT_BSS_CHANNEL:
2156                 ath10k_wmi_event_scan_bss_chan(ar);
2157                 break;
2158         case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
2159                 ath10k_wmi_event_scan_foreign_chan(ar, freq);
2160                 break;
2161         case WMI_SCAN_EVENT_START_FAILED:
2162                 ath10k_warn(ar, "received scan start failure event\n");
2163                 ath10k_wmi_event_scan_start_failed(ar);
2164                 break;
2165         case WMI_SCAN_EVENT_DEQUEUED:
2166         case WMI_SCAN_EVENT_PREEMPTED:
2167         case WMI_SCAN_EVENT_RESTARTED:
2168         case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
2169         default:
2170                 break;
2171         }
2172
2173         spin_unlock_bh(&ar->data_lock);
2174         return 0;
2175 }
2176
2177 /* If keys are configured, HW decrypts all frames
2178  * with protected bit set. Mark such frames as decrypted.
2179  */
2180 static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar,
2181                                          struct sk_buff *skb,
2182                                          struct ieee80211_rx_status *status)
2183 {
2184         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2185         unsigned int hdrlen;
2186         bool peer_key;
2187         u8 *addr, keyidx;
2188
2189         if (!ieee80211_is_auth(hdr->frame_control) ||
2190             !ieee80211_has_protected(hdr->frame_control))
2191                 return;
2192
2193         hdrlen = ieee80211_hdrlen(hdr->frame_control);
2194         if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN))
2195                 return;
2196
2197         keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT;
2198         addr = ieee80211_get_SA(hdr);
2199
2200         spin_lock_bh(&ar->data_lock);
2201         peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx);
2202         spin_unlock_bh(&ar->data_lock);
2203
2204         if (peer_key) {
2205                 ath10k_dbg(ar, ATH10K_DBG_MAC,
2206                            "mac wep key present for peer %pM\n", addr);
2207                 status->flag |= RX_FLAG_DECRYPTED;
2208         }
2209 }
2210
2211 static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
2212                                          struct wmi_mgmt_rx_ev_arg *arg)
2213 {
2214         struct wmi_mgmt_rx_event_v1 *ev_v1;
2215         struct wmi_mgmt_rx_event_v2 *ev_v2;
2216         struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
2217         struct wmi_mgmt_rx_ext_info *ext_info;
2218         size_t pull_len;
2219         u32 msdu_len;
2220         u32 len;
2221
2222         if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX,
2223                      ar->running_fw->fw_file.fw_features)) {
2224                 ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data;
2225                 ev_hdr = &ev_v2->hdr.v1;
2226                 pull_len = sizeof(*ev_v2);
2227         } else {
2228                 ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data;
2229                 ev_hdr = &ev_v1->hdr;
2230                 pull_len = sizeof(*ev_v1);
2231         }
2232
2233         if (skb->len < pull_len)
2234                 return -EPROTO;
2235
2236         skb_pull(skb, pull_len);
2237         arg->channel = ev_hdr->channel;
2238         arg->buf_len = ev_hdr->buf_len;
2239         arg->status = ev_hdr->status;
2240         arg->snr = ev_hdr->snr;
2241         arg->phy_mode = ev_hdr->phy_mode;
2242         arg->rate = ev_hdr->rate;
2243
2244         msdu_len = __le32_to_cpu(arg->buf_len);
2245         if (skb->len < msdu_len)
2246                 return -EPROTO;
2247
2248         if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
2249                 len = ALIGN(le32_to_cpu(arg->buf_len), 4);
2250                 ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
2251                 memcpy(&arg->ext_info, ext_info,
2252                        sizeof(struct wmi_mgmt_rx_ext_info));
2253         }
2254         /* the WMI buffer might've ended up being padded to 4 bytes due to HTC
2255          * trailer with credit update. Trim the excess garbage.
2256          */
2257         skb_trim(skb, msdu_len);
2258
2259         return 0;
2260 }
2261
2262 static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar,
2263                                               struct sk_buff *skb,
2264                                               struct wmi_mgmt_rx_ev_arg *arg)
2265 {
2266         struct wmi_10_4_mgmt_rx_event *ev;
2267         struct wmi_10_4_mgmt_rx_hdr *ev_hdr;
2268         size_t pull_len;
2269         u32 msdu_len;
2270         struct wmi_mgmt_rx_ext_info *ext_info;
2271         u32 len;
2272
2273         ev = (struct wmi_10_4_mgmt_rx_event *)skb->data;
2274         ev_hdr = &ev->hdr;
2275         pull_len = sizeof(*ev);
2276
2277         if (skb->len < pull_len)
2278                 return -EPROTO;
2279
2280         skb_pull(skb, pull_len);
2281         arg->channel = ev_hdr->channel;
2282         arg->buf_len = ev_hdr->buf_len;
2283         arg->status = ev_hdr->status;
2284         arg->snr = ev_hdr->snr;
2285         arg->phy_mode = ev_hdr->phy_mode;
2286         arg->rate = ev_hdr->rate;
2287
2288         msdu_len = __le32_to_cpu(arg->buf_len);
2289         if (skb->len < msdu_len)
2290                 return -EPROTO;
2291
2292         if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
2293                 len = ALIGN(le32_to_cpu(arg->buf_len), 4);
2294                 ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
2295                 memcpy(&arg->ext_info, ext_info,
2296                        sizeof(struct wmi_mgmt_rx_ext_info));
2297         }
2298
2299         /* Make sure bytes added for padding are removed. */
2300         skb_trim(skb, msdu_len);
2301
2302         return 0;
2303 }
2304
2305 static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar,
2306                                        struct ieee80211_hdr *hdr)
2307 {
2308         if (!ieee80211_has_protected(hdr->frame_control))
2309                 return false;
2310
2311         /* FW delivers WEP Shared Auth frame with Protected Bit set and
2312          * encrypted payload. However in case of PMF it delivers decrypted
2313          * frames with Protected Bit set.
2314          */
2315         if (ieee80211_is_auth(hdr->frame_control))
2316                 return false;
2317
2318         /* qca99x0 based FW delivers broadcast or multicast management frames
2319          * (ex: group privacy action frames in mesh) as encrypted payload.
2320          */
2321         if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) &&
2322             ar->hw_params.sw_decrypt_mcast_mgmt)
2323                 return false;
2324
2325         return true;
2326 }
2327
2328 static int wmi_process_mgmt_tx_comp(struct ath10k *ar, u32 desc_id,
2329                                     u32 status)
2330 {
2331         struct ath10k_mgmt_tx_pkt_addr *pkt_addr;
2332         struct ath10k_wmi *wmi = &ar->wmi;
2333         struct ieee80211_tx_info *info;
2334         struct sk_buff *msdu;
2335         int ret;
2336
2337         spin_lock_bh(&ar->data_lock);
2338
2339         pkt_addr = idr_find(&wmi->mgmt_pending_tx, desc_id);
2340         if (!pkt_addr) {
2341                 ath10k_warn(ar, "received mgmt tx completion for invalid msdu_id: %d\n",
2342                             desc_id);
2343                 ret = -ENOENT;
2344                 goto out;
2345         }
2346
2347         msdu = pkt_addr->vaddr;
2348         dma_unmap_single(ar->dev, pkt_addr->paddr,
2349                          msdu->len, DMA_FROM_DEVICE);
2350         info = IEEE80211_SKB_CB(msdu);
2351
2352         if (status)
2353                 info->flags &= ~IEEE80211_TX_STAT_ACK;
2354         else
2355                 info->flags |= IEEE80211_TX_STAT_ACK;
2356
2357         ieee80211_tx_status_irqsafe(ar->hw, msdu);
2358
2359         ret = 0;
2360
2361 out:
2362         idr_remove(&wmi->mgmt_pending_tx, desc_id);
2363         spin_unlock_bh(&ar->data_lock);
2364         return ret;
2365 }
2366
2367 int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb)
2368 {
2369         struct wmi_tlv_mgmt_tx_compl_ev_arg arg;
2370         int ret;
2371
2372         ret = ath10k_wmi_pull_mgmt_tx_compl(ar, skb, &arg);
2373         if (ret) {
2374                 ath10k_warn(ar, "failed to parse mgmt comp event: %d\n", ret);
2375                 return ret;
2376         }
2377
2378         wmi_process_mgmt_tx_comp(ar, __le32_to_cpu(arg.desc_id),
2379                                  __le32_to_cpu(arg.status));
2380
2381         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv evnt mgmt tx completion\n");
2382
2383         return 0;
2384 }
2385
2386 int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
2387 {
2388         struct wmi_mgmt_rx_ev_arg arg = {};
2389         struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
2390         struct ieee80211_hdr *hdr;
2391         struct ieee80211_supported_band *sband;
2392         u32 rx_status;
2393         u32 channel;
2394         u32 phy_mode;
2395         u32 snr;
2396         u32 rate;
2397         u16 fc;
2398         int ret;
2399
2400         ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg);
2401         if (ret) {
2402                 ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret);
2403                 dev_kfree_skb(skb);
2404                 return ret;
2405         }
2406
2407         channel = __le32_to_cpu(arg.channel);
2408         rx_status = __le32_to_cpu(arg.status);
2409         snr = __le32_to_cpu(arg.snr);
2410         phy_mode = __le32_to_cpu(arg.phy_mode);
2411         rate = __le32_to_cpu(arg.rate);
2412
2413         memset(status, 0, sizeof(*status));
2414
2415         ath10k_dbg(ar, ATH10K_DBG_MGMT,
2416                    "event mgmt rx status %08x\n", rx_status);
2417
2418         if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) ||
2419             (rx_status & (WMI_RX_STATUS_ERR_DECRYPT |
2420             WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) {
2421                 dev_kfree_skb(skb);
2422                 return 0;
2423         }
2424
2425         if (rx_status & WMI_RX_STATUS_ERR_MIC)
2426                 status->flag |= RX_FLAG_MMIC_ERROR;
2427
2428         if (rx_status & WMI_RX_STATUS_EXT_INFO) {
2429                 status->mactime =
2430                         __le64_to_cpu(arg.ext_info.rx_mac_timestamp);
2431                 status->flag |= RX_FLAG_MACTIME_END;
2432         }
2433         /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to
2434          * MODE_11B. This means phy_mode is not a reliable source for the band
2435          * of mgmt rx.
2436          */
2437         if (channel >= 1 && channel <= 14) {
2438                 status->band = NL80211_BAND_2GHZ;
2439         } else if (channel >= 36 && channel <= ATH10K_MAX_5G_CHAN) {
2440                 status->band = NL80211_BAND_5GHZ;
2441         } else {
2442                 /* Shouldn't happen unless list of advertised channels to
2443                  * mac80211 has been changed.
2444                  */
2445                 WARN_ON_ONCE(1);
2446                 dev_kfree_skb(skb);
2447                 return 0;
2448         }
2449
2450         if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ)
2451                 ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
2452
2453         sband = &ar->mac.sbands[status->band];
2454
2455         status->freq = ieee80211_channel_to_frequency(channel, status->band);
2456         status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
2457         status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100);
2458
2459         hdr = (struct ieee80211_hdr *)skb->data;
2460         fc = le16_to_cpu(hdr->frame_control);
2461
2462         /* Firmware is guaranteed to report all essential management frames via
2463          * WMI while it can deliver some extra via HTT. Since there can be
2464          * duplicates split the reporting wrt monitor/sniffing.
2465          */
2466         status->flag |= RX_FLAG_SKIP_MONITOR;
2467
2468         ath10k_wmi_handle_wep_reauth(ar, skb, status);
2469
2470         if (ath10k_wmi_rx_is_decrypted(ar, hdr)) {
2471                 status->flag |= RX_FLAG_DECRYPTED;
2472
2473                 if (!ieee80211_is_action(hdr->frame_control) &&
2474                     !ieee80211_is_deauth(hdr->frame_control) &&
2475                     !ieee80211_is_disassoc(hdr->frame_control)) {
2476                         status->flag |= RX_FLAG_IV_STRIPPED |
2477                                         RX_FLAG_MMIC_STRIPPED;
2478                         hdr->frame_control = __cpu_to_le16(fc &
2479                                         ~IEEE80211_FCTL_PROTECTED);
2480                 }
2481         }
2482
2483         if (ieee80211_is_beacon(hdr->frame_control))
2484                 ath10k_mac_handle_beacon(ar, skb);
2485
2486         ath10k_dbg(ar, ATH10K_DBG_MGMT,
2487                    "event mgmt rx skb %pK len %d ftype %02x stype %02x\n",
2488                    skb, skb->len,
2489                    fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE);
2490
2491         ath10k_dbg(ar, ATH10K_DBG_MGMT,
2492                    "event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
2493                    status->freq, status->band, status->signal,
2494                    status->rate_idx);
2495
2496         ieee80211_rx_ni(ar->hw, skb);
2497
2498         return 0;
2499 }
2500
2501 static int freq_to_idx(struct ath10k *ar, int freq)
2502 {
2503         struct ieee80211_supported_band *sband;
2504         int band, ch, idx = 0;
2505
2506         for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
2507                 sband = ar->hw->wiphy->bands[band];
2508                 if (!sband)
2509                         continue;
2510
2511                 for (ch = 0; ch < sband->n_channels; ch++, idx++)
2512                         if (sband->channels[ch].center_freq == freq)
2513                                 goto exit;
2514         }
2515
2516 exit:
2517         return idx;
2518 }
2519
2520 static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb,
2521                                          struct wmi_ch_info_ev_arg *arg)
2522 {
2523         struct wmi_chan_info_event *ev = (void *)skb->data;
2524
2525         if (skb->len < sizeof(*ev))
2526                 return -EPROTO;
2527
2528         skb_pull(skb, sizeof(*ev));
2529         arg->err_code = ev->err_code;
2530         arg->freq = ev->freq;
2531         arg->cmd_flags = ev->cmd_flags;
2532         arg->noise_floor = ev->noise_floor;
2533         arg->rx_clear_count = ev->rx_clear_count;
2534         arg->cycle_count = ev->cycle_count;
2535
2536         return 0;
2537 }
2538
2539 static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar,
2540                                               struct sk_buff *skb,
2541                                               struct wmi_ch_info_ev_arg *arg)
2542 {
2543         struct wmi_10_4_chan_info_event *ev = (void *)skb->data;
2544
2545         if (skb->len < sizeof(*ev))
2546                 return -EPROTO;
2547
2548         skb_pull(skb, sizeof(*ev));
2549         arg->err_code = ev->err_code;
2550         arg->freq = ev->freq;
2551         arg->cmd_flags = ev->cmd_flags;
2552         arg->noise_floor = ev->noise_floor;
2553         arg->rx_clear_count = ev->rx_clear_count;
2554         arg->cycle_count = ev->cycle_count;
2555         arg->chan_tx_pwr_range = ev->chan_tx_pwr_range;
2556         arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp;
2557         arg->rx_frame_count = ev->rx_frame_count;
2558
2559         return 0;
2560 }
2561
2562 /*
2563  * Handle the channel info event for firmware which only sends one
2564  * chan_info event per scanned channel.
2565  */
2566 static void ath10k_wmi_event_chan_info_unpaired(struct ath10k *ar,
2567                                                 struct chan_info_params *params)
2568 {
2569         struct survey_info *survey;
2570         int idx;
2571
2572         if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
2573                 ath10k_dbg(ar, ATH10K_DBG_WMI, "chan info report completed\n");
2574                 return;
2575         }
2576
2577         idx = freq_to_idx(ar, params->freq);
2578         if (idx >= ARRAY_SIZE(ar->survey)) {
2579                 ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
2580                             params->freq, idx);
2581                 return;
2582         }
2583
2584         survey = &ar->survey[idx];
2585
2586         if (!params->mac_clk_mhz)
2587                 return;
2588
2589         memset(survey, 0, sizeof(*survey));
2590
2591         survey->noise = params->noise_floor;
2592         survey->time = (params->cycle_count / params->mac_clk_mhz) / 1000;
2593         survey->time_busy = (params->rx_clear_count / params->mac_clk_mhz) / 1000;
2594         survey->filled |= SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME |
2595                           SURVEY_INFO_TIME_BUSY;
2596 }
2597
2598 /*
2599  * Handle the channel info event for firmware which sends chan_info
2600  * event in pairs(start and stop events) for every scanned channel.
2601  */
2602 static void ath10k_wmi_event_chan_info_paired(struct ath10k *ar,
2603                                               struct chan_info_params *params)
2604 {
2605         struct survey_info *survey;
2606         int idx;
2607
2608         idx = freq_to_idx(ar, params->freq);
2609         if (idx >= ARRAY_SIZE(ar->survey)) {
2610                 ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
2611                             params->freq, idx);
2612                 return;
2613         }
2614
2615         if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
2616                 if (ar->ch_info_can_report_survey) {
2617                         survey = &ar->survey[idx];
2618                         survey->noise = params->noise_floor;
2619                         survey->filled = SURVEY_INFO_NOISE_DBM;
2620
2621                         ath10k_hw_fill_survey_time(ar,
2622                                                    survey,
2623                                                    params->cycle_count,
2624                                                    params->rx_clear_count,
2625                                                    ar->survey_last_cycle_count,
2626                                                    ar->survey_last_rx_clear_count);
2627                 }
2628
2629                 ar->ch_info_can_report_survey = false;
2630         } else {
2631                 ar->ch_info_can_report_survey = true;
2632         }
2633
2634         if (!(params->cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) {
2635                 ar->survey_last_rx_clear_count = params->rx_clear_count;
2636                 ar->survey_last_cycle_count = params->cycle_count;
2637         }
2638 }
2639
2640 void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
2641 {
2642         struct chan_info_params ch_info_param;
2643         struct wmi_ch_info_ev_arg arg = {};
2644         int ret;
2645
2646         ret = ath10k_wmi_pull_ch_info(ar, skb, &arg);
2647         if (ret) {
2648                 ath10k_warn(ar, "failed to parse chan info event: %d\n", ret);
2649                 return;
2650         }
2651
2652         ch_info_param.err_code = __le32_to_cpu(arg.err_code);
2653         ch_info_param.freq = __le32_to_cpu(arg.freq);
2654         ch_info_param.cmd_flags = __le32_to_cpu(arg.cmd_flags);
2655         ch_info_param.noise_floor = __le32_to_cpu(arg.noise_floor);
2656         ch_info_param.rx_clear_count = __le32_to_cpu(arg.rx_clear_count);
2657         ch_info_param.cycle_count = __le32_to_cpu(arg.cycle_count);
2658         ch_info_param.mac_clk_mhz = __le32_to_cpu(arg.mac_clk_mhz);
2659
2660         ath10k_dbg(ar, ATH10K_DBG_WMI,
2661                    "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
2662                    ch_info_param.err_code, ch_info_param.freq, ch_info_param.cmd_flags,
2663                    ch_info_param.noise_floor, ch_info_param.rx_clear_count,
2664                    ch_info_param.cycle_count);
2665
2666         spin_lock_bh(&ar->data_lock);
2667
2668         switch (ar->scan.state) {
2669         case ATH10K_SCAN_IDLE:
2670         case ATH10K_SCAN_STARTING:
2671                 ath10k_warn(ar, "received chan info event without a scan request, ignoring\n");
2672                 goto exit;
2673         case ATH10K_SCAN_RUNNING:
2674         case ATH10K_SCAN_ABORTING:
2675                 break;
2676         }
2677
2678         if (test_bit(ATH10K_FW_FEATURE_SINGLE_CHAN_INFO_PER_CHANNEL,
2679                      ar->running_fw->fw_file.fw_features))
2680                 ath10k_wmi_event_chan_info_unpaired(ar, &ch_info_param);
2681         else
2682                 ath10k_wmi_event_chan_info_paired(ar, &ch_info_param);
2683
2684 exit:
2685         spin_unlock_bh(&ar->data_lock);
2686 }
2687
2688 void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
2689 {
2690         struct wmi_echo_ev_arg arg = {};
2691         int ret;
2692
2693         ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg);
2694         if (ret) {
2695                 ath10k_warn(ar, "failed to parse echo: %d\n", ret);
2696                 return;
2697         }
2698
2699         ath10k_dbg(ar, ATH10K_DBG_WMI,
2700                    "wmi event echo value 0x%08x\n",
2701                    le32_to_cpu(arg.value));
2702
2703         if (le32_to_cpu(arg.value) == ATH10K_WMI_BARRIER_ECHO_ID)
2704                 complete(&ar->wmi.barrier);
2705 }
2706
2707 int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
2708 {
2709         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
2710                    skb->len);
2711
2712         trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);
2713
2714         return 0;
2715 }
2716
2717 void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src,
2718                                      struct ath10k_fw_stats_pdev *dst)
2719 {
2720         dst->ch_noise_floor = __le32_to_cpu(src->chan_nf);
2721         dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count);
2722         dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count);
2723         dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count);
2724         dst->cycle_count = __le32_to_cpu(src->cycle_count);
2725         dst->phy_err_count = __le32_to_cpu(src->phy_err_count);
2726         dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr);
2727 }
2728
2729 void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src,
2730                                    struct ath10k_fw_stats_pdev *dst)
2731 {
2732         dst->comp_queued = __le32_to_cpu(src->comp_queued);
2733         dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
2734         dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
2735         dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
2736         dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
2737         dst->local_enqued = __le32_to_cpu(src->local_enqued);
2738         dst->local_freed = __le32_to_cpu(src->local_freed);
2739         dst->hw_queued = __le32_to_cpu(src->hw_queued);
2740         dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
2741         dst->underrun = __le32_to_cpu(src->underrun);
2742         dst->tx_abort = __le32_to_cpu(src->tx_abort);
2743         dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
2744         dst->tx_ko = __le32_to_cpu(src->tx_ko);
2745         dst->data_rc = __le32_to_cpu(src->data_rc);
2746         dst->self_triggers = __le32_to_cpu(src->self_triggers);
2747         dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
2748         dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
2749         dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
2750         dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
2751         dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
2752         dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
2753         dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
2754 }
2755
2756 static void
2757 ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src,
2758                                    struct ath10k_fw_stats_pdev *dst)
2759 {
2760         dst->comp_queued = __le32_to_cpu(src->comp_queued);
2761         dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
2762         dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
2763         dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
2764         dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
2765         dst->local_enqued = __le32_to_cpu(src->local_enqued);
2766         dst->local_freed = __le32_to_cpu(src->local_freed);
2767         dst->hw_queued = __le32_to_cpu(src->hw_queued);
2768         dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
2769         dst->underrun = __le32_to_cpu(src->underrun);
2770         dst->tx_abort = __le32_to_cpu(src->tx_abort);
2771         dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
2772         dst->tx_ko = __le32_to_cpu(src->tx_ko);
2773         dst->data_rc = __le32_to_cpu(src->data_rc);
2774         dst->self_triggers = __le32_to_cpu(src->self_triggers);
2775         dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
2776         dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
2777         dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
2778         dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
2779         dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
2780         dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
2781         dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
2782         dst->hw_paused = __le32_to_cpu(src->hw_paused);
2783         dst->seq_posted = __le32_to_cpu(src->seq_posted);
2784         dst->seq_failed_queueing =
2785                 __le32_to_cpu(src->seq_failed_queueing);
2786         dst->seq_completed = __le32_to_cpu(src->seq_completed);
2787         dst->seq_restarted = __le32_to_cpu(src->seq_restarted);
2788         dst->mu_seq_posted = __le32_to_cpu(src->mu_seq_posted);
2789         dst->mpdus_sw_flush = __le32_to_cpu(src->mpdus_sw_flush);
2790         dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
2791         dst->mpdus_truncated = __le32_to_cpu(src->mpdus_truncated);
2792         dst->mpdus_ack_failed = __le32_to_cpu(src->mpdus_ack_failed);
2793         dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
2794         dst->mpdus_expired = __le32_to_cpu(src->mpdus_expired);
2795 }
2796
2797 void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src,
2798                                    struct ath10k_fw_stats_pdev *dst)
2799 {
2800         dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change);
2801         dst->status_rcvd = __le32_to_cpu(src->status_rcvd);
2802         dst->r0_frags = __le32_to_cpu(src->r0_frags);
2803         dst->r1_frags = __le32_to_cpu(src->r1_frags);
2804         dst->r2_frags = __le32_to_cpu(src->r2_frags);
2805         dst->r3_frags = __le32_to_cpu(src->r3_frags);
2806         dst->htt_msdus = __le32_to_cpu(src->htt_msdus);
2807         dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus);
2808         dst->loc_msdus = __le32_to_cpu(src->loc_msdus);
2809         dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus);
2810         dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu);
2811         dst->phy_errs = __le32_to_cpu(src->phy_errs);
2812         dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop);
2813         dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs);
2814 }
2815
2816 void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src,
2817                                       struct ath10k_fw_stats_pdev *dst)
2818 {
2819         dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad);
2820         dst->rts_bad = __le32_to_cpu(src->rts_bad);
2821         dst->rts_good = __le32_to_cpu(src->rts_good);
2822         dst->fcs_bad = __le32_to_cpu(src->fcs_bad);
2823         dst->no_beacons = __le32_to_cpu(src->no_beacons);
2824         dst->mib_int_count = __le32_to_cpu(src->mib_int_count);
2825 }
2826
2827 void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src,
2828                                 struct ath10k_fw_stats_peer *dst)
2829 {
2830         ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2831         dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2832         dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2833 }
2834
2835 static void
2836 ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats *src,
2837                                 struct ath10k_fw_stats_peer *dst)
2838 {
2839         ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2840         dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2841         dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2842         dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2843 }
2844
2845 static void
2846 ath10k_wmi_10_4_pull_vdev_stats(const struct wmi_vdev_stats_extd *src,
2847                                 struct ath10k_fw_stats_vdev_extd *dst)
2848 {
2849         dst->vdev_id = __le32_to_cpu(src->vdev_id);
2850         dst->ppdu_aggr_cnt = __le32_to_cpu(src->ppdu_aggr_cnt);
2851         dst->ppdu_noack = __le32_to_cpu(src->ppdu_noack);
2852         dst->mpdu_queued = __le32_to_cpu(src->mpdu_queued);
2853         dst->ppdu_nonaggr_cnt = __le32_to_cpu(src->ppdu_nonaggr_cnt);
2854         dst->mpdu_sw_requeued = __le32_to_cpu(src->mpdu_sw_requeued);
2855         dst->mpdu_suc_retry = __le32_to_cpu(src->mpdu_suc_retry);
2856         dst->mpdu_suc_multitry = __le32_to_cpu(src->mpdu_suc_multitry);
2857         dst->mpdu_fail_retry = __le32_to_cpu(src->mpdu_fail_retry);
2858         dst->tx_ftm_suc = __le32_to_cpu(src->tx_ftm_suc);
2859         dst->tx_ftm_suc_retry = __le32_to_cpu(src->tx_ftm_suc_retry);
2860         dst->tx_ftm_fail = __le32_to_cpu(src->tx_ftm_fail);
2861         dst->rx_ftmr_cnt = __le32_to_cpu(src->rx_ftmr_cnt);
2862         dst->rx_ftmr_dup_cnt = __le32_to_cpu(src->rx_ftmr_dup_cnt);
2863         dst->rx_iftmr_cnt = __le32_to_cpu(src->rx_iftmr_cnt);
2864         dst->rx_iftmr_dup_cnt = __le32_to_cpu(src->rx_iftmr_dup_cnt);
2865 }
2866
2867 static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar,
2868                                             struct sk_buff *skb,
2869                                             struct ath10k_fw_stats *stats)
2870 {
2871         const struct wmi_stats_event *ev = (void *)skb->data;
2872         u32 num_pdev_stats, num_peer_stats;
2873         int i;
2874
2875         if (!skb_pull(skb, sizeof(*ev)))
2876                 return -EPROTO;
2877
2878         num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2879         num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2880
2881         for (i = 0; i < num_pdev_stats; i++) {
2882                 const struct wmi_pdev_stats *src;
2883                 struct ath10k_fw_stats_pdev *dst;
2884
2885                 src = (void *)skb->data;
2886                 if (!skb_pull(skb, sizeof(*src)))
2887                         return -EPROTO;
2888
2889                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2890                 if (!dst)
2891                         continue;
2892
2893                 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2894                 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2895                 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2896
2897                 list_add_tail(&dst->list, &stats->pdevs);
2898         }
2899
2900         /* fw doesn't implement vdev stats */
2901
2902         for (i = 0; i < num_peer_stats; i++) {
2903                 const struct wmi_peer_stats *src;
2904                 struct ath10k_fw_stats_peer *dst;
2905
2906                 src = (void *)skb->data;
2907                 if (!skb_pull(skb, sizeof(*src)))
2908                         return -EPROTO;
2909
2910                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2911                 if (!dst)
2912                         continue;
2913
2914                 ath10k_wmi_pull_peer_stats(src, dst);
2915                 list_add_tail(&dst->list, &stats->peers);
2916         }
2917
2918         return 0;
2919 }
2920
2921 static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar,
2922                                            struct sk_buff *skb,
2923                                            struct ath10k_fw_stats *stats)
2924 {
2925         const struct wmi_stats_event *ev = (void *)skb->data;
2926         u32 num_pdev_stats, num_peer_stats;
2927         int i;
2928
2929         if (!skb_pull(skb, sizeof(*ev)))
2930                 return -EPROTO;
2931
2932         num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2933         num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2934
2935         for (i = 0; i < num_pdev_stats; i++) {
2936                 const struct wmi_10x_pdev_stats *src;
2937                 struct ath10k_fw_stats_pdev *dst;
2938
2939                 src = (void *)skb->data;
2940                 if (!skb_pull(skb, sizeof(*src)))
2941                         return -EPROTO;
2942
2943                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2944                 if (!dst)
2945                         continue;
2946
2947                 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2948                 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2949                 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2950                 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
2951
2952                 list_add_tail(&dst->list, &stats->pdevs);
2953         }
2954
2955         /* fw doesn't implement vdev stats */
2956
2957         for (i = 0; i < num_peer_stats; i++) {
2958                 const struct wmi_10x_peer_stats *src;
2959                 struct ath10k_fw_stats_peer *dst;
2960
2961                 src = (void *)skb->data;
2962                 if (!skb_pull(skb, sizeof(*src)))
2963                         return -EPROTO;
2964
2965                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2966                 if (!dst)
2967                         continue;
2968
2969                 ath10k_wmi_pull_peer_stats(&src->old, dst);
2970
2971                 dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2972
2973                 list_add_tail(&dst->list, &stats->peers);
2974         }
2975
2976         return 0;
2977 }
2978
2979 static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar,
2980                                             struct sk_buff *skb,
2981                                             struct ath10k_fw_stats *stats)
2982 {
2983         const struct wmi_10_2_stats_event *ev = (void *)skb->data;
2984         u32 num_pdev_stats;
2985         u32 num_pdev_ext_stats;
2986         u32 num_peer_stats;
2987         int i;
2988
2989         if (!skb_pull(skb, sizeof(*ev)))
2990                 return -EPROTO;
2991
2992         num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2993         num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
2994         num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2995
2996         for (i = 0; i < num_pdev_stats; i++) {
2997                 const struct wmi_10_2_pdev_stats *src;
2998                 struct ath10k_fw_stats_pdev *dst;
2999
3000                 src = (void *)skb->data;
3001                 if (!skb_pull(skb, sizeof(*src)))
3002                         return -EPROTO;
3003
3004                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3005                 if (!dst)
3006                         continue;
3007
3008                 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
3009                 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
3010                 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
3011                 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
3012                 /* FIXME: expose 10.2 specific values */
3013
3014                 list_add_tail(&dst->list, &stats->pdevs);
3015         }
3016
3017         for (i = 0; i < num_pdev_ext_stats; i++) {
3018                 const struct wmi_10_2_pdev_ext_stats *src;
3019
3020                 src = (void *)skb->data;
3021                 if (!skb_pull(skb, sizeof(*src)))
3022                         return -EPROTO;
3023
3024                 /* FIXME: expose values to userspace
3025                  *
3026                  * Note: Even though this loop seems to do nothing it is
3027                  * required to parse following sub-structures properly.
3028                  */
3029         }
3030
3031         /* fw doesn't implement vdev stats */
3032
3033         for (i = 0; i < num_peer_stats; i++) {
3034                 const struct wmi_10_2_peer_stats *src;
3035                 struct ath10k_fw_stats_peer *dst;
3036
3037                 src = (void *)skb->data;
3038                 if (!skb_pull(skb, sizeof(*src)))
3039                         return -EPROTO;
3040
3041                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3042                 if (!dst)
3043                         continue;
3044
3045                 ath10k_wmi_pull_peer_stats(&src->old, dst);
3046
3047                 dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
3048                 /* FIXME: expose 10.2 specific values */
3049
3050                 list_add_tail(&dst->list, &stats->peers);
3051         }
3052
3053         return 0;
3054 }
3055
3056 static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar,
3057                                               struct sk_buff *skb,
3058                                               struct ath10k_fw_stats *stats)
3059 {
3060         const struct wmi_10_2_stats_event *ev = (void *)skb->data;
3061         u32 num_pdev_stats;
3062         u32 num_pdev_ext_stats;
3063         u32 num_peer_stats;
3064         int i;
3065
3066         if (!skb_pull(skb, sizeof(*ev)))
3067                 return -EPROTO;
3068
3069         num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
3070         num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
3071         num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
3072
3073         for (i = 0; i < num_pdev_stats; i++) {
3074                 const struct wmi_10_2_pdev_stats *src;
3075                 struct ath10k_fw_stats_pdev *dst;
3076
3077                 src = (void *)skb->data;
3078                 if (!skb_pull(skb, sizeof(*src)))
3079                         return -EPROTO;
3080
3081                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3082                 if (!dst)
3083                         continue;
3084
3085                 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
3086                 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
3087                 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
3088                 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
3089                 /* FIXME: expose 10.2 specific values */
3090
3091                 list_add_tail(&dst->list, &stats->pdevs);
3092         }
3093
3094         for (i = 0; i < num_pdev_ext_stats; i++) {
3095                 const struct wmi_10_2_pdev_ext_stats *src;
3096
3097                 src = (void *)skb->data;
3098                 if (!skb_pull(skb, sizeof(*src)))
3099                         return -EPROTO;
3100
3101                 /* FIXME: expose values to userspace
3102                  *
3103                  * Note: Even though this loop seems to do nothing it is
3104                  * required to parse following sub-structures properly.
3105                  */
3106         }
3107
3108         /* fw doesn't implement vdev stats */
3109
3110         for (i = 0; i < num_peer_stats; i++) {
3111                 const struct wmi_10_2_4_ext_peer_stats *src;
3112                 struct ath10k_fw_stats_peer *dst;
3113                 int stats_len;
3114
3115                 if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
3116                         stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats);
3117                 else
3118                         stats_len = sizeof(struct wmi_10_2_4_peer_stats);
3119
3120                 src = (void *)skb->data;
3121                 if (!skb_pull(skb, stats_len))
3122                         return -EPROTO;
3123
3124                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3125                 if (!dst)
3126                         continue;
3127
3128                 ath10k_wmi_pull_peer_stats(&src->common.old, dst);
3129
3130                 dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate);
3131
3132                 if (ath10k_peer_stats_enabled(ar))
3133                         dst->rx_duration = __le32_to_cpu(src->rx_duration);
3134                 /* FIXME: expose 10.2 specific values */
3135
3136                 list_add_tail(&dst->list, &stats->peers);
3137         }
3138
3139         return 0;
3140 }
3141
3142 static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
3143                                             struct sk_buff *skb,
3144                                             struct ath10k_fw_stats *stats)
3145 {
3146         const struct wmi_10_2_stats_event *ev = (void *)skb->data;
3147         u32 num_pdev_stats;
3148         u32 num_pdev_ext_stats;
3149         u32 num_vdev_stats;
3150         u32 num_peer_stats;
3151         u32 num_bcnflt_stats;
3152         u32 stats_id;
3153         int i;
3154
3155         if (!skb_pull(skb, sizeof(*ev)))
3156                 return -EPROTO;
3157
3158         num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
3159         num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
3160         num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
3161         num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
3162         num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats);
3163         stats_id = __le32_to_cpu(ev->stats_id);
3164
3165         for (i = 0; i < num_pdev_stats; i++) {
3166                 const struct wmi_10_4_pdev_stats *src;
3167                 struct ath10k_fw_stats_pdev *dst;
3168
3169                 src = (void *)skb->data;
3170                 if (!skb_pull(skb, sizeof(*src)))
3171                         return -EPROTO;
3172
3173                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3174                 if (!dst)
3175                         continue;
3176
3177                 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
3178                 ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst);
3179                 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
3180                 dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs);
3181                 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
3182
3183                 list_add_tail(&dst->list, &stats->pdevs);
3184         }
3185
3186         for (i = 0; i < num_pdev_ext_stats; i++) {
3187                 const struct wmi_10_2_pdev_ext_stats *src;
3188
3189                 src = (void *)skb->data;
3190                 if (!skb_pull(skb, sizeof(*src)))
3191                         return -EPROTO;
3192
3193                 /* FIXME: expose values to userspace
3194                  *
3195                  * Note: Even though this loop seems to do nothing it is
3196                  * required to parse following sub-structures properly.
3197                  */
3198         }
3199
3200         for (i = 0; i < num_vdev_stats; i++) {
3201                 const struct wmi_vdev_stats *src;
3202
3203                 /* Ignore vdev stats here as it has only vdev id. Actual vdev
3204                  * stats will be retrieved from vdev extended stats.
3205                  */
3206                 src = (void *)skb->data;
3207                 if (!skb_pull(skb, sizeof(*src)))
3208                         return -EPROTO;
3209         }
3210
3211         for (i = 0; i < num_peer_stats; i++) {
3212                 const struct wmi_10_4_peer_stats *src;
3213                 struct ath10k_fw_stats_peer *dst;
3214
3215                 src = (void *)skb->data;
3216                 if (!skb_pull(skb, sizeof(*src)))
3217                         return -EPROTO;
3218
3219                 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3220                 if (!dst)
3221                         continue;
3222
3223                 ath10k_wmi_10_4_pull_peer_stats(src, dst);
3224                 list_add_tail(&dst->list, &stats->peers);
3225         }
3226
3227         for (i = 0; i < num_bcnflt_stats; i++) {
3228                 const struct wmi_10_4_bss_bcn_filter_stats *src;
3229
3230                 src = (void *)skb->data;
3231                 if (!skb_pull(skb, sizeof(*src)))
3232                         return -EPROTO;
3233
3234                 /* FIXME: expose values to userspace
3235                  *
3236                  * Note: Even though this loop seems to do nothing it is
3237                  * required to parse following sub-structures properly.
3238                  */
3239         }
3240
3241         if (stats_id & WMI_10_4_STAT_PEER_EXTD) {
3242                 stats->extended = true;
3243
3244                 for (i = 0; i < num_peer_stats; i++) {
3245                         const struct wmi_10_4_peer_extd_stats *src;
3246                         struct ath10k_fw_extd_stats_peer *dst;
3247
3248                         src = (void *)skb->data;
3249                         if (!skb_pull(skb, sizeof(*src)))
3250                                 return -EPROTO;
3251
3252                         dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3253                         if (!dst)
3254                                 continue;
3255
3256                         ether_addr_copy(dst->peer_macaddr,
3257                                         src->peer_macaddr.addr);
3258                         dst->rx_duration = __le32_to_cpu(src->rx_duration);
3259                         list_add_tail(&dst->list, &stats->peers_extd);
3260                 }
3261         }
3262
3263         if (stats_id & WMI_10_4_STAT_VDEV_EXTD) {
3264                 for (i = 0; i < num_vdev_stats; i++) {
3265                         const struct wmi_vdev_stats_extd *src;
3266                         struct ath10k_fw_stats_vdev_extd *dst;
3267
3268                         src = (void *)skb->data;
3269                         if (!skb_pull(skb, sizeof(*src)))
3270                                 return -EPROTO;
3271
3272                         dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3273                         if (!dst)
3274                                 continue;
3275                         ath10k_wmi_10_4_pull_vdev_stats(src, dst);
3276                         list_add_tail(&dst->list, &stats->vdevs);
3277                 }
3278         }
3279
3280         return 0;
3281 }
3282
3283 void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb)
3284 {
3285         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
3286         ath10k_debug_fw_stats_process(ar, skb);
3287 }
3288
3289 static int
3290 ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb,
3291                                  struct wmi_vdev_start_ev_arg *arg)
3292 {
3293         struct wmi_vdev_start_response_event *ev = (void *)skb->data;
3294
3295         if (skb->len < sizeof(*ev))
3296                 return -EPROTO;
3297
3298         skb_pull(skb, sizeof(*ev));
3299         arg->vdev_id = ev->vdev_id;
3300         arg->req_id = ev->req_id;
3301         arg->resp_type = ev->resp_type;
3302         arg->status = ev->status;
3303
3304         return 0;
3305 }
3306
3307 void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb)
3308 {
3309         struct wmi_vdev_start_ev_arg arg = {};
3310         int ret;
3311         u32 status;
3312
3313         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
3314
3315         ar->last_wmi_vdev_start_status = 0;
3316
3317         ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg);
3318         if (ret) {
3319                 ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret);
3320                 ar->last_wmi_vdev_start_status = ret;
3321                 goto out;
3322         }
3323
3324         status = __le32_to_cpu(arg.status);
3325         if (WARN_ON_ONCE(status)) {
3326                 ath10k_warn(ar, "vdev-start-response reports status error: %d (%s)\n",
3327                             status, (status == WMI_VDEV_START_CHAN_INVALID) ?
3328                             "chan-invalid" : "unknown");
3329                 /* Setup is done one way or another though, so we should still
3330                  * do the completion, so don't return here.
3331                  */
3332                 ar->last_wmi_vdev_start_status = -EINVAL;
3333         }
3334
3335 out:
3336         complete(&ar->vdev_setup_done);
3337 }
3338
3339 void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb)
3340 {
3341         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
3342         complete(&ar->vdev_setup_done);
3343 }
3344
3345 static int
3346 ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb,
3347                                 struct wmi_peer_kick_ev_arg *arg)
3348 {
3349         struct wmi_peer_sta_kickout_event *ev = (void *)skb->data;
3350
3351         if (skb->len < sizeof(*ev))
3352                 return -EPROTO;
3353
3354         skb_pull(skb, sizeof(*ev));
3355         arg->mac_addr = ev->peer_macaddr.addr;
3356
3357         return 0;
3358 }
3359
3360 void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb)
3361 {
3362         struct wmi_peer_kick_ev_arg arg = {};
3363         struct ieee80211_sta *sta;
3364         int ret;
3365
3366         ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
3367         if (ret) {
3368                 ath10k_warn(ar, "failed to parse peer kickout event: %d\n",
3369                             ret);
3370                 return;
3371         }
3372
3373         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n",
3374                    arg.mac_addr);
3375
3376         rcu_read_lock();
3377
3378         sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
3379         if (!sta) {
3380                 ath10k_warn(ar, "Spurious quick kickout for STA %pM\n",
3381                             arg.mac_addr);
3382                 goto exit;
3383         }
3384
3385         ieee80211_report_low_ack(sta, 10);
3386
3387 exit:
3388         rcu_read_unlock();
3389 }
3390
3391 /*
3392  * FIXME
3393  *
3394  * We don't report to mac80211 sleep state of connected
3395  * stations. Due to this mac80211 can't fill in TIM IE
3396  * correctly.
3397  *
3398  * I know of no way of getting nullfunc frames that contain
3399  * sleep transition from connected stations - these do not
3400  * seem to be sent from the target to the host. There also
3401  * doesn't seem to be a dedicated event for that. So the
3402  * only way left to do this would be to read tim_bitmap
3403  * during SWBA.
3404  *
3405  * We could probably try using tim_bitmap from SWBA to tell
3406  * mac80211 which stations are asleep and which are not. The
3407  * problem here is calling mac80211 functions so many times
3408  * could take too long and make us miss the time to submit
3409  * the beacon to the target.
3410  *
3411  * So as a workaround we try to extend the TIM IE if there
3412  * is unicast buffered for stations with aid > 7 and fill it
3413  * in ourselves.
3414  */
3415 static void ath10k_wmi_update_tim(struct ath10k *ar,
3416                                   struct ath10k_vif *arvif,
3417                                   struct sk_buff *bcn,
3418                                   const struct wmi_tim_info_arg *tim_info)
3419 {
3420         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data;
3421         struct ieee80211_tim_ie *tim;
3422         u8 *ies, *ie;
3423         u8 ie_len, pvm_len;
3424         __le32 t;
3425         u32 v, tim_len;
3426
3427         /* When FW reports 0 in tim_len, ensure atleast first byte
3428          * in tim_bitmap is considered for pvm calculation.
3429          */
3430         tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1;
3431
3432         /* if next SWBA has no tim_changed the tim_bitmap is garbage.
3433          * we must copy the bitmap upon change and reuse it later
3434          */
3435         if (__le32_to_cpu(tim_info->tim_changed)) {
3436                 int i;
3437
3438                 if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) {
3439                         ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu",
3440                                     tim_len, sizeof(arvif->u.ap.tim_bitmap));
3441                         tim_len = sizeof(arvif->u.ap.tim_bitmap);
3442                 }
3443
3444                 for (i = 0; i < tim_len; i++) {
3445                         t = tim_info->tim_bitmap[i / 4];
3446                         v = __le32_to_cpu(t);
3447                         arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
3448                 }
3449
3450                 /* FW reports either length 0 or length based on max supported
3451                  * station. so we calculate this on our own
3452                  */
3453                 arvif->u.ap.tim_len = 0;
3454                 for (i = 0; i < tim_len; i++)
3455                         if (arvif->u.ap.tim_bitmap[i])
3456                                 arvif->u.ap.tim_len = i;
3457
3458                 arvif->u.ap.tim_len++;
3459         }
3460
3461         ies = bcn->data;
3462         ies += ieee80211_hdrlen(hdr->frame_control);
3463         ies += 12; /* fixed parameters */
3464
3465         ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies,
3466                                     (u8 *)skb_tail_pointer(bcn) - ies);
3467         if (!ie) {
3468                 if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3469                         ath10k_warn(ar, "no tim ie found;\n");
3470                 return;
3471         }
3472
3473         tim = (void *)ie + 2;
3474         ie_len = ie[1];
3475         pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */
3476
3477         if (pvm_len < arvif->u.ap.tim_len) {
3478                 int expand_size = tim_len - pvm_len;
3479                 int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
3480                 void *next_ie = ie + 2 + ie_len;
3481
3482                 if (skb_put(bcn, expand_size)) {
3483                         memmove(next_ie + expand_size, next_ie, move_size);
3484
3485                         ie[1] += expand_size;
3486                         ie_len += expand_size;
3487                         pvm_len += expand_size;
3488                 } else {
3489                         ath10k_warn(ar, "tim expansion failed\n");
3490                 }
3491         }
3492
3493         if (pvm_len > tim_len) {
3494                 ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len);
3495                 return;
3496         }
3497
3498         tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast);
3499         memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
3500
3501         if (tim->dtim_count == 0) {
3502                 ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO;
3503
3504                 if (__le32_to_cpu(tim_info->tim_mcast) == 1)
3505                         ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB;
3506         }
3507
3508         ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
3509                    tim->dtim_count, tim->dtim_period,
3510                    tim->bitmap_ctrl, pvm_len);
3511 }
3512
3513 static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
3514                                   struct sk_buff *bcn,
3515                                   const struct wmi_p2p_noa_info *noa)
3516 {
3517         if (!arvif->vif->p2p)
3518                 return;
3519
3520         ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
3521
3522         if (noa->changed & WMI_P2P_NOA_CHANGED_BIT)
3523                 ath10k_p2p_noa_update(arvif, noa);
3524
3525         if (arvif->u.ap.noa_data)
3526                 if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
3527                         skb_put_data(bcn, arvif->u.ap.noa_data,
3528                                      arvif->u.ap.noa_len);
3529 }
3530
3531 static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
3532                                       struct wmi_swba_ev_arg *arg)
3533 {
3534         struct wmi_host_swba_event *ev = (void *)skb->data;
3535         u32 map;
3536         size_t i;
3537
3538         if (skb->len < sizeof(*ev))
3539                 return -EPROTO;
3540
3541         skb_pull(skb, sizeof(*ev));
3542         arg->vdev_map = ev->vdev_map;
3543
3544         for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3545                 if (!(map & BIT(0)))
3546                         continue;
3547
3548                 /* If this happens there were some changes in firmware and
3549                  * ath10k should update the max size of tim_info array.
3550                  */
3551                 if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3552                         break;
3553
3554                 if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3555                      sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3556                         ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3557                         return -EPROTO;
3558                 }
3559
3560                 arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3561                 arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3562                 arg->tim_info[i].tim_bitmap =
3563                                 ev->bcn_info[i].tim_info.tim_bitmap;
3564                 arg->tim_info[i].tim_changed =
3565                                 ev->bcn_info[i].tim_info.tim_changed;
3566                 arg->tim_info[i].tim_num_ps_pending =
3567                                 ev->bcn_info[i].tim_info.tim_num_ps_pending;
3568
3569                 arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info;
3570                 i++;
3571         }
3572
3573         return 0;
3574 }
3575
3576 static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar,
3577                                              struct sk_buff *skb,
3578                                              struct wmi_swba_ev_arg *arg)
3579 {
3580         struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data;
3581         u32 map;
3582         size_t i;
3583
3584         if (skb->len < sizeof(*ev))
3585                 return -EPROTO;
3586
3587         skb_pull(skb, sizeof(*ev));
3588         arg->vdev_map = ev->vdev_map;
3589
3590         for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3591                 if (!(map & BIT(0)))
3592                         continue;
3593
3594                 /* If this happens there were some changes in firmware and
3595                  * ath10k should update the max size of tim_info array.
3596                  */
3597                 if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3598                         break;
3599
3600                 if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3601                      sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3602                         ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3603                         return -EPROTO;
3604                 }
3605
3606                 arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3607                 arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3608                 arg->tim_info[i].tim_bitmap =
3609                                 ev->bcn_info[i].tim_info.tim_bitmap;
3610                 arg->tim_info[i].tim_changed =
3611                                 ev->bcn_info[i].tim_info.tim_changed;
3612                 arg->tim_info[i].tim_num_ps_pending =
3613                                 ev->bcn_info[i].tim_info.tim_num_ps_pending;
3614                 i++;
3615         }
3616
3617         return 0;
3618 }
3619
3620 static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
3621                                            struct sk_buff *skb,
3622                                            struct wmi_swba_ev_arg *arg)
3623 {
3624         struct wmi_10_4_host_swba_event *ev = (void *)skb->data;
3625         u32 map, tim_len;
3626         size_t i;
3627
3628         if (skb->len < sizeof(*ev))
3629                 return -EPROTO;
3630
3631         skb_pull(skb, sizeof(*ev));
3632         arg->vdev_map = ev->vdev_map;
3633
3634         for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3635                 if (!(map & BIT(0)))
3636                         continue;
3637
3638                 /* If this happens there were some changes in firmware and
3639                  * ath10k should update the max size of tim_info array.
3640                  */
3641                 if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3642                         break;
3643
3644                 if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3645                       sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3646                         ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3647                         return -EPROTO;
3648                 }
3649
3650                 tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len);
3651                 if (tim_len) {
3652                         /* Exclude 4 byte guard length */
3653                         tim_len -= 4;
3654                         arg->tim_info[i].tim_len = __cpu_to_le32(tim_len);
3655                 } else {
3656                         arg->tim_info[i].tim_len = 0;
3657                 }
3658
3659                 arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3660                 arg->tim_info[i].tim_bitmap =
3661                                 ev->bcn_info[i].tim_info.tim_bitmap;
3662                 arg->tim_info[i].tim_changed =
3663                                 ev->bcn_info[i].tim_info.tim_changed;
3664                 arg->tim_info[i].tim_num_ps_pending =
3665                                 ev->bcn_info[i].tim_info.tim_num_ps_pending;
3666
3667                 /* 10.4 firmware doesn't have p2p support. notice of absence
3668                  * info can be ignored for now.
3669                  */
3670
3671                 i++;
3672         }
3673
3674         return 0;
3675 }
3676
3677 static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar)
3678 {
3679         return WMI_TXBF_CONF_BEFORE_ASSOC;
3680 }
3681
3682 void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
3683 {
3684         struct wmi_swba_ev_arg arg = {};
3685         u32 map;
3686         int i = -1;
3687         const struct wmi_tim_info_arg *tim_info;
3688         const struct wmi_p2p_noa_info *noa_info;
3689         struct ath10k_vif *arvif;
3690         struct sk_buff *bcn;
3691         dma_addr_t paddr;
3692         int ret, vdev_id = 0;
3693
3694         ret = ath10k_wmi_pull_swba(ar, skb, &arg);
3695         if (ret) {
3696                 ath10k_warn(ar, "failed to parse swba event: %d\n", ret);
3697                 return;
3698         }
3699
3700         map = __le32_to_cpu(arg.vdev_map);
3701
3702         ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
3703                    map);
3704
3705         for (; map; map >>= 1, vdev_id++) {
3706                 if (!(map & 0x1))
3707                         continue;
3708
3709                 i++;
3710
3711                 if (i >= WMI_MAX_AP_VDEV) {
3712                         ath10k_warn(ar, "swba has corrupted vdev map\n");
3713                         break;
3714                 }
3715
3716                 tim_info = &arg.tim_info[i];
3717                 noa_info = arg.noa_info[i];
3718
3719                 ath10k_dbg(ar, ATH10K_DBG_MGMT,
3720                            "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n",
3721                            i,
3722                            __le32_to_cpu(tim_info->tim_len),
3723                            __le32_to_cpu(tim_info->tim_mcast),
3724                            __le32_to_cpu(tim_info->tim_changed),
3725                            __le32_to_cpu(tim_info->tim_num_ps_pending),
3726                            __le32_to_cpu(tim_info->tim_bitmap[3]),
3727                            __le32_to_cpu(tim_info->tim_bitmap[2]),
3728                            __le32_to_cpu(tim_info->tim_bitmap[1]),
3729                            __le32_to_cpu(tim_info->tim_bitmap[0]));
3730
3731                 /* TODO: Only first 4 word from tim_bitmap is dumped.
3732                  * Extend debug code to dump full tim_bitmap.
3733                  */
3734
3735                 arvif = ath10k_get_arvif(ar, vdev_id);
3736                 if (arvif == NULL) {
3737                         ath10k_warn(ar, "no vif for vdev_id %d found\n",
3738                                     vdev_id);
3739                         continue;
3740                 }
3741
3742                 /* mac80211 would have already asked us to stop beaconing and
3743                  * bring the vdev down, so continue in that case
3744                  */
3745                 if (!arvif->is_up)
3746                         continue;
3747
3748                 /* There are no completions for beacons so wait for next SWBA
3749                  * before telling mac80211 to decrement CSA counter
3750                  *
3751                  * Once CSA counter is completed stop sending beacons until
3752                  * actual channel switch is done
3753                  */
3754                 if (arvif->vif->csa_active &&
3755                     ieee80211_csa_is_complete(arvif->vif)) {
3756                         ieee80211_csa_finish(arvif->vif);
3757                         continue;
3758                 }
3759
3760                 bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
3761                 if (!bcn) {
3762                         ath10k_warn(ar, "could not get mac80211 beacon\n");
3763                         continue;
3764                 }
3765
3766                 ath10k_tx_h_seq_no(arvif->vif, bcn);
3767                 ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
3768                 ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);
3769
3770                 spin_lock_bh(&ar->data_lock);
3771
3772                 if (arvif->beacon) {
3773                         switch (arvif->beacon_state) {
3774                         case ATH10K_BEACON_SENT:
3775                                 break;
3776                         case ATH10K_BEACON_SCHEDULED:
3777                                 ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n",
3778                                             arvif->vdev_id);
3779                                 break;
3780                         case ATH10K_BEACON_SENDING:
3781                                 ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n",
3782                                             arvif->vdev_id);
3783                                 dev_kfree_skb(bcn);
3784                                 goto skip;
3785                         }
3786
3787                         ath10k_mac_vif_beacon_free(arvif);
3788                 }
3789
3790                 if (!arvif->beacon_buf) {
3791                         paddr = dma_map_single(arvif->ar->dev, bcn->data,
3792                                                bcn->len, DMA_TO_DEVICE);
3793                         ret = dma_mapping_error(arvif->ar->dev, paddr);
3794                         if (ret) {
3795                                 ath10k_warn(ar, "failed to map beacon: %d\n",
3796                                             ret);
3797                                 dev_kfree_skb_any(bcn);
3798                                 goto skip;
3799                         }
3800
3801                         ATH10K_SKB_CB(bcn)->paddr = paddr;
3802                 } else {
3803                         if (bcn->len > IEEE80211_MAX_FRAME_LEN) {
3804                                 ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n",
3805                                             bcn->len, IEEE80211_MAX_FRAME_LEN);
3806                                 skb_trim(bcn, IEEE80211_MAX_FRAME_LEN);
3807                         }
3808                         memcpy(arvif->beacon_buf, bcn->data, bcn->len);
3809                         ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr;
3810                 }
3811
3812                 arvif->beacon = bcn;
3813                 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
3814
3815                 trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
3816                 trace_ath10k_tx_payload(ar, bcn->data, bcn->len);
3817
3818 skip:
3819                 spin_unlock_bh(&ar->data_lock);
3820         }
3821
3822         ath10k_wmi_tx_beacons_nowait(ar);
3823 }
3824
3825 void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb)
3826 {
3827         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
3828 }
3829
3830 static void ath10k_radar_detected(struct ath10k *ar)
3831 {
3832         ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
3833         ATH10K_DFS_STAT_INC(ar, radar_detected);
3834
3835         /* Control radar events reporting in debugfs file
3836          * dfs_block_radar_events
3837          */
3838         if (ar->dfs_block_radar_events)
3839                 ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
3840         else
3841                 ieee80211_radar_detected(ar->hw);
3842 }
3843
3844 static void ath10k_radar_confirmation_work(struct work_struct *work)
3845 {
3846         struct ath10k *ar = container_of(work, struct ath10k,
3847                                          radar_confirmation_work);
3848         struct ath10k_radar_found_info radar_info;
3849         int ret, time_left;
3850
3851         reinit_completion(&ar->wmi.radar_confirm);
3852
3853         spin_lock_bh(&ar->data_lock);
3854         memcpy(&radar_info, &ar->last_radar_info, sizeof(radar_info));
3855         spin_unlock_bh(&ar->data_lock);
3856
3857         ret = ath10k_wmi_report_radar_found(ar, &radar_info);
3858         if (ret) {
3859                 ath10k_warn(ar, "failed to send radar found %d\n", ret);
3860                 goto wait_complete;
3861         }
3862
3863         time_left = wait_for_completion_timeout(&ar->wmi.radar_confirm,
3864                                                 ATH10K_WMI_DFS_CONF_TIMEOUT_HZ);
3865         if (time_left) {
3866                 /* DFS Confirmation status event received and
3867                  * necessary action completed.
3868                  */
3869                 goto wait_complete;
3870         } else {
3871                 /* DFS Confirmation event not received from FW.Considering this
3872                  * as real radar.
3873                  */
3874                 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3875                            "dfs confirmation not received from fw, considering as radar\n");
3876                 goto radar_detected;
3877         }
3878
3879 radar_detected:
3880         ath10k_radar_detected(ar);
3881
3882         /* Reset state to allow sending confirmation on consecutive radar
3883          * detections, unless radar confirmation is disabled/stopped.
3884          */
3885 wait_complete:
3886         spin_lock_bh(&ar->data_lock);
3887         if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_STOPPED)
3888                 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
3889         spin_unlock_bh(&ar->data_lock);
3890 }
3891
3892 static void ath10k_dfs_radar_report(struct ath10k *ar,
3893                                     struct wmi_phyerr_ev_arg *phyerr,
3894                                     const struct phyerr_radar_report *rr,
3895                                     u64 tsf)
3896 {
3897         u32 reg0, reg1, tsf32l;
3898         struct ieee80211_channel *ch;
3899         struct pulse_event pe;
3900         struct radar_detector_specs rs;
3901         u64 tsf64;
3902         u8 rssi, width;
3903         struct ath10k_radar_found_info *radar_info;
3904
3905         reg0 = __le32_to_cpu(rr->reg0);
3906         reg1 = __le32_to_cpu(rr->reg1);
3907
3908         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3909                    "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n",
3910                    MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP),
3911                    MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH),
3912                    MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN),
3913                    MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF));
3914         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3915                    "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n",
3916                    MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK),
3917                    MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX),
3918                    MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID),
3919                    MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN),
3920                    MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK));
3921         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3922                    "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n",
3923                    MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET),
3924                    MS(reg1, RADAR_REPORT_REG1_PULSE_DUR));
3925
3926         if (!ar->dfs_detector)
3927                 return;
3928
3929         spin_lock_bh(&ar->data_lock);
3930         ch = ar->rx_channel;
3931
3932         /* fetch target operating channel during channel change */
3933         if (!ch)
3934                 ch = ar->tgt_oper_chan;
3935
3936         spin_unlock_bh(&ar->data_lock);
3937
3938         if (!ch) {
3939                 ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n");
3940                 goto radar_detected;
3941         }
3942
3943         /* report event to DFS pattern detector */
3944         tsf32l = phyerr->tsf_timestamp;
3945         tsf64 = tsf & (~0xFFFFFFFFULL);
3946         tsf64 |= tsf32l;
3947
3948         width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
3949         rssi = phyerr->rssi_combined;
3950
3951         /* hardware store this as 8 bit signed value,
3952          * set to zero if negative number
3953          */
3954         if (rssi & 0x80)
3955                 rssi = 0;
3956
3957         pe.ts = tsf64;
3958         pe.freq = ch->center_freq;
3959         pe.width = width;
3960         pe.rssi = rssi;
3961         pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0);
3962         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3963                    "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n",
3964                    pe.freq, pe.width, pe.rssi, pe.ts);
3965
3966         ATH10K_DFS_STAT_INC(ar, pulses_detected);
3967
3968         if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe, &rs)) {
3969                 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3970                            "dfs no pulse pattern detected, yet\n");
3971                 return;
3972         }
3973
3974         if ((test_bit(WMI_SERVICE_HOST_DFS_CHECK_SUPPORT, ar->wmi.svc_map)) &&
3975             ar->dfs_detector->region == NL80211_DFS_FCC) {
3976                 /* Consecutive radar indications need not be
3977                  * sent to the firmware until we get confirmation
3978                  * for the previous detected radar.
3979                  */
3980                 spin_lock_bh(&ar->data_lock);
3981                 if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_IDLE) {
3982                         spin_unlock_bh(&ar->data_lock);
3983                         return;
3984                 }
3985                 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_INPROGRESS;
3986                 radar_info = &ar->last_radar_info;
3987
3988                 radar_info->pri_min = rs.pri_min;
3989                 radar_info->pri_max = rs.pri_max;
3990                 radar_info->width_min = rs.width_min;
3991                 radar_info->width_max = rs.width_max;
3992                 /*TODO Find sidx_min and sidx_max */
3993                 radar_info->sidx_min = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX);
3994                 radar_info->sidx_max = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX);
3995
3996                 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3997                            "sending wmi radar found cmd pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n",
3998                            radar_info->pri_min, radar_info->pri_max,
3999                            radar_info->width_min, radar_info->width_max,
4000                            radar_info->sidx_min, radar_info->sidx_max);
4001                 ieee80211_queue_work(ar->hw, &ar->radar_confirmation_work);
4002                 spin_unlock_bh(&ar->data_lock);
4003                 return;
4004         }
4005
4006 radar_detected:
4007         ath10k_radar_detected(ar);
4008 }
4009
4010 static int ath10k_dfs_fft_report(struct ath10k *ar,
4011                                  struct wmi_phyerr_ev_arg *phyerr,
4012                                  const struct phyerr_fft_report *fftr,
4013                                  u64 tsf)
4014 {
4015         u32 reg0, reg1;
4016         u8 rssi, peak_mag;
4017
4018         reg0 = __le32_to_cpu(fftr->reg0);
4019         reg1 = __le32_to_cpu(fftr->reg1);
4020         rssi = phyerr->rssi_combined;
4021
4022         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4023                    "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
4024                    MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB),
4025                    MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB),
4026                    MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX),
4027                    MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX));
4028         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4029                    "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n",
4030                    MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB),
4031                    MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB),
4032                    MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG),
4033                    MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB));
4034
4035         peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG);
4036
4037         /* false event detection */
4038         if (rssi == DFS_RSSI_POSSIBLY_FALSE &&
4039             peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) {
4040                 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
4041                 ATH10K_DFS_STAT_INC(ar, pulses_discarded);
4042                 return -EINVAL;
4043         }
4044
4045         return 0;
4046 }
4047
4048 void ath10k_wmi_event_dfs(struct ath10k *ar,
4049                           struct wmi_phyerr_ev_arg *phyerr,
4050                           u64 tsf)
4051 {
4052         int buf_len, tlv_len, res, i = 0;
4053         const struct phyerr_tlv *tlv;
4054         const struct phyerr_radar_report *rr;
4055         const struct phyerr_fft_report *fftr;
4056         const u8 *tlv_buf;
4057
4058         buf_len = phyerr->buf_len;
4059         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4060                    "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
4061                    phyerr->phy_err_code, phyerr->rssi_combined,
4062                    phyerr->tsf_timestamp, tsf, buf_len);
4063
4064         /* Skip event if DFS disabled */
4065         if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED))
4066                 return;
4067
4068         ATH10K_DFS_STAT_INC(ar, pulses_total);
4069
4070         while (i < buf_len) {
4071                 if (i + sizeof(*tlv) > buf_len) {
4072                         ath10k_warn(ar, "too short buf for tlv header (%d)\n",
4073                                     i);
4074                         return;
4075                 }
4076
4077                 tlv = (struct phyerr_tlv *)&phyerr->buf[i];
4078                 tlv_len = __le16_to_cpu(tlv->len);
4079                 tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
4080                 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4081                            "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
4082                            tlv_len, tlv->tag, tlv->sig);
4083
4084                 switch (tlv->tag) {
4085                 case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY:
4086                         if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) {
4087                                 ath10k_warn(ar, "too short radar pulse summary (%d)\n",
4088                                             i);
4089                                 return;
4090                         }
4091
4092                         rr = (struct phyerr_radar_report *)tlv_buf;
4093                         ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
4094                         break;
4095                 case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
4096                         if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
4097                                 ath10k_warn(ar, "too short fft report (%d)\n",
4098                                             i);
4099                                 return;
4100                         }
4101
4102                         fftr = (struct phyerr_fft_report *)tlv_buf;
4103                         res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
4104                         if (res)
4105                                 return;
4106                         break;
4107                 }
4108
4109                 i += sizeof(*tlv) + tlv_len;
4110         }
4111 }
4112
4113 void ath10k_wmi_event_spectral_scan(struct ath10k *ar,
4114                                     struct wmi_phyerr_ev_arg *phyerr,
4115                                     u64 tsf)
4116 {
4117         int buf_len, tlv_len, res, i = 0;
4118         struct phyerr_tlv *tlv;
4119         const void *tlv_buf;
4120         const struct phyerr_fft_report *fftr;
4121         size_t fftr_len;
4122
4123         buf_len = phyerr->buf_len;
4124
4125         while (i < buf_len) {
4126                 if (i + sizeof(*tlv) > buf_len) {
4127                         ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n",
4128                                     i);
4129                         return;
4130                 }
4131
4132                 tlv = (struct phyerr_tlv *)&phyerr->buf[i];
4133                 tlv_len = __le16_to_cpu(tlv->len);
4134                 tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
4135
4136                 if (i + sizeof(*tlv) + tlv_len > buf_len) {
4137                         ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
4138                                     i);
4139                         return;
4140                 }
4141
4142                 switch (tlv->tag) {
4143                 case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
4144                         if (sizeof(*fftr) > tlv_len) {
4145                                 ath10k_warn(ar, "failed to parse fft report at byte %d\n",
4146                                             i);
4147                                 return;
4148                         }
4149
4150                         fftr_len = tlv_len - sizeof(*fftr);
4151                         fftr = tlv_buf;
4152                         res = ath10k_spectral_process_fft(ar, phyerr,
4153                                                           fftr, fftr_len,
4154                                                           tsf);
4155                         if (res < 0) {
4156                                 ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
4157                                            res);
4158                                 return;
4159                         }
4160                         break;
4161                 }
4162
4163                 i += sizeof(*tlv) + tlv_len;
4164         }
4165 }
4166
4167 static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar,
4168                                             struct sk_buff *skb,
4169                                             struct wmi_phyerr_hdr_arg *arg)
4170 {
4171         struct wmi_phyerr_event *ev = (void *)skb->data;
4172
4173         if (skb->len < sizeof(*ev))
4174                 return -EPROTO;
4175
4176         arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs);
4177         arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
4178         arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
4179         arg->buf_len = skb->len - sizeof(*ev);
4180         arg->phyerrs = ev->phyerrs;
4181
4182         return 0;
4183 }
4184
4185 static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar,
4186                                                  struct sk_buff *skb,
4187                                                  struct wmi_phyerr_hdr_arg *arg)
4188 {
4189         struct wmi_10_4_phyerr_event *ev = (void *)skb->data;
4190
4191         if (skb->len < sizeof(*ev))
4192                 return -EPROTO;
4193
4194         /* 10.4 firmware always reports only one phyerr */
4195         arg->num_phyerrs = 1;
4196
4197         arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
4198         arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
4199         arg->buf_len = skb->len;
4200         arg->phyerrs = skb->data;
4201
4202         return 0;
4203 }
4204
4205 int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar,
4206                                  const void *phyerr_buf,
4207                                  int left_len,
4208                                  struct wmi_phyerr_ev_arg *arg)
4209 {
4210         const struct wmi_phyerr *phyerr = phyerr_buf;
4211         int i;
4212
4213         if (left_len < sizeof(*phyerr)) {
4214                 ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
4215                             left_len, sizeof(*phyerr));
4216                 return -EINVAL;
4217         }
4218
4219         arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
4220         arg->freq1 = __le16_to_cpu(phyerr->freq1);
4221         arg->freq2 = __le16_to_cpu(phyerr->freq2);
4222         arg->rssi_combined = phyerr->rssi_combined;
4223         arg->chan_width_mhz = phyerr->chan_width_mhz;
4224         arg->buf_len = __le32_to_cpu(phyerr->buf_len);
4225         arg->buf = phyerr->buf;
4226         arg->hdr_len = sizeof(*phyerr);
4227
4228         for (i = 0; i < 4; i++)
4229                 arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
4230
4231         switch (phyerr->phy_err_code) {
4232         case PHY_ERROR_GEN_SPECTRAL_SCAN:
4233                 arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
4234                 break;
4235         case PHY_ERROR_GEN_FALSE_RADAR_EXT:
4236                 arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT;
4237                 break;
4238         case PHY_ERROR_GEN_RADAR:
4239                 arg->phy_err_code = PHY_ERROR_RADAR;
4240                 break;
4241         default:
4242                 arg->phy_err_code = PHY_ERROR_UNKNOWN;
4243                 break;
4244         }
4245
4246         return 0;
4247 }
4248
4249 static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar,
4250                                              const void *phyerr_buf,
4251                                              int left_len,
4252                                              struct wmi_phyerr_ev_arg *arg)
4253 {
4254         const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf;
4255         u32 phy_err_mask;
4256         int i;
4257
4258         if (left_len < sizeof(*phyerr)) {
4259                 ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
4260                             left_len, sizeof(*phyerr));
4261                 return -EINVAL;
4262         }
4263
4264         arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
4265         arg->freq1 = __le16_to_cpu(phyerr->freq1);
4266         arg->freq2 = __le16_to_cpu(phyerr->freq2);
4267         arg->rssi_combined = phyerr->rssi_combined;
4268         arg->chan_width_mhz = phyerr->chan_width_mhz;
4269         arg->buf_len = __le32_to_cpu(phyerr->buf_len);
4270         arg->buf = phyerr->buf;
4271         arg->hdr_len = sizeof(*phyerr);
4272
4273         for (i = 0; i < 4; i++)
4274                 arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
4275
4276         phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]);
4277
4278         if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK)
4279                 arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
4280         else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK)
4281                 arg->phy_err_code = PHY_ERROR_RADAR;
4282         else
4283                 arg->phy_err_code = PHY_ERROR_UNKNOWN;
4284
4285         return 0;
4286 }
4287
4288 void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
4289 {
4290         struct wmi_phyerr_hdr_arg hdr_arg = {};
4291         struct wmi_phyerr_ev_arg phyerr_arg = {};
4292         const void *phyerr;
4293         u32 count, i, buf_len, phy_err_code;
4294         u64 tsf;
4295         int left_len, ret;
4296
4297         ATH10K_DFS_STAT_INC(ar, phy_errors);
4298
4299         ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
4300         if (ret) {
4301                 ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret);
4302                 return;
4303         }
4304
4305         /* Check number of included events */
4306         count = hdr_arg.num_phyerrs;
4307
4308         left_len = hdr_arg.buf_len;
4309
4310         tsf = hdr_arg.tsf_u32;
4311         tsf <<= 32;
4312         tsf |= hdr_arg.tsf_l32;
4313
4314         ath10k_dbg(ar, ATH10K_DBG_WMI,
4315                    "wmi event phyerr count %d tsf64 0x%llX\n",
4316                    count, tsf);
4317
4318         phyerr = hdr_arg.phyerrs;
4319         for (i = 0; i < count; i++) {
4320                 ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
4321                 if (ret) {
4322                         ath10k_warn(ar, "failed to parse phyerr event (%d)\n",
4323                                     i);
4324                         return;
4325                 }
4326
4327                 left_len -= phyerr_arg.hdr_len;
4328                 buf_len = phyerr_arg.buf_len;
4329                 phy_err_code = phyerr_arg.phy_err_code;
4330
4331                 if (left_len < buf_len) {
4332                         ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
4333                         return;
4334                 }
4335
4336                 left_len -= buf_len;
4337
4338                 switch (phy_err_code) {
4339                 case PHY_ERROR_RADAR:
4340                         ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4341                         break;
4342                 case PHY_ERROR_SPECTRAL_SCAN:
4343                         ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
4344                         break;
4345                 case PHY_ERROR_FALSE_RADAR_EXT:
4346                         ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4347                         ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
4348                         break;
4349                 default:
4350                         break;
4351                 }
4352
4353                 phyerr = phyerr + phyerr_arg.hdr_len + buf_len;
4354         }
4355 }
4356
4357 static int
4358 ath10k_wmi_10_4_op_pull_dfs_status_ev(struct ath10k *ar, struct sk_buff *skb,
4359                                       struct wmi_dfs_status_ev_arg *arg)
4360 {
4361         struct wmi_dfs_status_ev_arg *ev = (void *)skb->data;
4362
4363         if (skb->len < sizeof(*ev))
4364                 return -EPROTO;
4365
4366         arg->status = ev->status;
4367
4368         return 0;
4369 }
4370
4371 static void
4372 ath10k_wmi_event_dfs_status_check(struct ath10k *ar, struct sk_buff *skb)
4373 {
4374         struct wmi_dfs_status_ev_arg status_arg = {};
4375         int ret;
4376
4377         ret = ath10k_wmi_pull_dfs_status(ar, skb, &status_arg);
4378
4379         if (ret) {
4380                 ath10k_warn(ar, "failed to parse dfs status event: %d\n", ret);
4381                 return;
4382         }
4383
4384         ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4385                    "dfs status event received from fw: %d\n",
4386                    status_arg.status);
4387
4388         /* Even in case of radar detection failure we follow the same
4389          * behaviour as if radar is detected i.e to switch to a different
4390          * channel.
4391          */
4392         if (status_arg.status == WMI_HW_RADAR_DETECTED ||
4393             status_arg.status == WMI_RADAR_DETECTION_FAIL)
4394                 ath10k_radar_detected(ar);
4395         complete(&ar->wmi.radar_confirm);
4396 }
4397
4398 void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
4399 {
4400         struct wmi_roam_ev_arg arg = {};
4401         int ret;
4402         u32 vdev_id;
4403         u32 reason;
4404         s32 rssi;
4405
4406         ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
4407         if (ret) {
4408                 ath10k_warn(ar, "failed to parse roam event: %d\n", ret);
4409                 return;
4410         }
4411
4412         vdev_id = __le32_to_cpu(arg.vdev_id);
4413         reason = __le32_to_cpu(arg.reason);
4414         rssi = __le32_to_cpu(arg.rssi);
4415         rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT;
4416
4417         ath10k_dbg(ar, ATH10K_DBG_WMI,
4418                    "wmi roam event vdev %u reason 0x%08x rssi %d\n",
4419                    vdev_id, reason, rssi);
4420
4421         if (reason >= WMI_ROAM_REASON_MAX)
4422                 ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n",
4423                             reason, vdev_id);
4424
4425         switch (reason) {
4426         case WMI_ROAM_REASON_BEACON_MISS:
4427                 ath10k_mac_handle_beacon_miss(ar, vdev_id);
4428                 break;
4429         case WMI_ROAM_REASON_BETTER_AP:
4430         case WMI_ROAM_REASON_LOW_RSSI:
4431         case WMI_ROAM_REASON_SUITABLE_AP_FOUND:
4432         case WMI_ROAM_REASON_HO_FAILED:
4433                 ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n",
4434                             reason, vdev_id);
4435                 break;
4436         }
4437 }
4438
4439 void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb)
4440 {
4441         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
4442 }
4443
4444 void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb)
4445 {
4446         char buf[101], c;
4447         int i;
4448
4449         for (i = 0; i < sizeof(buf) - 1; i++) {
4450                 if (i >= skb->len)
4451                         break;
4452
4453                 c = skb->data[i];
4454
4455                 if (c == '\0')
4456                         break;
4457
4458                 if (isascii(c) && isprint(c))
4459                         buf[i] = c;
4460                 else
4461                         buf[i] = '.';
4462         }
4463
4464         if (i == sizeof(buf) - 1)
4465                 ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len);
4466
4467         /* for some reason the debug prints end with \n, remove that */
4468         if (skb->data[i - 1] == '\n')
4469                 i--;
4470
4471         /* the last byte is always reserved for the null character */
4472         buf[i] = '\0';
4473
4474         ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
4475 }
4476
4477 void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
4478 {
4479         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
4480 }
4481
4482 void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb)
4483 {
4484         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
4485 }
4486
4487 void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
4488                                              struct sk_buff *skb)
4489 {
4490         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
4491 }
4492
4493 void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
4494                                              struct sk_buff *skb)
4495 {
4496         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
4497 }
4498
4499 void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb)
4500 {
4501         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
4502 }
4503
4504 void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb)
4505 {
4506         struct wmi_wow_ev_arg ev = {};
4507         int ret;
4508
4509         complete(&ar->wow.wakeup_completed);
4510
4511         ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
4512         if (ret) {
4513                 ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret);
4514                 return;
4515         }
4516
4517         ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
4518                    wow_reason(ev.wake_reason));
4519 }
4520
4521 void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb)
4522 {
4523         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
4524 }
4525
4526 static u8 ath10k_tpc_config_get_rate(struct ath10k *ar,
4527                                      struct wmi_pdev_tpc_config_event *ev,
4528                                      u32 rate_idx, u32 num_chains,
4529                                      u32 rate_code, u8 type)
4530 {
4531         u8 tpc, num_streams, preamble, ch, stm_idx;
4532
4533         num_streams = ATH10K_HW_NSS(rate_code);
4534         preamble = ATH10K_HW_PREAMBLE(rate_code);
4535         ch = num_chains - 1;
4536
4537         tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]);
4538
4539         if (__le32_to_cpu(ev->num_tx_chain) <= 1)
4540                 goto out;
4541
4542         if (preamble == WMI_RATE_PREAMBLE_CCK)
4543                 goto out;
4544
4545         stm_idx = num_streams - 1;
4546         if (num_chains <= num_streams)
4547                 goto out;
4548
4549         switch (type) {
4550         case WMI_TPC_TABLE_TYPE_STBC:
4551                 tpc = min_t(u8, tpc,
4552                             ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]);
4553                 break;
4554         case WMI_TPC_TABLE_TYPE_TXBF:
4555                 tpc = min_t(u8, tpc,
4556                             ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]);
4557                 break;
4558         case WMI_TPC_TABLE_TYPE_CDD:
4559                 tpc = min_t(u8, tpc,
4560                             ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]);
4561                 break;
4562         default:
4563                 ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type);
4564                 tpc = 0;
4565                 break;
4566         }
4567
4568 out:
4569         return tpc;
4570 }
4571
4572 static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
4573                                           struct wmi_pdev_tpc_config_event *ev,
4574                                           struct ath10k_tpc_stats *tpc_stats,
4575                                           u8 *rate_code, u16 *pream_table, u8 type)
4576 {
4577         u32 i, j, pream_idx, flags;
4578         u8 tpc[WMI_TPC_TX_N_CHAIN];
4579         char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
4580         char buff[WMI_TPC_BUF_SIZE];
4581
4582         flags = __le32_to_cpu(ev->flags);
4583
4584         switch (type) {
4585         case WMI_TPC_TABLE_TYPE_CDD:
4586                 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
4587                         ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
4588                         tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4589                         return;
4590                 }
4591                 break;
4592         case WMI_TPC_TABLE_TYPE_STBC:
4593                 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
4594                         ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
4595                         tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4596                         return;
4597                 }
4598                 break;
4599         case WMI_TPC_TABLE_TYPE_TXBF:
4600                 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
4601                         ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
4602                         tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4603                         return;
4604                 }
4605                 break;
4606         default:
4607                 ath10k_dbg(ar, ATH10K_DBG_WMI,
4608                            "invalid table type in wmi tpc event: %d\n", type);
4609                 return;
4610         }
4611
4612         pream_idx = 0;
4613         for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
4614                 memset(tpc_value, 0, sizeof(tpc_value));
4615                 memset(buff, 0, sizeof(buff));
4616                 if (i == pream_table[pream_idx])
4617                         pream_idx++;
4618
4619                 for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
4620                         if (j >= __le32_to_cpu(ev->num_tx_chain))
4621                                 break;
4622
4623                         tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
4624                                                             rate_code[i],
4625                                                             type);
4626                         snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
4627                         strlcat(tpc_value, buff, sizeof(tpc_value));
4628                 }
4629                 tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
4630                 tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
4631                 memcpy(tpc_stats->tpc_table[type].tpc_value[i],
4632                        tpc_value, sizeof(tpc_value));
4633         }
4634 }
4635
4636 void ath10k_wmi_tpc_config_get_rate_code(u8 *rate_code, u16 *pream_table,
4637                                          u32 num_tx_chain)
4638 {
4639         u32 i, j, pream_idx;
4640         u8 rate_idx;
4641
4642         /* Create the rate code table based on the chains supported */
4643         rate_idx = 0;
4644         pream_idx = 0;
4645
4646         /* Fill CCK rate code */
4647         for (i = 0; i < 4; i++) {
4648                 rate_code[rate_idx] =
4649                         ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK);
4650                 rate_idx++;
4651         }
4652         pream_table[pream_idx] = rate_idx;
4653         pream_idx++;
4654
4655         /* Fill OFDM rate code */
4656         for (i = 0; i < 8; i++) {
4657                 rate_code[rate_idx] =
4658                         ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM);
4659                 rate_idx++;
4660         }
4661         pream_table[pream_idx] = rate_idx;
4662         pream_idx++;
4663
4664         /* Fill HT20 rate code */
4665         for (i = 0; i < num_tx_chain; i++) {
4666                 for (j = 0; j < 8; j++) {
4667                         rate_code[rate_idx] =
4668                         ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
4669                         rate_idx++;
4670                 }
4671         }
4672         pream_table[pream_idx] = rate_idx;
4673         pream_idx++;
4674
4675         /* Fill HT40 rate code */
4676         for (i = 0; i < num_tx_chain; i++) {
4677                 for (j = 0; j < 8; j++) {
4678                         rate_code[rate_idx] =
4679                         ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
4680                         rate_idx++;
4681                 }
4682         }
4683         pream_table[pream_idx] = rate_idx;
4684         pream_idx++;
4685
4686         /* Fill VHT20 rate code */
4687         for (i = 0; i < num_tx_chain; i++) {
4688                 for (j = 0; j < 10; j++) {
4689                         rate_code[rate_idx] =
4690                         ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4691                         rate_idx++;
4692                 }
4693         }
4694         pream_table[pream_idx] = rate_idx;
4695         pream_idx++;
4696
4697         /* Fill VHT40 rate code */
4698         for (i = 0; i < num_tx_chain; i++) {
4699                 for (j = 0; j < 10; j++) {
4700                         rate_code[rate_idx] =
4701                         ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4702                         rate_idx++;
4703                 }
4704         }
4705         pream_table[pream_idx] = rate_idx;
4706         pream_idx++;
4707
4708         /* Fill VHT80 rate code */
4709         for (i = 0; i < num_tx_chain; i++) {
4710                 for (j = 0; j < 10; j++) {
4711                         rate_code[rate_idx] =
4712                         ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4713                         rate_idx++;
4714                 }
4715         }
4716         pream_table[pream_idx] = rate_idx;
4717         pream_idx++;
4718
4719         rate_code[rate_idx++] =
4720                 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
4721         rate_code[rate_idx++] =
4722                 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4723         rate_code[rate_idx++] =
4724                 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
4725         rate_code[rate_idx++] =
4726                 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4727         rate_code[rate_idx++] =
4728                 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4729
4730         pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END;
4731 }
4732
4733 void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb)
4734 {
4735         u32 num_tx_chain;
4736         u8 rate_code[WMI_TPC_RATE_MAX];
4737         u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
4738         struct wmi_pdev_tpc_config_event *ev;
4739         struct ath10k_tpc_stats *tpc_stats;
4740
4741         ev = (struct wmi_pdev_tpc_config_event *)skb->data;
4742
4743         num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4744
4745         if (num_tx_chain > WMI_TPC_TX_N_CHAIN) {
4746                 ath10k_warn(ar, "number of tx chain is %d greater than TPC configured tx chain %d\n",
4747                             num_tx_chain, WMI_TPC_TX_N_CHAIN);
4748                 return;
4749         }
4750
4751         tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
4752         if (!tpc_stats)
4753                 return;
4754
4755         ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table,
4756                                             num_tx_chain);
4757
4758         tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
4759         tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
4760         tpc_stats->ctl = __le32_to_cpu(ev->ctl);
4761         tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
4762         tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
4763         tpc_stats->twice_antenna_reduction =
4764                 __le32_to_cpu(ev->twice_antenna_reduction);
4765         tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
4766         tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
4767         tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4768         tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
4769
4770         ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4771                                       rate_code, pream_table,
4772                                       WMI_TPC_TABLE_TYPE_CDD);
4773         ath10k_tpc_config_disp_tables(ar, ev,  tpc_stats,
4774                                       rate_code, pream_table,
4775                                       WMI_TPC_TABLE_TYPE_STBC);
4776         ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4777                                       rate_code, pream_table,
4778                                       WMI_TPC_TABLE_TYPE_TXBF);
4779
4780         ath10k_debug_tpc_stats_process(ar, tpc_stats);
4781
4782         ath10k_dbg(ar, ATH10K_DBG_WMI,
4783                    "wmi event tpc config channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n",
4784                    __le32_to_cpu(ev->chan_freq),
4785                    __le32_to_cpu(ev->phy_mode),
4786                    __le32_to_cpu(ev->ctl),
4787                    __le32_to_cpu(ev->reg_domain),
4788                    a_sle32_to_cpu(ev->twice_antenna_gain),
4789                    __le32_to_cpu(ev->twice_antenna_reduction),
4790                    __le32_to_cpu(ev->power_limit),
4791                    __le32_to_cpu(ev->twice_max_rd_power) / 2,
4792                    __le32_to_cpu(ev->num_tx_chain),
4793                    __le32_to_cpu(ev->rate_max));
4794 }
4795
4796 static u8
4797 ath10k_wmi_tpc_final_get_rate(struct ath10k *ar,
4798                               struct wmi_pdev_tpc_final_table_event *ev,
4799                               u32 rate_idx, u32 num_chains,
4800                               u32 rate_code, u8 type, u32 pream_idx)
4801 {
4802         u8 tpc, num_streams, preamble, ch, stm_idx;
4803         s8 pow_agcdd, pow_agstbc, pow_agtxbf;
4804         int pream;
4805
4806         num_streams = ATH10K_HW_NSS(rate_code);
4807         preamble = ATH10K_HW_PREAMBLE(rate_code);
4808         ch = num_chains - 1;
4809         stm_idx = num_streams - 1;
4810         pream = -1;
4811
4812         if (__le32_to_cpu(ev->chan_freq) <= 2483) {
4813                 switch (pream_idx) {
4814                 case WMI_TPC_PREAM_2GHZ_CCK:
4815                         pream = 0;
4816                         break;
4817                 case WMI_TPC_PREAM_2GHZ_OFDM:
4818                         pream = 1;
4819                         break;
4820                 case WMI_TPC_PREAM_2GHZ_HT20:
4821                 case WMI_TPC_PREAM_2GHZ_VHT20:
4822                         pream = 2;
4823                         break;
4824                 case WMI_TPC_PREAM_2GHZ_HT40:
4825                 case WMI_TPC_PREAM_2GHZ_VHT40:
4826                         pream = 3;
4827                         break;
4828                 case WMI_TPC_PREAM_2GHZ_VHT80:
4829                         pream = 4;
4830                         break;
4831                 default:
4832                         pream = -1;
4833                         break;
4834                 }
4835         }
4836
4837         if (__le32_to_cpu(ev->chan_freq) >= 5180) {
4838                 switch (pream_idx) {
4839                 case WMI_TPC_PREAM_5GHZ_OFDM:
4840                         pream = 0;
4841                         break;
4842                 case WMI_TPC_PREAM_5GHZ_HT20:
4843                 case WMI_TPC_PREAM_5GHZ_VHT20:
4844                         pream = 1;
4845                         break;
4846                 case WMI_TPC_PREAM_5GHZ_HT40:
4847                 case WMI_TPC_PREAM_5GHZ_VHT40:
4848                         pream = 2;
4849                         break;
4850                 case WMI_TPC_PREAM_5GHZ_VHT80:
4851                         pream = 3;
4852                         break;
4853                 case WMI_TPC_PREAM_5GHZ_HTCUP:
4854                         pream = 4;
4855                         break;
4856                 default:
4857                         pream = -1;
4858                         break;
4859                 }
4860         }
4861
4862         if (pream == -1) {
4863                 ath10k_warn(ar, "unknown wmi tpc final index and frequency: %u, %u\n",
4864                             pream_idx, __le32_to_cpu(ev->chan_freq));
4865                 tpc = 0;
4866                 goto out;
4867         }
4868
4869         if (pream == 4)
4870                 tpc = min_t(u8, ev->rates_array[rate_idx],
4871                             ev->max_reg_allow_pow[ch]);
4872         else
4873                 tpc = min_t(u8, min_t(u8, ev->rates_array[rate_idx],
4874                                       ev->max_reg_allow_pow[ch]),
4875                             ev->ctl_power_table[0][pream][stm_idx]);
4876
4877         if (__le32_to_cpu(ev->num_tx_chain) <= 1)
4878                 goto out;
4879
4880         if (preamble == WMI_RATE_PREAMBLE_CCK)
4881                 goto out;
4882
4883         if (num_chains <= num_streams)
4884                 goto out;
4885
4886         switch (type) {
4887         case WMI_TPC_TABLE_TYPE_STBC:
4888                 pow_agstbc = ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx];
4889                 if (pream == 4)
4890                         tpc = min_t(u8, tpc, pow_agstbc);
4891                 else
4892                         tpc = min_t(u8, min_t(u8, tpc, pow_agstbc),
4893                                     ev->ctl_power_table[0][pream][stm_idx]);
4894                 break;
4895         case WMI_TPC_TABLE_TYPE_TXBF:
4896                 pow_agtxbf = ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx];
4897                 if (pream == 4)
4898                         tpc = min_t(u8, tpc, pow_agtxbf);
4899                 else
4900                         tpc = min_t(u8, min_t(u8, tpc, pow_agtxbf),
4901                                     ev->ctl_power_table[1][pream][stm_idx]);
4902                 break;
4903         case WMI_TPC_TABLE_TYPE_CDD:
4904                 pow_agcdd = ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx];
4905                 if (pream == 4)
4906                         tpc = min_t(u8, tpc, pow_agcdd);
4907                 else
4908                         tpc = min_t(u8, min_t(u8, tpc, pow_agcdd),
4909                                     ev->ctl_power_table[0][pream][stm_idx]);
4910                 break;
4911         default:
4912                 ath10k_warn(ar, "unknown wmi tpc final table type: %d\n", type);
4913                 tpc = 0;
4914                 break;
4915         }
4916
4917 out:
4918         return tpc;
4919 }
4920
4921 static void
4922 ath10k_wmi_tpc_stats_final_disp_tables(struct ath10k *ar,
4923                                        struct wmi_pdev_tpc_final_table_event *ev,
4924                                        struct ath10k_tpc_stats_final *tpc_stats,
4925                                        u8 *rate_code, u16 *pream_table, u8 type)
4926 {
4927         u32 i, j, pream_idx, flags;
4928         u8 tpc[WMI_TPC_TX_N_CHAIN];
4929         char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
4930         char buff[WMI_TPC_BUF_SIZE];
4931
4932         flags = __le32_to_cpu(ev->flags);
4933
4934         switch (type) {
4935         case WMI_TPC_TABLE_TYPE_CDD:
4936                 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
4937                         ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
4938                         tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4939                         return;
4940                 }
4941                 break;
4942         case WMI_TPC_TABLE_TYPE_STBC:
4943                 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
4944                         ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
4945                         tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4946                         return;
4947                 }
4948                 break;
4949         case WMI_TPC_TABLE_TYPE_TXBF:
4950                 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
4951                         ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
4952                         tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4953                         return;
4954                 }
4955                 break;
4956         default:
4957                 ath10k_dbg(ar, ATH10K_DBG_WMI,
4958                            "invalid table type in wmi tpc event: %d\n", type);
4959                 return;
4960         }
4961
4962         pream_idx = 0;
4963         for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
4964                 memset(tpc_value, 0, sizeof(tpc_value));
4965                 memset(buff, 0, sizeof(buff));
4966                 if (i == pream_table[pream_idx])
4967                         pream_idx++;
4968
4969                 for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
4970                         if (j >= __le32_to_cpu(ev->num_tx_chain))
4971                                 break;
4972
4973                         tpc[j] = ath10k_wmi_tpc_final_get_rate(ar, ev, i, j + 1,
4974                                                                rate_code[i],
4975                                                                type, pream_idx);
4976                         snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
4977                         strlcat(tpc_value, buff, sizeof(tpc_value));
4978                 }
4979                 tpc_stats->tpc_table_final[type].pream_idx[i] = pream_idx;
4980                 tpc_stats->tpc_table_final[type].rate_code[i] = rate_code[i];
4981                 memcpy(tpc_stats->tpc_table_final[type].tpc_value[i],
4982                        tpc_value, sizeof(tpc_value));
4983         }
4984 }
4985
4986 void ath10k_wmi_event_tpc_final_table(struct ath10k *ar, struct sk_buff *skb)
4987 {
4988         u32 num_tx_chain;
4989         u8 rate_code[WMI_TPC_FINAL_RATE_MAX];
4990         u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
4991         struct wmi_pdev_tpc_final_table_event *ev;
4992         struct ath10k_tpc_stats_final *tpc_stats;
4993
4994         ev = (struct wmi_pdev_tpc_final_table_event *)skb->data;
4995
4996         tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
4997         if (!tpc_stats)
4998                 return;
4999
5000         num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
5001
5002         ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table,
5003                                             num_tx_chain);
5004
5005         tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
5006         tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
5007         tpc_stats->ctl = __le32_to_cpu(ev->ctl);
5008         tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
5009         tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
5010         tpc_stats->twice_antenna_reduction =
5011                 __le32_to_cpu(ev->twice_antenna_reduction);
5012         tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
5013         tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
5014         tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
5015         tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
5016
5017         ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5018                                                rate_code, pream_table,
5019                                                WMI_TPC_TABLE_TYPE_CDD);
5020         ath10k_wmi_tpc_stats_final_disp_tables(ar, ev,  tpc_stats,
5021                                                rate_code, pream_table,
5022                                                WMI_TPC_TABLE_TYPE_STBC);
5023         ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5024                                                rate_code, pream_table,
5025                                                WMI_TPC_TABLE_TYPE_TXBF);
5026
5027         ath10k_debug_tpc_stats_final_process(ar, tpc_stats);
5028
5029         ath10k_dbg(ar, ATH10K_DBG_WMI,
5030                    "wmi event tpc final table channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n",
5031                    __le32_to_cpu(ev->chan_freq),
5032                    __le32_to_cpu(ev->phy_mode),
5033                    __le32_to_cpu(ev->ctl),
5034                    __le32_to_cpu(ev->reg_domain),
5035                    a_sle32_to_cpu(ev->twice_antenna_gain),
5036                    __le32_to_cpu(ev->twice_antenna_reduction),
5037                    __le32_to_cpu(ev->power_limit),
5038                    __le32_to_cpu(ev->twice_max_rd_power) / 2,
5039                    __le32_to_cpu(ev->num_tx_chain),
5040                    __le32_to_cpu(ev->rate_max));
5041 }
5042
5043 static void
5044 ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb)
5045 {
5046         struct wmi_tdls_peer_event *ev;
5047         struct ath10k_peer *peer;
5048         struct ath10k_vif *arvif;
5049         int vdev_id;
5050         int peer_status;
5051         int peer_reason;
5052         u8 reason;
5053
5054         if (skb->len < sizeof(*ev)) {
5055                 ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n",
5056                            skb->len);
5057                 return;
5058         }
5059
5060         ev = (struct wmi_tdls_peer_event *)skb->data;
5061         vdev_id = __le32_to_cpu(ev->vdev_id);
5062         peer_status = __le32_to_cpu(ev->peer_status);
5063         peer_reason = __le32_to_cpu(ev->peer_reason);
5064
5065         spin_lock_bh(&ar->data_lock);
5066         peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr);
5067         spin_unlock_bh(&ar->data_lock);
5068
5069         if (!peer) {
5070                 ath10k_warn(ar, "failed to find peer entry for %pM\n",
5071                             ev->peer_macaddr.addr);
5072                 return;
5073         }
5074
5075         switch (peer_status) {
5076         case WMI_TDLS_SHOULD_TEARDOWN:
5077                 switch (peer_reason) {
5078                 case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT:
5079                 case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE:
5080                 case WMI_TDLS_TEARDOWN_REASON_RSSI:
5081                         reason = WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE;
5082                         break;
5083                 default:
5084                         reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED;
5085                         break;
5086                 }
5087
5088                 arvif = ath10k_get_arvif(ar, vdev_id);
5089                 if (!arvif) {
5090                         ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n",
5091                                     vdev_id);
5092                         return;
5093                 }
5094
5095                 ieee80211_tdls_oper_request(arvif->vif, ev->peer_macaddr.addr,
5096                                             NL80211_TDLS_TEARDOWN, reason,
5097                                             GFP_ATOMIC);
5098
5099                 ath10k_dbg(ar, ATH10K_DBG_WMI,
5100                            "received tdls teardown event for peer %pM reason %u\n",
5101                            ev->peer_macaddr.addr, peer_reason);
5102                 break;
5103         default:
5104                 ath10k_dbg(ar, ATH10K_DBG_WMI,
5105                            "received unknown tdls peer event %u\n",
5106                            peer_status);
5107                 break;
5108         }
5109 }
5110
5111 static void
5112 ath10k_wmi_event_peer_sta_ps_state_chg(struct ath10k *ar, struct sk_buff *skb)
5113 {
5114         struct wmi_peer_sta_ps_state_chg_event *ev;
5115         struct ieee80211_sta *sta;
5116         struct ath10k_sta *arsta;
5117         u8 peer_addr[ETH_ALEN];
5118
5119         lockdep_assert_held(&ar->data_lock);
5120
5121         ev = (struct wmi_peer_sta_ps_state_chg_event *)skb->data;
5122         ether_addr_copy(peer_addr, ev->peer_macaddr.addr);
5123
5124         rcu_read_lock();
5125
5126         sta = ieee80211_find_sta_by_ifaddr(ar->hw, peer_addr, NULL);
5127
5128         if (!sta) {
5129                 ath10k_warn(ar, "failed to find station entry %pM\n",
5130                             peer_addr);
5131                 goto exit;
5132         }
5133
5134         arsta = (struct ath10k_sta *)sta->drv_priv;
5135         arsta->peer_ps_state = __le32_to_cpu(ev->peer_ps_state);
5136
5137 exit:
5138         rcu_read_unlock();
5139 }
5140
5141 void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
5142 {
5143         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
5144 }
5145
5146 void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb)
5147 {
5148         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
5149 }
5150
5151 void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb)
5152 {
5153         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
5154 }
5155
5156 void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb)
5157 {
5158         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
5159 }
5160
5161 void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb)
5162 {
5163         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
5164 }
5165
5166 void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
5167                                                 struct sk_buff *skb)
5168 {
5169         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
5170 }
5171
5172 void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb)
5173 {
5174         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
5175 }
5176
5177 void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb)
5178 {
5179         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
5180 }
5181
5182 void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb)
5183 {
5184         ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
5185 }
5186
5187 static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
5188                                   u32 num_units, u32 unit_len)
5189 {
5190         dma_addr_t paddr;
5191         u32 pool_size;
5192         int idx = ar->wmi.num_mem_chunks;
5193         void *vaddr;
5194
5195         pool_size = num_units * round_up(unit_len, 4);
5196         vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL);
5197
5198         if (!vaddr)
5199                 return -ENOMEM;
5200
5201         ar->wmi.mem_chunks[idx].vaddr = vaddr;
5202         ar->wmi.mem_chunks[idx].paddr = paddr;
5203         ar->wmi.mem_chunks[idx].len = pool_size;
5204         ar->wmi.mem_chunks[idx].req_id = req_id;
5205         ar->wmi.num_mem_chunks++;
5206
5207         return num_units;
5208 }
5209
5210 static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
5211                                      u32 num_units, u32 unit_len)
5212 {
5213         int ret;
5214
5215         while (num_units) {
5216                 ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len);
5217                 if (ret < 0)
5218                         return ret;
5219
5220                 num_units -= ret;
5221         }
5222
5223         return 0;
5224 }
5225
5226 static bool
5227 ath10k_wmi_is_host_mem_allocated(struct ath10k *ar,
5228                                  const struct wlan_host_mem_req **mem_reqs,
5229                                  u32 num_mem_reqs)
5230 {
5231         u32 req_id, num_units, unit_size, num_unit_info;
5232         u32 pool_size;
5233         int i, j;
5234         bool found;
5235
5236         if (ar->wmi.num_mem_chunks != num_mem_reqs)
5237                 return false;
5238
5239         for (i = 0; i < num_mem_reqs; ++i) {
5240                 req_id = __le32_to_cpu(mem_reqs[i]->req_id);
5241                 num_units = __le32_to_cpu(mem_reqs[i]->num_units);
5242                 unit_size = __le32_to_cpu(mem_reqs[i]->unit_size);
5243                 num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info);
5244
5245                 if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
5246                         if (ar->num_active_peers)
5247                                 num_units = ar->num_active_peers + 1;
5248                         else
5249                                 num_units = ar->max_num_peers + 1;
5250                 } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
5251                         num_units = ar->max_num_peers + 1;
5252                 } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
5253                         num_units = ar->max_num_vdevs + 1;
5254                 }
5255
5256                 found = false;
5257                 for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
5258                         if (ar->wmi.mem_chunks[j].req_id == req_id) {
5259                                 pool_size = num_units * round_up(unit_size, 4);
5260                                 if (ar->wmi.mem_chunks[j].len == pool_size) {
5261                                         found = true;
5262                                         break;
5263                                 }
5264                         }
5265                 }
5266                 if (!found)
5267                         return false;
5268         }
5269
5270         return true;
5271 }
5272
5273 static int
5274 ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5275                                    struct wmi_svc_rdy_ev_arg *arg)
5276 {
5277         struct wmi_service_ready_event *ev;
5278         size_t i, n;
5279
5280         if (skb->len < sizeof(*ev))
5281                 return -EPROTO;
5282
5283         ev = (void *)skb->data;
5284         skb_pull(skb, sizeof(*ev));
5285         arg->min_tx_power = ev->hw_min_tx_power;
5286         arg->max_tx_power = ev->hw_max_tx_power;
5287         arg->ht_cap = ev->ht_cap_info;
5288         arg->vht_cap = ev->vht_cap_info;
5289         arg->sw_ver0 = ev->sw_version;
5290         arg->sw_ver1 = ev->sw_version_1;
5291         arg->phy_capab = ev->phy_capability;
5292         arg->num_rf_chains = ev->num_rf_chains;
5293         arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
5294         arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
5295         arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
5296         arg->num_mem_reqs = ev->num_mem_reqs;
5297         arg->service_map = ev->wmi_service_bitmap;
5298         arg->service_map_len = sizeof(ev->wmi_service_bitmap);
5299
5300         n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
5301                   ARRAY_SIZE(arg->mem_reqs));
5302         for (i = 0; i < n; i++)
5303                 arg->mem_reqs[i] = &ev->mem_reqs[i];
5304
5305         if (skb->len <
5306             __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
5307                 return -EPROTO;
5308
5309         return 0;
5310 }
5311
5312 static int
5313 ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5314                                   struct wmi_svc_rdy_ev_arg *arg)
5315 {
5316         struct wmi_10x_service_ready_event *ev;
5317         int i, n;
5318
5319         if (skb->len < sizeof(*ev))
5320                 return -EPROTO;
5321
5322         ev = (void *)skb->data;
5323         skb_pull(skb, sizeof(*ev));
5324         arg->min_tx_power = ev->hw_min_tx_power;
5325         arg->max_tx_power = ev->hw_max_tx_power;
5326         arg->ht_cap = ev->ht_cap_info;
5327         arg->vht_cap = ev->vht_cap_info;
5328         arg->sw_ver0 = ev->sw_version;
5329         arg->phy_capab = ev->phy_capability;
5330         arg->num_rf_chains = ev->num_rf_chains;
5331         arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
5332         arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
5333         arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
5334         arg->num_mem_reqs = ev->num_mem_reqs;
5335         arg->service_map = ev->wmi_service_bitmap;
5336         arg->service_map_len = sizeof(ev->wmi_service_bitmap);
5337
5338         n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
5339                   ARRAY_SIZE(arg->mem_reqs));
5340         for (i = 0; i < n; i++)
5341                 arg->mem_reqs[i] = &ev->mem_reqs[i];
5342
5343         if (skb->len <
5344             __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
5345                 return -EPROTO;
5346
5347         return 0;
5348 }
5349
5350 static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
5351 {
5352         struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work);
5353         struct sk_buff *skb = ar->svc_rdy_skb;
5354         struct wmi_svc_rdy_ev_arg arg = {};
5355         u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
5356         int ret;
5357         bool allocated;
5358
5359         if (!skb) {
5360                 ath10k_warn(ar, "invalid service ready event skb\n");
5361                 return;
5362         }
5363
5364         ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg);
5365         if (ret) {
5366                 ath10k_warn(ar, "failed to parse service ready: %d\n", ret);
5367                 return;
5368         }
5369
5370         ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
5371                            arg.service_map_len);
5372
5373         ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power);
5374         ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power);
5375         ar->ht_cap_info = __le32_to_cpu(arg.ht_cap);
5376         ar->vht_cap_info = __le32_to_cpu(arg.vht_cap);
5377         ar->fw_version_major =
5378                 (__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24;
5379         ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff);
5380         ar->fw_version_release =
5381                 (__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16;
5382         ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff);
5383         ar->phy_capability = __le32_to_cpu(arg.phy_capab);
5384         ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains);
5385         ar->hw_eeprom_rd = __le32_to_cpu(arg.eeprom_rd);
5386         ar->low_5ghz_chan = __le32_to_cpu(arg.low_5ghz_chan);
5387         ar->high_5ghz_chan = __le32_to_cpu(arg.high_5ghz_chan);
5388
5389         ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
5390                         arg.service_map, arg.service_map_len);
5391
5392         if (ar->num_rf_chains > ar->max_spatial_stream) {
5393                 ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n",
5394                             ar->num_rf_chains, ar->max_spatial_stream);
5395                 ar->num_rf_chains = ar->max_spatial_stream;
5396         }
5397
5398         if (!ar->cfg_tx_chainmask) {
5399                 ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
5400                 ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
5401         }
5402
5403         if (strlen(ar->hw->wiphy->fw_version) == 0) {
5404                 snprintf(ar->hw->wiphy->fw_version,
5405                          sizeof(ar->hw->wiphy->fw_version),
5406                          "%u.%u.%u.%u",
5407                          ar->fw_version_major,
5408                          ar->fw_version_minor,
5409                          ar->fw_version_release,
5410                          ar->fw_version_build);
5411         }
5412
5413         num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs);
5414         if (num_mem_reqs > WMI_MAX_MEM_REQS) {
5415                 ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n",
5416                             num_mem_reqs);
5417                 return;
5418         }
5419
5420         if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) {
5421                 if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
5422                              ar->running_fw->fw_file.fw_features))
5423                         ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC +
5424                                                ar->max_num_vdevs;
5425                 else
5426                         ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
5427                                                ar->max_num_vdevs;
5428
5429                 ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
5430                                     ar->max_num_vdevs;
5431                 ar->num_tids = ar->num_active_peers * 2;
5432                 ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
5433         }
5434
5435         /* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE
5436          * and WMI_SERVICE_IRAM_TIDS, etc.
5437          */
5438
5439         allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
5440                                                      num_mem_reqs);
5441         if (allocated)
5442                 goto skip_mem_alloc;
5443
5444         /* Either this event is received during boot time or there is a change
5445          * in memory requirement from firmware when compared to last request.
5446          * Free any old memory and do a fresh allocation based on the current
5447          * memory requirement.
5448          */
5449         ath10k_wmi_free_host_mem(ar);
5450
5451         for (i = 0; i < num_mem_reqs; ++i) {
5452                 req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id);
5453                 num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units);
5454                 unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size);
5455                 num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info);
5456
5457                 if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
5458                         if (ar->num_active_peers)
5459                                 num_units = ar->num_active_peers + 1;
5460                         else
5461                                 num_units = ar->max_num_peers + 1;
5462                 } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
5463                         /* number of units to allocate is number of
5464                          * peers, 1 extra for self peer on target
5465                          * this needs to be tied, host and target
5466                          * can get out of sync
5467                          */
5468                         num_units = ar->max_num_peers + 1;
5469                 } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
5470                         num_units = ar->max_num_vdevs + 1;
5471                 }
5472
5473                 ath10k_dbg(ar, ATH10K_DBG_WMI,
5474                            "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
5475                            req_id,
5476                            __le32_to_cpu(arg.mem_reqs[i]->num_units),
5477                            num_unit_info,
5478                            unit_size,
5479                            num_units);
5480
5481                 ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
5482                                                 unit_size);
5483                 if (ret)
5484                         return;
5485         }
5486
5487 skip_mem_alloc:
5488         ath10k_dbg(ar, ATH10K_DBG_WMI,
5489                    "wmi event service ready min_tx_power 0x%08x max_tx_power 0x%08x ht_cap 0x%08x vht_cap 0x%08x sw_ver0 0x%08x sw_ver1 0x%08x fw_build 0x%08x phy_capab 0x%08x num_rf_chains 0x%08x eeprom_rd 0x%08x num_mem_reqs 0x%08x\n",
5490                    __le32_to_cpu(arg.min_tx_power),
5491                    __le32_to_cpu(arg.max_tx_power),
5492                    __le32_to_cpu(arg.ht_cap),
5493                    __le32_to_cpu(arg.vht_cap),
5494                    __le32_to_cpu(arg.sw_ver0),
5495                    __le32_to_cpu(arg.sw_ver1),
5496                    __le32_to_cpu(arg.fw_build),
5497                    __le32_to_cpu(arg.phy_capab),
5498                    __le32_to_cpu(arg.num_rf_chains),
5499                    __le32_to_cpu(arg.eeprom_rd),
5500                    __le32_to_cpu(arg.num_mem_reqs));
5501
5502         dev_kfree_skb(skb);
5503         ar->svc_rdy_skb = NULL;
5504         complete(&ar->wmi.service_ready);
5505 }
5506
5507 void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb)
5508 {
5509         ar->svc_rdy_skb = skb;
5510         queue_work(ar->workqueue_aux, &ar->svc_rdy_work);
5511 }
5512
5513 static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5514                                      struct wmi_rdy_ev_arg *arg)
5515 {
5516         struct wmi_ready_event *ev = (void *)skb->data;
5517
5518         if (skb->len < sizeof(*ev))
5519                 return -EPROTO;
5520
5521         skb_pull(skb, sizeof(*ev));
5522         arg->sw_version = ev->sw_version;
5523         arg->abi_version = ev->abi_version;
5524         arg->status = ev->status;
5525         arg->mac_addr = ev->mac_addr.addr;
5526
5527         return 0;
5528 }
5529
5530 static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
5531                                       struct wmi_roam_ev_arg *arg)
5532 {
5533         struct wmi_roam_ev *ev = (void *)skb->data;
5534
5535         if (skb->len < sizeof(*ev))
5536                 return -EPROTO;
5537
5538         skb_pull(skb, sizeof(*ev));
5539         arg->vdev_id = ev->vdev_id;
5540         arg->reason = ev->reason;
5541
5542         return 0;
5543 }
5544
5545 static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar,
5546                                       struct sk_buff *skb,
5547                                       struct wmi_echo_ev_arg *arg)
5548 {
5549         struct wmi_echo_event *ev = (void *)skb->data;
5550
5551         arg->value = ev->value;
5552
5553         return 0;
5554 }
5555
5556 int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb)
5557 {
5558         struct wmi_rdy_ev_arg arg = {};
5559         int ret;
5560
5561         ret = ath10k_wmi_pull_rdy(ar, skb, &arg);
5562         if (ret) {
5563                 ath10k_warn(ar, "failed to parse ready event: %d\n", ret);
5564                 return ret;
5565         }
5566
5567         ath10k_dbg(ar, ATH10K_DBG_WMI,
5568                    "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
5569                    __le32_to_cpu(arg.sw_version),
5570                    __le32_to_cpu(arg.abi_version),
5571                    arg.mac_addr,
5572                    __le32_to_cpu(arg.status));
5573
5574         if (is_zero_ether_addr(ar->mac_addr))
5575                 ether_addr_copy(ar->mac_addr, arg.mac_addr);
5576         complete(&ar->wmi.unified_ready);
5577         return 0;
5578 }
5579
5580 void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb)
5581 {
5582         int ret;
5583         struct wmi_svc_avail_ev_arg arg = {};
5584
5585         ret = ath10k_wmi_pull_svc_avail(ar, skb, &arg);
5586         if (ret) {
5587                 ath10k_warn(ar, "failed to parse service available event: %d\n",
5588                             ret);
5589         }
5590
5591         ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
5592                                __le32_to_cpu(arg.service_map_ext_len));
5593 }
5594
5595 static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
5596 {
5597         const struct wmi_pdev_temperature_event *ev;
5598
5599         ev = (struct wmi_pdev_temperature_event *)skb->data;
5600         if (WARN_ON(skb->len < sizeof(*ev)))
5601                 return -EPROTO;
5602
5603         ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature));
5604         return 0;
5605 }
5606
5607 static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar,
5608                                                struct sk_buff *skb)
5609 {
5610         struct wmi_pdev_bss_chan_info_event *ev;
5611         struct survey_info *survey;
5612         u64 busy, total, tx, rx, rx_bss;
5613         u32 freq, noise_floor;
5614         u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz;
5615         int idx;
5616
5617         ev = (struct wmi_pdev_bss_chan_info_event *)skb->data;
5618         if (WARN_ON(skb->len < sizeof(*ev)))
5619                 return -EPROTO;
5620
5621         freq        = __le32_to_cpu(ev->freq);
5622         noise_floor = __le32_to_cpu(ev->noise_floor);
5623         busy        = __le64_to_cpu(ev->cycle_busy);
5624         total       = __le64_to_cpu(ev->cycle_total);
5625         tx          = __le64_to_cpu(ev->cycle_tx);
5626         rx          = __le64_to_cpu(ev->cycle_rx);
5627         rx_bss      = __le64_to_cpu(ev->cycle_rx_bss);
5628
5629         ath10k_dbg(ar, ATH10K_DBG_WMI,
5630                    "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n",
5631                    freq, noise_floor, busy, total, tx, rx, rx_bss);
5632
5633         spin_lock_bh(&ar->data_lock);
5634         idx = freq_to_idx(ar, freq);
5635         if (idx >= ARRAY_SIZE(ar->survey)) {
5636                 ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n",
5637                             freq, idx);
5638                 goto exit;
5639         }
5640
5641         survey = &ar->survey[idx];
5642
5643         survey->noise     = noise_floor;
5644         survey->time      = div_u64(total, cc_freq_hz);
5645         survey->time_busy = div_u64(busy, cc_freq_hz);
5646         survey->time_rx   = div_u64(rx_bss, cc_freq_hz);
5647         survey->time_tx   = div_u64(tx, cc_freq_hz);
5648         survey->filled   |= (SURVEY_INFO_NOISE_DBM |
5649                              SURVEY_INFO_TIME |
5650                              SURVEY_INFO_TIME_BUSY |
5651                              SURVEY_INFO_TIME_RX |
5652                              SURVEY_INFO_TIME_TX);
5653 exit:
5654         spin_unlock_bh(&ar->data_lock);
5655         complete(&ar->bss_survey_done);
5656         return 0;
5657 }
5658
5659 static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k *ar)
5660 {
5661         if (ar->hw_params.hw_ops->set_coverage_class) {
5662                 spin_lock_bh(&ar->data_lock);
5663
5664                 /* This call only ensures that the modified coverage class
5665                  * persists in case the firmware sets the registers back to
5666                  * their default value. So calling it is only necessary if the
5667                  * coverage class has a non-zero value.
5668                  */
5669                 if (ar->fw_coverage.coverage_class)
5670                         queue_work(ar->workqueue, &ar->set_coverage_class_work);
5671
5672                 spin_unlock_bh(&ar->data_lock);
5673         }
5674 }
5675
5676 static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb)
5677 {
5678         struct wmi_cmd_hdr *cmd_hdr;
5679         enum wmi_event_id id;
5680
5681         cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5682         id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5683
5684         if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5685                 goto out;
5686
5687         trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5688
5689         switch (id) {
5690         case WMI_MGMT_RX_EVENTID:
5691                 ath10k_wmi_event_mgmt_rx(ar, skb);
5692                 /* mgmt_rx() owns the skb now! */
5693                 return;
5694         case WMI_SCAN_EVENTID:
5695                 ath10k_wmi_event_scan(ar, skb);
5696                 ath10k_wmi_queue_set_coverage_class_work(ar);
5697                 break;
5698         case WMI_CHAN_INFO_EVENTID:
5699                 ath10k_wmi_event_chan_info(ar, skb);
5700                 break;
5701         case WMI_ECHO_EVENTID:
5702                 ath10k_wmi_event_echo(ar, skb);
5703                 break;
5704         case WMI_DEBUG_MESG_EVENTID:
5705                 ath10k_wmi_event_debug_mesg(ar, skb);
5706                 ath10k_wmi_queue_set_coverage_class_work(ar);
5707                 break;
5708         case WMI_UPDATE_STATS_EVENTID:
5709                 ath10k_wmi_event_update_stats(ar, skb);
5710                 break;
5711         case WMI_VDEV_START_RESP_EVENTID:
5712                 ath10k_wmi_event_vdev_start_resp(ar, skb);
5713                 ath10k_wmi_queue_set_coverage_class_work(ar);
5714                 break;
5715         case WMI_VDEV_STOPPED_EVENTID:
5716                 ath10k_wmi_event_vdev_stopped(ar, skb);
5717                 ath10k_wmi_queue_set_coverage_class_work(ar);
5718                 break;
5719         case WMI_PEER_STA_KICKOUT_EVENTID:
5720                 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5721                 break;
5722         case WMI_HOST_SWBA_EVENTID:
5723                 ath10k_wmi_event_host_swba(ar, skb);
5724                 break;
5725         case WMI_TBTTOFFSET_UPDATE_EVENTID:
5726                 ath10k_wmi_event_tbttoffset_update(ar, skb);
5727                 break;
5728         case WMI_PHYERR_EVENTID:
5729                 ath10k_wmi_event_phyerr(ar, skb);
5730                 break;
5731         case WMI_ROAM_EVENTID:
5732                 ath10k_wmi_event_roam(ar, skb);
5733                 ath10k_wmi_queue_set_coverage_class_work(ar);
5734                 break;
5735         case WMI_PROFILE_MATCH:
5736                 ath10k_wmi_event_profile_match(ar, skb);
5737                 break;
5738         case WMI_DEBUG_PRINT_EVENTID:
5739                 ath10k_wmi_event_debug_print(ar, skb);
5740                 ath10k_wmi_queue_set_coverage_class_work(ar);
5741                 break;
5742         case WMI_PDEV_QVIT_EVENTID:
5743                 ath10k_wmi_event_pdev_qvit(ar, skb);
5744                 break;
5745         case WMI_WLAN_PROFILE_DATA_EVENTID:
5746                 ath10k_wmi_event_wlan_profile_data(ar, skb);
5747                 break;
5748         case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
5749                 ath10k_wmi_event_rtt_measurement_report(ar, skb);
5750                 break;
5751         case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
5752                 ath10k_wmi_event_tsf_measurement_report(ar, skb);
5753                 break;
5754         case WMI_RTT_ERROR_REPORT_EVENTID:
5755                 ath10k_wmi_event_rtt_error_report(ar, skb);
5756                 break;
5757         case WMI_WOW_WAKEUP_HOST_EVENTID:
5758                 ath10k_wmi_event_wow_wakeup_host(ar, skb);
5759                 break;
5760         case WMI_DCS_INTERFERENCE_EVENTID:
5761                 ath10k_wmi_event_dcs_interference(ar, skb);
5762                 break;
5763         case WMI_PDEV_TPC_CONFIG_EVENTID:
5764                 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5765                 break;
5766         case WMI_PDEV_FTM_INTG_EVENTID:
5767                 ath10k_wmi_event_pdev_ftm_intg(ar, skb);
5768                 break;
5769         case WMI_GTK_OFFLOAD_STATUS_EVENTID:
5770                 ath10k_wmi_event_gtk_offload_status(ar, skb);
5771                 break;
5772         case WMI_GTK_REKEY_FAIL_EVENTID:
5773                 ath10k_wmi_event_gtk_rekey_fail(ar, skb);
5774                 break;
5775         case WMI_TX_DELBA_COMPLETE_EVENTID:
5776                 ath10k_wmi_event_delba_complete(ar, skb);
5777                 break;
5778         case WMI_TX_ADDBA_COMPLETE_EVENTID:
5779                 ath10k_wmi_event_addba_complete(ar, skb);
5780                 break;
5781         case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
5782                 ath10k_wmi_event_vdev_install_key_complete(ar, skb);
5783                 break;
5784         case WMI_SERVICE_READY_EVENTID:
5785                 ath10k_wmi_event_service_ready(ar, skb);
5786                 return;
5787         case WMI_READY_EVENTID:
5788                 ath10k_wmi_event_ready(ar, skb);
5789                 ath10k_wmi_queue_set_coverage_class_work(ar);
5790                 break;
5791         case WMI_SERVICE_AVAILABLE_EVENTID:
5792                 ath10k_wmi_event_service_available(ar, skb);
5793                 break;
5794         default:
5795                 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5796                 break;
5797         }
5798
5799 out:
5800         dev_kfree_skb(skb);
5801 }
5802
5803 static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb)
5804 {
5805         struct wmi_cmd_hdr *cmd_hdr;
5806         enum wmi_10x_event_id id;
5807         bool consumed;
5808
5809         cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5810         id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5811
5812         if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5813                 goto out;
5814
5815         trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5816
5817         consumed = ath10k_tm_event_wmi(ar, id, skb);
5818
5819         /* Ready event must be handled normally also in UTF mode so that we
5820          * know the UTF firmware has booted, others we are just bypass WMI
5821          * events to testmode.
5822          */
5823         if (consumed && id != WMI_10X_READY_EVENTID) {
5824                 ath10k_dbg(ar, ATH10K_DBG_WMI,
5825                            "wmi testmode consumed 0x%x\n", id);
5826                 goto out;
5827         }
5828
5829         switch (id) {
5830         case WMI_10X_MGMT_RX_EVENTID:
5831                 ath10k_wmi_event_mgmt_rx(ar, skb);
5832                 /* mgmt_rx() owns the skb now! */
5833                 return;
5834         case WMI_10X_SCAN_EVENTID:
5835                 ath10k_wmi_event_scan(ar, skb);
5836                 ath10k_wmi_queue_set_coverage_class_work(ar);
5837                 break;
5838         case WMI_10X_CHAN_INFO_EVENTID:
5839                 ath10k_wmi_event_chan_info(ar, skb);
5840                 break;
5841         case WMI_10X_ECHO_EVENTID:
5842                 ath10k_wmi_event_echo(ar, skb);
5843                 break;
5844         case WMI_10X_DEBUG_MESG_EVENTID:
5845                 ath10k_wmi_event_debug_mesg(ar, skb);
5846                 ath10k_wmi_queue_set_coverage_class_work(ar);
5847                 break;
5848         case WMI_10X_UPDATE_STATS_EVENTID:
5849                 ath10k_wmi_event_update_stats(ar, skb);
5850                 break;
5851         case WMI_10X_VDEV_START_RESP_EVENTID:
5852                 ath10k_wmi_event_vdev_start_resp(ar, skb);
5853                 ath10k_wmi_queue_set_coverage_class_work(ar);
5854                 break;
5855         case WMI_10X_VDEV_STOPPED_EVENTID:
5856                 ath10k_wmi_event_vdev_stopped(ar, skb);
5857                 ath10k_wmi_queue_set_coverage_class_work(ar);
5858                 break;
5859         case WMI_10X_PEER_STA_KICKOUT_EVENTID:
5860                 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5861                 break;
5862         case WMI_10X_HOST_SWBA_EVENTID:
5863                 ath10k_wmi_event_host_swba(ar, skb);
5864                 break;
5865         case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
5866                 ath10k_wmi_event_tbttoffset_update(ar, skb);
5867                 break;
5868         case WMI_10X_PHYERR_EVENTID:
5869                 ath10k_wmi_event_phyerr(ar, skb);
5870                 break;
5871         case WMI_10X_ROAM_EVENTID:
5872                 ath10k_wmi_event_roam(ar, skb);
5873                 ath10k_wmi_queue_set_coverage_class_work(ar);
5874                 break;
5875         case WMI_10X_PROFILE_MATCH:
5876                 ath10k_wmi_event_profile_match(ar, skb);
5877                 break;
5878         case WMI_10X_DEBUG_PRINT_EVENTID:
5879                 ath10k_wmi_event_debug_print(ar, skb);
5880                 ath10k_wmi_queue_set_coverage_class_work(ar);
5881                 break;
5882         case WMI_10X_PDEV_QVIT_EVENTID:
5883                 ath10k_wmi_event_pdev_qvit(ar, skb);
5884                 break;
5885         case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
5886                 ath10k_wmi_event_wlan_profile_data(ar, skb);
5887                 break;
5888         case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
5889                 ath10k_wmi_event_rtt_measurement_report(ar, skb);
5890                 break;
5891         case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
5892                 ath10k_wmi_event_tsf_measurement_report(ar, skb);
5893                 break;
5894         case WMI_10X_RTT_ERROR_REPORT_EVENTID:
5895                 ath10k_wmi_event_rtt_error_report(ar, skb);
5896                 break;
5897         case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
5898                 ath10k_wmi_event_wow_wakeup_host(ar, skb);
5899                 break;
5900         case WMI_10X_DCS_INTERFERENCE_EVENTID:
5901                 ath10k_wmi_event_dcs_interference(ar, skb);
5902                 break;
5903         case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
5904                 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5905                 break;
5906         case WMI_10X_INST_RSSI_STATS_EVENTID:
5907                 ath10k_wmi_event_inst_rssi_stats(ar, skb);
5908                 break;
5909         case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
5910                 ath10k_wmi_event_vdev_standby_req(ar, skb);
5911                 break;
5912         case WMI_10X_VDEV_RESUME_REQ_EVENTID:
5913                 ath10k_wmi_event_vdev_resume_req(ar, skb);
5914                 break;
5915         case WMI_10X_SERVICE_READY_EVENTID:
5916                 ath10k_wmi_event_service_ready(ar, skb);
5917                 return;
5918         case WMI_10X_READY_EVENTID:
5919                 ath10k_wmi_event_ready(ar, skb);
5920                 ath10k_wmi_queue_set_coverage_class_work(ar);
5921                 break;
5922         case WMI_10X_PDEV_UTF_EVENTID:
5923                 /* ignore utf events */
5924                 break;
5925         default:
5926                 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5927                 break;
5928         }
5929
5930 out:
5931         dev_kfree_skb(skb);
5932 }
5933
5934 static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
5935 {
5936         struct wmi_cmd_hdr *cmd_hdr;
5937         enum wmi_10_2_event_id id;
5938         bool consumed;
5939
5940         cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5941         id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5942
5943         if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5944                 goto out;
5945
5946         trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5947
5948         consumed = ath10k_tm_event_wmi(ar, id, skb);
5949
5950         /* Ready event must be handled normally also in UTF mode so that we
5951          * know the UTF firmware has booted, others we are just bypass WMI
5952          * events to testmode.
5953          */
5954         if (consumed && id != WMI_10_2_READY_EVENTID) {
5955                 ath10k_dbg(ar, ATH10K_DBG_WMI,
5956                            "wmi testmode consumed 0x%x\n", id);
5957                 goto out;
5958         }
5959
5960         switch (id) {
5961         case WMI_10_2_MGMT_RX_EVENTID:
5962                 ath10k_wmi_event_mgmt_rx(ar, skb);
5963                 /* mgmt_rx() owns the skb now! */
5964                 return;
5965         case WMI_10_2_SCAN_EVENTID:
5966                 ath10k_wmi_event_scan(ar, skb);
5967                 ath10k_wmi_queue_set_coverage_class_work(ar);
5968                 break;
5969         case WMI_10_2_CHAN_INFO_EVENTID:
5970                 ath10k_wmi_event_chan_info(ar, skb);
5971                 break;
5972         case WMI_10_2_ECHO_EVENTID:
5973                 ath10k_wmi_event_echo(ar, skb);
5974                 break;
5975         case WMI_10_2_DEBUG_MESG_EVENTID:
5976                 ath10k_wmi_event_debug_mesg(ar, skb);
5977                 ath10k_wmi_queue_set_coverage_class_work(ar);
5978                 break;
5979         case WMI_10_2_UPDATE_STATS_EVENTID:
5980                 ath10k_wmi_event_update_stats(ar, skb);
5981                 break;
5982         case WMI_10_2_VDEV_START_RESP_EVENTID:
5983                 ath10k_wmi_event_vdev_start_resp(ar, skb);
5984                 ath10k_wmi_queue_set_coverage_class_work(ar);
5985                 break;
5986         case WMI_10_2_VDEV_STOPPED_EVENTID:
5987                 ath10k_wmi_event_vdev_stopped(ar, skb);
5988                 ath10k_wmi_queue_set_coverage_class_work(ar);
5989                 break;
5990         case WMI_10_2_PEER_STA_KICKOUT_EVENTID:
5991                 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5992                 break;
5993         case WMI_10_2_HOST_SWBA_EVENTID:
5994                 ath10k_wmi_event_host_swba(ar, skb);
5995                 break;
5996         case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID:
5997                 ath10k_wmi_event_tbttoffset_update(ar, skb);
5998                 break;
5999         case WMI_10_2_PHYERR_EVENTID:
6000                 ath10k_wmi_event_phyerr(ar, skb);
6001                 break;
6002         case WMI_10_2_ROAM_EVENTID:
6003                 ath10k_wmi_event_roam(ar, skb);
6004                 ath10k_wmi_queue_set_coverage_class_work(ar);
6005                 break;
6006         case WMI_10_2_PROFILE_MATCH:
6007                 ath10k_wmi_event_profile_match(ar, skb);
6008                 break;
6009         case WMI_10_2_DEBUG_PRINT_EVENTID:
6010                 ath10k_wmi_event_debug_print(ar, skb);
6011                 ath10k_wmi_queue_set_coverage_class_work(ar);
6012                 break;
6013         case WMI_10_2_PDEV_QVIT_EVENTID:
6014                 ath10k_wmi_event_pdev_qvit(ar, skb);
6015                 break;
6016         case WMI_10_2_WLAN_PROFILE_DATA_EVENTID:
6017                 ath10k_wmi_event_wlan_profile_data(ar, skb);
6018                 break;
6019         case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID:
6020                 ath10k_wmi_event_rtt_measurement_report(ar, skb);
6021                 break;
6022         case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID:
6023                 ath10k_wmi_event_tsf_measurement_report(ar, skb);
6024                 break;
6025         case WMI_10_2_RTT_ERROR_REPORT_EVENTID:
6026                 ath10k_wmi_event_rtt_error_report(ar, skb);
6027                 break;
6028         case WMI_10_2_WOW_WAKEUP_HOST_EVENTID:
6029                 ath10k_wmi_event_wow_wakeup_host(ar, skb);
6030                 break;
6031         case WMI_10_2_DCS_INTERFERENCE_EVENTID:
6032                 ath10k_wmi_event_dcs_interference(ar, skb);
6033                 break;
6034         case WMI_10_2_PDEV_TPC_CONFIG_EVENTID:
6035                 ath10k_wmi_event_pdev_tpc_config(ar, skb);
6036                 break;
6037         case WMI_10_2_INST_RSSI_STATS_EVENTID:
6038                 ath10k_wmi_event_inst_rssi_stats(ar, skb);
6039                 break;
6040         case WMI_10_2_VDEV_STANDBY_REQ_EVENTID:
6041                 ath10k_wmi_event_vdev_standby_req(ar, skb);
6042                 ath10k_wmi_queue_set_coverage_class_work(ar);
6043                 break;
6044         case WMI_10_2_VDEV_RESUME_REQ_EVENTID:
6045                 ath10k_wmi_event_vdev_resume_req(ar, skb);
6046                 ath10k_wmi_queue_set_coverage_class_work(ar);
6047                 break;
6048         case WMI_10_2_SERVICE_READY_EVENTID:
6049                 ath10k_wmi_event_service_ready(ar, skb);
6050                 return;
6051         case WMI_10_2_READY_EVENTID:
6052                 ath10k_wmi_event_ready(ar, skb);
6053                 ath10k_wmi_queue_set_coverage_class_work(ar);
6054                 break;
6055         case WMI_10_2_PDEV_TEMPERATURE_EVENTID:
6056                 ath10k_wmi_event_temperature(ar, skb);
6057                 break;
6058         case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID:
6059                 ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
6060                 break;
6061         case WMI_10_2_RTT_KEEPALIVE_EVENTID:
6062         case WMI_10_2_GPIO_INPUT_EVENTID:
6063         case WMI_10_2_PEER_RATECODE_LIST_EVENTID:
6064         case WMI_10_2_GENERIC_BUFFER_EVENTID:
6065         case WMI_10_2_MCAST_BUF_RELEASE_EVENTID:
6066         case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID:
6067         case WMI_10_2_WDS_PEER_EVENTID:
6068                 ath10k_dbg(ar, ATH10K_DBG_WMI,
6069                            "received event id %d not implemented\n", id);
6070                 break;
6071         case WMI_10_2_PEER_STA_PS_STATECHG_EVENTID:
6072                 ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb);
6073                 break;
6074         default:
6075                 ath10k_warn(ar, "Unknown eventid: %d\n", id);
6076                 break;
6077         }
6078
6079 out:
6080         dev_kfree_skb(skb);
6081 }
6082
6083 static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
6084 {
6085         struct wmi_cmd_hdr *cmd_hdr;
6086         enum wmi_10_4_event_id id;
6087         bool consumed;
6088
6089         cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
6090         id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
6091
6092         if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr)))
6093                 goto out;
6094
6095         trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
6096
6097         consumed = ath10k_tm_event_wmi(ar, id, skb);
6098
6099         /* Ready event must be handled normally also in UTF mode so that we
6100          * know the UTF firmware has booted, others we are just bypass WMI
6101          * events to testmode.
6102          */
6103         if (consumed && id != WMI_10_4_READY_EVENTID) {
6104                 ath10k_dbg(ar, ATH10K_DBG_WMI,
6105                            "wmi testmode consumed 0x%x\n", id);
6106                 goto out;
6107         }
6108
6109         switch (id) {
6110         case WMI_10_4_MGMT_RX_EVENTID:
6111                 ath10k_wmi_event_mgmt_rx(ar, skb);
6112                 /* mgmt_rx() owns the skb now! */
6113                 return;
6114         case WMI_10_4_ECHO_EVENTID:
6115                 ath10k_wmi_event_echo(ar, skb);
6116                 break;
6117         case WMI_10_4_DEBUG_MESG_EVENTID:
6118                 ath10k_wmi_event_debug_mesg(ar, skb);
6119                 ath10k_wmi_queue_set_coverage_class_work(ar);
6120                 break;
6121         case WMI_10_4_SERVICE_READY_EVENTID:
6122                 ath10k_wmi_event_service_ready(ar, skb);
6123                 return;
6124         case WMI_10_4_SCAN_EVENTID:
6125                 ath10k_wmi_event_scan(ar, skb);
6126                 ath10k_wmi_queue_set_coverage_class_work(ar);
6127                 break;
6128         case WMI_10_4_CHAN_INFO_EVENTID:
6129                 ath10k_wmi_event_chan_info(ar, skb);
6130                 break;
6131         case WMI_10_4_PHYERR_EVENTID:
6132                 ath10k_wmi_event_phyerr(ar, skb);
6133                 break;
6134         case WMI_10_4_READY_EVENTID:
6135                 ath10k_wmi_event_ready(ar, skb);
6136                 ath10k_wmi_queue_set_coverage_class_work(ar);
6137                 break;
6138         case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
6139                 ath10k_wmi_event_peer_sta_kickout(ar, skb);
6140                 break;
6141         case WMI_10_4_ROAM_EVENTID:
6142                 ath10k_wmi_event_roam(ar, skb);
6143                 ath10k_wmi_queue_set_coverage_class_work(ar);
6144                 break;
6145         case WMI_10_4_HOST_SWBA_EVENTID:
6146                 ath10k_wmi_event_host_swba(ar, skb);
6147                 break;
6148         case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID:
6149                 ath10k_wmi_event_tbttoffset_update(ar, skb);
6150                 break;
6151         case WMI_10_4_DEBUG_PRINT_EVENTID:
6152                 ath10k_wmi_event_debug_print(ar, skb);
6153                 ath10k_wmi_queue_set_coverage_class_work(ar);
6154                 break;
6155         case WMI_10_4_VDEV_START_RESP_EVENTID:
6156                 ath10k_wmi_event_vdev_start_resp(ar, skb);
6157                 ath10k_wmi_queue_set_coverage_class_work(ar);
6158                 break;
6159         case WMI_10_4_VDEV_STOPPED_EVENTID:
6160                 ath10k_wmi_event_vdev_stopped(ar, skb);
6161                 ath10k_wmi_queue_set_coverage_class_work(ar);
6162                 break;
6163         case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
6164         case WMI_10_4_PEER_RATECODE_LIST_EVENTID:
6165         case WMI_10_4_WDS_PEER_EVENTID:
6166         case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID:
6167                 ath10k_dbg(ar, ATH10K_DBG_WMI,
6168                            "received event id %d not implemented\n", id);
6169                 break;
6170         case WMI_10_4_UPDATE_STATS_EVENTID:
6171                 ath10k_wmi_event_update_stats(ar, skb);
6172                 break;
6173         case WMI_10_4_PDEV_TEMPERATURE_EVENTID:
6174                 ath10k_wmi_event_temperature(ar, skb);
6175                 break;
6176         case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID:
6177                 ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
6178                 break;
6179         case WMI_10_4_PDEV_TPC_CONFIG_EVENTID:
6180                 ath10k_wmi_event_pdev_tpc_config(ar, skb);
6181                 break;
6182         case WMI_10_4_TDLS_PEER_EVENTID:
6183                 ath10k_wmi_handle_tdls_peer_event(ar, skb);
6184                 break;
6185         case WMI_10_4_PDEV_TPC_TABLE_EVENTID:
6186                 ath10k_wmi_event_tpc_final_table(ar, skb);
6187                 break;
6188         case WMI_10_4_DFS_STATUS_CHECK_EVENTID:
6189                 ath10k_wmi_event_dfs_status_check(ar, skb);
6190                 break;
6191         case WMI_10_4_PEER_STA_PS_STATECHG_EVENTID:
6192                 ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb);
6193                 break;
6194         default:
6195                 ath10k_warn(ar, "Unknown eventid: %d\n", id);
6196                 break;
6197         }
6198
6199 out:
6200         dev_kfree_skb(skb);
6201 }
6202
6203 static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
6204 {
6205         int ret;
6206
6207         ret = ath10k_wmi_rx(ar, skb);
6208         if (ret)
6209                 ath10k_warn(ar, "failed to process wmi rx: %d\n", ret);
6210 }
6211
6212 int ath10k_wmi_connect(struct ath10k *ar)
6213 {
6214         int status;
6215         struct ath10k_htc_svc_conn_req conn_req;
6216         struct ath10k_htc_svc_conn_resp conn_resp;
6217
6218         memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
6219
6220         memset(&conn_req, 0, sizeof(conn_req));
6221         memset(&conn_resp, 0, sizeof(conn_resp));
6222
6223         /* these fields are the same for all service endpoints */
6224         conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
6225         conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
6226         conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;
6227
6228         /* connect to control service */
6229         conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;
6230
6231         status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
6232         if (status) {
6233                 ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n",
6234                             status);
6235                 return status;
6236         }
6237
6238         ar->wmi.eid = conn_resp.eid;
6239         return 0;
6240 }
6241
6242 static struct sk_buff *
6243 ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
6244                               u16 ctl2g, u16 ctl5g,
6245                               enum wmi_dfs_region dfs_reg)
6246 {
6247         struct wmi_pdev_set_regdomain_cmd *cmd;
6248         struct sk_buff *skb;
6249
6250         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6251         if (!skb)
6252                 return ERR_PTR(-ENOMEM);
6253
6254         cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data;
6255         cmd->reg_domain = __cpu_to_le32(rd);
6256         cmd->reg_domain_2G = __cpu_to_le32(rd2g);
6257         cmd->reg_domain_5G = __cpu_to_le32(rd5g);
6258         cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
6259         cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
6260
6261         ath10k_dbg(ar, ATH10K_DBG_WMI,
6262                    "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
6263                    rd, rd2g, rd5g, ctl2g, ctl5g);
6264         return skb;
6265 }
6266
6267 static struct sk_buff *
6268 ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16
6269                                   rd5g, u16 ctl2g, u16 ctl5g,
6270                                   enum wmi_dfs_region dfs_reg)
6271 {
6272         struct wmi_pdev_set_regdomain_cmd_10x *cmd;
6273         struct sk_buff *skb;
6274
6275         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6276         if (!skb)
6277                 return ERR_PTR(-ENOMEM);
6278
6279         cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data;
6280         cmd->reg_domain = __cpu_to_le32(rd);
6281         cmd->reg_domain_2G = __cpu_to_le32(rd2g);
6282         cmd->reg_domain_5G = __cpu_to_le32(rd5g);
6283         cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
6284         cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
6285         cmd->dfs_domain = __cpu_to_le32(dfs_reg);
6286
6287         ath10k_dbg(ar, ATH10K_DBG_WMI,
6288                    "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
6289                    rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
6290         return skb;
6291 }
6292
6293 static struct sk_buff *
6294 ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt)
6295 {
6296         struct wmi_pdev_suspend_cmd *cmd;
6297         struct sk_buff *skb;
6298
6299         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6300         if (!skb)
6301                 return ERR_PTR(-ENOMEM);
6302
6303         cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
6304         cmd->suspend_opt = __cpu_to_le32(suspend_opt);
6305
6306         return skb;
6307 }
6308
6309 static struct sk_buff *
6310 ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar)
6311 {
6312         struct sk_buff *skb;
6313
6314         skb = ath10k_wmi_alloc_skb(ar, 0);
6315         if (!skb)
6316                 return ERR_PTR(-ENOMEM);
6317
6318         return skb;
6319 }
6320
6321 static struct sk_buff *
6322 ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
6323 {
6324         struct wmi_pdev_set_param_cmd *cmd;
6325         struct sk_buff *skb;
6326
6327         if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
6328                 ath10k_warn(ar, "pdev param %d not supported by firmware\n",
6329                             id);
6330                 return ERR_PTR(-EOPNOTSUPP);
6331         }
6332
6333         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6334         if (!skb)
6335                 return ERR_PTR(-ENOMEM);
6336
6337         cmd = (struct wmi_pdev_set_param_cmd *)skb->data;
6338         cmd->param_id    = __cpu_to_le32(id);
6339         cmd->param_value = __cpu_to_le32(value);
6340
6341         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
6342                    id, value);
6343         return skb;
6344 }
6345
6346 void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
6347                                     struct wmi_host_mem_chunks *chunks)
6348 {
6349         struct host_memory_chunk *chunk;
6350         int i;
6351
6352         chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks);
6353
6354         for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
6355                 chunk = &chunks->items[i];
6356                 chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
6357                 chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len);
6358                 chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
6359
6360                 ath10k_dbg(ar, ATH10K_DBG_WMI,
6361                            "wmi chunk %d len %d requested, addr 0x%llx\n",
6362                            i,
6363                            ar->wmi.mem_chunks[i].len,
6364                            (unsigned long long)ar->wmi.mem_chunks[i].paddr);
6365         }
6366 }
6367
6368 static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar)
6369 {
6370         struct wmi_init_cmd *cmd;
6371         struct sk_buff *buf;
6372         struct wmi_resource_config config = {};
6373         u32 len, val;
6374
6375         config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
6376         config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS);
6377         config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS);
6378
6379         config.num_offload_reorder_bufs =
6380                 __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS);
6381
6382         config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS);
6383         config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS);
6384         config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT);
6385         config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK);
6386         config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK);
6387         config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
6388         config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
6389         config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
6390         config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI);
6391         config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6392         config.scan_max_pending_reqs =
6393                 __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS);
6394
6395         config.bmiss_offload_max_vdev =
6396                 __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV);
6397
6398         config.roam_offload_max_vdev =
6399                 __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV);
6400
6401         config.roam_offload_max_ap_profiles =
6402                 __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES);
6403
6404         config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS);
6405         config.num_mcast_table_elems =
6406                 __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS);
6407
6408         config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE);
6409         config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE);
6410         config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES);
6411         config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE);
6412         config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM);
6413
6414         val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
6415         config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
6416
6417         config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG);
6418
6419         config.gtk_offload_max_vdev =
6420                 __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV);
6421
6422         config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
6423         config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
6424
6425         len = sizeof(*cmd) +
6426               (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6427
6428         buf = ath10k_wmi_alloc_skb(ar, len);
6429         if (!buf)
6430                 return ERR_PTR(-ENOMEM);
6431
6432         cmd = (struct wmi_init_cmd *)buf->data;
6433
6434         memcpy(&cmd->resource_config, &config, sizeof(config));
6435         ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6436
6437         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
6438         return buf;
6439 }
6440
6441 static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar)
6442 {
6443         struct wmi_init_cmd_10x *cmd;
6444         struct sk_buff *buf;
6445         struct wmi_resource_config_10x config = {};
6446         u32 len, val;
6447
6448         config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
6449         config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
6450         config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
6451         config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
6452         config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
6453         config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
6454         config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
6455         config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6456         config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6457         config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6458         config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
6459         config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6460         config.scan_max_pending_reqs =
6461                 __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
6462
6463         config.bmiss_offload_max_vdev =
6464                 __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
6465
6466         config.roam_offload_max_vdev =
6467                 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
6468
6469         config.roam_offload_max_ap_profiles =
6470                 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
6471
6472         config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
6473         config.num_mcast_table_elems =
6474                 __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
6475
6476         config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
6477         config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
6478         config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
6479         config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE);
6480         config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
6481
6482         val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
6483         config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
6484
6485         config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
6486
6487         config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
6488         config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
6489
6490         len = sizeof(*cmd) +
6491               (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6492
6493         buf = ath10k_wmi_alloc_skb(ar, len);
6494         if (!buf)
6495                 return ERR_PTR(-ENOMEM);
6496
6497         cmd = (struct wmi_init_cmd_10x *)buf->data;
6498
6499         memcpy(&cmd->resource_config, &config, sizeof(config));
6500         ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6501
6502         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
6503         return buf;
6504 }
6505
6506 static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
6507 {
6508         struct wmi_init_cmd_10_2 *cmd;
6509         struct sk_buff *buf;
6510         struct wmi_resource_config_10x config = {};
6511         u32 len, val, features;
6512
6513         config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
6514         config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
6515
6516         if (ath10k_peer_stats_enabled(ar)) {
6517                 config.num_peers = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_PEERS);
6518                 config.num_tids = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_TIDS);
6519         } else {
6520                 config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
6521                 config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
6522         }
6523
6524         config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
6525         config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
6526         config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
6527         config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6528         config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6529         config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6530         config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
6531         config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6532
6533         config.scan_max_pending_reqs =
6534                 __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
6535
6536         config.bmiss_offload_max_vdev =
6537                 __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
6538
6539         config.roam_offload_max_vdev =
6540                 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
6541
6542         config.roam_offload_max_ap_profiles =
6543                 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
6544
6545         config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
6546         config.num_mcast_table_elems =
6547                 __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
6548
6549         config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
6550         config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
6551         config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
6552         config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE);
6553         config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
6554
6555         val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
6556         config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
6557
6558         config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
6559
6560         config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
6561         config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
6562
6563         len = sizeof(*cmd) +
6564               (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6565
6566         buf = ath10k_wmi_alloc_skb(ar, len);
6567         if (!buf)
6568                 return ERR_PTR(-ENOMEM);
6569
6570         cmd = (struct wmi_init_cmd_10_2 *)buf->data;
6571
6572         features = WMI_10_2_RX_BATCH_MODE;
6573
6574         if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) &&
6575             test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
6576                 features |= WMI_10_2_COEX_GPIO;
6577
6578         if (ath10k_peer_stats_enabled(ar))
6579                 features |= WMI_10_2_PEER_STATS;
6580
6581         if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map))
6582                 features |= WMI_10_2_BSS_CHAN_INFO;
6583
6584         cmd->resource_config.feature_mask = __cpu_to_le32(features);
6585
6586         memcpy(&cmd->resource_config.common, &config, sizeof(config));
6587         ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6588
6589         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
6590         return buf;
6591 }
6592
6593 static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
6594 {
6595         struct wmi_init_cmd_10_4 *cmd;
6596         struct sk_buff *buf;
6597         struct wmi_resource_config_10_4 config = {};
6598         u32 len;
6599
6600         config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
6601         config.num_peers = __cpu_to_le32(ar->max_num_peers);
6602         config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
6603         config.num_tids = __cpu_to_le32(ar->num_tids);
6604
6605         config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS);
6606         config.num_offload_reorder_buffs =
6607                         __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS);
6608         config.num_peer_keys  = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS);
6609         config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT);
6610         config.tx_chain_mask  = __cpu_to_le32(ar->hw_params.tx_chain_mask);
6611         config.rx_chain_mask  = __cpu_to_le32(ar->hw_params.rx_chain_mask);
6612
6613         config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6614         config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6615         config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6616         config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI);
6617
6618         config.rx_decap_mode        = __cpu_to_le32(ar->wmi.rx_decap_mode);
6619         config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS);
6620         config.bmiss_offload_max_vdev =
6621                         __cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV);
6622         config.roam_offload_max_vdev  =
6623                         __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV);
6624         config.roam_offload_max_ap_profiles =
6625                         __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES);
6626         config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS);
6627         config.num_mcast_table_elems =
6628                         __cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS);
6629
6630         config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE);
6631         config.tx_dbg_log_size  = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE);
6632         config.num_wds_entries  = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES);
6633         config.dma_burst_size   = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE);
6634         config.mac_aggr_delim   = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM);
6635
6636         config.rx_skip_defrag_timeout_dup_detection_check =
6637           __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK);
6638
6639         config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG);
6640         config.gtk_offload_max_vdev =
6641                         __cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV);
6642         config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx);
6643         config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS);
6644         config.max_peer_ext_stats =
6645                         __cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS);
6646         config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP);
6647
6648         config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE);
6649         config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE);
6650         config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE);
6651         config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE);
6652
6653         config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE);
6654         config.tt_support =
6655                         __cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG);
6656         config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG);
6657         config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG);
6658         config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG);
6659
6660         len = sizeof(*cmd) +
6661               (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6662
6663         buf = ath10k_wmi_alloc_skb(ar, len);
6664         if (!buf)
6665                 return ERR_PTR(-ENOMEM);
6666
6667         cmd = (struct wmi_init_cmd_10_4 *)buf->data;
6668         memcpy(&cmd->resource_config, &config, sizeof(config));
6669         ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6670
6671         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
6672         return buf;
6673 }
6674
6675 int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg)
6676 {
6677         if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN)
6678                 return -EINVAL;
6679         if (arg->n_channels > ARRAY_SIZE(arg->channels))
6680                 return -EINVAL;
6681         if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID)
6682                 return -EINVAL;
6683         if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID)
6684                 return -EINVAL;
6685
6686         return 0;
6687 }
6688
6689 static size_t
6690 ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg)
6691 {
6692         int len = 0;
6693
6694         if (arg->ie_len) {
6695                 len += sizeof(struct wmi_ie_data);
6696                 len += roundup(arg->ie_len, 4);
6697         }
6698
6699         if (arg->n_channels) {
6700                 len += sizeof(struct wmi_chan_list);
6701                 len += sizeof(__le32) * arg->n_channels;
6702         }
6703
6704         if (arg->n_ssids) {
6705                 len += sizeof(struct wmi_ssid_list);
6706                 len += sizeof(struct wmi_ssid) * arg->n_ssids;
6707         }
6708
6709         if (arg->n_bssids) {
6710                 len += sizeof(struct wmi_bssid_list);
6711                 len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
6712         }
6713
6714         return len;
6715 }
6716
6717 void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn,
6718                                       const struct wmi_start_scan_arg *arg)
6719 {
6720         u32 scan_id;
6721         u32 scan_req_id;
6722
6723         scan_id  = WMI_HOST_SCAN_REQ_ID_PREFIX;
6724         scan_id |= arg->scan_id;
6725
6726         scan_req_id  = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
6727         scan_req_id |= arg->scan_req_id;
6728
6729         cmn->scan_id            = __cpu_to_le32(scan_id);
6730         cmn->scan_req_id        = __cpu_to_le32(scan_req_id);
6731         cmn->vdev_id            = __cpu_to_le32(arg->vdev_id);
6732         cmn->scan_priority      = __cpu_to_le32(arg->scan_priority);
6733         cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events);
6734         cmn->dwell_time_active  = __cpu_to_le32(arg->dwell_time_active);
6735         cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive);
6736         cmn->min_rest_time      = __cpu_to_le32(arg->min_rest_time);
6737         cmn->max_rest_time      = __cpu_to_le32(arg->max_rest_time);
6738         cmn->repeat_probe_time  = __cpu_to_le32(arg->repeat_probe_time);
6739         cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time);
6740         cmn->idle_time          = __cpu_to_le32(arg->idle_time);
6741         cmn->max_scan_time      = __cpu_to_le32(arg->max_scan_time);
6742         cmn->probe_delay        = __cpu_to_le32(arg->probe_delay);
6743         cmn->scan_ctrl_flags    = __cpu_to_le32(arg->scan_ctrl_flags);
6744 }
6745
6746 static void
6747 ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs,
6748                                const struct wmi_start_scan_arg *arg)
6749 {
6750         struct wmi_ie_data *ie;
6751         struct wmi_chan_list *channels;
6752         struct wmi_ssid_list *ssids;
6753         struct wmi_bssid_list *bssids;
6754         void *ptr = tlvs->tlvs;
6755         int i;
6756
6757         if (arg->n_channels) {
6758                 channels = ptr;
6759                 channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG);
6760                 channels->num_chan = __cpu_to_le32(arg->n_channels);
6761
6762                 for (i = 0; i < arg->n_channels; i++)
6763                         channels->channel_list[i].freq =
6764                                 __cpu_to_le16(arg->channels[i]);
6765
6766                 ptr += sizeof(*channels);
6767                 ptr += sizeof(__le32) * arg->n_channels;
6768         }
6769
6770         if (arg->n_ssids) {
6771                 ssids = ptr;
6772                 ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG);
6773                 ssids->num_ssids = __cpu_to_le32(arg->n_ssids);
6774
6775                 for (i = 0; i < arg->n_ssids; i++) {
6776                         ssids->ssids[i].ssid_len =
6777                                 __cpu_to_le32(arg->ssids[i].len);
6778                         memcpy(&ssids->ssids[i].ssid,
6779                                arg->ssids[i].ssid,
6780                                arg->ssids[i].len);
6781                 }
6782
6783                 ptr += sizeof(*ssids);
6784                 ptr += sizeof(struct wmi_ssid) * arg->n_ssids;
6785         }
6786
6787         if (arg->n_bssids) {
6788                 bssids = ptr;
6789                 bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG);
6790                 bssids->num_bssid = __cpu_to_le32(arg->n_bssids);
6791
6792                 for (i = 0; i < arg->n_bssids; i++)
6793                         ether_addr_copy(bssids->bssid_list[i].addr,
6794                                         arg->bssids[i].bssid);
6795
6796                 ptr += sizeof(*bssids);
6797                 ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids;
6798         }
6799
6800         if (arg->ie_len) {
6801                 ie = ptr;
6802                 ie->tag = __cpu_to_le32(WMI_IE_TAG);
6803                 ie->ie_len = __cpu_to_le32(arg->ie_len);
6804                 memcpy(ie->ie_data, arg->ie, arg->ie_len);
6805
6806                 ptr += sizeof(*ie);
6807                 ptr += roundup(arg->ie_len, 4);
6808         }
6809 }
6810
6811 static struct sk_buff *
6812 ath10k_wmi_op_gen_start_scan(struct ath10k *ar,
6813                              const struct wmi_start_scan_arg *arg)
6814 {
6815         struct wmi_start_scan_cmd *cmd;
6816         struct sk_buff *skb;
6817         size_t len;
6818         int ret;
6819
6820         ret = ath10k_wmi_start_scan_verify(arg);
6821         if (ret)
6822                 return ERR_PTR(ret);
6823
6824         len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6825         skb = ath10k_wmi_alloc_skb(ar, len);
6826         if (!skb)
6827                 return ERR_PTR(-ENOMEM);
6828
6829         cmd = (struct wmi_start_scan_cmd *)skb->data;
6830
6831         ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6832         ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6833
6834         cmd->burst_duration_ms = __cpu_to_le32(0);
6835
6836         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
6837         return skb;
6838 }
6839
6840 static struct sk_buff *
6841 ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar,
6842                                  const struct wmi_start_scan_arg *arg)
6843 {
6844         struct wmi_10x_start_scan_cmd *cmd;
6845         struct sk_buff *skb;
6846         size_t len;
6847         int ret;
6848
6849         ret = ath10k_wmi_start_scan_verify(arg);
6850         if (ret)
6851                 return ERR_PTR(ret);
6852
6853         len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6854         skb = ath10k_wmi_alloc_skb(ar, len);
6855         if (!skb)
6856                 return ERR_PTR(-ENOMEM);
6857
6858         cmd = (struct wmi_10x_start_scan_cmd *)skb->data;
6859
6860         ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6861         ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6862
6863         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
6864         return skb;
6865 }
6866
6867 void ath10k_wmi_start_scan_init(struct ath10k *ar,
6868                                 struct wmi_start_scan_arg *arg)
6869 {
6870         /* setup commonly used values */
6871         arg->scan_req_id = 1;
6872         arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
6873         arg->dwell_time_active = 50;
6874         arg->dwell_time_passive = 150;
6875         arg->min_rest_time = 50;
6876         arg->max_rest_time = 500;
6877         arg->repeat_probe_time = 0;
6878         arg->probe_spacing_time = 0;
6879         arg->idle_time = 0;
6880         arg->max_scan_time = 20000;
6881         arg->probe_delay = 5;
6882         arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
6883                 | WMI_SCAN_EVENT_COMPLETED
6884                 | WMI_SCAN_EVENT_BSS_CHANNEL
6885                 | WMI_SCAN_EVENT_FOREIGN_CHANNEL
6886                 | WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT
6887                 | WMI_SCAN_EVENT_DEQUEUED;
6888         arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
6889         arg->n_bssids = 1;
6890         arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF";
6891 }
6892
6893 static struct sk_buff *
6894 ath10k_wmi_op_gen_stop_scan(struct ath10k *ar,
6895                             const struct wmi_stop_scan_arg *arg)
6896 {
6897         struct wmi_stop_scan_cmd *cmd;
6898         struct sk_buff *skb;
6899         u32 scan_id;
6900         u32 req_id;
6901
6902         if (arg->req_id > 0xFFF)
6903                 return ERR_PTR(-EINVAL);
6904         if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF)
6905                 return ERR_PTR(-EINVAL);
6906
6907         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6908         if (!skb)
6909                 return ERR_PTR(-ENOMEM);
6910
6911         scan_id = arg->u.scan_id;
6912         scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;
6913
6914         req_id = arg->req_id;
6915         req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
6916
6917         cmd = (struct wmi_stop_scan_cmd *)skb->data;
6918         cmd->req_type    = __cpu_to_le32(arg->req_type);
6919         cmd->vdev_id     = __cpu_to_le32(arg->u.vdev_id);
6920         cmd->scan_id     = __cpu_to_le32(scan_id);
6921         cmd->scan_req_id = __cpu_to_le32(req_id);
6922
6923         ath10k_dbg(ar, ATH10K_DBG_WMI,
6924                    "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
6925                    arg->req_id, arg->req_type, arg->u.scan_id);
6926         return skb;
6927 }
6928
6929 static struct sk_buff *
6930 ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id,
6931                               enum wmi_vdev_type type,
6932                               enum wmi_vdev_subtype subtype,
6933                               const u8 macaddr[ETH_ALEN])
6934 {
6935         struct wmi_vdev_create_cmd *cmd;
6936         struct sk_buff *skb;
6937
6938         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6939         if (!skb)
6940                 return ERR_PTR(-ENOMEM);
6941
6942         cmd = (struct wmi_vdev_create_cmd *)skb->data;
6943         cmd->vdev_id      = __cpu_to_le32(vdev_id);
6944         cmd->vdev_type    = __cpu_to_le32(type);
6945         cmd->vdev_subtype = __cpu_to_le32(subtype);
6946         ether_addr_copy(cmd->vdev_macaddr.addr, macaddr);
6947
6948         ath10k_dbg(ar, ATH10K_DBG_WMI,
6949                    "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
6950                    vdev_id, type, subtype, macaddr);
6951         return skb;
6952 }
6953
6954 static struct sk_buff *
6955 ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id)
6956 {
6957         struct wmi_vdev_delete_cmd *cmd;
6958         struct sk_buff *skb;
6959
6960         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6961         if (!skb)
6962                 return ERR_PTR(-ENOMEM);
6963
6964         cmd = (struct wmi_vdev_delete_cmd *)skb->data;
6965         cmd->vdev_id = __cpu_to_le32(vdev_id);
6966
6967         ath10k_dbg(ar, ATH10K_DBG_WMI,
6968                    "WMI vdev delete id %d\n", vdev_id);
6969         return skb;
6970 }
6971
6972 static struct sk_buff *
6973 ath10k_wmi_op_gen_vdev_start(struct ath10k *ar,
6974                              const struct wmi_vdev_start_request_arg *arg,
6975                              bool restart)
6976 {
6977         struct wmi_vdev_start_request_cmd *cmd;
6978         struct sk_buff *skb;
6979         const char *cmdname;
6980         u32 flags = 0;
6981
6982         if (WARN_ON(arg->hidden_ssid && !arg->ssid))
6983                 return ERR_PTR(-EINVAL);
6984         if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
6985                 return ERR_PTR(-EINVAL);
6986
6987         if (restart)
6988                 cmdname = "restart";
6989         else
6990                 cmdname = "start";
6991
6992         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6993         if (!skb)
6994                 return ERR_PTR(-ENOMEM);
6995
6996         if (arg->hidden_ssid)
6997                 flags |= WMI_VDEV_START_HIDDEN_SSID;
6998         if (arg->pmf_enabled)
6999                 flags |= WMI_VDEV_START_PMF_ENABLED;
7000
7001         cmd = (struct wmi_vdev_start_request_cmd *)skb->data;
7002         cmd->vdev_id         = __cpu_to_le32(arg->vdev_id);
7003         cmd->disable_hw_ack  = __cpu_to_le32(arg->disable_hw_ack);
7004         cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval);
7005         cmd->dtim_period     = __cpu_to_le32(arg->dtim_period);
7006         cmd->flags           = __cpu_to_le32(flags);
7007         cmd->bcn_tx_rate     = __cpu_to_le32(arg->bcn_tx_rate);
7008         cmd->bcn_tx_power    = __cpu_to_le32(arg->bcn_tx_power);
7009
7010         if (arg->ssid) {
7011                 cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len);
7012                 memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
7013         }
7014
7015         ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel);
7016
7017         ath10k_dbg(ar, ATH10K_DBG_WMI,
7018                    "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
7019                    cmdname, arg->vdev_id,
7020                    flags, arg->channel.freq, arg->channel.mode,
7021                    cmd->chan.flags, arg->channel.max_power);
7022
7023         return skb;
7024 }
7025
7026 static struct sk_buff *
7027 ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id)
7028 {
7029         struct wmi_vdev_stop_cmd *cmd;
7030         struct sk_buff *skb;
7031
7032         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7033         if (!skb)
7034                 return ERR_PTR(-ENOMEM);
7035
7036         cmd = (struct wmi_vdev_stop_cmd *)skb->data;
7037         cmd->vdev_id = __cpu_to_le32(vdev_id);
7038
7039         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
7040         return skb;
7041 }
7042
7043 static struct sk_buff *
7044 ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid,
7045                           const u8 *bssid)
7046 {
7047         struct wmi_vdev_up_cmd *cmd;
7048         struct sk_buff *skb;
7049
7050         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7051         if (!skb)
7052                 return ERR_PTR(-ENOMEM);
7053
7054         cmd = (struct wmi_vdev_up_cmd *)skb->data;
7055         cmd->vdev_id       = __cpu_to_le32(vdev_id);
7056         cmd->vdev_assoc_id = __cpu_to_le32(aid);
7057         ether_addr_copy(cmd->vdev_bssid.addr, bssid);
7058
7059         ath10k_dbg(ar, ATH10K_DBG_WMI,
7060                    "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
7061                    vdev_id, aid, bssid);
7062         return skb;
7063 }
7064
7065 static struct sk_buff *
7066 ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id)
7067 {
7068         struct wmi_vdev_down_cmd *cmd;
7069         struct sk_buff *skb;
7070
7071         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7072         if (!skb)
7073                 return ERR_PTR(-ENOMEM);
7074
7075         cmd = (struct wmi_vdev_down_cmd *)skb->data;
7076         cmd->vdev_id = __cpu_to_le32(vdev_id);
7077
7078         ath10k_dbg(ar, ATH10K_DBG_WMI,
7079                    "wmi mgmt vdev down id 0x%x\n", vdev_id);
7080         return skb;
7081 }
7082
7083 static struct sk_buff *
7084 ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id,
7085                                  u32 param_id, u32 param_value)
7086 {
7087         struct wmi_vdev_set_param_cmd *cmd;
7088         struct sk_buff *skb;
7089
7090         if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
7091                 ath10k_dbg(ar, ATH10K_DBG_WMI,
7092                            "vdev param %d not supported by firmware\n",
7093                             param_id);
7094                 return ERR_PTR(-EOPNOTSUPP);
7095         }
7096
7097         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7098         if (!skb)
7099                 return ERR_PTR(-ENOMEM);
7100
7101         cmd = (struct wmi_vdev_set_param_cmd *)skb->data;
7102         cmd->vdev_id     = __cpu_to_le32(vdev_id);
7103         cmd->param_id    = __cpu_to_le32(param_id);
7104         cmd->param_value = __cpu_to_le32(param_value);
7105
7106         ath10k_dbg(ar, ATH10K_DBG_WMI,
7107                    "wmi vdev id 0x%x set param %d value %d\n",
7108                    vdev_id, param_id, param_value);
7109         return skb;
7110 }
7111
7112 static struct sk_buff *
7113 ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar,
7114                                    const struct wmi_vdev_install_key_arg *arg)
7115 {
7116         struct wmi_vdev_install_key_cmd *cmd;
7117         struct sk_buff *skb;
7118
7119         if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
7120                 return ERR_PTR(-EINVAL);
7121         if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
7122                 return ERR_PTR(-EINVAL);
7123
7124         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
7125         if (!skb)
7126                 return ERR_PTR(-ENOMEM);
7127
7128         cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
7129         cmd->vdev_id       = __cpu_to_le32(arg->vdev_id);
7130         cmd->key_idx       = __cpu_to_le32(arg->key_idx);
7131         cmd->key_flags     = __cpu_to_le32(arg->key_flags);
7132         cmd->key_cipher    = __cpu_to_le32(arg->key_cipher);
7133         cmd->key_len       = __cpu_to_le32(arg->key_len);
7134         cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len);
7135         cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
7136
7137         if (arg->macaddr)
7138                 ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr);
7139         if (arg->key_data)
7140                 memcpy(cmd->key_data, arg->key_data, arg->key_len);
7141
7142         ath10k_dbg(ar, ATH10K_DBG_WMI,
7143                    "wmi vdev install key idx %d cipher %d len %d\n",
7144                    arg->key_idx, arg->key_cipher, arg->key_len);
7145         return skb;
7146 }
7147
7148 static struct sk_buff *
7149 ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar,
7150                                      const struct wmi_vdev_spectral_conf_arg *arg)
7151 {
7152         struct wmi_vdev_spectral_conf_cmd *cmd;
7153         struct sk_buff *skb;
7154
7155         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7156         if (!skb)
7157                 return ERR_PTR(-ENOMEM);
7158
7159         cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data;
7160         cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
7161         cmd->scan_count = __cpu_to_le32(arg->scan_count);
7162         cmd->scan_period = __cpu_to_le32(arg->scan_period);
7163         cmd->scan_priority = __cpu_to_le32(arg->scan_priority);
7164         cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size);
7165         cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena);
7166         cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena);
7167         cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref);
7168         cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay);
7169         cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr);
7170         cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr);
7171         cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode);
7172         cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode);
7173         cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr);
7174         cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format);
7175         cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode);
7176         cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale);
7177         cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj);
7178         cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask);
7179
7180         return skb;
7181 }
7182
7183 static struct sk_buff *
7184 ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id,
7185                                        u32 trigger, u32 enable)
7186 {
7187         struct wmi_vdev_spectral_enable_cmd *cmd;
7188         struct sk_buff *skb;
7189
7190         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7191         if (!skb)
7192                 return ERR_PTR(-ENOMEM);
7193
7194         cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data;
7195         cmd->vdev_id = __cpu_to_le32(vdev_id);
7196         cmd->trigger_cmd = __cpu_to_le32(trigger);
7197         cmd->enable_cmd = __cpu_to_le32(enable);
7198
7199         return skb;
7200 }
7201
7202 static struct sk_buff *
7203 ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
7204                               const u8 peer_addr[ETH_ALEN],
7205                               enum wmi_peer_type peer_type)
7206 {
7207         struct wmi_peer_create_cmd *cmd;
7208         struct sk_buff *skb;
7209
7210         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7211         if (!skb)
7212                 return ERR_PTR(-ENOMEM);
7213
7214         cmd = (struct wmi_peer_create_cmd *)skb->data;
7215         cmd->vdev_id = __cpu_to_le32(vdev_id);
7216         ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
7217         cmd->peer_type = __cpu_to_le32(peer_type);
7218
7219         ath10k_dbg(ar, ATH10K_DBG_WMI,
7220                    "wmi peer create vdev_id %d peer_addr %pM\n",
7221                    vdev_id, peer_addr);
7222         return skb;
7223 }
7224
7225 static struct sk_buff *
7226 ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id,
7227                               const u8 peer_addr[ETH_ALEN])
7228 {
7229         struct wmi_peer_delete_cmd *cmd;
7230         struct sk_buff *skb;
7231
7232         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7233         if (!skb)
7234                 return ERR_PTR(-ENOMEM);
7235
7236         cmd = (struct wmi_peer_delete_cmd *)skb->data;
7237         cmd->vdev_id = __cpu_to_le32(vdev_id);
7238         ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
7239
7240         ath10k_dbg(ar, ATH10K_DBG_WMI,
7241                    "wmi peer delete vdev_id %d peer_addr %pM\n",
7242                    vdev_id, peer_addr);
7243         return skb;
7244 }
7245
7246 static struct sk_buff *
7247 ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id,
7248                              const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
7249 {
7250         struct wmi_peer_flush_tids_cmd *cmd;
7251         struct sk_buff *skb;
7252
7253         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7254         if (!skb)
7255                 return ERR_PTR(-ENOMEM);
7256
7257         cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
7258         cmd->vdev_id         = __cpu_to_le32(vdev_id);
7259         cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
7260         ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
7261
7262         ath10k_dbg(ar, ATH10K_DBG_WMI,
7263                    "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
7264                    vdev_id, peer_addr, tid_bitmap);
7265         return skb;
7266 }
7267
7268 static struct sk_buff *
7269 ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id,
7270                                  const u8 *peer_addr,
7271                                  enum wmi_peer_param param_id,
7272                                  u32 param_value)
7273 {
7274         struct wmi_peer_set_param_cmd *cmd;
7275         struct sk_buff *skb;
7276
7277         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7278         if (!skb)
7279                 return ERR_PTR(-ENOMEM);
7280
7281         cmd = (struct wmi_peer_set_param_cmd *)skb->data;
7282         cmd->vdev_id     = __cpu_to_le32(vdev_id);
7283         cmd->param_id    = __cpu_to_le32(param_id);
7284         cmd->param_value = __cpu_to_le32(param_value);
7285         ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
7286
7287         ath10k_dbg(ar, ATH10K_DBG_WMI,
7288                    "wmi vdev %d peer 0x%pM set param %d value %d\n",
7289                    vdev_id, peer_addr, param_id, param_value);
7290         return skb;
7291 }
7292
7293 static struct sk_buff *
7294 ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
7295                              enum wmi_sta_ps_mode psmode)
7296 {
7297         struct wmi_sta_powersave_mode_cmd *cmd;
7298         struct sk_buff *skb;
7299
7300         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7301         if (!skb)
7302                 return ERR_PTR(-ENOMEM);
7303
7304         cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data;
7305         cmd->vdev_id     = __cpu_to_le32(vdev_id);
7306         cmd->sta_ps_mode = __cpu_to_le32(psmode);
7307
7308         ath10k_dbg(ar, ATH10K_DBG_WMI,
7309                    "wmi set powersave id 0x%x mode %d\n",
7310                    vdev_id, psmode);
7311         return skb;
7312 }
7313
7314 static struct sk_buff *
7315 ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id,
7316                              enum wmi_sta_powersave_param param_id,
7317                              u32 value)
7318 {
7319         struct wmi_sta_powersave_param_cmd *cmd;
7320         struct sk_buff *skb;
7321
7322         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7323         if (!skb)
7324                 return ERR_PTR(-ENOMEM);
7325
7326         cmd = (struct wmi_sta_powersave_param_cmd *)skb->data;
7327         cmd->vdev_id     = __cpu_to_le32(vdev_id);
7328         cmd->param_id    = __cpu_to_le32(param_id);
7329         cmd->param_value = __cpu_to_le32(value);
7330
7331         ath10k_dbg(ar, ATH10K_DBG_WMI,
7332                    "wmi sta ps param vdev_id 0x%x param %d value %d\n",
7333                    vdev_id, param_id, value);
7334         return skb;
7335 }
7336
7337 static struct sk_buff *
7338 ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7339                             enum wmi_ap_ps_peer_param param_id, u32 value)
7340 {
7341         struct wmi_ap_ps_peer_cmd *cmd;
7342         struct sk_buff *skb;
7343
7344         if (!mac)
7345                 return ERR_PTR(-EINVAL);
7346
7347         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7348         if (!skb)
7349                 return ERR_PTR(-ENOMEM);
7350
7351         cmd = (struct wmi_ap_ps_peer_cmd *)skb->data;
7352         cmd->vdev_id = __cpu_to_le32(vdev_id);
7353         cmd->param_id = __cpu_to_le32(param_id);
7354         cmd->param_value = __cpu_to_le32(value);
7355         ether_addr_copy(cmd->peer_macaddr.addr, mac);
7356
7357         ath10k_dbg(ar, ATH10K_DBG_WMI,
7358                    "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
7359                    vdev_id, param_id, value, mac);
7360         return skb;
7361 }
7362
7363 static struct sk_buff *
7364 ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar,
7365                                  const struct wmi_scan_chan_list_arg *arg)
7366 {
7367         struct wmi_scan_chan_list_cmd *cmd;
7368         struct sk_buff *skb;
7369         struct wmi_channel_arg *ch;
7370         struct wmi_channel *ci;
7371         int len;
7372         int i;
7373
7374         len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);
7375
7376         skb = ath10k_wmi_alloc_skb(ar, len);
7377         if (!skb)
7378                 return ERR_PTR(-EINVAL);
7379
7380         cmd = (struct wmi_scan_chan_list_cmd *)skb->data;
7381         cmd->num_scan_chans = __cpu_to_le32(arg->n_channels);
7382
7383         for (i = 0; i < arg->n_channels; i++) {
7384                 ch = &arg->channels[i];
7385                 ci = &cmd->chan_info[i];
7386
7387                 ath10k_wmi_put_wmi_channel(ci, ch);
7388         }
7389
7390         return skb;
7391 }
7392
7393 static void
7394 ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
7395                            const struct wmi_peer_assoc_complete_arg *arg)
7396 {
7397         struct wmi_common_peer_assoc_complete_cmd *cmd = buf;
7398
7399         cmd->vdev_id            = __cpu_to_le32(arg->vdev_id);
7400         cmd->peer_new_assoc     = __cpu_to_le32(arg->peer_reassoc ? 0 : 1);
7401         cmd->peer_associd       = __cpu_to_le32(arg->peer_aid);
7402         cmd->peer_flags         = __cpu_to_le32(arg->peer_flags);
7403         cmd->peer_caps          = __cpu_to_le32(arg->peer_caps);
7404         cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval);
7405         cmd->peer_ht_caps       = __cpu_to_le32(arg->peer_ht_caps);
7406         cmd->peer_max_mpdu      = __cpu_to_le32(arg->peer_max_mpdu);
7407         cmd->peer_mpdu_density  = __cpu_to_le32(arg->peer_mpdu_density);
7408         cmd->peer_rate_caps     = __cpu_to_le32(arg->peer_rate_caps);
7409         cmd->peer_nss           = __cpu_to_le32(arg->peer_num_spatial_streams);
7410         cmd->peer_vht_caps      = __cpu_to_le32(arg->peer_vht_caps);
7411         cmd->peer_phymode       = __cpu_to_le32(arg->peer_phymode);
7412
7413         ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
7414
7415         cmd->peer_legacy_rates.num_rates =
7416                 __cpu_to_le32(arg->peer_legacy_rates.num_rates);
7417         memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
7418                arg->peer_legacy_rates.num_rates);
7419
7420         cmd->peer_ht_rates.num_rates =
7421                 __cpu_to_le32(arg->peer_ht_rates.num_rates);
7422         memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
7423                arg->peer_ht_rates.num_rates);
7424
7425         cmd->peer_vht_rates.rx_max_rate =
7426                 __cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
7427         cmd->peer_vht_rates.rx_mcs_set =
7428                 __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
7429         cmd->peer_vht_rates.tx_max_rate =
7430                 __cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
7431         cmd->peer_vht_rates.tx_mcs_set =
7432                 __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
7433 }
7434
7435 static void
7436 ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf,
7437                                 const struct wmi_peer_assoc_complete_arg *arg)
7438 {
7439         struct wmi_main_peer_assoc_complete_cmd *cmd = buf;
7440
7441         ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7442         memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info));
7443 }
7444
7445 static void
7446 ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf,
7447                                 const struct wmi_peer_assoc_complete_arg *arg)
7448 {
7449         ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7450 }
7451
7452 static void
7453 ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf,
7454                                 const struct wmi_peer_assoc_complete_arg *arg)
7455 {
7456         struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf;
7457         int max_mcs, max_nss;
7458         u32 info0;
7459
7460         /* TODO: Is using max values okay with firmware? */
7461         max_mcs = 0xf;
7462         max_nss = 0xf;
7463
7464         info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) |
7465                 SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS);
7466
7467         ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7468         cmd->info0 = __cpu_to_le32(info0);
7469 }
7470
7471 static void
7472 ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf,
7473                                 const struct wmi_peer_assoc_complete_arg *arg)
7474 {
7475         struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf;
7476
7477         ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
7478         if (arg->peer_bw_rxnss_override)
7479                 cmd->peer_bw_rxnss_override =
7480                         __cpu_to_le32((arg->peer_bw_rxnss_override - 1) |
7481                                       BIT(PEER_BW_RXNSS_OVERRIDE_OFFSET));
7482         else
7483                 cmd->peer_bw_rxnss_override = 0;
7484 }
7485
7486 static int
7487 ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg)
7488 {
7489         if (arg->peer_mpdu_density > 16)
7490                 return -EINVAL;
7491         if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES)
7492                 return -EINVAL;
7493         if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES)
7494                 return -EINVAL;
7495
7496         return 0;
7497 }
7498
7499 static struct sk_buff *
7500 ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar,
7501                              const struct wmi_peer_assoc_complete_arg *arg)
7502 {
7503         size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd);
7504         struct sk_buff *skb;
7505         int ret;
7506
7507         ret = ath10k_wmi_peer_assoc_check_arg(arg);
7508         if (ret)
7509                 return ERR_PTR(ret);
7510
7511         skb = ath10k_wmi_alloc_skb(ar, len);
7512         if (!skb)
7513                 return ERR_PTR(-ENOMEM);
7514
7515         ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);
7516
7517         ath10k_dbg(ar, ATH10K_DBG_WMI,
7518                    "wmi peer assoc vdev %d addr %pM (%s)\n",
7519                    arg->vdev_id, arg->addr,
7520                    arg->peer_reassoc ? "reassociate" : "new");
7521         return skb;
7522 }
7523
7524 static struct sk_buff *
7525 ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar,
7526                                   const struct wmi_peer_assoc_complete_arg *arg)
7527 {
7528         size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd);
7529         struct sk_buff *skb;
7530         int ret;
7531
7532         ret = ath10k_wmi_peer_assoc_check_arg(arg);
7533         if (ret)
7534                 return ERR_PTR(ret);
7535
7536         skb = ath10k_wmi_alloc_skb(ar, len);
7537         if (!skb)
7538                 return ERR_PTR(-ENOMEM);
7539
7540         ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);
7541
7542         ath10k_dbg(ar, ATH10K_DBG_WMI,
7543                    "wmi peer assoc vdev %d addr %pM (%s)\n",
7544                    arg->vdev_id, arg->addr,
7545                    arg->peer_reassoc ? "reassociate" : "new");
7546         return skb;
7547 }
7548
7549 static struct sk_buff *
7550 ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar,
7551                                   const struct wmi_peer_assoc_complete_arg *arg)
7552 {
7553         size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd);
7554         struct sk_buff *skb;
7555         int ret;
7556
7557         ret = ath10k_wmi_peer_assoc_check_arg(arg);
7558         if (ret)
7559                 return ERR_PTR(ret);
7560
7561         skb = ath10k_wmi_alloc_skb(ar, len);
7562         if (!skb)
7563                 return ERR_PTR(-ENOMEM);
7564
7565         ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);
7566
7567         ath10k_dbg(ar, ATH10K_DBG_WMI,
7568                    "wmi peer assoc vdev %d addr %pM (%s)\n",
7569                    arg->vdev_id, arg->addr,
7570                    arg->peer_reassoc ? "reassociate" : "new");
7571         return skb;
7572 }
7573
7574 static struct sk_buff *
7575 ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar,
7576                                   const struct wmi_peer_assoc_complete_arg *arg)
7577 {
7578         size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd);
7579         struct sk_buff *skb;
7580         int ret;
7581
7582         ret = ath10k_wmi_peer_assoc_check_arg(arg);
7583         if (ret)
7584                 return ERR_PTR(ret);
7585
7586         skb = ath10k_wmi_alloc_skb(ar, len);
7587         if (!skb)
7588                 return ERR_PTR(-ENOMEM);
7589
7590         ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);
7591
7592         ath10k_dbg(ar, ATH10K_DBG_WMI,
7593                    "wmi peer assoc vdev %d addr %pM (%s)\n",
7594                    arg->vdev_id, arg->addr,
7595                    arg->peer_reassoc ? "reassociate" : "new");
7596         return skb;
7597 }
7598
7599 static struct sk_buff *
7600 ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
7601 {
7602         struct sk_buff *skb;
7603
7604         skb = ath10k_wmi_alloc_skb(ar, 0);
7605         if (!skb)
7606                 return ERR_PTR(-ENOMEM);
7607
7608         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
7609         return skb;
7610 }
7611
7612 static struct sk_buff *
7613 ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar,
7614                                           enum wmi_bss_survey_req_type type)
7615 {
7616         struct wmi_pdev_chan_info_req_cmd *cmd;
7617         struct sk_buff *skb;
7618
7619         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7620         if (!skb)
7621                 return ERR_PTR(-ENOMEM);
7622
7623         cmd = (struct wmi_pdev_chan_info_req_cmd *)skb->data;
7624         cmd->type = __cpu_to_le32(type);
7625
7626         ath10k_dbg(ar, ATH10K_DBG_WMI,
7627                    "wmi pdev bss info request type %d\n", type);
7628
7629         return skb;
7630 }
7631
7632 /* This function assumes the beacon is already DMA mapped */
7633 static struct sk_buff *
7634 ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn,
7635                              size_t bcn_len, u32 bcn_paddr, bool dtim_zero,
7636                              bool deliver_cab)
7637 {
7638         struct wmi_bcn_tx_ref_cmd *cmd;
7639         struct sk_buff *skb;
7640         struct ieee80211_hdr *hdr;
7641         u16 fc;
7642
7643         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7644         if (!skb)
7645                 return ERR_PTR(-ENOMEM);
7646
7647         hdr = (struct ieee80211_hdr *)bcn;
7648         fc = le16_to_cpu(hdr->frame_control);
7649
7650         cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data;
7651         cmd->vdev_id = __cpu_to_le32(vdev_id);
7652         cmd->data_len = __cpu_to_le32(bcn_len);
7653         cmd->data_ptr = __cpu_to_le32(bcn_paddr);
7654         cmd->msdu_id = 0;
7655         cmd->frame_control = __cpu_to_le32(fc);
7656         cmd->flags = 0;
7657         cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA);
7658
7659         if (dtim_zero)
7660                 cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO);
7661
7662         if (deliver_cab)
7663                 cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB);
7664
7665         return skb;
7666 }
7667
7668 void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
7669                               const struct wmi_wmm_params_arg *arg)
7670 {
7671         params->cwmin  = __cpu_to_le32(arg->cwmin);
7672         params->cwmax  = __cpu_to_le32(arg->cwmax);
7673         params->aifs   = __cpu_to_le32(arg->aifs);
7674         params->txop   = __cpu_to_le32(arg->txop);
7675         params->acm    = __cpu_to_le32(arg->acm);
7676         params->no_ack = __cpu_to_le32(arg->no_ack);
7677 }
7678
7679 static struct sk_buff *
7680 ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
7681                                const struct wmi_wmm_params_all_arg *arg)
7682 {
7683         struct wmi_pdev_set_wmm_params *cmd;
7684         struct sk_buff *skb;
7685
7686         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7687         if (!skb)
7688                 return ERR_PTR(-ENOMEM);
7689
7690         cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
7691         ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
7692         ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
7693         ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
7694         ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
7695
7696         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
7697         return skb;
7698 }
7699
7700 static struct sk_buff *
7701 ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
7702 {
7703         struct wmi_request_stats_cmd *cmd;
7704         struct sk_buff *skb;
7705
7706         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7707         if (!skb)
7708                 return ERR_PTR(-ENOMEM);
7709
7710         cmd = (struct wmi_request_stats_cmd *)skb->data;
7711         cmd->stats_id = __cpu_to_le32(stats_mask);
7712
7713         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
7714                    stats_mask);
7715         return skb;
7716 }
7717
7718 static struct sk_buff *
7719 ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
7720                                 enum wmi_force_fw_hang_type type, u32 delay_ms)
7721 {
7722         struct wmi_force_fw_hang_cmd *cmd;
7723         struct sk_buff *skb;
7724
7725         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7726         if (!skb)
7727                 return ERR_PTR(-ENOMEM);
7728
7729         cmd = (struct wmi_force_fw_hang_cmd *)skb->data;
7730         cmd->type = __cpu_to_le32(type);
7731         cmd->delay_ms = __cpu_to_le32(delay_ms);
7732
7733         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
7734                    type, delay_ms);
7735         return skb;
7736 }
7737
7738 static struct sk_buff *
7739 ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7740                              u32 log_level)
7741 {
7742         struct wmi_dbglog_cfg_cmd *cmd;
7743         struct sk_buff *skb;
7744         u32 cfg;
7745
7746         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7747         if (!skb)
7748                 return ERR_PTR(-ENOMEM);
7749
7750         cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
7751
7752         if (module_enable) {
7753                 cfg = SM(log_level,
7754                          ATH10K_DBGLOG_CFG_LOG_LVL);
7755         } else {
7756                 /* set back defaults, all modules with WARN level */
7757                 cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
7758                          ATH10K_DBGLOG_CFG_LOG_LVL);
7759                 module_enable = ~0;
7760         }
7761
7762         cmd->module_enable = __cpu_to_le32(module_enable);
7763         cmd->module_valid = __cpu_to_le32(~0);
7764         cmd->config_enable = __cpu_to_le32(cfg);
7765         cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
7766
7767         ath10k_dbg(ar, ATH10K_DBG_WMI,
7768                    "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
7769                    __le32_to_cpu(cmd->module_enable),
7770                    __le32_to_cpu(cmd->module_valid),
7771                    __le32_to_cpu(cmd->config_enable),
7772                    __le32_to_cpu(cmd->config_valid));
7773         return skb;
7774 }
7775
7776 static struct sk_buff *
7777 ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7778                                   u32 log_level)
7779 {
7780         struct wmi_10_4_dbglog_cfg_cmd *cmd;
7781         struct sk_buff *skb;
7782         u32 cfg;
7783
7784         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7785         if (!skb)
7786                 return ERR_PTR(-ENOMEM);
7787
7788         cmd = (struct wmi_10_4_dbglog_cfg_cmd *)skb->data;
7789
7790         if (module_enable) {
7791                 cfg = SM(log_level,
7792                          ATH10K_DBGLOG_CFG_LOG_LVL);
7793         } else {
7794                 /* set back defaults, all modules with WARN level */
7795                 cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
7796                          ATH10K_DBGLOG_CFG_LOG_LVL);
7797                 module_enable = ~0;
7798         }
7799
7800         cmd->module_enable = __cpu_to_le64(module_enable);
7801         cmd->module_valid = __cpu_to_le64(~0);
7802         cmd->config_enable = __cpu_to_le32(cfg);
7803         cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
7804
7805         ath10k_dbg(ar, ATH10K_DBG_WMI,
7806                    "wmi dbglog cfg modules 0x%016llx 0x%016llx config %08x %08x\n",
7807                    __le64_to_cpu(cmd->module_enable),
7808                    __le64_to_cpu(cmd->module_valid),
7809                    __le32_to_cpu(cmd->config_enable),
7810                    __le32_to_cpu(cmd->config_valid));
7811         return skb;
7812 }
7813
7814 static struct sk_buff *
7815 ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap)
7816 {
7817         struct wmi_pdev_pktlog_enable_cmd *cmd;
7818         struct sk_buff *skb;
7819
7820         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7821         if (!skb)
7822                 return ERR_PTR(-ENOMEM);
7823
7824         ev_bitmap &= ATH10K_PKTLOG_ANY;
7825
7826         cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data;
7827         cmd->ev_bitmap = __cpu_to_le32(ev_bitmap);
7828
7829         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
7830                    ev_bitmap);
7831         return skb;
7832 }
7833
7834 static struct sk_buff *
7835 ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar)
7836 {
7837         struct sk_buff *skb;
7838
7839         skb = ath10k_wmi_alloc_skb(ar, 0);
7840         if (!skb)
7841                 return ERR_PTR(-ENOMEM);
7842
7843         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
7844         return skb;
7845 }
7846
7847 static struct sk_buff *
7848 ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period,
7849                                       u32 duration, u32 next_offset,
7850                                       u32 enabled)
7851 {
7852         struct wmi_pdev_set_quiet_cmd *cmd;
7853         struct sk_buff *skb;
7854
7855         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7856         if (!skb)
7857                 return ERR_PTR(-ENOMEM);
7858
7859         cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data;
7860         cmd->period = __cpu_to_le32(period);
7861         cmd->duration = __cpu_to_le32(duration);
7862         cmd->next_start = __cpu_to_le32(next_offset);
7863         cmd->enabled = __cpu_to_le32(enabled);
7864
7865         ath10k_dbg(ar, ATH10K_DBG_WMI,
7866                    "wmi quiet param: period %u duration %u enabled %d\n",
7867                    period, duration, enabled);
7868         return skb;
7869 }
7870
7871 static struct sk_buff *
7872 ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id,
7873                                    const u8 *mac)
7874 {
7875         struct wmi_addba_clear_resp_cmd *cmd;
7876         struct sk_buff *skb;
7877
7878         if (!mac)
7879                 return ERR_PTR(-EINVAL);
7880
7881         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7882         if (!skb)
7883                 return ERR_PTR(-ENOMEM);
7884
7885         cmd = (struct wmi_addba_clear_resp_cmd *)skb->data;
7886         cmd->vdev_id = __cpu_to_le32(vdev_id);
7887         ether_addr_copy(cmd->peer_macaddr.addr, mac);
7888
7889         ath10k_dbg(ar, ATH10K_DBG_WMI,
7890                    "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n",
7891                    vdev_id, mac);
7892         return skb;
7893 }
7894
7895 static struct sk_buff *
7896 ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7897                              u32 tid, u32 buf_size)
7898 {
7899         struct wmi_addba_send_cmd *cmd;
7900         struct sk_buff *skb;
7901
7902         if (!mac)
7903                 return ERR_PTR(-EINVAL);
7904
7905         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7906         if (!skb)
7907                 return ERR_PTR(-ENOMEM);
7908
7909         cmd = (struct wmi_addba_send_cmd *)skb->data;
7910         cmd->vdev_id = __cpu_to_le32(vdev_id);
7911         ether_addr_copy(cmd->peer_macaddr.addr, mac);
7912         cmd->tid = __cpu_to_le32(tid);
7913         cmd->buffersize = __cpu_to_le32(buf_size);
7914
7915         ath10k_dbg(ar, ATH10K_DBG_WMI,
7916                    "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n",
7917                    vdev_id, mac, tid, buf_size);
7918         return skb;
7919 }
7920
7921 static struct sk_buff *
7922 ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7923                                  u32 tid, u32 status)
7924 {
7925         struct wmi_addba_setresponse_cmd *cmd;
7926         struct sk_buff *skb;
7927
7928         if (!mac)
7929                 return ERR_PTR(-EINVAL);
7930
7931         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7932         if (!skb)
7933                 return ERR_PTR(-ENOMEM);
7934
7935         cmd = (struct wmi_addba_setresponse_cmd *)skb->data;
7936         cmd->vdev_id = __cpu_to_le32(vdev_id);
7937         ether_addr_copy(cmd->peer_macaddr.addr, mac);
7938         cmd->tid = __cpu_to_le32(tid);
7939         cmd->statuscode = __cpu_to_le32(status);
7940
7941         ath10k_dbg(ar, ATH10K_DBG_WMI,
7942                    "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n",
7943                    vdev_id, mac, tid, status);
7944         return skb;
7945 }
7946
7947 static struct sk_buff *
7948 ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7949                              u32 tid, u32 initiator, u32 reason)
7950 {
7951         struct wmi_delba_send_cmd *cmd;
7952         struct sk_buff *skb;
7953
7954         if (!mac)
7955                 return ERR_PTR(-EINVAL);
7956
7957         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7958         if (!skb)
7959                 return ERR_PTR(-ENOMEM);
7960
7961         cmd = (struct wmi_delba_send_cmd *)skb->data;
7962         cmd->vdev_id = __cpu_to_le32(vdev_id);
7963         ether_addr_copy(cmd->peer_macaddr.addr, mac);
7964         cmd->tid = __cpu_to_le32(tid);
7965         cmd->initiator = __cpu_to_le32(initiator);
7966         cmd->reasoncode = __cpu_to_le32(reason);
7967
7968         ath10k_dbg(ar, ATH10K_DBG_WMI,
7969                    "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n",
7970                    vdev_id, mac, tid, initiator, reason);
7971         return skb;
7972 }
7973
7974 static struct sk_buff *
7975 ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param)
7976 {
7977         struct wmi_pdev_get_tpc_config_cmd *cmd;
7978         struct sk_buff *skb;
7979
7980         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7981         if (!skb)
7982                 return ERR_PTR(-ENOMEM);
7983
7984         cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data;
7985         cmd->param = __cpu_to_le32(param);
7986
7987         ath10k_dbg(ar, ATH10K_DBG_WMI,
7988                    "wmi pdev get tpc config param %d\n", param);
7989         return skb;
7990 }
7991
7992 size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head)
7993 {
7994         struct ath10k_fw_stats_peer *i;
7995         size_t num = 0;
7996
7997         list_for_each_entry(i, head, list)
7998                 ++num;
7999
8000         return num;
8001 }
8002
8003 size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head)
8004 {
8005         struct ath10k_fw_stats_vdev *i;
8006         size_t num = 0;
8007
8008         list_for_each_entry(i, head, list)
8009                 ++num;
8010
8011         return num;
8012 }
8013
8014 static void
8015 ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8016                                    char *buf, u32 *length)
8017 {
8018         u32 len = *length;
8019         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8020
8021         len += scnprintf(buf + len, buf_len - len, "\n");
8022         len += scnprintf(buf + len, buf_len - len, "%30s\n",
8023                         "ath10k PDEV stats");
8024         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8025                         "=================");
8026
8027         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8028                         "Channel noise floor", pdev->ch_noise_floor);
8029         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8030                         "Channel TX power", pdev->chan_tx_power);
8031         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8032                         "TX frame count", pdev->tx_frame_count);
8033         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8034                         "RX frame count", pdev->rx_frame_count);
8035         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8036                         "RX clear count", pdev->rx_clear_count);
8037         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8038                         "Cycle count", pdev->cycle_count);
8039         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8040                         "PHY error count", pdev->phy_err_count);
8041
8042         *length = len;
8043 }
8044
8045 static void
8046 ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8047                                     char *buf, u32 *length)
8048 {
8049         u32 len = *length;
8050         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8051
8052         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8053                         "RTS bad count", pdev->rts_bad);
8054         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8055                         "RTS good count", pdev->rts_good);
8056         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8057                         "FCS bad count", pdev->fcs_bad);
8058         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8059                         "No beacon count", pdev->no_beacons);
8060         len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8061                         "MIB int count", pdev->mib_int_count);
8062
8063         len += scnprintf(buf + len, buf_len - len, "\n");
8064         *length = len;
8065 }
8066
8067 static void
8068 ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8069                                  char *buf, u32 *length)
8070 {
8071         u32 len = *length;
8072         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8073
8074         len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
8075                          "ath10k PDEV TX stats");
8076         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8077                                  "=================");
8078
8079         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8080                          "HTT cookies queued", pdev->comp_queued);
8081         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8082                          "HTT cookies disp.", pdev->comp_delivered);
8083         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8084                          "MSDU queued", pdev->msdu_enqued);
8085         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8086                          "MPDU queued", pdev->mpdu_enqued);
8087         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8088                          "MSDUs dropped", pdev->wmm_drop);
8089         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8090                          "Local enqued", pdev->local_enqued);
8091         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8092                          "Local freed", pdev->local_freed);
8093         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8094                          "HW queued", pdev->hw_queued);
8095         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8096                          "PPDUs reaped", pdev->hw_reaped);
8097         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8098                          "Num underruns", pdev->underrun);
8099         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8100                          "PPDUs cleaned", pdev->tx_abort);
8101         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8102                          "MPDUs requed", pdev->mpdus_requed);
8103         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8104                          "Excessive retries", pdev->tx_ko);
8105         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8106                          "HW rate", pdev->data_rc);
8107         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8108                          "Sched self triggers", pdev->self_triggers);
8109         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8110                          "Dropped due to SW retries",
8111                          pdev->sw_retry_failure);
8112         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8113                          "Illegal rate phy errors",
8114                          pdev->illgl_rate_phy_err);
8115         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8116                          "Pdev continuous xretry", pdev->pdev_cont_xretry);
8117         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8118                          "TX timeout", pdev->pdev_tx_timeout);
8119         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8120                          "PDEV resets", pdev->pdev_resets);
8121         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8122                          "PHY underrun", pdev->phy_underrun);
8123         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8124                          "MPDU is more than txop limit", pdev->txop_ovf);
8125         *length = len;
8126 }
8127
8128 static void
8129 ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8130                                  char *buf, u32 *length)
8131 {
8132         u32 len = *length;
8133         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8134
8135         len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
8136                          "ath10k PDEV RX stats");
8137         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8138                                  "=================");
8139
8140         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8141                          "Mid PPDU route change",
8142                          pdev->mid_ppdu_route_change);
8143         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8144                          "Tot. number of statuses", pdev->status_rcvd);
8145         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8146                          "Extra frags on rings 0", pdev->r0_frags);
8147         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8148                          "Extra frags on rings 1", pdev->r1_frags);
8149         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8150                          "Extra frags on rings 2", pdev->r2_frags);
8151         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8152                          "Extra frags on rings 3", pdev->r3_frags);
8153         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8154                          "MSDUs delivered to HTT", pdev->htt_msdus);
8155         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8156                          "MPDUs delivered to HTT", pdev->htt_mpdus);
8157         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8158                          "MSDUs delivered to stack", pdev->loc_msdus);
8159         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8160                          "MPDUs delivered to stack", pdev->loc_mpdus);
8161         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8162                          "Oversized AMSUs", pdev->oversize_amsdu);
8163         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8164                          "PHY errors", pdev->phy_errs);
8165         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8166                          "PHY errors drops", pdev->phy_err_drop);
8167         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8168                          "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs);
8169         *length = len;
8170 }
8171
8172 static void
8173 ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev,
8174                               char *buf, u32 *length)
8175 {
8176         u32 len = *length;
8177         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8178         int i;
8179
8180         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8181                         "vdev id", vdev->vdev_id);
8182         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8183                         "beacon snr", vdev->beacon_snr);
8184         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8185                         "data snr", vdev->data_snr);
8186         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8187                         "num rx frames", vdev->num_rx_frames);
8188         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8189                         "num rts fail", vdev->num_rts_fail);
8190         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8191                         "num rts success", vdev->num_rts_success);
8192         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8193                         "num rx err", vdev->num_rx_err);
8194         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8195                         "num rx discard", vdev->num_rx_discard);
8196         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8197                         "num tx not acked", vdev->num_tx_not_acked);
8198
8199         for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++)
8200                 len += scnprintf(buf + len, buf_len - len,
8201                                 "%25s [%02d] %u\n",
8202                                 "num tx frames", i,
8203                                 vdev->num_tx_frames[i]);
8204
8205         for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++)
8206                 len += scnprintf(buf + len, buf_len - len,
8207                                 "%25s [%02d] %u\n",
8208                                 "num tx frames retries", i,
8209                                 vdev->num_tx_frames_retries[i]);
8210
8211         for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++)
8212                 len += scnprintf(buf + len, buf_len - len,
8213                                 "%25s [%02d] %u\n",
8214                                 "num tx frames failures", i,
8215                                 vdev->num_tx_frames_failures[i]);
8216
8217         for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++)
8218                 len += scnprintf(buf + len, buf_len - len,
8219                                 "%25s [%02d] 0x%08x\n",
8220                                 "tx rate history", i,
8221                                 vdev->tx_rate_history[i]);
8222
8223         for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++)
8224                 len += scnprintf(buf + len, buf_len - len,
8225                                 "%25s [%02d] %u\n",
8226                                 "beacon rssi history", i,
8227                                 vdev->beacon_rssi_history[i]);
8228
8229         len += scnprintf(buf + len, buf_len - len, "\n");
8230         *length = len;
8231 }
8232
8233 static void
8234 ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer,
8235                               char *buf, u32 *length)
8236 {
8237         u32 len = *length;
8238         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8239
8240         len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
8241                         "Peer MAC address", peer->peer_macaddr);
8242         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8243                         "Peer RSSI", peer->peer_rssi);
8244         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8245                         "Peer TX rate", peer->peer_tx_rate);
8246         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8247                         "Peer RX rate", peer->peer_rx_rate);
8248         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8249                         "Peer RX duration", peer->rx_duration);
8250
8251         len += scnprintf(buf + len, buf_len - len, "\n");
8252         *length = len;
8253 }
8254
8255 void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar,
8256                                       struct ath10k_fw_stats *fw_stats,
8257                                       char *buf)
8258 {
8259         u32 len = 0;
8260         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8261         const struct ath10k_fw_stats_pdev *pdev;
8262         const struct ath10k_fw_stats_vdev *vdev;
8263         const struct ath10k_fw_stats_peer *peer;
8264         size_t num_peers;
8265         size_t num_vdevs;
8266
8267         spin_lock_bh(&ar->data_lock);
8268
8269         pdev = list_first_entry_or_null(&fw_stats->pdevs,
8270                                         struct ath10k_fw_stats_pdev, list);
8271         if (!pdev) {
8272                 ath10k_warn(ar, "failed to get pdev stats\n");
8273                 goto unlock;
8274         }
8275
8276         num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8277         num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8278
8279         ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8280         ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8281         ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8282
8283         len += scnprintf(buf + len, buf_len - len, "\n");
8284         len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8285                          "ath10k VDEV stats", num_vdevs);
8286         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8287                                  "=================");
8288
8289         list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8290                 ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
8291         }
8292
8293         len += scnprintf(buf + len, buf_len - len, "\n");
8294         len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8295                          "ath10k PEER stats", num_peers);
8296         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8297                                  "=================");
8298
8299         list_for_each_entry(peer, &fw_stats->peers, list) {
8300                 ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
8301         }
8302
8303 unlock:
8304         spin_unlock_bh(&ar->data_lock);
8305
8306         if (len >= buf_len)
8307                 buf[len - 1] = 0;
8308         else
8309                 buf[len] = 0;
8310 }
8311
8312 void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar,
8313                                      struct ath10k_fw_stats *fw_stats,
8314                                      char *buf)
8315 {
8316         unsigned int len = 0;
8317         unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
8318         const struct ath10k_fw_stats_pdev *pdev;
8319         const struct ath10k_fw_stats_vdev *vdev;
8320         const struct ath10k_fw_stats_peer *peer;
8321         size_t num_peers;
8322         size_t num_vdevs;
8323
8324         spin_lock_bh(&ar->data_lock);
8325
8326         pdev = list_first_entry_or_null(&fw_stats->pdevs,
8327                                         struct ath10k_fw_stats_pdev, list);
8328         if (!pdev) {
8329                 ath10k_warn(ar, "failed to get pdev stats\n");
8330                 goto unlock;
8331         }
8332
8333         num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8334         num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8335
8336         ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8337         ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
8338         ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8339         ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8340
8341         len += scnprintf(buf + len, buf_len - len, "\n");
8342         len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8343                          "ath10k VDEV stats", num_vdevs);
8344         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8345                                  "=================");
8346
8347         list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8348                 ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
8349         }
8350
8351         len += scnprintf(buf + len, buf_len - len, "\n");
8352         len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8353                          "ath10k PEER stats", num_peers);
8354         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8355                                  "=================");
8356
8357         list_for_each_entry(peer, &fw_stats->peers, list) {
8358                 ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
8359         }
8360
8361 unlock:
8362         spin_unlock_bh(&ar->data_lock);
8363
8364         if (len >= buf_len)
8365                 buf[len - 1] = 0;
8366         else
8367                 buf[len] = 0;
8368 }
8369
8370 static struct sk_buff *
8371 ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
8372                                            u32 detect_level, u32 detect_margin)
8373 {
8374         struct wmi_pdev_set_adaptive_cca_params *cmd;
8375         struct sk_buff *skb;
8376
8377         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8378         if (!skb)
8379                 return ERR_PTR(-ENOMEM);
8380
8381         cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data;
8382         cmd->enable = __cpu_to_le32(enable);
8383         cmd->cca_detect_level = __cpu_to_le32(detect_level);
8384         cmd->cca_detect_margin = __cpu_to_le32(detect_margin);
8385
8386         ath10k_dbg(ar, ATH10K_DBG_WMI,
8387                    "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
8388                    enable, detect_level, detect_margin);
8389         return skb;
8390 }
8391
8392 static void
8393 ath10k_wmi_fw_vdev_stats_extd_fill(const struct ath10k_fw_stats_vdev_extd *vdev,
8394                                    char *buf, u32 *length)
8395 {
8396         u32 len = *length;
8397         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8398         u32 val;
8399
8400         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8401                          "vdev id", vdev->vdev_id);
8402         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8403                          "ppdu aggr count", vdev->ppdu_aggr_cnt);
8404         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8405                          "ppdu noack", vdev->ppdu_noack);
8406         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8407                          "mpdu queued", vdev->mpdu_queued);
8408         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8409                          "ppdu nonaggr count", vdev->ppdu_nonaggr_cnt);
8410         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8411                          "mpdu sw requeued", vdev->mpdu_sw_requeued);
8412         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8413                          "mpdu success retry", vdev->mpdu_suc_retry);
8414         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8415                          "mpdu success multitry", vdev->mpdu_suc_multitry);
8416         len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8417                          "mpdu fail retry", vdev->mpdu_fail_retry);
8418         val = vdev->tx_ftm_suc;
8419         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8420                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8421                                  "tx ftm success",
8422                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8423         val = vdev->tx_ftm_suc_retry;
8424         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8425                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8426                                  "tx ftm success retry",
8427                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8428         val = vdev->tx_ftm_fail;
8429         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8430                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8431                                  "tx ftm fail",
8432                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8433         val = vdev->rx_ftmr_cnt;
8434         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8435                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8436                                  "rx ftm request count",
8437                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8438         val = vdev->rx_ftmr_dup_cnt;
8439         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8440                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8441                                  "rx ftm request dup count",
8442                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8443         val = vdev->rx_iftmr_cnt;
8444         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8445                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8446                                  "rx initial ftm req count",
8447                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8448         val = vdev->rx_iftmr_dup_cnt;
8449         if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8450                 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8451                                  "rx initial ftm req dup cnt",
8452                                  MS(val, WMI_VDEV_STATS_FTM_COUNT));
8453         len += scnprintf(buf + len, buf_len - len, "\n");
8454
8455         *length = len;
8456 }
8457
8458 void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar,
8459                                       struct ath10k_fw_stats *fw_stats,
8460                                       char *buf)
8461 {
8462         u32 len = 0;
8463         u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8464         const struct ath10k_fw_stats_pdev *pdev;
8465         const struct ath10k_fw_stats_vdev_extd *vdev;
8466         const struct ath10k_fw_stats_peer *peer;
8467         size_t num_peers;
8468         size_t num_vdevs;
8469
8470         spin_lock_bh(&ar->data_lock);
8471
8472         pdev = list_first_entry_or_null(&fw_stats->pdevs,
8473                                         struct ath10k_fw_stats_pdev, list);
8474         if (!pdev) {
8475                 ath10k_warn(ar, "failed to get pdev stats\n");
8476                 goto unlock;
8477         }
8478
8479         num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8480         num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8481
8482         ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8483         ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
8484         ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8485
8486         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8487                         "HW paused", pdev->hw_paused);
8488         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8489                         "Seqs posted", pdev->seq_posted);
8490         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8491                         "Seqs failed queueing", pdev->seq_failed_queueing);
8492         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8493                         "Seqs completed", pdev->seq_completed);
8494         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8495                         "Seqs restarted", pdev->seq_restarted);
8496         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8497                         "MU Seqs posted", pdev->mu_seq_posted);
8498         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8499                         "MPDUs SW flushed", pdev->mpdus_sw_flush);
8500         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8501                         "MPDUs HW filtered", pdev->mpdus_hw_filter);
8502         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8503                         "MPDUs truncated", pdev->mpdus_truncated);
8504         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8505                         "MPDUs receive no ACK", pdev->mpdus_ack_failed);
8506         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8507                         "MPDUs expired", pdev->mpdus_expired);
8508
8509         ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8510         len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8511                         "Num Rx Overflow errors", pdev->rx_ovfl_errs);
8512
8513         len += scnprintf(buf + len, buf_len - len, "\n");
8514         len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8515                         "ath10k VDEV stats", num_vdevs);
8516         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8517                                 "=================");
8518         list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8519                 ath10k_wmi_fw_vdev_stats_extd_fill(vdev, buf, &len);
8520         }
8521
8522         len += scnprintf(buf + len, buf_len - len, "\n");
8523         len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8524                         "ath10k PEER stats", num_peers);
8525         len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8526                                 "=================");
8527
8528         list_for_each_entry(peer, &fw_stats->peers, list) {
8529                 ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
8530         }
8531
8532 unlock:
8533         spin_unlock_bh(&ar->data_lock);
8534
8535         if (len >= buf_len)
8536                 buf[len - 1] = 0;
8537         else
8538                 buf[len] = 0;
8539 }
8540
8541 int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar,
8542                                    enum wmi_vdev_subtype subtype)
8543 {
8544         switch (subtype) {
8545         case WMI_VDEV_SUBTYPE_NONE:
8546                 return WMI_VDEV_SUBTYPE_LEGACY_NONE;
8547         case WMI_VDEV_SUBTYPE_P2P_DEVICE:
8548                 return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV;
8549         case WMI_VDEV_SUBTYPE_P2P_CLIENT:
8550                 return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI;
8551         case WMI_VDEV_SUBTYPE_P2P_GO:
8552                 return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO;
8553         case WMI_VDEV_SUBTYPE_PROXY_STA:
8554                 return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA;
8555         case WMI_VDEV_SUBTYPE_MESH_11S:
8556         case WMI_VDEV_SUBTYPE_MESH_NON_11S:
8557                 return -ENOTSUPP;
8558         }
8559         return -ENOTSUPP;
8560 }
8561
8562 static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar,
8563                                                  enum wmi_vdev_subtype subtype)
8564 {
8565         switch (subtype) {
8566         case WMI_VDEV_SUBTYPE_NONE:
8567                 return WMI_VDEV_SUBTYPE_10_2_4_NONE;
8568         case WMI_VDEV_SUBTYPE_P2P_DEVICE:
8569                 return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV;
8570         case WMI_VDEV_SUBTYPE_P2P_CLIENT:
8571                 return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI;
8572         case WMI_VDEV_SUBTYPE_P2P_GO:
8573                 return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO;
8574         case WMI_VDEV_SUBTYPE_PROXY_STA:
8575                 return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA;
8576         case WMI_VDEV_SUBTYPE_MESH_11S:
8577                 return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S;
8578         case WMI_VDEV_SUBTYPE_MESH_NON_11S:
8579                 return -ENOTSUPP;
8580         }
8581         return -ENOTSUPP;
8582 }
8583
8584 static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar,
8585                                                enum wmi_vdev_subtype subtype)
8586 {
8587         switch (subtype) {
8588         case WMI_VDEV_SUBTYPE_NONE:
8589                 return WMI_VDEV_SUBTYPE_10_4_NONE;
8590         case WMI_VDEV_SUBTYPE_P2P_DEVICE:
8591                 return WMI_VDEV_SUBTYPE_10_4_P2P_DEV;
8592         case WMI_VDEV_SUBTYPE_P2P_CLIENT:
8593                 return WMI_VDEV_SUBTYPE_10_4_P2P_CLI;
8594         case WMI_VDEV_SUBTYPE_P2P_GO:
8595                 return WMI_VDEV_SUBTYPE_10_4_P2P_GO;
8596         case WMI_VDEV_SUBTYPE_PROXY_STA:
8597                 return WMI_VDEV_SUBTYPE_10_4_PROXY_STA;
8598         case WMI_VDEV_SUBTYPE_MESH_11S:
8599                 return WMI_VDEV_SUBTYPE_10_4_MESH_11S;
8600         case WMI_VDEV_SUBTYPE_MESH_NON_11S:
8601                 return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S;
8602         }
8603         return -ENOTSUPP;
8604 }
8605
8606 static struct sk_buff *
8607 ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar,
8608                                     enum wmi_host_platform_type type,
8609                                     u32 fw_feature_bitmap)
8610 {
8611         struct wmi_ext_resource_config_10_4_cmd *cmd;
8612         struct sk_buff *skb;
8613         u32 num_tdls_sleep_sta = 0;
8614
8615         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8616         if (!skb)
8617                 return ERR_PTR(-ENOMEM);
8618
8619         if (test_bit(WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, ar->wmi.svc_map))
8620                 num_tdls_sleep_sta = TARGET_10_4_NUM_TDLS_SLEEP_STA;
8621
8622         cmd = (struct wmi_ext_resource_config_10_4_cmd *)skb->data;
8623         cmd->host_platform_config = __cpu_to_le32(type);
8624         cmd->fw_feature_bitmap = __cpu_to_le32(fw_feature_bitmap);
8625         cmd->wlan_gpio_priority = __cpu_to_le32(-1);
8626         cmd->coex_version = __cpu_to_le32(WMI_NO_COEX_VERSION_SUPPORT);
8627         cmd->coex_gpio_pin1 = __cpu_to_le32(-1);
8628         cmd->coex_gpio_pin2 = __cpu_to_le32(-1);
8629         cmd->coex_gpio_pin3 = __cpu_to_le32(-1);
8630         cmd->num_tdls_vdevs = __cpu_to_le32(TARGET_10_4_NUM_TDLS_VDEVS);
8631         cmd->num_tdls_conn_table_entries = __cpu_to_le32(20);
8632         cmd->max_tdls_concurrent_sleep_sta = __cpu_to_le32(num_tdls_sleep_sta);
8633         cmd->max_tdls_concurrent_buffer_sta =
8634                         __cpu_to_le32(TARGET_10_4_NUM_TDLS_BUFFER_STA);
8635
8636         ath10k_dbg(ar, ATH10K_DBG_WMI,
8637                    "wmi ext resource config host type %d firmware feature bitmap %08x\n",
8638                    type, fw_feature_bitmap);
8639         return skb;
8640 }
8641
8642 static struct sk_buff *
8643 ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
8644                                          enum wmi_tdls_state state)
8645 {
8646         struct wmi_10_4_tdls_set_state_cmd *cmd;
8647         struct sk_buff *skb;
8648         u32 options = 0;
8649
8650         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8651         if (!skb)
8652                 return ERR_PTR(-ENOMEM);
8653
8654         if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) &&
8655             state == WMI_TDLS_ENABLE_ACTIVE)
8656                 state = WMI_TDLS_ENABLE_PASSIVE;
8657
8658         if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
8659                 options |= WMI_TDLS_BUFFER_STA_EN;
8660
8661         cmd = (struct wmi_10_4_tdls_set_state_cmd *)skb->data;
8662         cmd->vdev_id = __cpu_to_le32(vdev_id);
8663         cmd->state = __cpu_to_le32(state);
8664         cmd->notification_interval_ms = __cpu_to_le32(5000);
8665         cmd->tx_discovery_threshold = __cpu_to_le32(100);
8666         cmd->tx_teardown_threshold = __cpu_to_le32(5);
8667         cmd->rssi_teardown_threshold = __cpu_to_le32(-75);
8668         cmd->rssi_delta = __cpu_to_le32(-20);
8669         cmd->tdls_options = __cpu_to_le32(options);
8670         cmd->tdls_peer_traffic_ind_window = __cpu_to_le32(2);
8671         cmd->tdls_peer_traffic_response_timeout_ms = __cpu_to_le32(5000);
8672         cmd->tdls_puapsd_mask = __cpu_to_le32(0xf);
8673         cmd->tdls_puapsd_inactivity_time_ms = __cpu_to_le32(0);
8674         cmd->tdls_puapsd_rx_frame_threshold = __cpu_to_le32(10);
8675         cmd->teardown_notification_ms = __cpu_to_le32(10);
8676         cmd->tdls_peer_kickout_threshold = __cpu_to_le32(96);
8677
8678         ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi update fw tdls state %d for vdev %i\n",
8679                    state, vdev_id);
8680         return skb;
8681 }
8682
8683 static u32 ath10k_wmi_prepare_peer_qos(u8 uapsd_queues, u8 sp)
8684 {
8685         u32 peer_qos = 0;
8686
8687         if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
8688                 peer_qos |= WMI_TDLS_PEER_QOS_AC_VO;
8689         if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
8690                 peer_qos |= WMI_TDLS_PEER_QOS_AC_VI;
8691         if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
8692                 peer_qos |= WMI_TDLS_PEER_QOS_AC_BK;
8693         if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
8694                 peer_qos |= WMI_TDLS_PEER_QOS_AC_BE;
8695
8696         peer_qos |= SM(sp, WMI_TDLS_PEER_SP);
8697
8698         return peer_qos;
8699 }
8700
8701 static struct sk_buff *
8702 ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param)
8703 {
8704         struct wmi_pdev_get_tpc_table_cmd *cmd;
8705         struct sk_buff *skb;
8706
8707         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8708         if (!skb)
8709                 return ERR_PTR(-ENOMEM);
8710
8711         cmd = (struct wmi_pdev_get_tpc_table_cmd *)skb->data;
8712         cmd->param = __cpu_to_le32(param);
8713
8714         ath10k_dbg(ar, ATH10K_DBG_WMI,
8715                    "wmi pdev get tpc table param:%d\n", param);
8716         return skb;
8717 }
8718
8719 static struct sk_buff *
8720 ath10k_wmi_10_4_gen_tdls_peer_update(struct ath10k *ar,
8721                                      const struct wmi_tdls_peer_update_cmd_arg *arg,
8722                                      const struct wmi_tdls_peer_capab_arg *cap,
8723                                      const struct wmi_channel_arg *chan_arg)
8724 {
8725         struct wmi_10_4_tdls_peer_update_cmd *cmd;
8726         struct wmi_tdls_peer_capabilities *peer_cap;
8727         struct wmi_channel *chan;
8728         struct sk_buff *skb;
8729         u32 peer_qos;
8730         int len, chan_len;
8731         int i;
8732
8733         /* tdls peer update cmd has place holder for one channel*/
8734         chan_len = cap->peer_chan_len ? (cap->peer_chan_len - 1) : 0;
8735
8736         len = sizeof(*cmd) + chan_len * sizeof(*chan);
8737
8738         skb = ath10k_wmi_alloc_skb(ar, len);
8739         if (!skb)
8740                 return ERR_PTR(-ENOMEM);
8741
8742         memset(skb->data, 0, sizeof(*cmd));
8743
8744         cmd = (struct wmi_10_4_tdls_peer_update_cmd *)skb->data;
8745         cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
8746         ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
8747         cmd->peer_state = __cpu_to_le32(arg->peer_state);
8748
8749         peer_qos = ath10k_wmi_prepare_peer_qos(cap->peer_uapsd_queues,
8750                                                cap->peer_max_sp);
8751
8752         peer_cap = &cmd->peer_capab;
8753         peer_cap->peer_qos = __cpu_to_le32(peer_qos);
8754         peer_cap->buff_sta_support = __cpu_to_le32(cap->buff_sta_support);
8755         peer_cap->off_chan_support = __cpu_to_le32(cap->off_chan_support);
8756         peer_cap->peer_curr_operclass = __cpu_to_le32(cap->peer_curr_operclass);
8757         peer_cap->self_curr_operclass = __cpu_to_le32(cap->self_curr_operclass);
8758         peer_cap->peer_chan_len = __cpu_to_le32(cap->peer_chan_len);
8759         peer_cap->peer_operclass_len = __cpu_to_le32(cap->peer_operclass_len);
8760
8761         for (i = 0; i < WMI_TDLS_MAX_SUPP_OPER_CLASSES; i++)
8762                 peer_cap->peer_operclass[i] = cap->peer_operclass[i];
8763
8764         peer_cap->is_peer_responder = __cpu_to_le32(cap->is_peer_responder);
8765         peer_cap->pref_offchan_num = __cpu_to_le32(cap->pref_offchan_num);
8766         peer_cap->pref_offchan_bw = __cpu_to_le32(cap->pref_offchan_bw);
8767
8768         for (i = 0; i < cap->peer_chan_len; i++) {
8769                 chan = (struct wmi_channel *)&peer_cap->peer_chan_list[i];
8770                 ath10k_wmi_put_wmi_channel(chan, &chan_arg[i]);
8771         }
8772
8773         ath10k_dbg(ar, ATH10K_DBG_WMI,
8774                    "wmi tdls peer update vdev %i state %d n_chans %u\n",
8775                    arg->vdev_id, arg->peer_state, cap->peer_chan_len);
8776         return skb;
8777 }
8778
8779 static struct sk_buff *
8780 ath10k_wmi_10_4_gen_radar_found(struct ath10k *ar,
8781                                 const struct ath10k_radar_found_info *arg)
8782 {
8783         struct wmi_radar_found_info *cmd;
8784         struct sk_buff *skb;
8785
8786         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8787         if (!skb)
8788                 return ERR_PTR(-ENOMEM);
8789
8790         cmd = (struct wmi_radar_found_info *)skb->data;
8791         cmd->pri_min   = __cpu_to_le32(arg->pri_min);
8792         cmd->pri_max   = __cpu_to_le32(arg->pri_max);
8793         cmd->width_min = __cpu_to_le32(arg->width_min);
8794         cmd->width_max = __cpu_to_le32(arg->width_max);
8795         cmd->sidx_min  = __cpu_to_le32(arg->sidx_min);
8796         cmd->sidx_max  = __cpu_to_le32(arg->sidx_max);
8797
8798         ath10k_dbg(ar, ATH10K_DBG_WMI,
8799                    "wmi radar found pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n",
8800                    arg->pri_min, arg->pri_max, arg->width_min,
8801                    arg->width_max, arg->sidx_min, arg->sidx_max);
8802         return skb;
8803 }
8804
8805 static struct sk_buff *
8806 ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value)
8807 {
8808         struct wmi_echo_cmd *cmd;
8809         struct sk_buff *skb;
8810
8811         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8812         if (!skb)
8813                 return ERR_PTR(-ENOMEM);
8814
8815         cmd = (struct wmi_echo_cmd *)skb->data;
8816         cmd->value = cpu_to_le32(value);
8817
8818         ath10k_dbg(ar, ATH10K_DBG_WMI,
8819                    "wmi echo value 0x%08x\n", value);
8820         return skb;
8821 }
8822
8823 int
8824 ath10k_wmi_barrier(struct ath10k *ar)
8825 {
8826         int ret;
8827         int time_left;
8828
8829         spin_lock_bh(&ar->data_lock);
8830         reinit_completion(&ar->wmi.barrier);
8831         spin_unlock_bh(&ar->data_lock);
8832
8833         ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID);
8834         if (ret) {
8835                 ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret);
8836                 return ret;
8837         }
8838
8839         time_left = wait_for_completion_timeout(&ar->wmi.barrier,
8840                                                 ATH10K_WMI_BARRIER_TIMEOUT_HZ);
8841         if (!time_left)
8842                 return -ETIMEDOUT;
8843
8844         return 0;
8845 }
8846
8847 static struct sk_buff *
8848 ath10k_wmi_10_2_4_op_gen_bb_timing(struct ath10k *ar,
8849                                    const struct wmi_bb_timing_cfg_arg *arg)
8850 {
8851         struct wmi_pdev_bb_timing_cfg_cmd *cmd;
8852         struct sk_buff *skb;
8853
8854         skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8855         if (!skb)
8856                 return ERR_PTR(-ENOMEM);
8857
8858         cmd = (struct wmi_pdev_bb_timing_cfg_cmd *)skb->data;
8859         cmd->bb_tx_timing = __cpu_to_le32(arg->bb_tx_timing);
8860         cmd->bb_xpa_timing = __cpu_to_le32(arg->bb_xpa_timing);
8861
8862         ath10k_dbg(ar, ATH10K_DBG_WMI,
8863                    "wmi pdev bb_tx_timing 0x%x bb_xpa_timing 0x%x\n",
8864                    arg->bb_tx_timing, arg->bb_xpa_timing);
8865         return skb;
8866 }
8867
8868 static const struct wmi_ops wmi_ops = {
8869         .rx = ath10k_wmi_op_rx,
8870         .map_svc = wmi_main_svc_map,
8871
8872         .pull_scan = ath10k_wmi_op_pull_scan_ev,
8873         .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
8874         .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
8875         .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8876         .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8877         .pull_swba = ath10k_wmi_op_pull_swba_ev,
8878         .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
8879         .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
8880         .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
8881         .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8882         .pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats,
8883         .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8884         .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8885
8886         .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8887         .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8888         .gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd,
8889         .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8890         .gen_init = ath10k_wmi_op_gen_init,
8891         .gen_start_scan = ath10k_wmi_op_gen_start_scan,
8892         .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8893         .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8894         .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8895         .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8896         .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8897         .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8898         .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8899         .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8900         .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8901         .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8902         .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8903         /* .gen_vdev_wmm_conf not implemented */
8904         .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8905         .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8906         .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8907         .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8908         .gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc,
8909         .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8910         .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8911         .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8912         .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8913         .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8914         .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8915         .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8916         .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8917         .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8918         .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8919         .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8920         .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8921         .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8922         /* .gen_pdev_get_temperature not implemented */
8923         .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8924         .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8925         .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8926         .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8927         .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
8928         .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
8929         .gen_echo = ath10k_wmi_op_gen_echo,
8930         /* .gen_bcn_tmpl not implemented */
8931         /* .gen_prb_tmpl not implemented */
8932         /* .gen_p2p_go_bcn_ie not implemented */
8933         /* .gen_adaptive_qcs not implemented */
8934         /* .gen_pdev_enable_adaptive_cca not implemented */
8935 };
8936
8937 static const struct wmi_ops wmi_10_1_ops = {
8938         .rx = ath10k_wmi_10_1_op_rx,
8939         .map_svc = wmi_10x_svc_map,
8940         .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
8941         .pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats,
8942         .gen_init = ath10k_wmi_10_1_op_gen_init,
8943         .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
8944         .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
8945         .gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc,
8946         /* .gen_pdev_get_temperature not implemented */
8947
8948         /* shared with main branch */
8949         .pull_scan = ath10k_wmi_op_pull_scan_ev,
8950         .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
8951         .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
8952         .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8953         .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8954         .pull_swba = ath10k_wmi_op_pull_swba_ev,
8955         .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
8956         .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
8957         .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8958         .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8959         .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8960
8961         .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8962         .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8963         .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8964         .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8965         .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8966         .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8967         .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8968         .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8969         .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8970         .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8971         .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8972         .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8973         .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8974         .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8975         /* .gen_vdev_wmm_conf not implemented */
8976         .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8977         .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8978         .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8979         .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8980         .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8981         .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8982         .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8983         .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8984         .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8985         .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8986         .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8987         .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8988         .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8989         .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8990         .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8991         .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8992         .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8993         .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8994         .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8995         .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8996         .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8997         .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
8998         .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
8999         .gen_echo = ath10k_wmi_op_gen_echo,
9000         /* .gen_bcn_tmpl not implemented */
9001         /* .gen_prb_tmpl not implemented */
9002         /* .gen_p2p_go_bcn_ie not implemented */
9003         /* .gen_adaptive_qcs not implemented */
9004         /* .gen_pdev_enable_adaptive_cca not implemented */
9005 };
9006
9007 static const struct wmi_ops wmi_10_2_ops = {
9008         .rx = ath10k_wmi_10_2_op_rx,
9009         .pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats,
9010         .gen_init = ath10k_wmi_10_2_op_gen_init,
9011         .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
9012         /* .gen_pdev_get_temperature not implemented */
9013
9014         /* shared with 10.1 */
9015         .map_svc = wmi_10x_svc_map,
9016         .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
9017         .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
9018         .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
9019         .gen_echo = ath10k_wmi_op_gen_echo,
9020
9021         .pull_scan = ath10k_wmi_op_pull_scan_ev,
9022         .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
9023         .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
9024         .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9025         .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
9026         .pull_swba = ath10k_wmi_op_pull_swba_ev,
9027         .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
9028         .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
9029         .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9030         .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
9031         .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
9032
9033         .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9034         .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
9035         .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9036         .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9037         .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9038         .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9039         .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9040         .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9041         .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9042         .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9043         .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9044         .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
9045         .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
9046         .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
9047         /* .gen_vdev_wmm_conf not implemented */
9048         .gen_peer_create = ath10k_wmi_op_gen_peer_create,
9049         .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9050         .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
9051         .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9052         .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9053         .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9054         .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9055         .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9056         .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9057         .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9058         .gen_request_stats = ath10k_wmi_op_gen_request_stats,
9059         .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9060         .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9061         .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
9062         .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9063         .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9064         .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9065         .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
9066         .gen_addba_send = ath10k_wmi_op_gen_addba_send,
9067         .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
9068         .gen_delba_send = ath10k_wmi_op_gen_delba_send,
9069         .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
9070         .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
9071         /* .gen_pdev_enable_adaptive_cca not implemented */
9072 };
9073
9074 static const struct wmi_ops wmi_10_2_4_ops = {
9075         .rx = ath10k_wmi_10_2_op_rx,
9076         .pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats,
9077         .gen_init = ath10k_wmi_10_2_op_gen_init,
9078         .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
9079         .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
9080         .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
9081
9082         /* shared with 10.1 */
9083         .map_svc = wmi_10x_svc_map,
9084         .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
9085         .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
9086         .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
9087         .gen_echo = ath10k_wmi_op_gen_echo,
9088
9089         .pull_scan = ath10k_wmi_op_pull_scan_ev,
9090         .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
9091         .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
9092         .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9093         .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
9094         .pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev,
9095         .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
9096         .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
9097         .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9098         .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
9099         .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
9100
9101         .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9102         .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
9103         .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9104         .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9105         .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9106         .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9107         .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9108         .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9109         .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9110         .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9111         .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9112         .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
9113         .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
9114         .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
9115         .gen_peer_create = ath10k_wmi_op_gen_peer_create,
9116         .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9117         .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
9118         .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9119         .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9120         .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9121         .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9122         .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9123         .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9124         .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9125         .gen_request_stats = ath10k_wmi_op_gen_request_stats,
9126         .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9127         .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9128         .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
9129         .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9130         .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9131         .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9132         .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
9133         .gen_addba_send = ath10k_wmi_op_gen_addba_send,
9134         .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
9135         .gen_delba_send = ath10k_wmi_op_gen_delba_send,
9136         .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
9137         .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
9138         .gen_pdev_enable_adaptive_cca =
9139                 ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
9140         .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
9141         .gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing,
9142         /* .gen_bcn_tmpl not implemented */
9143         /* .gen_prb_tmpl not implemented */
9144         /* .gen_p2p_go_bcn_ie not implemented */
9145         /* .gen_adaptive_qcs not implemented */
9146 };
9147
9148 static const struct wmi_ops wmi_10_4_ops = {
9149         .rx = ath10k_wmi_10_4_op_rx,
9150         .map_svc = wmi_10_4_svc_map,
9151
9152         .pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats,
9153         .pull_scan = ath10k_wmi_op_pull_scan_ev,
9154         .pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev,
9155         .pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev,
9156         .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9157         .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
9158         .pull_swba = ath10k_wmi_10_4_op_pull_swba_ev,
9159         .pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr,
9160         .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
9161         .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
9162         .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9163         .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
9164         .pull_dfs_status_ev = ath10k_wmi_10_4_op_pull_dfs_status_ev,
9165         .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,
9166
9167         .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9168         .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
9169         .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
9170         .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9171         .gen_init = ath10k_wmi_10_4_op_gen_init,
9172         .gen_start_scan = ath10k_wmi_op_gen_start_scan,
9173         .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9174         .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9175         .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9176         .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9177         .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9178         .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9179         .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9180         .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9181         .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
9182         .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
9183         .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
9184         .gen_peer_create = ath10k_wmi_op_gen_peer_create,
9185         .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9186         .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
9187         .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9188         .gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc,
9189         .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9190         .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9191         .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9192         .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9193         .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9194         .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9195         .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9196         .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9197         .gen_dbglog_cfg = ath10k_wmi_10_4_op_gen_dbglog_cfg,
9198         .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9199         .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9200         .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9201         .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
9202         .gen_addba_send = ath10k_wmi_op_gen_addba_send,
9203         .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
9204         .gen_delba_send = ath10k_wmi_op_gen_delba_send,
9205         .fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill,
9206         .ext_resource_config = ath10k_wmi_10_4_ext_resource_config,
9207         .gen_update_fw_tdls_state = ath10k_wmi_10_4_gen_update_fw_tdls_state,
9208         .gen_tdls_peer_update = ath10k_wmi_10_4_gen_tdls_peer_update,
9209         .gen_pdev_get_tpc_table_cmdid =
9210                         ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid,
9211         .gen_radar_found = ath10k_wmi_10_4_gen_radar_found,
9212
9213         /* shared with 10.2 */
9214         .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
9215         .gen_request_stats = ath10k_wmi_op_gen_request_stats,
9216         .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
9217         .get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype,
9218         .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
9219         .gen_echo = ath10k_wmi_op_gen_echo,
9220         .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
9221 };
9222
9223 int ath10k_wmi_attach(struct ath10k *ar)
9224 {
9225         switch (ar->running_fw->fw_file.wmi_op_version) {
9226         case ATH10K_FW_WMI_OP_VERSION_10_4:
9227                 ar->wmi.ops = &wmi_10_4_ops;
9228                 ar->wmi.cmd = &wmi_10_4_cmd_map;
9229                 ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
9230                 ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
9231                 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
9232                 break;
9233         case ATH10K_FW_WMI_OP_VERSION_10_2_4:
9234                 ar->wmi.cmd = &wmi_10_2_4_cmd_map;
9235                 ar->wmi.ops = &wmi_10_2_4_ops;
9236                 ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
9237                 ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
9238                 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
9239                 break;
9240         case ATH10K_FW_WMI_OP_VERSION_10_2:
9241                 ar->wmi.cmd = &wmi_10_2_cmd_map;
9242                 ar->wmi.ops = &wmi_10_2_ops;
9243                 ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
9244                 ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
9245                 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
9246                 break;
9247         case ATH10K_FW_WMI_OP_VERSION_10_1:
9248                 ar->wmi.cmd = &wmi_10x_cmd_map;
9249                 ar->wmi.ops = &wmi_10_1_ops;
9250                 ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
9251                 ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
9252                 ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
9253                 break;
9254         case ATH10K_FW_WMI_OP_VERSION_MAIN:
9255                 ar->wmi.cmd = &wmi_cmd_map;
9256                 ar->wmi.ops = &wmi_ops;
9257                 ar->wmi.vdev_param = &wmi_vdev_param_map;
9258                 ar->wmi.pdev_param = &wmi_pdev_param_map;
9259                 ar->wmi.peer_flags = &wmi_peer_flags_map;
9260                 break;
9261         case ATH10K_FW_WMI_OP_VERSION_TLV:
9262                 ath10k_wmi_tlv_attach(ar);
9263                 break;
9264         case ATH10K_FW_WMI_OP_VERSION_UNSET:
9265         case ATH10K_FW_WMI_OP_VERSION_MAX:
9266                 ath10k_err(ar, "unsupported WMI op version: %d\n",
9267                            ar->running_fw->fw_file.wmi_op_version);
9268                 return -EINVAL;
9269         }
9270
9271         init_completion(&ar->wmi.service_ready);
9272         init_completion(&ar->wmi.unified_ready);
9273         init_completion(&ar->wmi.barrier);
9274         init_completion(&ar->wmi.radar_confirm);
9275
9276         INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work);
9277         INIT_WORK(&ar->radar_confirmation_work,
9278                   ath10k_radar_confirmation_work);
9279
9280         if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
9281                      ar->running_fw->fw_file.fw_features)) {
9282                 idr_init(&ar->wmi.mgmt_pending_tx);
9283         }
9284
9285         return 0;
9286 }
9287
9288 void ath10k_wmi_free_host_mem(struct ath10k *ar)
9289 {
9290         int i;
9291
9292         /* free the host memory chunks requested by firmware */
9293         for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
9294                 dma_free_coherent(ar->dev,
9295                                   ar->wmi.mem_chunks[i].len,
9296                                   ar->wmi.mem_chunks[i].vaddr,
9297                                   ar->wmi.mem_chunks[i].paddr);
9298         }
9299
9300         ar->wmi.num_mem_chunks = 0;
9301 }
9302
9303 static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr,
9304                                                void *ctx)
9305 {
9306         struct ath10k_mgmt_tx_pkt_addr *pkt_addr = ptr;
9307         struct ath10k *ar = ctx;
9308         struct sk_buff *msdu;
9309
9310         ath10k_dbg(ar, ATH10K_DBG_WMI,
9311                    "force cleanup mgmt msdu_id %hu\n", msdu_id);
9312
9313         msdu = pkt_addr->vaddr;
9314         dma_unmap_single(ar->dev, pkt_addr->paddr,
9315                          msdu->len, DMA_FROM_DEVICE);
9316         ieee80211_free_txskb(ar->hw, msdu);
9317
9318         return 0;
9319 }
9320
9321 void ath10k_wmi_detach(struct ath10k *ar)
9322 {
9323         if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
9324                      ar->running_fw->fw_file.fw_features)) {
9325                 spin_lock_bh(&ar->data_lock);
9326                 idr_for_each(&ar->wmi.mgmt_pending_tx,
9327                              ath10k_wmi_mgmt_tx_clean_up_pending, ar);
9328                 idr_destroy(&ar->wmi.mgmt_pending_tx);
9329                 spin_unlock_bh(&ar->data_lock);
9330         }
9331
9332         cancel_work_sync(&ar->svc_rdy_work);
9333
9334         if (ar->svc_rdy_skb)
9335                 dev_kfree_skb(ar->svc_rdy_skb);
9336 }