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