OSDN Git Service

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