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