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