xref: /openbmc/linux/drivers/net/wireless/ath/ath10k/wmi.c (revision a06c488d)
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_peer_stats *src;
2866 		struct ath10k_fw_stats_peer *dst;
2867 
2868 		src = (void *)skb->data;
2869 		if (!skb_pull(skb, sizeof(*src)))
2870 			return -EPROTO;
2871 
2872 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2873 		if (!dst)
2874 			continue;
2875 
2876 		ath10k_wmi_pull_peer_stats(&src->common.old, dst);
2877 
2878 		dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate);
2879 		/* FIXME: expose 10.2 specific values */
2880 
2881 		list_add_tail(&dst->list, &stats->peers);
2882 	}
2883 
2884 	return 0;
2885 }
2886 
2887 static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
2888 					    struct sk_buff *skb,
2889 					    struct ath10k_fw_stats *stats)
2890 {
2891 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
2892 	u32 num_pdev_stats;
2893 	u32 num_pdev_ext_stats;
2894 	u32 num_vdev_stats;
2895 	u32 num_peer_stats;
2896 	int i;
2897 
2898 	if (!skb_pull(skb, sizeof(*ev)))
2899 		return -EPROTO;
2900 
2901 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2902 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
2903 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2904 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2905 
2906 	for (i = 0; i < num_pdev_stats; i++) {
2907 		const struct wmi_10_4_pdev_stats *src;
2908 		struct ath10k_fw_stats_pdev *dst;
2909 
2910 		src = (void *)skb->data;
2911 		if (!skb_pull(skb, sizeof(*src)))
2912 			return -EPROTO;
2913 
2914 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2915 		if (!dst)
2916 			continue;
2917 
2918 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2919 		ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst);
2920 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2921 		dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs);
2922 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
2923 
2924 		list_add_tail(&dst->list, &stats->pdevs);
2925 	}
2926 
2927 	for (i = 0; i < num_pdev_ext_stats; i++) {
2928 		const struct wmi_10_2_pdev_ext_stats *src;
2929 
2930 		src = (void *)skb->data;
2931 		if (!skb_pull(skb, sizeof(*src)))
2932 			return -EPROTO;
2933 
2934 		/* FIXME: expose values to userspace
2935 		 *
2936 		 * Note: Even though this loop seems to do nothing it is
2937 		 * required to parse following sub-structures properly.
2938 		 */
2939 	}
2940 
2941 	/* fw doesn't implement vdev stats */
2942 
2943 	for (i = 0; i < num_peer_stats; i++) {
2944 		const struct wmi_10_4_peer_stats *src;
2945 		struct ath10k_fw_stats_peer *dst;
2946 
2947 		src = (void *)skb->data;
2948 		if (!skb_pull(skb, sizeof(*src)))
2949 			return -EPROTO;
2950 
2951 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2952 		if (!dst)
2953 			continue;
2954 
2955 		ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2956 		dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2957 		dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2958 		dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2959 		/* FIXME: expose 10.4 specific values */
2960 
2961 		list_add_tail(&dst->list, &stats->peers);
2962 	}
2963 
2964 	return 0;
2965 }
2966 
2967 void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb)
2968 {
2969 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
2970 	ath10k_debug_fw_stats_process(ar, skb);
2971 }
2972 
2973 static int
2974 ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb,
2975 				 struct wmi_vdev_start_ev_arg *arg)
2976 {
2977 	struct wmi_vdev_start_response_event *ev = (void *)skb->data;
2978 
2979 	if (skb->len < sizeof(*ev))
2980 		return -EPROTO;
2981 
2982 	skb_pull(skb, sizeof(*ev));
2983 	arg->vdev_id = ev->vdev_id;
2984 	arg->req_id = ev->req_id;
2985 	arg->resp_type = ev->resp_type;
2986 	arg->status = ev->status;
2987 
2988 	return 0;
2989 }
2990 
2991 void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb)
2992 {
2993 	struct wmi_vdev_start_ev_arg arg = {};
2994 	int ret;
2995 
2996 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
2997 
2998 	ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg);
2999 	if (ret) {
3000 		ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret);
3001 		return;
3002 	}
3003 
3004 	if (WARN_ON(__le32_to_cpu(arg.status)))
3005 		return;
3006 
3007 	complete(&ar->vdev_setup_done);
3008 }
3009 
3010 void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb)
3011 {
3012 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
3013 	complete(&ar->vdev_setup_done);
3014 }
3015 
3016 static int
3017 ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb,
3018 				struct wmi_peer_kick_ev_arg *arg)
3019 {
3020 	struct wmi_peer_sta_kickout_event *ev = (void *)skb->data;
3021 
3022 	if (skb->len < sizeof(*ev))
3023 		return -EPROTO;
3024 
3025 	skb_pull(skb, sizeof(*ev));
3026 	arg->mac_addr = ev->peer_macaddr.addr;
3027 
3028 	return 0;
3029 }
3030 
3031 void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb)
3032 {
3033 	struct wmi_peer_kick_ev_arg arg = {};
3034 	struct ieee80211_sta *sta;
3035 	int ret;
3036 
3037 	ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
3038 	if (ret) {
3039 		ath10k_warn(ar, "failed to parse peer kickout event: %d\n",
3040 			    ret);
3041 		return;
3042 	}
3043 
3044 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n",
3045 		   arg.mac_addr);
3046 
3047 	rcu_read_lock();
3048 
3049 	sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
3050 	if (!sta) {
3051 		ath10k_warn(ar, "Spurious quick kickout for STA %pM\n",
3052 			    arg.mac_addr);
3053 		goto exit;
3054 	}
3055 
3056 	ieee80211_report_low_ack(sta, 10);
3057 
3058 exit:
3059 	rcu_read_unlock();
3060 }
3061 
3062 /*
3063  * FIXME
3064  *
3065  * We don't report to mac80211 sleep state of connected
3066  * stations. Due to this mac80211 can't fill in TIM IE
3067  * correctly.
3068  *
3069  * I know of no way of getting nullfunc frames that contain
3070  * sleep transition from connected stations - these do not
3071  * seem to be sent from the target to the host. There also
3072  * doesn't seem to be a dedicated event for that. So the
3073  * only way left to do this would be to read tim_bitmap
3074  * during SWBA.
3075  *
3076  * We could probably try using tim_bitmap from SWBA to tell
3077  * mac80211 which stations are asleep and which are not. The
3078  * problem here is calling mac80211 functions so many times
3079  * could take too long and make us miss the time to submit
3080  * the beacon to the target.
3081  *
3082  * So as a workaround we try to extend the TIM IE if there
3083  * is unicast buffered for stations with aid > 7 and fill it
3084  * in ourselves.
3085  */
3086 static void ath10k_wmi_update_tim(struct ath10k *ar,
3087 				  struct ath10k_vif *arvif,
3088 				  struct sk_buff *bcn,
3089 				  const struct wmi_tim_info_arg *tim_info)
3090 {
3091 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data;
3092 	struct ieee80211_tim_ie *tim;
3093 	u8 *ies, *ie;
3094 	u8 ie_len, pvm_len;
3095 	__le32 t;
3096 	u32 v, tim_len;
3097 
3098 	/* When FW reports 0 in tim_len, ensure atleast first byte
3099 	 * in tim_bitmap is considered for pvm calculation.
3100 	 */
3101 	tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1;
3102 
3103 	/* if next SWBA has no tim_changed the tim_bitmap is garbage.
3104 	 * we must copy the bitmap upon change and reuse it later */
3105 	if (__le32_to_cpu(tim_info->tim_changed)) {
3106 		int i;
3107 
3108 		if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) {
3109 			ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu",
3110 				    tim_len, sizeof(arvif->u.ap.tim_bitmap));
3111 			tim_len = sizeof(arvif->u.ap.tim_bitmap);
3112 		}
3113 
3114 		for (i = 0; i < tim_len; i++) {
3115 			t = tim_info->tim_bitmap[i / 4];
3116 			v = __le32_to_cpu(t);
3117 			arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
3118 		}
3119 
3120 		/* FW reports either length 0 or length based on max supported
3121 		 * station. so we calculate this on our own
3122 		 */
3123 		arvif->u.ap.tim_len = 0;
3124 		for (i = 0; i < tim_len; i++)
3125 			if (arvif->u.ap.tim_bitmap[i])
3126 				arvif->u.ap.tim_len = i;
3127 
3128 		arvif->u.ap.tim_len++;
3129 	}
3130 
3131 	ies = bcn->data;
3132 	ies += ieee80211_hdrlen(hdr->frame_control);
3133 	ies += 12; /* fixed parameters */
3134 
3135 	ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies,
3136 				    (u8 *)skb_tail_pointer(bcn) - ies);
3137 	if (!ie) {
3138 		if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3139 			ath10k_warn(ar, "no tim ie found;\n");
3140 		return;
3141 	}
3142 
3143 	tim = (void *)ie + 2;
3144 	ie_len = ie[1];
3145 	pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */
3146 
3147 	if (pvm_len < arvif->u.ap.tim_len) {
3148 		int expand_size = tim_len - pvm_len;
3149 		int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
3150 		void *next_ie = ie + 2 + ie_len;
3151 
3152 		if (skb_put(bcn, expand_size)) {
3153 			memmove(next_ie + expand_size, next_ie, move_size);
3154 
3155 			ie[1] += expand_size;
3156 			ie_len += expand_size;
3157 			pvm_len += expand_size;
3158 		} else {
3159 			ath10k_warn(ar, "tim expansion failed\n");
3160 		}
3161 	}
3162 
3163 	if (pvm_len > tim_len) {
3164 		ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len);
3165 		return;
3166 	}
3167 
3168 	tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast);
3169 	memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
3170 
3171 	if (tim->dtim_count == 0) {
3172 		ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO;
3173 
3174 		if (__le32_to_cpu(tim_info->tim_mcast) == 1)
3175 			ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB;
3176 	}
3177 
3178 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
3179 		   tim->dtim_count, tim->dtim_period,
3180 		   tim->bitmap_ctrl, pvm_len);
3181 }
3182 
3183 static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
3184 				  struct sk_buff *bcn,
3185 				  const struct wmi_p2p_noa_info *noa)
3186 {
3187 	if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3188 		return;
3189 
3190 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
3191 
3192 	if (noa->changed & WMI_P2P_NOA_CHANGED_BIT)
3193 		ath10k_p2p_noa_update(arvif, noa);
3194 
3195 	if (arvif->u.ap.noa_data)
3196 		if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
3197 			memcpy(skb_put(bcn, arvif->u.ap.noa_len),
3198 			       arvif->u.ap.noa_data,
3199 			       arvif->u.ap.noa_len);
3200 }
3201 
3202 static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
3203 				      struct wmi_swba_ev_arg *arg)
3204 {
3205 	struct wmi_host_swba_event *ev = (void *)skb->data;
3206 	u32 map;
3207 	size_t i;
3208 
3209 	if (skb->len < sizeof(*ev))
3210 		return -EPROTO;
3211 
3212 	skb_pull(skb, sizeof(*ev));
3213 	arg->vdev_map = ev->vdev_map;
3214 
3215 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3216 		if (!(map & BIT(0)))
3217 			continue;
3218 
3219 		/* If this happens there were some changes in firmware and
3220 		 * ath10k should update the max size of tim_info array.
3221 		 */
3222 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3223 			break;
3224 
3225 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3226 		     sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3227 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3228 			return -EPROTO;
3229 		}
3230 
3231 		arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3232 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3233 		arg->tim_info[i].tim_bitmap =
3234 				ev->bcn_info[i].tim_info.tim_bitmap;
3235 		arg->tim_info[i].tim_changed =
3236 				ev->bcn_info[i].tim_info.tim_changed;
3237 		arg->tim_info[i].tim_num_ps_pending =
3238 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
3239 
3240 		arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info;
3241 		i++;
3242 	}
3243 
3244 	return 0;
3245 }
3246 
3247 static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
3248 					   struct sk_buff *skb,
3249 					   struct wmi_swba_ev_arg *arg)
3250 {
3251 	struct wmi_10_4_host_swba_event *ev = (void *)skb->data;
3252 	u32 map, tim_len;
3253 	size_t i;
3254 
3255 	if (skb->len < sizeof(*ev))
3256 		return -EPROTO;
3257 
3258 	skb_pull(skb, sizeof(*ev));
3259 	arg->vdev_map = ev->vdev_map;
3260 
3261 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3262 		if (!(map & BIT(0)))
3263 			continue;
3264 
3265 		/* If this happens there were some changes in firmware and
3266 		 * ath10k should update the max size of tim_info array.
3267 		 */
3268 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3269 			break;
3270 
3271 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3272 		      sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3273 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3274 			return -EPROTO;
3275 		}
3276 
3277 		tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len);
3278 		if (tim_len) {
3279 			/* Exclude 4 byte guard length */
3280 			tim_len -= 4;
3281 			arg->tim_info[i].tim_len = __cpu_to_le32(tim_len);
3282 		} else {
3283 			arg->tim_info[i].tim_len = 0;
3284 		}
3285 
3286 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3287 		arg->tim_info[i].tim_bitmap =
3288 				ev->bcn_info[i].tim_info.tim_bitmap;
3289 		arg->tim_info[i].tim_changed =
3290 				ev->bcn_info[i].tim_info.tim_changed;
3291 		arg->tim_info[i].tim_num_ps_pending =
3292 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
3293 
3294 		/* 10.4 firmware doesn't have p2p support. notice of absence
3295 		 * info can be ignored for now.
3296 		 */
3297 
3298 		i++;
3299 	}
3300 
3301 	return 0;
3302 }
3303 
3304 static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar)
3305 {
3306 	return WMI_TXBF_CONF_BEFORE_ASSOC;
3307 }
3308 
3309 void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
3310 {
3311 	struct wmi_swba_ev_arg arg = {};
3312 	u32 map;
3313 	int i = -1;
3314 	const struct wmi_tim_info_arg *tim_info;
3315 	const struct wmi_p2p_noa_info *noa_info;
3316 	struct ath10k_vif *arvif;
3317 	struct sk_buff *bcn;
3318 	dma_addr_t paddr;
3319 	int ret, vdev_id = 0;
3320 
3321 	ret = ath10k_wmi_pull_swba(ar, skb, &arg);
3322 	if (ret) {
3323 		ath10k_warn(ar, "failed to parse swba event: %d\n", ret);
3324 		return;
3325 	}
3326 
3327 	map = __le32_to_cpu(arg.vdev_map);
3328 
3329 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
3330 		   map);
3331 
3332 	for (; map; map >>= 1, vdev_id++) {
3333 		if (!(map & 0x1))
3334 			continue;
3335 
3336 		i++;
3337 
3338 		if (i >= WMI_MAX_AP_VDEV) {
3339 			ath10k_warn(ar, "swba has corrupted vdev map\n");
3340 			break;
3341 		}
3342 
3343 		tim_info = &arg.tim_info[i];
3344 		noa_info = arg.noa_info[i];
3345 
3346 		ath10k_dbg(ar, ATH10K_DBG_MGMT,
3347 			   "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n",
3348 			   i,
3349 			   __le32_to_cpu(tim_info->tim_len),
3350 			   __le32_to_cpu(tim_info->tim_mcast),
3351 			   __le32_to_cpu(tim_info->tim_changed),
3352 			   __le32_to_cpu(tim_info->tim_num_ps_pending),
3353 			   __le32_to_cpu(tim_info->tim_bitmap[3]),
3354 			   __le32_to_cpu(tim_info->tim_bitmap[2]),
3355 			   __le32_to_cpu(tim_info->tim_bitmap[1]),
3356 			   __le32_to_cpu(tim_info->tim_bitmap[0]));
3357 
3358 		/* TODO: Only first 4 word from tim_bitmap is dumped.
3359 		 * Extend debug code to dump full tim_bitmap.
3360 		 */
3361 
3362 		arvif = ath10k_get_arvif(ar, vdev_id);
3363 		if (arvif == NULL) {
3364 			ath10k_warn(ar, "no vif for vdev_id %d found\n",
3365 				    vdev_id);
3366 			continue;
3367 		}
3368 
3369 		/* There are no completions for beacons so wait for next SWBA
3370 		 * before telling mac80211 to decrement CSA counter
3371 		 *
3372 		 * Once CSA counter is completed stop sending beacons until
3373 		 * actual channel switch is done */
3374 		if (arvif->vif->csa_active &&
3375 		    ieee80211_csa_is_complete(arvif->vif)) {
3376 			ieee80211_csa_finish(arvif->vif);
3377 			continue;
3378 		}
3379 
3380 		bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
3381 		if (!bcn) {
3382 			ath10k_warn(ar, "could not get mac80211 beacon\n");
3383 			continue;
3384 		}
3385 
3386 		ath10k_tx_h_seq_no(arvif->vif, bcn);
3387 		ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
3388 		ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);
3389 
3390 		spin_lock_bh(&ar->data_lock);
3391 
3392 		if (arvif->beacon) {
3393 			switch (arvif->beacon_state) {
3394 			case ATH10K_BEACON_SENT:
3395 				break;
3396 			case ATH10K_BEACON_SCHEDULED:
3397 				ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n",
3398 					    arvif->vdev_id);
3399 				break;
3400 			case ATH10K_BEACON_SENDING:
3401 				ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n",
3402 					    arvif->vdev_id);
3403 				dev_kfree_skb(bcn);
3404 				goto skip;
3405 			}
3406 
3407 			ath10k_mac_vif_beacon_free(arvif);
3408 		}
3409 
3410 		if (!arvif->beacon_buf) {
3411 			paddr = dma_map_single(arvif->ar->dev, bcn->data,
3412 					       bcn->len, DMA_TO_DEVICE);
3413 			ret = dma_mapping_error(arvif->ar->dev, paddr);
3414 			if (ret) {
3415 				ath10k_warn(ar, "failed to map beacon: %d\n",
3416 					    ret);
3417 				dev_kfree_skb_any(bcn);
3418 				ret = -EIO;
3419 				goto skip;
3420 			}
3421 
3422 			ATH10K_SKB_CB(bcn)->paddr = paddr;
3423 		} else {
3424 			if (bcn->len > IEEE80211_MAX_FRAME_LEN) {
3425 				ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n",
3426 					    bcn->len, IEEE80211_MAX_FRAME_LEN);
3427 				skb_trim(bcn, IEEE80211_MAX_FRAME_LEN);
3428 			}
3429 			memcpy(arvif->beacon_buf, bcn->data, bcn->len);
3430 			ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr;
3431 		}
3432 
3433 		arvif->beacon = bcn;
3434 		arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
3435 
3436 		trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
3437 		trace_ath10k_tx_payload(ar, bcn->data, bcn->len);
3438 
3439 skip:
3440 		spin_unlock_bh(&ar->data_lock);
3441 	}
3442 
3443 	ath10k_wmi_tx_beacons_nowait(ar);
3444 }
3445 
3446 void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb)
3447 {
3448 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
3449 }
3450 
3451 static void ath10k_dfs_radar_report(struct ath10k *ar,
3452 				    struct wmi_phyerr_ev_arg *phyerr,
3453 				    const struct phyerr_radar_report *rr,
3454 				    u64 tsf)
3455 {
3456 	u32 reg0, reg1, tsf32l;
3457 	struct ieee80211_channel *ch;
3458 	struct pulse_event pe;
3459 	u64 tsf64;
3460 	u8 rssi, width;
3461 
3462 	reg0 = __le32_to_cpu(rr->reg0);
3463 	reg1 = __le32_to_cpu(rr->reg1);
3464 
3465 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3466 		   "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n",
3467 		   MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP),
3468 		   MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH),
3469 		   MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN),
3470 		   MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF));
3471 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3472 		   "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n",
3473 		   MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK),
3474 		   MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX),
3475 		   MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID),
3476 		   MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN),
3477 		   MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK));
3478 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3479 		   "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n",
3480 		   MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET),
3481 		   MS(reg1, RADAR_REPORT_REG1_PULSE_DUR));
3482 
3483 	if (!ar->dfs_detector)
3484 		return;
3485 
3486 	spin_lock_bh(&ar->data_lock);
3487 	ch = ar->rx_channel;
3488 	spin_unlock_bh(&ar->data_lock);
3489 
3490 	if (!ch) {
3491 		ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n");
3492 		goto radar_detected;
3493 	}
3494 
3495 	/* report event to DFS pattern detector */
3496 	tsf32l = phyerr->tsf_timestamp;
3497 	tsf64 = tsf & (~0xFFFFFFFFULL);
3498 	tsf64 |= tsf32l;
3499 
3500 	width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
3501 	rssi = phyerr->rssi_combined;
3502 
3503 	/* hardware store this as 8 bit signed value,
3504 	 * set to zero if negative number
3505 	 */
3506 	if (rssi & 0x80)
3507 		rssi = 0;
3508 
3509 	pe.ts = tsf64;
3510 	pe.freq = ch->center_freq;
3511 	pe.width = width;
3512 	pe.rssi = rssi;
3513 	pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0);
3514 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3515 		   "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n",
3516 		   pe.freq, pe.width, pe.rssi, pe.ts);
3517 
3518 	ATH10K_DFS_STAT_INC(ar, pulses_detected);
3519 
3520 	if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe)) {
3521 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3522 			   "dfs no pulse pattern detected, yet\n");
3523 		return;
3524 	}
3525 
3526 radar_detected:
3527 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
3528 	ATH10K_DFS_STAT_INC(ar, radar_detected);
3529 
3530 	/* Control radar events reporting in debugfs file
3531 	   dfs_block_radar_events */
3532 	if (ar->dfs_block_radar_events) {
3533 		ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
3534 		return;
3535 	}
3536 
3537 	ieee80211_radar_detected(ar->hw);
3538 }
3539 
3540 static int ath10k_dfs_fft_report(struct ath10k *ar,
3541 				 struct wmi_phyerr_ev_arg *phyerr,
3542 				 const struct phyerr_fft_report *fftr,
3543 				 u64 tsf)
3544 {
3545 	u32 reg0, reg1;
3546 	u8 rssi, peak_mag;
3547 
3548 	reg0 = __le32_to_cpu(fftr->reg0);
3549 	reg1 = __le32_to_cpu(fftr->reg1);
3550 	rssi = phyerr->rssi_combined;
3551 
3552 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3553 		   "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
3554 		   MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB),
3555 		   MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB),
3556 		   MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX),
3557 		   MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX));
3558 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3559 		   "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n",
3560 		   MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB),
3561 		   MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB),
3562 		   MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG),
3563 		   MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB));
3564 
3565 	peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG);
3566 
3567 	/* false event detection */
3568 	if (rssi == DFS_RSSI_POSSIBLY_FALSE &&
3569 	    peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) {
3570 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
3571 		ATH10K_DFS_STAT_INC(ar, pulses_discarded);
3572 		return -EINVAL;
3573 	}
3574 
3575 	return 0;
3576 }
3577 
3578 void ath10k_wmi_event_dfs(struct ath10k *ar,
3579 			  struct wmi_phyerr_ev_arg *phyerr,
3580 			  u64 tsf)
3581 {
3582 	int buf_len, tlv_len, res, i = 0;
3583 	const struct phyerr_tlv *tlv;
3584 	const struct phyerr_radar_report *rr;
3585 	const struct phyerr_fft_report *fftr;
3586 	const u8 *tlv_buf;
3587 
3588 	buf_len = phyerr->buf_len;
3589 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3590 		   "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
3591 		   phyerr->phy_err_code, phyerr->rssi_combined,
3592 		   phyerr->tsf_timestamp, tsf, buf_len);
3593 
3594 	/* Skip event if DFS disabled */
3595 	if (!config_enabled(CONFIG_ATH10K_DFS_CERTIFIED))
3596 		return;
3597 
3598 	ATH10K_DFS_STAT_INC(ar, pulses_total);
3599 
3600 	while (i < buf_len) {
3601 		if (i + sizeof(*tlv) > buf_len) {
3602 			ath10k_warn(ar, "too short buf for tlv header (%d)\n",
3603 				    i);
3604 			return;
3605 		}
3606 
3607 		tlv = (struct phyerr_tlv *)&phyerr->buf[i];
3608 		tlv_len = __le16_to_cpu(tlv->len);
3609 		tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
3610 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3611 			   "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
3612 			   tlv_len, tlv->tag, tlv->sig);
3613 
3614 		switch (tlv->tag) {
3615 		case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY:
3616 			if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) {
3617 				ath10k_warn(ar, "too short radar pulse summary (%d)\n",
3618 					    i);
3619 				return;
3620 			}
3621 
3622 			rr = (struct phyerr_radar_report *)tlv_buf;
3623 			ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
3624 			break;
3625 		case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
3626 			if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
3627 				ath10k_warn(ar, "too short fft report (%d)\n",
3628 					    i);
3629 				return;
3630 			}
3631 
3632 			fftr = (struct phyerr_fft_report *)tlv_buf;
3633 			res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
3634 			if (res)
3635 				return;
3636 			break;
3637 		}
3638 
3639 		i += sizeof(*tlv) + tlv_len;
3640 	}
3641 }
3642 
3643 void ath10k_wmi_event_spectral_scan(struct ath10k *ar,
3644 				    struct wmi_phyerr_ev_arg *phyerr,
3645 				    u64 tsf)
3646 {
3647 	int buf_len, tlv_len, res, i = 0;
3648 	struct phyerr_tlv *tlv;
3649 	const void *tlv_buf;
3650 	const struct phyerr_fft_report *fftr;
3651 	size_t fftr_len;
3652 
3653 	buf_len = phyerr->buf_len;
3654 
3655 	while (i < buf_len) {
3656 		if (i + sizeof(*tlv) > buf_len) {
3657 			ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n",
3658 				    i);
3659 			return;
3660 		}
3661 
3662 		tlv = (struct phyerr_tlv *)&phyerr->buf[i];
3663 		tlv_len = __le16_to_cpu(tlv->len);
3664 		tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
3665 
3666 		if (i + sizeof(*tlv) + tlv_len > buf_len) {
3667 			ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
3668 				    i);
3669 			return;
3670 		}
3671 
3672 		switch (tlv->tag) {
3673 		case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
3674 			if (sizeof(*fftr) > tlv_len) {
3675 				ath10k_warn(ar, "failed to parse fft report at byte %d\n",
3676 					    i);
3677 				return;
3678 			}
3679 
3680 			fftr_len = tlv_len - sizeof(*fftr);
3681 			fftr = tlv_buf;
3682 			res = ath10k_spectral_process_fft(ar, phyerr,
3683 							  fftr, fftr_len,
3684 							  tsf);
3685 			if (res < 0) {
3686 				ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
3687 					   res);
3688 				return;
3689 			}
3690 			break;
3691 		}
3692 
3693 		i += sizeof(*tlv) + tlv_len;
3694 	}
3695 }
3696 
3697 static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar,
3698 					    struct sk_buff *skb,
3699 					    struct wmi_phyerr_hdr_arg *arg)
3700 {
3701 	struct wmi_phyerr_event *ev = (void *)skb->data;
3702 
3703 	if (skb->len < sizeof(*ev))
3704 		return -EPROTO;
3705 
3706 	arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs);
3707 	arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
3708 	arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
3709 	arg->buf_len = skb->len - sizeof(*ev);
3710 	arg->phyerrs = ev->phyerrs;
3711 
3712 	return 0;
3713 }
3714 
3715 static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar,
3716 						 struct sk_buff *skb,
3717 						 struct wmi_phyerr_hdr_arg *arg)
3718 {
3719 	struct wmi_10_4_phyerr_event *ev = (void *)skb->data;
3720 
3721 	if (skb->len < sizeof(*ev))
3722 		return -EPROTO;
3723 
3724 	/* 10.4 firmware always reports only one phyerr */
3725 	arg->num_phyerrs = 1;
3726 
3727 	arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
3728 	arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
3729 	arg->buf_len = skb->len;
3730 	arg->phyerrs = skb->data;
3731 
3732 	return 0;
3733 }
3734 
3735 int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar,
3736 				 const void *phyerr_buf,
3737 				 int left_len,
3738 				 struct wmi_phyerr_ev_arg *arg)
3739 {
3740 	const struct wmi_phyerr *phyerr = phyerr_buf;
3741 	int i;
3742 
3743 	if (left_len < sizeof(*phyerr)) {
3744 		ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
3745 			    left_len, sizeof(*phyerr));
3746 		return -EINVAL;
3747 	}
3748 
3749 	arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
3750 	arg->freq1 = __le16_to_cpu(phyerr->freq1);
3751 	arg->freq2 = __le16_to_cpu(phyerr->freq2);
3752 	arg->rssi_combined = phyerr->rssi_combined;
3753 	arg->chan_width_mhz = phyerr->chan_width_mhz;
3754 	arg->buf_len = __le32_to_cpu(phyerr->buf_len);
3755 	arg->buf = phyerr->buf;
3756 	arg->hdr_len = sizeof(*phyerr);
3757 
3758 	for (i = 0; i < 4; i++)
3759 		arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
3760 
3761 	switch (phyerr->phy_err_code) {
3762 	case PHY_ERROR_GEN_SPECTRAL_SCAN:
3763 		arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
3764 		break;
3765 	case PHY_ERROR_GEN_FALSE_RADAR_EXT:
3766 		arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT;
3767 		break;
3768 	case PHY_ERROR_GEN_RADAR:
3769 		arg->phy_err_code = PHY_ERROR_RADAR;
3770 		break;
3771 	default:
3772 		arg->phy_err_code = PHY_ERROR_UNKNOWN;
3773 		break;
3774 	}
3775 
3776 	return 0;
3777 }
3778 
3779 static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar,
3780 					     const void *phyerr_buf,
3781 					     int left_len,
3782 					     struct wmi_phyerr_ev_arg *arg)
3783 {
3784 	const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf;
3785 	u32 phy_err_mask;
3786 	int i;
3787 
3788 	if (left_len < sizeof(*phyerr)) {
3789 		ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
3790 			    left_len, sizeof(*phyerr));
3791 		return -EINVAL;
3792 	}
3793 
3794 	arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
3795 	arg->freq1 = __le16_to_cpu(phyerr->freq1);
3796 	arg->freq2 = __le16_to_cpu(phyerr->freq2);
3797 	arg->rssi_combined = phyerr->rssi_combined;
3798 	arg->chan_width_mhz = phyerr->chan_width_mhz;
3799 	arg->buf_len = __le32_to_cpu(phyerr->buf_len);
3800 	arg->buf = phyerr->buf;
3801 	arg->hdr_len = sizeof(*phyerr);
3802 
3803 	for (i = 0; i < 4; i++)
3804 		arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
3805 
3806 	phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]);
3807 
3808 	if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK)
3809 		arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
3810 	else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK)
3811 		arg->phy_err_code = PHY_ERROR_RADAR;
3812 	else
3813 		arg->phy_err_code = PHY_ERROR_UNKNOWN;
3814 
3815 	return 0;
3816 }
3817 
3818 void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
3819 {
3820 	struct wmi_phyerr_hdr_arg hdr_arg = {};
3821 	struct wmi_phyerr_ev_arg phyerr_arg = {};
3822 	const void *phyerr;
3823 	u32 count, i, buf_len, phy_err_code;
3824 	u64 tsf;
3825 	int left_len, ret;
3826 
3827 	ATH10K_DFS_STAT_INC(ar, phy_errors);
3828 
3829 	ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
3830 	if (ret) {
3831 		ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret);
3832 		return;
3833 	}
3834 
3835 	/* Check number of included events */
3836 	count = hdr_arg.num_phyerrs;
3837 
3838 	left_len = hdr_arg.buf_len;
3839 
3840 	tsf = hdr_arg.tsf_u32;
3841 	tsf <<= 32;
3842 	tsf |= hdr_arg.tsf_l32;
3843 
3844 	ath10k_dbg(ar, ATH10K_DBG_WMI,
3845 		   "wmi event phyerr count %d tsf64 0x%llX\n",
3846 		   count, tsf);
3847 
3848 	phyerr = hdr_arg.phyerrs;
3849 	for (i = 0; i < count; i++) {
3850 		ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
3851 		if (ret) {
3852 			ath10k_warn(ar, "failed to parse phyerr event (%d)\n",
3853 				    i);
3854 			return;
3855 		}
3856 
3857 		left_len -= phyerr_arg.hdr_len;
3858 		buf_len = phyerr_arg.buf_len;
3859 		phy_err_code = phyerr_arg.phy_err_code;
3860 
3861 		if (left_len < buf_len) {
3862 			ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
3863 			return;
3864 		}
3865 
3866 		left_len -= buf_len;
3867 
3868 		switch (phy_err_code) {
3869 		case PHY_ERROR_RADAR:
3870 			ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
3871 			break;
3872 		case PHY_ERROR_SPECTRAL_SCAN:
3873 			ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
3874 			break;
3875 		case PHY_ERROR_FALSE_RADAR_EXT:
3876 			ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
3877 			ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
3878 			break;
3879 		default:
3880 			break;
3881 		}
3882 
3883 		phyerr = phyerr + phyerr_arg.hdr_len + buf_len;
3884 	}
3885 }
3886 
3887 void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
3888 {
3889 	struct wmi_roam_ev_arg arg = {};
3890 	int ret;
3891 	u32 vdev_id;
3892 	u32 reason;
3893 	s32 rssi;
3894 
3895 	ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
3896 	if (ret) {
3897 		ath10k_warn(ar, "failed to parse roam event: %d\n", ret);
3898 		return;
3899 	}
3900 
3901 	vdev_id = __le32_to_cpu(arg.vdev_id);
3902 	reason = __le32_to_cpu(arg.reason);
3903 	rssi = __le32_to_cpu(arg.rssi);
3904 	rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT;
3905 
3906 	ath10k_dbg(ar, ATH10K_DBG_WMI,
3907 		   "wmi roam event vdev %u reason 0x%08x rssi %d\n",
3908 		   vdev_id, reason, rssi);
3909 
3910 	if (reason >= WMI_ROAM_REASON_MAX)
3911 		ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n",
3912 			    reason, vdev_id);
3913 
3914 	switch (reason) {
3915 	case WMI_ROAM_REASON_BEACON_MISS:
3916 		ath10k_mac_handle_beacon_miss(ar, vdev_id);
3917 		break;
3918 	case WMI_ROAM_REASON_BETTER_AP:
3919 	case WMI_ROAM_REASON_LOW_RSSI:
3920 	case WMI_ROAM_REASON_SUITABLE_AP_FOUND:
3921 	case WMI_ROAM_REASON_HO_FAILED:
3922 		ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n",
3923 			    reason, vdev_id);
3924 		break;
3925 	}
3926 }
3927 
3928 void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb)
3929 {
3930 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
3931 }
3932 
3933 void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb)
3934 {
3935 	char buf[101], c;
3936 	int i;
3937 
3938 	for (i = 0; i < sizeof(buf) - 1; i++) {
3939 		if (i >= skb->len)
3940 			break;
3941 
3942 		c = skb->data[i];
3943 
3944 		if (c == '\0')
3945 			break;
3946 
3947 		if (isascii(c) && isprint(c))
3948 			buf[i] = c;
3949 		else
3950 			buf[i] = '.';
3951 	}
3952 
3953 	if (i == sizeof(buf) - 1)
3954 		ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len);
3955 
3956 	/* for some reason the debug prints end with \n, remove that */
3957 	if (skb->data[i - 1] == '\n')
3958 		i--;
3959 
3960 	/* the last byte is always reserved for the null character */
3961 	buf[i] = '\0';
3962 
3963 	ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
3964 }
3965 
3966 void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
3967 {
3968 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
3969 }
3970 
3971 void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb)
3972 {
3973 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
3974 }
3975 
3976 void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
3977 					     struct sk_buff *skb)
3978 {
3979 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
3980 }
3981 
3982 void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
3983 					     struct sk_buff *skb)
3984 {
3985 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
3986 }
3987 
3988 void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb)
3989 {
3990 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
3991 }
3992 
3993 void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb)
3994 {
3995 	struct wmi_wow_ev_arg ev = {};
3996 	int ret;
3997 
3998 	complete(&ar->wow.wakeup_completed);
3999 
4000 	ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
4001 	if (ret) {
4002 		ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret);
4003 		return;
4004 	}
4005 
4006 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
4007 		   wow_reason(ev.wake_reason));
4008 }
4009 
4010 void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb)
4011 {
4012 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
4013 }
4014 
4015 static u8 ath10k_tpc_config_get_rate(struct ath10k *ar,
4016 				     struct wmi_pdev_tpc_config_event *ev,
4017 				     u32 rate_idx, u32 num_chains,
4018 				     u32 rate_code, u8 type)
4019 {
4020 	u8 tpc, num_streams, preamble, ch, stm_idx;
4021 
4022 	num_streams = ATH10K_HW_NSS(rate_code);
4023 	preamble = ATH10K_HW_PREAMBLE(rate_code);
4024 	ch = num_chains - 1;
4025 
4026 	tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]);
4027 
4028 	if (__le32_to_cpu(ev->num_tx_chain) <= 1)
4029 		goto out;
4030 
4031 	if (preamble == WMI_RATE_PREAMBLE_CCK)
4032 		goto out;
4033 
4034 	stm_idx = num_streams - 1;
4035 	if (num_chains <= num_streams)
4036 		goto out;
4037 
4038 	switch (type) {
4039 	case WMI_TPC_TABLE_TYPE_STBC:
4040 		tpc = min_t(u8, tpc,
4041 			    ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]);
4042 		break;
4043 	case WMI_TPC_TABLE_TYPE_TXBF:
4044 		tpc = min_t(u8, tpc,
4045 			    ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]);
4046 		break;
4047 	case WMI_TPC_TABLE_TYPE_CDD:
4048 		tpc = min_t(u8, tpc,
4049 			    ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]);
4050 		break;
4051 	default:
4052 		ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type);
4053 		tpc = 0;
4054 		break;
4055 	}
4056 
4057 out:
4058 	return tpc;
4059 }
4060 
4061 static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
4062 					  struct wmi_pdev_tpc_config_event *ev,
4063 					  struct ath10k_tpc_stats *tpc_stats,
4064 					  u8 *rate_code, u16 *pream_table, u8 type)
4065 {
4066 	u32 i, j, pream_idx, flags;
4067 	u8 tpc[WMI_TPC_TX_N_CHAIN];
4068 	char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
4069 	char buff[WMI_TPC_BUF_SIZE];
4070 
4071 	flags = __le32_to_cpu(ev->flags);
4072 
4073 	switch (type) {
4074 	case WMI_TPC_TABLE_TYPE_CDD:
4075 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
4076 			ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
4077 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4078 			return;
4079 		}
4080 		break;
4081 	case WMI_TPC_TABLE_TYPE_STBC:
4082 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
4083 			ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
4084 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4085 			return;
4086 		}
4087 		break;
4088 	case WMI_TPC_TABLE_TYPE_TXBF:
4089 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
4090 			ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
4091 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4092 			return;
4093 		}
4094 		break;
4095 	default:
4096 		ath10k_dbg(ar, ATH10K_DBG_WMI,
4097 			   "invalid table type in wmi tpc event: %d\n", type);
4098 		return;
4099 	}
4100 
4101 	pream_idx = 0;
4102 	for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
4103 		memset(tpc_value, 0, sizeof(tpc_value));
4104 		memset(buff, 0, sizeof(buff));
4105 		if (i == pream_table[pream_idx])
4106 			pream_idx++;
4107 
4108 		for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
4109 			if (j >= __le32_to_cpu(ev->num_tx_chain))
4110 				break;
4111 
4112 			tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
4113 							    rate_code[i],
4114 							    type);
4115 			snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
4116 			strncat(tpc_value, buff, strlen(buff));
4117 		}
4118 		tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
4119 		tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
4120 		memcpy(tpc_stats->tpc_table[type].tpc_value[i],
4121 		       tpc_value, sizeof(tpc_value));
4122 	}
4123 }
4124 
4125 void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb)
4126 {
4127 	u32 i, j, pream_idx, num_tx_chain;
4128 	u8 rate_code[WMI_TPC_RATE_MAX], rate_idx;
4129 	u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
4130 	struct wmi_pdev_tpc_config_event *ev;
4131 	struct ath10k_tpc_stats *tpc_stats;
4132 
4133 	ev = (struct wmi_pdev_tpc_config_event *)skb->data;
4134 
4135 	tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
4136 	if (!tpc_stats)
4137 		return;
4138 
4139 	/* Create the rate code table based on the chains supported */
4140 	rate_idx = 0;
4141 	pream_idx = 0;
4142 
4143 	/* Fill CCK rate code */
4144 	for (i = 0; i < 4; i++) {
4145 		rate_code[rate_idx] =
4146 			ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK);
4147 		rate_idx++;
4148 	}
4149 	pream_table[pream_idx] = rate_idx;
4150 	pream_idx++;
4151 
4152 	/* Fill OFDM rate code */
4153 	for (i = 0; i < 8; i++) {
4154 		rate_code[rate_idx] =
4155 			ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM);
4156 		rate_idx++;
4157 	}
4158 	pream_table[pream_idx] = rate_idx;
4159 	pream_idx++;
4160 
4161 	num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4162 
4163 	/* Fill HT20 rate code */
4164 	for (i = 0; i < num_tx_chain; i++) {
4165 		for (j = 0; j < 8; j++) {
4166 			rate_code[rate_idx] =
4167 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
4168 			rate_idx++;
4169 		}
4170 	}
4171 	pream_table[pream_idx] = rate_idx;
4172 	pream_idx++;
4173 
4174 	/* Fill HT40 rate code */
4175 	for (i = 0; i < num_tx_chain; i++) {
4176 		for (j = 0; j < 8; j++) {
4177 			rate_code[rate_idx] =
4178 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
4179 			rate_idx++;
4180 		}
4181 	}
4182 	pream_table[pream_idx] = rate_idx;
4183 	pream_idx++;
4184 
4185 	/* Fill VHT20 rate code */
4186 	for (i = 0; i < __le32_to_cpu(ev->num_tx_chain); i++) {
4187 		for (j = 0; j < 10; j++) {
4188 			rate_code[rate_idx] =
4189 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4190 			rate_idx++;
4191 		}
4192 	}
4193 	pream_table[pream_idx] = rate_idx;
4194 	pream_idx++;
4195 
4196 	/* Fill VHT40 rate code */
4197 	for (i = 0; i < num_tx_chain; i++) {
4198 		for (j = 0; j < 10; j++) {
4199 			rate_code[rate_idx] =
4200 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4201 			rate_idx++;
4202 		}
4203 	}
4204 	pream_table[pream_idx] = rate_idx;
4205 	pream_idx++;
4206 
4207 	/* Fill VHT80 rate code */
4208 	for (i = 0; i < num_tx_chain; i++) {
4209 		for (j = 0; j < 10; j++) {
4210 			rate_code[rate_idx] =
4211 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4212 			rate_idx++;
4213 		}
4214 	}
4215 	pream_table[pream_idx] = rate_idx;
4216 	pream_idx++;
4217 
4218 	rate_code[rate_idx++] =
4219 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
4220 	rate_code[rate_idx++] =
4221 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4222 	rate_code[rate_idx++] =
4223 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
4224 	rate_code[rate_idx++] =
4225 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4226 	rate_code[rate_idx++] =
4227 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4228 
4229 	pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END;
4230 
4231 	tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
4232 	tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
4233 	tpc_stats->ctl = __le32_to_cpu(ev->ctl);
4234 	tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
4235 	tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
4236 	tpc_stats->twice_antenna_reduction =
4237 		__le32_to_cpu(ev->twice_antenna_reduction);
4238 	tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
4239 	tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
4240 	tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4241 	tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
4242 
4243 	ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4244 				      rate_code, pream_table,
4245 				      WMI_TPC_TABLE_TYPE_CDD);
4246 	ath10k_tpc_config_disp_tables(ar, ev,  tpc_stats,
4247 				      rate_code, pream_table,
4248 				      WMI_TPC_TABLE_TYPE_STBC);
4249 	ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4250 				      rate_code, pream_table,
4251 				      WMI_TPC_TABLE_TYPE_TXBF);
4252 
4253 	ath10k_debug_tpc_stats_process(ar, tpc_stats);
4254 
4255 	ath10k_dbg(ar, ATH10K_DBG_WMI,
4256 		   "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",
4257 		   __le32_to_cpu(ev->chan_freq),
4258 		   __le32_to_cpu(ev->phy_mode),
4259 		   __le32_to_cpu(ev->ctl),
4260 		   __le32_to_cpu(ev->reg_domain),
4261 		   a_sle32_to_cpu(ev->twice_antenna_gain),
4262 		   __le32_to_cpu(ev->twice_antenna_reduction),
4263 		   __le32_to_cpu(ev->power_limit),
4264 		   __le32_to_cpu(ev->twice_max_rd_power) / 2,
4265 		   __le32_to_cpu(ev->num_tx_chain),
4266 		   __le32_to_cpu(ev->rate_max));
4267 }
4268 
4269 void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
4270 {
4271 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
4272 }
4273 
4274 void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb)
4275 {
4276 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
4277 }
4278 
4279 void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb)
4280 {
4281 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
4282 }
4283 
4284 void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb)
4285 {
4286 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
4287 }
4288 
4289 void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb)
4290 {
4291 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
4292 }
4293 
4294 void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
4295 						struct sk_buff *skb)
4296 {
4297 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
4298 }
4299 
4300 void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb)
4301 {
4302 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
4303 }
4304 
4305 void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb)
4306 {
4307 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
4308 }
4309 
4310 void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb)
4311 {
4312 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
4313 }
4314 
4315 static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
4316 				  u32 num_units, u32 unit_len)
4317 {
4318 	dma_addr_t paddr;
4319 	u32 pool_size = 0;
4320 	int idx = ar->wmi.num_mem_chunks;
4321 	void *vaddr = NULL;
4322 
4323 	if (ar->wmi.num_mem_chunks == ARRAY_SIZE(ar->wmi.mem_chunks))
4324 		return -ENOMEM;
4325 
4326 	while (!vaddr && num_units) {
4327 		pool_size = num_units * round_up(unit_len, 4);
4328 		if (!pool_size)
4329 			return -EINVAL;
4330 
4331 		vaddr = kzalloc(pool_size, GFP_KERNEL | __GFP_NOWARN);
4332 		if (!vaddr)
4333 			num_units /= 2;
4334 	}
4335 
4336 	if (!num_units)
4337 		return -ENOMEM;
4338 
4339 	paddr = dma_map_single(ar->dev, vaddr, pool_size, DMA_TO_DEVICE);
4340 	if (dma_mapping_error(ar->dev, paddr)) {
4341 		kfree(vaddr);
4342 		return -ENOMEM;
4343 	}
4344 
4345 	ar->wmi.mem_chunks[idx].vaddr = vaddr;
4346 	ar->wmi.mem_chunks[idx].paddr = paddr;
4347 	ar->wmi.mem_chunks[idx].len = pool_size;
4348 	ar->wmi.mem_chunks[idx].req_id = req_id;
4349 	ar->wmi.num_mem_chunks++;
4350 
4351 	return num_units;
4352 }
4353 
4354 static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
4355 				     u32 num_units, u32 unit_len)
4356 {
4357 	int ret;
4358 
4359 	while (num_units) {
4360 		ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len);
4361 		if (ret < 0)
4362 			return ret;
4363 
4364 		num_units -= ret;
4365 	}
4366 
4367 	return 0;
4368 }
4369 
4370 static bool
4371 ath10k_wmi_is_host_mem_allocated(struct ath10k *ar,
4372 				 const struct wlan_host_mem_req **mem_reqs,
4373 				 u32 num_mem_reqs)
4374 {
4375 	u32 req_id, num_units, unit_size, num_unit_info;
4376 	u32 pool_size;
4377 	int i, j;
4378 	bool found;
4379 
4380 	if (ar->wmi.num_mem_chunks != num_mem_reqs)
4381 		return false;
4382 
4383 	for (i = 0; i < num_mem_reqs; ++i) {
4384 		req_id = __le32_to_cpu(mem_reqs[i]->req_id);
4385 		num_units = __le32_to_cpu(mem_reqs[i]->num_units);
4386 		unit_size = __le32_to_cpu(mem_reqs[i]->unit_size);
4387 		num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info);
4388 
4389 		if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
4390 			if (ar->num_active_peers)
4391 				num_units = ar->num_active_peers + 1;
4392 			else
4393 				num_units = ar->max_num_peers + 1;
4394 		} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4395 			num_units = ar->max_num_peers + 1;
4396 		} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
4397 			num_units = ar->max_num_vdevs + 1;
4398 		}
4399 
4400 		found = false;
4401 		for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
4402 			if (ar->wmi.mem_chunks[j].req_id == req_id) {
4403 				pool_size = num_units * round_up(unit_size, 4);
4404 				if (ar->wmi.mem_chunks[j].len == pool_size) {
4405 					found = true;
4406 					break;
4407 				}
4408 			}
4409 		}
4410 		if (!found)
4411 			return false;
4412 	}
4413 
4414 	return true;
4415 }
4416 
4417 static int
4418 ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
4419 				   struct wmi_svc_rdy_ev_arg *arg)
4420 {
4421 	struct wmi_service_ready_event *ev;
4422 	size_t i, n;
4423 
4424 	if (skb->len < sizeof(*ev))
4425 		return -EPROTO;
4426 
4427 	ev = (void *)skb->data;
4428 	skb_pull(skb, sizeof(*ev));
4429 	arg->min_tx_power = ev->hw_min_tx_power;
4430 	arg->max_tx_power = ev->hw_max_tx_power;
4431 	arg->ht_cap = ev->ht_cap_info;
4432 	arg->vht_cap = ev->vht_cap_info;
4433 	arg->sw_ver0 = ev->sw_version;
4434 	arg->sw_ver1 = ev->sw_version_1;
4435 	arg->phy_capab = ev->phy_capability;
4436 	arg->num_rf_chains = ev->num_rf_chains;
4437 	arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
4438 	arg->num_mem_reqs = ev->num_mem_reqs;
4439 	arg->service_map = ev->wmi_service_bitmap;
4440 	arg->service_map_len = sizeof(ev->wmi_service_bitmap);
4441 
4442 	n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
4443 		  ARRAY_SIZE(arg->mem_reqs));
4444 	for (i = 0; i < n; i++)
4445 		arg->mem_reqs[i] = &ev->mem_reqs[i];
4446 
4447 	if (skb->len <
4448 	    __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
4449 		return -EPROTO;
4450 
4451 	return 0;
4452 }
4453 
4454 static int
4455 ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
4456 				  struct wmi_svc_rdy_ev_arg *arg)
4457 {
4458 	struct wmi_10x_service_ready_event *ev;
4459 	int i, n;
4460 
4461 	if (skb->len < sizeof(*ev))
4462 		return -EPROTO;
4463 
4464 	ev = (void *)skb->data;
4465 	skb_pull(skb, sizeof(*ev));
4466 	arg->min_tx_power = ev->hw_min_tx_power;
4467 	arg->max_tx_power = ev->hw_max_tx_power;
4468 	arg->ht_cap = ev->ht_cap_info;
4469 	arg->vht_cap = ev->vht_cap_info;
4470 	arg->sw_ver0 = ev->sw_version;
4471 	arg->phy_capab = ev->phy_capability;
4472 	arg->num_rf_chains = ev->num_rf_chains;
4473 	arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
4474 	arg->num_mem_reqs = ev->num_mem_reqs;
4475 	arg->service_map = ev->wmi_service_bitmap;
4476 	arg->service_map_len = sizeof(ev->wmi_service_bitmap);
4477 
4478 	n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
4479 		  ARRAY_SIZE(arg->mem_reqs));
4480 	for (i = 0; i < n; i++)
4481 		arg->mem_reqs[i] = &ev->mem_reqs[i];
4482 
4483 	if (skb->len <
4484 	    __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
4485 		return -EPROTO;
4486 
4487 	return 0;
4488 }
4489 
4490 static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
4491 {
4492 	struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work);
4493 	struct sk_buff *skb = ar->svc_rdy_skb;
4494 	struct wmi_svc_rdy_ev_arg arg = {};
4495 	u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
4496 	int ret;
4497 	bool allocated;
4498 
4499 	if (!skb) {
4500 		ath10k_warn(ar, "invalid service ready event skb\n");
4501 		return;
4502 	}
4503 
4504 	ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg);
4505 	if (ret) {
4506 		ath10k_warn(ar, "failed to parse service ready: %d\n", ret);
4507 		return;
4508 	}
4509 
4510 	memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
4511 	ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
4512 			   arg.service_map_len);
4513 
4514 	ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power);
4515 	ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power);
4516 	ar->ht_cap_info = __le32_to_cpu(arg.ht_cap);
4517 	ar->vht_cap_info = __le32_to_cpu(arg.vht_cap);
4518 	ar->fw_version_major =
4519 		(__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24;
4520 	ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff);
4521 	ar->fw_version_release =
4522 		(__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16;
4523 	ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff);
4524 	ar->phy_capability = __le32_to_cpu(arg.phy_capab);
4525 	ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains);
4526 	ar->ath_common.regulatory.current_rd = __le32_to_cpu(arg.eeprom_rd);
4527 
4528 	ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
4529 			arg.service_map, arg.service_map_len);
4530 
4531 	/* only manually set fw features when not using FW IE format */
4532 	if (ar->fw_api == 1 && ar->fw_version_build > 636)
4533 		set_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features);
4534 
4535 	if (ar->num_rf_chains > ar->max_spatial_stream) {
4536 		ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n",
4537 			    ar->num_rf_chains, ar->max_spatial_stream);
4538 		ar->num_rf_chains = ar->max_spatial_stream;
4539 	}
4540 
4541 	if (!ar->cfg_tx_chainmask) {
4542 		ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
4543 		ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
4544 	}
4545 
4546 	if (strlen(ar->hw->wiphy->fw_version) == 0) {
4547 		snprintf(ar->hw->wiphy->fw_version,
4548 			 sizeof(ar->hw->wiphy->fw_version),
4549 			 "%u.%u.%u.%u",
4550 			 ar->fw_version_major,
4551 			 ar->fw_version_minor,
4552 			 ar->fw_version_release,
4553 			 ar->fw_version_build);
4554 	}
4555 
4556 	num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs);
4557 	if (num_mem_reqs > WMI_MAX_MEM_REQS) {
4558 		ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n",
4559 			    num_mem_reqs);
4560 		return;
4561 	}
4562 
4563 	if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) {
4564 		ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
4565 				    TARGET_10_4_NUM_VDEVS;
4566 		ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
4567 				       TARGET_10_4_NUM_VDEVS;
4568 		ar->num_tids = ar->num_active_peers * 2;
4569 		ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
4570 	}
4571 
4572 	/* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE
4573 	 * and WMI_SERVICE_IRAM_TIDS, etc.
4574 	 */
4575 
4576 	allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
4577 						     num_mem_reqs);
4578 	if (allocated)
4579 		goto skip_mem_alloc;
4580 
4581 	/* Either this event is received during boot time or there is a change
4582 	 * in memory requirement from firmware when compared to last request.
4583 	 * Free any old memory and do a fresh allocation based on the current
4584 	 * memory requirement.
4585 	 */
4586 	ath10k_wmi_free_host_mem(ar);
4587 
4588 	for (i = 0; i < num_mem_reqs; ++i) {
4589 		req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id);
4590 		num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units);
4591 		unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size);
4592 		num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info);
4593 
4594 		if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
4595 			if (ar->num_active_peers)
4596 				num_units = ar->num_active_peers + 1;
4597 			else
4598 				num_units = ar->max_num_peers + 1;
4599 		} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4600 			/* number of units to allocate is number of
4601 			 * peers, 1 extra for self peer on target */
4602 			/* this needs to be tied, host and target
4603 			 * can get out of sync */
4604 			num_units = ar->max_num_peers + 1;
4605 		} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
4606 			num_units = ar->max_num_vdevs + 1;
4607 		}
4608 
4609 		ath10k_dbg(ar, ATH10K_DBG_WMI,
4610 			   "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
4611 			   req_id,
4612 			   __le32_to_cpu(arg.mem_reqs[i]->num_units),
4613 			   num_unit_info,
4614 			   unit_size,
4615 			   num_units);
4616 
4617 		ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
4618 						unit_size);
4619 		if (ret)
4620 			return;
4621 	}
4622 
4623 skip_mem_alloc:
4624 	ath10k_dbg(ar, ATH10K_DBG_WMI,
4625 		   "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",
4626 		   __le32_to_cpu(arg.min_tx_power),
4627 		   __le32_to_cpu(arg.max_tx_power),
4628 		   __le32_to_cpu(arg.ht_cap),
4629 		   __le32_to_cpu(arg.vht_cap),
4630 		   __le32_to_cpu(arg.sw_ver0),
4631 		   __le32_to_cpu(arg.sw_ver1),
4632 		   __le32_to_cpu(arg.fw_build),
4633 		   __le32_to_cpu(arg.phy_capab),
4634 		   __le32_to_cpu(arg.num_rf_chains),
4635 		   __le32_to_cpu(arg.eeprom_rd),
4636 		   __le32_to_cpu(arg.num_mem_reqs));
4637 
4638 	dev_kfree_skb(skb);
4639 	ar->svc_rdy_skb = NULL;
4640 	complete(&ar->wmi.service_ready);
4641 }
4642 
4643 void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb)
4644 {
4645 	ar->svc_rdy_skb = skb;
4646 	queue_work(ar->workqueue_aux, &ar->svc_rdy_work);
4647 }
4648 
4649 static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
4650 				     struct wmi_rdy_ev_arg *arg)
4651 {
4652 	struct wmi_ready_event *ev = (void *)skb->data;
4653 
4654 	if (skb->len < sizeof(*ev))
4655 		return -EPROTO;
4656 
4657 	skb_pull(skb, sizeof(*ev));
4658 	arg->sw_version = ev->sw_version;
4659 	arg->abi_version = ev->abi_version;
4660 	arg->status = ev->status;
4661 	arg->mac_addr = ev->mac_addr.addr;
4662 
4663 	return 0;
4664 }
4665 
4666 static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
4667 				      struct wmi_roam_ev_arg *arg)
4668 {
4669 	struct wmi_roam_ev *ev = (void *)skb->data;
4670 
4671 	if (skb->len < sizeof(*ev))
4672 		return -EPROTO;
4673 
4674 	skb_pull(skb, sizeof(*ev));
4675 	arg->vdev_id = ev->vdev_id;
4676 	arg->reason = ev->reason;
4677 
4678 	return 0;
4679 }
4680 
4681 int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb)
4682 {
4683 	struct wmi_rdy_ev_arg arg = {};
4684 	int ret;
4685 
4686 	ret = ath10k_wmi_pull_rdy(ar, skb, &arg);
4687 	if (ret) {
4688 		ath10k_warn(ar, "failed to parse ready event: %d\n", ret);
4689 		return ret;
4690 	}
4691 
4692 	ath10k_dbg(ar, ATH10K_DBG_WMI,
4693 		   "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
4694 		   __le32_to_cpu(arg.sw_version),
4695 		   __le32_to_cpu(arg.abi_version),
4696 		   arg.mac_addr,
4697 		   __le32_to_cpu(arg.status));
4698 
4699 	ether_addr_copy(ar->mac_addr, arg.mac_addr);
4700 	complete(&ar->wmi.unified_ready);
4701 	return 0;
4702 }
4703 
4704 static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
4705 {
4706 	const struct wmi_pdev_temperature_event *ev;
4707 
4708 	ev = (struct wmi_pdev_temperature_event *)skb->data;
4709 	if (WARN_ON(skb->len < sizeof(*ev)))
4710 		return -EPROTO;
4711 
4712 	ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature));
4713 	return 0;
4714 }
4715 
4716 static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb)
4717 {
4718 	struct wmi_cmd_hdr *cmd_hdr;
4719 	enum wmi_event_id id;
4720 
4721 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
4722 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
4723 
4724 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
4725 		goto out;
4726 
4727 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
4728 
4729 	switch (id) {
4730 	case WMI_MGMT_RX_EVENTID:
4731 		ath10k_wmi_event_mgmt_rx(ar, skb);
4732 		/* mgmt_rx() owns the skb now! */
4733 		return;
4734 	case WMI_SCAN_EVENTID:
4735 		ath10k_wmi_event_scan(ar, skb);
4736 		break;
4737 	case WMI_CHAN_INFO_EVENTID:
4738 		ath10k_wmi_event_chan_info(ar, skb);
4739 		break;
4740 	case WMI_ECHO_EVENTID:
4741 		ath10k_wmi_event_echo(ar, skb);
4742 		break;
4743 	case WMI_DEBUG_MESG_EVENTID:
4744 		ath10k_wmi_event_debug_mesg(ar, skb);
4745 		break;
4746 	case WMI_UPDATE_STATS_EVENTID:
4747 		ath10k_wmi_event_update_stats(ar, skb);
4748 		break;
4749 	case WMI_VDEV_START_RESP_EVENTID:
4750 		ath10k_wmi_event_vdev_start_resp(ar, skb);
4751 		break;
4752 	case WMI_VDEV_STOPPED_EVENTID:
4753 		ath10k_wmi_event_vdev_stopped(ar, skb);
4754 		break;
4755 	case WMI_PEER_STA_KICKOUT_EVENTID:
4756 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
4757 		break;
4758 	case WMI_HOST_SWBA_EVENTID:
4759 		ath10k_wmi_event_host_swba(ar, skb);
4760 		break;
4761 	case WMI_TBTTOFFSET_UPDATE_EVENTID:
4762 		ath10k_wmi_event_tbttoffset_update(ar, skb);
4763 		break;
4764 	case WMI_PHYERR_EVENTID:
4765 		ath10k_wmi_event_phyerr(ar, skb);
4766 		break;
4767 	case WMI_ROAM_EVENTID:
4768 		ath10k_wmi_event_roam(ar, skb);
4769 		break;
4770 	case WMI_PROFILE_MATCH:
4771 		ath10k_wmi_event_profile_match(ar, skb);
4772 		break;
4773 	case WMI_DEBUG_PRINT_EVENTID:
4774 		ath10k_wmi_event_debug_print(ar, skb);
4775 		break;
4776 	case WMI_PDEV_QVIT_EVENTID:
4777 		ath10k_wmi_event_pdev_qvit(ar, skb);
4778 		break;
4779 	case WMI_WLAN_PROFILE_DATA_EVENTID:
4780 		ath10k_wmi_event_wlan_profile_data(ar, skb);
4781 		break;
4782 	case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
4783 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
4784 		break;
4785 	case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
4786 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
4787 		break;
4788 	case WMI_RTT_ERROR_REPORT_EVENTID:
4789 		ath10k_wmi_event_rtt_error_report(ar, skb);
4790 		break;
4791 	case WMI_WOW_WAKEUP_HOST_EVENTID:
4792 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
4793 		break;
4794 	case WMI_DCS_INTERFERENCE_EVENTID:
4795 		ath10k_wmi_event_dcs_interference(ar, skb);
4796 		break;
4797 	case WMI_PDEV_TPC_CONFIG_EVENTID:
4798 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
4799 		break;
4800 	case WMI_PDEV_FTM_INTG_EVENTID:
4801 		ath10k_wmi_event_pdev_ftm_intg(ar, skb);
4802 		break;
4803 	case WMI_GTK_OFFLOAD_STATUS_EVENTID:
4804 		ath10k_wmi_event_gtk_offload_status(ar, skb);
4805 		break;
4806 	case WMI_GTK_REKEY_FAIL_EVENTID:
4807 		ath10k_wmi_event_gtk_rekey_fail(ar, skb);
4808 		break;
4809 	case WMI_TX_DELBA_COMPLETE_EVENTID:
4810 		ath10k_wmi_event_delba_complete(ar, skb);
4811 		break;
4812 	case WMI_TX_ADDBA_COMPLETE_EVENTID:
4813 		ath10k_wmi_event_addba_complete(ar, skb);
4814 		break;
4815 	case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
4816 		ath10k_wmi_event_vdev_install_key_complete(ar, skb);
4817 		break;
4818 	case WMI_SERVICE_READY_EVENTID:
4819 		ath10k_wmi_event_service_ready(ar, skb);
4820 		return;
4821 	case WMI_READY_EVENTID:
4822 		ath10k_wmi_event_ready(ar, skb);
4823 		break;
4824 	default:
4825 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
4826 		break;
4827 	}
4828 
4829 out:
4830 	dev_kfree_skb(skb);
4831 }
4832 
4833 static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb)
4834 {
4835 	struct wmi_cmd_hdr *cmd_hdr;
4836 	enum wmi_10x_event_id id;
4837 	bool consumed;
4838 
4839 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
4840 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
4841 
4842 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
4843 		goto out;
4844 
4845 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
4846 
4847 	consumed = ath10k_tm_event_wmi(ar, id, skb);
4848 
4849 	/* Ready event must be handled normally also in UTF mode so that we
4850 	 * know the UTF firmware has booted, others we are just bypass WMI
4851 	 * events to testmode.
4852 	 */
4853 	if (consumed && id != WMI_10X_READY_EVENTID) {
4854 		ath10k_dbg(ar, ATH10K_DBG_WMI,
4855 			   "wmi testmode consumed 0x%x\n", id);
4856 		goto out;
4857 	}
4858 
4859 	switch (id) {
4860 	case WMI_10X_MGMT_RX_EVENTID:
4861 		ath10k_wmi_event_mgmt_rx(ar, skb);
4862 		/* mgmt_rx() owns the skb now! */
4863 		return;
4864 	case WMI_10X_SCAN_EVENTID:
4865 		ath10k_wmi_event_scan(ar, skb);
4866 		break;
4867 	case WMI_10X_CHAN_INFO_EVENTID:
4868 		ath10k_wmi_event_chan_info(ar, skb);
4869 		break;
4870 	case WMI_10X_ECHO_EVENTID:
4871 		ath10k_wmi_event_echo(ar, skb);
4872 		break;
4873 	case WMI_10X_DEBUG_MESG_EVENTID:
4874 		ath10k_wmi_event_debug_mesg(ar, skb);
4875 		break;
4876 	case WMI_10X_UPDATE_STATS_EVENTID:
4877 		ath10k_wmi_event_update_stats(ar, skb);
4878 		break;
4879 	case WMI_10X_VDEV_START_RESP_EVENTID:
4880 		ath10k_wmi_event_vdev_start_resp(ar, skb);
4881 		break;
4882 	case WMI_10X_VDEV_STOPPED_EVENTID:
4883 		ath10k_wmi_event_vdev_stopped(ar, skb);
4884 		break;
4885 	case WMI_10X_PEER_STA_KICKOUT_EVENTID:
4886 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
4887 		break;
4888 	case WMI_10X_HOST_SWBA_EVENTID:
4889 		ath10k_wmi_event_host_swba(ar, skb);
4890 		break;
4891 	case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
4892 		ath10k_wmi_event_tbttoffset_update(ar, skb);
4893 		break;
4894 	case WMI_10X_PHYERR_EVENTID:
4895 		ath10k_wmi_event_phyerr(ar, skb);
4896 		break;
4897 	case WMI_10X_ROAM_EVENTID:
4898 		ath10k_wmi_event_roam(ar, skb);
4899 		break;
4900 	case WMI_10X_PROFILE_MATCH:
4901 		ath10k_wmi_event_profile_match(ar, skb);
4902 		break;
4903 	case WMI_10X_DEBUG_PRINT_EVENTID:
4904 		ath10k_wmi_event_debug_print(ar, skb);
4905 		break;
4906 	case WMI_10X_PDEV_QVIT_EVENTID:
4907 		ath10k_wmi_event_pdev_qvit(ar, skb);
4908 		break;
4909 	case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
4910 		ath10k_wmi_event_wlan_profile_data(ar, skb);
4911 		break;
4912 	case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
4913 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
4914 		break;
4915 	case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
4916 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
4917 		break;
4918 	case WMI_10X_RTT_ERROR_REPORT_EVENTID:
4919 		ath10k_wmi_event_rtt_error_report(ar, skb);
4920 		break;
4921 	case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
4922 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
4923 		break;
4924 	case WMI_10X_DCS_INTERFERENCE_EVENTID:
4925 		ath10k_wmi_event_dcs_interference(ar, skb);
4926 		break;
4927 	case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
4928 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
4929 		break;
4930 	case WMI_10X_INST_RSSI_STATS_EVENTID:
4931 		ath10k_wmi_event_inst_rssi_stats(ar, skb);
4932 		break;
4933 	case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
4934 		ath10k_wmi_event_vdev_standby_req(ar, skb);
4935 		break;
4936 	case WMI_10X_VDEV_RESUME_REQ_EVENTID:
4937 		ath10k_wmi_event_vdev_resume_req(ar, skb);
4938 		break;
4939 	case WMI_10X_SERVICE_READY_EVENTID:
4940 		ath10k_wmi_event_service_ready(ar, skb);
4941 		return;
4942 	case WMI_10X_READY_EVENTID:
4943 		ath10k_wmi_event_ready(ar, skb);
4944 		break;
4945 	case WMI_10X_PDEV_UTF_EVENTID:
4946 		/* ignore utf events */
4947 		break;
4948 	default:
4949 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
4950 		break;
4951 	}
4952 
4953 out:
4954 	dev_kfree_skb(skb);
4955 }
4956 
4957 static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
4958 {
4959 	struct wmi_cmd_hdr *cmd_hdr;
4960 	enum wmi_10_2_event_id id;
4961 
4962 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
4963 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
4964 
4965 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
4966 		goto out;
4967 
4968 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
4969 
4970 	switch (id) {
4971 	case WMI_10_2_MGMT_RX_EVENTID:
4972 		ath10k_wmi_event_mgmt_rx(ar, skb);
4973 		/* mgmt_rx() owns the skb now! */
4974 		return;
4975 	case WMI_10_2_SCAN_EVENTID:
4976 		ath10k_wmi_event_scan(ar, skb);
4977 		break;
4978 	case WMI_10_2_CHAN_INFO_EVENTID:
4979 		ath10k_wmi_event_chan_info(ar, skb);
4980 		break;
4981 	case WMI_10_2_ECHO_EVENTID:
4982 		ath10k_wmi_event_echo(ar, skb);
4983 		break;
4984 	case WMI_10_2_DEBUG_MESG_EVENTID:
4985 		ath10k_wmi_event_debug_mesg(ar, skb);
4986 		break;
4987 	case WMI_10_2_UPDATE_STATS_EVENTID:
4988 		ath10k_wmi_event_update_stats(ar, skb);
4989 		break;
4990 	case WMI_10_2_VDEV_START_RESP_EVENTID:
4991 		ath10k_wmi_event_vdev_start_resp(ar, skb);
4992 		break;
4993 	case WMI_10_2_VDEV_STOPPED_EVENTID:
4994 		ath10k_wmi_event_vdev_stopped(ar, skb);
4995 		break;
4996 	case WMI_10_2_PEER_STA_KICKOUT_EVENTID:
4997 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
4998 		break;
4999 	case WMI_10_2_HOST_SWBA_EVENTID:
5000 		ath10k_wmi_event_host_swba(ar, skb);
5001 		break;
5002 	case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID:
5003 		ath10k_wmi_event_tbttoffset_update(ar, skb);
5004 		break;
5005 	case WMI_10_2_PHYERR_EVENTID:
5006 		ath10k_wmi_event_phyerr(ar, skb);
5007 		break;
5008 	case WMI_10_2_ROAM_EVENTID:
5009 		ath10k_wmi_event_roam(ar, skb);
5010 		break;
5011 	case WMI_10_2_PROFILE_MATCH:
5012 		ath10k_wmi_event_profile_match(ar, skb);
5013 		break;
5014 	case WMI_10_2_DEBUG_PRINT_EVENTID:
5015 		ath10k_wmi_event_debug_print(ar, skb);
5016 		break;
5017 	case WMI_10_2_PDEV_QVIT_EVENTID:
5018 		ath10k_wmi_event_pdev_qvit(ar, skb);
5019 		break;
5020 	case WMI_10_2_WLAN_PROFILE_DATA_EVENTID:
5021 		ath10k_wmi_event_wlan_profile_data(ar, skb);
5022 		break;
5023 	case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID:
5024 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
5025 		break;
5026 	case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID:
5027 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
5028 		break;
5029 	case WMI_10_2_RTT_ERROR_REPORT_EVENTID:
5030 		ath10k_wmi_event_rtt_error_report(ar, skb);
5031 		break;
5032 	case WMI_10_2_WOW_WAKEUP_HOST_EVENTID:
5033 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
5034 		break;
5035 	case WMI_10_2_DCS_INTERFERENCE_EVENTID:
5036 		ath10k_wmi_event_dcs_interference(ar, skb);
5037 		break;
5038 	case WMI_10_2_PDEV_TPC_CONFIG_EVENTID:
5039 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
5040 		break;
5041 	case WMI_10_2_INST_RSSI_STATS_EVENTID:
5042 		ath10k_wmi_event_inst_rssi_stats(ar, skb);
5043 		break;
5044 	case WMI_10_2_VDEV_STANDBY_REQ_EVENTID:
5045 		ath10k_wmi_event_vdev_standby_req(ar, skb);
5046 		break;
5047 	case WMI_10_2_VDEV_RESUME_REQ_EVENTID:
5048 		ath10k_wmi_event_vdev_resume_req(ar, skb);
5049 		break;
5050 	case WMI_10_2_SERVICE_READY_EVENTID:
5051 		ath10k_wmi_event_service_ready(ar, skb);
5052 		return;
5053 	case WMI_10_2_READY_EVENTID:
5054 		ath10k_wmi_event_ready(ar, skb);
5055 		break;
5056 	case WMI_10_2_PDEV_TEMPERATURE_EVENTID:
5057 		ath10k_wmi_event_temperature(ar, skb);
5058 		break;
5059 	case WMI_10_2_RTT_KEEPALIVE_EVENTID:
5060 	case WMI_10_2_GPIO_INPUT_EVENTID:
5061 	case WMI_10_2_PEER_RATECODE_LIST_EVENTID:
5062 	case WMI_10_2_GENERIC_BUFFER_EVENTID:
5063 	case WMI_10_2_MCAST_BUF_RELEASE_EVENTID:
5064 	case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID:
5065 	case WMI_10_2_WDS_PEER_EVENTID:
5066 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5067 			   "received event id %d not implemented\n", id);
5068 		break;
5069 	default:
5070 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
5071 		break;
5072 	}
5073 
5074 out:
5075 	dev_kfree_skb(skb);
5076 }
5077 
5078 static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
5079 {
5080 	struct wmi_cmd_hdr *cmd_hdr;
5081 	enum wmi_10_4_event_id id;
5082 
5083 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5084 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5085 
5086 	if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr)))
5087 		goto out;
5088 
5089 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5090 
5091 	switch (id) {
5092 	case WMI_10_4_MGMT_RX_EVENTID:
5093 		ath10k_wmi_event_mgmt_rx(ar, skb);
5094 		/* mgmt_rx() owns the skb now! */
5095 		return;
5096 	case WMI_10_4_ECHO_EVENTID:
5097 		ath10k_wmi_event_echo(ar, skb);
5098 		break;
5099 	case WMI_10_4_DEBUG_MESG_EVENTID:
5100 		ath10k_wmi_event_debug_mesg(ar, skb);
5101 		break;
5102 	case WMI_10_4_SERVICE_READY_EVENTID:
5103 		ath10k_wmi_event_service_ready(ar, skb);
5104 		return;
5105 	case WMI_10_4_SCAN_EVENTID:
5106 		ath10k_wmi_event_scan(ar, skb);
5107 		break;
5108 	case WMI_10_4_CHAN_INFO_EVENTID:
5109 		ath10k_wmi_event_chan_info(ar, skb);
5110 		break;
5111 	case WMI_10_4_PHYERR_EVENTID:
5112 		ath10k_wmi_event_phyerr(ar, skb);
5113 		break;
5114 	case WMI_10_4_READY_EVENTID:
5115 		ath10k_wmi_event_ready(ar, skb);
5116 		break;
5117 	case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
5118 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
5119 		break;
5120 	case WMI_10_4_HOST_SWBA_EVENTID:
5121 		ath10k_wmi_event_host_swba(ar, skb);
5122 		break;
5123 	case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID:
5124 		ath10k_wmi_event_tbttoffset_update(ar, skb);
5125 		break;
5126 	case WMI_10_4_DEBUG_PRINT_EVENTID:
5127 		ath10k_wmi_event_debug_print(ar, skb);
5128 		break;
5129 	case WMI_10_4_VDEV_START_RESP_EVENTID:
5130 		ath10k_wmi_event_vdev_start_resp(ar, skb);
5131 		break;
5132 	case WMI_10_4_VDEV_STOPPED_EVENTID:
5133 		ath10k_wmi_event_vdev_stopped(ar, skb);
5134 		break;
5135 	case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
5136 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5137 			   "received event id %d not implemented\n", id);
5138 		break;
5139 	case WMI_10_4_UPDATE_STATS_EVENTID:
5140 		ath10k_wmi_event_update_stats(ar, skb);
5141 		break;
5142 	case WMI_10_4_PDEV_TEMPERATURE_EVENTID:
5143 		ath10k_wmi_event_temperature(ar, skb);
5144 		break;
5145 	default:
5146 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
5147 		break;
5148 	}
5149 
5150 out:
5151 	dev_kfree_skb(skb);
5152 }
5153 
5154 static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
5155 {
5156 	int ret;
5157 
5158 	ret = ath10k_wmi_rx(ar, skb);
5159 	if (ret)
5160 		ath10k_warn(ar, "failed to process wmi rx: %d\n", ret);
5161 }
5162 
5163 int ath10k_wmi_connect(struct ath10k *ar)
5164 {
5165 	int status;
5166 	struct ath10k_htc_svc_conn_req conn_req;
5167 	struct ath10k_htc_svc_conn_resp conn_resp;
5168 
5169 	memset(&conn_req, 0, sizeof(conn_req));
5170 	memset(&conn_resp, 0, sizeof(conn_resp));
5171 
5172 	/* these fields are the same for all service endpoints */
5173 	conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
5174 	conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
5175 	conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;
5176 
5177 	/* connect to control service */
5178 	conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;
5179 
5180 	status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
5181 	if (status) {
5182 		ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n",
5183 			    status);
5184 		return status;
5185 	}
5186 
5187 	ar->wmi.eid = conn_resp.eid;
5188 	return 0;
5189 }
5190 
5191 static struct sk_buff *
5192 ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
5193 			      u16 ctl2g, u16 ctl5g,
5194 			      enum wmi_dfs_region dfs_reg)
5195 {
5196 	struct wmi_pdev_set_regdomain_cmd *cmd;
5197 	struct sk_buff *skb;
5198 
5199 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5200 	if (!skb)
5201 		return ERR_PTR(-ENOMEM);
5202 
5203 	cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data;
5204 	cmd->reg_domain = __cpu_to_le32(rd);
5205 	cmd->reg_domain_2G = __cpu_to_le32(rd2g);
5206 	cmd->reg_domain_5G = __cpu_to_le32(rd5g);
5207 	cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
5208 	cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
5209 
5210 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5211 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
5212 		   rd, rd2g, rd5g, ctl2g, ctl5g);
5213 	return skb;
5214 }
5215 
5216 static struct sk_buff *
5217 ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16
5218 				  rd5g, u16 ctl2g, u16 ctl5g,
5219 				  enum wmi_dfs_region dfs_reg)
5220 {
5221 	struct wmi_pdev_set_regdomain_cmd_10x *cmd;
5222 	struct sk_buff *skb;
5223 
5224 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5225 	if (!skb)
5226 		return ERR_PTR(-ENOMEM);
5227 
5228 	cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data;
5229 	cmd->reg_domain = __cpu_to_le32(rd);
5230 	cmd->reg_domain_2G = __cpu_to_le32(rd2g);
5231 	cmd->reg_domain_5G = __cpu_to_le32(rd5g);
5232 	cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
5233 	cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
5234 	cmd->dfs_domain = __cpu_to_le32(dfs_reg);
5235 
5236 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5237 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
5238 		   rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
5239 	return skb;
5240 }
5241 
5242 static struct sk_buff *
5243 ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt)
5244 {
5245 	struct wmi_pdev_suspend_cmd *cmd;
5246 	struct sk_buff *skb;
5247 
5248 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5249 	if (!skb)
5250 		return ERR_PTR(-ENOMEM);
5251 
5252 	cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
5253 	cmd->suspend_opt = __cpu_to_le32(suspend_opt);
5254 
5255 	return skb;
5256 }
5257 
5258 static struct sk_buff *
5259 ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar)
5260 {
5261 	struct sk_buff *skb;
5262 
5263 	skb = ath10k_wmi_alloc_skb(ar, 0);
5264 	if (!skb)
5265 		return ERR_PTR(-ENOMEM);
5266 
5267 	return skb;
5268 }
5269 
5270 static struct sk_buff *
5271 ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
5272 {
5273 	struct wmi_pdev_set_param_cmd *cmd;
5274 	struct sk_buff *skb;
5275 
5276 	if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
5277 		ath10k_warn(ar, "pdev param %d not supported by firmware\n",
5278 			    id);
5279 		return ERR_PTR(-EOPNOTSUPP);
5280 	}
5281 
5282 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5283 	if (!skb)
5284 		return ERR_PTR(-ENOMEM);
5285 
5286 	cmd = (struct wmi_pdev_set_param_cmd *)skb->data;
5287 	cmd->param_id    = __cpu_to_le32(id);
5288 	cmd->param_value = __cpu_to_le32(value);
5289 
5290 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
5291 		   id, value);
5292 	return skb;
5293 }
5294 
5295 void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
5296 				    struct wmi_host_mem_chunks *chunks)
5297 {
5298 	struct host_memory_chunk *chunk;
5299 	int i;
5300 
5301 	chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks);
5302 
5303 	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
5304 		chunk = &chunks->items[i];
5305 		chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
5306 		chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len);
5307 		chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
5308 
5309 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5310 			   "wmi chunk %d len %d requested, addr 0x%llx\n",
5311 			   i,
5312 			   ar->wmi.mem_chunks[i].len,
5313 			   (unsigned long long)ar->wmi.mem_chunks[i].paddr);
5314 	}
5315 }
5316 
5317 static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar)
5318 {
5319 	struct wmi_init_cmd *cmd;
5320 	struct sk_buff *buf;
5321 	struct wmi_resource_config config = {};
5322 	u32 len, val;
5323 
5324 	config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
5325 	config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS);
5326 	config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS);
5327 
5328 	config.num_offload_reorder_bufs =
5329 		__cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS);
5330 
5331 	config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS);
5332 	config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS);
5333 	config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT);
5334 	config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK);
5335 	config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK);
5336 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
5337 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
5338 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
5339 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI);
5340 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
5341 	config.scan_max_pending_reqs =
5342 		__cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS);
5343 
5344 	config.bmiss_offload_max_vdev =
5345 		__cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV);
5346 
5347 	config.roam_offload_max_vdev =
5348 		__cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV);
5349 
5350 	config.roam_offload_max_ap_profiles =
5351 		__cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES);
5352 
5353 	config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS);
5354 	config.num_mcast_table_elems =
5355 		__cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS);
5356 
5357 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE);
5358 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE);
5359 	config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES);
5360 	config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE);
5361 	config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM);
5362 
5363 	val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
5364 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
5365 
5366 	config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG);
5367 
5368 	config.gtk_offload_max_vdev =
5369 		__cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV);
5370 
5371 	config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
5372 	config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
5373 
5374 	len = sizeof(*cmd) +
5375 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
5376 
5377 	buf = ath10k_wmi_alloc_skb(ar, len);
5378 	if (!buf)
5379 		return ERR_PTR(-ENOMEM);
5380 
5381 	cmd = (struct wmi_init_cmd *)buf->data;
5382 
5383 	memcpy(&cmd->resource_config, &config, sizeof(config));
5384 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
5385 
5386 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
5387 	return buf;
5388 }
5389 
5390 static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar)
5391 {
5392 	struct wmi_init_cmd_10x *cmd;
5393 	struct sk_buff *buf;
5394 	struct wmi_resource_config_10x config = {};
5395 	u32 len, val;
5396 
5397 	config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
5398 	config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
5399 	config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
5400 	config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
5401 	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
5402 	config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
5403 	config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
5404 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5405 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5406 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5407 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
5408 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
5409 	config.scan_max_pending_reqs =
5410 		__cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
5411 
5412 	config.bmiss_offload_max_vdev =
5413 		__cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
5414 
5415 	config.roam_offload_max_vdev =
5416 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
5417 
5418 	config.roam_offload_max_ap_profiles =
5419 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
5420 
5421 	config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
5422 	config.num_mcast_table_elems =
5423 		__cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
5424 
5425 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
5426 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
5427 	config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
5428 	config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE);
5429 	config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
5430 
5431 	val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
5432 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
5433 
5434 	config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
5435 
5436 	config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
5437 	config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
5438 
5439 	len = sizeof(*cmd) +
5440 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
5441 
5442 	buf = ath10k_wmi_alloc_skb(ar, len);
5443 	if (!buf)
5444 		return ERR_PTR(-ENOMEM);
5445 
5446 	cmd = (struct wmi_init_cmd_10x *)buf->data;
5447 
5448 	memcpy(&cmd->resource_config, &config, sizeof(config));
5449 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
5450 
5451 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
5452 	return buf;
5453 }
5454 
5455 static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
5456 {
5457 	struct wmi_init_cmd_10_2 *cmd;
5458 	struct sk_buff *buf;
5459 	struct wmi_resource_config_10x config = {};
5460 	u32 len, val, features;
5461 
5462 	config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
5463 	config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
5464 	config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
5465 	config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
5466 	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
5467 	config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
5468 	config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
5469 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5470 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5471 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5472 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
5473 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
5474 
5475 	config.scan_max_pending_reqs =
5476 		__cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
5477 
5478 	config.bmiss_offload_max_vdev =
5479 		__cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
5480 
5481 	config.roam_offload_max_vdev =
5482 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
5483 
5484 	config.roam_offload_max_ap_profiles =
5485 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
5486 
5487 	config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
5488 	config.num_mcast_table_elems =
5489 		__cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
5490 
5491 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
5492 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
5493 	config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
5494 	config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE);
5495 	config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
5496 
5497 	val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
5498 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
5499 
5500 	config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
5501 
5502 	config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
5503 	config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
5504 
5505 	len = sizeof(*cmd) +
5506 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
5507 
5508 	buf = ath10k_wmi_alloc_skb(ar, len);
5509 	if (!buf)
5510 		return ERR_PTR(-ENOMEM);
5511 
5512 	cmd = (struct wmi_init_cmd_10_2 *)buf->data;
5513 
5514 	features = WMI_10_2_RX_BATCH_MODE;
5515 
5516 	if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) &&
5517 	    test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
5518 		features |= WMI_10_2_COEX_GPIO;
5519 
5520 	cmd->resource_config.feature_mask = __cpu_to_le32(features);
5521 
5522 	memcpy(&cmd->resource_config.common, &config, sizeof(config));
5523 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
5524 
5525 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
5526 	return buf;
5527 }
5528 
5529 static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
5530 {
5531 	struct wmi_init_cmd_10_4 *cmd;
5532 	struct sk_buff *buf;
5533 	struct wmi_resource_config_10_4 config = {};
5534 	u32 len;
5535 
5536 	config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
5537 	config.num_peers = __cpu_to_le32(ar->max_num_peers);
5538 	config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
5539 	config.num_tids = __cpu_to_le32(ar->num_tids);
5540 
5541 	config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS);
5542 	config.num_offload_reorder_buffs =
5543 			__cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS);
5544 	config.num_peer_keys  = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS);
5545 	config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT);
5546 	config.tx_chain_mask  = __cpu_to_le32(TARGET_10_4_TX_CHAIN_MASK);
5547 	config.rx_chain_mask  = __cpu_to_le32(TARGET_10_4_RX_CHAIN_MASK);
5548 
5549 	config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
5550 	config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
5551 	config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
5552 	config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI);
5553 
5554 	config.rx_decap_mode	    = __cpu_to_le32(ar->wmi.rx_decap_mode);
5555 	config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS);
5556 	config.bmiss_offload_max_vdev =
5557 			__cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV);
5558 	config.roam_offload_max_vdev  =
5559 			__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV);
5560 	config.roam_offload_max_ap_profiles =
5561 			__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES);
5562 	config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS);
5563 	config.num_mcast_table_elems =
5564 			__cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS);
5565 
5566 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE);
5567 	config.tx_dbg_log_size  = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE);
5568 	config.num_wds_entries  = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES);
5569 	config.dma_burst_size   = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE);
5570 	config.mac_aggr_delim   = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM);
5571 
5572 	config.rx_skip_defrag_timeout_dup_detection_check =
5573 	  __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK);
5574 
5575 	config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG);
5576 	config.gtk_offload_max_vdev =
5577 			__cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV);
5578 	config.num_msdu_desc = __cpu_to_le32(TARGET_10_4_NUM_MSDU_DESC);
5579 	config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS);
5580 	config.max_peer_ext_stats =
5581 			__cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS);
5582 	config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP);
5583 
5584 	config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE);
5585 	config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE);
5586 	config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE);
5587 	config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE);
5588 
5589 	config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE);
5590 	config.tt_support =
5591 			__cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG);
5592 	config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG);
5593 	config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG);
5594 	config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG);
5595 
5596 	len = sizeof(*cmd) +
5597 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
5598 
5599 	buf = ath10k_wmi_alloc_skb(ar, len);
5600 	if (!buf)
5601 		return ERR_PTR(-ENOMEM);
5602 
5603 	cmd = (struct wmi_init_cmd_10_4 *)buf->data;
5604 	memcpy(&cmd->resource_config, &config, sizeof(config));
5605 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
5606 
5607 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
5608 	return buf;
5609 }
5610 
5611 int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg)
5612 {
5613 	if (arg->ie_len && !arg->ie)
5614 		return -EINVAL;
5615 	if (arg->n_channels && !arg->channels)
5616 		return -EINVAL;
5617 	if (arg->n_ssids && !arg->ssids)
5618 		return -EINVAL;
5619 	if (arg->n_bssids && !arg->bssids)
5620 		return -EINVAL;
5621 
5622 	if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN)
5623 		return -EINVAL;
5624 	if (arg->n_channels > ARRAY_SIZE(arg->channels))
5625 		return -EINVAL;
5626 	if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID)
5627 		return -EINVAL;
5628 	if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID)
5629 		return -EINVAL;
5630 
5631 	return 0;
5632 }
5633 
5634 static size_t
5635 ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg)
5636 {
5637 	int len = 0;
5638 
5639 	if (arg->ie_len) {
5640 		len += sizeof(struct wmi_ie_data);
5641 		len += roundup(arg->ie_len, 4);
5642 	}
5643 
5644 	if (arg->n_channels) {
5645 		len += sizeof(struct wmi_chan_list);
5646 		len += sizeof(__le32) * arg->n_channels;
5647 	}
5648 
5649 	if (arg->n_ssids) {
5650 		len += sizeof(struct wmi_ssid_list);
5651 		len += sizeof(struct wmi_ssid) * arg->n_ssids;
5652 	}
5653 
5654 	if (arg->n_bssids) {
5655 		len += sizeof(struct wmi_bssid_list);
5656 		len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
5657 	}
5658 
5659 	return len;
5660 }
5661 
5662 void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn,
5663 				      const struct wmi_start_scan_arg *arg)
5664 {
5665 	u32 scan_id;
5666 	u32 scan_req_id;
5667 
5668 	scan_id  = WMI_HOST_SCAN_REQ_ID_PREFIX;
5669 	scan_id |= arg->scan_id;
5670 
5671 	scan_req_id  = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
5672 	scan_req_id |= arg->scan_req_id;
5673 
5674 	cmn->scan_id            = __cpu_to_le32(scan_id);
5675 	cmn->scan_req_id        = __cpu_to_le32(scan_req_id);
5676 	cmn->vdev_id            = __cpu_to_le32(arg->vdev_id);
5677 	cmn->scan_priority      = __cpu_to_le32(arg->scan_priority);
5678 	cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events);
5679 	cmn->dwell_time_active  = __cpu_to_le32(arg->dwell_time_active);
5680 	cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive);
5681 	cmn->min_rest_time      = __cpu_to_le32(arg->min_rest_time);
5682 	cmn->max_rest_time      = __cpu_to_le32(arg->max_rest_time);
5683 	cmn->repeat_probe_time  = __cpu_to_le32(arg->repeat_probe_time);
5684 	cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time);
5685 	cmn->idle_time          = __cpu_to_le32(arg->idle_time);
5686 	cmn->max_scan_time      = __cpu_to_le32(arg->max_scan_time);
5687 	cmn->probe_delay        = __cpu_to_le32(arg->probe_delay);
5688 	cmn->scan_ctrl_flags    = __cpu_to_le32(arg->scan_ctrl_flags);
5689 }
5690 
5691 static void
5692 ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs,
5693 			       const struct wmi_start_scan_arg *arg)
5694 {
5695 	struct wmi_ie_data *ie;
5696 	struct wmi_chan_list *channels;
5697 	struct wmi_ssid_list *ssids;
5698 	struct wmi_bssid_list *bssids;
5699 	void *ptr = tlvs->tlvs;
5700 	int i;
5701 
5702 	if (arg->n_channels) {
5703 		channels = ptr;
5704 		channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG);
5705 		channels->num_chan = __cpu_to_le32(arg->n_channels);
5706 
5707 		for (i = 0; i < arg->n_channels; i++)
5708 			channels->channel_list[i].freq =
5709 				__cpu_to_le16(arg->channels[i]);
5710 
5711 		ptr += sizeof(*channels);
5712 		ptr += sizeof(__le32) * arg->n_channels;
5713 	}
5714 
5715 	if (arg->n_ssids) {
5716 		ssids = ptr;
5717 		ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG);
5718 		ssids->num_ssids = __cpu_to_le32(arg->n_ssids);
5719 
5720 		for (i = 0; i < arg->n_ssids; i++) {
5721 			ssids->ssids[i].ssid_len =
5722 				__cpu_to_le32(arg->ssids[i].len);
5723 			memcpy(&ssids->ssids[i].ssid,
5724 			       arg->ssids[i].ssid,
5725 			       arg->ssids[i].len);
5726 		}
5727 
5728 		ptr += sizeof(*ssids);
5729 		ptr += sizeof(struct wmi_ssid) * arg->n_ssids;
5730 	}
5731 
5732 	if (arg->n_bssids) {
5733 		bssids = ptr;
5734 		bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG);
5735 		bssids->num_bssid = __cpu_to_le32(arg->n_bssids);
5736 
5737 		for (i = 0; i < arg->n_bssids; i++)
5738 			memcpy(&bssids->bssid_list[i],
5739 			       arg->bssids[i].bssid,
5740 			       ETH_ALEN);
5741 
5742 		ptr += sizeof(*bssids);
5743 		ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids;
5744 	}
5745 
5746 	if (arg->ie_len) {
5747 		ie = ptr;
5748 		ie->tag = __cpu_to_le32(WMI_IE_TAG);
5749 		ie->ie_len = __cpu_to_le32(arg->ie_len);
5750 		memcpy(ie->ie_data, arg->ie, arg->ie_len);
5751 
5752 		ptr += sizeof(*ie);
5753 		ptr += roundup(arg->ie_len, 4);
5754 	}
5755 }
5756 
5757 static struct sk_buff *
5758 ath10k_wmi_op_gen_start_scan(struct ath10k *ar,
5759 			     const struct wmi_start_scan_arg *arg)
5760 {
5761 	struct wmi_start_scan_cmd *cmd;
5762 	struct sk_buff *skb;
5763 	size_t len;
5764 	int ret;
5765 
5766 	ret = ath10k_wmi_start_scan_verify(arg);
5767 	if (ret)
5768 		return ERR_PTR(ret);
5769 
5770 	len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
5771 	skb = ath10k_wmi_alloc_skb(ar, len);
5772 	if (!skb)
5773 		return ERR_PTR(-ENOMEM);
5774 
5775 	cmd = (struct wmi_start_scan_cmd *)skb->data;
5776 
5777 	ath10k_wmi_put_start_scan_common(&cmd->common, arg);
5778 	ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
5779 
5780 	cmd->burst_duration_ms = __cpu_to_le32(0);
5781 
5782 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
5783 	return skb;
5784 }
5785 
5786 static struct sk_buff *
5787 ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar,
5788 				 const struct wmi_start_scan_arg *arg)
5789 {
5790 	struct wmi_10x_start_scan_cmd *cmd;
5791 	struct sk_buff *skb;
5792 	size_t len;
5793 	int ret;
5794 
5795 	ret = ath10k_wmi_start_scan_verify(arg);
5796 	if (ret)
5797 		return ERR_PTR(ret);
5798 
5799 	len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
5800 	skb = ath10k_wmi_alloc_skb(ar, len);
5801 	if (!skb)
5802 		return ERR_PTR(-ENOMEM);
5803 
5804 	cmd = (struct wmi_10x_start_scan_cmd *)skb->data;
5805 
5806 	ath10k_wmi_put_start_scan_common(&cmd->common, arg);
5807 	ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
5808 
5809 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
5810 	return skb;
5811 }
5812 
5813 void ath10k_wmi_start_scan_init(struct ath10k *ar,
5814 				struct wmi_start_scan_arg *arg)
5815 {
5816 	/* setup commonly used values */
5817 	arg->scan_req_id = 1;
5818 	arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
5819 	arg->dwell_time_active = 50;
5820 	arg->dwell_time_passive = 150;
5821 	arg->min_rest_time = 50;
5822 	arg->max_rest_time = 500;
5823 	arg->repeat_probe_time = 0;
5824 	arg->probe_spacing_time = 0;
5825 	arg->idle_time = 0;
5826 	arg->max_scan_time = 20000;
5827 	arg->probe_delay = 5;
5828 	arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
5829 		| WMI_SCAN_EVENT_COMPLETED
5830 		| WMI_SCAN_EVENT_BSS_CHANNEL
5831 		| WMI_SCAN_EVENT_FOREIGN_CHANNEL
5832 		| WMI_SCAN_EVENT_DEQUEUED;
5833 	arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
5834 	arg->n_bssids = 1;
5835 	arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF";
5836 }
5837 
5838 static struct sk_buff *
5839 ath10k_wmi_op_gen_stop_scan(struct ath10k *ar,
5840 			    const struct wmi_stop_scan_arg *arg)
5841 {
5842 	struct wmi_stop_scan_cmd *cmd;
5843 	struct sk_buff *skb;
5844 	u32 scan_id;
5845 	u32 req_id;
5846 
5847 	if (arg->req_id > 0xFFF)
5848 		return ERR_PTR(-EINVAL);
5849 	if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF)
5850 		return ERR_PTR(-EINVAL);
5851 
5852 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5853 	if (!skb)
5854 		return ERR_PTR(-ENOMEM);
5855 
5856 	scan_id = arg->u.scan_id;
5857 	scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;
5858 
5859 	req_id = arg->req_id;
5860 	req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
5861 
5862 	cmd = (struct wmi_stop_scan_cmd *)skb->data;
5863 	cmd->req_type    = __cpu_to_le32(arg->req_type);
5864 	cmd->vdev_id     = __cpu_to_le32(arg->u.vdev_id);
5865 	cmd->scan_id     = __cpu_to_le32(scan_id);
5866 	cmd->scan_req_id = __cpu_to_le32(req_id);
5867 
5868 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5869 		   "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
5870 		   arg->req_id, arg->req_type, arg->u.scan_id);
5871 	return skb;
5872 }
5873 
5874 static struct sk_buff *
5875 ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id,
5876 			      enum wmi_vdev_type type,
5877 			      enum wmi_vdev_subtype subtype,
5878 			      const u8 macaddr[ETH_ALEN])
5879 {
5880 	struct wmi_vdev_create_cmd *cmd;
5881 	struct sk_buff *skb;
5882 
5883 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5884 	if (!skb)
5885 		return ERR_PTR(-ENOMEM);
5886 
5887 	cmd = (struct wmi_vdev_create_cmd *)skb->data;
5888 	cmd->vdev_id      = __cpu_to_le32(vdev_id);
5889 	cmd->vdev_type    = __cpu_to_le32(type);
5890 	cmd->vdev_subtype = __cpu_to_le32(subtype);
5891 	ether_addr_copy(cmd->vdev_macaddr.addr, macaddr);
5892 
5893 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5894 		   "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
5895 		   vdev_id, type, subtype, macaddr);
5896 	return skb;
5897 }
5898 
5899 static struct sk_buff *
5900 ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id)
5901 {
5902 	struct wmi_vdev_delete_cmd *cmd;
5903 	struct sk_buff *skb;
5904 
5905 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5906 	if (!skb)
5907 		return ERR_PTR(-ENOMEM);
5908 
5909 	cmd = (struct wmi_vdev_delete_cmd *)skb->data;
5910 	cmd->vdev_id = __cpu_to_le32(vdev_id);
5911 
5912 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5913 		   "WMI vdev delete id %d\n", vdev_id);
5914 	return skb;
5915 }
5916 
5917 static struct sk_buff *
5918 ath10k_wmi_op_gen_vdev_start(struct ath10k *ar,
5919 			     const struct wmi_vdev_start_request_arg *arg,
5920 			     bool restart)
5921 {
5922 	struct wmi_vdev_start_request_cmd *cmd;
5923 	struct sk_buff *skb;
5924 	const char *cmdname;
5925 	u32 flags = 0;
5926 
5927 	if (WARN_ON(arg->hidden_ssid && !arg->ssid))
5928 		return ERR_PTR(-EINVAL);
5929 	if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
5930 		return ERR_PTR(-EINVAL);
5931 
5932 	if (restart)
5933 		cmdname = "restart";
5934 	else
5935 		cmdname = "start";
5936 
5937 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5938 	if (!skb)
5939 		return ERR_PTR(-ENOMEM);
5940 
5941 	if (arg->hidden_ssid)
5942 		flags |= WMI_VDEV_START_HIDDEN_SSID;
5943 	if (arg->pmf_enabled)
5944 		flags |= WMI_VDEV_START_PMF_ENABLED;
5945 
5946 	cmd = (struct wmi_vdev_start_request_cmd *)skb->data;
5947 	cmd->vdev_id         = __cpu_to_le32(arg->vdev_id);
5948 	cmd->disable_hw_ack  = __cpu_to_le32(arg->disable_hw_ack);
5949 	cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval);
5950 	cmd->dtim_period     = __cpu_to_le32(arg->dtim_period);
5951 	cmd->flags           = __cpu_to_le32(flags);
5952 	cmd->bcn_tx_rate     = __cpu_to_le32(arg->bcn_tx_rate);
5953 	cmd->bcn_tx_power    = __cpu_to_le32(arg->bcn_tx_power);
5954 
5955 	if (arg->ssid) {
5956 		cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len);
5957 		memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
5958 	}
5959 
5960 	ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel);
5961 
5962 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5963 		   "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
5964 		   cmdname, arg->vdev_id,
5965 		   flags, arg->channel.freq, arg->channel.mode,
5966 		   cmd->chan.flags, arg->channel.max_power);
5967 
5968 	return skb;
5969 }
5970 
5971 static struct sk_buff *
5972 ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id)
5973 {
5974 	struct wmi_vdev_stop_cmd *cmd;
5975 	struct sk_buff *skb;
5976 
5977 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5978 	if (!skb)
5979 		return ERR_PTR(-ENOMEM);
5980 
5981 	cmd = (struct wmi_vdev_stop_cmd *)skb->data;
5982 	cmd->vdev_id = __cpu_to_le32(vdev_id);
5983 
5984 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
5985 	return skb;
5986 }
5987 
5988 static struct sk_buff *
5989 ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid,
5990 			  const u8 *bssid)
5991 {
5992 	struct wmi_vdev_up_cmd *cmd;
5993 	struct sk_buff *skb;
5994 
5995 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5996 	if (!skb)
5997 		return ERR_PTR(-ENOMEM);
5998 
5999 	cmd = (struct wmi_vdev_up_cmd *)skb->data;
6000 	cmd->vdev_id       = __cpu_to_le32(vdev_id);
6001 	cmd->vdev_assoc_id = __cpu_to_le32(aid);
6002 	ether_addr_copy(cmd->vdev_bssid.addr, bssid);
6003 
6004 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6005 		   "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
6006 		   vdev_id, aid, bssid);
6007 	return skb;
6008 }
6009 
6010 static struct sk_buff *
6011 ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id)
6012 {
6013 	struct wmi_vdev_down_cmd *cmd;
6014 	struct sk_buff *skb;
6015 
6016 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6017 	if (!skb)
6018 		return ERR_PTR(-ENOMEM);
6019 
6020 	cmd = (struct wmi_vdev_down_cmd *)skb->data;
6021 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6022 
6023 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6024 		   "wmi mgmt vdev down id 0x%x\n", vdev_id);
6025 	return skb;
6026 }
6027 
6028 static struct sk_buff *
6029 ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id,
6030 				 u32 param_id, u32 param_value)
6031 {
6032 	struct wmi_vdev_set_param_cmd *cmd;
6033 	struct sk_buff *skb;
6034 
6035 	if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
6036 		ath10k_dbg(ar, ATH10K_DBG_WMI,
6037 			   "vdev param %d not supported by firmware\n",
6038 			    param_id);
6039 		return ERR_PTR(-EOPNOTSUPP);
6040 	}
6041 
6042 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6043 	if (!skb)
6044 		return ERR_PTR(-ENOMEM);
6045 
6046 	cmd = (struct wmi_vdev_set_param_cmd *)skb->data;
6047 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
6048 	cmd->param_id    = __cpu_to_le32(param_id);
6049 	cmd->param_value = __cpu_to_le32(param_value);
6050 
6051 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6052 		   "wmi vdev id 0x%x set param %d value %d\n",
6053 		   vdev_id, param_id, param_value);
6054 	return skb;
6055 }
6056 
6057 static struct sk_buff *
6058 ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar,
6059 				   const struct wmi_vdev_install_key_arg *arg)
6060 {
6061 	struct wmi_vdev_install_key_cmd *cmd;
6062 	struct sk_buff *skb;
6063 
6064 	if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
6065 		return ERR_PTR(-EINVAL);
6066 	if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
6067 		return ERR_PTR(-EINVAL);
6068 
6069 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
6070 	if (!skb)
6071 		return ERR_PTR(-ENOMEM);
6072 
6073 	cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
6074 	cmd->vdev_id       = __cpu_to_le32(arg->vdev_id);
6075 	cmd->key_idx       = __cpu_to_le32(arg->key_idx);
6076 	cmd->key_flags     = __cpu_to_le32(arg->key_flags);
6077 	cmd->key_cipher    = __cpu_to_le32(arg->key_cipher);
6078 	cmd->key_len       = __cpu_to_le32(arg->key_len);
6079 	cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len);
6080 	cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
6081 
6082 	if (arg->macaddr)
6083 		ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr);
6084 	if (arg->key_data)
6085 		memcpy(cmd->key_data, arg->key_data, arg->key_len);
6086 
6087 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6088 		   "wmi vdev install key idx %d cipher %d len %d\n",
6089 		   arg->key_idx, arg->key_cipher, arg->key_len);
6090 	return skb;
6091 }
6092 
6093 static struct sk_buff *
6094 ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar,
6095 				     const struct wmi_vdev_spectral_conf_arg *arg)
6096 {
6097 	struct wmi_vdev_spectral_conf_cmd *cmd;
6098 	struct sk_buff *skb;
6099 
6100 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6101 	if (!skb)
6102 		return ERR_PTR(-ENOMEM);
6103 
6104 	cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data;
6105 	cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
6106 	cmd->scan_count = __cpu_to_le32(arg->scan_count);
6107 	cmd->scan_period = __cpu_to_le32(arg->scan_period);
6108 	cmd->scan_priority = __cpu_to_le32(arg->scan_priority);
6109 	cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size);
6110 	cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena);
6111 	cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena);
6112 	cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref);
6113 	cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay);
6114 	cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr);
6115 	cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr);
6116 	cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode);
6117 	cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode);
6118 	cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr);
6119 	cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format);
6120 	cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode);
6121 	cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale);
6122 	cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj);
6123 	cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask);
6124 
6125 	return skb;
6126 }
6127 
6128 static struct sk_buff *
6129 ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id,
6130 				       u32 trigger, u32 enable)
6131 {
6132 	struct wmi_vdev_spectral_enable_cmd *cmd;
6133 	struct sk_buff *skb;
6134 
6135 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6136 	if (!skb)
6137 		return ERR_PTR(-ENOMEM);
6138 
6139 	cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data;
6140 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6141 	cmd->trigger_cmd = __cpu_to_le32(trigger);
6142 	cmd->enable_cmd = __cpu_to_le32(enable);
6143 
6144 	return skb;
6145 }
6146 
6147 static struct sk_buff *
6148 ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
6149 			      const u8 peer_addr[ETH_ALEN],
6150 			      enum wmi_peer_type peer_type)
6151 {
6152 	struct wmi_peer_create_cmd *cmd;
6153 	struct sk_buff *skb;
6154 
6155 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6156 	if (!skb)
6157 		return ERR_PTR(-ENOMEM);
6158 
6159 	cmd = (struct wmi_peer_create_cmd *)skb->data;
6160 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6161 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6162 
6163 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6164 		   "wmi peer create vdev_id %d peer_addr %pM\n",
6165 		   vdev_id, peer_addr);
6166 	return skb;
6167 }
6168 
6169 static struct sk_buff *
6170 ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id,
6171 			      const u8 peer_addr[ETH_ALEN])
6172 {
6173 	struct wmi_peer_delete_cmd *cmd;
6174 	struct sk_buff *skb;
6175 
6176 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6177 	if (!skb)
6178 		return ERR_PTR(-ENOMEM);
6179 
6180 	cmd = (struct wmi_peer_delete_cmd *)skb->data;
6181 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6182 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6183 
6184 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6185 		   "wmi peer delete vdev_id %d peer_addr %pM\n",
6186 		   vdev_id, peer_addr);
6187 	return skb;
6188 }
6189 
6190 static struct sk_buff *
6191 ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id,
6192 			     const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
6193 {
6194 	struct wmi_peer_flush_tids_cmd *cmd;
6195 	struct sk_buff *skb;
6196 
6197 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6198 	if (!skb)
6199 		return ERR_PTR(-ENOMEM);
6200 
6201 	cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
6202 	cmd->vdev_id         = __cpu_to_le32(vdev_id);
6203 	cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
6204 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6205 
6206 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6207 		   "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
6208 		   vdev_id, peer_addr, tid_bitmap);
6209 	return skb;
6210 }
6211 
6212 static struct sk_buff *
6213 ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id,
6214 				 const u8 *peer_addr,
6215 				 enum wmi_peer_param param_id,
6216 				 u32 param_value)
6217 {
6218 	struct wmi_peer_set_param_cmd *cmd;
6219 	struct sk_buff *skb;
6220 
6221 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6222 	if (!skb)
6223 		return ERR_PTR(-ENOMEM);
6224 
6225 	cmd = (struct wmi_peer_set_param_cmd *)skb->data;
6226 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
6227 	cmd->param_id    = __cpu_to_le32(param_id);
6228 	cmd->param_value = __cpu_to_le32(param_value);
6229 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6230 
6231 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6232 		   "wmi vdev %d peer 0x%pM set param %d value %d\n",
6233 		   vdev_id, peer_addr, param_id, param_value);
6234 	return skb;
6235 }
6236 
6237 static struct sk_buff *
6238 ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
6239 			     enum wmi_sta_ps_mode psmode)
6240 {
6241 	struct wmi_sta_powersave_mode_cmd *cmd;
6242 	struct sk_buff *skb;
6243 
6244 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6245 	if (!skb)
6246 		return ERR_PTR(-ENOMEM);
6247 
6248 	cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data;
6249 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
6250 	cmd->sta_ps_mode = __cpu_to_le32(psmode);
6251 
6252 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6253 		   "wmi set powersave id 0x%x mode %d\n",
6254 		   vdev_id, psmode);
6255 	return skb;
6256 }
6257 
6258 static struct sk_buff *
6259 ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id,
6260 			     enum wmi_sta_powersave_param param_id,
6261 			     u32 value)
6262 {
6263 	struct wmi_sta_powersave_param_cmd *cmd;
6264 	struct sk_buff *skb;
6265 
6266 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6267 	if (!skb)
6268 		return ERR_PTR(-ENOMEM);
6269 
6270 	cmd = (struct wmi_sta_powersave_param_cmd *)skb->data;
6271 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
6272 	cmd->param_id    = __cpu_to_le32(param_id);
6273 	cmd->param_value = __cpu_to_le32(value);
6274 
6275 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6276 		   "wmi sta ps param vdev_id 0x%x param %d value %d\n",
6277 		   vdev_id, param_id, value);
6278 	return skb;
6279 }
6280 
6281 static struct sk_buff *
6282 ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac,
6283 			    enum wmi_ap_ps_peer_param param_id, u32 value)
6284 {
6285 	struct wmi_ap_ps_peer_cmd *cmd;
6286 	struct sk_buff *skb;
6287 
6288 	if (!mac)
6289 		return ERR_PTR(-EINVAL);
6290 
6291 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6292 	if (!skb)
6293 		return ERR_PTR(-ENOMEM);
6294 
6295 	cmd = (struct wmi_ap_ps_peer_cmd *)skb->data;
6296 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6297 	cmd->param_id = __cpu_to_le32(param_id);
6298 	cmd->param_value = __cpu_to_le32(value);
6299 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
6300 
6301 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6302 		   "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
6303 		   vdev_id, param_id, value, mac);
6304 	return skb;
6305 }
6306 
6307 static struct sk_buff *
6308 ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar,
6309 				 const struct wmi_scan_chan_list_arg *arg)
6310 {
6311 	struct wmi_scan_chan_list_cmd *cmd;
6312 	struct sk_buff *skb;
6313 	struct wmi_channel_arg *ch;
6314 	struct wmi_channel *ci;
6315 	int len;
6316 	int i;
6317 
6318 	len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);
6319 
6320 	skb = ath10k_wmi_alloc_skb(ar, len);
6321 	if (!skb)
6322 		return ERR_PTR(-EINVAL);
6323 
6324 	cmd = (struct wmi_scan_chan_list_cmd *)skb->data;
6325 	cmd->num_scan_chans = __cpu_to_le32(arg->n_channels);
6326 
6327 	for (i = 0; i < arg->n_channels; i++) {
6328 		ch = &arg->channels[i];
6329 		ci = &cmd->chan_info[i];
6330 
6331 		ath10k_wmi_put_wmi_channel(ci, ch);
6332 	}
6333 
6334 	return skb;
6335 }
6336 
6337 static void
6338 ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
6339 			   const struct wmi_peer_assoc_complete_arg *arg)
6340 {
6341 	struct wmi_common_peer_assoc_complete_cmd *cmd = buf;
6342 
6343 	cmd->vdev_id            = __cpu_to_le32(arg->vdev_id);
6344 	cmd->peer_new_assoc     = __cpu_to_le32(arg->peer_reassoc ? 0 : 1);
6345 	cmd->peer_associd       = __cpu_to_le32(arg->peer_aid);
6346 	cmd->peer_flags         = __cpu_to_le32(arg->peer_flags);
6347 	cmd->peer_caps          = __cpu_to_le32(arg->peer_caps);
6348 	cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval);
6349 	cmd->peer_ht_caps       = __cpu_to_le32(arg->peer_ht_caps);
6350 	cmd->peer_max_mpdu      = __cpu_to_le32(arg->peer_max_mpdu);
6351 	cmd->peer_mpdu_density  = __cpu_to_le32(arg->peer_mpdu_density);
6352 	cmd->peer_rate_caps     = __cpu_to_le32(arg->peer_rate_caps);
6353 	cmd->peer_nss           = __cpu_to_le32(arg->peer_num_spatial_streams);
6354 	cmd->peer_vht_caps      = __cpu_to_le32(arg->peer_vht_caps);
6355 	cmd->peer_phymode       = __cpu_to_le32(arg->peer_phymode);
6356 
6357 	ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
6358 
6359 	cmd->peer_legacy_rates.num_rates =
6360 		__cpu_to_le32(arg->peer_legacy_rates.num_rates);
6361 	memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
6362 	       arg->peer_legacy_rates.num_rates);
6363 
6364 	cmd->peer_ht_rates.num_rates =
6365 		__cpu_to_le32(arg->peer_ht_rates.num_rates);
6366 	memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
6367 	       arg->peer_ht_rates.num_rates);
6368 
6369 	cmd->peer_vht_rates.rx_max_rate =
6370 		__cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
6371 	cmd->peer_vht_rates.rx_mcs_set =
6372 		__cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
6373 	cmd->peer_vht_rates.tx_max_rate =
6374 		__cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
6375 	cmd->peer_vht_rates.tx_mcs_set =
6376 		__cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
6377 }
6378 
6379 static void
6380 ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf,
6381 				const struct wmi_peer_assoc_complete_arg *arg)
6382 {
6383 	struct wmi_main_peer_assoc_complete_cmd *cmd = buf;
6384 
6385 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
6386 	memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info));
6387 }
6388 
6389 static void
6390 ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf,
6391 				const struct wmi_peer_assoc_complete_arg *arg)
6392 {
6393 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
6394 }
6395 
6396 static void
6397 ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf,
6398 				const struct wmi_peer_assoc_complete_arg *arg)
6399 {
6400 	struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf;
6401 	int max_mcs, max_nss;
6402 	u32 info0;
6403 
6404 	/* TODO: Is using max values okay with firmware? */
6405 	max_mcs = 0xf;
6406 	max_nss = 0xf;
6407 
6408 	info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) |
6409 		SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS);
6410 
6411 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
6412 	cmd->info0 = __cpu_to_le32(info0);
6413 }
6414 
6415 static void
6416 ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf,
6417 				const struct wmi_peer_assoc_complete_arg *arg)
6418 {
6419 	struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf;
6420 
6421 	ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
6422 	cmd->peer_bw_rxnss_override = 0;
6423 }
6424 
6425 static int
6426 ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg)
6427 {
6428 	if (arg->peer_mpdu_density > 16)
6429 		return -EINVAL;
6430 	if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES)
6431 		return -EINVAL;
6432 	if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES)
6433 		return -EINVAL;
6434 
6435 	return 0;
6436 }
6437 
6438 static struct sk_buff *
6439 ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar,
6440 			     const struct wmi_peer_assoc_complete_arg *arg)
6441 {
6442 	size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd);
6443 	struct sk_buff *skb;
6444 	int ret;
6445 
6446 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6447 	if (ret)
6448 		return ERR_PTR(ret);
6449 
6450 	skb = ath10k_wmi_alloc_skb(ar, len);
6451 	if (!skb)
6452 		return ERR_PTR(-ENOMEM);
6453 
6454 	ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);
6455 
6456 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6457 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6458 		   arg->vdev_id, arg->addr,
6459 		   arg->peer_reassoc ? "reassociate" : "new");
6460 	return skb;
6461 }
6462 
6463 static struct sk_buff *
6464 ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar,
6465 				  const struct wmi_peer_assoc_complete_arg *arg)
6466 {
6467 	size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd);
6468 	struct sk_buff *skb;
6469 	int ret;
6470 
6471 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6472 	if (ret)
6473 		return ERR_PTR(ret);
6474 
6475 	skb = ath10k_wmi_alloc_skb(ar, len);
6476 	if (!skb)
6477 		return ERR_PTR(-ENOMEM);
6478 
6479 	ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);
6480 
6481 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6482 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6483 		   arg->vdev_id, arg->addr,
6484 		   arg->peer_reassoc ? "reassociate" : "new");
6485 	return skb;
6486 }
6487 
6488 static struct sk_buff *
6489 ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar,
6490 				  const struct wmi_peer_assoc_complete_arg *arg)
6491 {
6492 	size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd);
6493 	struct sk_buff *skb;
6494 	int ret;
6495 
6496 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6497 	if (ret)
6498 		return ERR_PTR(ret);
6499 
6500 	skb = ath10k_wmi_alloc_skb(ar, len);
6501 	if (!skb)
6502 		return ERR_PTR(-ENOMEM);
6503 
6504 	ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);
6505 
6506 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6507 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6508 		   arg->vdev_id, arg->addr,
6509 		   arg->peer_reassoc ? "reassociate" : "new");
6510 	return skb;
6511 }
6512 
6513 static struct sk_buff *
6514 ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar,
6515 				  const struct wmi_peer_assoc_complete_arg *arg)
6516 {
6517 	size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd);
6518 	struct sk_buff *skb;
6519 	int ret;
6520 
6521 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6522 	if (ret)
6523 		return ERR_PTR(ret);
6524 
6525 	skb = ath10k_wmi_alloc_skb(ar, len);
6526 	if (!skb)
6527 		return ERR_PTR(-ENOMEM);
6528 
6529 	ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);
6530 
6531 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6532 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6533 		   arg->vdev_id, arg->addr,
6534 		   arg->peer_reassoc ? "reassociate" : "new");
6535 	return skb;
6536 }
6537 
6538 static struct sk_buff *
6539 ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
6540 {
6541 	struct sk_buff *skb;
6542 
6543 	skb = ath10k_wmi_alloc_skb(ar, 0);
6544 	if (!skb)
6545 		return ERR_PTR(-ENOMEM);
6546 
6547 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
6548 	return skb;
6549 }
6550 
6551 /* This function assumes the beacon is already DMA mapped */
6552 static struct sk_buff *
6553 ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn,
6554 			     size_t bcn_len, u32 bcn_paddr, bool dtim_zero,
6555 			     bool deliver_cab)
6556 {
6557 	struct wmi_bcn_tx_ref_cmd *cmd;
6558 	struct sk_buff *skb;
6559 	struct ieee80211_hdr *hdr;
6560 	u16 fc;
6561 
6562 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6563 	if (!skb)
6564 		return ERR_PTR(-ENOMEM);
6565 
6566 	hdr = (struct ieee80211_hdr *)bcn;
6567 	fc = le16_to_cpu(hdr->frame_control);
6568 
6569 	cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data;
6570 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6571 	cmd->data_len = __cpu_to_le32(bcn_len);
6572 	cmd->data_ptr = __cpu_to_le32(bcn_paddr);
6573 	cmd->msdu_id = 0;
6574 	cmd->frame_control = __cpu_to_le32(fc);
6575 	cmd->flags = 0;
6576 	cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA);
6577 
6578 	if (dtim_zero)
6579 		cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO);
6580 
6581 	if (deliver_cab)
6582 		cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB);
6583 
6584 	return skb;
6585 }
6586 
6587 void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
6588 			      const struct wmi_wmm_params_arg *arg)
6589 {
6590 	params->cwmin  = __cpu_to_le32(arg->cwmin);
6591 	params->cwmax  = __cpu_to_le32(arg->cwmax);
6592 	params->aifs   = __cpu_to_le32(arg->aifs);
6593 	params->txop   = __cpu_to_le32(arg->txop);
6594 	params->acm    = __cpu_to_le32(arg->acm);
6595 	params->no_ack = __cpu_to_le32(arg->no_ack);
6596 }
6597 
6598 static struct sk_buff *
6599 ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
6600 			       const struct wmi_wmm_params_all_arg *arg)
6601 {
6602 	struct wmi_pdev_set_wmm_params *cmd;
6603 	struct sk_buff *skb;
6604 
6605 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6606 	if (!skb)
6607 		return ERR_PTR(-ENOMEM);
6608 
6609 	cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
6610 	ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
6611 	ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
6612 	ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
6613 	ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
6614 
6615 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
6616 	return skb;
6617 }
6618 
6619 static struct sk_buff *
6620 ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
6621 {
6622 	struct wmi_request_stats_cmd *cmd;
6623 	struct sk_buff *skb;
6624 
6625 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6626 	if (!skb)
6627 		return ERR_PTR(-ENOMEM);
6628 
6629 	cmd = (struct wmi_request_stats_cmd *)skb->data;
6630 	cmd->stats_id = __cpu_to_le32(stats_mask);
6631 
6632 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
6633 		   stats_mask);
6634 	return skb;
6635 }
6636 
6637 static struct sk_buff *
6638 ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
6639 				enum wmi_force_fw_hang_type type, u32 delay_ms)
6640 {
6641 	struct wmi_force_fw_hang_cmd *cmd;
6642 	struct sk_buff *skb;
6643 
6644 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6645 	if (!skb)
6646 		return ERR_PTR(-ENOMEM);
6647 
6648 	cmd = (struct wmi_force_fw_hang_cmd *)skb->data;
6649 	cmd->type = __cpu_to_le32(type);
6650 	cmd->delay_ms = __cpu_to_le32(delay_ms);
6651 
6652 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
6653 		   type, delay_ms);
6654 	return skb;
6655 }
6656 
6657 static struct sk_buff *
6658 ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable,
6659 			     u32 log_level)
6660 {
6661 	struct wmi_dbglog_cfg_cmd *cmd;
6662 	struct sk_buff *skb;
6663 	u32 cfg;
6664 
6665 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6666 	if (!skb)
6667 		return ERR_PTR(-ENOMEM);
6668 
6669 	cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
6670 
6671 	if (module_enable) {
6672 		cfg = SM(log_level,
6673 			 ATH10K_DBGLOG_CFG_LOG_LVL);
6674 	} else {
6675 		/* set back defaults, all modules with WARN level */
6676 		cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
6677 			 ATH10K_DBGLOG_CFG_LOG_LVL);
6678 		module_enable = ~0;
6679 	}
6680 
6681 	cmd->module_enable = __cpu_to_le32(module_enable);
6682 	cmd->module_valid = __cpu_to_le32(~0);
6683 	cmd->config_enable = __cpu_to_le32(cfg);
6684 	cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
6685 
6686 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6687 		   "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
6688 		   __le32_to_cpu(cmd->module_enable),
6689 		   __le32_to_cpu(cmd->module_valid),
6690 		   __le32_to_cpu(cmd->config_enable),
6691 		   __le32_to_cpu(cmd->config_valid));
6692 	return skb;
6693 }
6694 
6695 static struct sk_buff *
6696 ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap)
6697 {
6698 	struct wmi_pdev_pktlog_enable_cmd *cmd;
6699 	struct sk_buff *skb;
6700 
6701 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6702 	if (!skb)
6703 		return ERR_PTR(-ENOMEM);
6704 
6705 	ev_bitmap &= ATH10K_PKTLOG_ANY;
6706 
6707 	cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data;
6708 	cmd->ev_bitmap = __cpu_to_le32(ev_bitmap);
6709 
6710 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
6711 		   ev_bitmap);
6712 	return skb;
6713 }
6714 
6715 static struct sk_buff *
6716 ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar)
6717 {
6718 	struct sk_buff *skb;
6719 
6720 	skb = ath10k_wmi_alloc_skb(ar, 0);
6721 	if (!skb)
6722 		return ERR_PTR(-ENOMEM);
6723 
6724 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
6725 	return skb;
6726 }
6727 
6728 static struct sk_buff *
6729 ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period,
6730 				      u32 duration, u32 next_offset,
6731 				      u32 enabled)
6732 {
6733 	struct wmi_pdev_set_quiet_cmd *cmd;
6734 	struct sk_buff *skb;
6735 
6736 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6737 	if (!skb)
6738 		return ERR_PTR(-ENOMEM);
6739 
6740 	cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data;
6741 	cmd->period = __cpu_to_le32(period);
6742 	cmd->duration = __cpu_to_le32(duration);
6743 	cmd->next_start = __cpu_to_le32(next_offset);
6744 	cmd->enabled = __cpu_to_le32(enabled);
6745 
6746 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6747 		   "wmi quiet param: period %u duration %u enabled %d\n",
6748 		   period, duration, enabled);
6749 	return skb;
6750 }
6751 
6752 static struct sk_buff *
6753 ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id,
6754 				   const u8 *mac)
6755 {
6756 	struct wmi_addba_clear_resp_cmd *cmd;
6757 	struct sk_buff *skb;
6758 
6759 	if (!mac)
6760 		return ERR_PTR(-EINVAL);
6761 
6762 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6763 	if (!skb)
6764 		return ERR_PTR(-ENOMEM);
6765 
6766 	cmd = (struct wmi_addba_clear_resp_cmd *)skb->data;
6767 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6768 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
6769 
6770 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6771 		   "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n",
6772 		   vdev_id, mac);
6773 	return skb;
6774 }
6775 
6776 static struct sk_buff *
6777 ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
6778 			     u32 tid, u32 buf_size)
6779 {
6780 	struct wmi_addba_send_cmd *cmd;
6781 	struct sk_buff *skb;
6782 
6783 	if (!mac)
6784 		return ERR_PTR(-EINVAL);
6785 
6786 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6787 	if (!skb)
6788 		return ERR_PTR(-ENOMEM);
6789 
6790 	cmd = (struct wmi_addba_send_cmd *)skb->data;
6791 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6792 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
6793 	cmd->tid = __cpu_to_le32(tid);
6794 	cmd->buffersize = __cpu_to_le32(buf_size);
6795 
6796 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6797 		   "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n",
6798 		   vdev_id, mac, tid, buf_size);
6799 	return skb;
6800 }
6801 
6802 static struct sk_buff *
6803 ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
6804 				 u32 tid, u32 status)
6805 {
6806 	struct wmi_addba_setresponse_cmd *cmd;
6807 	struct sk_buff *skb;
6808 
6809 	if (!mac)
6810 		return ERR_PTR(-EINVAL);
6811 
6812 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6813 	if (!skb)
6814 		return ERR_PTR(-ENOMEM);
6815 
6816 	cmd = (struct wmi_addba_setresponse_cmd *)skb->data;
6817 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6818 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
6819 	cmd->tid = __cpu_to_le32(tid);
6820 	cmd->statuscode = __cpu_to_le32(status);
6821 
6822 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6823 		   "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n",
6824 		   vdev_id, mac, tid, status);
6825 	return skb;
6826 }
6827 
6828 static struct sk_buff *
6829 ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
6830 			     u32 tid, u32 initiator, u32 reason)
6831 {
6832 	struct wmi_delba_send_cmd *cmd;
6833 	struct sk_buff *skb;
6834 
6835 	if (!mac)
6836 		return ERR_PTR(-EINVAL);
6837 
6838 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6839 	if (!skb)
6840 		return ERR_PTR(-ENOMEM);
6841 
6842 	cmd = (struct wmi_delba_send_cmd *)skb->data;
6843 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6844 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
6845 	cmd->tid = __cpu_to_le32(tid);
6846 	cmd->initiator = __cpu_to_le32(initiator);
6847 	cmd->reasoncode = __cpu_to_le32(reason);
6848 
6849 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6850 		   "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n",
6851 		   vdev_id, mac, tid, initiator, reason);
6852 	return skb;
6853 }
6854 
6855 static struct sk_buff *
6856 ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param)
6857 {
6858 	struct wmi_pdev_get_tpc_config_cmd *cmd;
6859 	struct sk_buff *skb;
6860 
6861 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6862 	if (!skb)
6863 		return ERR_PTR(-ENOMEM);
6864 
6865 	cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data;
6866 	cmd->param = __cpu_to_le32(param);
6867 
6868 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6869 		   "wmi pdev get tcp config param:%d\n", param);
6870 	return skb;
6871 }
6872 
6873 size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head)
6874 {
6875 	struct ath10k_fw_stats_peer *i;
6876 	size_t num = 0;
6877 
6878 	list_for_each_entry(i, head, list)
6879 		++num;
6880 
6881 	return num;
6882 }
6883 
6884 size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head)
6885 {
6886 	struct ath10k_fw_stats_vdev *i;
6887 	size_t num = 0;
6888 
6889 	list_for_each_entry(i, head, list)
6890 		++num;
6891 
6892 	return num;
6893 }
6894 
6895 static void
6896 ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
6897 				   char *buf, u32 *length)
6898 {
6899 	u32 len = *length;
6900 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
6901 
6902 	len += scnprintf(buf + len, buf_len - len, "\n");
6903 	len += scnprintf(buf + len, buf_len - len, "%30s\n",
6904 			"ath10k PDEV stats");
6905 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
6906 			"=================");
6907 
6908 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6909 			"Channel noise floor", pdev->ch_noise_floor);
6910 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6911 			"Channel TX power", pdev->chan_tx_power);
6912 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6913 			"TX frame count", pdev->tx_frame_count);
6914 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6915 			"RX frame count", pdev->rx_frame_count);
6916 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6917 			"RX clear count", pdev->rx_clear_count);
6918 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6919 			"Cycle count", pdev->cycle_count);
6920 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6921 			"PHY error count", pdev->phy_err_count);
6922 
6923 	*length = len;
6924 }
6925 
6926 static void
6927 ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
6928 				    char *buf, u32 *length)
6929 {
6930 	u32 len = *length;
6931 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
6932 
6933 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6934 			"RTS bad count", pdev->rts_bad);
6935 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6936 			"RTS good count", pdev->rts_good);
6937 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6938 			"FCS bad count", pdev->fcs_bad);
6939 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6940 			"No beacon count", pdev->no_beacons);
6941 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
6942 			"MIB int count", pdev->mib_int_count);
6943 
6944 	len += scnprintf(buf + len, buf_len - len, "\n");
6945 	*length = len;
6946 }
6947 
6948 static void
6949 ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
6950 				 char *buf, u32 *length)
6951 {
6952 	u32 len = *length;
6953 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
6954 
6955 	len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
6956 			 "ath10k PDEV TX stats");
6957 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
6958 				 "=================");
6959 
6960 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6961 			 "HTT cookies queued", pdev->comp_queued);
6962 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6963 			 "HTT cookies disp.", pdev->comp_delivered);
6964 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6965 			 "MSDU queued", pdev->msdu_enqued);
6966 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6967 			 "MPDU queued", pdev->mpdu_enqued);
6968 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6969 			 "MSDUs dropped", pdev->wmm_drop);
6970 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6971 			 "Local enqued", pdev->local_enqued);
6972 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6973 			 "Local freed", pdev->local_freed);
6974 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6975 			 "HW queued", pdev->hw_queued);
6976 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6977 			 "PPDUs reaped", pdev->hw_reaped);
6978 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6979 			 "Num underruns", pdev->underrun);
6980 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6981 			 "PPDUs cleaned", pdev->tx_abort);
6982 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6983 			 "MPDUs requed", pdev->mpdus_requed);
6984 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6985 			 "Excessive retries", pdev->tx_ko);
6986 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6987 			 "HW rate", pdev->data_rc);
6988 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6989 			 "Sched self tiggers", pdev->self_triggers);
6990 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6991 			 "Dropped due to SW retries",
6992 			 pdev->sw_retry_failure);
6993 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6994 			 "Illegal rate phy errors",
6995 			 pdev->illgl_rate_phy_err);
6996 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6997 			 "Pdev continuous xretry", pdev->pdev_cont_xretry);
6998 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
6999 			 "TX timeout", pdev->pdev_tx_timeout);
7000 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7001 			 "PDEV resets", pdev->pdev_resets);
7002 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7003 			 "PHY underrun", pdev->phy_underrun);
7004 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7005 			 "MPDU is more than txop limit", pdev->txop_ovf);
7006 	*length = len;
7007 }
7008 
7009 static void
7010 ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7011 				 char *buf, u32 *length)
7012 {
7013 	u32 len = *length;
7014 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7015 
7016 	len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
7017 			 "ath10k PDEV RX stats");
7018 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7019 				 "=================");
7020 
7021 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7022 			 "Mid PPDU route change",
7023 			 pdev->mid_ppdu_route_change);
7024 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7025 			 "Tot. number of statuses", pdev->status_rcvd);
7026 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7027 			 "Extra frags on rings 0", pdev->r0_frags);
7028 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7029 			 "Extra frags on rings 1", pdev->r1_frags);
7030 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7031 			 "Extra frags on rings 2", pdev->r2_frags);
7032 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7033 			 "Extra frags on rings 3", pdev->r3_frags);
7034 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7035 			 "MSDUs delivered to HTT", pdev->htt_msdus);
7036 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7037 			 "MPDUs delivered to HTT", pdev->htt_mpdus);
7038 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7039 			 "MSDUs delivered to stack", pdev->loc_msdus);
7040 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7041 			 "MPDUs delivered to stack", pdev->loc_mpdus);
7042 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7043 			 "Oversized AMSUs", pdev->oversize_amsdu);
7044 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7045 			 "PHY errors", pdev->phy_errs);
7046 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7047 			 "PHY errors drops", pdev->phy_err_drop);
7048 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7049 			 "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs);
7050 	*length = len;
7051 }
7052 
7053 static void
7054 ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev,
7055 			      char *buf, u32 *length)
7056 {
7057 	u32 len = *length;
7058 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7059 	int i;
7060 
7061 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7062 			"vdev id", vdev->vdev_id);
7063 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7064 			"beacon snr", vdev->beacon_snr);
7065 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7066 			"data snr", vdev->data_snr);
7067 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7068 			"num rx frames", vdev->num_rx_frames);
7069 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7070 			"num rts fail", vdev->num_rts_fail);
7071 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7072 			"num rts success", vdev->num_rts_success);
7073 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7074 			"num rx err", vdev->num_rx_err);
7075 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7076 			"num rx discard", vdev->num_rx_discard);
7077 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7078 			"num tx not acked", vdev->num_tx_not_acked);
7079 
7080 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++)
7081 		len += scnprintf(buf + len, buf_len - len,
7082 				"%25s [%02d] %u\n",
7083 				"num tx frames", i,
7084 				vdev->num_tx_frames[i]);
7085 
7086 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++)
7087 		len += scnprintf(buf + len, buf_len - len,
7088 				"%25s [%02d] %u\n",
7089 				"num tx frames retries", i,
7090 				vdev->num_tx_frames_retries[i]);
7091 
7092 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++)
7093 		len += scnprintf(buf + len, buf_len - len,
7094 				"%25s [%02d] %u\n",
7095 				"num tx frames failures", i,
7096 				vdev->num_tx_frames_failures[i]);
7097 
7098 	for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++)
7099 		len += scnprintf(buf + len, buf_len - len,
7100 				"%25s [%02d] 0x%08x\n",
7101 				"tx rate history", i,
7102 				vdev->tx_rate_history[i]);
7103 
7104 	for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++)
7105 		len += scnprintf(buf + len, buf_len - len,
7106 				"%25s [%02d] %u\n",
7107 				"beacon rssi history", i,
7108 				vdev->beacon_rssi_history[i]);
7109 
7110 	len += scnprintf(buf + len, buf_len - len, "\n");
7111 	*length = len;
7112 }
7113 
7114 static void
7115 ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer,
7116 			      char *buf, u32 *length)
7117 {
7118 	u32 len = *length;
7119 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7120 
7121 	len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
7122 			"Peer MAC address", peer->peer_macaddr);
7123 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7124 			"Peer RSSI", peer->peer_rssi);
7125 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7126 			"Peer TX rate", peer->peer_tx_rate);
7127 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7128 			"Peer RX rate", peer->peer_rx_rate);
7129 	len += scnprintf(buf + len, buf_len - len, "\n");
7130 	*length = len;
7131 }
7132 
7133 void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar,
7134 				      struct ath10k_fw_stats *fw_stats,
7135 				      char *buf)
7136 {
7137 	u32 len = 0;
7138 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7139 	const struct ath10k_fw_stats_pdev *pdev;
7140 	const struct ath10k_fw_stats_vdev *vdev;
7141 	const struct ath10k_fw_stats_peer *peer;
7142 	size_t num_peers;
7143 	size_t num_vdevs;
7144 
7145 	spin_lock_bh(&ar->data_lock);
7146 
7147 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
7148 					struct ath10k_fw_stats_pdev, list);
7149 	if (!pdev) {
7150 		ath10k_warn(ar, "failed to get pdev stats\n");
7151 		goto unlock;
7152 	}
7153 
7154 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
7155 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
7156 
7157 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
7158 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
7159 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
7160 
7161 	len += scnprintf(buf + len, buf_len - len, "\n");
7162 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7163 			 "ath10k VDEV stats", num_vdevs);
7164 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7165 				 "=================");
7166 
7167 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
7168 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
7169 	}
7170 
7171 	len += scnprintf(buf + len, buf_len - len, "\n");
7172 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7173 			 "ath10k PEER stats", num_peers);
7174 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7175 				 "=================");
7176 
7177 	list_for_each_entry(peer, &fw_stats->peers, list) {
7178 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
7179 	}
7180 
7181 unlock:
7182 	spin_unlock_bh(&ar->data_lock);
7183 
7184 	if (len >= buf_len)
7185 		buf[len - 1] = 0;
7186 	else
7187 		buf[len] = 0;
7188 }
7189 
7190 void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar,
7191 				     struct ath10k_fw_stats *fw_stats,
7192 				     char *buf)
7193 {
7194 	unsigned int len = 0;
7195 	unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
7196 	const struct ath10k_fw_stats_pdev *pdev;
7197 	const struct ath10k_fw_stats_vdev *vdev;
7198 	const struct ath10k_fw_stats_peer *peer;
7199 	size_t num_peers;
7200 	size_t num_vdevs;
7201 
7202 	spin_lock_bh(&ar->data_lock);
7203 
7204 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
7205 					struct ath10k_fw_stats_pdev, list);
7206 	if (!pdev) {
7207 		ath10k_warn(ar, "failed to get pdev stats\n");
7208 		goto unlock;
7209 	}
7210 
7211 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
7212 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
7213 
7214 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
7215 	ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
7216 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
7217 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
7218 
7219 	len += scnprintf(buf + len, buf_len - len, "\n");
7220 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7221 			 "ath10k VDEV stats", num_vdevs);
7222 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7223 				 "=================");
7224 
7225 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
7226 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
7227 	}
7228 
7229 	len += scnprintf(buf + len, buf_len - len, "\n");
7230 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7231 			 "ath10k PEER stats", num_peers);
7232 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7233 				 "=================");
7234 
7235 	list_for_each_entry(peer, &fw_stats->peers, list) {
7236 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
7237 	}
7238 
7239 unlock:
7240 	spin_unlock_bh(&ar->data_lock);
7241 
7242 	if (len >= buf_len)
7243 		buf[len - 1] = 0;
7244 	else
7245 		buf[len] = 0;
7246 }
7247 
7248 static struct sk_buff *
7249 ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
7250 					   u32 detect_level, u32 detect_margin)
7251 {
7252 	struct wmi_pdev_set_adaptive_cca_params *cmd;
7253 	struct sk_buff *skb;
7254 
7255 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7256 	if (!skb)
7257 		return ERR_PTR(-ENOMEM);
7258 
7259 	cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data;
7260 	cmd->enable = __cpu_to_le32(enable);
7261 	cmd->cca_detect_level = __cpu_to_le32(detect_level);
7262 	cmd->cca_detect_margin = __cpu_to_le32(detect_margin);
7263 
7264 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7265 		   "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
7266 		   enable, detect_level, detect_margin);
7267 	return skb;
7268 }
7269 
7270 void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar,
7271 				      struct ath10k_fw_stats *fw_stats,
7272 				      char *buf)
7273 {
7274 	u32 len = 0;
7275 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7276 	const struct ath10k_fw_stats_pdev *pdev;
7277 	const struct ath10k_fw_stats_vdev *vdev;
7278 	const struct ath10k_fw_stats_peer *peer;
7279 	size_t num_peers;
7280 	size_t num_vdevs;
7281 
7282 	spin_lock_bh(&ar->data_lock);
7283 
7284 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
7285 					struct ath10k_fw_stats_pdev, list);
7286 	if (!pdev) {
7287 		ath10k_warn(ar, "failed to get pdev stats\n");
7288 		goto unlock;
7289 	}
7290 
7291 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
7292 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
7293 
7294 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
7295 	ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
7296 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
7297 
7298 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7299 			"HW paused", pdev->hw_paused);
7300 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7301 			"Seqs posted", pdev->seq_posted);
7302 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7303 			"Seqs failed queueing", pdev->seq_failed_queueing);
7304 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7305 			"Seqs completed", pdev->seq_completed);
7306 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7307 			"Seqs restarted", pdev->seq_restarted);
7308 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7309 			"MU Seqs posted", pdev->mu_seq_posted);
7310 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7311 			"MPDUs SW flushed", pdev->mpdus_sw_flush);
7312 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7313 			"MPDUs HW filtered", pdev->mpdus_hw_filter);
7314 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7315 			"MPDUs truncated", pdev->mpdus_truncated);
7316 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7317 			"MPDUs receive no ACK", pdev->mpdus_ack_failed);
7318 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7319 			"MPDUs expired", pdev->mpdus_expired);
7320 
7321 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
7322 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7323 			"Num Rx Overflow errors", pdev->rx_ovfl_errs);
7324 
7325 	len += scnprintf(buf + len, buf_len - len, "\n");
7326 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7327 			"ath10k VDEV stats", num_vdevs);
7328 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7329 				"=================");
7330 
7331 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
7332 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
7333 	}
7334 
7335 	len += scnprintf(buf + len, buf_len - len, "\n");
7336 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7337 			"ath10k PEER stats", num_peers);
7338 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7339 				"=================");
7340 
7341 	list_for_each_entry(peer, &fw_stats->peers, list) {
7342 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
7343 	}
7344 
7345 unlock:
7346 	spin_unlock_bh(&ar->data_lock);
7347 
7348 	if (len >= buf_len)
7349 		buf[len - 1] = 0;
7350 	else
7351 		buf[len] = 0;
7352 }
7353 
7354 static const struct wmi_ops wmi_ops = {
7355 	.rx = ath10k_wmi_op_rx,
7356 	.map_svc = wmi_main_svc_map,
7357 
7358 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7359 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7360 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7361 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7362 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7363 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7364 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7365 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7366 	.pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
7367 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7368 	.pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats,
7369 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
7370 
7371 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7372 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7373 	.gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd,
7374 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7375 	.gen_init = ath10k_wmi_op_gen_init,
7376 	.gen_start_scan = ath10k_wmi_op_gen_start_scan,
7377 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7378 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7379 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7380 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7381 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7382 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7383 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7384 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7385 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7386 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7387 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
7388 	/* .gen_vdev_wmm_conf not implemented */
7389 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7390 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7391 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7392 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7393 	.gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc,
7394 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7395 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7396 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7397 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7398 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7399 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7400 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7401 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7402 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7403 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7404 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7405 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7406 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7407 	/* .gen_pdev_get_temperature not implemented */
7408 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
7409 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
7410 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
7411 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7412 	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
7413 	/* .gen_bcn_tmpl not implemented */
7414 	/* .gen_prb_tmpl not implemented */
7415 	/* .gen_p2p_go_bcn_ie not implemented */
7416 	/* .gen_adaptive_qcs not implemented */
7417 	/* .gen_pdev_enable_adaptive_cca not implemented */
7418 };
7419 
7420 static const struct wmi_ops wmi_10_1_ops = {
7421 	.rx = ath10k_wmi_10_1_op_rx,
7422 	.map_svc = wmi_10x_svc_map,
7423 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
7424 	.pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats,
7425 	.gen_init = ath10k_wmi_10_1_op_gen_init,
7426 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
7427 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
7428 	.gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc,
7429 	/* .gen_pdev_get_temperature not implemented */
7430 
7431 	/* shared with main branch */
7432 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7433 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7434 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7435 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7436 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7437 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7438 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7439 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7440 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7441 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
7442 
7443 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7444 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7445 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7446 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7447 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7448 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7449 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7450 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7451 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7452 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7453 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7454 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7455 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7456 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
7457 	/* .gen_vdev_wmm_conf not implemented */
7458 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7459 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7460 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7461 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7462 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7463 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7464 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7465 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7466 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7467 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7468 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7469 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7470 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7471 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7472 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7473 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7474 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7475 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
7476 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
7477 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
7478 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7479 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
7480 	/* .gen_bcn_tmpl not implemented */
7481 	/* .gen_prb_tmpl not implemented */
7482 	/* .gen_p2p_go_bcn_ie not implemented */
7483 	/* .gen_adaptive_qcs not implemented */
7484 	/* .gen_pdev_enable_adaptive_cca not implemented */
7485 };
7486 
7487 static const struct wmi_ops wmi_10_2_ops = {
7488 	.rx = ath10k_wmi_10_2_op_rx,
7489 	.pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats,
7490 	.gen_init = ath10k_wmi_10_2_op_gen_init,
7491 	.gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
7492 	/* .gen_pdev_get_temperature not implemented */
7493 
7494 	/* shared with 10.1 */
7495 	.map_svc = wmi_10x_svc_map,
7496 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
7497 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
7498 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
7499 
7500 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7501 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7502 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7503 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7504 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7505 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7506 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7507 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7508 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7509 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
7510 
7511 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7512 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7513 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7514 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7515 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7516 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7517 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7518 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7519 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7520 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7521 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7522 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7523 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7524 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
7525 	/* .gen_vdev_wmm_conf not implemented */
7526 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7527 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7528 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7529 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7530 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7531 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7532 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7533 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7534 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7535 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7536 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7537 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7538 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7539 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7540 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7541 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7542 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7543 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
7544 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
7545 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
7546 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7547 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
7548 	/* .gen_pdev_enable_adaptive_cca not implemented */
7549 };
7550 
7551 static const struct wmi_ops wmi_10_2_4_ops = {
7552 	.rx = ath10k_wmi_10_2_op_rx,
7553 	.pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats,
7554 	.gen_init = ath10k_wmi_10_2_op_gen_init,
7555 	.gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
7556 	.gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
7557 
7558 	/* shared with 10.1 */
7559 	.map_svc = wmi_10x_svc_map,
7560 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
7561 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
7562 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
7563 
7564 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7565 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7566 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7567 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7568 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7569 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7570 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7571 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7572 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7573 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
7574 
7575 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7576 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7577 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7578 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7579 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7580 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7581 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7582 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7583 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7584 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7585 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7586 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7587 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7588 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
7589 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7590 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7591 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7592 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7593 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7594 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7595 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7596 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7597 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7598 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7599 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7600 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7601 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7602 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7603 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7604 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7605 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7606 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
7607 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
7608 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
7609 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7610 	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
7611 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
7612 	.gen_pdev_enable_adaptive_cca =
7613 		ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
7614 	/* .gen_bcn_tmpl not implemented */
7615 	/* .gen_prb_tmpl not implemented */
7616 	/* .gen_p2p_go_bcn_ie not implemented */
7617 	/* .gen_adaptive_qcs not implemented */
7618 };
7619 
7620 static const struct wmi_ops wmi_10_4_ops = {
7621 	.rx = ath10k_wmi_10_4_op_rx,
7622 	.map_svc = wmi_10_4_svc_map,
7623 
7624 	.pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats,
7625 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7626 	.pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev,
7627 	.pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev,
7628 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7629 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7630 	.pull_swba = ath10k_wmi_10_4_op_pull_swba_ev,
7631 	.pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr,
7632 	.pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
7633 	.pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
7634 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7635 	.get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,
7636 
7637 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7638 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7639 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
7640 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7641 	.gen_init = ath10k_wmi_10_4_op_gen_init,
7642 	.gen_start_scan = ath10k_wmi_op_gen_start_scan,
7643 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7644 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7645 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7646 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7647 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7648 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7649 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7650 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7651 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7652 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7653 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
7654 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7655 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7656 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7657 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7658 	.gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc,
7659 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7660 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7661 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7662 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7663 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7664 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7665 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7666 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7667 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7668 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7669 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7670 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7671 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
7672 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
7673 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
7674 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7675 	.fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill,
7676 
7677 	/* shared with 10.2 */
7678 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7679 	.gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
7680 };
7681 
7682 int ath10k_wmi_attach(struct ath10k *ar)
7683 {
7684 	switch (ar->wmi.op_version) {
7685 	case ATH10K_FW_WMI_OP_VERSION_10_4:
7686 		ar->wmi.ops = &wmi_10_4_ops;
7687 		ar->wmi.cmd = &wmi_10_4_cmd_map;
7688 		ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
7689 		ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
7690 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
7691 		break;
7692 	case ATH10K_FW_WMI_OP_VERSION_10_2_4:
7693 		ar->wmi.cmd = &wmi_10_2_4_cmd_map;
7694 		ar->wmi.ops = &wmi_10_2_4_ops;
7695 		ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
7696 		ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
7697 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
7698 		break;
7699 	case ATH10K_FW_WMI_OP_VERSION_10_2:
7700 		ar->wmi.cmd = &wmi_10_2_cmd_map;
7701 		ar->wmi.ops = &wmi_10_2_ops;
7702 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
7703 		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
7704 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
7705 		break;
7706 	case ATH10K_FW_WMI_OP_VERSION_10_1:
7707 		ar->wmi.cmd = &wmi_10x_cmd_map;
7708 		ar->wmi.ops = &wmi_10_1_ops;
7709 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
7710 		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
7711 		ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
7712 		break;
7713 	case ATH10K_FW_WMI_OP_VERSION_MAIN:
7714 		ar->wmi.cmd = &wmi_cmd_map;
7715 		ar->wmi.ops = &wmi_ops;
7716 		ar->wmi.vdev_param = &wmi_vdev_param_map;
7717 		ar->wmi.pdev_param = &wmi_pdev_param_map;
7718 		ar->wmi.peer_flags = &wmi_peer_flags_map;
7719 		break;
7720 	case ATH10K_FW_WMI_OP_VERSION_TLV:
7721 		ath10k_wmi_tlv_attach(ar);
7722 		break;
7723 	case ATH10K_FW_WMI_OP_VERSION_UNSET:
7724 	case ATH10K_FW_WMI_OP_VERSION_MAX:
7725 		ath10k_err(ar, "unsupported WMI op version: %d\n",
7726 			   ar->wmi.op_version);
7727 		return -EINVAL;
7728 	}
7729 
7730 	init_completion(&ar->wmi.service_ready);
7731 	init_completion(&ar->wmi.unified_ready);
7732 
7733 	INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work);
7734 
7735 	return 0;
7736 }
7737 
7738 void ath10k_wmi_free_host_mem(struct ath10k *ar)
7739 {
7740 	int i;
7741 
7742 	/* free the host memory chunks requested by firmware */
7743 	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
7744 		dma_unmap_single(ar->dev,
7745 				 ar->wmi.mem_chunks[i].paddr,
7746 				 ar->wmi.mem_chunks[i].len,
7747 				 DMA_TO_DEVICE);
7748 		kfree(ar->wmi.mem_chunks[i].vaddr);
7749 	}
7750 
7751 	ar->wmi.num_mem_chunks = 0;
7752 }
7753 
7754 void ath10k_wmi_detach(struct ath10k *ar)
7755 {
7756 	cancel_work_sync(&ar->svc_rdy_work);
7757 
7758 	if (ar->svc_rdy_skb)
7759 		dev_kfree_skb(ar->svc_rdy_skb);
7760 }
7761