xref: /openbmc/linux/drivers/net/wireless/ath/ath10k/wmi.c (revision 75b34800)
15e3dd157SKalle Valo /*
25e3dd157SKalle Valo  * Copyright (c) 2005-2011 Atheros Communications Inc.
35e3dd157SKalle Valo  * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
45e3dd157SKalle Valo  *
55e3dd157SKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
65e3dd157SKalle Valo  * purpose with or without fee is hereby granted, provided that the above
75e3dd157SKalle Valo  * copyright notice and this permission notice appear in all copies.
85e3dd157SKalle Valo  *
95e3dd157SKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
105e3dd157SKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
115e3dd157SKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
125e3dd157SKalle Valo  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
135e3dd157SKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
145e3dd157SKalle Valo  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
155e3dd157SKalle Valo  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
165e3dd157SKalle Valo  */
175e3dd157SKalle Valo 
185e3dd157SKalle Valo #include <linux/skbuff.h>
192fe5288cSKalle Valo #include <linux/ctype.h>
205e3dd157SKalle Valo 
215e3dd157SKalle Valo #include "core.h"
225e3dd157SKalle Valo #include "htc.h"
235e3dd157SKalle Valo #include "debug.h"
245e3dd157SKalle Valo #include "wmi.h"
25ca996ec5SMichal Kazior #include "wmi-tlv.h"
265e3dd157SKalle Valo #include "mac.h"
2743d2a30fSKalle Valo #include "testmode.h"
28d7579d12SMichal Kazior #include "wmi-ops.h"
296a94888fSMichal Kazior #include "p2p.h"
30587f7031SMichal Kazior #include "hw.h"
315e3dd157SKalle Valo 
3220ddca21SMichal Kazior #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9
3320ddca21SMichal Kazior #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ)
3420ddca21SMichal Kazior 
35ce42870eSBartosz Markowski /* MAIN WMI cmd track */
36ce42870eSBartosz Markowski static struct wmi_cmd_map wmi_cmd_map = {
37ce42870eSBartosz Markowski 	.init_cmdid = WMI_INIT_CMDID,
38ce42870eSBartosz Markowski 	.start_scan_cmdid = WMI_START_SCAN_CMDID,
39ce42870eSBartosz Markowski 	.stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
40ce42870eSBartosz Markowski 	.scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
41ce42870eSBartosz Markowski 	.scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
42ce42870eSBartosz Markowski 	.pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
43ce42870eSBartosz Markowski 	.pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
44ce42870eSBartosz Markowski 	.pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
45ce42870eSBartosz Markowski 	.pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
46ce42870eSBartosz Markowski 	.pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
47ce42870eSBartosz Markowski 	.pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
48ce42870eSBartosz Markowski 	.pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
49ce42870eSBartosz Markowski 	.pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
50ce42870eSBartosz Markowski 	.pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
51ce42870eSBartosz Markowski 	.pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
52ce42870eSBartosz Markowski 	.pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
53ce42870eSBartosz Markowski 	.pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
54ce42870eSBartosz Markowski 	.pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
55ce42870eSBartosz Markowski 	.vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
56ce42870eSBartosz Markowski 	.vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
57ce42870eSBartosz Markowski 	.vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
58ce42870eSBartosz Markowski 	.vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
59ce42870eSBartosz Markowski 	.vdev_up_cmdid = WMI_VDEV_UP_CMDID,
60ce42870eSBartosz Markowski 	.vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
61ce42870eSBartosz Markowski 	.vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
62ce42870eSBartosz Markowski 	.vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
63ce42870eSBartosz Markowski 	.vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
64ce42870eSBartosz Markowski 	.peer_create_cmdid = WMI_PEER_CREATE_CMDID,
65ce42870eSBartosz Markowski 	.peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
66ce42870eSBartosz Markowski 	.peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
67ce42870eSBartosz Markowski 	.peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
68ce42870eSBartosz Markowski 	.peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
69ce42870eSBartosz Markowski 	.peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
70ce42870eSBartosz Markowski 	.peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
71ce42870eSBartosz Markowski 	.peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
72ce42870eSBartosz Markowski 	.bcn_tx_cmdid = WMI_BCN_TX_CMDID,
73ce42870eSBartosz Markowski 	.pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
74ce42870eSBartosz Markowski 	.bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
75ce42870eSBartosz Markowski 	.bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
76ce42870eSBartosz Markowski 	.prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
77ce42870eSBartosz Markowski 	.mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
78ce42870eSBartosz Markowski 	.prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
79ce42870eSBartosz Markowski 	.addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
80ce42870eSBartosz Markowski 	.addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
81ce42870eSBartosz Markowski 	.addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
82ce42870eSBartosz Markowski 	.delba_send_cmdid = WMI_DELBA_SEND_CMDID,
83ce42870eSBartosz Markowski 	.addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
84ce42870eSBartosz Markowski 	.send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
85ce42870eSBartosz Markowski 	.sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
86ce42870eSBartosz Markowski 	.sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
87ce42870eSBartosz Markowski 	.sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
88ce42870eSBartosz Markowski 	.pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
89ce42870eSBartosz Markowski 	.pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
90ce42870eSBartosz Markowski 	.roam_scan_mode = WMI_ROAM_SCAN_MODE,
91ce42870eSBartosz Markowski 	.roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
92ce42870eSBartosz Markowski 	.roam_scan_period = WMI_ROAM_SCAN_PERIOD,
93ce42870eSBartosz Markowski 	.roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
94ce42870eSBartosz Markowski 	.roam_ap_profile = WMI_ROAM_AP_PROFILE,
95ce42870eSBartosz Markowski 	.ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
96ce42870eSBartosz Markowski 	.ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
97ce42870eSBartosz Markowski 	.ofl_scan_period = WMI_OFL_SCAN_PERIOD,
98ce42870eSBartosz Markowski 	.p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
99ce42870eSBartosz Markowski 	.p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
100ce42870eSBartosz Markowski 	.p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
101ce42870eSBartosz Markowski 	.p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
102ce42870eSBartosz Markowski 	.p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
103ce42870eSBartosz Markowski 	.ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
104ce42870eSBartosz Markowski 	.ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
105ce42870eSBartosz Markowski 	.peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
106ce42870eSBartosz Markowski 	.wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
107ce42870eSBartosz Markowski 	.wlan_profile_set_hist_intvl_cmdid =
108ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
109ce42870eSBartosz Markowski 	.wlan_profile_get_profile_data_cmdid =
110ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
111ce42870eSBartosz Markowski 	.wlan_profile_enable_profile_id_cmdid =
112ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
113ce42870eSBartosz Markowski 	.wlan_profile_list_profile_id_cmdid =
114ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
115ce42870eSBartosz Markowski 	.pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
116ce42870eSBartosz Markowski 	.pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
117ce42870eSBartosz Markowski 	.add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
118ce42870eSBartosz Markowski 	.rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
119ce42870eSBartosz Markowski 	.wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
120ce42870eSBartosz Markowski 	.wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
121ce42870eSBartosz Markowski 	.wow_enable_disable_wake_event_cmdid =
122ce42870eSBartosz Markowski 				WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
123ce42870eSBartosz Markowski 	.wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
124ce42870eSBartosz Markowski 	.wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
125ce42870eSBartosz Markowski 	.rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
126ce42870eSBartosz Markowski 	.rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
127ce42870eSBartosz Markowski 	.vdev_spectral_scan_configure_cmdid =
128ce42870eSBartosz Markowski 				WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
129ce42870eSBartosz Markowski 	.vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
130ce42870eSBartosz Markowski 	.request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
131ce42870eSBartosz Markowski 	.set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
132ce42870eSBartosz Markowski 	.network_list_offload_config_cmdid =
133ce42870eSBartosz Markowski 				WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
134ce42870eSBartosz Markowski 	.gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
135ce42870eSBartosz Markowski 	.csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
136ce42870eSBartosz Markowski 	.csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
137ce42870eSBartosz Markowski 	.chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
138ce42870eSBartosz Markowski 	.peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
139ce42870eSBartosz Markowski 	.peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
140ce42870eSBartosz Markowski 	.sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
141ce42870eSBartosz Markowski 	.sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
142ce42870eSBartosz Markowski 	.sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
143ce42870eSBartosz Markowski 	.echo_cmdid = WMI_ECHO_CMDID,
144ce42870eSBartosz Markowski 	.pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
145ce42870eSBartosz Markowski 	.dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
146ce42870eSBartosz Markowski 	.pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
147ce42870eSBartosz Markowski 	.pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
148ce42870eSBartosz Markowski 	.vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
149ce42870eSBartosz Markowski 	.vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
150ce42870eSBartosz Markowski 	.force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
151ce42870eSBartosz Markowski 	.gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
152ce42870eSBartosz Markowski 	.gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
153a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
15462f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
155772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
156772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
157772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
158772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
159772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
160772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
161772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
162772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
163772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
164772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
165772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
166772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
167772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
168772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
169772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
170772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
171772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
172772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
173772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
174772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
175772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
176772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
177772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
178772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
179772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
180772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
181772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
182772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
183772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
184772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
185772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
186772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
187772b4aeeSRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
188772b4aeeSRaja Mani 	.pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
189772b4aeeSRaja Mani 	.pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
190772b4aeeSRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
191772b4aeeSRaja Mani 	.pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
192772b4aeeSRaja Mani 	.vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
193772b4aeeSRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
194772b4aeeSRaja Mani 	.mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
195772b4aeeSRaja Mani 	.set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
196772b4aeeSRaja Mani 	.pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
197ce42870eSBartosz Markowski };
198ce42870eSBartosz Markowski 
199b7e3adf9SBartosz Markowski /* 10.X WMI cmd track */
200b7e3adf9SBartosz Markowski static struct wmi_cmd_map wmi_10x_cmd_map = {
201b7e3adf9SBartosz Markowski 	.init_cmdid = WMI_10X_INIT_CMDID,
202b7e3adf9SBartosz Markowski 	.start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
203b7e3adf9SBartosz Markowski 	.stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
204b7e3adf9SBartosz Markowski 	.scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
20534957b25SBartosz Markowski 	.scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
206b7e3adf9SBartosz Markowski 	.pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
207b7e3adf9SBartosz Markowski 	.pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
208b7e3adf9SBartosz Markowski 	.pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
209b7e3adf9SBartosz Markowski 	.pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
210b7e3adf9SBartosz Markowski 	.pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
211b7e3adf9SBartosz Markowski 	.pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
212b7e3adf9SBartosz Markowski 	.pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
213b7e3adf9SBartosz Markowski 	.pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
214b7e3adf9SBartosz Markowski 	.pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
215b7e3adf9SBartosz Markowski 	.pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
216b7e3adf9SBartosz Markowski 	.pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
217b7e3adf9SBartosz Markowski 	.pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
218b7e3adf9SBartosz Markowski 	.pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
219b7e3adf9SBartosz Markowski 	.vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
220b7e3adf9SBartosz Markowski 	.vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
221b7e3adf9SBartosz Markowski 	.vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
222b7e3adf9SBartosz Markowski 	.vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
223b7e3adf9SBartosz Markowski 	.vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
224b7e3adf9SBartosz Markowski 	.vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
225b7e3adf9SBartosz Markowski 	.vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
226b7e3adf9SBartosz Markowski 	.vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
227b7e3adf9SBartosz Markowski 	.vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
228b7e3adf9SBartosz Markowski 	.peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
229b7e3adf9SBartosz Markowski 	.peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
230b7e3adf9SBartosz Markowski 	.peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
231b7e3adf9SBartosz Markowski 	.peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
232b7e3adf9SBartosz Markowski 	.peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
233b7e3adf9SBartosz Markowski 	.peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
234b7e3adf9SBartosz Markowski 	.peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
235b7e3adf9SBartosz Markowski 	.peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
236b7e3adf9SBartosz Markowski 	.bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
237b7e3adf9SBartosz Markowski 	.pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
23834957b25SBartosz Markowski 	.bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
239b7e3adf9SBartosz Markowski 	.bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
240b7e3adf9SBartosz Markowski 	.prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
241b7e3adf9SBartosz Markowski 	.mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
24234957b25SBartosz Markowski 	.prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
243b7e3adf9SBartosz Markowski 	.addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
244b7e3adf9SBartosz Markowski 	.addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
245b7e3adf9SBartosz Markowski 	.addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
246b7e3adf9SBartosz Markowski 	.delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
247b7e3adf9SBartosz Markowski 	.addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
248b7e3adf9SBartosz Markowski 	.send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
249b7e3adf9SBartosz Markowski 	.sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
250b7e3adf9SBartosz Markowski 	.sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
251b7e3adf9SBartosz Markowski 	.sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
252b7e3adf9SBartosz Markowski 	.pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
253b7e3adf9SBartosz Markowski 	.pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
254b7e3adf9SBartosz Markowski 	.roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
255b7e3adf9SBartosz Markowski 	.roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
256b7e3adf9SBartosz Markowski 	.roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
257b7e3adf9SBartosz Markowski 	.roam_scan_rssi_change_threshold =
258b7e3adf9SBartosz Markowski 				WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
259b7e3adf9SBartosz Markowski 	.roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
260b7e3adf9SBartosz Markowski 	.ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
261b7e3adf9SBartosz Markowski 	.ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
262b7e3adf9SBartosz Markowski 	.ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
263b7e3adf9SBartosz Markowski 	.p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
264b7e3adf9SBartosz Markowski 	.p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
265b7e3adf9SBartosz Markowski 	.p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
266b7e3adf9SBartosz Markowski 	.p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
26734957b25SBartosz Markowski 	.p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
268542fb174SJanusz Dziedzic 	.ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID,
26934957b25SBartosz Markowski 	.ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
270b7e3adf9SBartosz Markowski 	.peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
271b7e3adf9SBartosz Markowski 	.wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
272b7e3adf9SBartosz Markowski 	.wlan_profile_set_hist_intvl_cmdid =
273b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
274b7e3adf9SBartosz Markowski 	.wlan_profile_get_profile_data_cmdid =
275b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
276b7e3adf9SBartosz Markowski 	.wlan_profile_enable_profile_id_cmdid =
277b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
278b7e3adf9SBartosz Markowski 	.wlan_profile_list_profile_id_cmdid =
279b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
280b7e3adf9SBartosz Markowski 	.pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
281b7e3adf9SBartosz Markowski 	.pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
282b7e3adf9SBartosz Markowski 	.add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
283b7e3adf9SBartosz Markowski 	.rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
284b7e3adf9SBartosz Markowski 	.wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
285b7e3adf9SBartosz Markowski 	.wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
286b7e3adf9SBartosz Markowski 	.wow_enable_disable_wake_event_cmdid =
287b7e3adf9SBartosz Markowski 				WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
288b7e3adf9SBartosz Markowski 	.wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
289b7e3adf9SBartosz Markowski 	.wow_hostwakeup_from_sleep_cmdid =
290b7e3adf9SBartosz Markowski 				WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
291b7e3adf9SBartosz Markowski 	.rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
292b7e3adf9SBartosz Markowski 	.rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
293b7e3adf9SBartosz Markowski 	.vdev_spectral_scan_configure_cmdid =
294b7e3adf9SBartosz Markowski 				WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
295b7e3adf9SBartosz Markowski 	.vdev_spectral_scan_enable_cmdid =
296b7e3adf9SBartosz Markowski 				WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
297b7e3adf9SBartosz Markowski 	.request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
29834957b25SBartosz Markowski 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
29934957b25SBartosz Markowski 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
30034957b25SBartosz Markowski 	.gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
30134957b25SBartosz Markowski 	.csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
30234957b25SBartosz Markowski 	.csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
30334957b25SBartosz Markowski 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
30434957b25SBartosz Markowski 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
30534957b25SBartosz Markowski 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
30634957b25SBartosz Markowski 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
30734957b25SBartosz Markowski 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
30834957b25SBartosz Markowski 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
309b7e3adf9SBartosz Markowski 	.echo_cmdid = WMI_10X_ECHO_CMDID,
310b7e3adf9SBartosz Markowski 	.pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
311b7e3adf9SBartosz Markowski 	.dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
312b7e3adf9SBartosz Markowski 	.pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
31334957b25SBartosz Markowski 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
31434957b25SBartosz Markowski 	.vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
31534957b25SBartosz Markowski 	.vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
31634957b25SBartosz Markowski 	.force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
317b7e3adf9SBartosz Markowski 	.gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
318b7e3adf9SBartosz Markowski 	.gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
319a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
32062f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
321772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
322772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
323772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
324772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
325772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
326772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
327772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
328772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
329772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
330772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
331772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
332772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
333772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
334772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
335772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
336772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
337772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
338772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
339772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
340772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
341772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
342772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
343772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
344772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
345772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
346772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
347772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
348772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
349772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
350772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
351772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
352772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
353772b4aeeSRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
354772b4aeeSRaja Mani 	.pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
355772b4aeeSRaja Mani 	.pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
356772b4aeeSRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
357772b4aeeSRaja Mani 	.pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
358772b4aeeSRaja Mani 	.vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
359772b4aeeSRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
360772b4aeeSRaja Mani 	.mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
361772b4aeeSRaja Mani 	.set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
362772b4aeeSRaja Mani 	.pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
363b7e3adf9SBartosz Markowski };
364ce42870eSBartosz Markowski 
3654a16fbecSRajkumar Manoharan /* 10.2.4 WMI cmd track */
3664a16fbecSRajkumar Manoharan static struct wmi_cmd_map wmi_10_2_4_cmd_map = {
3674a16fbecSRajkumar Manoharan 	.init_cmdid = WMI_10_2_INIT_CMDID,
3684a16fbecSRajkumar Manoharan 	.start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
3694a16fbecSRajkumar Manoharan 	.stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
3704a16fbecSRajkumar Manoharan 	.scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
3714a16fbecSRajkumar Manoharan 	.scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
3724a16fbecSRajkumar Manoharan 	.pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
3734a16fbecSRajkumar Manoharan 	.pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
3744a16fbecSRajkumar Manoharan 	.pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
3754a16fbecSRajkumar Manoharan 	.pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
3764a16fbecSRajkumar Manoharan 	.pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
3774a16fbecSRajkumar Manoharan 	.pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
3784a16fbecSRajkumar Manoharan 	.pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
3794a16fbecSRajkumar Manoharan 	.pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
3804a16fbecSRajkumar Manoharan 	.pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
3814a16fbecSRajkumar Manoharan 	.pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
3824a16fbecSRajkumar Manoharan 	.pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
3834a16fbecSRajkumar Manoharan 	.pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
3844a16fbecSRajkumar Manoharan 	.vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
3854a16fbecSRajkumar Manoharan 	.vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
3864a16fbecSRajkumar Manoharan 	.vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
3874a16fbecSRajkumar Manoharan 	.vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
3884a16fbecSRajkumar Manoharan 	.vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
3894a16fbecSRajkumar Manoharan 	.vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
3904a16fbecSRajkumar Manoharan 	.vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
3914a16fbecSRajkumar Manoharan 	.vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
3924a16fbecSRajkumar Manoharan 	.vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
3934a16fbecSRajkumar Manoharan 	.peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
3944a16fbecSRajkumar Manoharan 	.peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
3954a16fbecSRajkumar Manoharan 	.peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
3964a16fbecSRajkumar Manoharan 	.peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
3974a16fbecSRajkumar Manoharan 	.peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
3984a16fbecSRajkumar Manoharan 	.peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
3994a16fbecSRajkumar Manoharan 	.peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
4004a16fbecSRajkumar Manoharan 	.peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
4014a16fbecSRajkumar Manoharan 	.bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
4024a16fbecSRajkumar Manoharan 	.pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
4034a16fbecSRajkumar Manoharan 	.bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
4044a16fbecSRajkumar Manoharan 	.bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
4054a16fbecSRajkumar Manoharan 	.prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
4064a16fbecSRajkumar Manoharan 	.mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
4074a16fbecSRajkumar Manoharan 	.prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
4084a16fbecSRajkumar Manoharan 	.addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
4094a16fbecSRajkumar Manoharan 	.addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
4104a16fbecSRajkumar Manoharan 	.addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
4114a16fbecSRajkumar Manoharan 	.delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
4124a16fbecSRajkumar Manoharan 	.addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
4134a16fbecSRajkumar Manoharan 	.send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
4144a16fbecSRajkumar Manoharan 	.sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
4154a16fbecSRajkumar Manoharan 	.sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
4164a16fbecSRajkumar Manoharan 	.sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
4174a16fbecSRajkumar Manoharan 	.pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
4184a16fbecSRajkumar Manoharan 	.pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
4194a16fbecSRajkumar Manoharan 	.roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
4204a16fbecSRajkumar Manoharan 	.roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
4214a16fbecSRajkumar Manoharan 	.roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
4224a16fbecSRajkumar Manoharan 	.roam_scan_rssi_change_threshold =
4234a16fbecSRajkumar Manoharan 				WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
4244a16fbecSRajkumar Manoharan 	.roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
4254a16fbecSRajkumar Manoharan 	.ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
4264a16fbecSRajkumar Manoharan 	.ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
4274a16fbecSRajkumar Manoharan 	.ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
4284a16fbecSRajkumar Manoharan 	.p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
4294a16fbecSRajkumar Manoharan 	.p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
4304a16fbecSRajkumar Manoharan 	.p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
4314a16fbecSRajkumar Manoharan 	.p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
4324a16fbecSRajkumar Manoharan 	.p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
4334a16fbecSRajkumar Manoharan 	.ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
4344a16fbecSRajkumar Manoharan 	.ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
4354a16fbecSRajkumar Manoharan 	.peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
4364a16fbecSRajkumar Manoharan 	.wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
4374a16fbecSRajkumar Manoharan 	.wlan_profile_set_hist_intvl_cmdid =
4384a16fbecSRajkumar Manoharan 				WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
4394a16fbecSRajkumar Manoharan 	.wlan_profile_get_profile_data_cmdid =
4404a16fbecSRajkumar Manoharan 				WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
4414a16fbecSRajkumar Manoharan 	.wlan_profile_enable_profile_id_cmdid =
4424a16fbecSRajkumar Manoharan 				WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
4434a16fbecSRajkumar Manoharan 	.wlan_profile_list_profile_id_cmdid =
4444a16fbecSRajkumar Manoharan 				WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
4454a16fbecSRajkumar Manoharan 	.pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
4464a16fbecSRajkumar Manoharan 	.pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
4474a16fbecSRajkumar Manoharan 	.add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
4484a16fbecSRajkumar Manoharan 	.rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
4494a16fbecSRajkumar Manoharan 	.wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
4504a16fbecSRajkumar Manoharan 	.wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
4514a16fbecSRajkumar Manoharan 	.wow_enable_disable_wake_event_cmdid =
4524a16fbecSRajkumar Manoharan 				WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
4534a16fbecSRajkumar Manoharan 	.wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
4544a16fbecSRajkumar Manoharan 	.wow_hostwakeup_from_sleep_cmdid =
4554a16fbecSRajkumar Manoharan 				WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
4564a16fbecSRajkumar Manoharan 	.rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
4574a16fbecSRajkumar Manoharan 	.rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
4584a16fbecSRajkumar Manoharan 	.vdev_spectral_scan_configure_cmdid =
4594a16fbecSRajkumar Manoharan 				WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
4604a16fbecSRajkumar Manoharan 	.vdev_spectral_scan_enable_cmdid =
4614a16fbecSRajkumar Manoharan 				WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
4624a16fbecSRajkumar Manoharan 	.request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
4634a16fbecSRajkumar Manoharan 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
4644a16fbecSRajkumar Manoharan 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
4654a16fbecSRajkumar Manoharan 	.gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
4664a16fbecSRajkumar Manoharan 	.csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
4674a16fbecSRajkumar Manoharan 	.csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
4684a16fbecSRajkumar Manoharan 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
4694a16fbecSRajkumar Manoharan 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
4704a16fbecSRajkumar Manoharan 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
4714a16fbecSRajkumar Manoharan 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
4724a16fbecSRajkumar Manoharan 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
4734a16fbecSRajkumar Manoharan 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
4744a16fbecSRajkumar Manoharan 	.echo_cmdid = WMI_10_2_ECHO_CMDID,
4754a16fbecSRajkumar Manoharan 	.pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
4764a16fbecSRajkumar Manoharan 	.dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
4774a16fbecSRajkumar Manoharan 	.pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
4784a16fbecSRajkumar Manoharan 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
4794a16fbecSRajkumar Manoharan 	.vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
4804a16fbecSRajkumar Manoharan 	.vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
4814a16fbecSRajkumar Manoharan 	.force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
4824a16fbecSRajkumar Manoharan 	.gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
4834a16fbecSRajkumar Manoharan 	.gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
484a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID,
48562f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS,
486772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
487772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
488772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
489772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
490772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
491772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
492772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
493772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
494772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
495772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
496772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
497772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
498772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
499772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
500772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
501772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
502772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
503772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
504772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
505772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
506772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
507772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
508772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
509772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
510772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
511772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
512772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
513772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
514772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
515772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
516772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
517772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
518772b4aeeSRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
519772b4aeeSRaja Mani 	.pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
520772b4aeeSRaja Mani 	.pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
521772b4aeeSRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
522772b4aeeSRaja Mani 	.pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
523772b4aeeSRaja Mani 	.vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
524772b4aeeSRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
525772b4aeeSRaja Mani 	.mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
526772b4aeeSRaja Mani 	.set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
5278a0b459eSRajkumar Manoharan 	.pdev_bss_chan_info_request_cmdid =
5288a0b459eSRajkumar Manoharan 		WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
5294a16fbecSRajkumar Manoharan };
5304a16fbecSRajkumar Manoharan 
5312d491e69SRaja Mani /* 10.4 WMI cmd track */
5322d491e69SRaja Mani static struct wmi_cmd_map wmi_10_4_cmd_map = {
5332d491e69SRaja Mani 	.init_cmdid = WMI_10_4_INIT_CMDID,
5342d491e69SRaja Mani 	.start_scan_cmdid = WMI_10_4_START_SCAN_CMDID,
5352d491e69SRaja Mani 	.stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID,
5362d491e69SRaja Mani 	.scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID,
5372d491e69SRaja Mani 	.scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID,
5382d491e69SRaja Mani 	.pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID,
5392d491e69SRaja Mani 	.pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID,
5402d491e69SRaja Mani 	.pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID,
5412d491e69SRaja Mani 	.pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID,
5422d491e69SRaja Mani 	.pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID,
5432d491e69SRaja Mani 	.pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID,
5442d491e69SRaja Mani 	.pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID,
5452d491e69SRaja Mani 	.pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID,
5462d491e69SRaja Mani 	.pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID,
5472d491e69SRaja Mani 	.pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID,
5482d491e69SRaja Mani 	.pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID,
5492d491e69SRaja Mani 	.pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID,
5502d491e69SRaja Mani 	.pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID,
5512d491e69SRaja Mani 	.vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID,
5522d491e69SRaja Mani 	.vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID,
5532d491e69SRaja Mani 	.vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID,
5542d491e69SRaja Mani 	.vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID,
5552d491e69SRaja Mani 	.vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID,
5562d491e69SRaja Mani 	.vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID,
5572d491e69SRaja Mani 	.vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID,
5582d491e69SRaja Mani 	.vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID,
5592d491e69SRaja Mani 	.vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID,
5602d491e69SRaja Mani 	.peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID,
5612d491e69SRaja Mani 	.peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID,
5622d491e69SRaja Mani 	.peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID,
5632d491e69SRaja Mani 	.peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID,
5642d491e69SRaja Mani 	.peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID,
5652d491e69SRaja Mani 	.peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID,
5662d491e69SRaja Mani 	.peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID,
5672d491e69SRaja Mani 	.peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID,
5682d491e69SRaja Mani 	.bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID,
5692d491e69SRaja Mani 	.pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID,
5702d491e69SRaja Mani 	.bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID,
5712d491e69SRaja Mani 	.bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID,
5722d491e69SRaja Mani 	.prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID,
5732d491e69SRaja Mani 	.mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID,
5742d491e69SRaja Mani 	.prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID,
5752d491e69SRaja Mani 	.addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID,
5762d491e69SRaja Mani 	.addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID,
5772d491e69SRaja Mani 	.addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID,
5782d491e69SRaja Mani 	.delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID,
5792d491e69SRaja Mani 	.addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID,
5802d491e69SRaja Mani 	.send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID,
5812d491e69SRaja Mani 	.sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID,
5822d491e69SRaja Mani 	.sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID,
5832d491e69SRaja Mani 	.sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID,
5842d491e69SRaja Mani 	.pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID,
5852d491e69SRaja Mani 	.pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID,
5862d491e69SRaja Mani 	.roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE,
5872d491e69SRaja Mani 	.roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD,
5882d491e69SRaja Mani 	.roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD,
5892d491e69SRaja Mani 	.roam_scan_rssi_change_threshold =
5902d491e69SRaja Mani 				WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
5912d491e69SRaja Mani 	.roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE,
5922d491e69SRaja Mani 	.ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE,
5932d491e69SRaja Mani 	.ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE,
5942d491e69SRaja Mani 	.ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD,
5952d491e69SRaja Mani 	.p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO,
5962d491e69SRaja Mani 	.p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY,
5972d491e69SRaja Mani 	.p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE,
5982d491e69SRaja Mani 	.p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE,
5992d491e69SRaja Mani 	.p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID,
6002d491e69SRaja Mani 	.ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID,
6012d491e69SRaja Mani 	.ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID,
6022d491e69SRaja Mani 	.peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID,
6032d491e69SRaja Mani 	.wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID,
6042d491e69SRaja Mani 	.wlan_profile_set_hist_intvl_cmdid =
6052d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
6062d491e69SRaja Mani 	.wlan_profile_get_profile_data_cmdid =
6072d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
6082d491e69SRaja Mani 	.wlan_profile_enable_profile_id_cmdid =
6092d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
6102d491e69SRaja Mani 	.wlan_profile_list_profile_id_cmdid =
6112d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
6122d491e69SRaja Mani 	.pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID,
6132d491e69SRaja Mani 	.pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID,
6142d491e69SRaja Mani 	.add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID,
6152d491e69SRaja Mani 	.rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID,
6162d491e69SRaja Mani 	.wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID,
6172d491e69SRaja Mani 	.wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID,
6182d491e69SRaja Mani 	.wow_enable_disable_wake_event_cmdid =
6192d491e69SRaja Mani 				WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
6202d491e69SRaja Mani 	.wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID,
6212d491e69SRaja Mani 	.wow_hostwakeup_from_sleep_cmdid =
6222d491e69SRaja Mani 				WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
6232d491e69SRaja Mani 	.rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID,
6242d491e69SRaja Mani 	.rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID,
6252d491e69SRaja Mani 	.vdev_spectral_scan_configure_cmdid =
6262d491e69SRaja Mani 				WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
6272d491e69SRaja Mani 	.vdev_spectral_scan_enable_cmdid =
6282d491e69SRaja Mani 				WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
6292d491e69SRaja Mani 	.request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID,
6302d491e69SRaja Mani 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
6312d491e69SRaja Mani 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
6322d491e69SRaja Mani 	.gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID,
6332d491e69SRaja Mani 	.csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID,
6342d491e69SRaja Mani 	.csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID,
6352d491e69SRaja Mani 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
6362d491e69SRaja Mani 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
6372d491e69SRaja Mani 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
6382d491e69SRaja Mani 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
6392d491e69SRaja Mani 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
6402d491e69SRaja Mani 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
6412d491e69SRaja Mani 	.echo_cmdid = WMI_10_4_ECHO_CMDID,
6422d491e69SRaja Mani 	.pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID,
6432d491e69SRaja Mani 	.dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID,
6442d491e69SRaja Mani 	.pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID,
6452d491e69SRaja Mani 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
6462d491e69SRaja Mani 	.vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID,
6472d491e69SRaja Mani 	.vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID,
6482d491e69SRaja Mani 	.force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID,
6492d491e69SRaja Mani 	.gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID,
6502d491e69SRaja Mani 	.gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID,
6512d491e69SRaja Mani 	.pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID,
6522d491e69SRaja Mani 	.vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED,
6532d491e69SRaja Mani 	.tdls_set_state_cmdid = WMI_CMD_UNSUPPORTED,
6542d491e69SRaja Mani 	.tdls_peer_update_cmdid = WMI_CMD_UNSUPPORTED,
6552d491e69SRaja Mani 	.adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED,
6562d491e69SRaja Mani 	.scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID,
6572d491e69SRaja Mani 	.vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID,
6582d491e69SRaja Mani 	.vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID,
6592d491e69SRaja Mani 	.wlan_peer_caching_add_peer_cmdid =
6602d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID,
6612d491e69SRaja Mani 	.wlan_peer_caching_evict_peer_cmdid =
6622d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID,
6632d491e69SRaja Mani 	.wlan_peer_caching_restore_peer_cmdid =
6642d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID,
6652d491e69SRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid =
6662d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID,
6672d491e69SRaja Mani 	.peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID,
6682d491e69SRaja Mani 	.peer_add_proxy_sta_entry_cmdid =
6692d491e69SRaja Mani 			WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID,
6702d491e69SRaja Mani 	.rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID,
6712d491e69SRaja Mani 	.oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID,
6722d491e69SRaja Mani 	.nan_cmdid = WMI_10_4_NAN_CMDID,
6732d491e69SRaja Mani 	.vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID,
6742d491e69SRaja Mani 	.qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID,
6752d491e69SRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID,
6762d491e69SRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid =
6772d491e69SRaja Mani 			WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID,
6782d491e69SRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid =
6792d491e69SRaja Mani 			WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID,
6802d491e69SRaja Mani 	.peer_smart_ant_set_train_info_cmdid =
6812d491e69SRaja Mani 			WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID,
6822d491e69SRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid =
6832d491e69SRaja Mani 			WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID,
6842d491e69SRaja Mani 	.pdev_set_antenna_switch_table_cmdid =
6852d491e69SRaja Mani 			WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID,
6862d491e69SRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID,
6872d491e69SRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID,
6882d491e69SRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID,
6892d491e69SRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid =
6902d491e69SRaja Mani 			WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID,
6912d491e69SRaja Mani 	.pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID,
6922d491e69SRaja Mani 	.tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID,
6932d491e69SRaja Mani 	.fwtest_cmdid = WMI_10_4_FWTEST_CMDID,
6942d491e69SRaja Mani 	.vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID,
6952d491e69SRaja Mani 	.peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID,
6962d491e69SRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID,
6972d491e69SRaja Mani 	.pdev_get_ani_ofdm_config_cmdid =
6982d491e69SRaja Mani 			WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID,
6992d491e69SRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID,
7002d491e69SRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID,
7012d491e69SRaja Mani 	.pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID,
7022d491e69SRaja Mani 	.pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID,
7032d491e69SRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID,
7042d491e69SRaja Mani 	.pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID,
7052d491e69SRaja Mani 	.vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID,
7062d491e69SRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid =
7072d491e69SRaja Mani 			WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID,
7082d491e69SRaja Mani 	.mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID,
7092d491e69SRaja Mani 	.set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID,
7102d491e69SRaja Mani 	.pdev_bss_chan_info_request_cmdid =
7112d491e69SRaja Mani 			WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
71247771902SRaja Mani 	.ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID,
7132d491e69SRaja Mani };
7142d491e69SRaja Mani 
7156d1506e7SBartosz Markowski /* MAIN WMI VDEV param map */
7166d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_vdev_param_map = {
7176d1506e7SBartosz Markowski 	.rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
7186d1506e7SBartosz Markowski 	.fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
7196d1506e7SBartosz Markowski 	.beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL,
7206d1506e7SBartosz Markowski 	.listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL,
7216d1506e7SBartosz Markowski 	.multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE,
7226d1506e7SBartosz Markowski 	.mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE,
7236d1506e7SBartosz Markowski 	.slot_time = WMI_VDEV_PARAM_SLOT_TIME,
7246d1506e7SBartosz Markowski 	.preamble = WMI_VDEV_PARAM_PREAMBLE,
7256d1506e7SBartosz Markowski 	.swba_time = WMI_VDEV_PARAM_SWBA_TIME,
7266d1506e7SBartosz Markowski 	.wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD,
7276d1506e7SBartosz Markowski 	.wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME,
7286d1506e7SBartosz Markowski 	.wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL,
7296d1506e7SBartosz Markowski 	.dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD,
7306d1506e7SBartosz Markowski 	.wmi_vdev_oc_scheduler_air_time_limit =
7316d1506e7SBartosz Markowski 					WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
7326d1506e7SBartosz Markowski 	.wds = WMI_VDEV_PARAM_WDS,
7336d1506e7SBartosz Markowski 	.atim_window = WMI_VDEV_PARAM_ATIM_WINDOW,
7346d1506e7SBartosz Markowski 	.bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX,
7356d1506e7SBartosz Markowski 	.bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
7366d1506e7SBartosz Markowski 	.bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
7376d1506e7SBartosz Markowski 	.feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM,
7386d1506e7SBartosz Markowski 	.chwidth = WMI_VDEV_PARAM_CHWIDTH,
7396d1506e7SBartosz Markowski 	.chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET,
7406d1506e7SBartosz Markowski 	.disable_htprotection =	WMI_VDEV_PARAM_DISABLE_HTPROTECTION,
7416d1506e7SBartosz Markowski 	.sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT,
7426d1506e7SBartosz Markowski 	.mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE,
7436d1506e7SBartosz Markowski 	.protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE,
7446d1506e7SBartosz Markowski 	.fixed_rate = WMI_VDEV_PARAM_FIXED_RATE,
7456d1506e7SBartosz Markowski 	.sgi = WMI_VDEV_PARAM_SGI,
7466d1506e7SBartosz Markowski 	.ldpc = WMI_VDEV_PARAM_LDPC,
7476d1506e7SBartosz Markowski 	.tx_stbc = WMI_VDEV_PARAM_TX_STBC,
7486d1506e7SBartosz Markowski 	.rx_stbc = WMI_VDEV_PARAM_RX_STBC,
7496d1506e7SBartosz Markowski 	.intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD,
7506d1506e7SBartosz Markowski 	.def_keyid = WMI_VDEV_PARAM_DEF_KEYID,
7516d1506e7SBartosz Markowski 	.nss = WMI_VDEV_PARAM_NSS,
7526d1506e7SBartosz Markowski 	.bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE,
7536d1506e7SBartosz Markowski 	.mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE,
7546d1506e7SBartosz Markowski 	.mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE,
7556d1506e7SBartosz Markowski 	.dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE,
7566d1506e7SBartosz Markowski 	.unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
7576d1506e7SBartosz Markowski 	.ap_keepalive_min_idle_inactive_time_secs =
7586d1506e7SBartosz Markowski 			WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
7596d1506e7SBartosz Markowski 	.ap_keepalive_max_idle_inactive_time_secs =
7606d1506e7SBartosz Markowski 			WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
7616d1506e7SBartosz Markowski 	.ap_keepalive_max_unresponsive_time_secs =
7626d1506e7SBartosz Markowski 			WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
7636d1506e7SBartosz Markowski 	.ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS,
7646d1506e7SBartosz Markowski 	.mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED,
7656d1506e7SBartosz Markowski 	.enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS,
7666d1506e7SBartosz Markowski 	.txbf = WMI_VDEV_PARAM_TXBF,
7676d1506e7SBartosz Markowski 	.packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE,
7686d1506e7SBartosz Markowski 	.drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY,
7696d1506e7SBartosz Markowski 	.tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE,
7706d1506e7SBartosz Markowski 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
7716d1506e7SBartosz Markowski 					WMI_VDEV_PARAM_UNSUPPORTED,
77293841a15SRaja Mani 	.rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
77393841a15SRaja Mani 	.cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
77493841a15SRaja Mani 	.mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
77593841a15SRaja Mani 	.rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
77693841a15SRaja Mani 	.vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
77793841a15SRaja Mani 	.vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
77893841a15SRaja Mani 	.early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
77993841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
78093841a15SRaja Mani 	.early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
78193841a15SRaja Mani 	.early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
78293841a15SRaja Mani 	.early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
78393841a15SRaja Mani 	.early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
78493841a15SRaja Mani 	.proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
78593841a15SRaja Mani 	.meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
78693841a15SRaja Mani 	.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
78793841a15SRaja Mani 	.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
7889f0b7e7dSPeter Oh 	.set_tsf = WMI_VDEV_PARAM_UNSUPPORTED,
7896d1506e7SBartosz Markowski };
7906d1506e7SBartosz Markowski 
7916d1506e7SBartosz Markowski /* 10.X WMI VDEV param map */
7926d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
7936d1506e7SBartosz Markowski 	.rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
7946d1506e7SBartosz Markowski 	.fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
7956d1506e7SBartosz Markowski 	.beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
7966d1506e7SBartosz Markowski 	.listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
7976d1506e7SBartosz Markowski 	.multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
7986d1506e7SBartosz Markowski 	.mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
7996d1506e7SBartosz Markowski 	.slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
8006d1506e7SBartosz Markowski 	.preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
8016d1506e7SBartosz Markowski 	.swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
8026d1506e7SBartosz Markowski 	.wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
8036d1506e7SBartosz Markowski 	.wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
8046d1506e7SBartosz Markowski 	.wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
8056d1506e7SBartosz Markowski 	.dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
8066d1506e7SBartosz Markowski 	.wmi_vdev_oc_scheduler_air_time_limit =
8076d1506e7SBartosz Markowski 				WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
8086d1506e7SBartosz Markowski 	.wds = WMI_10X_VDEV_PARAM_WDS,
8096d1506e7SBartosz Markowski 	.atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
8106d1506e7SBartosz Markowski 	.bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
8116d1506e7SBartosz Markowski 	.bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
8126d1506e7SBartosz Markowski 	.bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
8136d1506e7SBartosz Markowski 	.feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
8146d1506e7SBartosz Markowski 	.chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
8156d1506e7SBartosz Markowski 	.chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
8166d1506e7SBartosz Markowski 	.disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
8176d1506e7SBartosz Markowski 	.sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
8186d1506e7SBartosz Markowski 	.mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
8196d1506e7SBartosz Markowski 	.protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
8206d1506e7SBartosz Markowski 	.fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
8216d1506e7SBartosz Markowski 	.sgi = WMI_10X_VDEV_PARAM_SGI,
8226d1506e7SBartosz Markowski 	.ldpc = WMI_10X_VDEV_PARAM_LDPC,
8236d1506e7SBartosz Markowski 	.tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
8246d1506e7SBartosz Markowski 	.rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
8256d1506e7SBartosz Markowski 	.intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
8266d1506e7SBartosz Markowski 	.def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
8276d1506e7SBartosz Markowski 	.nss = WMI_10X_VDEV_PARAM_NSS,
8286d1506e7SBartosz Markowski 	.bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
8296d1506e7SBartosz Markowski 	.mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
8306d1506e7SBartosz Markowski 	.mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
8316d1506e7SBartosz Markowski 	.dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
8326d1506e7SBartosz Markowski 	.unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
8336d1506e7SBartosz Markowski 	.ap_keepalive_min_idle_inactive_time_secs =
8346d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
8356d1506e7SBartosz Markowski 	.ap_keepalive_max_idle_inactive_time_secs =
8366d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
8376d1506e7SBartosz Markowski 	.ap_keepalive_max_unresponsive_time_secs =
8386d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
8396d1506e7SBartosz Markowski 	.ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
8406d1506e7SBartosz Markowski 	.mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
8416d1506e7SBartosz Markowski 	.enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
8426d1506e7SBartosz Markowski 	.txbf = WMI_VDEV_PARAM_UNSUPPORTED,
8436d1506e7SBartosz Markowski 	.packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
8446d1506e7SBartosz Markowski 	.drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
8456d1506e7SBartosz Markowski 	.tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
8466d1506e7SBartosz Markowski 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
8476d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
84893841a15SRaja Mani 	.rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
84993841a15SRaja Mani 	.cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
85093841a15SRaja Mani 	.mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
85193841a15SRaja Mani 	.rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
85293841a15SRaja Mani 	.vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
85393841a15SRaja Mani 	.vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
85493841a15SRaja Mani 	.early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
85593841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
85693841a15SRaja Mani 	.early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
85793841a15SRaja Mani 	.early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
85893841a15SRaja Mani 	.early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
85993841a15SRaja Mani 	.early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
86093841a15SRaja Mani 	.proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
86193841a15SRaja Mani 	.meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
86293841a15SRaja Mani 	.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
86393841a15SRaja Mani 	.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
8649f0b7e7dSPeter Oh 	.set_tsf = WMI_VDEV_PARAM_UNSUPPORTED,
8656d1506e7SBartosz Markowski };
8666d1506e7SBartosz Markowski 
8674a16fbecSRajkumar Manoharan static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
8684a16fbecSRajkumar Manoharan 	.rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
8694a16fbecSRajkumar Manoharan 	.fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
8704a16fbecSRajkumar Manoharan 	.beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
8714a16fbecSRajkumar Manoharan 	.listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
8724a16fbecSRajkumar Manoharan 	.multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
8734a16fbecSRajkumar Manoharan 	.mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
8744a16fbecSRajkumar Manoharan 	.slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
8754a16fbecSRajkumar Manoharan 	.preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
8764a16fbecSRajkumar Manoharan 	.swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
8774a16fbecSRajkumar Manoharan 	.wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
8784a16fbecSRajkumar Manoharan 	.wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
8794a16fbecSRajkumar Manoharan 	.wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
8804a16fbecSRajkumar Manoharan 	.dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
8814a16fbecSRajkumar Manoharan 	.wmi_vdev_oc_scheduler_air_time_limit =
8824a16fbecSRajkumar Manoharan 				WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
8834a16fbecSRajkumar Manoharan 	.wds = WMI_10X_VDEV_PARAM_WDS,
8844a16fbecSRajkumar Manoharan 	.atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
8854a16fbecSRajkumar Manoharan 	.bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
8864a16fbecSRajkumar Manoharan 	.bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
8874a16fbecSRajkumar Manoharan 	.bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
8884a16fbecSRajkumar Manoharan 	.feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
8894a16fbecSRajkumar Manoharan 	.chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
8904a16fbecSRajkumar Manoharan 	.chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
8914a16fbecSRajkumar Manoharan 	.disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
8924a16fbecSRajkumar Manoharan 	.sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
8934a16fbecSRajkumar Manoharan 	.mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
8944a16fbecSRajkumar Manoharan 	.protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
8954a16fbecSRajkumar Manoharan 	.fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
8964a16fbecSRajkumar Manoharan 	.sgi = WMI_10X_VDEV_PARAM_SGI,
8974a16fbecSRajkumar Manoharan 	.ldpc = WMI_10X_VDEV_PARAM_LDPC,
8984a16fbecSRajkumar Manoharan 	.tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
8994a16fbecSRajkumar Manoharan 	.rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
9004a16fbecSRajkumar Manoharan 	.intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
9014a16fbecSRajkumar Manoharan 	.def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
9024a16fbecSRajkumar Manoharan 	.nss = WMI_10X_VDEV_PARAM_NSS,
9034a16fbecSRajkumar Manoharan 	.bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
9044a16fbecSRajkumar Manoharan 	.mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
9054a16fbecSRajkumar Manoharan 	.mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
9064a16fbecSRajkumar Manoharan 	.dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
9074a16fbecSRajkumar Manoharan 	.unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
9084a16fbecSRajkumar Manoharan 	.ap_keepalive_min_idle_inactive_time_secs =
9094a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
9104a16fbecSRajkumar Manoharan 	.ap_keepalive_max_idle_inactive_time_secs =
9114a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
9124a16fbecSRajkumar Manoharan 	.ap_keepalive_max_unresponsive_time_secs =
9134a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
9144a16fbecSRajkumar Manoharan 	.ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
9154a16fbecSRajkumar Manoharan 	.mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
9164a16fbecSRajkumar Manoharan 	.enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
9174a16fbecSRajkumar Manoharan 	.txbf = WMI_VDEV_PARAM_UNSUPPORTED,
9184a16fbecSRajkumar Manoharan 	.packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
9194a16fbecSRajkumar Manoharan 	.drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
9204a16fbecSRajkumar Manoharan 	.tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
9214a16fbecSRajkumar Manoharan 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
9224a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
92393841a15SRaja Mani 	.rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
92493841a15SRaja Mani 	.cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
92593841a15SRaja Mani 	.mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
92693841a15SRaja Mani 	.rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
92793841a15SRaja Mani 	.vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
92893841a15SRaja Mani 	.vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
92993841a15SRaja Mani 	.early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
93093841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
93193841a15SRaja Mani 	.early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
93293841a15SRaja Mani 	.early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
93393841a15SRaja Mani 	.early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
93493841a15SRaja Mani 	.early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
93593841a15SRaja Mani 	.proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
93693841a15SRaja Mani 	.meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
93793841a15SRaja Mani 	.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
93893841a15SRaja Mani 	.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
9399f0b7e7dSPeter Oh 	.set_tsf = WMI_10X_VDEV_PARAM_TSF_INCREMENT,
94093841a15SRaja Mani };
94193841a15SRaja Mani 
94293841a15SRaja Mani static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
94393841a15SRaja Mani 	.rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD,
94493841a15SRaja Mani 	.fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
94593841a15SRaja Mani 	.beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL,
94693841a15SRaja Mani 	.listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL,
94793841a15SRaja Mani 	.multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE,
94893841a15SRaja Mani 	.mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE,
94993841a15SRaja Mani 	.slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME,
95093841a15SRaja Mani 	.preamble = WMI_10_4_VDEV_PARAM_PREAMBLE,
95193841a15SRaja Mani 	.swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME,
95293841a15SRaja Mani 	.wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD,
95393841a15SRaja Mani 	.wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME,
95493841a15SRaja Mani 	.wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL,
95593841a15SRaja Mani 	.dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD,
95693841a15SRaja Mani 	.wmi_vdev_oc_scheduler_air_time_limit =
95793841a15SRaja Mani 	       WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
95893841a15SRaja Mani 	.wds = WMI_10_4_VDEV_PARAM_WDS,
95993841a15SRaja Mani 	.atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW,
96093841a15SRaja Mani 	.bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX,
96193841a15SRaja Mani 	.bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT,
96293841a15SRaja Mani 	.bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT,
96393841a15SRaja Mani 	.feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM,
96493841a15SRaja Mani 	.chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH,
96593841a15SRaja Mani 	.chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET,
96693841a15SRaja Mani 	.disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION,
96793841a15SRaja Mani 	.sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT,
96893841a15SRaja Mani 	.mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE,
96993841a15SRaja Mani 	.protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE,
97093841a15SRaja Mani 	.fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE,
97193841a15SRaja Mani 	.sgi = WMI_10_4_VDEV_PARAM_SGI,
97293841a15SRaja Mani 	.ldpc = WMI_10_4_VDEV_PARAM_LDPC,
97393841a15SRaja Mani 	.tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC,
97493841a15SRaja Mani 	.rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC,
97593841a15SRaja Mani 	.intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD,
97693841a15SRaja Mani 	.def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID,
97793841a15SRaja Mani 	.nss = WMI_10_4_VDEV_PARAM_NSS,
97893841a15SRaja Mani 	.bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE,
97993841a15SRaja Mani 	.mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE,
98093841a15SRaja Mani 	.mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE,
98193841a15SRaja Mani 	.dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE,
98293841a15SRaja Mani 	.unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
98393841a15SRaja Mani 	.ap_keepalive_min_idle_inactive_time_secs =
98493841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
98593841a15SRaja Mani 	.ap_keepalive_max_idle_inactive_time_secs =
98693841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
98793841a15SRaja Mani 	.ap_keepalive_max_unresponsive_time_secs =
98893841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
98993841a15SRaja Mani 	.ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS,
99093841a15SRaja Mani 	.mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET,
99193841a15SRaja Mani 	.enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS,
99293841a15SRaja Mani 	.txbf = WMI_10_4_VDEV_PARAM_TXBF,
99393841a15SRaja Mani 	.packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE,
99493841a15SRaja Mani 	.drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY,
99593841a15SRaja Mani 	.tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE,
99693841a15SRaja Mani 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
99793841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
99893841a15SRaja Mani 	.rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES,
99993841a15SRaja Mani 	.cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR,
100093841a15SRaja Mani 	.mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET,
100193841a15SRaja Mani 	.rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE,
100293841a15SRaja Mani 	.vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK,
100393841a15SRaja Mani 	.vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK,
100493841a15SRaja Mani 	.early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
100593841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
100693841a15SRaja Mani 	.early_rx_bmiss_sample_cycle =
100793841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
100893841a15SRaja Mani 	.early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP,
100993841a15SRaja Mani 	.early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP,
101093841a15SRaja Mani 	.early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
101193841a15SRaja Mani 	.proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA,
101293841a15SRaja Mani 	.meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC,
101393841a15SRaja Mani 	.rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE,
101493841a15SRaja Mani 	.bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK,
1015a606c0eeSPeter Oh 	.set_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
10164a16fbecSRajkumar Manoharan };
10174a16fbecSRajkumar Manoharan 
1018226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_pdev_param_map = {
1019226a339bSBartosz Markowski 	.tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
1020226a339bSBartosz Markowski 	.rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
1021226a339bSBartosz Markowski 	.txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
1022226a339bSBartosz Markowski 	.txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
1023226a339bSBartosz Markowski 	.txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
1024226a339bSBartosz Markowski 	.beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
1025226a339bSBartosz Markowski 	.beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
1026226a339bSBartosz Markowski 	.resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1027226a339bSBartosz Markowski 	.protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
1028226a339bSBartosz Markowski 	.dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
1029226a339bSBartosz Markowski 	.non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1030226a339bSBartosz Markowski 	.agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
1031226a339bSBartosz Markowski 	.sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
1032226a339bSBartosz Markowski 	.ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1033226a339bSBartosz Markowski 	.ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
1034226a339bSBartosz Markowski 	.ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
1035226a339bSBartosz Markowski 	.ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
1036226a339bSBartosz Markowski 	.ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
1037226a339bSBartosz Markowski 	.ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
1038226a339bSBartosz Markowski 	.ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1039226a339bSBartosz Markowski 	.ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1040226a339bSBartosz Markowski 	.ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
1041226a339bSBartosz Markowski 	.ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1042226a339bSBartosz Markowski 	.l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
1043226a339bSBartosz Markowski 	.dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
1044226a339bSBartosz Markowski 	.pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1045226a339bSBartosz Markowski 	.pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1046226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1047226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1048226a339bSBartosz Markowski 	.pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1049226a339bSBartosz Markowski 	.vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1050226a339bSBartosz Markowski 	.peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1051226a339bSBartosz Markowski 	.bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1052226a339bSBartosz Markowski 	.pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
1053226a339bSBartosz Markowski 	.arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
1054226a339bSBartosz Markowski 	.dcs = WMI_PDEV_PARAM_DCS,
1055226a339bSBartosz Markowski 	.ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
1056226a339bSBartosz Markowski 	.ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
1057226a339bSBartosz Markowski 	.ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
1058226a339bSBartosz Markowski 	.ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
1059226a339bSBartosz Markowski 	.ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
1060226a339bSBartosz Markowski 	.dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
1061226a339bSBartosz Markowski 	.proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
1062226a339bSBartosz Markowski 	.idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
1063226a339bSBartosz Markowski 	.power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
1064226a339bSBartosz Markowski 	.fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1065226a339bSBartosz Markowski 	.burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
1066226a339bSBartosz Markowski 	.burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1067a7bd3e99SPeter Oh 	.cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
1068d86561ffSRaja Mani 	.aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1069d86561ffSRaja Mani 	.rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1070d86561ffSRaja Mani 	.smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1071d86561ffSRaja Mani 	.igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1072d86561ffSRaja Mani 	.igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1073d86561ffSRaja Mani 	.antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1074d86561ffSRaja Mani 	.rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1075d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1076d86561ffSRaja Mani 	.proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1077d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1078d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1079d86561ffSRaja Mani 	.remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1080d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1081d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1082d86561ffSRaja Mani 	.block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1083d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1084d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1085d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1086d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1087d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1088d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1089d86561ffSRaja Mani 	.en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1090d86561ffSRaja Mani 	.mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1091d86561ffSRaja Mani 	.noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1092d86561ffSRaja Mani 	.noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1093d86561ffSRaja Mani 	.dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1094d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1095d86561ffSRaja Mani 	.atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1096d86561ffSRaja Mani 	.atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1097d86561ffSRaja Mani 	.ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1098d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1099d86561ffSRaja Mani 	.sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1100d86561ffSRaja Mani 	.signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1101d86561ffSRaja Mani 	.signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1102d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1103d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1104d86561ffSRaja Mani 	.cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1105d86561ffSRaja Mani 	.rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1106d86561ffSRaja Mani 	.pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1107d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1108d86561ffSRaja Mani 	.arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1109d86561ffSRaja Mani 	.arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
111039136248SRajkumar Manoharan 	.enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1111226a339bSBartosz Markowski };
1112226a339bSBartosz Markowski 
1113226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
1114226a339bSBartosz Markowski 	.tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
1115226a339bSBartosz Markowski 	.rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
1116226a339bSBartosz Markowski 	.txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
1117226a339bSBartosz Markowski 	.txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
1118226a339bSBartosz Markowski 	.txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
1119226a339bSBartosz Markowski 	.beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
1120226a339bSBartosz Markowski 	.beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
1121226a339bSBartosz Markowski 	.resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1122226a339bSBartosz Markowski 	.protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
1123226a339bSBartosz Markowski 	.dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
1124226a339bSBartosz Markowski 	.non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1125226a339bSBartosz Markowski 	.agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
1126226a339bSBartosz Markowski 	.sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
1127226a339bSBartosz Markowski 	.ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1128226a339bSBartosz Markowski 	.ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
1129226a339bSBartosz Markowski 	.ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
1130226a339bSBartosz Markowski 	.ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
1131226a339bSBartosz Markowski 	.ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
1132226a339bSBartosz Markowski 	.ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
1133226a339bSBartosz Markowski 	.ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1134226a339bSBartosz Markowski 	.ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1135226a339bSBartosz Markowski 	.ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
1136226a339bSBartosz Markowski 	.ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1137226a339bSBartosz Markowski 	.l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
1138226a339bSBartosz Markowski 	.dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
1139226a339bSBartosz Markowski 	.pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
1140226a339bSBartosz Markowski 	.pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
1141226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
1142226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
1143226a339bSBartosz Markowski 	.pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1144226a339bSBartosz Markowski 	.vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1145226a339bSBartosz Markowski 	.peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1146226a339bSBartosz Markowski 	.bcnflt_stats_update_period =
1147226a339bSBartosz Markowski 				WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1148226a339bSBartosz Markowski 	.pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
1149ab6258edSMarek Puzyniak 	.arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
1150226a339bSBartosz Markowski 	.dcs = WMI_10X_PDEV_PARAM_DCS,
1151226a339bSBartosz Markowski 	.ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
1152226a339bSBartosz Markowski 	.ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
1153226a339bSBartosz Markowski 	.ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
1154226a339bSBartosz Markowski 	.ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
1155226a339bSBartosz Markowski 	.ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
1156226a339bSBartosz Markowski 	.dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
1157226a339bSBartosz Markowski 	.proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
1158226a339bSBartosz Markowski 	.idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
1159226a339bSBartosz Markowski 	.power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
1160226a339bSBartosz Markowski 	.fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
1161226a339bSBartosz Markowski 	.burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
1162226a339bSBartosz Markowski 	.burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
1163a7bd3e99SPeter Oh 	.cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1164d86561ffSRaja Mani 	.aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1165d86561ffSRaja Mani 	.rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1166d86561ffSRaja Mani 	.smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1167d86561ffSRaja Mani 	.igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1168d86561ffSRaja Mani 	.igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1169d86561ffSRaja Mani 	.antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1170d86561ffSRaja Mani 	.rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1171d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1172d86561ffSRaja Mani 	.proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1173d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1174d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1175d86561ffSRaja Mani 	.remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1176d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1177d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1178d86561ffSRaja Mani 	.block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1179d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1180d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1181d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1182d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1183d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1184d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1185d86561ffSRaja Mani 	.en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1186d86561ffSRaja Mani 	.mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1187d86561ffSRaja Mani 	.noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1188d86561ffSRaja Mani 	.noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1189d86561ffSRaja Mani 	.dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1190d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1191d86561ffSRaja Mani 	.atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1192d86561ffSRaja Mani 	.atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1193d86561ffSRaja Mani 	.ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1194d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1195d86561ffSRaja Mani 	.sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1196d86561ffSRaja Mani 	.signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1197d86561ffSRaja Mani 	.signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1198d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1199d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1200d86561ffSRaja Mani 	.cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1201d86561ffSRaja Mani 	.rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1202d86561ffSRaja Mani 	.pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1203d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1204d86561ffSRaja Mani 	.arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1205d86561ffSRaja Mani 	.arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
120639136248SRajkumar Manoharan 	.enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1207226a339bSBartosz Markowski };
1208226a339bSBartosz Markowski 
12094a16fbecSRajkumar Manoharan static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = {
12104a16fbecSRajkumar Manoharan 	.tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
12114a16fbecSRajkumar Manoharan 	.rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
12124a16fbecSRajkumar Manoharan 	.txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
12134a16fbecSRajkumar Manoharan 	.txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
12144a16fbecSRajkumar Manoharan 	.txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
12154a16fbecSRajkumar Manoharan 	.beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
12164a16fbecSRajkumar Manoharan 	.beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
12174a16fbecSRajkumar Manoharan 	.resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
12184a16fbecSRajkumar Manoharan 	.protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
12194a16fbecSRajkumar Manoharan 	.dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
12204a16fbecSRajkumar Manoharan 	.non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
12214a16fbecSRajkumar Manoharan 	.agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
12224a16fbecSRajkumar Manoharan 	.sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
12234a16fbecSRajkumar Manoharan 	.ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
12244a16fbecSRajkumar Manoharan 	.ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
12254a16fbecSRajkumar Manoharan 	.ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
12264a16fbecSRajkumar Manoharan 	.ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
12274a16fbecSRajkumar Manoharan 	.ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
12284a16fbecSRajkumar Manoharan 	.ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
12294a16fbecSRajkumar Manoharan 	.ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
12304a16fbecSRajkumar Manoharan 	.ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
12314a16fbecSRajkumar Manoharan 	.ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
12324a16fbecSRajkumar Manoharan 	.ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
12334a16fbecSRajkumar Manoharan 	.l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
12344a16fbecSRajkumar Manoharan 	.dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
12354a16fbecSRajkumar Manoharan 	.pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
12364a16fbecSRajkumar Manoharan 	.pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
12374a16fbecSRajkumar Manoharan 	.pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
12384a16fbecSRajkumar Manoharan 	.pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
12394a16fbecSRajkumar Manoharan 	.pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
12404a16fbecSRajkumar Manoharan 	.vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
12414a16fbecSRajkumar Manoharan 	.peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
12424a16fbecSRajkumar Manoharan 	.bcnflt_stats_update_period =
12434a16fbecSRajkumar Manoharan 				WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
12444a16fbecSRajkumar Manoharan 	.pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
12454a16fbecSRajkumar Manoharan 	.arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
12464a16fbecSRajkumar Manoharan 	.dcs = WMI_10X_PDEV_PARAM_DCS,
12474a16fbecSRajkumar Manoharan 	.ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
12484a16fbecSRajkumar Manoharan 	.ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
12494a16fbecSRajkumar Manoharan 	.ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
12504a16fbecSRajkumar Manoharan 	.ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
12514a16fbecSRajkumar Manoharan 	.ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
12524a16fbecSRajkumar Manoharan 	.dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
12534a16fbecSRajkumar Manoharan 	.proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
12544a16fbecSRajkumar Manoharan 	.idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
12554a16fbecSRajkumar Manoharan 	.power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
12564a16fbecSRajkumar Manoharan 	.fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
12574a16fbecSRajkumar Manoharan 	.burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
12584a16fbecSRajkumar Manoharan 	.burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
12594a16fbecSRajkumar Manoharan 	.cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1260d86561ffSRaja Mani 	.aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1261d86561ffSRaja Mani 	.rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1262d86561ffSRaja Mani 	.smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1263d86561ffSRaja Mani 	.igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1264d86561ffSRaja Mani 	.igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1265d86561ffSRaja Mani 	.antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1266d86561ffSRaja Mani 	.rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1267d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1268d86561ffSRaja Mani 	.proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1269d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1270d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1271d86561ffSRaja Mani 	.remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1272d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1273d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1274d86561ffSRaja Mani 	.block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1275d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1276d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1277d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1278d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1279d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1280d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1281d86561ffSRaja Mani 	.en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1282d86561ffSRaja Mani 	.mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1283d86561ffSRaja Mani 	.noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1284d86561ffSRaja Mani 	.noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1285d86561ffSRaja Mani 	.dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1286d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1287d86561ffSRaja Mani 	.atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1288d86561ffSRaja Mani 	.atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1289d86561ffSRaja Mani 	.ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1290d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1291d86561ffSRaja Mani 	.sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1292d86561ffSRaja Mani 	.signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1293d86561ffSRaja Mani 	.signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1294d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1295d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1296d86561ffSRaja Mani 	.cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1297d86561ffSRaja Mani 	.rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1298d86561ffSRaja Mani 	.pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1299d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1300d86561ffSRaja Mani 	.arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1301d86561ffSRaja Mani 	.arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
130239136248SRajkumar Manoharan 	.enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
13034a16fbecSRajkumar Manoharan };
13044a16fbecSRajkumar Manoharan 
130524c88f78SMichal Kazior /* firmware 10.2 specific mappings */
130624c88f78SMichal Kazior static struct wmi_cmd_map wmi_10_2_cmd_map = {
130724c88f78SMichal Kazior 	.init_cmdid = WMI_10_2_INIT_CMDID,
130824c88f78SMichal Kazior 	.start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
130924c88f78SMichal Kazior 	.stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
131024c88f78SMichal Kazior 	.scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
131124c88f78SMichal Kazior 	.scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
131224c88f78SMichal Kazior 	.pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
131324c88f78SMichal Kazior 	.pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
131424c88f78SMichal Kazior 	.pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
131524c88f78SMichal Kazior 	.pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
131624c88f78SMichal Kazior 	.pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
131724c88f78SMichal Kazior 	.pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
131824c88f78SMichal Kazior 	.pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
131924c88f78SMichal Kazior 	.pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
132024c88f78SMichal Kazior 	.pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
132124c88f78SMichal Kazior 	.pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
132224c88f78SMichal Kazior 	.pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
132324c88f78SMichal Kazior 	.pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
132424c88f78SMichal Kazior 	.vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
132524c88f78SMichal Kazior 	.vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
132624c88f78SMichal Kazior 	.vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
132724c88f78SMichal Kazior 	.vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
132824c88f78SMichal Kazior 	.vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
132924c88f78SMichal Kazior 	.vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
133024c88f78SMichal Kazior 	.vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
133124c88f78SMichal Kazior 	.vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
133224c88f78SMichal Kazior 	.vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
133324c88f78SMichal Kazior 	.peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
133424c88f78SMichal Kazior 	.peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
133524c88f78SMichal Kazior 	.peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
133624c88f78SMichal Kazior 	.peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
133724c88f78SMichal Kazior 	.peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
133824c88f78SMichal Kazior 	.peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
133924c88f78SMichal Kazior 	.peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
134024c88f78SMichal Kazior 	.peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
134124c88f78SMichal Kazior 	.bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
134224c88f78SMichal Kazior 	.pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
134324c88f78SMichal Kazior 	.bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
134424c88f78SMichal Kazior 	.bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
134524c88f78SMichal Kazior 	.prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
134624c88f78SMichal Kazior 	.mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
134724c88f78SMichal Kazior 	.prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
134824c88f78SMichal Kazior 	.addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
134924c88f78SMichal Kazior 	.addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
135024c88f78SMichal Kazior 	.addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
135124c88f78SMichal Kazior 	.delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
135224c88f78SMichal Kazior 	.addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
135324c88f78SMichal Kazior 	.send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
135424c88f78SMichal Kazior 	.sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
135524c88f78SMichal Kazior 	.sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
135624c88f78SMichal Kazior 	.sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
135724c88f78SMichal Kazior 	.pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
135824c88f78SMichal Kazior 	.pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
135924c88f78SMichal Kazior 	.roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
136024c88f78SMichal Kazior 	.roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
136124c88f78SMichal Kazior 	.roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
136224c88f78SMichal Kazior 	.roam_scan_rssi_change_threshold =
136324c88f78SMichal Kazior 				WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
136424c88f78SMichal Kazior 	.roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
136524c88f78SMichal Kazior 	.ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
136624c88f78SMichal Kazior 	.ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
136724c88f78SMichal Kazior 	.ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
136824c88f78SMichal Kazior 	.p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
136924c88f78SMichal Kazior 	.p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
137024c88f78SMichal Kazior 	.p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
137124c88f78SMichal Kazior 	.p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
137224c88f78SMichal Kazior 	.p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
137324c88f78SMichal Kazior 	.ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
137424c88f78SMichal Kazior 	.ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
137524c88f78SMichal Kazior 	.peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
137624c88f78SMichal Kazior 	.wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
137724c88f78SMichal Kazior 	.wlan_profile_set_hist_intvl_cmdid =
137824c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
137924c88f78SMichal Kazior 	.wlan_profile_get_profile_data_cmdid =
138024c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
138124c88f78SMichal Kazior 	.wlan_profile_enable_profile_id_cmdid =
138224c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
138324c88f78SMichal Kazior 	.wlan_profile_list_profile_id_cmdid =
138424c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
138524c88f78SMichal Kazior 	.pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
138624c88f78SMichal Kazior 	.pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
138724c88f78SMichal Kazior 	.add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
138824c88f78SMichal Kazior 	.rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
138924c88f78SMichal Kazior 	.wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
139024c88f78SMichal Kazior 	.wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
139124c88f78SMichal Kazior 	.wow_enable_disable_wake_event_cmdid =
139224c88f78SMichal Kazior 				WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
139324c88f78SMichal Kazior 	.wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
139424c88f78SMichal Kazior 	.wow_hostwakeup_from_sleep_cmdid =
139524c88f78SMichal Kazior 				WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
139624c88f78SMichal Kazior 	.rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
139724c88f78SMichal Kazior 	.rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
139824c88f78SMichal Kazior 	.vdev_spectral_scan_configure_cmdid =
139924c88f78SMichal Kazior 				WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
140024c88f78SMichal Kazior 	.vdev_spectral_scan_enable_cmdid =
140124c88f78SMichal Kazior 				WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
140224c88f78SMichal Kazior 	.request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
140324c88f78SMichal Kazior 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
140424c88f78SMichal Kazior 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
140524c88f78SMichal Kazior 	.gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
140624c88f78SMichal Kazior 	.csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
140724c88f78SMichal Kazior 	.csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
140824c88f78SMichal Kazior 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
140924c88f78SMichal Kazior 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
141024c88f78SMichal Kazior 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
141124c88f78SMichal Kazior 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
141224c88f78SMichal Kazior 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
141324c88f78SMichal Kazior 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
141424c88f78SMichal Kazior 	.echo_cmdid = WMI_10_2_ECHO_CMDID,
141524c88f78SMichal Kazior 	.pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
141624c88f78SMichal Kazior 	.dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
141724c88f78SMichal Kazior 	.pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
141824c88f78SMichal Kazior 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
141924c88f78SMichal Kazior 	.vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
142024c88f78SMichal Kazior 	.vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
142124c88f78SMichal Kazior 	.force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
142224c88f78SMichal Kazior 	.gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
142324c88f78SMichal Kazior 	.gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
1424a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
142562f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
1426772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
1427772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
1428772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
1429772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
1430772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
1431772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
1432772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
1433772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
1434772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
1435772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1436772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
1437772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
1438772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
1439772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
1440772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
1441772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1442772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1443772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
1444772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
1445772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
1446772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
1447772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
1448772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
1449772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
1450772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
1451772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
1452772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
1453772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1454772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1455772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
1456772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
1457772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
145824c88f78SMichal Kazior };
145924c88f78SMichal Kazior 
1460d86561ffSRaja Mani static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
1461d86561ffSRaja Mani 	.tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK,
1462d86561ffSRaja Mani 	.rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK,
1463d86561ffSRaja Mani 	.txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G,
1464d86561ffSRaja Mani 	.txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G,
1465d86561ffSRaja Mani 	.txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE,
1466d86561ffSRaja Mani 	.beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE,
1467d86561ffSRaja Mani 	.beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE,
1468d86561ffSRaja Mani 	.resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1469d86561ffSRaja Mani 	.protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE,
1470d86561ffSRaja Mani 	.dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW,
1471d86561ffSRaja Mani 	.non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1472d86561ffSRaja Mani 	.agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH,
1473d86561ffSRaja Mani 	.sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH,
1474d86561ffSRaja Mani 	.ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1475d86561ffSRaja Mani 	.ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE,
1476d86561ffSRaja Mani 	.ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE,
1477d86561ffSRaja Mani 	.ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK,
1478d86561ffSRaja Mani 	.ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI,
1479d86561ffSRaja Mani 	.ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO,
1480d86561ffSRaja Mani 	.ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1481d86561ffSRaja Mani 	.ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1482d86561ffSRaja Mani 	.ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE,
1483d86561ffSRaja Mani 	.ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1484d86561ffSRaja Mani 	.l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE,
1485d86561ffSRaja Mani 	.dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE,
1486d86561ffSRaja Mani 	.pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1487d86561ffSRaja Mani 	.pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK,
1488d86561ffSRaja Mani 	.pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1489d86561ffSRaja Mani 	.pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1490d86561ffSRaja Mani 	.pdev_stats_update_period =
1491d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1492d86561ffSRaja Mani 	.vdev_stats_update_period =
1493d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1494d86561ffSRaja Mani 	.peer_stats_update_period =
1495d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1496d86561ffSRaja Mani 	.bcnflt_stats_update_period =
1497d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1498d86561ffSRaja Mani 	.pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS,
1499d86561ffSRaja Mani 	.arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE,
1500d86561ffSRaja Mani 	.dcs = WMI_10_4_PDEV_PARAM_DCS,
1501d86561ffSRaja Mani 	.ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE,
1502d86561ffSRaja Mani 	.ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD,
1503d86561ffSRaja Mani 	.ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD,
1504d86561ffSRaja Mani 	.ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL,
1505d86561ffSRaja Mani 	.ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL,
1506d86561ffSRaja Mani 	.dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN,
1507d86561ffSRaja Mani 	.proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA,
1508d86561ffSRaja Mani 	.idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG,
1509d86561ffSRaja Mani 	.power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP,
1510d86561ffSRaja Mani 	.fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET,
1511d86561ffSRaja Mani 	.burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR,
1512d86561ffSRaja Mani 	.burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE,
1513d86561ffSRaja Mani 	.cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD,
1514d86561ffSRaja Mani 	.aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST,
1515d86561ffSRaja Mani 	.rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE,
1516d86561ffSRaja Mani 	.smart_antenna_default_antenna =
1517d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA,
1518d86561ffSRaja Mani 	.igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE,
1519d86561ffSRaja Mani 	.igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID,
1520d86561ffSRaja Mani 	.antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN,
1521d86561ffSRaja Mani 	.rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER,
1522d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID,
1523d86561ffSRaja Mani 	.proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE,
1524d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE,
1525d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER,
1526d86561ffSRaja Mani 	.remove_mcast2ucast_buffer =
1527d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER,
1528d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable =
1529d86561ffSRaja Mani 			WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE,
1530d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE,
1531d86561ffSRaja Mani 	.block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS,
1532d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID,
1533d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID,
1534d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID,
1535d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID,
1536d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID,
1537d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID,
1538d86561ffSRaja Mani 	.en_stats = WMI_10_4_PDEV_PARAM_EN_STATS,
1539d86561ffSRaja Mani 	.mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY,
1540d86561ffSRaja Mani 	.noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION,
1541d86561ffSRaja Mani 	.noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD,
1542d86561ffSRaja Mani 	.dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE,
1543d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO,
1544d86561ffSRaja Mani 	.atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH,
1545d86561ffSRaja Mani 	.atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION,
1546d86561ffSRaja Mani 	.ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN,
1547d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT,
1548d86561ffSRaja Mani 	.sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL,
1549d86561ffSRaja Mani 	.signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G,
1550d86561ffSRaja Mani 	.signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G,
1551d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU,
1552d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU,
1553d86561ffSRaja Mani 	.cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD,
1554d86561ffSRaja Mani 	.rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE,
1555d86561ffSRaja Mani 	.pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET,
1556d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET,
1557d86561ffSRaja Mani 	.arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR,
1558d86561ffSRaja Mani 	.arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR,
155939136248SRajkumar Manoharan 	.enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
1560d86561ffSRaja Mani };
1561d86561ffSRaja Mani 
15623fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_peer_flags_map = {
15633fab30f7STamizh chelvam 	.auth = WMI_PEER_AUTH,
15643fab30f7STamizh chelvam 	.qos = WMI_PEER_QOS,
15653fab30f7STamizh chelvam 	.need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY,
15663fab30f7STamizh chelvam 	.need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY,
15673fab30f7STamizh chelvam 	.apsd = WMI_PEER_APSD,
15683fab30f7STamizh chelvam 	.ht = WMI_PEER_HT,
15693fab30f7STamizh chelvam 	.bw40 = WMI_PEER_40MHZ,
15703fab30f7STamizh chelvam 	.stbc = WMI_PEER_STBC,
15713fab30f7STamizh chelvam 	.ldbc = WMI_PEER_LDPC,
15723fab30f7STamizh chelvam 	.dyn_mimops = WMI_PEER_DYN_MIMOPS,
15733fab30f7STamizh chelvam 	.static_mimops = WMI_PEER_STATIC_MIMOPS,
15743fab30f7STamizh chelvam 	.spatial_mux = WMI_PEER_SPATIAL_MUX,
15753fab30f7STamizh chelvam 	.vht = WMI_PEER_VHT,
15763fab30f7STamizh chelvam 	.bw80 = WMI_PEER_80MHZ,
15773fab30f7STamizh chelvam 	.vht_2g = WMI_PEER_VHT_2G,
15783fab30f7STamizh chelvam 	.pmf = WMI_PEER_PMF,
15793fab30f7STamizh chelvam };
15803fab30f7STamizh chelvam 
15813fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = {
15823fab30f7STamizh chelvam 	.auth = WMI_10X_PEER_AUTH,
15833fab30f7STamizh chelvam 	.qos = WMI_10X_PEER_QOS,
15843fab30f7STamizh chelvam 	.need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY,
15853fab30f7STamizh chelvam 	.need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY,
15863fab30f7STamizh chelvam 	.apsd = WMI_10X_PEER_APSD,
15873fab30f7STamizh chelvam 	.ht = WMI_10X_PEER_HT,
15883fab30f7STamizh chelvam 	.bw40 = WMI_10X_PEER_40MHZ,
15893fab30f7STamizh chelvam 	.stbc = WMI_10X_PEER_STBC,
15903fab30f7STamizh chelvam 	.ldbc = WMI_10X_PEER_LDPC,
15913fab30f7STamizh chelvam 	.dyn_mimops = WMI_10X_PEER_DYN_MIMOPS,
15923fab30f7STamizh chelvam 	.static_mimops = WMI_10X_PEER_STATIC_MIMOPS,
15933fab30f7STamizh chelvam 	.spatial_mux = WMI_10X_PEER_SPATIAL_MUX,
15943fab30f7STamizh chelvam 	.vht = WMI_10X_PEER_VHT,
15953fab30f7STamizh chelvam 	.bw80 = WMI_10X_PEER_80MHZ,
15963fab30f7STamizh chelvam };
15973fab30f7STamizh chelvam 
15983fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = {
15993fab30f7STamizh chelvam 	.auth = WMI_10_2_PEER_AUTH,
16003fab30f7STamizh chelvam 	.qos = WMI_10_2_PEER_QOS,
16013fab30f7STamizh chelvam 	.need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY,
16023fab30f7STamizh chelvam 	.need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY,
16033fab30f7STamizh chelvam 	.apsd = WMI_10_2_PEER_APSD,
16043fab30f7STamizh chelvam 	.ht = WMI_10_2_PEER_HT,
16053fab30f7STamizh chelvam 	.bw40 = WMI_10_2_PEER_40MHZ,
16063fab30f7STamizh chelvam 	.stbc = WMI_10_2_PEER_STBC,
16073fab30f7STamizh chelvam 	.ldbc = WMI_10_2_PEER_LDPC,
16083fab30f7STamizh chelvam 	.dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS,
16093fab30f7STamizh chelvam 	.static_mimops = WMI_10_2_PEER_STATIC_MIMOPS,
16103fab30f7STamizh chelvam 	.spatial_mux = WMI_10_2_PEER_SPATIAL_MUX,
16113fab30f7STamizh chelvam 	.vht = WMI_10_2_PEER_VHT,
16123fab30f7STamizh chelvam 	.bw80 = WMI_10_2_PEER_80MHZ,
16133fab30f7STamizh chelvam 	.vht_2g = WMI_10_2_PEER_VHT_2G,
16143fab30f7STamizh chelvam 	.pmf = WMI_10_2_PEER_PMF,
16153fab30f7STamizh chelvam };
16163fab30f7STamizh chelvam 
16170226d602SMichal Kazior void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
16182d66721cSMichal Kazior 				const struct wmi_channel_arg *arg)
16192d66721cSMichal Kazior {
16202d66721cSMichal Kazior 	u32 flags = 0;
16212d66721cSMichal Kazior 
16222d66721cSMichal Kazior 	memset(ch, 0, sizeof(*ch));
16232d66721cSMichal Kazior 
16242d66721cSMichal Kazior 	if (arg->passive)
16252d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_PASSIVE;
16262d66721cSMichal Kazior 	if (arg->allow_ibss)
16272d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
16282d66721cSMichal Kazior 	if (arg->allow_ht)
16292d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_ALLOW_HT;
16302d66721cSMichal Kazior 	if (arg->allow_vht)
16312d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_ALLOW_VHT;
16322d66721cSMichal Kazior 	if (arg->ht40plus)
16332d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_HT40_PLUS;
16342d66721cSMichal Kazior 	if (arg->chan_radar)
16352d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_DFS;
16362d66721cSMichal Kazior 
16372d66721cSMichal Kazior 	ch->mhz = __cpu_to_le32(arg->freq);
16382d66721cSMichal Kazior 	ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1);
16392d66721cSMichal Kazior 	ch->band_center_freq2 = 0;
16402d66721cSMichal Kazior 	ch->min_power = arg->min_power;
16412d66721cSMichal Kazior 	ch->max_power = arg->max_power;
16422d66721cSMichal Kazior 	ch->reg_power = arg->max_reg_power;
16432d66721cSMichal Kazior 	ch->antenna_max = arg->max_antenna_gain;
1644513527c8SAlan Liu 	ch->max_tx_power = arg->max_power;
16452d66721cSMichal Kazior 
16462d66721cSMichal Kazior 	/* mode & flags share storage */
16472d66721cSMichal Kazior 	ch->mode = arg->mode;
16482d66721cSMichal Kazior 	ch->flags |= __cpu_to_le32(flags);
16492d66721cSMichal Kazior }
16502d66721cSMichal Kazior 
16515e3dd157SKalle Valo int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
16525e3dd157SKalle Valo {
16539eea5689SNicholas Mc Guire 	unsigned long time_left;
1654af762c0bSKalle Valo 
16559eea5689SNicholas Mc Guire 	time_left = wait_for_completion_timeout(&ar->wmi.service_ready,
16565e3dd157SKalle Valo 						WMI_SERVICE_READY_TIMEOUT_HZ);
16579eea5689SNicholas Mc Guire 	if (!time_left)
16589eea5689SNicholas Mc Guire 		return -ETIMEDOUT;
16599eea5689SNicholas Mc Guire 	return 0;
16605e3dd157SKalle Valo }
16615e3dd157SKalle Valo 
16625e3dd157SKalle Valo int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
16635e3dd157SKalle Valo {
16649eea5689SNicholas Mc Guire 	unsigned long time_left;
1665af762c0bSKalle Valo 
16669eea5689SNicholas Mc Guire 	time_left = wait_for_completion_timeout(&ar->wmi.unified_ready,
16675e3dd157SKalle Valo 						WMI_UNIFIED_READY_TIMEOUT_HZ);
16689eea5689SNicholas Mc Guire 	if (!time_left)
16699eea5689SNicholas Mc Guire 		return -ETIMEDOUT;
16709eea5689SNicholas Mc Guire 	return 0;
16715e3dd157SKalle Valo }
16725e3dd157SKalle Valo 
1673666a73f3SKalle Valo struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len)
16745e3dd157SKalle Valo {
16755e3dd157SKalle Valo 	struct sk_buff *skb;
16765e3dd157SKalle Valo 	u32 round_len = roundup(len, 4);
16775e3dd157SKalle Valo 
16787aa7a72aSMichal Kazior 	skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len);
16795e3dd157SKalle Valo 	if (!skb)
16805e3dd157SKalle Valo 		return NULL;
16815e3dd157SKalle Valo 
16825e3dd157SKalle Valo 	skb_reserve(skb, WMI_SKB_HEADROOM);
16835e3dd157SKalle Valo 	if (!IS_ALIGNED((unsigned long)skb->data, 4))
16847aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unaligned WMI skb\n");
16855e3dd157SKalle Valo 
16865e3dd157SKalle Valo 	skb_put(skb, round_len);
16875e3dd157SKalle Valo 	memset(skb->data, 0, round_len);
16885e3dd157SKalle Valo 
16895e3dd157SKalle Valo 	return skb;
16905e3dd157SKalle Valo }
16915e3dd157SKalle Valo 
16925e3dd157SKalle Valo static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
16935e3dd157SKalle Valo {
16945e3dd157SKalle Valo 	dev_kfree_skb(skb);
16955e3dd157SKalle Valo }
16965e3dd157SKalle Valo 
1697d7579d12SMichal Kazior int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
1698ce42870eSBartosz Markowski 			       u32 cmd_id)
16995e3dd157SKalle Valo {
17005e3dd157SKalle Valo 	struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
17015e3dd157SKalle Valo 	struct wmi_cmd_hdr *cmd_hdr;
1702be8b3943SMichal Kazior 	int ret;
17035e3dd157SKalle Valo 	u32 cmd = 0;
17045e3dd157SKalle Valo 
17055e3dd157SKalle Valo 	if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
17065e3dd157SKalle Valo 		return -ENOMEM;
17075e3dd157SKalle Valo 
17085e3dd157SKalle Valo 	cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID);
17095e3dd157SKalle Valo 
17105e3dd157SKalle Valo 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
17115e3dd157SKalle Valo 	cmd_hdr->cmd_id = __cpu_to_le32(cmd);
17125e3dd157SKalle Valo 
17135e3dd157SKalle Valo 	memset(skb_cb, 0, sizeof(*skb_cb));
1714be8b3943SMichal Kazior 	ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
1715d35a6c18SMichal Kazior 	trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len, ret);
17165e3dd157SKalle Valo 
1717be8b3943SMichal Kazior 	if (ret)
1718be8b3943SMichal Kazior 		goto err_pull;
17195e3dd157SKalle Valo 
17205e3dd157SKalle Valo 	return 0;
1721be8b3943SMichal Kazior 
1722be8b3943SMichal Kazior err_pull:
1723be8b3943SMichal Kazior 	skb_pull(skb, sizeof(struct wmi_cmd_hdr));
1724be8b3943SMichal Kazior 	return ret;
1725be8b3943SMichal Kazior }
1726be8b3943SMichal Kazior 
1727ed54388aSMichal Kazior static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
1728ed54388aSMichal Kazior {
1729af21319fSMichal Kazior 	struct ath10k *ar = arvif->ar;
17309ad50182SMichal Kazior 	struct ath10k_skb_cb *cb;
1731af21319fSMichal Kazior 	struct sk_buff *bcn;
173266b8a010SMichal Kazior 	bool dtim_zero;
173366b8a010SMichal Kazior 	bool deliver_cab;
1734ed54388aSMichal Kazior 	int ret;
1735ed54388aSMichal Kazior 
1736af21319fSMichal Kazior 	spin_lock_bh(&ar->data_lock);
1737ed54388aSMichal Kazior 
17389ad50182SMichal Kazior 	bcn = arvif->beacon;
1739ed54388aSMichal Kazior 
1740af21319fSMichal Kazior 	if (!bcn)
1741af21319fSMichal Kazior 		goto unlock;
1742ed54388aSMichal Kazior 
17439ad50182SMichal Kazior 	cb = ATH10K_SKB_CB(bcn);
1744ed54388aSMichal Kazior 
1745af21319fSMichal Kazior 	switch (arvif->beacon_state) {
1746af21319fSMichal Kazior 	case ATH10K_BEACON_SENDING:
1747af21319fSMichal Kazior 	case ATH10K_BEACON_SENT:
1748af21319fSMichal Kazior 		break;
1749af21319fSMichal Kazior 	case ATH10K_BEACON_SCHEDULED:
1750af21319fSMichal Kazior 		arvif->beacon_state = ATH10K_BEACON_SENDING;
1751af21319fSMichal Kazior 		spin_unlock_bh(&ar->data_lock);
1752af21319fSMichal Kazior 
175366b8a010SMichal Kazior 		dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO);
175466b8a010SMichal Kazior 		deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB);
1755af21319fSMichal Kazior 		ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar,
1756af21319fSMichal Kazior 							arvif->vdev_id,
1757af21319fSMichal Kazior 							bcn->data, bcn->len,
1758af21319fSMichal Kazior 							cb->paddr,
175966b8a010SMichal Kazior 							dtim_zero,
176066b8a010SMichal Kazior 							deliver_cab);
1761ed54388aSMichal Kazior 
1762af21319fSMichal Kazior 		spin_lock_bh(&ar->data_lock);
1763af21319fSMichal Kazior 
1764af21319fSMichal Kazior 		if (ret == 0)
1765af21319fSMichal Kazior 			arvif->beacon_state = ATH10K_BEACON_SENT;
1766af21319fSMichal Kazior 		else
1767af21319fSMichal Kazior 			arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
1768af21319fSMichal Kazior 	}
1769af21319fSMichal Kazior 
1770af21319fSMichal Kazior unlock:
1771af21319fSMichal Kazior 	spin_unlock_bh(&ar->data_lock);
1772ed54388aSMichal Kazior }
1773ed54388aSMichal Kazior 
1774ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
1775ed54388aSMichal Kazior 				       struct ieee80211_vif *vif)
1776ed54388aSMichal Kazior {
1777ed54388aSMichal Kazior 	struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1778ed54388aSMichal Kazior 
1779ed54388aSMichal Kazior 	ath10k_wmi_tx_beacon_nowait(arvif);
1780ed54388aSMichal Kazior }
1781ed54388aSMichal Kazior 
1782ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar)
1783ed54388aSMichal Kazior {
1784ed54388aSMichal Kazior 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
1785ed54388aSMichal Kazior 						   IEEE80211_IFACE_ITER_NORMAL,
1786ed54388aSMichal Kazior 						   ath10k_wmi_tx_beacons_iter,
1787ed54388aSMichal Kazior 						   NULL);
1788ed54388aSMichal Kazior }
1789ed54388aSMichal Kazior 
179012acbc43SMichal Kazior static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
1791be8b3943SMichal Kazior {
1792ed54388aSMichal Kazior 	/* try to send pending beacons first. they take priority */
1793ed54388aSMichal Kazior 	ath10k_wmi_tx_beacons_nowait(ar);
1794ed54388aSMichal Kazior 
1795be8b3943SMichal Kazior 	wake_up(&ar->wmi.tx_credits_wq);
1796be8b3943SMichal Kazior }
1797be8b3943SMichal Kazior 
1798666a73f3SKalle Valo int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
1799be8b3943SMichal Kazior {
180034957b25SBartosz Markowski 	int ret = -EOPNOTSUPP;
1801be8b3943SMichal Kazior 
180256b84287SKalle Valo 	might_sleep();
180356b84287SKalle Valo 
180434957b25SBartosz Markowski 	if (cmd_id == WMI_CMD_UNSUPPORTED) {
18057aa7a72aSMichal Kazior 		ath10k_warn(ar, "wmi command %d is not supported by firmware\n",
180655321559SBartosz Markowski 			    cmd_id);
180755321559SBartosz Markowski 		return ret;
180855321559SBartosz Markowski 	}
1809be8b3943SMichal Kazior 
1810be8b3943SMichal Kazior 	wait_event_timeout(ar->wmi.tx_credits_wq, ({
1811ed54388aSMichal Kazior 		/* try to send pending beacons first. they take priority */
1812ed54388aSMichal Kazior 		ath10k_wmi_tx_beacons_nowait(ar);
1813ed54388aSMichal Kazior 
1814be8b3943SMichal Kazior 		ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
18157962b0d8SMichal Kazior 
18167962b0d8SMichal Kazior 		if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
18177962b0d8SMichal Kazior 			ret = -ESHUTDOWN;
18187962b0d8SMichal Kazior 
1819be8b3943SMichal Kazior 		(ret != -EAGAIN);
1820be8b3943SMichal Kazior 	}), 3 * HZ);
1821be8b3943SMichal Kazior 
1822be8b3943SMichal Kazior 	if (ret)
1823be8b3943SMichal Kazior 		dev_kfree_skb_any(skb);
1824be8b3943SMichal Kazior 
1825be8b3943SMichal Kazior 	return ret;
18265e3dd157SKalle Valo }
18275e3dd157SKalle Valo 
1828d7579d12SMichal Kazior static struct sk_buff *
1829d7579d12SMichal Kazior ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
18305e00d31aSBartosz Markowski {
1831609db229SMichal Kazior 	struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
1832a66cd733SBob Copeland 	struct ath10k_vif *arvif;
18335e00d31aSBartosz Markowski 	struct wmi_mgmt_tx_cmd *cmd;
18345e00d31aSBartosz Markowski 	struct ieee80211_hdr *hdr;
1835d7579d12SMichal Kazior 	struct sk_buff *skb;
18365e00d31aSBartosz Markowski 	int len;
1837609db229SMichal Kazior 	u32 vdev_id;
1838d7579d12SMichal Kazior 	u32 buf_len = msdu->len;
18395e00d31aSBartosz Markowski 	u16 fc;
18405e00d31aSBartosz Markowski 
1841d7579d12SMichal Kazior 	hdr = (struct ieee80211_hdr *)msdu->data;
18425e00d31aSBartosz Markowski 	fc = le16_to_cpu(hdr->frame_control);
18435e00d31aSBartosz Markowski 
1844a66cd733SBob Copeland 	if (cb->vif) {
1845a66cd733SBob Copeland 		arvif = (void *)cb->vif->drv_priv;
1846609db229SMichal Kazior 		vdev_id = arvif->vdev_id;
1847a66cd733SBob Copeland 	} else {
1848609db229SMichal Kazior 		vdev_id = 0;
1849a66cd733SBob Copeland 	}
1850609db229SMichal Kazior 
18515e00d31aSBartosz Markowski 	if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
1852d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
18535e00d31aSBartosz Markowski 
1854d7579d12SMichal Kazior 	len = sizeof(cmd->hdr) + msdu->len;
1855eeab266cSMarek Kwaczynski 
1856eeab266cSMarek Kwaczynski 	if ((ieee80211_is_action(hdr->frame_control) ||
1857eeab266cSMarek Kwaczynski 	     ieee80211_is_deauth(hdr->frame_control) ||
1858eeab266cSMarek Kwaczynski 	     ieee80211_is_disassoc(hdr->frame_control)) &&
1859eeab266cSMarek Kwaczynski 	     ieee80211_has_protected(hdr->frame_control)) {
1860eeab266cSMarek Kwaczynski 		len += IEEE80211_CCMP_MIC_LEN;
1861eeab266cSMarek Kwaczynski 		buf_len += IEEE80211_CCMP_MIC_LEN;
1862eeab266cSMarek Kwaczynski 	}
1863eeab266cSMarek Kwaczynski 
18645e00d31aSBartosz Markowski 	len = round_up(len, 4);
18655e00d31aSBartosz Markowski 
1866d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
1867d7579d12SMichal Kazior 	if (!skb)
1868d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
18695e00d31aSBartosz Markowski 
1870d7579d12SMichal Kazior 	cmd = (struct wmi_mgmt_tx_cmd *)skb->data;
18715e00d31aSBartosz Markowski 
1872609db229SMichal Kazior 	cmd->hdr.vdev_id = __cpu_to_le32(vdev_id);
18735e00d31aSBartosz Markowski 	cmd->hdr.tx_rate = 0;
18745e00d31aSBartosz Markowski 	cmd->hdr.tx_power = 0;
1875eeab266cSMarek Kwaczynski 	cmd->hdr.buf_len = __cpu_to_le32(buf_len);
18765e00d31aSBartosz Markowski 
1877b25f32cbSKalle Valo 	ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr));
1878d7579d12SMichal Kazior 	memcpy(cmd->buf, msdu->data, msdu->len);
18795e00d31aSBartosz Markowski 
188075b34800SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n",
1881d7579d12SMichal Kazior 		   msdu, skb->len, fc & IEEE80211_FCTL_FTYPE,
18825e00d31aSBartosz Markowski 		   fc & IEEE80211_FCTL_STYPE);
18835ce8e7fdSRajkumar Manoharan 	trace_ath10k_tx_hdr(ar, skb->data, skb->len);
18845ce8e7fdSRajkumar Manoharan 	trace_ath10k_tx_payload(ar, skb->data, skb->len);
18855e00d31aSBartosz Markowski 
1886d7579d12SMichal Kazior 	return skb;
18875e00d31aSBartosz Markowski }
18885e00d31aSBartosz Markowski 
18895c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_started(struct ath10k *ar)
18905c81c7fdSMichal Kazior {
18915c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
18925c81c7fdSMichal Kazior 
18935c81c7fdSMichal Kazior 	switch (ar->scan.state) {
18945c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
18955c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
18965c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
18977aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n",
18985c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
18995c81c7fdSMichal Kazior 			    ar->scan.state);
19005c81c7fdSMichal Kazior 		break;
19015c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
19025c81c7fdSMichal Kazior 		ar->scan.state = ATH10K_SCAN_RUNNING;
19035c81c7fdSMichal Kazior 
19045c81c7fdSMichal Kazior 		if (ar->scan.is_roc)
19055c81c7fdSMichal Kazior 			ieee80211_ready_on_channel(ar->hw);
19065c81c7fdSMichal Kazior 
19075c81c7fdSMichal Kazior 		complete(&ar->scan.started);
19085c81c7fdSMichal Kazior 		break;
19095c81c7fdSMichal Kazior 	}
19105c81c7fdSMichal Kazior }
19115c81c7fdSMichal Kazior 
19122f9eec0bSBen Greear static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
19132f9eec0bSBen Greear {
19142f9eec0bSBen Greear 	lockdep_assert_held(&ar->data_lock);
19152f9eec0bSBen Greear 
19162f9eec0bSBen Greear 	switch (ar->scan.state) {
19172f9eec0bSBen Greear 	case ATH10K_SCAN_IDLE:
19182f9eec0bSBen Greear 	case ATH10K_SCAN_RUNNING:
19192f9eec0bSBen Greear 	case ATH10K_SCAN_ABORTING:
19202f9eec0bSBen Greear 		ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
19212f9eec0bSBen Greear 			    ath10k_scan_state_str(ar->scan.state),
19222f9eec0bSBen Greear 			    ar->scan.state);
19232f9eec0bSBen Greear 		break;
19242f9eec0bSBen Greear 	case ATH10K_SCAN_STARTING:
19252f9eec0bSBen Greear 		complete(&ar->scan.started);
19262f9eec0bSBen Greear 		__ath10k_scan_finish(ar);
19272f9eec0bSBen Greear 		break;
19282f9eec0bSBen Greear 	}
19292f9eec0bSBen Greear }
19302f9eec0bSBen Greear 
19315c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
19325c81c7fdSMichal Kazior {
19335c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
19345c81c7fdSMichal Kazior 
19355c81c7fdSMichal Kazior 	switch (ar->scan.state) {
19365c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
19375c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
19385c81c7fdSMichal Kazior 		/* One suspected reason scan can be completed while starting is
19395c81c7fdSMichal Kazior 		 * if firmware fails to deliver all scan events to the host,
19405c81c7fdSMichal Kazior 		 * e.g. when transport pipe is full. This has been observed
19415c81c7fdSMichal Kazior 		 * with spectral scan phyerr events starving wmi transport
19425c81c7fdSMichal Kazior 		 * pipe. In such case the "scan completed" event should be (and
19435c81c7fdSMichal Kazior 		 * is) ignored by the host as it may be just firmware's scan
19445c81c7fdSMichal Kazior 		 * state machine recovering.
19455c81c7fdSMichal Kazior 		 */
19467aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n",
19475c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
19485c81c7fdSMichal Kazior 			    ar->scan.state);
19495c81c7fdSMichal Kazior 		break;
19505c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
19515c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
19525c81c7fdSMichal Kazior 		__ath10k_scan_finish(ar);
19535c81c7fdSMichal Kazior 		break;
19545c81c7fdSMichal Kazior 	}
19555c81c7fdSMichal Kazior }
19565c81c7fdSMichal Kazior 
19575c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar)
19585c81c7fdSMichal Kazior {
19595c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
19605c81c7fdSMichal Kazior 
19615c81c7fdSMichal Kazior 	switch (ar->scan.state) {
19625c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
19635c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
19647aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n",
19655c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
19665c81c7fdSMichal Kazior 			    ar->scan.state);
19675c81c7fdSMichal Kazior 		break;
19685c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
19695c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
19705c81c7fdSMichal Kazior 		ar->scan_channel = NULL;
19715c81c7fdSMichal Kazior 		break;
19725c81c7fdSMichal Kazior 	}
19735c81c7fdSMichal Kazior }
19745c81c7fdSMichal Kazior 
19755c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq)
19765c81c7fdSMichal Kazior {
19775c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
19785c81c7fdSMichal Kazior 
19795c81c7fdSMichal Kazior 	switch (ar->scan.state) {
19805c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
19815c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
19827aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n",
19835c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
19845c81c7fdSMichal Kazior 			    ar->scan.state);
19855c81c7fdSMichal Kazior 		break;
19865c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
19875c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
19885c81c7fdSMichal Kazior 		ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);
19895c81c7fdSMichal Kazior 
19905c81c7fdSMichal Kazior 		if (ar->scan.is_roc && ar->scan.roc_freq == freq)
19915c81c7fdSMichal Kazior 			complete(&ar->scan.on_channel);
19925c81c7fdSMichal Kazior 		break;
19935c81c7fdSMichal Kazior 	}
19945c81c7fdSMichal Kazior }
19955c81c7fdSMichal Kazior 
19969ff8b724SMichal Kazior static const char *
19979ff8b724SMichal Kazior ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type,
19989ff8b724SMichal Kazior 			       enum wmi_scan_completion_reason reason)
19999ff8b724SMichal Kazior {
20009ff8b724SMichal Kazior 	switch (type) {
20019ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_STARTED:
20029ff8b724SMichal Kazior 		return "started";
20039ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_COMPLETED:
20049ff8b724SMichal Kazior 		switch (reason) {
20059ff8b724SMichal Kazior 		case WMI_SCAN_REASON_COMPLETED:
20069ff8b724SMichal Kazior 			return "completed";
20079ff8b724SMichal Kazior 		case WMI_SCAN_REASON_CANCELLED:
20089ff8b724SMichal Kazior 			return "completed [cancelled]";
20099ff8b724SMichal Kazior 		case WMI_SCAN_REASON_PREEMPTED:
20109ff8b724SMichal Kazior 			return "completed [preempted]";
20119ff8b724SMichal Kazior 		case WMI_SCAN_REASON_TIMEDOUT:
20129ff8b724SMichal Kazior 			return "completed [timedout]";
2013b2297baaSRaja Mani 		case WMI_SCAN_REASON_INTERNAL_FAILURE:
2014b2297baaSRaja Mani 			return "completed [internal err]";
20159ff8b724SMichal Kazior 		case WMI_SCAN_REASON_MAX:
20169ff8b724SMichal Kazior 			break;
20179ff8b724SMichal Kazior 		}
20189ff8b724SMichal Kazior 		return "completed [unknown]";
20199ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_BSS_CHANNEL:
20209ff8b724SMichal Kazior 		return "bss channel";
20219ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
20229ff8b724SMichal Kazior 		return "foreign channel";
20239ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_DEQUEUED:
20249ff8b724SMichal Kazior 		return "dequeued";
20259ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_PREEMPTED:
20269ff8b724SMichal Kazior 		return "preempted";
20279ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_START_FAILED:
20289ff8b724SMichal Kazior 		return "start failed";
2029b2297baaSRaja Mani 	case WMI_SCAN_EVENT_RESTARTED:
2030b2297baaSRaja Mani 		return "restarted";
2031b2297baaSRaja Mani 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
2032b2297baaSRaja Mani 		return "foreign channel exit";
20339ff8b724SMichal Kazior 	default:
20349ff8b724SMichal Kazior 		return "unknown";
20359ff8b724SMichal Kazior 	}
20369ff8b724SMichal Kazior }
20379ff8b724SMichal Kazior 
2038d7579d12SMichal Kazior static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb,
203932653cf1SMichal Kazior 				      struct wmi_scan_ev_arg *arg)
204032653cf1SMichal Kazior {
204132653cf1SMichal Kazior 	struct wmi_scan_event *ev = (void *)skb->data;
204232653cf1SMichal Kazior 
204332653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
204432653cf1SMichal Kazior 		return -EPROTO;
204532653cf1SMichal Kazior 
204632653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
204732653cf1SMichal Kazior 	arg->event_type = ev->event_type;
204832653cf1SMichal Kazior 	arg->reason = ev->reason;
204932653cf1SMichal Kazior 	arg->channel_freq = ev->channel_freq;
205032653cf1SMichal Kazior 	arg->scan_req_id = ev->scan_req_id;
205132653cf1SMichal Kazior 	arg->scan_id = ev->scan_id;
205232653cf1SMichal Kazior 	arg->vdev_id = ev->vdev_id;
205332653cf1SMichal Kazior 
205432653cf1SMichal Kazior 	return 0;
205532653cf1SMichal Kazior }
205632653cf1SMichal Kazior 
20570226d602SMichal Kazior int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
20585e3dd157SKalle Valo {
205932653cf1SMichal Kazior 	struct wmi_scan_ev_arg arg = {};
20605e3dd157SKalle Valo 	enum wmi_scan_event_type event_type;
20615e3dd157SKalle Valo 	enum wmi_scan_completion_reason reason;
20625e3dd157SKalle Valo 	u32 freq;
20635e3dd157SKalle Valo 	u32 req_id;
20645e3dd157SKalle Valo 	u32 scan_id;
20655e3dd157SKalle Valo 	u32 vdev_id;
206632653cf1SMichal Kazior 	int ret;
20675e3dd157SKalle Valo 
2068d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_scan(ar, skb, &arg);
206932653cf1SMichal Kazior 	if (ret) {
207032653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse scan event: %d\n", ret);
207132653cf1SMichal Kazior 		return ret;
207232653cf1SMichal Kazior 	}
207332653cf1SMichal Kazior 
207432653cf1SMichal Kazior 	event_type = __le32_to_cpu(arg.event_type);
207532653cf1SMichal Kazior 	reason = __le32_to_cpu(arg.reason);
207632653cf1SMichal Kazior 	freq = __le32_to_cpu(arg.channel_freq);
207732653cf1SMichal Kazior 	req_id = __le32_to_cpu(arg.scan_req_id);
207832653cf1SMichal Kazior 	scan_id = __le32_to_cpu(arg.scan_id);
207932653cf1SMichal Kazior 	vdev_id = __le32_to_cpu(arg.vdev_id);
20805e3dd157SKalle Valo 
20815e3dd157SKalle Valo 	spin_lock_bh(&ar->data_lock);
20825e3dd157SKalle Valo 
20837aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
20845c81c7fdSMichal Kazior 		   "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n",
20855c81c7fdSMichal Kazior 		   ath10k_wmi_event_scan_type_str(event_type, reason),
20865c81c7fdSMichal Kazior 		   event_type, reason, freq, req_id, scan_id, vdev_id,
20875c81c7fdSMichal Kazior 		   ath10k_scan_state_str(ar->scan.state), ar->scan.state);
20885c81c7fdSMichal Kazior 
20895e3dd157SKalle Valo 	switch (event_type) {
20905e3dd157SKalle Valo 	case WMI_SCAN_EVENT_STARTED:
20915c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_started(ar);
20925e3dd157SKalle Valo 		break;
20935e3dd157SKalle Valo 	case WMI_SCAN_EVENT_COMPLETED:
20945c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_completed(ar);
20955e3dd157SKalle Valo 		break;
20965e3dd157SKalle Valo 	case WMI_SCAN_EVENT_BSS_CHANNEL:
20975c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_bss_chan(ar);
20985e3dd157SKalle Valo 		break;
20995e3dd157SKalle Valo 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
21005c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_foreign_chan(ar, freq);
21015c81c7fdSMichal Kazior 		break;
21025c81c7fdSMichal Kazior 	case WMI_SCAN_EVENT_START_FAILED:
21037aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan start failure event\n");
21042f9eec0bSBen Greear 		ath10k_wmi_event_scan_start_failed(ar);
21055e3dd157SKalle Valo 		break;
21065e3dd157SKalle Valo 	case WMI_SCAN_EVENT_DEQUEUED:
21075e3dd157SKalle Valo 	case WMI_SCAN_EVENT_PREEMPTED:
2108b2297baaSRaja Mani 	case WMI_SCAN_EVENT_RESTARTED:
2109b2297baaSRaja Mani 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
21105e3dd157SKalle Valo 	default:
21115e3dd157SKalle Valo 		break;
21125e3dd157SKalle Valo 	}
21135e3dd157SKalle Valo 
21145e3dd157SKalle Valo 	spin_unlock_bh(&ar->data_lock);
21155e3dd157SKalle Valo 	return 0;
21165e3dd157SKalle Valo }
21175e3dd157SKalle Valo 
2118504f6cdfSSujith Manoharan /* If keys are configured, HW decrypts all frames
2119504f6cdfSSujith Manoharan  * with protected bit set. Mark such frames as decrypted.
2120504f6cdfSSujith Manoharan  */
2121504f6cdfSSujith Manoharan static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar,
2122504f6cdfSSujith Manoharan 					 struct sk_buff *skb,
2123504f6cdfSSujith Manoharan 					 struct ieee80211_rx_status *status)
2124504f6cdfSSujith Manoharan {
2125504f6cdfSSujith Manoharan 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2126504f6cdfSSujith Manoharan 	unsigned int hdrlen;
2127504f6cdfSSujith Manoharan 	bool peer_key;
2128504f6cdfSSujith Manoharan 	u8 *addr, keyidx;
2129504f6cdfSSujith Manoharan 
2130504f6cdfSSujith Manoharan 	if (!ieee80211_is_auth(hdr->frame_control) ||
2131504f6cdfSSujith Manoharan 	    !ieee80211_has_protected(hdr->frame_control))
2132504f6cdfSSujith Manoharan 		return;
2133504f6cdfSSujith Manoharan 
2134504f6cdfSSujith Manoharan 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
2135504f6cdfSSujith Manoharan 	if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN))
2136504f6cdfSSujith Manoharan 		return;
2137504f6cdfSSujith Manoharan 
2138504f6cdfSSujith Manoharan 	keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT;
2139504f6cdfSSujith Manoharan 	addr = ieee80211_get_SA(hdr);
2140504f6cdfSSujith Manoharan 
2141504f6cdfSSujith Manoharan 	spin_lock_bh(&ar->data_lock);
2142504f6cdfSSujith Manoharan 	peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx);
2143504f6cdfSSujith Manoharan 	spin_unlock_bh(&ar->data_lock);
2144504f6cdfSSujith Manoharan 
2145504f6cdfSSujith Manoharan 	if (peer_key) {
2146504f6cdfSSujith Manoharan 		ath10k_dbg(ar, ATH10K_DBG_MAC,
2147504f6cdfSSujith Manoharan 			   "mac wep key present for peer %pM\n", addr);
2148504f6cdfSSujith Manoharan 		status->flag |= RX_FLAG_DECRYPTED;
2149504f6cdfSSujith Manoharan 	}
2150504f6cdfSSujith Manoharan }
2151504f6cdfSSujith Manoharan 
2152d7579d12SMichal Kazior static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
2153d7579d12SMichal Kazior 					 struct wmi_mgmt_rx_ev_arg *arg)
21545e3dd157SKalle Valo {
21550d9b0438SMichal Kazior 	struct wmi_mgmt_rx_event_v1 *ev_v1;
21560d9b0438SMichal Kazior 	struct wmi_mgmt_rx_event_v2 *ev_v2;
21570d9b0438SMichal Kazior 	struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
21588d130963SPeter Oh 	struct wmi_mgmt_rx_ext_info *ext_info;
215932653cf1SMichal Kazior 	size_t pull_len;
216032653cf1SMichal Kazior 	u32 msdu_len;
21618d130963SPeter Oh 	u32 len;
21625e3dd157SKalle Valo 
2163c4cdf753SKalle Valo 	if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX,
2164c4cdf753SKalle Valo 		     ar->running_fw->fw_file.fw_features)) {
21650d9b0438SMichal Kazior 		ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data;
21660d9b0438SMichal Kazior 		ev_hdr = &ev_v2->hdr.v1;
21670d9b0438SMichal Kazior 		pull_len = sizeof(*ev_v2);
21680d9b0438SMichal Kazior 	} else {
21690d9b0438SMichal Kazior 		ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data;
21700d9b0438SMichal Kazior 		ev_hdr = &ev_v1->hdr;
21710d9b0438SMichal Kazior 		pull_len = sizeof(*ev_v1);
21720d9b0438SMichal Kazior 	}
21730d9b0438SMichal Kazior 
217432653cf1SMichal Kazior 	if (skb->len < pull_len)
217532653cf1SMichal Kazior 		return -EPROTO;
217632653cf1SMichal Kazior 
217732653cf1SMichal Kazior 	skb_pull(skb, pull_len);
217832653cf1SMichal Kazior 	arg->channel = ev_hdr->channel;
217932653cf1SMichal Kazior 	arg->buf_len = ev_hdr->buf_len;
218032653cf1SMichal Kazior 	arg->status = ev_hdr->status;
218132653cf1SMichal Kazior 	arg->snr = ev_hdr->snr;
218232653cf1SMichal Kazior 	arg->phy_mode = ev_hdr->phy_mode;
218332653cf1SMichal Kazior 	arg->rate = ev_hdr->rate;
218432653cf1SMichal Kazior 
218532653cf1SMichal Kazior 	msdu_len = __le32_to_cpu(arg->buf_len);
218632653cf1SMichal Kazior 	if (skb->len < msdu_len)
218732653cf1SMichal Kazior 		return -EPROTO;
218832653cf1SMichal Kazior 
21898d130963SPeter Oh 	if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
21908d130963SPeter Oh 		len = ALIGN(le32_to_cpu(arg->buf_len), 4);
21918d130963SPeter Oh 		ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
21928d130963SPeter Oh 		memcpy(&arg->ext_info, ext_info,
21938d130963SPeter Oh 		       sizeof(struct wmi_mgmt_rx_ext_info));
21948d130963SPeter Oh 	}
219532653cf1SMichal Kazior 	/* the WMI buffer might've ended up being padded to 4 bytes due to HTC
219632653cf1SMichal Kazior 	 * trailer with credit update. Trim the excess garbage.
219732653cf1SMichal Kazior 	 */
219832653cf1SMichal Kazior 	skb_trim(skb, msdu_len);
219932653cf1SMichal Kazior 
220032653cf1SMichal Kazior 	return 0;
220132653cf1SMichal Kazior }
220232653cf1SMichal Kazior 
22031c092961SRaja Mani static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar,
22041c092961SRaja Mani 					      struct sk_buff *skb,
22051c092961SRaja Mani 					      struct wmi_mgmt_rx_ev_arg *arg)
22061c092961SRaja Mani {
22071c092961SRaja Mani 	struct wmi_10_4_mgmt_rx_event *ev;
22081c092961SRaja Mani 	struct wmi_10_4_mgmt_rx_hdr *ev_hdr;
22091c092961SRaja Mani 	size_t pull_len;
22101c092961SRaja Mani 	u32 msdu_len;
22117d5efd08SPeter Oh 	struct wmi_mgmt_rx_ext_info *ext_info;
22127d5efd08SPeter Oh 	u32 len;
22131c092961SRaja Mani 
22141c092961SRaja Mani 	ev = (struct wmi_10_4_mgmt_rx_event *)skb->data;
22151c092961SRaja Mani 	ev_hdr = &ev->hdr;
22161c092961SRaja Mani 	pull_len = sizeof(*ev);
22171c092961SRaja Mani 
22181c092961SRaja Mani 	if (skb->len < pull_len)
22191c092961SRaja Mani 		return -EPROTO;
22201c092961SRaja Mani 
22211c092961SRaja Mani 	skb_pull(skb, pull_len);
22221c092961SRaja Mani 	arg->channel = ev_hdr->channel;
22231c092961SRaja Mani 	arg->buf_len = ev_hdr->buf_len;
22241c092961SRaja Mani 	arg->status = ev_hdr->status;
22251c092961SRaja Mani 	arg->snr = ev_hdr->snr;
22261c092961SRaja Mani 	arg->phy_mode = ev_hdr->phy_mode;
22271c092961SRaja Mani 	arg->rate = ev_hdr->rate;
22281c092961SRaja Mani 
22291c092961SRaja Mani 	msdu_len = __le32_to_cpu(arg->buf_len);
22301c092961SRaja Mani 	if (skb->len < msdu_len)
22311c092961SRaja Mani 		return -EPROTO;
22321c092961SRaja Mani 
22337d5efd08SPeter Oh 	if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
22347d5efd08SPeter Oh 		len = ALIGN(le32_to_cpu(arg->buf_len), 4);
22357d5efd08SPeter Oh 		ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
22367d5efd08SPeter Oh 		memcpy(&arg->ext_info, ext_info,
22377d5efd08SPeter Oh 		       sizeof(struct wmi_mgmt_rx_ext_info));
22387d5efd08SPeter Oh 	}
22397d5efd08SPeter Oh 
22401c092961SRaja Mani 	/* Make sure bytes added for padding are removed. */
22411c092961SRaja Mani 	skb_trim(skb, msdu_len);
22421c092961SRaja Mani 
22431c092961SRaja Mani 	return 0;
22441c092961SRaja Mani }
22451c092961SRaja Mani 
22460226d602SMichal Kazior int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
224732653cf1SMichal Kazior {
224832653cf1SMichal Kazior 	struct wmi_mgmt_rx_ev_arg arg = {};
224932653cf1SMichal Kazior 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
225032653cf1SMichal Kazior 	struct ieee80211_hdr *hdr;
225101cebe1cSMichal Kazior 	struct ieee80211_supported_band *sband;
225232653cf1SMichal Kazior 	u32 rx_status;
225332653cf1SMichal Kazior 	u32 channel;
225432653cf1SMichal Kazior 	u32 phy_mode;
225532653cf1SMichal Kazior 	u32 snr;
225632653cf1SMichal Kazior 	u32 rate;
225732653cf1SMichal Kazior 	u32 buf_len;
225832653cf1SMichal Kazior 	u16 fc;
225932653cf1SMichal Kazior 	int ret;
226032653cf1SMichal Kazior 
2261d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg);
226232653cf1SMichal Kazior 	if (ret) {
226332653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret);
226408603f2eSRaja Mani 		dev_kfree_skb(skb);
226532653cf1SMichal Kazior 		return ret;
226632653cf1SMichal Kazior 	}
226732653cf1SMichal Kazior 
226832653cf1SMichal Kazior 	channel = __le32_to_cpu(arg.channel);
226932653cf1SMichal Kazior 	buf_len = __le32_to_cpu(arg.buf_len);
227032653cf1SMichal Kazior 	rx_status = __le32_to_cpu(arg.status);
227132653cf1SMichal Kazior 	snr = __le32_to_cpu(arg.snr);
227232653cf1SMichal Kazior 	phy_mode = __le32_to_cpu(arg.phy_mode);
227332653cf1SMichal Kazior 	rate = __le32_to_cpu(arg.rate);
22745e3dd157SKalle Valo 
22755e3dd157SKalle Valo 	memset(status, 0, sizeof(*status));
22765e3dd157SKalle Valo 
22777aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT,
22785e3dd157SKalle Valo 		   "event mgmt rx status %08x\n", rx_status);
22795e3dd157SKalle Valo 
22802c9bceceSManikanta Pubbisetty 	if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) ||
22812c9bceceSManikanta Pubbisetty 	    (rx_status & (WMI_RX_STATUS_ERR_DECRYPT |
22822c9bceceSManikanta Pubbisetty 	    WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) {
2283d67d0a02SMichal Kazior 		dev_kfree_skb(skb);
2284d67d0a02SMichal Kazior 		return 0;
2285d67d0a02SMichal Kazior 	}
2286d67d0a02SMichal Kazior 
22875e3dd157SKalle Valo 	if (rx_status & WMI_RX_STATUS_ERR_MIC)
22885e3dd157SKalle Valo 		status->flag |= RX_FLAG_MMIC_ERROR;
22895e3dd157SKalle Valo 
22908d130963SPeter Oh 	if (rx_status & WMI_RX_STATUS_EXT_INFO) {
22918d130963SPeter Oh 		status->mactime =
22928d130963SPeter Oh 			__le64_to_cpu(arg.ext_info.rx_mac_timestamp);
22938d130963SPeter Oh 		status->flag |= RX_FLAG_MACTIME_END;
22948d130963SPeter Oh 	}
229521040bf9SMichal Kazior 	/* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to
2296453cdb61SMichal Kazior 	 * MODE_11B. This means phy_mode is not a reliable source for the band
229721040bf9SMichal Kazior 	 * of mgmt rx.
229821040bf9SMichal Kazior 	 */
229921040bf9SMichal Kazior 	if (channel >= 1 && channel <= 14) {
230057fbcce3SJohannes Berg 		status->band = NL80211_BAND_2GHZ;
230121040bf9SMichal Kazior 	} else if (channel >= 36 && channel <= 165) {
230257fbcce3SJohannes Berg 		status->band = NL80211_BAND_5GHZ;
2303453cdb61SMichal Kazior 	} else {
230421040bf9SMichal Kazior 		/* Shouldn't happen unless list of advertised channels to
230521040bf9SMichal Kazior 		 * mac80211 has been changed.
230621040bf9SMichal Kazior 		 */
230721040bf9SMichal Kazior 		WARN_ON_ONCE(1);
230821040bf9SMichal Kazior 		dev_kfree_skb(skb);
230921040bf9SMichal Kazior 		return 0;
2310453cdb61SMichal Kazior 	}
2311453cdb61SMichal Kazior 
231257fbcce3SJohannes Berg 	if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ)
231321040bf9SMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
231421040bf9SMichal Kazior 
231501cebe1cSMichal Kazior 	sband = &ar->mac.sbands[status->band];
231601cebe1cSMichal Kazior 
23175e3dd157SKalle Valo 	status->freq = ieee80211_channel_to_frequency(channel, status->band);
23185e3dd157SKalle Valo 	status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
231901cebe1cSMichal Kazior 	status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100);
23205e3dd157SKalle Valo 
23215e3dd157SKalle Valo 	hdr = (struct ieee80211_hdr *)skb->data;
23225e3dd157SKalle Valo 	fc = le16_to_cpu(hdr->frame_control);
23235e3dd157SKalle Valo 
232460549cabSGrzegorz Bajorski 	/* Firmware is guaranteed to report all essential management frames via
232560549cabSGrzegorz Bajorski 	 * WMI while it can deliver some extra via HTT. Since there can be
232660549cabSGrzegorz Bajorski 	 * duplicates split the reporting wrt monitor/sniffing.
232760549cabSGrzegorz Bajorski 	 */
232860549cabSGrzegorz Bajorski 	status->flag |= RX_FLAG_SKIP_MONITOR;
232960549cabSGrzegorz Bajorski 
2330504f6cdfSSujith Manoharan 	ath10k_wmi_handle_wep_reauth(ar, skb, status);
2331504f6cdfSSujith Manoharan 
23322b6a6a90SMichal Kazior 	/* FW delivers WEP Shared Auth frame with Protected Bit set and
23332b6a6a90SMichal Kazior 	 * encrypted payload. However in case of PMF it delivers decrypted
23342b6a6a90SMichal Kazior 	 * frames with Protected Bit set. */
23352b6a6a90SMichal Kazior 	if (ieee80211_has_protected(hdr->frame_control) &&
23362b6a6a90SMichal Kazior 	    !ieee80211_is_auth(hdr->frame_control)) {
2337eeab266cSMarek Kwaczynski 		status->flag |= RX_FLAG_DECRYPTED;
2338eeab266cSMarek Kwaczynski 
2339eeab266cSMarek Kwaczynski 		if (!ieee80211_is_action(hdr->frame_control) &&
2340eeab266cSMarek Kwaczynski 		    !ieee80211_is_deauth(hdr->frame_control) &&
2341eeab266cSMarek Kwaczynski 		    !ieee80211_is_disassoc(hdr->frame_control)) {
2342eeab266cSMarek Kwaczynski 			status->flag |= RX_FLAG_IV_STRIPPED |
23435e3dd157SKalle Valo 					RX_FLAG_MMIC_STRIPPED;
23445e3dd157SKalle Valo 			hdr->frame_control = __cpu_to_le16(fc &
23455e3dd157SKalle Valo 					~IEEE80211_FCTL_PROTECTED);
23465e3dd157SKalle Valo 		}
2347eeab266cSMarek Kwaczynski 	}
23485e3dd157SKalle Valo 
2349cc9904e6SMichal Kazior 	if (ieee80211_is_beacon(hdr->frame_control))
2350cc9904e6SMichal Kazior 		ath10k_mac_handle_beacon(ar, skb);
2351cc9904e6SMichal Kazior 
23527aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT,
235375b34800SMaharaja Kennadyrajan 		   "event mgmt rx skb %pK len %d ftype %02x stype %02x\n",
23545e3dd157SKalle Valo 		   skb, skb->len,
23555e3dd157SKalle Valo 		   fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE);
23565e3dd157SKalle Valo 
23577aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT,
23585e3dd157SKalle Valo 		   "event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
23595e3dd157SKalle Valo 		   status->freq, status->band, status->signal,
23605e3dd157SKalle Valo 		   status->rate_idx);
23615e3dd157SKalle Valo 
23625e3dd157SKalle Valo 	ieee80211_rx(ar->hw, skb);
23635e3dd157SKalle Valo 	return 0;
23645e3dd157SKalle Valo }
23655e3dd157SKalle Valo 
23662e1dea40SMichal Kazior static int freq_to_idx(struct ath10k *ar, int freq)
23672e1dea40SMichal Kazior {
23682e1dea40SMichal Kazior 	struct ieee80211_supported_band *sband;
23692e1dea40SMichal Kazior 	int band, ch, idx = 0;
23702e1dea40SMichal Kazior 
237157fbcce3SJohannes Berg 	for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
23722e1dea40SMichal Kazior 		sband = ar->hw->wiphy->bands[band];
23732e1dea40SMichal Kazior 		if (!sband)
23742e1dea40SMichal Kazior 			continue;
23752e1dea40SMichal Kazior 
23762e1dea40SMichal Kazior 		for (ch = 0; ch < sband->n_channels; ch++, idx++)
23772e1dea40SMichal Kazior 			if (sband->channels[ch].center_freq == freq)
23782e1dea40SMichal Kazior 				goto exit;
23792e1dea40SMichal Kazior 	}
23802e1dea40SMichal Kazior 
23812e1dea40SMichal Kazior exit:
23822e1dea40SMichal Kazior 	return idx;
23832e1dea40SMichal Kazior }
23842e1dea40SMichal Kazior 
2385d7579d12SMichal Kazior static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb,
238632653cf1SMichal Kazior 					 struct wmi_ch_info_ev_arg *arg)
238732653cf1SMichal Kazior {
238832653cf1SMichal Kazior 	struct wmi_chan_info_event *ev = (void *)skb->data;
238932653cf1SMichal Kazior 
239032653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
239132653cf1SMichal Kazior 		return -EPROTO;
239232653cf1SMichal Kazior 
239332653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
239432653cf1SMichal Kazior 	arg->err_code = ev->err_code;
239532653cf1SMichal Kazior 	arg->freq = ev->freq;
239632653cf1SMichal Kazior 	arg->cmd_flags = ev->cmd_flags;
239732653cf1SMichal Kazior 	arg->noise_floor = ev->noise_floor;
239832653cf1SMichal Kazior 	arg->rx_clear_count = ev->rx_clear_count;
239932653cf1SMichal Kazior 	arg->cycle_count = ev->cycle_count;
240032653cf1SMichal Kazior 
240132653cf1SMichal Kazior 	return 0;
240232653cf1SMichal Kazior }
240332653cf1SMichal Kazior 
2404b2297baaSRaja Mani static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar,
2405b2297baaSRaja Mani 					      struct sk_buff *skb,
2406b2297baaSRaja Mani 					      struct wmi_ch_info_ev_arg *arg)
2407b2297baaSRaja Mani {
2408b2297baaSRaja Mani 	struct wmi_10_4_chan_info_event *ev = (void *)skb->data;
2409b2297baaSRaja Mani 
2410b2297baaSRaja Mani 	if (skb->len < sizeof(*ev))
2411b2297baaSRaja Mani 		return -EPROTO;
2412b2297baaSRaja Mani 
2413b2297baaSRaja Mani 	skb_pull(skb, sizeof(*ev));
2414b2297baaSRaja Mani 	arg->err_code = ev->err_code;
2415b2297baaSRaja Mani 	arg->freq = ev->freq;
2416b2297baaSRaja Mani 	arg->cmd_flags = ev->cmd_flags;
2417b2297baaSRaja Mani 	arg->noise_floor = ev->noise_floor;
2418b2297baaSRaja Mani 	arg->rx_clear_count = ev->rx_clear_count;
2419b2297baaSRaja Mani 	arg->cycle_count = ev->cycle_count;
2420b2297baaSRaja Mani 	arg->chan_tx_pwr_range = ev->chan_tx_pwr_range;
2421b2297baaSRaja Mani 	arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp;
2422b2297baaSRaja Mani 	arg->rx_frame_count = ev->rx_frame_count;
2423b2297baaSRaja Mani 
2424b2297baaSRaja Mani 	return 0;
2425b2297baaSRaja Mani }
2426b2297baaSRaja Mani 
24270226d602SMichal Kazior void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
24285e3dd157SKalle Valo {
242932653cf1SMichal Kazior 	struct wmi_ch_info_ev_arg arg = {};
24302e1dea40SMichal Kazior 	struct survey_info *survey;
24312e1dea40SMichal Kazior 	u32 err_code, freq, cmd_flags, noise_floor, rx_clear_count, cycle_count;
243232653cf1SMichal Kazior 	int idx, ret;
24332e1dea40SMichal Kazior 
2434d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_ch_info(ar, skb, &arg);
243532653cf1SMichal Kazior 	if (ret) {
243632653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse chan info event: %d\n", ret);
243732653cf1SMichal Kazior 		return;
243832653cf1SMichal Kazior 	}
24392e1dea40SMichal Kazior 
244032653cf1SMichal Kazior 	err_code = __le32_to_cpu(arg.err_code);
244132653cf1SMichal Kazior 	freq = __le32_to_cpu(arg.freq);
244232653cf1SMichal Kazior 	cmd_flags = __le32_to_cpu(arg.cmd_flags);
244332653cf1SMichal Kazior 	noise_floor = __le32_to_cpu(arg.noise_floor);
244432653cf1SMichal Kazior 	rx_clear_count = __le32_to_cpu(arg.rx_clear_count);
244532653cf1SMichal Kazior 	cycle_count = __le32_to_cpu(arg.cycle_count);
24462e1dea40SMichal Kazior 
24477aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
24482e1dea40SMichal Kazior 		   "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
24492e1dea40SMichal Kazior 		   err_code, freq, cmd_flags, noise_floor, rx_clear_count,
24502e1dea40SMichal Kazior 		   cycle_count);
24512e1dea40SMichal Kazior 
24522e1dea40SMichal Kazior 	spin_lock_bh(&ar->data_lock);
24532e1dea40SMichal Kazior 
24545c81c7fdSMichal Kazior 	switch (ar->scan.state) {
24555c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
24565c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
24577aa7a72aSMichal Kazior 		ath10k_warn(ar, "received chan info event without a scan request, ignoring\n");
24582e1dea40SMichal Kazior 		goto exit;
24595c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
24605c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
24615c81c7fdSMichal Kazior 		break;
24622e1dea40SMichal Kazior 	}
24632e1dea40SMichal Kazior 
24642e1dea40SMichal Kazior 	idx = freq_to_idx(ar, freq);
24652e1dea40SMichal Kazior 	if (idx >= ARRAY_SIZE(ar->survey)) {
24667aa7a72aSMichal Kazior 		ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
24672e1dea40SMichal Kazior 			    freq, idx);
24682e1dea40SMichal Kazior 		goto exit;
24692e1dea40SMichal Kazior 	}
24702e1dea40SMichal Kazior 
24712e1dea40SMichal Kazior 	if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
247244b7d483SMichal Kazior 		if (ar->ch_info_can_report_survey) {
24732e1dea40SMichal Kazior 			survey = &ar->survey[idx];
24742e1dea40SMichal Kazior 			survey->noise = noise_floor;
2475587f7031SMichal Kazior 			survey->filled = SURVEY_INFO_NOISE_DBM;
2476587f7031SMichal Kazior 
2477587f7031SMichal Kazior 			ath10k_hw_fill_survey_time(ar,
2478587f7031SMichal Kazior 						   survey,
2479587f7031SMichal Kazior 						   cycle_count,
2480587f7031SMichal Kazior 						   rx_clear_count,
2481587f7031SMichal Kazior 						   ar->survey_last_cycle_count,
2482587f7031SMichal Kazior 						   ar->survey_last_rx_clear_count);
24832e1dea40SMichal Kazior 		}
24842e1dea40SMichal Kazior 
248544b7d483SMichal Kazior 		ar->ch_info_can_report_survey = false;
248644b7d483SMichal Kazior 	} else {
248744b7d483SMichal Kazior 		ar->ch_info_can_report_survey = true;
248844b7d483SMichal Kazior 	}
248944b7d483SMichal Kazior 
24903d2a2e29SVasanthakumar Thiagarajan 	if (!(cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) {
24912e1dea40SMichal Kazior 		ar->survey_last_rx_clear_count = rx_clear_count;
24922e1dea40SMichal Kazior 		ar->survey_last_cycle_count = cycle_count;
24933d2a2e29SVasanthakumar Thiagarajan 	}
24942e1dea40SMichal Kazior 
24952e1dea40SMichal Kazior exit:
24962e1dea40SMichal Kazior 	spin_unlock_bh(&ar->data_lock);
24975e3dd157SKalle Valo }
24985e3dd157SKalle Valo 
24990226d602SMichal Kazior void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
25005e3dd157SKalle Valo {
250184d4911bSMichal Kazior 	struct wmi_echo_ev_arg arg = {};
250284d4911bSMichal Kazior 	int ret;
250384d4911bSMichal Kazior 
250484d4911bSMichal Kazior 	ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg);
250584d4911bSMichal Kazior 	if (ret) {
250684d4911bSMichal Kazior 		ath10k_warn(ar, "failed to parse echo: %d\n", ret);
250784d4911bSMichal Kazior 		return;
250884d4911bSMichal Kazior 	}
250984d4911bSMichal Kazior 
251084d4911bSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
251184d4911bSMichal Kazior 		   "wmi event echo value 0x%08x\n",
251284d4911bSMichal Kazior 		   le32_to_cpu(arg.value));
251320ddca21SMichal Kazior 
251420ddca21SMichal Kazior 	if (le32_to_cpu(arg.value) == ATH10K_WMI_BARRIER_ECHO_ID)
251520ddca21SMichal Kazior 		complete(&ar->wmi.barrier);
25165e3dd157SKalle Valo }
25175e3dd157SKalle Valo 
25180226d602SMichal Kazior int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
25195e3dd157SKalle Valo {
25207aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
2521869526b9SKalle Valo 		   skb->len);
2522869526b9SKalle Valo 
2523d35a6c18SMichal Kazior 	trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);
2524869526b9SKalle Valo 
2525869526b9SKalle Valo 	return 0;
25265e3dd157SKalle Valo }
25275e3dd157SKalle Valo 
2528b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src,
25295326849aSMichal Kazior 				     struct ath10k_fw_stats_pdev *dst)
2530d15fb520SMichal Kazior {
2531d15fb520SMichal Kazior 	dst->ch_noise_floor = __le32_to_cpu(src->chan_nf);
2532d15fb520SMichal Kazior 	dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count);
2533d15fb520SMichal Kazior 	dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count);
2534d15fb520SMichal Kazior 	dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count);
2535d15fb520SMichal Kazior 	dst->cycle_count = __le32_to_cpu(src->cycle_count);
2536d15fb520SMichal Kazior 	dst->phy_err_count = __le32_to_cpu(src->phy_err_count);
2537d15fb520SMichal Kazior 	dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr);
2538b91251fbSMichal Kazior }
2539d15fb520SMichal Kazior 
2540b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src,
2541b91251fbSMichal Kazior 				   struct ath10k_fw_stats_pdev *dst)
2542b91251fbSMichal Kazior {
2543b91251fbSMichal Kazior 	dst->comp_queued = __le32_to_cpu(src->comp_queued);
2544b91251fbSMichal Kazior 	dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
2545b91251fbSMichal Kazior 	dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
2546b91251fbSMichal Kazior 	dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
2547b91251fbSMichal Kazior 	dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
2548b91251fbSMichal Kazior 	dst->local_enqued = __le32_to_cpu(src->local_enqued);
2549b91251fbSMichal Kazior 	dst->local_freed = __le32_to_cpu(src->local_freed);
2550b91251fbSMichal Kazior 	dst->hw_queued = __le32_to_cpu(src->hw_queued);
2551b91251fbSMichal Kazior 	dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
2552b91251fbSMichal Kazior 	dst->underrun = __le32_to_cpu(src->underrun);
2553b91251fbSMichal Kazior 	dst->tx_abort = __le32_to_cpu(src->tx_abort);
2554b91251fbSMichal Kazior 	dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
2555b91251fbSMichal Kazior 	dst->tx_ko = __le32_to_cpu(src->tx_ko);
2556b91251fbSMichal Kazior 	dst->data_rc = __le32_to_cpu(src->data_rc);
2557b91251fbSMichal Kazior 	dst->self_triggers = __le32_to_cpu(src->self_triggers);
2558b91251fbSMichal Kazior 	dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
2559b91251fbSMichal Kazior 	dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
2560b91251fbSMichal Kazior 	dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
2561b91251fbSMichal Kazior 	dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
2562b91251fbSMichal Kazior 	dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
2563b91251fbSMichal Kazior 	dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
2564b91251fbSMichal Kazior 	dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
2565b91251fbSMichal Kazior }
2566d15fb520SMichal Kazior 
256798dd2b92SManikanta Pubbisetty static void
256898dd2b92SManikanta Pubbisetty ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src,
256998dd2b92SManikanta Pubbisetty 				   struct ath10k_fw_stats_pdev *dst)
257098dd2b92SManikanta Pubbisetty {
257198dd2b92SManikanta Pubbisetty 	dst->comp_queued = __le32_to_cpu(src->comp_queued);
257298dd2b92SManikanta Pubbisetty 	dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
257398dd2b92SManikanta Pubbisetty 	dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
257498dd2b92SManikanta Pubbisetty 	dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
257598dd2b92SManikanta Pubbisetty 	dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
257698dd2b92SManikanta Pubbisetty 	dst->local_enqued = __le32_to_cpu(src->local_enqued);
257798dd2b92SManikanta Pubbisetty 	dst->local_freed = __le32_to_cpu(src->local_freed);
257898dd2b92SManikanta Pubbisetty 	dst->hw_queued = __le32_to_cpu(src->hw_queued);
257998dd2b92SManikanta Pubbisetty 	dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
258098dd2b92SManikanta Pubbisetty 	dst->underrun = __le32_to_cpu(src->underrun);
258198dd2b92SManikanta Pubbisetty 	dst->tx_abort = __le32_to_cpu(src->tx_abort);
258298dd2b92SManikanta Pubbisetty 	dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
258398dd2b92SManikanta Pubbisetty 	dst->tx_ko = __le32_to_cpu(src->tx_ko);
258498dd2b92SManikanta Pubbisetty 	dst->data_rc = __le32_to_cpu(src->data_rc);
258598dd2b92SManikanta Pubbisetty 	dst->self_triggers = __le32_to_cpu(src->self_triggers);
258698dd2b92SManikanta Pubbisetty 	dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
258798dd2b92SManikanta Pubbisetty 	dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
258898dd2b92SManikanta Pubbisetty 	dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
258998dd2b92SManikanta Pubbisetty 	dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
259098dd2b92SManikanta Pubbisetty 	dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
259198dd2b92SManikanta Pubbisetty 	dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
259298dd2b92SManikanta Pubbisetty 	dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
259398dd2b92SManikanta Pubbisetty 	dst->hw_paused = __le32_to_cpu(src->hw_paused);
259498dd2b92SManikanta Pubbisetty 	dst->seq_posted = __le32_to_cpu(src->seq_posted);
259598dd2b92SManikanta Pubbisetty 	dst->seq_failed_queueing =
259698dd2b92SManikanta Pubbisetty 		__le32_to_cpu(src->seq_failed_queueing);
259798dd2b92SManikanta Pubbisetty 	dst->seq_completed = __le32_to_cpu(src->seq_completed);
259898dd2b92SManikanta Pubbisetty 	dst->seq_restarted = __le32_to_cpu(src->seq_restarted);
259998dd2b92SManikanta Pubbisetty 	dst->mu_seq_posted = __le32_to_cpu(src->mu_seq_posted);
260098dd2b92SManikanta Pubbisetty 	dst->mpdus_sw_flush = __le32_to_cpu(src->mpdus_sw_flush);
260198dd2b92SManikanta Pubbisetty 	dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
260298dd2b92SManikanta Pubbisetty 	dst->mpdus_truncated = __le32_to_cpu(src->mpdus_truncated);
260398dd2b92SManikanta Pubbisetty 	dst->mpdus_ack_failed = __le32_to_cpu(src->mpdus_ack_failed);
260498dd2b92SManikanta Pubbisetty 	dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
260598dd2b92SManikanta Pubbisetty 	dst->mpdus_expired = __le32_to_cpu(src->mpdus_expired);
260698dd2b92SManikanta Pubbisetty }
260798dd2b92SManikanta Pubbisetty 
2608b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src,
2609b91251fbSMichal Kazior 				   struct ath10k_fw_stats_pdev *dst)
2610b91251fbSMichal Kazior {
2611b91251fbSMichal Kazior 	dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change);
2612b91251fbSMichal Kazior 	dst->status_rcvd = __le32_to_cpu(src->status_rcvd);
2613b91251fbSMichal Kazior 	dst->r0_frags = __le32_to_cpu(src->r0_frags);
2614b91251fbSMichal Kazior 	dst->r1_frags = __le32_to_cpu(src->r1_frags);
2615b91251fbSMichal Kazior 	dst->r2_frags = __le32_to_cpu(src->r2_frags);
2616b91251fbSMichal Kazior 	dst->r3_frags = __le32_to_cpu(src->r3_frags);
2617b91251fbSMichal Kazior 	dst->htt_msdus = __le32_to_cpu(src->htt_msdus);
2618b91251fbSMichal Kazior 	dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus);
2619b91251fbSMichal Kazior 	dst->loc_msdus = __le32_to_cpu(src->loc_msdus);
2620b91251fbSMichal Kazior 	dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus);
2621b91251fbSMichal Kazior 	dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu);
2622b91251fbSMichal Kazior 	dst->phy_errs = __le32_to_cpu(src->phy_errs);
2623b91251fbSMichal Kazior 	dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop);
2624b91251fbSMichal Kazior 	dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs);
2625b91251fbSMichal Kazior }
2626b91251fbSMichal Kazior 
2627b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src,
2628b91251fbSMichal Kazior 				      struct ath10k_fw_stats_pdev *dst)
2629b91251fbSMichal Kazior {
2630b91251fbSMichal Kazior 	dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad);
2631b91251fbSMichal Kazior 	dst->rts_bad = __le32_to_cpu(src->rts_bad);
2632b91251fbSMichal Kazior 	dst->rts_good = __le32_to_cpu(src->rts_good);
2633b91251fbSMichal Kazior 	dst->fcs_bad = __le32_to_cpu(src->fcs_bad);
2634b91251fbSMichal Kazior 	dst->no_beacons = __le32_to_cpu(src->no_beacons);
2635b91251fbSMichal Kazior 	dst->mib_int_count = __le32_to_cpu(src->mib_int_count);
2636d15fb520SMichal Kazior }
2637d15fb520SMichal Kazior 
26380226d602SMichal Kazior void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src,
263960ef401aSMichal Kazior 				struct ath10k_fw_stats_peer *dst)
2640d15fb520SMichal Kazior {
2641d15fb520SMichal Kazior 	ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2642d15fb520SMichal Kazior 	dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2643d15fb520SMichal Kazior 	dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2644d15fb520SMichal Kazior }
2645d15fb520SMichal Kazior 
2646f9575793SMohammed Shafi Shajakhan static void
2647f9575793SMohammed Shafi Shajakhan ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats *src,
2648f9575793SMohammed Shafi Shajakhan 				struct ath10k_fw_stats_peer *dst)
2649f9575793SMohammed Shafi Shajakhan {
2650f9575793SMohammed Shafi Shajakhan 	ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2651f9575793SMohammed Shafi Shajakhan 	dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2652f9575793SMohammed Shafi Shajakhan 	dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2653f9575793SMohammed Shafi Shajakhan 	dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2654f9575793SMohammed Shafi Shajakhan }
2655f9575793SMohammed Shafi Shajakhan 
2656d7579d12SMichal Kazior static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar,
2657d15fb520SMichal Kazior 					    struct sk_buff *skb,
265860ef401aSMichal Kazior 					    struct ath10k_fw_stats *stats)
2659d15fb520SMichal Kazior {
2660d15fb520SMichal Kazior 	const struct wmi_stats_event *ev = (void *)skb->data;
2661d15fb520SMichal Kazior 	u32 num_pdev_stats, num_vdev_stats, num_peer_stats;
2662d15fb520SMichal Kazior 	int i;
2663d15fb520SMichal Kazior 
2664d15fb520SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
2665d15fb520SMichal Kazior 		return -EPROTO;
2666d15fb520SMichal Kazior 
2667d15fb520SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2668d15fb520SMichal Kazior 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2669d15fb520SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2670d15fb520SMichal Kazior 
26715326849aSMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
2672d15fb520SMichal Kazior 		const struct wmi_pdev_stats *src;
26735326849aSMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
2674d15fb520SMichal Kazior 
2675d15fb520SMichal Kazior 		src = (void *)skb->data;
2676d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
2677d15fb520SMichal Kazior 			return -EPROTO;
2678d15fb520SMichal Kazior 
26795326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
26805326849aSMichal Kazior 		if (!dst)
26815326849aSMichal Kazior 			continue;
26825326849aSMichal Kazior 
2683b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2684b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2685b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2686b91251fbSMichal Kazior 
26875326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
2688d15fb520SMichal Kazior 	}
2689d15fb520SMichal Kazior 
2690d15fb520SMichal Kazior 	/* fw doesn't implement vdev stats */
2691d15fb520SMichal Kazior 
2692d15fb520SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
2693d15fb520SMichal Kazior 		const struct wmi_peer_stats *src;
26945326849aSMichal Kazior 		struct ath10k_fw_stats_peer *dst;
2695d15fb520SMichal Kazior 
2696d15fb520SMichal Kazior 		src = (void *)skb->data;
2697d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
2698d15fb520SMichal Kazior 			return -EPROTO;
2699d15fb520SMichal Kazior 
27005326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
27015326849aSMichal Kazior 		if (!dst)
27025326849aSMichal Kazior 			continue;
27035326849aSMichal Kazior 
27045326849aSMichal Kazior 		ath10k_wmi_pull_peer_stats(src, dst);
27055326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
2706d15fb520SMichal Kazior 	}
2707d15fb520SMichal Kazior 
2708d15fb520SMichal Kazior 	return 0;
2709d15fb520SMichal Kazior }
2710d15fb520SMichal Kazior 
2711d7579d12SMichal Kazior static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar,
2712d15fb520SMichal Kazior 					   struct sk_buff *skb,
271360ef401aSMichal Kazior 					   struct ath10k_fw_stats *stats)
2714d15fb520SMichal Kazior {
2715d15fb520SMichal Kazior 	const struct wmi_stats_event *ev = (void *)skb->data;
2716d15fb520SMichal Kazior 	u32 num_pdev_stats, num_vdev_stats, num_peer_stats;
2717d15fb520SMichal Kazior 	int i;
2718d15fb520SMichal Kazior 
2719d15fb520SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
2720d15fb520SMichal Kazior 		return -EPROTO;
2721d15fb520SMichal Kazior 
2722d15fb520SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2723d15fb520SMichal Kazior 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2724d15fb520SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2725d15fb520SMichal Kazior 
27265326849aSMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
2727d15fb520SMichal Kazior 		const struct wmi_10x_pdev_stats *src;
27285326849aSMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
2729d15fb520SMichal Kazior 
2730d15fb520SMichal Kazior 		src = (void *)skb->data;
2731d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
2732d15fb520SMichal Kazior 			return -EPROTO;
2733d15fb520SMichal Kazior 
27345326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
27355326849aSMichal Kazior 		if (!dst)
27365326849aSMichal Kazior 			continue;
2737d15fb520SMichal Kazior 
2738b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2739b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2740b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2741b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
27425326849aSMichal Kazior 
27435326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
2744d15fb520SMichal Kazior 	}
2745d15fb520SMichal Kazior 
2746d15fb520SMichal Kazior 	/* fw doesn't implement vdev stats */
2747d15fb520SMichal Kazior 
2748d15fb520SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
2749d15fb520SMichal Kazior 		const struct wmi_10x_peer_stats *src;
27505326849aSMichal Kazior 		struct ath10k_fw_stats_peer *dst;
2751d15fb520SMichal Kazior 
2752d15fb520SMichal Kazior 		src = (void *)skb->data;
2753d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
2754d15fb520SMichal Kazior 			return -EPROTO;
2755d15fb520SMichal Kazior 
27565326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
27575326849aSMichal Kazior 		if (!dst)
27585326849aSMichal Kazior 			continue;
2759d15fb520SMichal Kazior 
27605326849aSMichal Kazior 		ath10k_wmi_pull_peer_stats(&src->old, dst);
27615326849aSMichal Kazior 
27625326849aSMichal Kazior 		dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
27635326849aSMichal Kazior 
27645326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
2765d15fb520SMichal Kazior 	}
2766d15fb520SMichal Kazior 
2767d15fb520SMichal Kazior 	return 0;
2768d15fb520SMichal Kazior }
2769d15fb520SMichal Kazior 
277020de2229SMichal Kazior static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar,
277120de2229SMichal Kazior 					    struct sk_buff *skb,
277220de2229SMichal Kazior 					    struct ath10k_fw_stats *stats)
277320de2229SMichal Kazior {
277420de2229SMichal Kazior 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
277520de2229SMichal Kazior 	u32 num_pdev_stats;
277620de2229SMichal Kazior 	u32 num_pdev_ext_stats;
277720de2229SMichal Kazior 	u32 num_vdev_stats;
277820de2229SMichal Kazior 	u32 num_peer_stats;
277920de2229SMichal Kazior 	int i;
278020de2229SMichal Kazior 
278120de2229SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
278220de2229SMichal Kazior 		return -EPROTO;
278320de2229SMichal Kazior 
278420de2229SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
278520de2229SMichal Kazior 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
278620de2229SMichal Kazior 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
278720de2229SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
278820de2229SMichal Kazior 
278920de2229SMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
279020de2229SMichal Kazior 		const struct wmi_10_2_pdev_stats *src;
279120de2229SMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
279220de2229SMichal Kazior 
279320de2229SMichal Kazior 		src = (void *)skb->data;
279420de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
279520de2229SMichal Kazior 			return -EPROTO;
279620de2229SMichal Kazior 
279720de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
279820de2229SMichal Kazior 		if (!dst)
279920de2229SMichal Kazior 			continue;
280020de2229SMichal Kazior 
280120de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
280220de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
280320de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
280420de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
280520de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
280620de2229SMichal Kazior 
280720de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
280820de2229SMichal Kazior 	}
280920de2229SMichal Kazior 
281020de2229SMichal Kazior 	for (i = 0; i < num_pdev_ext_stats; i++) {
281120de2229SMichal Kazior 		const struct wmi_10_2_pdev_ext_stats *src;
281220de2229SMichal Kazior 
281320de2229SMichal Kazior 		src = (void *)skb->data;
281420de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
281520de2229SMichal Kazior 			return -EPROTO;
281620de2229SMichal Kazior 
281720de2229SMichal Kazior 		/* FIXME: expose values to userspace
281820de2229SMichal Kazior 		 *
281920de2229SMichal Kazior 		 * Note: Even though this loop seems to do nothing it is
282020de2229SMichal Kazior 		 * required to parse following sub-structures properly.
282120de2229SMichal Kazior 		 */
282220de2229SMichal Kazior 	}
282320de2229SMichal Kazior 
282420de2229SMichal Kazior 	/* fw doesn't implement vdev stats */
282520de2229SMichal Kazior 
282620de2229SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
282720de2229SMichal Kazior 		const struct wmi_10_2_peer_stats *src;
282820de2229SMichal Kazior 		struct ath10k_fw_stats_peer *dst;
282920de2229SMichal Kazior 
283020de2229SMichal Kazior 		src = (void *)skb->data;
283120de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
283220de2229SMichal Kazior 			return -EPROTO;
283320de2229SMichal Kazior 
283420de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
283520de2229SMichal Kazior 		if (!dst)
283620de2229SMichal Kazior 			continue;
283720de2229SMichal Kazior 
283820de2229SMichal Kazior 		ath10k_wmi_pull_peer_stats(&src->old, dst);
283920de2229SMichal Kazior 
284020de2229SMichal Kazior 		dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
284120de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
284220de2229SMichal Kazior 
284320de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
284420de2229SMichal Kazior 	}
284520de2229SMichal Kazior 
284620de2229SMichal Kazior 	return 0;
284720de2229SMichal Kazior }
284820de2229SMichal Kazior 
284920de2229SMichal Kazior static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar,
285020de2229SMichal Kazior 					      struct sk_buff *skb,
285120de2229SMichal Kazior 					      struct ath10k_fw_stats *stats)
285220de2229SMichal Kazior {
285320de2229SMichal Kazior 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
285420de2229SMichal Kazior 	u32 num_pdev_stats;
285520de2229SMichal Kazior 	u32 num_pdev_ext_stats;
285620de2229SMichal Kazior 	u32 num_vdev_stats;
285720de2229SMichal Kazior 	u32 num_peer_stats;
285820de2229SMichal Kazior 	int i;
285920de2229SMichal Kazior 
286020de2229SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
286120de2229SMichal Kazior 		return -EPROTO;
286220de2229SMichal Kazior 
286320de2229SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
286420de2229SMichal Kazior 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
286520de2229SMichal Kazior 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
286620de2229SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
286720de2229SMichal Kazior 
286820de2229SMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
286920de2229SMichal Kazior 		const struct wmi_10_2_pdev_stats *src;
287020de2229SMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
287120de2229SMichal Kazior 
287220de2229SMichal Kazior 		src = (void *)skb->data;
287320de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
287420de2229SMichal Kazior 			return -EPROTO;
287520de2229SMichal Kazior 
287620de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
287720de2229SMichal Kazior 		if (!dst)
287820de2229SMichal Kazior 			continue;
287920de2229SMichal Kazior 
288020de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
288120de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
288220de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
288320de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
288420de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
288520de2229SMichal Kazior 
288620de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
288720de2229SMichal Kazior 	}
288820de2229SMichal Kazior 
288920de2229SMichal Kazior 	for (i = 0; i < num_pdev_ext_stats; i++) {
289020de2229SMichal Kazior 		const struct wmi_10_2_pdev_ext_stats *src;
289120de2229SMichal Kazior 
289220de2229SMichal Kazior 		src = (void *)skb->data;
289320de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
289420de2229SMichal Kazior 			return -EPROTO;
289520de2229SMichal Kazior 
289620de2229SMichal Kazior 		/* FIXME: expose values to userspace
289720de2229SMichal Kazior 		 *
289820de2229SMichal Kazior 		 * Note: Even though this loop seems to do nothing it is
289920de2229SMichal Kazior 		 * required to parse following sub-structures properly.
290020de2229SMichal Kazior 		 */
290120de2229SMichal Kazior 	}
290220de2229SMichal Kazior 
290320de2229SMichal Kazior 	/* fw doesn't implement vdev stats */
290420de2229SMichal Kazior 
290520de2229SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
2906de46c015SMohammed Shafi Shajakhan 		const struct wmi_10_2_4_ext_peer_stats *src;
290720de2229SMichal Kazior 		struct ath10k_fw_stats_peer *dst;
2908de46c015SMohammed Shafi Shajakhan 		int stats_len;
2909de46c015SMohammed Shafi Shajakhan 
2910cc61a1bbSMohammed Shafi Shajakhan 		if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
2911de46c015SMohammed Shafi Shajakhan 			stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats);
2912de46c015SMohammed Shafi Shajakhan 		else
2913de46c015SMohammed Shafi Shajakhan 			stats_len = sizeof(struct wmi_10_2_4_peer_stats);
291420de2229SMichal Kazior 
291520de2229SMichal Kazior 		src = (void *)skb->data;
2916de46c015SMohammed Shafi Shajakhan 		if (!skb_pull(skb, stats_len))
291720de2229SMichal Kazior 			return -EPROTO;
291820de2229SMichal Kazior 
291920de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
292020de2229SMichal Kazior 		if (!dst)
292120de2229SMichal Kazior 			continue;
292220de2229SMichal Kazior 
292320de2229SMichal Kazior 		ath10k_wmi_pull_peer_stats(&src->common.old, dst);
292420de2229SMichal Kazior 
292520de2229SMichal Kazior 		dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate);
2926de46c015SMohammed Shafi Shajakhan 
2927cc61a1bbSMohammed Shafi Shajakhan 		if (ath10k_peer_stats_enabled(ar))
2928de46c015SMohammed Shafi Shajakhan 			dst->rx_duration = __le32_to_cpu(src->rx_duration);
292920de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
293020de2229SMichal Kazior 
293120de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
293220de2229SMichal Kazior 	}
293320de2229SMichal Kazior 
293420de2229SMichal Kazior 	return 0;
293520de2229SMichal Kazior }
293620de2229SMichal Kazior 
293798dd2b92SManikanta Pubbisetty static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
293898dd2b92SManikanta Pubbisetty 					    struct sk_buff *skb,
293998dd2b92SManikanta Pubbisetty 					    struct ath10k_fw_stats *stats)
294098dd2b92SManikanta Pubbisetty {
294198dd2b92SManikanta Pubbisetty 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
294298dd2b92SManikanta Pubbisetty 	u32 num_pdev_stats;
294398dd2b92SManikanta Pubbisetty 	u32 num_pdev_ext_stats;
294498dd2b92SManikanta Pubbisetty 	u32 num_vdev_stats;
294598dd2b92SManikanta Pubbisetty 	u32 num_peer_stats;
29464a49ae94SMohammed Shafi Shajakhan 	u32 num_bcnflt_stats;
2947f9575793SMohammed Shafi Shajakhan 	u32 stats_id;
294898dd2b92SManikanta Pubbisetty 	int i;
294998dd2b92SManikanta Pubbisetty 
295098dd2b92SManikanta Pubbisetty 	if (!skb_pull(skb, sizeof(*ev)))
295198dd2b92SManikanta Pubbisetty 		return -EPROTO;
295298dd2b92SManikanta Pubbisetty 
295398dd2b92SManikanta Pubbisetty 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
295498dd2b92SManikanta Pubbisetty 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
295598dd2b92SManikanta Pubbisetty 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
295698dd2b92SManikanta Pubbisetty 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
29574a49ae94SMohammed Shafi Shajakhan 	num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats);
2958f9575793SMohammed Shafi Shajakhan 	stats_id = __le32_to_cpu(ev->stats_id);
295998dd2b92SManikanta Pubbisetty 
296098dd2b92SManikanta Pubbisetty 	for (i = 0; i < num_pdev_stats; i++) {
296198dd2b92SManikanta Pubbisetty 		const struct wmi_10_4_pdev_stats *src;
296298dd2b92SManikanta Pubbisetty 		struct ath10k_fw_stats_pdev *dst;
296398dd2b92SManikanta Pubbisetty 
296498dd2b92SManikanta Pubbisetty 		src = (void *)skb->data;
296598dd2b92SManikanta Pubbisetty 		if (!skb_pull(skb, sizeof(*src)))
296698dd2b92SManikanta Pubbisetty 			return -EPROTO;
296798dd2b92SManikanta Pubbisetty 
296898dd2b92SManikanta Pubbisetty 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
296998dd2b92SManikanta Pubbisetty 		if (!dst)
297098dd2b92SManikanta Pubbisetty 			continue;
297198dd2b92SManikanta Pubbisetty 
297298dd2b92SManikanta Pubbisetty 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
297398dd2b92SManikanta Pubbisetty 		ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst);
297498dd2b92SManikanta Pubbisetty 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
297598dd2b92SManikanta Pubbisetty 		dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs);
297698dd2b92SManikanta Pubbisetty 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
297798dd2b92SManikanta Pubbisetty 
297898dd2b92SManikanta Pubbisetty 		list_add_tail(&dst->list, &stats->pdevs);
297998dd2b92SManikanta Pubbisetty 	}
298098dd2b92SManikanta Pubbisetty 
298198dd2b92SManikanta Pubbisetty 	for (i = 0; i < num_pdev_ext_stats; i++) {
298298dd2b92SManikanta Pubbisetty 		const struct wmi_10_2_pdev_ext_stats *src;
298398dd2b92SManikanta Pubbisetty 
298498dd2b92SManikanta Pubbisetty 		src = (void *)skb->data;
298598dd2b92SManikanta Pubbisetty 		if (!skb_pull(skb, sizeof(*src)))
298698dd2b92SManikanta Pubbisetty 			return -EPROTO;
298798dd2b92SManikanta Pubbisetty 
298898dd2b92SManikanta Pubbisetty 		/* FIXME: expose values to userspace
298998dd2b92SManikanta Pubbisetty 		 *
299098dd2b92SManikanta Pubbisetty 		 * Note: Even though this loop seems to do nothing it is
299198dd2b92SManikanta Pubbisetty 		 * required to parse following sub-structures properly.
299298dd2b92SManikanta Pubbisetty 		 */
299398dd2b92SManikanta Pubbisetty 	}
299498dd2b92SManikanta Pubbisetty 
299598dd2b92SManikanta Pubbisetty 	/* fw doesn't implement vdev stats */
299698dd2b92SManikanta Pubbisetty 
299798dd2b92SManikanta Pubbisetty 	for (i = 0; i < num_peer_stats; i++) {
29984a49ae94SMohammed Shafi Shajakhan 		const struct wmi_10_4_peer_stats *src;
299998dd2b92SManikanta Pubbisetty 		struct ath10k_fw_stats_peer *dst;
300098dd2b92SManikanta Pubbisetty 
300198dd2b92SManikanta Pubbisetty 		src = (void *)skb->data;
30024a49ae94SMohammed Shafi Shajakhan 		if (!skb_pull(skb, sizeof(*src)))
300398dd2b92SManikanta Pubbisetty 			return -EPROTO;
300498dd2b92SManikanta Pubbisetty 
300598dd2b92SManikanta Pubbisetty 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
300698dd2b92SManikanta Pubbisetty 		if (!dst)
300798dd2b92SManikanta Pubbisetty 			continue;
300898dd2b92SManikanta Pubbisetty 
30094a49ae94SMohammed Shafi Shajakhan 		ath10k_wmi_10_4_pull_peer_stats(src, dst);
301098dd2b92SManikanta Pubbisetty 		list_add_tail(&dst->list, &stats->peers);
301198dd2b92SManikanta Pubbisetty 	}
301298dd2b92SManikanta Pubbisetty 
30134a49ae94SMohammed Shafi Shajakhan 	for (i = 0; i < num_bcnflt_stats; i++) {
30144a49ae94SMohammed Shafi Shajakhan 		const struct wmi_10_4_bss_bcn_filter_stats *src;
30154a49ae94SMohammed Shafi Shajakhan 
30164a49ae94SMohammed Shafi Shajakhan 		src = (void *)skb->data;
30174a49ae94SMohammed Shafi Shajakhan 		if (!skb_pull(skb, sizeof(*src)))
30184a49ae94SMohammed Shafi Shajakhan 			return -EPROTO;
30194a49ae94SMohammed Shafi Shajakhan 
30204a49ae94SMohammed Shafi Shajakhan 		/* FIXME: expose values to userspace
30214a49ae94SMohammed Shafi Shajakhan 		 *
30224a49ae94SMohammed Shafi Shajakhan 		 * Note: Even though this loop seems to do nothing it is
30234a49ae94SMohammed Shafi Shajakhan 		 * required to parse following sub-structures properly.
30244a49ae94SMohammed Shafi Shajakhan 		 */
30254a49ae94SMohammed Shafi Shajakhan 	}
30264a49ae94SMohammed Shafi Shajakhan 
30274a49ae94SMohammed Shafi Shajakhan 	if ((stats_id & WMI_10_4_STAT_PEER_EXTD) == 0)
30284a49ae94SMohammed Shafi Shajakhan 		return 0;
30294a49ae94SMohammed Shafi Shajakhan 
30304a49ae94SMohammed Shafi Shajakhan 	stats->extended = true;
30314a49ae94SMohammed Shafi Shajakhan 
30324a49ae94SMohammed Shafi Shajakhan 	for (i = 0; i < num_peer_stats; i++) {
30334a49ae94SMohammed Shafi Shajakhan 		const struct wmi_10_4_peer_extd_stats *src;
30344a49ae94SMohammed Shafi Shajakhan 		struct ath10k_fw_extd_stats_peer *dst;
30354a49ae94SMohammed Shafi Shajakhan 
30364a49ae94SMohammed Shafi Shajakhan 		src = (void *)skb->data;
30374a49ae94SMohammed Shafi Shajakhan 		if (!skb_pull(skb, sizeof(*src)))
30384a49ae94SMohammed Shafi Shajakhan 			return -EPROTO;
30394a49ae94SMohammed Shafi Shajakhan 
30404a49ae94SMohammed Shafi Shajakhan 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
30414a49ae94SMohammed Shafi Shajakhan 		if (!dst)
30424a49ae94SMohammed Shafi Shajakhan 			continue;
30434a49ae94SMohammed Shafi Shajakhan 
30444a49ae94SMohammed Shafi Shajakhan 		ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
30454a49ae94SMohammed Shafi Shajakhan 		dst->rx_duration = __le32_to_cpu(src->rx_duration);
30464a49ae94SMohammed Shafi Shajakhan 		list_add_tail(&dst->list, &stats->peers_extd);
30474a49ae94SMohammed Shafi Shajakhan 	}
30484a49ae94SMohammed Shafi Shajakhan 
304998dd2b92SManikanta Pubbisetty 	return 0;
305098dd2b92SManikanta Pubbisetty }
305198dd2b92SManikanta Pubbisetty 
30520226d602SMichal Kazior void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb)
30535e3dd157SKalle Valo {
30547aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
305560ef401aSMichal Kazior 	ath10k_debug_fw_stats_process(ar, skb);
30565e3dd157SKalle Valo }
30575e3dd157SKalle Valo 
3058d7579d12SMichal Kazior static int
3059d7579d12SMichal Kazior ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb,
306032653cf1SMichal Kazior 				 struct wmi_vdev_start_ev_arg *arg)
306132653cf1SMichal Kazior {
306232653cf1SMichal Kazior 	struct wmi_vdev_start_response_event *ev = (void *)skb->data;
306332653cf1SMichal Kazior 
306432653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
306532653cf1SMichal Kazior 		return -EPROTO;
306632653cf1SMichal Kazior 
306732653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
306832653cf1SMichal Kazior 	arg->vdev_id = ev->vdev_id;
306932653cf1SMichal Kazior 	arg->req_id = ev->req_id;
307032653cf1SMichal Kazior 	arg->resp_type = ev->resp_type;
307132653cf1SMichal Kazior 	arg->status = ev->status;
307232653cf1SMichal Kazior 
307332653cf1SMichal Kazior 	return 0;
307432653cf1SMichal Kazior }
307532653cf1SMichal Kazior 
30760226d602SMichal Kazior void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb)
30775e3dd157SKalle Valo {
307832653cf1SMichal Kazior 	struct wmi_vdev_start_ev_arg arg = {};
307932653cf1SMichal Kazior 	int ret;
30805e3dd157SKalle Valo 
30817aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
30825e3dd157SKalle Valo 
3083d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg);
308432653cf1SMichal Kazior 	if (ret) {
308532653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret);
308632653cf1SMichal Kazior 		return;
308732653cf1SMichal Kazior 	}
30885e3dd157SKalle Valo 
308932653cf1SMichal Kazior 	if (WARN_ON(__le32_to_cpu(arg.status)))
30905e3dd157SKalle Valo 		return;
30915e3dd157SKalle Valo 
30925e3dd157SKalle Valo 	complete(&ar->vdev_setup_done);
30935e3dd157SKalle Valo }
30945e3dd157SKalle Valo 
30950226d602SMichal Kazior void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb)
30965e3dd157SKalle Valo {
30977aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
30985e3dd157SKalle Valo 	complete(&ar->vdev_setup_done);
30995e3dd157SKalle Valo }
31005e3dd157SKalle Valo 
3101d7579d12SMichal Kazior static int
3102d7579d12SMichal Kazior ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb,
310332653cf1SMichal Kazior 				struct wmi_peer_kick_ev_arg *arg)
310432653cf1SMichal Kazior {
310532653cf1SMichal Kazior 	struct wmi_peer_sta_kickout_event *ev = (void *)skb->data;
310632653cf1SMichal Kazior 
310732653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
310832653cf1SMichal Kazior 		return -EPROTO;
310932653cf1SMichal Kazior 
311032653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
311132653cf1SMichal Kazior 	arg->mac_addr = ev->peer_macaddr.addr;
311232653cf1SMichal Kazior 
311332653cf1SMichal Kazior 	return 0;
311432653cf1SMichal Kazior }
311532653cf1SMichal Kazior 
31160226d602SMichal Kazior void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb)
31175e3dd157SKalle Valo {
311832653cf1SMichal Kazior 	struct wmi_peer_kick_ev_arg arg = {};
31195a13e76eSKalle Valo 	struct ieee80211_sta *sta;
312032653cf1SMichal Kazior 	int ret;
31215a13e76eSKalle Valo 
3122d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
312332653cf1SMichal Kazior 	if (ret) {
312432653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse peer kickout event: %d\n",
312532653cf1SMichal Kazior 			    ret);
312632653cf1SMichal Kazior 		return;
312732653cf1SMichal Kazior 	}
31285a13e76eSKalle Valo 
31297aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n",
313032653cf1SMichal Kazior 		   arg.mac_addr);
31315a13e76eSKalle Valo 
31325a13e76eSKalle Valo 	rcu_read_lock();
31335a13e76eSKalle Valo 
313432653cf1SMichal Kazior 	sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
31355a13e76eSKalle Valo 	if (!sta) {
31367aa7a72aSMichal Kazior 		ath10k_warn(ar, "Spurious quick kickout for STA %pM\n",
313732653cf1SMichal Kazior 			    arg.mac_addr);
31385a13e76eSKalle Valo 		goto exit;
31395a13e76eSKalle Valo 	}
31405a13e76eSKalle Valo 
31415a13e76eSKalle Valo 	ieee80211_report_low_ack(sta, 10);
31425a13e76eSKalle Valo 
31435a13e76eSKalle Valo exit:
31445a13e76eSKalle Valo 	rcu_read_unlock();
31455e3dd157SKalle Valo }
31465e3dd157SKalle Valo 
31475e3dd157SKalle Valo /*
31485e3dd157SKalle Valo  * FIXME
31495e3dd157SKalle Valo  *
31505e3dd157SKalle Valo  * We don't report to mac80211 sleep state of connected
31515e3dd157SKalle Valo  * stations. Due to this mac80211 can't fill in TIM IE
31525e3dd157SKalle Valo  * correctly.
31535e3dd157SKalle Valo  *
31545e3dd157SKalle Valo  * I know of no way of getting nullfunc frames that contain
31555e3dd157SKalle Valo  * sleep transition from connected stations - these do not
31565e3dd157SKalle Valo  * seem to be sent from the target to the host. There also
31575e3dd157SKalle Valo  * doesn't seem to be a dedicated event for that. So the
31585e3dd157SKalle Valo  * only way left to do this would be to read tim_bitmap
31595e3dd157SKalle Valo  * during SWBA.
31605e3dd157SKalle Valo  *
31615e3dd157SKalle Valo  * We could probably try using tim_bitmap from SWBA to tell
31625e3dd157SKalle Valo  * mac80211 which stations are asleep and which are not. The
31635e3dd157SKalle Valo  * problem here is calling mac80211 functions so many times
31645e3dd157SKalle Valo  * could take too long and make us miss the time to submit
31655e3dd157SKalle Valo  * the beacon to the target.
31665e3dd157SKalle Valo  *
31675e3dd157SKalle Valo  * So as a workaround we try to extend the TIM IE if there
31685e3dd157SKalle Valo  * is unicast buffered for stations with aid > 7 and fill it
31695e3dd157SKalle Valo  * in ourselves.
31705e3dd157SKalle Valo  */
31715e3dd157SKalle Valo static void ath10k_wmi_update_tim(struct ath10k *ar,
31725e3dd157SKalle Valo 				  struct ath10k_vif *arvif,
31735e3dd157SKalle Valo 				  struct sk_buff *bcn,
3174a03fee34SRaja Mani 				  const struct wmi_tim_info_arg *tim_info)
31755e3dd157SKalle Valo {
31765e3dd157SKalle Valo 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data;
31775e3dd157SKalle Valo 	struct ieee80211_tim_ie *tim;
31785e3dd157SKalle Valo 	u8 *ies, *ie;
31795e3dd157SKalle Valo 	u8 ie_len, pvm_len;
3180af762c0bSKalle Valo 	__le32 t;
3181a03fee34SRaja Mani 	u32 v, tim_len;
3182a03fee34SRaja Mani 
3183a03fee34SRaja Mani 	/* When FW reports 0 in tim_len, ensure atleast first byte
3184a03fee34SRaja Mani 	 * in tim_bitmap is considered for pvm calculation.
3185a03fee34SRaja Mani 	 */
3186a03fee34SRaja Mani 	tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1;
31875e3dd157SKalle Valo 
31885e3dd157SKalle Valo 	/* if next SWBA has no tim_changed the tim_bitmap is garbage.
31895e3dd157SKalle Valo 	 * we must copy the bitmap upon change and reuse it later */
319032653cf1SMichal Kazior 	if (__le32_to_cpu(tim_info->tim_changed)) {
31915e3dd157SKalle Valo 		int i;
31925e3dd157SKalle Valo 
3193a03fee34SRaja Mani 		if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) {
3194a03fee34SRaja Mani 			ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu",
3195a03fee34SRaja Mani 				    tim_len, sizeof(arvif->u.ap.tim_bitmap));
3196a03fee34SRaja Mani 			tim_len = sizeof(arvif->u.ap.tim_bitmap);
3197a03fee34SRaja Mani 		}
31985e3dd157SKalle Valo 
3199a03fee34SRaja Mani 		for (i = 0; i < tim_len; i++) {
320032653cf1SMichal Kazior 			t = tim_info->tim_bitmap[i / 4];
3201af762c0bSKalle Valo 			v = __le32_to_cpu(t);
32025e3dd157SKalle Valo 			arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
32035e3dd157SKalle Valo 		}
32045e3dd157SKalle Valo 
3205a03fee34SRaja Mani 		/* FW reports either length 0 or length based on max supported
3206a03fee34SRaja Mani 		 * station. so we calculate this on our own
3207a03fee34SRaja Mani 		 */
32085e3dd157SKalle Valo 		arvif->u.ap.tim_len = 0;
3209a03fee34SRaja Mani 		for (i = 0; i < tim_len; i++)
32105e3dd157SKalle Valo 			if (arvif->u.ap.tim_bitmap[i])
32115e3dd157SKalle Valo 				arvif->u.ap.tim_len = i;
32125e3dd157SKalle Valo 
32135e3dd157SKalle Valo 		arvif->u.ap.tim_len++;
32145e3dd157SKalle Valo 	}
32155e3dd157SKalle Valo 
32165e3dd157SKalle Valo 	ies = bcn->data;
32175e3dd157SKalle Valo 	ies += ieee80211_hdrlen(hdr->frame_control);
32185e3dd157SKalle Valo 	ies += 12; /* fixed parameters */
32195e3dd157SKalle Valo 
32205e3dd157SKalle Valo 	ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies,
32215e3dd157SKalle Valo 				    (u8 *)skb_tail_pointer(bcn) - ies);
32225e3dd157SKalle Valo 	if (!ie) {
322309af8f85SMichal Kazior 		if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
32247aa7a72aSMichal Kazior 			ath10k_warn(ar, "no tim ie found;\n");
32255e3dd157SKalle Valo 		return;
32265e3dd157SKalle Valo 	}
32275e3dd157SKalle Valo 
32285e3dd157SKalle Valo 	tim = (void *)ie + 2;
32295e3dd157SKalle Valo 	ie_len = ie[1];
32305e3dd157SKalle Valo 	pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */
32315e3dd157SKalle Valo 
32325e3dd157SKalle Valo 	if (pvm_len < arvif->u.ap.tim_len) {
3233a03fee34SRaja Mani 		int expand_size = tim_len - pvm_len;
32345e3dd157SKalle Valo 		int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
32355e3dd157SKalle Valo 		void *next_ie = ie + 2 + ie_len;
32365e3dd157SKalle Valo 
32375e3dd157SKalle Valo 		if (skb_put(bcn, expand_size)) {
32385e3dd157SKalle Valo 			memmove(next_ie + expand_size, next_ie, move_size);
32395e3dd157SKalle Valo 
32405e3dd157SKalle Valo 			ie[1] += expand_size;
32415e3dd157SKalle Valo 			ie_len += expand_size;
32425e3dd157SKalle Valo 			pvm_len += expand_size;
32435e3dd157SKalle Valo 		} else {
32447aa7a72aSMichal Kazior 			ath10k_warn(ar, "tim expansion failed\n");
32455e3dd157SKalle Valo 		}
32465e3dd157SKalle Valo 	}
32475e3dd157SKalle Valo 
3248a03fee34SRaja Mani 	if (pvm_len > tim_len) {
32497aa7a72aSMichal Kazior 		ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len);
32505e3dd157SKalle Valo 		return;
32515e3dd157SKalle Valo 	}
32525e3dd157SKalle Valo 
325332653cf1SMichal Kazior 	tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast);
32545e3dd157SKalle Valo 	memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
32555e3dd157SKalle Valo 
3256748afc47SMichal Kazior 	if (tim->dtim_count == 0) {
325766b8a010SMichal Kazior 		ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO;
3258748afc47SMichal Kazior 
325932653cf1SMichal Kazior 		if (__le32_to_cpu(tim_info->tim_mcast) == 1)
326066b8a010SMichal Kazior 			ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB;
3261748afc47SMichal Kazior 	}
3262748afc47SMichal Kazior 
32637aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
32645e3dd157SKalle Valo 		   tim->dtim_count, tim->dtim_period,
32655e3dd157SKalle Valo 		   tim->bitmap_ctrl, pvm_len);
32665e3dd157SKalle Valo }
32675e3dd157SKalle Valo 
32685e3dd157SKalle Valo static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
32695e3dd157SKalle Valo 				  struct sk_buff *bcn,
327032653cf1SMichal Kazior 				  const struct wmi_p2p_noa_info *noa)
32715e3dd157SKalle Valo {
327208c27be1SPeter Oh 	if (!arvif->vif->p2p)
32735e3dd157SKalle Valo 		return;
32745e3dd157SKalle Valo 
32757aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
32765e3dd157SKalle Valo 
32776a94888fSMichal Kazior 	if (noa->changed & WMI_P2P_NOA_CHANGED_BIT)
32786a94888fSMichal Kazior 		ath10k_p2p_noa_update(arvif, noa);
32795e3dd157SKalle Valo 
32805e3dd157SKalle Valo 	if (arvif->u.ap.noa_data)
32815e3dd157SKalle Valo 		if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
32825e3dd157SKalle Valo 			memcpy(skb_put(bcn, arvif->u.ap.noa_len),
32835e3dd157SKalle Valo 			       arvif->u.ap.noa_data,
32845e3dd157SKalle Valo 			       arvif->u.ap.noa_len);
32855e3dd157SKalle Valo }
32865e3dd157SKalle Valo 
3287d7579d12SMichal Kazior static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
328832653cf1SMichal Kazior 				      struct wmi_swba_ev_arg *arg)
328932653cf1SMichal Kazior {
329032653cf1SMichal Kazior 	struct wmi_host_swba_event *ev = (void *)skb->data;
329132653cf1SMichal Kazior 	u32 map;
329232653cf1SMichal Kazior 	size_t i;
329332653cf1SMichal Kazior 
329432653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
329532653cf1SMichal Kazior 		return -EPROTO;
329632653cf1SMichal Kazior 
329732653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
329832653cf1SMichal Kazior 	arg->vdev_map = ev->vdev_map;
329932653cf1SMichal Kazior 
330032653cf1SMichal Kazior 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
330132653cf1SMichal Kazior 		if (!(map & BIT(0)))
330232653cf1SMichal Kazior 			continue;
330332653cf1SMichal Kazior 
330432653cf1SMichal Kazior 		/* If this happens there were some changes in firmware and
330532653cf1SMichal Kazior 		 * ath10k should update the max size of tim_info array.
330632653cf1SMichal Kazior 		 */
330732653cf1SMichal Kazior 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
330832653cf1SMichal Kazior 			break;
330932653cf1SMichal Kazior 
3310a03fee34SRaja Mani 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3311a03fee34SRaja Mani 		     sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3312a03fee34SRaja Mani 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3313a03fee34SRaja Mani 			return -EPROTO;
3314a03fee34SRaja Mani 		}
3315a03fee34SRaja Mani 
3316a03fee34SRaja Mani 		arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3317a03fee34SRaja Mani 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3318a03fee34SRaja Mani 		arg->tim_info[i].tim_bitmap =
3319a03fee34SRaja Mani 				ev->bcn_info[i].tim_info.tim_bitmap;
3320a03fee34SRaja Mani 		arg->tim_info[i].tim_changed =
3321a03fee34SRaja Mani 				ev->bcn_info[i].tim_info.tim_changed;
3322a03fee34SRaja Mani 		arg->tim_info[i].tim_num_ps_pending =
3323a03fee34SRaja Mani 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
3324a03fee34SRaja Mani 
332532653cf1SMichal Kazior 		arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info;
332632653cf1SMichal Kazior 		i++;
332732653cf1SMichal Kazior 	}
332832653cf1SMichal Kazior 
332932653cf1SMichal Kazior 	return 0;
333032653cf1SMichal Kazior }
333132653cf1SMichal Kazior 
33328b019fb0SYanbo Li static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar,
33338b019fb0SYanbo Li 					     struct sk_buff *skb,
33348b019fb0SYanbo Li 					     struct wmi_swba_ev_arg *arg)
33358b019fb0SYanbo Li {
33368b019fb0SYanbo Li 	struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data;
33378b019fb0SYanbo Li 	u32 map;
33388b019fb0SYanbo Li 	size_t i;
33398b019fb0SYanbo Li 
33408b019fb0SYanbo Li 	if (skb->len < sizeof(*ev))
33418b019fb0SYanbo Li 		return -EPROTO;
33428b019fb0SYanbo Li 
33438b019fb0SYanbo Li 	skb_pull(skb, sizeof(*ev));
33448b019fb0SYanbo Li 	arg->vdev_map = ev->vdev_map;
33458b019fb0SYanbo Li 
33468b019fb0SYanbo Li 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
33478b019fb0SYanbo Li 		if (!(map & BIT(0)))
33488b019fb0SYanbo Li 			continue;
33498b019fb0SYanbo Li 
33508b019fb0SYanbo Li 		/* If this happens there were some changes in firmware and
33518b019fb0SYanbo Li 		 * ath10k should update the max size of tim_info array.
33528b019fb0SYanbo Li 		 */
33538b019fb0SYanbo Li 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
33548b019fb0SYanbo Li 			break;
33558b019fb0SYanbo Li 
33568b019fb0SYanbo Li 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
33578b019fb0SYanbo Li 		     sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
33588b019fb0SYanbo Li 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
33598b019fb0SYanbo Li 			return -EPROTO;
33608b019fb0SYanbo Li 		}
33618b019fb0SYanbo Li 
33628b019fb0SYanbo Li 		arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
33638b019fb0SYanbo Li 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
33648b019fb0SYanbo Li 		arg->tim_info[i].tim_bitmap =
33658b019fb0SYanbo Li 				ev->bcn_info[i].tim_info.tim_bitmap;
33668b019fb0SYanbo Li 		arg->tim_info[i].tim_changed =
33678b019fb0SYanbo Li 				ev->bcn_info[i].tim_info.tim_changed;
33688b019fb0SYanbo Li 		arg->tim_info[i].tim_num_ps_pending =
33698b019fb0SYanbo Li 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
33708b019fb0SYanbo Li 		i++;
33718b019fb0SYanbo Li 	}
33728b019fb0SYanbo Li 
33738b019fb0SYanbo Li 	return 0;
33748b019fb0SYanbo Li }
33758b019fb0SYanbo Li 
33763cec3be3SRaja Mani static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
33773cec3be3SRaja Mani 					   struct sk_buff *skb,
33783cec3be3SRaja Mani 					   struct wmi_swba_ev_arg *arg)
33793cec3be3SRaja Mani {
33803cec3be3SRaja Mani 	struct wmi_10_4_host_swba_event *ev = (void *)skb->data;
33813cec3be3SRaja Mani 	u32 map, tim_len;
33823cec3be3SRaja Mani 	size_t i;
33833cec3be3SRaja Mani 
33843cec3be3SRaja Mani 	if (skb->len < sizeof(*ev))
33853cec3be3SRaja Mani 		return -EPROTO;
33863cec3be3SRaja Mani 
33873cec3be3SRaja Mani 	skb_pull(skb, sizeof(*ev));
33883cec3be3SRaja Mani 	arg->vdev_map = ev->vdev_map;
33893cec3be3SRaja Mani 
33903cec3be3SRaja Mani 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
33913cec3be3SRaja Mani 		if (!(map & BIT(0)))
33923cec3be3SRaja Mani 			continue;
33933cec3be3SRaja Mani 
33943cec3be3SRaja Mani 		/* If this happens there were some changes in firmware and
33953cec3be3SRaja Mani 		 * ath10k should update the max size of tim_info array.
33963cec3be3SRaja Mani 		 */
33973cec3be3SRaja Mani 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
33983cec3be3SRaja Mani 			break;
33993cec3be3SRaja Mani 
34003cec3be3SRaja Mani 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
34013cec3be3SRaja Mani 		      sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
34023cec3be3SRaja Mani 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
34033cec3be3SRaja Mani 			return -EPROTO;
34043cec3be3SRaja Mani 		}
34053cec3be3SRaja Mani 
34063cec3be3SRaja Mani 		tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len);
34073cec3be3SRaja Mani 		if (tim_len) {
34083cec3be3SRaja Mani 			/* Exclude 4 byte guard length */
34093cec3be3SRaja Mani 			tim_len -= 4;
34103cec3be3SRaja Mani 			arg->tim_info[i].tim_len = __cpu_to_le32(tim_len);
34113cec3be3SRaja Mani 		} else {
34123cec3be3SRaja Mani 			arg->tim_info[i].tim_len = 0;
34133cec3be3SRaja Mani 		}
34143cec3be3SRaja Mani 
34153cec3be3SRaja Mani 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
34163cec3be3SRaja Mani 		arg->tim_info[i].tim_bitmap =
34173cec3be3SRaja Mani 				ev->bcn_info[i].tim_info.tim_bitmap;
34183cec3be3SRaja Mani 		arg->tim_info[i].tim_changed =
34193cec3be3SRaja Mani 				ev->bcn_info[i].tim_info.tim_changed;
34203cec3be3SRaja Mani 		arg->tim_info[i].tim_num_ps_pending =
34213cec3be3SRaja Mani 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
34223cec3be3SRaja Mani 
34233cec3be3SRaja Mani 		/* 10.4 firmware doesn't have p2p support. notice of absence
34243cec3be3SRaja Mani 		 * info can be ignored for now.
34253cec3be3SRaja Mani 		 */
34263cec3be3SRaja Mani 
34273cec3be3SRaja Mani 		i++;
34283cec3be3SRaja Mani 	}
34293cec3be3SRaja Mani 
34303cec3be3SRaja Mani 	return 0;
34313cec3be3SRaja Mani }
34323cec3be3SRaja Mani 
343308e75ea8SVivek Natarajan static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar)
343408e75ea8SVivek Natarajan {
343508e75ea8SVivek Natarajan 	return WMI_TXBF_CONF_BEFORE_ASSOC;
343608e75ea8SVivek Natarajan }
343708e75ea8SVivek Natarajan 
34380226d602SMichal Kazior void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
34395e3dd157SKalle Valo {
344032653cf1SMichal Kazior 	struct wmi_swba_ev_arg arg = {};
34415e3dd157SKalle Valo 	u32 map;
34425e3dd157SKalle Valo 	int i = -1;
3443a03fee34SRaja Mani 	const struct wmi_tim_info_arg *tim_info;
344432653cf1SMichal Kazior 	const struct wmi_p2p_noa_info *noa_info;
34455e3dd157SKalle Valo 	struct ath10k_vif *arvif;
34465e3dd157SKalle Valo 	struct sk_buff *bcn;
344764badcb6SMichal Kazior 	dma_addr_t paddr;
3448767d34fcSMichal Kazior 	int ret, vdev_id = 0;
34495e3dd157SKalle Valo 
3450d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_swba(ar, skb, &arg);
345132653cf1SMichal Kazior 	if (ret) {
345232653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse swba event: %d\n", ret);
345332653cf1SMichal Kazior 		return;
345432653cf1SMichal Kazior 	}
345532653cf1SMichal Kazior 
345632653cf1SMichal Kazior 	map = __le32_to_cpu(arg.vdev_map);
34575e3dd157SKalle Valo 
34587aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
345932653cf1SMichal Kazior 		   map);
34605e3dd157SKalle Valo 
34615e3dd157SKalle Valo 	for (; map; map >>= 1, vdev_id++) {
34625e3dd157SKalle Valo 		if (!(map & 0x1))
34635e3dd157SKalle Valo 			continue;
34645e3dd157SKalle Valo 
34655e3dd157SKalle Valo 		i++;
34665e3dd157SKalle Valo 
34675e3dd157SKalle Valo 		if (i >= WMI_MAX_AP_VDEV) {
34687aa7a72aSMichal Kazior 			ath10k_warn(ar, "swba has corrupted vdev map\n");
34695e3dd157SKalle Valo 			break;
34705e3dd157SKalle Valo 		}
34715e3dd157SKalle Valo 
3472a03fee34SRaja Mani 		tim_info = &arg.tim_info[i];
347332653cf1SMichal Kazior 		noa_info = arg.noa_info[i];
34745e3dd157SKalle Valo 
34757aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_MGMT,
34767a8a396bSKalle Valo 			   "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n",
34775e3dd157SKalle Valo 			   i,
347832653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_len),
347932653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_mcast),
348032653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_changed),
348132653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_num_ps_pending),
348232653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[3]),
348332653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[2]),
348432653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[1]),
348532653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[0]));
34865e3dd157SKalle Valo 
3487a03fee34SRaja Mani 		/* TODO: Only first 4 word from tim_bitmap is dumped.
3488a03fee34SRaja Mani 		 * Extend debug code to dump full tim_bitmap.
3489a03fee34SRaja Mani 		 */
3490a03fee34SRaja Mani 
34915e3dd157SKalle Valo 		arvif = ath10k_get_arvif(ar, vdev_id);
34925e3dd157SKalle Valo 		if (arvif == NULL) {
34937aa7a72aSMichal Kazior 			ath10k_warn(ar, "no vif for vdev_id %d found\n",
34947aa7a72aSMichal Kazior 				    vdev_id);
34955e3dd157SKalle Valo 			continue;
34965e3dd157SKalle Valo 		}
34975e3dd157SKalle Valo 
3498c2df44b3SMichal Kazior 		/* There are no completions for beacons so wait for next SWBA
3499c2df44b3SMichal Kazior 		 * before telling mac80211 to decrement CSA counter
3500c2df44b3SMichal Kazior 		 *
3501c2df44b3SMichal Kazior 		 * Once CSA counter is completed stop sending beacons until
3502c2df44b3SMichal Kazior 		 * actual channel switch is done */
3503c2df44b3SMichal Kazior 		if (arvif->vif->csa_active &&
3504c2df44b3SMichal Kazior 		    ieee80211_csa_is_complete(arvif->vif)) {
3505c2df44b3SMichal Kazior 			ieee80211_csa_finish(arvif->vif);
3506c2df44b3SMichal Kazior 			continue;
3507c2df44b3SMichal Kazior 		}
3508c2df44b3SMichal Kazior 
35095e3dd157SKalle Valo 		bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
35105e3dd157SKalle Valo 		if (!bcn) {
35117aa7a72aSMichal Kazior 			ath10k_warn(ar, "could not get mac80211 beacon\n");
35125e3dd157SKalle Valo 			continue;
35135e3dd157SKalle Valo 		}
35145e3dd157SKalle Valo 
35154b604558SMichal Kazior 		ath10k_tx_h_seq_no(arvif->vif, bcn);
351632653cf1SMichal Kazior 		ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
351732653cf1SMichal Kazior 		ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);
35185e3dd157SKalle Valo 
3519ed54388aSMichal Kazior 		spin_lock_bh(&ar->data_lock);
3520748afc47SMichal Kazior 
3521ed54388aSMichal Kazior 		if (arvif->beacon) {
3522af21319fSMichal Kazior 			switch (arvif->beacon_state) {
3523af21319fSMichal Kazior 			case ATH10K_BEACON_SENT:
3524af21319fSMichal Kazior 				break;
3525af21319fSMichal Kazior 			case ATH10K_BEACON_SCHEDULED:
3526af21319fSMichal Kazior 				ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n",
3527ed54388aSMichal Kazior 					    arvif->vdev_id);
3528af21319fSMichal Kazior 				break;
3529af21319fSMichal Kazior 			case ATH10K_BEACON_SENDING:
3530af21319fSMichal Kazior 				ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n",
3531af21319fSMichal Kazior 					    arvif->vdev_id);
3532af21319fSMichal Kazior 				dev_kfree_skb(bcn);
3533af21319fSMichal Kazior 				goto skip;
3534af21319fSMichal Kazior 			}
3535748afc47SMichal Kazior 
353664badcb6SMichal Kazior 			ath10k_mac_vif_beacon_free(arvif);
3537ed54388aSMichal Kazior 		}
35385e3dd157SKalle Valo 
353964badcb6SMichal Kazior 		if (!arvif->beacon_buf) {
354064badcb6SMichal Kazior 			paddr = dma_map_single(arvif->ar->dev, bcn->data,
354164badcb6SMichal Kazior 					       bcn->len, DMA_TO_DEVICE);
354264badcb6SMichal Kazior 			ret = dma_mapping_error(arvif->ar->dev, paddr);
3543767d34fcSMichal Kazior 			if (ret) {
354464badcb6SMichal Kazior 				ath10k_warn(ar, "failed to map beacon: %d\n",
354564badcb6SMichal Kazior 					    ret);
3546ad3d2153SMichal Kazior 				dev_kfree_skb_any(bcn);
35475e55e3cbSMichal Kazior 				ret = -EIO;
3548767d34fcSMichal Kazior 				goto skip;
3549767d34fcSMichal Kazior 			}
3550748afc47SMichal Kazior 
355164badcb6SMichal Kazior 			ATH10K_SKB_CB(bcn)->paddr = paddr;
355264badcb6SMichal Kazior 		} else {
355364badcb6SMichal Kazior 			if (bcn->len > IEEE80211_MAX_FRAME_LEN) {
355464badcb6SMichal Kazior 				ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n",
355564badcb6SMichal Kazior 					    bcn->len, IEEE80211_MAX_FRAME_LEN);
355664badcb6SMichal Kazior 				skb_trim(bcn, IEEE80211_MAX_FRAME_LEN);
355764badcb6SMichal Kazior 			}
355864badcb6SMichal Kazior 			memcpy(arvif->beacon_buf, bcn->data, bcn->len);
355964badcb6SMichal Kazior 			ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr;
356064badcb6SMichal Kazior 		}
356164badcb6SMichal Kazior 
3562ed54388aSMichal Kazior 		arvif->beacon = bcn;
3563af21319fSMichal Kazior 		arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
35645e3dd157SKalle Valo 
35655ce8e7fdSRajkumar Manoharan 		trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
35665ce8e7fdSRajkumar Manoharan 		trace_ath10k_tx_payload(ar, bcn->data, bcn->len);
35675ce8e7fdSRajkumar Manoharan 
3568767d34fcSMichal Kazior skip:
3569ed54388aSMichal Kazior 		spin_unlock_bh(&ar->data_lock);
35705e3dd157SKalle Valo 	}
3571af21319fSMichal Kazior 
3572af21319fSMichal Kazior 	ath10k_wmi_tx_beacons_nowait(ar);
35735e3dd157SKalle Valo }
35745e3dd157SKalle Valo 
35750226d602SMichal Kazior void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb)
35765e3dd157SKalle Valo {
35777aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
35785e3dd157SKalle Valo }
35795e3dd157SKalle Valo 
35809702c686SJanusz Dziedzic static void ath10k_dfs_radar_report(struct ath10k *ar,
3581991adf71SRaja Mani 				    struct wmi_phyerr_ev_arg *phyerr,
35822332d0aeSMichal Kazior 				    const struct phyerr_radar_report *rr,
35839702c686SJanusz Dziedzic 				    u64 tsf)
35849702c686SJanusz Dziedzic {
35859702c686SJanusz Dziedzic 	u32 reg0, reg1, tsf32l;
3586500ff9f9SMichal Kazior 	struct ieee80211_channel *ch;
35879702c686SJanusz Dziedzic 	struct pulse_event pe;
35889702c686SJanusz Dziedzic 	u64 tsf64;
35899702c686SJanusz Dziedzic 	u8 rssi, width;
35909702c686SJanusz Dziedzic 
35919702c686SJanusz Dziedzic 	reg0 = __le32_to_cpu(rr->reg0);
35929702c686SJanusz Dziedzic 	reg1 = __le32_to_cpu(rr->reg1);
35939702c686SJanusz Dziedzic 
35947aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
35959702c686SJanusz Dziedzic 		   "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n",
35969702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP),
35979702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH),
35989702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN),
35999702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF));
36007aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
36019702c686SJanusz Dziedzic 		   "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n",
36029702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK),
36039702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX),
36049702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID),
36059702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN),
36069702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK));
36077aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
36089702c686SJanusz Dziedzic 		   "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n",
36099702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET),
36109702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_DUR));
36119702c686SJanusz Dziedzic 
36129702c686SJanusz Dziedzic 	if (!ar->dfs_detector)
36139702c686SJanusz Dziedzic 		return;
36149702c686SJanusz Dziedzic 
3615500ff9f9SMichal Kazior 	spin_lock_bh(&ar->data_lock);
3616500ff9f9SMichal Kazior 	ch = ar->rx_channel;
3617500ff9f9SMichal Kazior 	spin_unlock_bh(&ar->data_lock);
3618500ff9f9SMichal Kazior 
3619500ff9f9SMichal Kazior 	if (!ch) {
3620500ff9f9SMichal Kazior 		ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n");
3621500ff9f9SMichal Kazior 		goto radar_detected;
3622500ff9f9SMichal Kazior 	}
3623500ff9f9SMichal Kazior 
36249702c686SJanusz Dziedzic 	/* report event to DFS pattern detector */
3625991adf71SRaja Mani 	tsf32l = phyerr->tsf_timestamp;
36269702c686SJanusz Dziedzic 	tsf64 = tsf & (~0xFFFFFFFFULL);
36279702c686SJanusz Dziedzic 	tsf64 |= tsf32l;
36289702c686SJanusz Dziedzic 
36299702c686SJanusz Dziedzic 	width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
36302332d0aeSMichal Kazior 	rssi = phyerr->rssi_combined;
36319702c686SJanusz Dziedzic 
36329702c686SJanusz Dziedzic 	/* hardware store this as 8 bit signed value,
36339702c686SJanusz Dziedzic 	 * set to zero if negative number
36349702c686SJanusz Dziedzic 	 */
36359702c686SJanusz Dziedzic 	if (rssi & 0x80)
36369702c686SJanusz Dziedzic 		rssi = 0;
36379702c686SJanusz Dziedzic 
36389702c686SJanusz Dziedzic 	pe.ts = tsf64;
3639500ff9f9SMichal Kazior 	pe.freq = ch->center_freq;
36409702c686SJanusz Dziedzic 	pe.width = width;
36419702c686SJanusz Dziedzic 	pe.rssi = rssi;
36422c3f26a0SPeter Oh 	pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0);
36437aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
36449702c686SJanusz Dziedzic 		   "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n",
36459702c686SJanusz Dziedzic 		   pe.freq, pe.width, pe.rssi, pe.ts);
36469702c686SJanusz Dziedzic 
36479702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, pulses_detected);
36489702c686SJanusz Dziedzic 
36499702c686SJanusz Dziedzic 	if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe)) {
36507aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
36519702c686SJanusz Dziedzic 			   "dfs no pulse pattern detected, yet\n");
36529702c686SJanusz Dziedzic 		return;
36539702c686SJanusz Dziedzic 	}
36549702c686SJanusz Dziedzic 
3655500ff9f9SMichal Kazior radar_detected:
36567aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
36579702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, radar_detected);
36587d9b40b4SMarek Puzyniak 
36597d9b40b4SMarek Puzyniak 	/* Control radar events reporting in debugfs file
36607d9b40b4SMarek Puzyniak 	   dfs_block_radar_events */
36617d9b40b4SMarek Puzyniak 	if (ar->dfs_block_radar_events) {
36627aa7a72aSMichal Kazior 		ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
36637d9b40b4SMarek Puzyniak 		return;
36647d9b40b4SMarek Puzyniak 	}
36657d9b40b4SMarek Puzyniak 
36669702c686SJanusz Dziedzic 	ieee80211_radar_detected(ar->hw);
36679702c686SJanusz Dziedzic }
36689702c686SJanusz Dziedzic 
36699702c686SJanusz Dziedzic static int ath10k_dfs_fft_report(struct ath10k *ar,
3670991adf71SRaja Mani 				 struct wmi_phyerr_ev_arg *phyerr,
36712332d0aeSMichal Kazior 				 const struct phyerr_fft_report *fftr,
36729702c686SJanusz Dziedzic 				 u64 tsf)
36739702c686SJanusz Dziedzic {
36749702c686SJanusz Dziedzic 	u32 reg0, reg1;
36759702c686SJanusz Dziedzic 	u8 rssi, peak_mag;
36769702c686SJanusz Dziedzic 
36779702c686SJanusz Dziedzic 	reg0 = __le32_to_cpu(fftr->reg0);
36789702c686SJanusz Dziedzic 	reg1 = __le32_to_cpu(fftr->reg1);
36792332d0aeSMichal Kazior 	rssi = phyerr->rssi_combined;
36809702c686SJanusz Dziedzic 
36817aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
36829702c686SJanusz Dziedzic 		   "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
36839702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB),
36849702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB),
36859702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX),
36869702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX));
36877aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
36889702c686SJanusz Dziedzic 		   "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n",
36899702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB),
36909702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB),
36919702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG),
36929702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB));
36939702c686SJanusz Dziedzic 
36949702c686SJanusz Dziedzic 	peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG);
36959702c686SJanusz Dziedzic 
36969702c686SJanusz Dziedzic 	/* false event detection */
36979702c686SJanusz Dziedzic 	if (rssi == DFS_RSSI_POSSIBLY_FALSE &&
36989702c686SJanusz Dziedzic 	    peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) {
36997aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
37009702c686SJanusz Dziedzic 		ATH10K_DFS_STAT_INC(ar, pulses_discarded);
37019702c686SJanusz Dziedzic 		return -EINVAL;
37029702c686SJanusz Dziedzic 	}
37039702c686SJanusz Dziedzic 
37049702c686SJanusz Dziedzic 	return 0;
37059702c686SJanusz Dziedzic }
37069702c686SJanusz Dziedzic 
37070226d602SMichal Kazior void ath10k_wmi_event_dfs(struct ath10k *ar,
3708991adf71SRaja Mani 			  struct wmi_phyerr_ev_arg *phyerr,
37099702c686SJanusz Dziedzic 			  u64 tsf)
37109702c686SJanusz Dziedzic {
37119702c686SJanusz Dziedzic 	int buf_len, tlv_len, res, i = 0;
37122332d0aeSMichal Kazior 	const struct phyerr_tlv *tlv;
37132332d0aeSMichal Kazior 	const struct phyerr_radar_report *rr;
37142332d0aeSMichal Kazior 	const struct phyerr_fft_report *fftr;
37152332d0aeSMichal Kazior 	const u8 *tlv_buf;
37169702c686SJanusz Dziedzic 
3717991adf71SRaja Mani 	buf_len = phyerr->buf_len;
37187aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
37199702c686SJanusz Dziedzic 		   "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
37202332d0aeSMichal Kazior 		   phyerr->phy_err_code, phyerr->rssi_combined,
3721991adf71SRaja Mani 		   phyerr->tsf_timestamp, tsf, buf_len);
37229702c686SJanusz Dziedzic 
37239702c686SJanusz Dziedzic 	/* Skip event if DFS disabled */
372497f2645fSMasahiro Yamada 	if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED))
37259702c686SJanusz Dziedzic 		return;
37269702c686SJanusz Dziedzic 
37279702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, pulses_total);
37289702c686SJanusz Dziedzic 
37299702c686SJanusz Dziedzic 	while (i < buf_len) {
37309702c686SJanusz Dziedzic 		if (i + sizeof(*tlv) > buf_len) {
37317aa7a72aSMichal Kazior 			ath10k_warn(ar, "too short buf for tlv header (%d)\n",
37327aa7a72aSMichal Kazior 				    i);
37339702c686SJanusz Dziedzic 			return;
37349702c686SJanusz Dziedzic 		}
37359702c686SJanusz Dziedzic 
37362332d0aeSMichal Kazior 		tlv = (struct phyerr_tlv *)&phyerr->buf[i];
37379702c686SJanusz Dziedzic 		tlv_len = __le16_to_cpu(tlv->len);
37382332d0aeSMichal Kazior 		tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
37397aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
37409702c686SJanusz Dziedzic 			   "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
37419702c686SJanusz Dziedzic 			   tlv_len, tlv->tag, tlv->sig);
37429702c686SJanusz Dziedzic 
37439702c686SJanusz Dziedzic 		switch (tlv->tag) {
37449702c686SJanusz Dziedzic 		case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY:
37459702c686SJanusz Dziedzic 			if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) {
37467aa7a72aSMichal Kazior 				ath10k_warn(ar, "too short radar pulse summary (%d)\n",
37479702c686SJanusz Dziedzic 					    i);
37489702c686SJanusz Dziedzic 				return;
37499702c686SJanusz Dziedzic 			}
37509702c686SJanusz Dziedzic 
37519702c686SJanusz Dziedzic 			rr = (struct phyerr_radar_report *)tlv_buf;
37522332d0aeSMichal Kazior 			ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
37539702c686SJanusz Dziedzic 			break;
37549702c686SJanusz Dziedzic 		case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
37559702c686SJanusz Dziedzic 			if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
37567aa7a72aSMichal Kazior 				ath10k_warn(ar, "too short fft report (%d)\n",
37577aa7a72aSMichal Kazior 					    i);
37589702c686SJanusz Dziedzic 				return;
37599702c686SJanusz Dziedzic 			}
37609702c686SJanusz Dziedzic 
37619702c686SJanusz Dziedzic 			fftr = (struct phyerr_fft_report *)tlv_buf;
37622332d0aeSMichal Kazior 			res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
37639702c686SJanusz Dziedzic 			if (res)
37649702c686SJanusz Dziedzic 				return;
37659702c686SJanusz Dziedzic 			break;
37669702c686SJanusz Dziedzic 		}
37679702c686SJanusz Dziedzic 
37689702c686SJanusz Dziedzic 		i += sizeof(*tlv) + tlv_len;
37699702c686SJanusz Dziedzic 	}
37709702c686SJanusz Dziedzic }
37719702c686SJanusz Dziedzic 
37720226d602SMichal Kazior void ath10k_wmi_event_spectral_scan(struct ath10k *ar,
3773991adf71SRaja Mani 				    struct wmi_phyerr_ev_arg *phyerr,
37749702c686SJanusz Dziedzic 				    u64 tsf)
37759702c686SJanusz Dziedzic {
3776855aed12SSimon Wunderlich 	int buf_len, tlv_len, res, i = 0;
3777855aed12SSimon Wunderlich 	struct phyerr_tlv *tlv;
37782332d0aeSMichal Kazior 	const void *tlv_buf;
37792332d0aeSMichal Kazior 	const struct phyerr_fft_report *fftr;
3780855aed12SSimon Wunderlich 	size_t fftr_len;
3781855aed12SSimon Wunderlich 
3782991adf71SRaja Mani 	buf_len = phyerr->buf_len;
3783855aed12SSimon Wunderlich 
3784855aed12SSimon Wunderlich 	while (i < buf_len) {
3785855aed12SSimon Wunderlich 		if (i + sizeof(*tlv) > buf_len) {
37867aa7a72aSMichal Kazior 			ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n",
3787855aed12SSimon Wunderlich 				    i);
3788855aed12SSimon Wunderlich 			return;
3789855aed12SSimon Wunderlich 		}
3790855aed12SSimon Wunderlich 
37912332d0aeSMichal Kazior 		tlv = (struct phyerr_tlv *)&phyerr->buf[i];
3792855aed12SSimon Wunderlich 		tlv_len = __le16_to_cpu(tlv->len);
37932332d0aeSMichal Kazior 		tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
3794855aed12SSimon Wunderlich 
3795855aed12SSimon Wunderlich 		if (i + sizeof(*tlv) + tlv_len > buf_len) {
37967aa7a72aSMichal Kazior 			ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
3797855aed12SSimon Wunderlich 				    i);
3798855aed12SSimon Wunderlich 			return;
3799855aed12SSimon Wunderlich 		}
3800855aed12SSimon Wunderlich 
3801855aed12SSimon Wunderlich 		switch (tlv->tag) {
3802855aed12SSimon Wunderlich 		case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
3803855aed12SSimon Wunderlich 			if (sizeof(*fftr) > tlv_len) {
38047aa7a72aSMichal Kazior 				ath10k_warn(ar, "failed to parse fft report at byte %d\n",
3805855aed12SSimon Wunderlich 					    i);
3806855aed12SSimon Wunderlich 				return;
3807855aed12SSimon Wunderlich 			}
3808855aed12SSimon Wunderlich 
3809855aed12SSimon Wunderlich 			fftr_len = tlv_len - sizeof(*fftr);
38102332d0aeSMichal Kazior 			fftr = tlv_buf;
38112332d0aeSMichal Kazior 			res = ath10k_spectral_process_fft(ar, phyerr,
3812855aed12SSimon Wunderlich 							  fftr, fftr_len,
3813855aed12SSimon Wunderlich 							  tsf);
3814855aed12SSimon Wunderlich 			if (res < 0) {
38153413e97dSKevin Darbyshire-Bryant 				ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
3816855aed12SSimon Wunderlich 					   res);
3817855aed12SSimon Wunderlich 				return;
3818855aed12SSimon Wunderlich 			}
3819855aed12SSimon Wunderlich 			break;
3820855aed12SSimon Wunderlich 		}
3821855aed12SSimon Wunderlich 
3822855aed12SSimon Wunderlich 		i += sizeof(*tlv) + tlv_len;
3823855aed12SSimon Wunderlich 	}
38249702c686SJanusz Dziedzic }
38259702c686SJanusz Dziedzic 
3826991adf71SRaja Mani static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar,
3827991adf71SRaja Mani 					    struct sk_buff *skb,
3828991adf71SRaja Mani 					    struct wmi_phyerr_hdr_arg *arg)
382932653cf1SMichal Kazior {
383032653cf1SMichal Kazior 	struct wmi_phyerr_event *ev = (void *)skb->data;
383132653cf1SMichal Kazior 
383232653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
383332653cf1SMichal Kazior 		return -EPROTO;
383432653cf1SMichal Kazior 
3835991adf71SRaja Mani 	arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs);
3836991adf71SRaja Mani 	arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
3837991adf71SRaja Mani 	arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
3838991adf71SRaja Mani 	arg->buf_len = skb->len - sizeof(*ev);
383932653cf1SMichal Kazior 	arg->phyerrs = ev->phyerrs;
384032653cf1SMichal Kazior 
384132653cf1SMichal Kazior 	return 0;
384232653cf1SMichal Kazior }
384332653cf1SMichal Kazior 
38442b0a2e0dSRaja Mani static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar,
38452b0a2e0dSRaja Mani 						 struct sk_buff *skb,
38462b0a2e0dSRaja Mani 						 struct wmi_phyerr_hdr_arg *arg)
38472b0a2e0dSRaja Mani {
38482b0a2e0dSRaja Mani 	struct wmi_10_4_phyerr_event *ev = (void *)skb->data;
38492b0a2e0dSRaja Mani 
38502b0a2e0dSRaja Mani 	if (skb->len < sizeof(*ev))
38512b0a2e0dSRaja Mani 		return -EPROTO;
38522b0a2e0dSRaja Mani 
38532b0a2e0dSRaja Mani 	/* 10.4 firmware always reports only one phyerr */
38542b0a2e0dSRaja Mani 	arg->num_phyerrs = 1;
38552b0a2e0dSRaja Mani 
38562b0a2e0dSRaja Mani 	arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
38572b0a2e0dSRaja Mani 	arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
38582b0a2e0dSRaja Mani 	arg->buf_len = skb->len;
38592b0a2e0dSRaja Mani 	arg->phyerrs = skb->data;
38602b0a2e0dSRaja Mani 
38612b0a2e0dSRaja Mani 	return 0;
38622b0a2e0dSRaja Mani }
38632b0a2e0dSRaja Mani 
3864991adf71SRaja Mani int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar,
3865991adf71SRaja Mani 				 const void *phyerr_buf,
3866991adf71SRaja Mani 				 int left_len,
3867991adf71SRaja Mani 				 struct wmi_phyerr_ev_arg *arg)
3868991adf71SRaja Mani {
3869991adf71SRaja Mani 	const struct wmi_phyerr *phyerr = phyerr_buf;
3870991adf71SRaja Mani 	int i;
3871991adf71SRaja Mani 
3872991adf71SRaja Mani 	if (left_len < sizeof(*phyerr)) {
3873ee92a209SRaja Mani 		ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
3874991adf71SRaja Mani 			    left_len, sizeof(*phyerr));
3875991adf71SRaja Mani 		return -EINVAL;
3876991adf71SRaja Mani 	}
3877991adf71SRaja Mani 
3878991adf71SRaja Mani 	arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
3879991adf71SRaja Mani 	arg->freq1 = __le16_to_cpu(phyerr->freq1);
3880991adf71SRaja Mani 	arg->freq2 = __le16_to_cpu(phyerr->freq2);
3881991adf71SRaja Mani 	arg->rssi_combined = phyerr->rssi_combined;
3882991adf71SRaja Mani 	arg->chan_width_mhz = phyerr->chan_width_mhz;
3883991adf71SRaja Mani 	arg->buf_len = __le32_to_cpu(phyerr->buf_len);
3884991adf71SRaja Mani 	arg->buf = phyerr->buf;
3885991adf71SRaja Mani 	arg->hdr_len = sizeof(*phyerr);
3886991adf71SRaja Mani 
3887991adf71SRaja Mani 	for (i = 0; i < 4; i++)
3888991adf71SRaja Mani 		arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
3889991adf71SRaja Mani 
3890991adf71SRaja Mani 	switch (phyerr->phy_err_code) {
3891991adf71SRaja Mani 	case PHY_ERROR_GEN_SPECTRAL_SCAN:
3892991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
3893991adf71SRaja Mani 		break;
3894991adf71SRaja Mani 	case PHY_ERROR_GEN_FALSE_RADAR_EXT:
3895991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT;
3896991adf71SRaja Mani 		break;
3897991adf71SRaja Mani 	case PHY_ERROR_GEN_RADAR:
3898991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_RADAR;
3899991adf71SRaja Mani 		break;
3900991adf71SRaja Mani 	default:
3901991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_UNKNOWN;
3902991adf71SRaja Mani 		break;
3903991adf71SRaja Mani 	}
3904991adf71SRaja Mani 
3905991adf71SRaja Mani 	return 0;
3906991adf71SRaja Mani }
3907991adf71SRaja Mani 
39082b0a2e0dSRaja Mani static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar,
39092b0a2e0dSRaja Mani 					     const void *phyerr_buf,
39102b0a2e0dSRaja Mani 					     int left_len,
39112b0a2e0dSRaja Mani 					     struct wmi_phyerr_ev_arg *arg)
39122b0a2e0dSRaja Mani {
39132b0a2e0dSRaja Mani 	const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf;
39142b0a2e0dSRaja Mani 	u32 phy_err_mask;
39152b0a2e0dSRaja Mani 	int i;
39162b0a2e0dSRaja Mani 
39172b0a2e0dSRaja Mani 	if (left_len < sizeof(*phyerr)) {
3918ee92a209SRaja Mani 		ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
39192b0a2e0dSRaja Mani 			    left_len, sizeof(*phyerr));
39202b0a2e0dSRaja Mani 		return -EINVAL;
39212b0a2e0dSRaja Mani 	}
39222b0a2e0dSRaja Mani 
39232b0a2e0dSRaja Mani 	arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
39242b0a2e0dSRaja Mani 	arg->freq1 = __le16_to_cpu(phyerr->freq1);
39252b0a2e0dSRaja Mani 	arg->freq2 = __le16_to_cpu(phyerr->freq2);
39262b0a2e0dSRaja Mani 	arg->rssi_combined = phyerr->rssi_combined;
39272b0a2e0dSRaja Mani 	arg->chan_width_mhz = phyerr->chan_width_mhz;
39282b0a2e0dSRaja Mani 	arg->buf_len = __le32_to_cpu(phyerr->buf_len);
39292b0a2e0dSRaja Mani 	arg->buf = phyerr->buf;
39302b0a2e0dSRaja Mani 	arg->hdr_len = sizeof(*phyerr);
39312b0a2e0dSRaja Mani 
39322b0a2e0dSRaja Mani 	for (i = 0; i < 4; i++)
39332b0a2e0dSRaja Mani 		arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
39342b0a2e0dSRaja Mani 
39352b0a2e0dSRaja Mani 	phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]);
39362b0a2e0dSRaja Mani 
39372b0a2e0dSRaja Mani 	if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK)
39382b0a2e0dSRaja Mani 		arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
39392b0a2e0dSRaja Mani 	else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK)
39402b0a2e0dSRaja Mani 		arg->phy_err_code = PHY_ERROR_RADAR;
39412b0a2e0dSRaja Mani 	else
39422b0a2e0dSRaja Mani 		arg->phy_err_code = PHY_ERROR_UNKNOWN;
39432b0a2e0dSRaja Mani 
39442b0a2e0dSRaja Mani 	return 0;
39452b0a2e0dSRaja Mani }
39462b0a2e0dSRaja Mani 
39470226d602SMichal Kazior void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
39485e3dd157SKalle Valo {
3949991adf71SRaja Mani 	struct wmi_phyerr_hdr_arg hdr_arg = {};
3950991adf71SRaja Mani 	struct wmi_phyerr_ev_arg phyerr_arg = {};
3951991adf71SRaja Mani 	const void *phyerr;
39529702c686SJanusz Dziedzic 	u32 count, i, buf_len, phy_err_code;
39539702c686SJanusz Dziedzic 	u64 tsf;
395432653cf1SMichal Kazior 	int left_len, ret;
39559702c686SJanusz Dziedzic 
39569702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, phy_errors);
39579702c686SJanusz Dziedzic 
3958991adf71SRaja Mani 	ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
395932653cf1SMichal Kazior 	if (ret) {
3960991adf71SRaja Mani 		ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret);
39619702c686SJanusz Dziedzic 		return;
39629702c686SJanusz Dziedzic 	}
39639702c686SJanusz Dziedzic 
39649702c686SJanusz Dziedzic 	/* Check number of included events */
3965991adf71SRaja Mani 	count = hdr_arg.num_phyerrs;
39669702c686SJanusz Dziedzic 
3967991adf71SRaja Mani 	left_len = hdr_arg.buf_len;
3968991adf71SRaja Mani 
3969991adf71SRaja Mani 	tsf = hdr_arg.tsf_u32;
39709702c686SJanusz Dziedzic 	tsf <<= 32;
3971991adf71SRaja Mani 	tsf |= hdr_arg.tsf_l32;
39729702c686SJanusz Dziedzic 
39737aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
39749702c686SJanusz Dziedzic 		   "wmi event phyerr count %d tsf64 0x%llX\n",
39759702c686SJanusz Dziedzic 		   count, tsf);
39769702c686SJanusz Dziedzic 
3977991adf71SRaja Mani 	phyerr = hdr_arg.phyerrs;
39789702c686SJanusz Dziedzic 	for (i = 0; i < count; i++) {
3979991adf71SRaja Mani 		ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
3980991adf71SRaja Mani 		if (ret) {
3981991adf71SRaja Mani 			ath10k_warn(ar, "failed to parse phyerr event (%d)\n",
39827aa7a72aSMichal Kazior 				    i);
39839702c686SJanusz Dziedzic 			return;
39849702c686SJanusz Dziedzic 		}
39859702c686SJanusz Dziedzic 
3986991adf71SRaja Mani 		left_len -= phyerr_arg.hdr_len;
3987991adf71SRaja Mani 		buf_len = phyerr_arg.buf_len;
3988991adf71SRaja Mani 		phy_err_code = phyerr_arg.phy_err_code;
39899702c686SJanusz Dziedzic 
39909702c686SJanusz Dziedzic 		if (left_len < buf_len) {
39917aa7a72aSMichal Kazior 			ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
39929702c686SJanusz Dziedzic 			return;
39939702c686SJanusz Dziedzic 		}
39949702c686SJanusz Dziedzic 
39959702c686SJanusz Dziedzic 		left_len -= buf_len;
39969702c686SJanusz Dziedzic 
39979702c686SJanusz Dziedzic 		switch (phy_err_code) {
39989702c686SJanusz Dziedzic 		case PHY_ERROR_RADAR:
3999991adf71SRaja Mani 			ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
40009702c686SJanusz Dziedzic 			break;
40019702c686SJanusz Dziedzic 		case PHY_ERROR_SPECTRAL_SCAN:
4002991adf71SRaja Mani 			ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
40039702c686SJanusz Dziedzic 			break;
40049702c686SJanusz Dziedzic 		case PHY_ERROR_FALSE_RADAR_EXT:
4005991adf71SRaja Mani 			ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4006991adf71SRaja Mani 			ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
40079702c686SJanusz Dziedzic 			break;
40089702c686SJanusz Dziedzic 		default:
40099702c686SJanusz Dziedzic 			break;
40109702c686SJanusz Dziedzic 		}
40119702c686SJanusz Dziedzic 
4012991adf71SRaja Mani 		phyerr = phyerr + phyerr_arg.hdr_len + buf_len;
40139702c686SJanusz Dziedzic 	}
40145e3dd157SKalle Valo }
40155e3dd157SKalle Valo 
40160226d602SMichal Kazior void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
40175e3dd157SKalle Valo {
4018c1a4654aSMichal Kazior 	struct wmi_roam_ev_arg arg = {};
4019c1a4654aSMichal Kazior 	int ret;
4020c1a4654aSMichal Kazior 	u32 vdev_id;
4021c1a4654aSMichal Kazior 	u32 reason;
4022c1a4654aSMichal Kazior 	s32 rssi;
4023c1a4654aSMichal Kazior 
4024c1a4654aSMichal Kazior 	ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
4025c1a4654aSMichal Kazior 	if (ret) {
4026c1a4654aSMichal Kazior 		ath10k_warn(ar, "failed to parse roam event: %d\n", ret);
4027c1a4654aSMichal Kazior 		return;
4028c1a4654aSMichal Kazior 	}
4029c1a4654aSMichal Kazior 
4030c1a4654aSMichal Kazior 	vdev_id = __le32_to_cpu(arg.vdev_id);
4031c1a4654aSMichal Kazior 	reason = __le32_to_cpu(arg.reason);
4032c1a4654aSMichal Kazior 	rssi = __le32_to_cpu(arg.rssi);
4033c1a4654aSMichal Kazior 	rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT;
4034c1a4654aSMichal Kazior 
4035c1a4654aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
4036c1a4654aSMichal Kazior 		   "wmi roam event vdev %u reason 0x%08x rssi %d\n",
4037c1a4654aSMichal Kazior 		   vdev_id, reason, rssi);
4038c1a4654aSMichal Kazior 
4039c1a4654aSMichal Kazior 	if (reason >= WMI_ROAM_REASON_MAX)
4040c1a4654aSMichal Kazior 		ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n",
4041c1a4654aSMichal Kazior 			    reason, vdev_id);
4042c1a4654aSMichal Kazior 
4043c1a4654aSMichal Kazior 	switch (reason) {
4044c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_BEACON_MISS:
4045cc9904e6SMichal Kazior 		ath10k_mac_handle_beacon_miss(ar, vdev_id);
4046cc9904e6SMichal Kazior 		break;
4047cc9904e6SMichal Kazior 	case WMI_ROAM_REASON_BETTER_AP:
4048c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_LOW_RSSI:
4049c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_SUITABLE_AP_FOUND:
4050c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_HO_FAILED:
4051c1a4654aSMichal Kazior 		ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n",
4052c1a4654aSMichal Kazior 			    reason, vdev_id);
4053c1a4654aSMichal Kazior 		break;
4054c1a4654aSMichal Kazior 	}
40555e3dd157SKalle Valo }
40565e3dd157SKalle Valo 
40570226d602SMichal Kazior void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb)
40585e3dd157SKalle Valo {
40597aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
40605e3dd157SKalle Valo }
40615e3dd157SKalle Valo 
40620226d602SMichal Kazior void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb)
40635e3dd157SKalle Valo {
40642fe5288cSKalle Valo 	char buf[101], c;
40652fe5288cSKalle Valo 	int i;
40662fe5288cSKalle Valo 
40672fe5288cSKalle Valo 	for (i = 0; i < sizeof(buf) - 1; i++) {
40682fe5288cSKalle Valo 		if (i >= skb->len)
40692fe5288cSKalle Valo 			break;
40702fe5288cSKalle Valo 
40712fe5288cSKalle Valo 		c = skb->data[i];
40722fe5288cSKalle Valo 
40732fe5288cSKalle Valo 		if (c == '\0')
40742fe5288cSKalle Valo 			break;
40752fe5288cSKalle Valo 
40762fe5288cSKalle Valo 		if (isascii(c) && isprint(c))
40772fe5288cSKalle Valo 			buf[i] = c;
40782fe5288cSKalle Valo 		else
40792fe5288cSKalle Valo 			buf[i] = '.';
40802fe5288cSKalle Valo 	}
40812fe5288cSKalle Valo 
40822fe5288cSKalle Valo 	if (i == sizeof(buf) - 1)
40837aa7a72aSMichal Kazior 		ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len);
40842fe5288cSKalle Valo 
40852fe5288cSKalle Valo 	/* for some reason the debug prints end with \n, remove that */
40862fe5288cSKalle Valo 	if (skb->data[i - 1] == '\n')
40872fe5288cSKalle Valo 		i--;
40882fe5288cSKalle Valo 
40892fe5288cSKalle Valo 	/* the last byte is always reserved for the null character */
40902fe5288cSKalle Valo 	buf[i] = '\0';
40912fe5288cSKalle Valo 
40923be004c3SBen Greear 	ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
40935e3dd157SKalle Valo }
40945e3dd157SKalle Valo 
40950226d602SMichal Kazior void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
40965e3dd157SKalle Valo {
40977aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
40985e3dd157SKalle Valo }
40995e3dd157SKalle Valo 
41000226d602SMichal Kazior void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb)
41015e3dd157SKalle Valo {
41027aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
41035e3dd157SKalle Valo }
41045e3dd157SKalle Valo 
41050226d602SMichal Kazior void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
41065e3dd157SKalle Valo 					     struct sk_buff *skb)
41075e3dd157SKalle Valo {
41087aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
41095e3dd157SKalle Valo }
41105e3dd157SKalle Valo 
41110226d602SMichal Kazior void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
41125e3dd157SKalle Valo 					     struct sk_buff *skb)
41135e3dd157SKalle Valo {
41147aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
41155e3dd157SKalle Valo }
41165e3dd157SKalle Valo 
41170226d602SMichal Kazior void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb)
41185e3dd157SKalle Valo {
41197aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
41205e3dd157SKalle Valo }
41215e3dd157SKalle Valo 
41220226d602SMichal Kazior void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb)
41235e3dd157SKalle Valo {
41245fd3ac3cSJanusz Dziedzic 	struct wmi_wow_ev_arg ev = {};
41255fd3ac3cSJanusz Dziedzic 	int ret;
41265fd3ac3cSJanusz Dziedzic 
41275fd3ac3cSJanusz Dziedzic 	complete(&ar->wow.wakeup_completed);
41285fd3ac3cSJanusz Dziedzic 
41295fd3ac3cSJanusz Dziedzic 	ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
41305fd3ac3cSJanusz Dziedzic 	if (ret) {
41315fd3ac3cSJanusz Dziedzic 		ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret);
41325fd3ac3cSJanusz Dziedzic 		return;
41335fd3ac3cSJanusz Dziedzic 	}
41345fd3ac3cSJanusz Dziedzic 
41355fd3ac3cSJanusz Dziedzic 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
41365fd3ac3cSJanusz Dziedzic 		   wow_reason(ev.wake_reason));
41375e3dd157SKalle Valo }
41385e3dd157SKalle Valo 
41390226d602SMichal Kazior void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb)
41405e3dd157SKalle Valo {
41417aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
41425e3dd157SKalle Valo }
41435e3dd157SKalle Valo 
414429542666SMaharaja Kennadyrajan static u8 ath10k_tpc_config_get_rate(struct ath10k *ar,
414529542666SMaharaja Kennadyrajan 				     struct wmi_pdev_tpc_config_event *ev,
414629542666SMaharaja Kennadyrajan 				     u32 rate_idx, u32 num_chains,
414729542666SMaharaja Kennadyrajan 				     u32 rate_code, u8 type)
414829542666SMaharaja Kennadyrajan {
414929542666SMaharaja Kennadyrajan 	u8 tpc, num_streams, preamble, ch, stm_idx;
415029542666SMaharaja Kennadyrajan 
415129542666SMaharaja Kennadyrajan 	num_streams = ATH10K_HW_NSS(rate_code);
415229542666SMaharaja Kennadyrajan 	preamble = ATH10K_HW_PREAMBLE(rate_code);
415329542666SMaharaja Kennadyrajan 	ch = num_chains - 1;
415429542666SMaharaja Kennadyrajan 
415529542666SMaharaja Kennadyrajan 	tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]);
415629542666SMaharaja Kennadyrajan 
415729542666SMaharaja Kennadyrajan 	if (__le32_to_cpu(ev->num_tx_chain) <= 1)
415829542666SMaharaja Kennadyrajan 		goto out;
415929542666SMaharaja Kennadyrajan 
416029542666SMaharaja Kennadyrajan 	if (preamble == WMI_RATE_PREAMBLE_CCK)
416129542666SMaharaja Kennadyrajan 		goto out;
416229542666SMaharaja Kennadyrajan 
416329542666SMaharaja Kennadyrajan 	stm_idx = num_streams - 1;
416429542666SMaharaja Kennadyrajan 	if (num_chains <= num_streams)
416529542666SMaharaja Kennadyrajan 		goto out;
416629542666SMaharaja Kennadyrajan 
416729542666SMaharaja Kennadyrajan 	switch (type) {
416829542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_STBC:
416929542666SMaharaja Kennadyrajan 		tpc = min_t(u8, tpc,
417029542666SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]);
417129542666SMaharaja Kennadyrajan 		break;
417229542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_TXBF:
417329542666SMaharaja Kennadyrajan 		tpc = min_t(u8, tpc,
417429542666SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]);
417529542666SMaharaja Kennadyrajan 		break;
417629542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_CDD:
417729542666SMaharaja Kennadyrajan 		tpc = min_t(u8, tpc,
417829542666SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]);
417929542666SMaharaja Kennadyrajan 		break;
418029542666SMaharaja Kennadyrajan 	default:
418129542666SMaharaja Kennadyrajan 		ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type);
418229542666SMaharaja Kennadyrajan 		tpc = 0;
418329542666SMaharaja Kennadyrajan 		break;
418429542666SMaharaja Kennadyrajan 	}
418529542666SMaharaja Kennadyrajan 
418629542666SMaharaja Kennadyrajan out:
418729542666SMaharaja Kennadyrajan 	return tpc;
418829542666SMaharaja Kennadyrajan }
418929542666SMaharaja Kennadyrajan 
419029542666SMaharaja Kennadyrajan static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
419129542666SMaharaja Kennadyrajan 					  struct wmi_pdev_tpc_config_event *ev,
419229542666SMaharaja Kennadyrajan 					  struct ath10k_tpc_stats *tpc_stats,
419329542666SMaharaja Kennadyrajan 					  u8 *rate_code, u16 *pream_table, u8 type)
419429542666SMaharaja Kennadyrajan {
419529542666SMaharaja Kennadyrajan 	u32 i, j, pream_idx, flags;
419629542666SMaharaja Kennadyrajan 	u8 tpc[WMI_TPC_TX_N_CHAIN];
419729542666SMaharaja Kennadyrajan 	char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
419829542666SMaharaja Kennadyrajan 	char buff[WMI_TPC_BUF_SIZE];
419929542666SMaharaja Kennadyrajan 
420029542666SMaharaja Kennadyrajan 	flags = __le32_to_cpu(ev->flags);
420129542666SMaharaja Kennadyrajan 
420229542666SMaharaja Kennadyrajan 	switch (type) {
420329542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_CDD:
420429542666SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
420529542666SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
420629542666SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
420729542666SMaharaja Kennadyrajan 			return;
420829542666SMaharaja Kennadyrajan 		}
420929542666SMaharaja Kennadyrajan 		break;
421029542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_STBC:
421129542666SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
421229542666SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
421329542666SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
421429542666SMaharaja Kennadyrajan 			return;
421529542666SMaharaja Kennadyrajan 		}
421629542666SMaharaja Kennadyrajan 		break;
421729542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_TXBF:
421829542666SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
421929542666SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
422029542666SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
422129542666SMaharaja Kennadyrajan 			return;
422229542666SMaharaja Kennadyrajan 		}
422329542666SMaharaja Kennadyrajan 		break;
422429542666SMaharaja Kennadyrajan 	default:
422529542666SMaharaja Kennadyrajan 		ath10k_dbg(ar, ATH10K_DBG_WMI,
422629542666SMaharaja Kennadyrajan 			   "invalid table type in wmi tpc event: %d\n", type);
422729542666SMaharaja Kennadyrajan 		return;
422829542666SMaharaja Kennadyrajan 	}
422929542666SMaharaja Kennadyrajan 
423029542666SMaharaja Kennadyrajan 	pream_idx = 0;
423129542666SMaharaja Kennadyrajan 	for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
423229542666SMaharaja Kennadyrajan 		memset(tpc_value, 0, sizeof(tpc_value));
423329542666SMaharaja Kennadyrajan 		memset(buff, 0, sizeof(buff));
423429542666SMaharaja Kennadyrajan 		if (i == pream_table[pream_idx])
423529542666SMaharaja Kennadyrajan 			pream_idx++;
423629542666SMaharaja Kennadyrajan 
423729542666SMaharaja Kennadyrajan 		for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
423829542666SMaharaja Kennadyrajan 			if (j >= __le32_to_cpu(ev->num_tx_chain))
423929542666SMaharaja Kennadyrajan 				break;
424029542666SMaharaja Kennadyrajan 
424129542666SMaharaja Kennadyrajan 			tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
424229542666SMaharaja Kennadyrajan 							    rate_code[i],
424329542666SMaharaja Kennadyrajan 							    type);
424429542666SMaharaja Kennadyrajan 			snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
424529542666SMaharaja Kennadyrajan 			strncat(tpc_value, buff, strlen(buff));
424629542666SMaharaja Kennadyrajan 		}
424729542666SMaharaja Kennadyrajan 		tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
424829542666SMaharaja Kennadyrajan 		tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
424929542666SMaharaja Kennadyrajan 		memcpy(tpc_stats->tpc_table[type].tpc_value[i],
425029542666SMaharaja Kennadyrajan 		       tpc_value, sizeof(tpc_value));
425129542666SMaharaja Kennadyrajan 	}
425229542666SMaharaja Kennadyrajan }
425329542666SMaharaja Kennadyrajan 
42540226d602SMichal Kazior void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb)
42555e3dd157SKalle Valo {
425629542666SMaharaja Kennadyrajan 	u32 i, j, pream_idx, num_tx_chain;
425729542666SMaharaja Kennadyrajan 	u8 rate_code[WMI_TPC_RATE_MAX], rate_idx;
425829542666SMaharaja Kennadyrajan 	u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
425929542666SMaharaja Kennadyrajan 	struct wmi_pdev_tpc_config_event *ev;
426029542666SMaharaja Kennadyrajan 	struct ath10k_tpc_stats *tpc_stats;
426129542666SMaharaja Kennadyrajan 
426229542666SMaharaja Kennadyrajan 	ev = (struct wmi_pdev_tpc_config_event *)skb->data;
426329542666SMaharaja Kennadyrajan 
426429542666SMaharaja Kennadyrajan 	tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
426529542666SMaharaja Kennadyrajan 	if (!tpc_stats)
426629542666SMaharaja Kennadyrajan 		return;
426729542666SMaharaja Kennadyrajan 
426829542666SMaharaja Kennadyrajan 	/* Create the rate code table based on the chains supported */
426929542666SMaharaja Kennadyrajan 	rate_idx = 0;
427029542666SMaharaja Kennadyrajan 	pream_idx = 0;
427129542666SMaharaja Kennadyrajan 
427229542666SMaharaja Kennadyrajan 	/* Fill CCK rate code */
427329542666SMaharaja Kennadyrajan 	for (i = 0; i < 4; i++) {
427429542666SMaharaja Kennadyrajan 		rate_code[rate_idx] =
427529542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK);
427629542666SMaharaja Kennadyrajan 		rate_idx++;
427729542666SMaharaja Kennadyrajan 	}
427829542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
427929542666SMaharaja Kennadyrajan 	pream_idx++;
428029542666SMaharaja Kennadyrajan 
428129542666SMaharaja Kennadyrajan 	/* Fill OFDM rate code */
428229542666SMaharaja Kennadyrajan 	for (i = 0; i < 8; i++) {
428329542666SMaharaja Kennadyrajan 		rate_code[rate_idx] =
428429542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM);
428529542666SMaharaja Kennadyrajan 		rate_idx++;
428629542666SMaharaja Kennadyrajan 	}
428729542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
428829542666SMaharaja Kennadyrajan 	pream_idx++;
428929542666SMaharaja Kennadyrajan 
429029542666SMaharaja Kennadyrajan 	num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
429129542666SMaharaja Kennadyrajan 
429229542666SMaharaja Kennadyrajan 	/* Fill HT20 rate code */
429329542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
429429542666SMaharaja Kennadyrajan 		for (j = 0; j < 8; j++) {
429529542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
429629542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
429729542666SMaharaja Kennadyrajan 			rate_idx++;
429829542666SMaharaja Kennadyrajan 		}
429929542666SMaharaja Kennadyrajan 	}
430029542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
430129542666SMaharaja Kennadyrajan 	pream_idx++;
430229542666SMaharaja Kennadyrajan 
430329542666SMaharaja Kennadyrajan 	/* Fill HT40 rate code */
430429542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
430529542666SMaharaja Kennadyrajan 		for (j = 0; j < 8; j++) {
430629542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
430729542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
430829542666SMaharaja Kennadyrajan 			rate_idx++;
430929542666SMaharaja Kennadyrajan 		}
431029542666SMaharaja Kennadyrajan 	}
431129542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
431229542666SMaharaja Kennadyrajan 	pream_idx++;
431329542666SMaharaja Kennadyrajan 
431429542666SMaharaja Kennadyrajan 	/* Fill VHT20 rate code */
431529542666SMaharaja Kennadyrajan 	for (i = 0; i < __le32_to_cpu(ev->num_tx_chain); i++) {
431629542666SMaharaja Kennadyrajan 		for (j = 0; j < 10; j++) {
431729542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
431829542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
431929542666SMaharaja Kennadyrajan 			rate_idx++;
432029542666SMaharaja Kennadyrajan 		}
432129542666SMaharaja Kennadyrajan 	}
432229542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
432329542666SMaharaja Kennadyrajan 	pream_idx++;
432429542666SMaharaja Kennadyrajan 
432529542666SMaharaja Kennadyrajan 	/* Fill VHT40 rate code */
432629542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
432729542666SMaharaja Kennadyrajan 		for (j = 0; j < 10; j++) {
432829542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
432929542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
433029542666SMaharaja Kennadyrajan 			rate_idx++;
433129542666SMaharaja Kennadyrajan 		}
433229542666SMaharaja Kennadyrajan 	}
433329542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
433429542666SMaharaja Kennadyrajan 	pream_idx++;
433529542666SMaharaja Kennadyrajan 
433629542666SMaharaja Kennadyrajan 	/* Fill VHT80 rate code */
433729542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
433829542666SMaharaja Kennadyrajan 		for (j = 0; j < 10; j++) {
433929542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
434029542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
434129542666SMaharaja Kennadyrajan 			rate_idx++;
434229542666SMaharaja Kennadyrajan 		}
434329542666SMaharaja Kennadyrajan 	}
434429542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
434529542666SMaharaja Kennadyrajan 	pream_idx++;
434629542666SMaharaja Kennadyrajan 
434729542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
434829542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
434929542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
435029542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
435129542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
435229542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
435329542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
435429542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
435529542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
435629542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
435729542666SMaharaja Kennadyrajan 
435829542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END;
435929542666SMaharaja Kennadyrajan 
436029542666SMaharaja Kennadyrajan 	tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
436129542666SMaharaja Kennadyrajan 	tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
436229542666SMaharaja Kennadyrajan 	tpc_stats->ctl = __le32_to_cpu(ev->ctl);
436329542666SMaharaja Kennadyrajan 	tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
436429542666SMaharaja Kennadyrajan 	tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
436529542666SMaharaja Kennadyrajan 	tpc_stats->twice_antenna_reduction =
436629542666SMaharaja Kennadyrajan 		__le32_to_cpu(ev->twice_antenna_reduction);
436729542666SMaharaja Kennadyrajan 	tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
436829542666SMaharaja Kennadyrajan 	tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
436929542666SMaharaja Kennadyrajan 	tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
437029542666SMaharaja Kennadyrajan 	tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
437129542666SMaharaja Kennadyrajan 
437229542666SMaharaja Kennadyrajan 	ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
437329542666SMaharaja Kennadyrajan 				      rate_code, pream_table,
437429542666SMaharaja Kennadyrajan 				      WMI_TPC_TABLE_TYPE_CDD);
437529542666SMaharaja Kennadyrajan 	ath10k_tpc_config_disp_tables(ar, ev,  tpc_stats,
437629542666SMaharaja Kennadyrajan 				      rate_code, pream_table,
437729542666SMaharaja Kennadyrajan 				      WMI_TPC_TABLE_TYPE_STBC);
437829542666SMaharaja Kennadyrajan 	ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
437929542666SMaharaja Kennadyrajan 				      rate_code, pream_table,
438029542666SMaharaja Kennadyrajan 				      WMI_TPC_TABLE_TYPE_TXBF);
438129542666SMaharaja Kennadyrajan 
438229542666SMaharaja Kennadyrajan 	ath10k_debug_tpc_stats_process(ar, tpc_stats);
438329542666SMaharaja Kennadyrajan 
438429542666SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
438529542666SMaharaja Kennadyrajan 		   "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",
438629542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->chan_freq),
438729542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->phy_mode),
438829542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->ctl),
438929542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->reg_domain),
439029542666SMaharaja Kennadyrajan 		   a_sle32_to_cpu(ev->twice_antenna_gain),
439129542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->twice_antenna_reduction),
439229542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->power_limit),
439329542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->twice_max_rd_power) / 2,
439429542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->num_tx_chain),
439529542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->rate_max));
43965e3dd157SKalle Valo }
43975e3dd157SKalle Valo 
43980226d602SMichal Kazior void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
43995e3dd157SKalle Valo {
44007aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
44015e3dd157SKalle Valo }
44025e3dd157SKalle Valo 
44030226d602SMichal Kazior void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb)
44045e3dd157SKalle Valo {
44057aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
44065e3dd157SKalle Valo }
44075e3dd157SKalle Valo 
44080226d602SMichal Kazior void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb)
44095e3dd157SKalle Valo {
44107aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
44115e3dd157SKalle Valo }
44125e3dd157SKalle Valo 
44130226d602SMichal Kazior void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb)
44145e3dd157SKalle Valo {
44157aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
44165e3dd157SKalle Valo }
44175e3dd157SKalle Valo 
44180226d602SMichal Kazior void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb)
44195e3dd157SKalle Valo {
44207aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
44215e3dd157SKalle Valo }
44225e3dd157SKalle Valo 
44230226d602SMichal Kazior void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
44245e3dd157SKalle Valo 						struct sk_buff *skb)
44255e3dd157SKalle Valo {
44267aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
44275e3dd157SKalle Valo }
44285e3dd157SKalle Valo 
44290226d602SMichal Kazior void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb)
44308a6618b0SBartosz Markowski {
44317aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
44328a6618b0SBartosz Markowski }
44338a6618b0SBartosz Markowski 
44340226d602SMichal Kazior void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb)
44358a6618b0SBartosz Markowski {
44367aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
44378a6618b0SBartosz Markowski }
44388a6618b0SBartosz Markowski 
44390226d602SMichal Kazior void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb)
44408a6618b0SBartosz Markowski {
44417aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
44428a6618b0SBartosz Markowski }
44438a6618b0SBartosz Markowski 
4444b0578865SFelix Fietkau static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
4445b3effe61SBartosz Markowski 				  u32 num_units, u32 unit_len)
4446b3effe61SBartosz Markowski {
4447b3effe61SBartosz Markowski 	dma_addr_t paddr;
4448b0578865SFelix Fietkau 	u32 pool_size = 0;
4449b3effe61SBartosz Markowski 	int idx = ar->wmi.num_mem_chunks;
4450b0578865SFelix Fietkau 	void *vaddr = NULL;
4451b3effe61SBartosz Markowski 
4452b0578865SFelix Fietkau 	if (ar->wmi.num_mem_chunks == ARRAY_SIZE(ar->wmi.mem_chunks))
4453b0578865SFelix Fietkau 		return -ENOMEM;
4454b0578865SFelix Fietkau 
4455b0578865SFelix Fietkau 	while (!vaddr && num_units) {
4456b3effe61SBartosz Markowski 		pool_size = num_units * round_up(unit_len, 4);
4457b3effe61SBartosz Markowski 		if (!pool_size)
4458b3effe61SBartosz Markowski 			return -EINVAL;
4459b3effe61SBartosz Markowski 
4460b0578865SFelix Fietkau 		vaddr = kzalloc(pool_size, GFP_KERNEL | __GFP_NOWARN);
4461b0578865SFelix Fietkau 		if (!vaddr)
4462b0578865SFelix Fietkau 			num_units /= 2;
4463b0578865SFelix Fietkau 	}
4464b0578865SFelix Fietkau 
4465b0578865SFelix Fietkau 	if (!num_units)
4466b0578865SFelix Fietkau 		return -ENOMEM;
4467b0578865SFelix Fietkau 
4468b0578865SFelix Fietkau 	paddr = dma_map_single(ar->dev, vaddr, pool_size, DMA_TO_DEVICE);
4469b0578865SFelix Fietkau 	if (dma_mapping_error(ar->dev, paddr)) {
4470b0578865SFelix Fietkau 		kfree(vaddr);
4471b3effe61SBartosz Markowski 		return -ENOMEM;
4472b3effe61SBartosz Markowski 	}
4473b3effe61SBartosz Markowski 
4474b0578865SFelix Fietkau 	ar->wmi.mem_chunks[idx].vaddr = vaddr;
4475b3effe61SBartosz Markowski 	ar->wmi.mem_chunks[idx].paddr = paddr;
4476b3effe61SBartosz Markowski 	ar->wmi.mem_chunks[idx].len = pool_size;
4477b3effe61SBartosz Markowski 	ar->wmi.mem_chunks[idx].req_id = req_id;
4478b3effe61SBartosz Markowski 	ar->wmi.num_mem_chunks++;
4479b3effe61SBartosz Markowski 
4480b0578865SFelix Fietkau 	return num_units;
4481b0578865SFelix Fietkau }
4482b0578865SFelix Fietkau 
4483b0578865SFelix Fietkau static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
4484b0578865SFelix Fietkau 				     u32 num_units, u32 unit_len)
4485b0578865SFelix Fietkau {
4486b0578865SFelix Fietkau 	int ret;
4487b0578865SFelix Fietkau 
4488b0578865SFelix Fietkau 	while (num_units) {
4489b0578865SFelix Fietkau 		ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len);
4490b0578865SFelix Fietkau 		if (ret < 0)
4491b0578865SFelix Fietkau 			return ret;
4492b0578865SFelix Fietkau 
4493b0578865SFelix Fietkau 		num_units -= ret;
4494b0578865SFelix Fietkau 	}
4495b0578865SFelix Fietkau 
4496b3effe61SBartosz Markowski 	return 0;
4497b3effe61SBartosz Markowski }
4498b3effe61SBartosz Markowski 
4499a925a376SVasanthakumar Thiagarajan static bool
4500a925a376SVasanthakumar Thiagarajan ath10k_wmi_is_host_mem_allocated(struct ath10k *ar,
4501a925a376SVasanthakumar Thiagarajan 				 const struct wlan_host_mem_req **mem_reqs,
4502a925a376SVasanthakumar Thiagarajan 				 u32 num_mem_reqs)
4503a925a376SVasanthakumar Thiagarajan {
4504a925a376SVasanthakumar Thiagarajan 	u32 req_id, num_units, unit_size, num_unit_info;
4505a925a376SVasanthakumar Thiagarajan 	u32 pool_size;
4506a925a376SVasanthakumar Thiagarajan 	int i, j;
4507a925a376SVasanthakumar Thiagarajan 	bool found;
4508a925a376SVasanthakumar Thiagarajan 
4509a925a376SVasanthakumar Thiagarajan 	if (ar->wmi.num_mem_chunks != num_mem_reqs)
4510a925a376SVasanthakumar Thiagarajan 		return false;
4511a925a376SVasanthakumar Thiagarajan 
4512a925a376SVasanthakumar Thiagarajan 	for (i = 0; i < num_mem_reqs; ++i) {
4513a925a376SVasanthakumar Thiagarajan 		req_id = __le32_to_cpu(mem_reqs[i]->req_id);
4514a925a376SVasanthakumar Thiagarajan 		num_units = __le32_to_cpu(mem_reqs[i]->num_units);
4515a925a376SVasanthakumar Thiagarajan 		unit_size = __le32_to_cpu(mem_reqs[i]->unit_size);
4516a925a376SVasanthakumar Thiagarajan 		num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info);
4517a925a376SVasanthakumar Thiagarajan 
4518a925a376SVasanthakumar Thiagarajan 		if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
4519a925a376SVasanthakumar Thiagarajan 			if (ar->num_active_peers)
4520a925a376SVasanthakumar Thiagarajan 				num_units = ar->num_active_peers + 1;
4521a925a376SVasanthakumar Thiagarajan 			else
4522a925a376SVasanthakumar Thiagarajan 				num_units = ar->max_num_peers + 1;
4523a925a376SVasanthakumar Thiagarajan 		} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4524a925a376SVasanthakumar Thiagarajan 			num_units = ar->max_num_peers + 1;
4525a925a376SVasanthakumar Thiagarajan 		} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
4526a925a376SVasanthakumar Thiagarajan 			num_units = ar->max_num_vdevs + 1;
4527a925a376SVasanthakumar Thiagarajan 		}
4528a925a376SVasanthakumar Thiagarajan 
4529a925a376SVasanthakumar Thiagarajan 		found = false;
4530a925a376SVasanthakumar Thiagarajan 		for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
4531a925a376SVasanthakumar Thiagarajan 			if (ar->wmi.mem_chunks[j].req_id == req_id) {
4532a925a376SVasanthakumar Thiagarajan 				pool_size = num_units * round_up(unit_size, 4);
4533a925a376SVasanthakumar Thiagarajan 				if (ar->wmi.mem_chunks[j].len == pool_size) {
4534a925a376SVasanthakumar Thiagarajan 					found = true;
4535a925a376SVasanthakumar Thiagarajan 					break;
4536a925a376SVasanthakumar Thiagarajan 				}
4537a925a376SVasanthakumar Thiagarajan 			}
4538a925a376SVasanthakumar Thiagarajan 		}
4539a925a376SVasanthakumar Thiagarajan 		if (!found)
4540a925a376SVasanthakumar Thiagarajan 			return false;
4541a925a376SVasanthakumar Thiagarajan 	}
4542a925a376SVasanthakumar Thiagarajan 
4543a925a376SVasanthakumar Thiagarajan 	return true;
4544a925a376SVasanthakumar Thiagarajan }
4545a925a376SVasanthakumar Thiagarajan 
4546d7579d12SMichal Kazior static int
4547d7579d12SMichal Kazior ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
45485c01aa3dSMichal Kazior 				   struct wmi_svc_rdy_ev_arg *arg)
45495c01aa3dSMichal Kazior {
45505c01aa3dSMichal Kazior 	struct wmi_service_ready_event *ev;
45515c01aa3dSMichal Kazior 	size_t i, n;
45525c01aa3dSMichal Kazior 
45535c01aa3dSMichal Kazior 	if (skb->len < sizeof(*ev))
45545c01aa3dSMichal Kazior 		return -EPROTO;
45555c01aa3dSMichal Kazior 
45565c01aa3dSMichal Kazior 	ev = (void *)skb->data;
45575c01aa3dSMichal Kazior 	skb_pull(skb, sizeof(*ev));
45585c01aa3dSMichal Kazior 	arg->min_tx_power = ev->hw_min_tx_power;
45595c01aa3dSMichal Kazior 	arg->max_tx_power = ev->hw_max_tx_power;
45605c01aa3dSMichal Kazior 	arg->ht_cap = ev->ht_cap_info;
45615c01aa3dSMichal Kazior 	arg->vht_cap = ev->vht_cap_info;
45625c01aa3dSMichal Kazior 	arg->sw_ver0 = ev->sw_version;
45635c01aa3dSMichal Kazior 	arg->sw_ver1 = ev->sw_version_1;
45645c01aa3dSMichal Kazior 	arg->phy_capab = ev->phy_capability;
45655c01aa3dSMichal Kazior 	arg->num_rf_chains = ev->num_rf_chains;
45665c01aa3dSMichal Kazior 	arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
45675c01aa3dSMichal Kazior 	arg->num_mem_reqs = ev->num_mem_reqs;
45685c01aa3dSMichal Kazior 	arg->service_map = ev->wmi_service_bitmap;
45692a3e60d3SMichal Kazior 	arg->service_map_len = sizeof(ev->wmi_service_bitmap);
45705c01aa3dSMichal Kazior 
45715c01aa3dSMichal Kazior 	n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
45725c01aa3dSMichal Kazior 		  ARRAY_SIZE(arg->mem_reqs));
45735c01aa3dSMichal Kazior 	for (i = 0; i < n; i++)
45745c01aa3dSMichal Kazior 		arg->mem_reqs[i] = &ev->mem_reqs[i];
45755c01aa3dSMichal Kazior 
45765c01aa3dSMichal Kazior 	if (skb->len <
45775c01aa3dSMichal Kazior 	    __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
45785c01aa3dSMichal Kazior 		return -EPROTO;
45795c01aa3dSMichal Kazior 
45805c01aa3dSMichal Kazior 	return 0;
45815c01aa3dSMichal Kazior }
45825c01aa3dSMichal Kazior 
4583d7579d12SMichal Kazior static int
4584d7579d12SMichal Kazior ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
45855c01aa3dSMichal Kazior 				  struct wmi_svc_rdy_ev_arg *arg)
45865c01aa3dSMichal Kazior {
45875c01aa3dSMichal Kazior 	struct wmi_10x_service_ready_event *ev;
45885c01aa3dSMichal Kazior 	int i, n;
45895c01aa3dSMichal Kazior 
45905c01aa3dSMichal Kazior 	if (skb->len < sizeof(*ev))
45915c01aa3dSMichal Kazior 		return -EPROTO;
45925c01aa3dSMichal Kazior 
45935c01aa3dSMichal Kazior 	ev = (void *)skb->data;
45945c01aa3dSMichal Kazior 	skb_pull(skb, sizeof(*ev));
45955c01aa3dSMichal Kazior 	arg->min_tx_power = ev->hw_min_tx_power;
45965c01aa3dSMichal Kazior 	arg->max_tx_power = ev->hw_max_tx_power;
45975c01aa3dSMichal Kazior 	arg->ht_cap = ev->ht_cap_info;
45985c01aa3dSMichal Kazior 	arg->vht_cap = ev->vht_cap_info;
45995c01aa3dSMichal Kazior 	arg->sw_ver0 = ev->sw_version;
46005c01aa3dSMichal Kazior 	arg->phy_capab = ev->phy_capability;
46015c01aa3dSMichal Kazior 	arg->num_rf_chains = ev->num_rf_chains;
46025c01aa3dSMichal Kazior 	arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
46035c01aa3dSMichal Kazior 	arg->num_mem_reqs = ev->num_mem_reqs;
46045c01aa3dSMichal Kazior 	arg->service_map = ev->wmi_service_bitmap;
46052a3e60d3SMichal Kazior 	arg->service_map_len = sizeof(ev->wmi_service_bitmap);
46065c01aa3dSMichal Kazior 
46075c01aa3dSMichal Kazior 	n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
46085c01aa3dSMichal Kazior 		  ARRAY_SIZE(arg->mem_reqs));
46095c01aa3dSMichal Kazior 	for (i = 0; i < n; i++)
46105c01aa3dSMichal Kazior 		arg->mem_reqs[i] = &ev->mem_reqs[i];
46115c01aa3dSMichal Kazior 
46125c01aa3dSMichal Kazior 	if (skb->len <
46135c01aa3dSMichal Kazior 	    __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
46145c01aa3dSMichal Kazior 		return -EPROTO;
46155c01aa3dSMichal Kazior 
46165c01aa3dSMichal Kazior 	return 0;
46175c01aa3dSMichal Kazior }
46185c01aa3dSMichal Kazior 
4619c8ecfc1cSRaja Mani static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
46205e3dd157SKalle Valo {
4621c8ecfc1cSRaja Mani 	struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work);
4622c8ecfc1cSRaja Mani 	struct sk_buff *skb = ar->svc_rdy_skb;
46235c01aa3dSMichal Kazior 	struct wmi_svc_rdy_ev_arg arg = {};
46245c01aa3dSMichal Kazior 	u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
46255c01aa3dSMichal Kazior 	int ret;
4626a925a376SVasanthakumar Thiagarajan 	bool allocated;
46275e3dd157SKalle Valo 
4628c8ecfc1cSRaja Mani 	if (!skb) {
4629c8ecfc1cSRaja Mani 		ath10k_warn(ar, "invalid service ready event skb\n");
4630c8ecfc1cSRaja Mani 		return;
4631c8ecfc1cSRaja Mani 	}
4632c8ecfc1cSRaja Mani 
4633d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg);
46345c01aa3dSMichal Kazior 	if (ret) {
46355c01aa3dSMichal Kazior 		ath10k_warn(ar, "failed to parse service ready: %d\n", ret);
46365e3dd157SKalle Valo 		return;
46375e3dd157SKalle Valo 	}
46385e3dd157SKalle Valo 
4639d7579d12SMichal Kazior 	memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
4640d7579d12SMichal Kazior 	ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
4641d7579d12SMichal Kazior 			   arg.service_map_len);
4642d7579d12SMichal Kazior 
46435c01aa3dSMichal Kazior 	ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power);
46445c01aa3dSMichal Kazior 	ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power);
46455c01aa3dSMichal Kazior 	ar->ht_cap_info = __le32_to_cpu(arg.ht_cap);
46465c01aa3dSMichal Kazior 	ar->vht_cap_info = __le32_to_cpu(arg.vht_cap);
46475e3dd157SKalle Valo 	ar->fw_version_major =
46485c01aa3dSMichal Kazior 		(__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24;
46495c01aa3dSMichal Kazior 	ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff);
46505e3dd157SKalle Valo 	ar->fw_version_release =
46515c01aa3dSMichal Kazior 		(__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16;
46525c01aa3dSMichal Kazior 	ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff);
46535c01aa3dSMichal Kazior 	ar->phy_capability = __le32_to_cpu(arg.phy_capab);
46545c01aa3dSMichal Kazior 	ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains);
46555c01aa3dSMichal Kazior 	ar->ath_common.regulatory.current_rd = __le32_to_cpu(arg.eeprom_rd);
46565c01aa3dSMichal Kazior 
46575c01aa3dSMichal Kazior 	ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
46582a3e60d3SMichal Kazior 			arg.service_map, arg.service_map_len);
46598865bee4SMichal Kazior 
46605c8726ecSRaja Mani 	if (ar->num_rf_chains > ar->max_spatial_stream) {
46617aa7a72aSMichal Kazior 		ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n",
46625c8726ecSRaja Mani 			    ar->num_rf_chains, ar->max_spatial_stream);
46635c8726ecSRaja Mani 		ar->num_rf_chains = ar->max_spatial_stream;
46648865bee4SMichal Kazior 	}
46655e3dd157SKalle Valo 
4666166de3f1SRajkumar Manoharan 	if (!ar->cfg_tx_chainmask) {
4667166de3f1SRajkumar Manoharan 		ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
4668166de3f1SRajkumar Manoharan 		ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
4669166de3f1SRajkumar Manoharan 	}
4670fdb959c7SMichal Kazior 
46715e3dd157SKalle Valo 	if (strlen(ar->hw->wiphy->fw_version) == 0) {
46725e3dd157SKalle Valo 		snprintf(ar->hw->wiphy->fw_version,
46735e3dd157SKalle Valo 			 sizeof(ar->hw->wiphy->fw_version),
46745e3dd157SKalle Valo 			 "%u.%u.%u.%u",
46755e3dd157SKalle Valo 			 ar->fw_version_major,
46765e3dd157SKalle Valo 			 ar->fw_version_minor,
46775e3dd157SKalle Valo 			 ar->fw_version_release,
46785e3dd157SKalle Valo 			 ar->fw_version_build);
46795e3dd157SKalle Valo 	}
46805e3dd157SKalle Valo 
46815c01aa3dSMichal Kazior 	num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs);
46825c01aa3dSMichal Kazior 	if (num_mem_reqs > WMI_MAX_MEM_REQS) {
46837aa7a72aSMichal Kazior 		ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n",
4684b3effe61SBartosz Markowski 			    num_mem_reqs);
4685b3effe61SBartosz Markowski 		return;
46866f97d256SBartosz Markowski 	}
46876f97d256SBartosz Markowski 
4688b0399417SRaja Mani 	if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) {
468999ad1cbaSMichal Kazior 		if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
4690c4cdf753SKalle Valo 			     ar->running_fw->fw_file.fw_features))
469199ad1cbaSMichal Kazior 			ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC +
46925699a6f2SRaja Mani 					       ar->max_num_vdevs;
469399ad1cbaSMichal Kazior 		else
469499ad1cbaSMichal Kazior 			ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
469599ad1cbaSMichal Kazior 					       ar->max_num_vdevs;
469699ad1cbaSMichal Kazior 
469799ad1cbaSMichal Kazior 		ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
46985699a6f2SRaja Mani 				    ar->max_num_vdevs;
4699b0399417SRaja Mani 		ar->num_tids = ar->num_active_peers * 2;
4700b0399417SRaja Mani 		ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
4701b0399417SRaja Mani 	}
4702b0399417SRaja Mani 
4703b0399417SRaja Mani 	/* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE
4704b0399417SRaja Mani 	 * and WMI_SERVICE_IRAM_TIDS, etc.
4705b0399417SRaja Mani 	 */
4706b0399417SRaja Mani 
4707a925a376SVasanthakumar Thiagarajan 	allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
4708a925a376SVasanthakumar Thiagarajan 						     num_mem_reqs);
4709a925a376SVasanthakumar Thiagarajan 	if (allocated)
4710a925a376SVasanthakumar Thiagarajan 		goto skip_mem_alloc;
4711a925a376SVasanthakumar Thiagarajan 
4712a925a376SVasanthakumar Thiagarajan 	/* Either this event is received during boot time or there is a change
4713a925a376SVasanthakumar Thiagarajan 	 * in memory requirement from firmware when compared to last request.
4714a925a376SVasanthakumar Thiagarajan 	 * Free any old memory and do a fresh allocation based on the current
4715a925a376SVasanthakumar Thiagarajan 	 * memory requirement.
4716a925a376SVasanthakumar Thiagarajan 	 */
4717a925a376SVasanthakumar Thiagarajan 	ath10k_wmi_free_host_mem(ar);
4718a925a376SVasanthakumar Thiagarajan 
4719b3effe61SBartosz Markowski 	for (i = 0; i < num_mem_reqs; ++i) {
47205c01aa3dSMichal Kazior 		req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id);
47215c01aa3dSMichal Kazior 		num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units);
47225c01aa3dSMichal Kazior 		unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size);
47235c01aa3dSMichal Kazior 		num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info);
4724b3effe61SBartosz Markowski 
4725b0399417SRaja Mani 		if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
4726b0399417SRaja Mani 			if (ar->num_active_peers)
4727b0399417SRaja Mani 				num_units = ar->num_active_peers + 1;
4728b0399417SRaja Mani 			else
4729b0399417SRaja Mani 				num_units = ar->max_num_peers + 1;
4730b0399417SRaja Mani 		} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4731b3effe61SBartosz Markowski 			/* number of units to allocate is number of
4732b3effe61SBartosz Markowski 			 * peers, 1 extra for self peer on target */
4733b3effe61SBartosz Markowski 			/* this needs to be tied, host and target
4734b3effe61SBartosz Markowski 			 * can get out of sync */
4735b0399417SRaja Mani 			num_units = ar->max_num_peers + 1;
4736b0399417SRaja Mani 		} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
4737b0399417SRaja Mani 			num_units = ar->max_num_vdevs + 1;
4738b0399417SRaja Mani 		}
4739b3effe61SBartosz Markowski 
47407aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
4741b3effe61SBartosz Markowski 			   "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
4742b3effe61SBartosz Markowski 			   req_id,
47435c01aa3dSMichal Kazior 			   __le32_to_cpu(arg.mem_reqs[i]->num_units),
4744b3effe61SBartosz Markowski 			   num_unit_info,
4745b3effe61SBartosz Markowski 			   unit_size,
4746b3effe61SBartosz Markowski 			   num_units);
4747b3effe61SBartosz Markowski 
4748b3effe61SBartosz Markowski 		ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
4749b3effe61SBartosz Markowski 						unit_size);
4750b3effe61SBartosz Markowski 		if (ret)
4751b3effe61SBartosz Markowski 			return;
4752b3effe61SBartosz Markowski 	}
4753b3effe61SBartosz Markowski 
4754a925a376SVasanthakumar Thiagarajan skip_mem_alloc:
47557aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
4756ca996ec5SMichal Kazior 		   "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",
47575c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.min_tx_power),
47585c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.max_tx_power),
47595c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.ht_cap),
47605c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.vht_cap),
47615c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.sw_ver0),
47625c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.sw_ver1),
4763ca996ec5SMichal Kazior 		   __le32_to_cpu(arg.fw_build),
47645c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.phy_capab),
47655c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.num_rf_chains),
47665c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.eeprom_rd),
47675c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.num_mem_reqs));
47686f97d256SBartosz Markowski 
4769c8ecfc1cSRaja Mani 	dev_kfree_skb(skb);
4770c8ecfc1cSRaja Mani 	ar->svc_rdy_skb = NULL;
47716f97d256SBartosz Markowski 	complete(&ar->wmi.service_ready);
47726f97d256SBartosz Markowski }
47736f97d256SBartosz Markowski 
4774c8ecfc1cSRaja Mani void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb)
4775c8ecfc1cSRaja Mani {
4776c8ecfc1cSRaja Mani 	ar->svc_rdy_skb = skb;
4777c8ecfc1cSRaja Mani 	queue_work(ar->workqueue_aux, &ar->svc_rdy_work);
4778c8ecfc1cSRaja Mani }
4779c8ecfc1cSRaja Mani 
4780d7579d12SMichal Kazior static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
478132653cf1SMichal Kazior 				     struct wmi_rdy_ev_arg *arg)
478232653cf1SMichal Kazior {
478332653cf1SMichal Kazior 	struct wmi_ready_event *ev = (void *)skb->data;
478432653cf1SMichal Kazior 
478532653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
478632653cf1SMichal Kazior 		return -EPROTO;
478732653cf1SMichal Kazior 
478832653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
478932653cf1SMichal Kazior 	arg->sw_version = ev->sw_version;
479032653cf1SMichal Kazior 	arg->abi_version = ev->abi_version;
479132653cf1SMichal Kazior 	arg->status = ev->status;
479232653cf1SMichal Kazior 	arg->mac_addr = ev->mac_addr.addr;
479332653cf1SMichal Kazior 
479432653cf1SMichal Kazior 	return 0;
479532653cf1SMichal Kazior }
479632653cf1SMichal Kazior 
4797c1a4654aSMichal Kazior static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
4798c1a4654aSMichal Kazior 				      struct wmi_roam_ev_arg *arg)
4799c1a4654aSMichal Kazior {
4800c1a4654aSMichal Kazior 	struct wmi_roam_ev *ev = (void *)skb->data;
4801c1a4654aSMichal Kazior 
4802c1a4654aSMichal Kazior 	if (skb->len < sizeof(*ev))
4803c1a4654aSMichal Kazior 		return -EPROTO;
4804c1a4654aSMichal Kazior 
4805c1a4654aSMichal Kazior 	skb_pull(skb, sizeof(*ev));
4806c1a4654aSMichal Kazior 	arg->vdev_id = ev->vdev_id;
4807c1a4654aSMichal Kazior 	arg->reason = ev->reason;
4808c1a4654aSMichal Kazior 
4809c1a4654aSMichal Kazior 	return 0;
4810c1a4654aSMichal Kazior }
4811c1a4654aSMichal Kazior 
481284d4911bSMichal Kazior static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar,
481384d4911bSMichal Kazior 				      struct sk_buff *skb,
481484d4911bSMichal Kazior 				      struct wmi_echo_ev_arg *arg)
481584d4911bSMichal Kazior {
481684d4911bSMichal Kazior 	struct wmi_echo_event *ev = (void *)skb->data;
481784d4911bSMichal Kazior 
481884d4911bSMichal Kazior 	arg->value = ev->value;
481984d4911bSMichal Kazior 
482084d4911bSMichal Kazior 	return 0;
482184d4911bSMichal Kazior }
482284d4911bSMichal Kazior 
48230226d602SMichal Kazior int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb)
48245e3dd157SKalle Valo {
482532653cf1SMichal Kazior 	struct wmi_rdy_ev_arg arg = {};
482632653cf1SMichal Kazior 	int ret;
48275e3dd157SKalle Valo 
4828d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_rdy(ar, skb, &arg);
482932653cf1SMichal Kazior 	if (ret) {
483032653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse ready event: %d\n", ret);
483132653cf1SMichal Kazior 		return ret;
483232653cf1SMichal Kazior 	}
48335e3dd157SKalle Valo 
48347aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
483532653cf1SMichal Kazior 		   "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
483632653cf1SMichal Kazior 		   __le32_to_cpu(arg.sw_version),
483732653cf1SMichal Kazior 		   __le32_to_cpu(arg.abi_version),
483832653cf1SMichal Kazior 		   arg.mac_addr,
483932653cf1SMichal Kazior 		   __le32_to_cpu(arg.status));
48405e3dd157SKalle Valo 
484132653cf1SMichal Kazior 	ether_addr_copy(ar->mac_addr, arg.mac_addr);
48425e3dd157SKalle Valo 	complete(&ar->wmi.unified_ready);
48435e3dd157SKalle Valo 	return 0;
48445e3dd157SKalle Valo }
48455e3dd157SKalle Valo 
4846a57a6a27SRajkumar Manoharan static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
4847a57a6a27SRajkumar Manoharan {
4848a57a6a27SRajkumar Manoharan 	const struct wmi_pdev_temperature_event *ev;
4849a57a6a27SRajkumar Manoharan 
4850a57a6a27SRajkumar Manoharan 	ev = (struct wmi_pdev_temperature_event *)skb->data;
4851a57a6a27SRajkumar Manoharan 	if (WARN_ON(skb->len < sizeof(*ev)))
4852a57a6a27SRajkumar Manoharan 		return -EPROTO;
4853a57a6a27SRajkumar Manoharan 
4854ac2953fcSRajkumar Manoharan 	ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature));
4855a57a6a27SRajkumar Manoharan 	return 0;
4856a57a6a27SRajkumar Manoharan }
4857a57a6a27SRajkumar Manoharan 
485889d2d183SRajkumar Manoharan static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar,
485989d2d183SRajkumar Manoharan 					       struct sk_buff *skb)
486089d2d183SRajkumar Manoharan {
486189d2d183SRajkumar Manoharan 	struct wmi_pdev_bss_chan_info_event *ev;
4862fa7937e3SRajkumar Manoharan 	struct survey_info *survey;
486389d2d183SRajkumar Manoharan 	u64 busy, total, tx, rx, rx_bss;
486489d2d183SRajkumar Manoharan 	u32 freq, noise_floor;
4865fa7937e3SRajkumar Manoharan 	u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz;
4866fa7937e3SRajkumar Manoharan 	int idx;
486789d2d183SRajkumar Manoharan 
486889d2d183SRajkumar Manoharan 	ev = (struct wmi_pdev_bss_chan_info_event *)skb->data;
486989d2d183SRajkumar Manoharan 	if (WARN_ON(skb->len < sizeof(*ev)))
487089d2d183SRajkumar Manoharan 		return -EPROTO;
487189d2d183SRajkumar Manoharan 
487289d2d183SRajkumar Manoharan 	freq        = __le32_to_cpu(ev->freq);
487389d2d183SRajkumar Manoharan 	noise_floor = __le32_to_cpu(ev->noise_floor);
487489d2d183SRajkumar Manoharan 	busy        = __le64_to_cpu(ev->cycle_busy);
487589d2d183SRajkumar Manoharan 	total       = __le64_to_cpu(ev->cycle_total);
487689d2d183SRajkumar Manoharan 	tx          = __le64_to_cpu(ev->cycle_tx);
487789d2d183SRajkumar Manoharan 	rx          = __le64_to_cpu(ev->cycle_rx);
487889d2d183SRajkumar Manoharan 	rx_bss      = __le64_to_cpu(ev->cycle_rx_bss);
487989d2d183SRajkumar Manoharan 
488089d2d183SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
488189d2d183SRajkumar Manoharan 		   "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n",
488289d2d183SRajkumar Manoharan 		   freq, noise_floor, busy, total, tx, rx, rx_bss);
488389d2d183SRajkumar Manoharan 
4884fa7937e3SRajkumar Manoharan 	spin_lock_bh(&ar->data_lock);
4885fa7937e3SRajkumar Manoharan 	idx = freq_to_idx(ar, freq);
4886fa7937e3SRajkumar Manoharan 	if (idx >= ARRAY_SIZE(ar->survey)) {
4887fa7937e3SRajkumar Manoharan 		ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n",
4888fa7937e3SRajkumar Manoharan 			    freq, idx);
4889fa7937e3SRajkumar Manoharan 		goto exit;
4890fa7937e3SRajkumar Manoharan 	}
4891fa7937e3SRajkumar Manoharan 
4892fa7937e3SRajkumar Manoharan 	survey = &ar->survey[idx];
4893fa7937e3SRajkumar Manoharan 
4894fa7937e3SRajkumar Manoharan 	survey->noise     = noise_floor;
4895fa7937e3SRajkumar Manoharan 	survey->time      = div_u64(total, cc_freq_hz);
4896fa7937e3SRajkumar Manoharan 	survey->time_busy = div_u64(busy, cc_freq_hz);
4897fa7937e3SRajkumar Manoharan 	survey->time_rx   = div_u64(rx_bss, cc_freq_hz);
4898fa7937e3SRajkumar Manoharan 	survey->time_tx   = div_u64(tx, cc_freq_hz);
4899fa7937e3SRajkumar Manoharan 	survey->filled   |= (SURVEY_INFO_NOISE_DBM |
4900fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME |
4901fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME_BUSY |
4902fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME_RX |
4903fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME_TX);
4904fa7937e3SRajkumar Manoharan exit:
4905fa7937e3SRajkumar Manoharan 	spin_unlock_bh(&ar->data_lock);
4906fa7937e3SRajkumar Manoharan 	complete(&ar->bss_survey_done);
490789d2d183SRajkumar Manoharan 	return 0;
490889d2d183SRajkumar Manoharan }
490989d2d183SRajkumar Manoharan 
4910d7579d12SMichal Kazior static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb)
49115e3dd157SKalle Valo {
49125e3dd157SKalle Valo 	struct wmi_cmd_hdr *cmd_hdr;
49135e3dd157SKalle Valo 	enum wmi_event_id id;
49145e3dd157SKalle Valo 
49155e3dd157SKalle Valo 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
49165e3dd157SKalle Valo 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
49175e3dd157SKalle Valo 
49185e3dd157SKalle Valo 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
4919469d479fSMichal Kazior 		goto out;
49205e3dd157SKalle Valo 
4921d35a6c18SMichal Kazior 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
49225e3dd157SKalle Valo 
49235e3dd157SKalle Valo 	switch (id) {
49245e3dd157SKalle Valo 	case WMI_MGMT_RX_EVENTID:
49255e3dd157SKalle Valo 		ath10k_wmi_event_mgmt_rx(ar, skb);
49265e3dd157SKalle Valo 		/* mgmt_rx() owns the skb now! */
49275e3dd157SKalle Valo 		return;
49285e3dd157SKalle Valo 	case WMI_SCAN_EVENTID:
49295e3dd157SKalle Valo 		ath10k_wmi_event_scan(ar, skb);
49305e3dd157SKalle Valo 		break;
49315e3dd157SKalle Valo 	case WMI_CHAN_INFO_EVENTID:
49325e3dd157SKalle Valo 		ath10k_wmi_event_chan_info(ar, skb);
49335e3dd157SKalle Valo 		break;
49345e3dd157SKalle Valo 	case WMI_ECHO_EVENTID:
49355e3dd157SKalle Valo 		ath10k_wmi_event_echo(ar, skb);
49365e3dd157SKalle Valo 		break;
49375e3dd157SKalle Valo 	case WMI_DEBUG_MESG_EVENTID:
49385e3dd157SKalle Valo 		ath10k_wmi_event_debug_mesg(ar, skb);
49395e3dd157SKalle Valo 		break;
49405e3dd157SKalle Valo 	case WMI_UPDATE_STATS_EVENTID:
49415e3dd157SKalle Valo 		ath10k_wmi_event_update_stats(ar, skb);
49425e3dd157SKalle Valo 		break;
49435e3dd157SKalle Valo 	case WMI_VDEV_START_RESP_EVENTID:
49445e3dd157SKalle Valo 		ath10k_wmi_event_vdev_start_resp(ar, skb);
49455e3dd157SKalle Valo 		break;
49465e3dd157SKalle Valo 	case WMI_VDEV_STOPPED_EVENTID:
49475e3dd157SKalle Valo 		ath10k_wmi_event_vdev_stopped(ar, skb);
49485e3dd157SKalle Valo 		break;
49495e3dd157SKalle Valo 	case WMI_PEER_STA_KICKOUT_EVENTID:
49505e3dd157SKalle Valo 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
49515e3dd157SKalle Valo 		break;
49525e3dd157SKalle Valo 	case WMI_HOST_SWBA_EVENTID:
49535e3dd157SKalle Valo 		ath10k_wmi_event_host_swba(ar, skb);
49545e3dd157SKalle Valo 		break;
49555e3dd157SKalle Valo 	case WMI_TBTTOFFSET_UPDATE_EVENTID:
49565e3dd157SKalle Valo 		ath10k_wmi_event_tbttoffset_update(ar, skb);
49575e3dd157SKalle Valo 		break;
49585e3dd157SKalle Valo 	case WMI_PHYERR_EVENTID:
49595e3dd157SKalle Valo 		ath10k_wmi_event_phyerr(ar, skb);
49605e3dd157SKalle Valo 		break;
49615e3dd157SKalle Valo 	case WMI_ROAM_EVENTID:
49625e3dd157SKalle Valo 		ath10k_wmi_event_roam(ar, skb);
49635e3dd157SKalle Valo 		break;
49645e3dd157SKalle Valo 	case WMI_PROFILE_MATCH:
49655e3dd157SKalle Valo 		ath10k_wmi_event_profile_match(ar, skb);
49665e3dd157SKalle Valo 		break;
49675e3dd157SKalle Valo 	case WMI_DEBUG_PRINT_EVENTID:
49685e3dd157SKalle Valo 		ath10k_wmi_event_debug_print(ar, skb);
49695e3dd157SKalle Valo 		break;
49705e3dd157SKalle Valo 	case WMI_PDEV_QVIT_EVENTID:
49715e3dd157SKalle Valo 		ath10k_wmi_event_pdev_qvit(ar, skb);
49725e3dd157SKalle Valo 		break;
49735e3dd157SKalle Valo 	case WMI_WLAN_PROFILE_DATA_EVENTID:
49745e3dd157SKalle Valo 		ath10k_wmi_event_wlan_profile_data(ar, skb);
49755e3dd157SKalle Valo 		break;
49765e3dd157SKalle Valo 	case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
49775e3dd157SKalle Valo 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
49785e3dd157SKalle Valo 		break;
49795e3dd157SKalle Valo 	case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
49805e3dd157SKalle Valo 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
49815e3dd157SKalle Valo 		break;
49825e3dd157SKalle Valo 	case WMI_RTT_ERROR_REPORT_EVENTID:
49835e3dd157SKalle Valo 		ath10k_wmi_event_rtt_error_report(ar, skb);
49845e3dd157SKalle Valo 		break;
49855e3dd157SKalle Valo 	case WMI_WOW_WAKEUP_HOST_EVENTID:
49865e3dd157SKalle Valo 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
49875e3dd157SKalle Valo 		break;
49885e3dd157SKalle Valo 	case WMI_DCS_INTERFERENCE_EVENTID:
49895e3dd157SKalle Valo 		ath10k_wmi_event_dcs_interference(ar, skb);
49905e3dd157SKalle Valo 		break;
49915e3dd157SKalle Valo 	case WMI_PDEV_TPC_CONFIG_EVENTID:
49925e3dd157SKalle Valo 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
49935e3dd157SKalle Valo 		break;
49945e3dd157SKalle Valo 	case WMI_PDEV_FTM_INTG_EVENTID:
49955e3dd157SKalle Valo 		ath10k_wmi_event_pdev_ftm_intg(ar, skb);
49965e3dd157SKalle Valo 		break;
49975e3dd157SKalle Valo 	case WMI_GTK_OFFLOAD_STATUS_EVENTID:
49985e3dd157SKalle Valo 		ath10k_wmi_event_gtk_offload_status(ar, skb);
49995e3dd157SKalle Valo 		break;
50005e3dd157SKalle Valo 	case WMI_GTK_REKEY_FAIL_EVENTID:
50015e3dd157SKalle Valo 		ath10k_wmi_event_gtk_rekey_fail(ar, skb);
50025e3dd157SKalle Valo 		break;
50035e3dd157SKalle Valo 	case WMI_TX_DELBA_COMPLETE_EVENTID:
50045e3dd157SKalle Valo 		ath10k_wmi_event_delba_complete(ar, skb);
50055e3dd157SKalle Valo 		break;
50065e3dd157SKalle Valo 	case WMI_TX_ADDBA_COMPLETE_EVENTID:
50075e3dd157SKalle Valo 		ath10k_wmi_event_addba_complete(ar, skb);
50085e3dd157SKalle Valo 		break;
50095e3dd157SKalle Valo 	case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
50105e3dd157SKalle Valo 		ath10k_wmi_event_vdev_install_key_complete(ar, skb);
50115e3dd157SKalle Valo 		break;
50125e3dd157SKalle Valo 	case WMI_SERVICE_READY_EVENTID:
5013b34d2b3dSMichal Kazior 		ath10k_wmi_event_service_ready(ar, skb);
5014c8ecfc1cSRaja Mani 		return;
50155e3dd157SKalle Valo 	case WMI_READY_EVENTID:
5016b34d2b3dSMichal Kazior 		ath10k_wmi_event_ready(ar, skb);
50175e3dd157SKalle Valo 		break;
50185e3dd157SKalle Valo 	default:
50197aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
50205e3dd157SKalle Valo 		break;
50215e3dd157SKalle Valo 	}
50225e3dd157SKalle Valo 
5023469d479fSMichal Kazior out:
50245e3dd157SKalle Valo 	dev_kfree_skb(skb);
50255e3dd157SKalle Valo }
50265e3dd157SKalle Valo 
5027d7579d12SMichal Kazior static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb)
50288a6618b0SBartosz Markowski {
50298a6618b0SBartosz Markowski 	struct wmi_cmd_hdr *cmd_hdr;
50308a6618b0SBartosz Markowski 	enum wmi_10x_event_id id;
503143d2a30fSKalle Valo 	bool consumed;
50328a6618b0SBartosz Markowski 
50338a6618b0SBartosz Markowski 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
50348a6618b0SBartosz Markowski 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
50358a6618b0SBartosz Markowski 
50368a6618b0SBartosz Markowski 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5037469d479fSMichal Kazior 		goto out;
50388a6618b0SBartosz Markowski 
5039d35a6c18SMichal Kazior 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
50408a6618b0SBartosz Markowski 
504143d2a30fSKalle Valo 	consumed = ath10k_tm_event_wmi(ar, id, skb);
504243d2a30fSKalle Valo 
504343d2a30fSKalle Valo 	/* Ready event must be handled normally also in UTF mode so that we
504443d2a30fSKalle Valo 	 * know the UTF firmware has booted, others we are just bypass WMI
504543d2a30fSKalle Valo 	 * events to testmode.
504643d2a30fSKalle Valo 	 */
504743d2a30fSKalle Valo 	if (consumed && id != WMI_10X_READY_EVENTID) {
504843d2a30fSKalle Valo 		ath10k_dbg(ar, ATH10K_DBG_WMI,
504943d2a30fSKalle Valo 			   "wmi testmode consumed 0x%x\n", id);
505043d2a30fSKalle Valo 		goto out;
505143d2a30fSKalle Valo 	}
505243d2a30fSKalle Valo 
50538a6618b0SBartosz Markowski 	switch (id) {
50548a6618b0SBartosz Markowski 	case WMI_10X_MGMT_RX_EVENTID:
50558a6618b0SBartosz Markowski 		ath10k_wmi_event_mgmt_rx(ar, skb);
50568a6618b0SBartosz Markowski 		/* mgmt_rx() owns the skb now! */
50578a6618b0SBartosz Markowski 		return;
50588a6618b0SBartosz Markowski 	case WMI_10X_SCAN_EVENTID:
50598a6618b0SBartosz Markowski 		ath10k_wmi_event_scan(ar, skb);
50608a6618b0SBartosz Markowski 		break;
50618a6618b0SBartosz Markowski 	case WMI_10X_CHAN_INFO_EVENTID:
50628a6618b0SBartosz Markowski 		ath10k_wmi_event_chan_info(ar, skb);
50638a6618b0SBartosz Markowski 		break;
50648a6618b0SBartosz Markowski 	case WMI_10X_ECHO_EVENTID:
50658a6618b0SBartosz Markowski 		ath10k_wmi_event_echo(ar, skb);
50668a6618b0SBartosz Markowski 		break;
50678a6618b0SBartosz Markowski 	case WMI_10X_DEBUG_MESG_EVENTID:
50688a6618b0SBartosz Markowski 		ath10k_wmi_event_debug_mesg(ar, skb);
50698a6618b0SBartosz Markowski 		break;
50708a6618b0SBartosz Markowski 	case WMI_10X_UPDATE_STATS_EVENTID:
50718a6618b0SBartosz Markowski 		ath10k_wmi_event_update_stats(ar, skb);
50728a6618b0SBartosz Markowski 		break;
50738a6618b0SBartosz Markowski 	case WMI_10X_VDEV_START_RESP_EVENTID:
50748a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_start_resp(ar, skb);
50758a6618b0SBartosz Markowski 		break;
50768a6618b0SBartosz Markowski 	case WMI_10X_VDEV_STOPPED_EVENTID:
50778a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_stopped(ar, skb);
50788a6618b0SBartosz Markowski 		break;
50798a6618b0SBartosz Markowski 	case WMI_10X_PEER_STA_KICKOUT_EVENTID:
50808a6618b0SBartosz Markowski 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
50818a6618b0SBartosz Markowski 		break;
50828a6618b0SBartosz Markowski 	case WMI_10X_HOST_SWBA_EVENTID:
50838a6618b0SBartosz Markowski 		ath10k_wmi_event_host_swba(ar, skb);
50848a6618b0SBartosz Markowski 		break;
50858a6618b0SBartosz Markowski 	case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
50868a6618b0SBartosz Markowski 		ath10k_wmi_event_tbttoffset_update(ar, skb);
50878a6618b0SBartosz Markowski 		break;
50888a6618b0SBartosz Markowski 	case WMI_10X_PHYERR_EVENTID:
50898a6618b0SBartosz Markowski 		ath10k_wmi_event_phyerr(ar, skb);
50908a6618b0SBartosz Markowski 		break;
50918a6618b0SBartosz Markowski 	case WMI_10X_ROAM_EVENTID:
50928a6618b0SBartosz Markowski 		ath10k_wmi_event_roam(ar, skb);
50938a6618b0SBartosz Markowski 		break;
50948a6618b0SBartosz Markowski 	case WMI_10X_PROFILE_MATCH:
50958a6618b0SBartosz Markowski 		ath10k_wmi_event_profile_match(ar, skb);
50968a6618b0SBartosz Markowski 		break;
50978a6618b0SBartosz Markowski 	case WMI_10X_DEBUG_PRINT_EVENTID:
50988a6618b0SBartosz Markowski 		ath10k_wmi_event_debug_print(ar, skb);
50998a6618b0SBartosz Markowski 		break;
51008a6618b0SBartosz Markowski 	case WMI_10X_PDEV_QVIT_EVENTID:
51018a6618b0SBartosz Markowski 		ath10k_wmi_event_pdev_qvit(ar, skb);
51028a6618b0SBartosz Markowski 		break;
51038a6618b0SBartosz Markowski 	case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
51048a6618b0SBartosz Markowski 		ath10k_wmi_event_wlan_profile_data(ar, skb);
51058a6618b0SBartosz Markowski 		break;
51068a6618b0SBartosz Markowski 	case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
51078a6618b0SBartosz Markowski 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
51088a6618b0SBartosz Markowski 		break;
51098a6618b0SBartosz Markowski 	case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
51108a6618b0SBartosz Markowski 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
51118a6618b0SBartosz Markowski 		break;
51128a6618b0SBartosz Markowski 	case WMI_10X_RTT_ERROR_REPORT_EVENTID:
51138a6618b0SBartosz Markowski 		ath10k_wmi_event_rtt_error_report(ar, skb);
51148a6618b0SBartosz Markowski 		break;
51158a6618b0SBartosz Markowski 	case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
51168a6618b0SBartosz Markowski 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
51178a6618b0SBartosz Markowski 		break;
51188a6618b0SBartosz Markowski 	case WMI_10X_DCS_INTERFERENCE_EVENTID:
51198a6618b0SBartosz Markowski 		ath10k_wmi_event_dcs_interference(ar, skb);
51208a6618b0SBartosz Markowski 		break;
51218a6618b0SBartosz Markowski 	case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
51228a6618b0SBartosz Markowski 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
51238a6618b0SBartosz Markowski 		break;
51248a6618b0SBartosz Markowski 	case WMI_10X_INST_RSSI_STATS_EVENTID:
51258a6618b0SBartosz Markowski 		ath10k_wmi_event_inst_rssi_stats(ar, skb);
51268a6618b0SBartosz Markowski 		break;
51278a6618b0SBartosz Markowski 	case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
51288a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_standby_req(ar, skb);
51298a6618b0SBartosz Markowski 		break;
51308a6618b0SBartosz Markowski 	case WMI_10X_VDEV_RESUME_REQ_EVENTID:
51318a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_resume_req(ar, skb);
51328a6618b0SBartosz Markowski 		break;
51338a6618b0SBartosz Markowski 	case WMI_10X_SERVICE_READY_EVENTID:
5134b34d2b3dSMichal Kazior 		ath10k_wmi_event_service_ready(ar, skb);
5135c8ecfc1cSRaja Mani 		return;
51368a6618b0SBartosz Markowski 	case WMI_10X_READY_EVENTID:
5137b34d2b3dSMichal Kazior 		ath10k_wmi_event_ready(ar, skb);
51388a6618b0SBartosz Markowski 		break;
513943d2a30fSKalle Valo 	case WMI_10X_PDEV_UTF_EVENTID:
514043d2a30fSKalle Valo 		/* ignore utf events */
514143d2a30fSKalle Valo 		break;
51428a6618b0SBartosz Markowski 	default:
51437aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
51448a6618b0SBartosz Markowski 		break;
51458a6618b0SBartosz Markowski 	}
51468a6618b0SBartosz Markowski 
514743d2a30fSKalle Valo out:
51488a6618b0SBartosz Markowski 	dev_kfree_skb(skb);
51498a6618b0SBartosz Markowski }
51508a6618b0SBartosz Markowski 
5151d7579d12SMichal Kazior static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
515224c88f78SMichal Kazior {
515324c88f78SMichal Kazior 	struct wmi_cmd_hdr *cmd_hdr;
515424c88f78SMichal Kazior 	enum wmi_10_2_event_id id;
5155d912fc09STamizh chelvam 	bool consumed;
515624c88f78SMichal Kazior 
515724c88f78SMichal Kazior 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
515824c88f78SMichal Kazior 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
515924c88f78SMichal Kazior 
516024c88f78SMichal Kazior 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5161469d479fSMichal Kazior 		goto out;
516224c88f78SMichal Kazior 
5163d35a6c18SMichal Kazior 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
516424c88f78SMichal Kazior 
5165d912fc09STamizh chelvam 	consumed = ath10k_tm_event_wmi(ar, id, skb);
5166d912fc09STamizh chelvam 
5167d912fc09STamizh chelvam 	/* Ready event must be handled normally also in UTF mode so that we
5168d912fc09STamizh chelvam 	 * know the UTF firmware has booted, others we are just bypass WMI
5169d912fc09STamizh chelvam 	 * events to testmode.
5170d912fc09STamizh chelvam 	 */
5171d912fc09STamizh chelvam 	if (consumed && id != WMI_10_2_READY_EVENTID) {
5172d912fc09STamizh chelvam 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5173d912fc09STamizh chelvam 			   "wmi testmode consumed 0x%x\n", id);
5174d912fc09STamizh chelvam 		goto out;
5175d912fc09STamizh chelvam 	}
5176d912fc09STamizh chelvam 
517724c88f78SMichal Kazior 	switch (id) {
517824c88f78SMichal Kazior 	case WMI_10_2_MGMT_RX_EVENTID:
517924c88f78SMichal Kazior 		ath10k_wmi_event_mgmt_rx(ar, skb);
518024c88f78SMichal Kazior 		/* mgmt_rx() owns the skb now! */
518124c88f78SMichal Kazior 		return;
518224c88f78SMichal Kazior 	case WMI_10_2_SCAN_EVENTID:
518324c88f78SMichal Kazior 		ath10k_wmi_event_scan(ar, skb);
518424c88f78SMichal Kazior 		break;
518524c88f78SMichal Kazior 	case WMI_10_2_CHAN_INFO_EVENTID:
518624c88f78SMichal Kazior 		ath10k_wmi_event_chan_info(ar, skb);
518724c88f78SMichal Kazior 		break;
518824c88f78SMichal Kazior 	case WMI_10_2_ECHO_EVENTID:
518924c88f78SMichal Kazior 		ath10k_wmi_event_echo(ar, skb);
519024c88f78SMichal Kazior 		break;
519124c88f78SMichal Kazior 	case WMI_10_2_DEBUG_MESG_EVENTID:
519224c88f78SMichal Kazior 		ath10k_wmi_event_debug_mesg(ar, skb);
519324c88f78SMichal Kazior 		break;
519424c88f78SMichal Kazior 	case WMI_10_2_UPDATE_STATS_EVENTID:
519524c88f78SMichal Kazior 		ath10k_wmi_event_update_stats(ar, skb);
519624c88f78SMichal Kazior 		break;
519724c88f78SMichal Kazior 	case WMI_10_2_VDEV_START_RESP_EVENTID:
519824c88f78SMichal Kazior 		ath10k_wmi_event_vdev_start_resp(ar, skb);
519924c88f78SMichal Kazior 		break;
520024c88f78SMichal Kazior 	case WMI_10_2_VDEV_STOPPED_EVENTID:
520124c88f78SMichal Kazior 		ath10k_wmi_event_vdev_stopped(ar, skb);
520224c88f78SMichal Kazior 		break;
520324c88f78SMichal Kazior 	case WMI_10_2_PEER_STA_KICKOUT_EVENTID:
520424c88f78SMichal Kazior 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
520524c88f78SMichal Kazior 		break;
520624c88f78SMichal Kazior 	case WMI_10_2_HOST_SWBA_EVENTID:
520724c88f78SMichal Kazior 		ath10k_wmi_event_host_swba(ar, skb);
520824c88f78SMichal Kazior 		break;
520924c88f78SMichal Kazior 	case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID:
521024c88f78SMichal Kazior 		ath10k_wmi_event_tbttoffset_update(ar, skb);
521124c88f78SMichal Kazior 		break;
521224c88f78SMichal Kazior 	case WMI_10_2_PHYERR_EVENTID:
521324c88f78SMichal Kazior 		ath10k_wmi_event_phyerr(ar, skb);
521424c88f78SMichal Kazior 		break;
521524c88f78SMichal Kazior 	case WMI_10_2_ROAM_EVENTID:
521624c88f78SMichal Kazior 		ath10k_wmi_event_roam(ar, skb);
521724c88f78SMichal Kazior 		break;
521824c88f78SMichal Kazior 	case WMI_10_2_PROFILE_MATCH:
521924c88f78SMichal Kazior 		ath10k_wmi_event_profile_match(ar, skb);
522024c88f78SMichal Kazior 		break;
522124c88f78SMichal Kazior 	case WMI_10_2_DEBUG_PRINT_EVENTID:
522224c88f78SMichal Kazior 		ath10k_wmi_event_debug_print(ar, skb);
522324c88f78SMichal Kazior 		break;
522424c88f78SMichal Kazior 	case WMI_10_2_PDEV_QVIT_EVENTID:
522524c88f78SMichal Kazior 		ath10k_wmi_event_pdev_qvit(ar, skb);
522624c88f78SMichal Kazior 		break;
522724c88f78SMichal Kazior 	case WMI_10_2_WLAN_PROFILE_DATA_EVENTID:
522824c88f78SMichal Kazior 		ath10k_wmi_event_wlan_profile_data(ar, skb);
522924c88f78SMichal Kazior 		break;
523024c88f78SMichal Kazior 	case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID:
523124c88f78SMichal Kazior 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
523224c88f78SMichal Kazior 		break;
523324c88f78SMichal Kazior 	case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID:
523424c88f78SMichal Kazior 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
523524c88f78SMichal Kazior 		break;
523624c88f78SMichal Kazior 	case WMI_10_2_RTT_ERROR_REPORT_EVENTID:
523724c88f78SMichal Kazior 		ath10k_wmi_event_rtt_error_report(ar, skb);
523824c88f78SMichal Kazior 		break;
523924c88f78SMichal Kazior 	case WMI_10_2_WOW_WAKEUP_HOST_EVENTID:
524024c88f78SMichal Kazior 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
524124c88f78SMichal Kazior 		break;
524224c88f78SMichal Kazior 	case WMI_10_2_DCS_INTERFERENCE_EVENTID:
524324c88f78SMichal Kazior 		ath10k_wmi_event_dcs_interference(ar, skb);
524424c88f78SMichal Kazior 		break;
524524c88f78SMichal Kazior 	case WMI_10_2_PDEV_TPC_CONFIG_EVENTID:
524624c88f78SMichal Kazior 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
524724c88f78SMichal Kazior 		break;
524824c88f78SMichal Kazior 	case WMI_10_2_INST_RSSI_STATS_EVENTID:
524924c88f78SMichal Kazior 		ath10k_wmi_event_inst_rssi_stats(ar, skb);
525024c88f78SMichal Kazior 		break;
525124c88f78SMichal Kazior 	case WMI_10_2_VDEV_STANDBY_REQ_EVENTID:
525224c88f78SMichal Kazior 		ath10k_wmi_event_vdev_standby_req(ar, skb);
525324c88f78SMichal Kazior 		break;
525424c88f78SMichal Kazior 	case WMI_10_2_VDEV_RESUME_REQ_EVENTID:
525524c88f78SMichal Kazior 		ath10k_wmi_event_vdev_resume_req(ar, skb);
525624c88f78SMichal Kazior 		break;
525724c88f78SMichal Kazior 	case WMI_10_2_SERVICE_READY_EVENTID:
5258b34d2b3dSMichal Kazior 		ath10k_wmi_event_service_ready(ar, skb);
5259c8ecfc1cSRaja Mani 		return;
526024c88f78SMichal Kazior 	case WMI_10_2_READY_EVENTID:
5261b34d2b3dSMichal Kazior 		ath10k_wmi_event_ready(ar, skb);
526224c88f78SMichal Kazior 		break;
5263a57a6a27SRajkumar Manoharan 	case WMI_10_2_PDEV_TEMPERATURE_EVENTID:
5264a57a6a27SRajkumar Manoharan 		ath10k_wmi_event_temperature(ar, skb);
5265a57a6a27SRajkumar Manoharan 		break;
526689d2d183SRajkumar Manoharan 	case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID:
526789d2d183SRajkumar Manoharan 		ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
526889d2d183SRajkumar Manoharan 		break;
526924c88f78SMichal Kazior 	case WMI_10_2_RTT_KEEPALIVE_EVENTID:
527024c88f78SMichal Kazior 	case WMI_10_2_GPIO_INPUT_EVENTID:
527124c88f78SMichal Kazior 	case WMI_10_2_PEER_RATECODE_LIST_EVENTID:
527224c88f78SMichal Kazior 	case WMI_10_2_GENERIC_BUFFER_EVENTID:
527324c88f78SMichal Kazior 	case WMI_10_2_MCAST_BUF_RELEASE_EVENTID:
527424c88f78SMichal Kazior 	case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID:
527524c88f78SMichal Kazior 	case WMI_10_2_WDS_PEER_EVENTID:
52767aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
527724c88f78SMichal Kazior 			   "received event id %d not implemented\n", id);
527824c88f78SMichal Kazior 		break;
527924c88f78SMichal Kazior 	default:
52807aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
528124c88f78SMichal Kazior 		break;
528224c88f78SMichal Kazior 	}
528324c88f78SMichal Kazior 
5284469d479fSMichal Kazior out:
528524c88f78SMichal Kazior 	dev_kfree_skb(skb);
528624c88f78SMichal Kazior }
52878a6618b0SBartosz Markowski 
52881c092961SRaja Mani static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
52891c092961SRaja Mani {
52901c092961SRaja Mani 	struct wmi_cmd_hdr *cmd_hdr;
52911c092961SRaja Mani 	enum wmi_10_4_event_id id;
5292d912fc09STamizh chelvam 	bool consumed;
52931c092961SRaja Mani 
52941c092961SRaja Mani 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
52951c092961SRaja Mani 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
52961c092961SRaja Mani 
52971c092961SRaja Mani 	if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr)))
52981c092961SRaja Mani 		goto out;
52991c092961SRaja Mani 
53001c092961SRaja Mani 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
53011c092961SRaja Mani 
5302d912fc09STamizh chelvam 	consumed = ath10k_tm_event_wmi(ar, id, skb);
5303d912fc09STamizh chelvam 
5304d912fc09STamizh chelvam 	/* Ready event must be handled normally also in UTF mode so that we
5305d912fc09STamizh chelvam 	 * know the UTF firmware has booted, others we are just bypass WMI
5306d912fc09STamizh chelvam 	 * events to testmode.
5307d912fc09STamizh chelvam 	 */
5308d912fc09STamizh chelvam 	if (consumed && id != WMI_10_4_READY_EVENTID) {
5309d912fc09STamizh chelvam 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5310d912fc09STamizh chelvam 			   "wmi testmode consumed 0x%x\n", id);
5311d912fc09STamizh chelvam 		goto out;
5312d912fc09STamizh chelvam 	}
5313d912fc09STamizh chelvam 
53141c092961SRaja Mani 	switch (id) {
53151c092961SRaja Mani 	case WMI_10_4_MGMT_RX_EVENTID:
53161c092961SRaja Mani 		ath10k_wmi_event_mgmt_rx(ar, skb);
53171c092961SRaja Mani 		/* mgmt_rx() owns the skb now! */
53181c092961SRaja Mani 		return;
5319373b48cfSRaja Mani 	case WMI_10_4_ECHO_EVENTID:
5320373b48cfSRaja Mani 		ath10k_wmi_event_echo(ar, skb);
5321373b48cfSRaja Mani 		break;
5322373b48cfSRaja Mani 	case WMI_10_4_DEBUG_MESG_EVENTID:
5323373b48cfSRaja Mani 		ath10k_wmi_event_debug_mesg(ar, skb);
5324373b48cfSRaja Mani 		break;
5325373b48cfSRaja Mani 	case WMI_10_4_SERVICE_READY_EVENTID:
5326373b48cfSRaja Mani 		ath10k_wmi_event_service_ready(ar, skb);
5327c8ecfc1cSRaja Mani 		return;
5328b2297baaSRaja Mani 	case WMI_10_4_SCAN_EVENTID:
5329b2297baaSRaja Mani 		ath10k_wmi_event_scan(ar, skb);
5330b2297baaSRaja Mani 		break;
5331b2297baaSRaja Mani 	case WMI_10_4_CHAN_INFO_EVENTID:
5332b2297baaSRaja Mani 		ath10k_wmi_event_chan_info(ar, skb);
5333b2297baaSRaja Mani 		break;
53342b0a2e0dSRaja Mani 	case WMI_10_4_PHYERR_EVENTID:
53352b0a2e0dSRaja Mani 		ath10k_wmi_event_phyerr(ar, skb);
53362b0a2e0dSRaja Mani 		break;
5337d02e752fSRaja Mani 	case WMI_10_4_READY_EVENTID:
5338d02e752fSRaja Mani 		ath10k_wmi_event_ready(ar, skb);
5339d02e752fSRaja Mani 		break;
5340373b48cfSRaja Mani 	case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
5341373b48cfSRaja Mani 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
5342373b48cfSRaja Mani 		break;
5343343bf960SMohammed Shafi Shajakhan 	case WMI_10_4_ROAM_EVENTID:
5344343bf960SMohammed Shafi Shajakhan 		ath10k_wmi_event_roam(ar, skb);
5345343bf960SMohammed Shafi Shajakhan 		break;
53463cec3be3SRaja Mani 	case WMI_10_4_HOST_SWBA_EVENTID:
53473cec3be3SRaja Mani 		ath10k_wmi_event_host_swba(ar, skb);
53483cec3be3SRaja Mani 		break;
5349373b48cfSRaja Mani 	case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID:
5350373b48cfSRaja Mani 		ath10k_wmi_event_tbttoffset_update(ar, skb);
5351373b48cfSRaja Mani 		break;
5352373b48cfSRaja Mani 	case WMI_10_4_DEBUG_PRINT_EVENTID:
5353373b48cfSRaja Mani 		ath10k_wmi_event_debug_print(ar, skb);
5354373b48cfSRaja Mani 		break;
5355373b48cfSRaja Mani 	case WMI_10_4_VDEV_START_RESP_EVENTID:
5356373b48cfSRaja Mani 		ath10k_wmi_event_vdev_start_resp(ar, skb);
5357373b48cfSRaja Mani 		break;
5358373b48cfSRaja Mani 	case WMI_10_4_VDEV_STOPPED_EVENTID:
5359373b48cfSRaja Mani 		ath10k_wmi_event_vdev_stopped(ar, skb);
5360373b48cfSRaja Mani 		break;
5361373b48cfSRaja Mani 	case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
536236bd39bbSVasanthakumar Thiagarajan 	case WMI_10_4_PEER_RATECODE_LIST_EVENTID:
5363373b48cfSRaja Mani 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5364373b48cfSRaja Mani 			   "received event id %d not implemented\n", id);
5365373b48cfSRaja Mani 		break;
536698dd2b92SManikanta Pubbisetty 	case WMI_10_4_UPDATE_STATS_EVENTID:
536798dd2b92SManikanta Pubbisetty 		ath10k_wmi_event_update_stats(ar, skb);
536898dd2b92SManikanta Pubbisetty 		break;
53696dd46348STamizh chelvam 	case WMI_10_4_PDEV_TEMPERATURE_EVENTID:
53706dd46348STamizh chelvam 		ath10k_wmi_event_temperature(ar, skb);
53716dd46348STamizh chelvam 		break;
537289d2d183SRajkumar Manoharan 	case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID:
537389d2d183SRajkumar Manoharan 		ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
537489d2d183SRajkumar Manoharan 		break;
53751c092961SRaja Mani 	default:
53761c092961SRaja Mani 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
53771c092961SRaja Mani 		break;
53781c092961SRaja Mani 	}
53791c092961SRaja Mani 
53801c092961SRaja Mani out:
53811c092961SRaja Mani 	dev_kfree_skb(skb);
53821c092961SRaja Mani }
53831c092961SRaja Mani 
5384ce42870eSBartosz Markowski static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
5385ce42870eSBartosz Markowski {
5386d7579d12SMichal Kazior 	int ret;
5387d7579d12SMichal Kazior 
5388d7579d12SMichal Kazior 	ret = ath10k_wmi_rx(ar, skb);
5389d7579d12SMichal Kazior 	if (ret)
5390d7579d12SMichal Kazior 		ath10k_warn(ar, "failed to process wmi rx: %d\n", ret);
539124c88f78SMichal Kazior }
5392ce42870eSBartosz Markowski 
539395bf21f9SMichal Kazior int ath10k_wmi_connect(struct ath10k *ar)
53945e3dd157SKalle Valo {
53955e3dd157SKalle Valo 	int status;
53965e3dd157SKalle Valo 	struct ath10k_htc_svc_conn_req conn_req;
53975e3dd157SKalle Valo 	struct ath10k_htc_svc_conn_resp conn_resp;
53985e3dd157SKalle Valo 
53995e3dd157SKalle Valo 	memset(&conn_req, 0, sizeof(conn_req));
54005e3dd157SKalle Valo 	memset(&conn_resp, 0, sizeof(conn_resp));
54015e3dd157SKalle Valo 
54025e3dd157SKalle Valo 	/* these fields are the same for all service endpoints */
54035e3dd157SKalle Valo 	conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
54045e3dd157SKalle Valo 	conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
5405be8b3943SMichal Kazior 	conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;
54065e3dd157SKalle Valo 
54075e3dd157SKalle Valo 	/* connect to control service */
54085e3dd157SKalle Valo 	conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;
54095e3dd157SKalle Valo 
5410cd003fadSMichal Kazior 	status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
54115e3dd157SKalle Valo 	if (status) {
54127aa7a72aSMichal Kazior 		ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n",
54135e3dd157SKalle Valo 			    status);
54145e3dd157SKalle Valo 		return status;
54155e3dd157SKalle Valo 	}
54165e3dd157SKalle Valo 
54175e3dd157SKalle Valo 	ar->wmi.eid = conn_resp.eid;
54185e3dd157SKalle Valo 	return 0;
54195e3dd157SKalle Valo }
54205e3dd157SKalle Valo 
5421d7579d12SMichal Kazior static struct sk_buff *
5422d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
5423d7579d12SMichal Kazior 			      u16 ctl2g, u16 ctl5g,
5424d7579d12SMichal Kazior 			      enum wmi_dfs_region dfs_reg)
54255e3dd157SKalle Valo {
54265e3dd157SKalle Valo 	struct wmi_pdev_set_regdomain_cmd *cmd;
54275e3dd157SKalle Valo 	struct sk_buff *skb;
54285e3dd157SKalle Valo 
54297aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
54305e3dd157SKalle Valo 	if (!skb)
5431d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
54325e3dd157SKalle Valo 
54335e3dd157SKalle Valo 	cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data;
54345e3dd157SKalle Valo 	cmd->reg_domain = __cpu_to_le32(rd);
54355e3dd157SKalle Valo 	cmd->reg_domain_2G = __cpu_to_le32(rd2g);
54365e3dd157SKalle Valo 	cmd->reg_domain_5G = __cpu_to_le32(rd5g);
54375e3dd157SKalle Valo 	cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
54385e3dd157SKalle Valo 	cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
54395e3dd157SKalle Valo 
54407aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
54415e3dd157SKalle Valo 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
54425e3dd157SKalle Valo 		   rd, rd2g, rd5g, ctl2g, ctl5g);
5443d7579d12SMichal Kazior 	return skb;
54445e3dd157SKalle Valo }
54455e3dd157SKalle Valo 
5446d7579d12SMichal Kazior static struct sk_buff *
5447d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16
5448d7579d12SMichal Kazior 				  rd5g, u16 ctl2g, u16 ctl5g,
5449821af6aeSMarek Puzyniak 				  enum wmi_dfs_region dfs_reg)
5450821af6aeSMarek Puzyniak {
5451821af6aeSMarek Puzyniak 	struct wmi_pdev_set_regdomain_cmd_10x *cmd;
5452821af6aeSMarek Puzyniak 	struct sk_buff *skb;
5453821af6aeSMarek Puzyniak 
54547aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5455821af6aeSMarek Puzyniak 	if (!skb)
5456d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
5457821af6aeSMarek Puzyniak 
5458821af6aeSMarek Puzyniak 	cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data;
5459821af6aeSMarek Puzyniak 	cmd->reg_domain = __cpu_to_le32(rd);
5460821af6aeSMarek Puzyniak 	cmd->reg_domain_2G = __cpu_to_le32(rd2g);
5461821af6aeSMarek Puzyniak 	cmd->reg_domain_5G = __cpu_to_le32(rd5g);
5462821af6aeSMarek Puzyniak 	cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
5463821af6aeSMarek Puzyniak 	cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
5464821af6aeSMarek Puzyniak 	cmd->dfs_domain = __cpu_to_le32(dfs_reg);
5465821af6aeSMarek Puzyniak 
54667aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5467821af6aeSMarek Puzyniak 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
5468821af6aeSMarek Puzyniak 		   rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
5469d7579d12SMichal Kazior 	return skb;
5470821af6aeSMarek Puzyniak }
5471821af6aeSMarek Puzyniak 
5472d7579d12SMichal Kazior static struct sk_buff *
5473d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt)
54745e3dd157SKalle Valo {
54755e3dd157SKalle Valo 	struct wmi_pdev_suspend_cmd *cmd;
54765e3dd157SKalle Valo 	struct sk_buff *skb;
54775e3dd157SKalle Valo 
54787aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
54795e3dd157SKalle Valo 	if (!skb)
5480d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
54815e3dd157SKalle Valo 
54825e3dd157SKalle Valo 	cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
548300f5482bSMarek Puzyniak 	cmd->suspend_opt = __cpu_to_le32(suspend_opt);
54845e3dd157SKalle Valo 
5485d7579d12SMichal Kazior 	return skb;
54865e3dd157SKalle Valo }
54875e3dd157SKalle Valo 
5488d7579d12SMichal Kazior static struct sk_buff *
5489d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar)
54905e3dd157SKalle Valo {
54915e3dd157SKalle Valo 	struct sk_buff *skb;
54925e3dd157SKalle Valo 
54937aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, 0);
5494d7579d12SMichal Kazior 	if (!skb)
5495d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
54965e3dd157SKalle Valo 
5497d7579d12SMichal Kazior 	return skb;
54985e3dd157SKalle Valo }
54995e3dd157SKalle Valo 
5500d7579d12SMichal Kazior static struct sk_buff *
5501d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
55025e3dd157SKalle Valo {
55035e3dd157SKalle Valo 	struct wmi_pdev_set_param_cmd *cmd;
55045e3dd157SKalle Valo 	struct sk_buff *skb;
55055e3dd157SKalle Valo 
5506226a339bSBartosz Markowski 	if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
55077aa7a72aSMichal Kazior 		ath10k_warn(ar, "pdev param %d not supported by firmware\n",
55087aa7a72aSMichal Kazior 			    id);
5509d7579d12SMichal Kazior 		return ERR_PTR(-EOPNOTSUPP);
5510226a339bSBartosz Markowski 	}
5511226a339bSBartosz Markowski 
55127aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
55135e3dd157SKalle Valo 	if (!skb)
5514d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
55155e3dd157SKalle Valo 
55165e3dd157SKalle Valo 	cmd = (struct wmi_pdev_set_param_cmd *)skb->data;
55175e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(id);
55185e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(value);
55195e3dd157SKalle Valo 
55207aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
55215e3dd157SKalle Valo 		   id, value);
5522d7579d12SMichal Kazior 	return skb;
55235e3dd157SKalle Valo }
55245e3dd157SKalle Valo 
55250226d602SMichal Kazior void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
5526cf9fca8fSMichal Kazior 				    struct wmi_host_mem_chunks *chunks)
5527cf9fca8fSMichal Kazior {
5528cf9fca8fSMichal Kazior 	struct host_memory_chunk *chunk;
5529cf9fca8fSMichal Kazior 	int i;
5530cf9fca8fSMichal Kazior 
5531cf9fca8fSMichal Kazior 	chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks);
5532cf9fca8fSMichal Kazior 
5533cf9fca8fSMichal Kazior 	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
5534cf9fca8fSMichal Kazior 		chunk = &chunks->items[i];
5535cf9fca8fSMichal Kazior 		chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
5536cf9fca8fSMichal Kazior 		chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len);
5537cf9fca8fSMichal Kazior 		chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
5538cf9fca8fSMichal Kazior 
5539cf9fca8fSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5540cf9fca8fSMichal Kazior 			   "wmi chunk %d len %d requested, addr 0x%llx\n",
5541cf9fca8fSMichal Kazior 			   i,
5542cf9fca8fSMichal Kazior 			   ar->wmi.mem_chunks[i].len,
5543cf9fca8fSMichal Kazior 			   (unsigned long long)ar->wmi.mem_chunks[i].paddr);
5544cf9fca8fSMichal Kazior 	}
5545cf9fca8fSMichal Kazior }
5546cf9fca8fSMichal Kazior 
5547d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar)
55485e3dd157SKalle Valo {
55495e3dd157SKalle Valo 	struct wmi_init_cmd *cmd;
55505e3dd157SKalle Valo 	struct sk_buff *buf;
55515e3dd157SKalle Valo 	struct wmi_resource_config config = {};
5552b3effe61SBartosz Markowski 	u32 len, val;
55535e3dd157SKalle Valo 
55545e3dd157SKalle Valo 	config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
5555cfd1061eSMichal Kazior 	config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS);
55565e3dd157SKalle Valo 	config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS);
55575e3dd157SKalle Valo 
55585e3dd157SKalle Valo 	config.num_offload_reorder_bufs =
55595e3dd157SKalle Valo 		__cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS);
55605e3dd157SKalle Valo 
55615e3dd157SKalle Valo 	config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS);
55625e3dd157SKalle Valo 	config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS);
55635e3dd157SKalle Valo 	config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT);
55645e3dd157SKalle Valo 	config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK);
55655e3dd157SKalle Valo 	config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK);
55665e3dd157SKalle Valo 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
55675e3dd157SKalle Valo 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
55685e3dd157SKalle Valo 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
55695e3dd157SKalle Valo 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI);
5570ccec9038SDavid Liu 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
55715e3dd157SKalle Valo 	config.scan_max_pending_reqs =
55725e3dd157SKalle Valo 		__cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS);
55735e3dd157SKalle Valo 
55745e3dd157SKalle Valo 	config.bmiss_offload_max_vdev =
55755e3dd157SKalle Valo 		__cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV);
55765e3dd157SKalle Valo 
55775e3dd157SKalle Valo 	config.roam_offload_max_vdev =
55785e3dd157SKalle Valo 		__cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV);
55795e3dd157SKalle Valo 
55805e3dd157SKalle Valo 	config.roam_offload_max_ap_profiles =
55815e3dd157SKalle Valo 		__cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES);
55825e3dd157SKalle Valo 
55835e3dd157SKalle Valo 	config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS);
55845e3dd157SKalle Valo 	config.num_mcast_table_elems =
55855e3dd157SKalle Valo 		__cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS);
55865e3dd157SKalle Valo 
55875e3dd157SKalle Valo 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE);
55885e3dd157SKalle Valo 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE);
55895e3dd157SKalle Valo 	config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES);
55905e3dd157SKalle Valo 	config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE);
55915e3dd157SKalle Valo 	config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM);
55925e3dd157SKalle Valo 
55935e3dd157SKalle Valo 	val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
55945e3dd157SKalle Valo 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
55955e3dd157SKalle Valo 
55965e3dd157SKalle Valo 	config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG);
55975e3dd157SKalle Valo 
55985e3dd157SKalle Valo 	config.gtk_offload_max_vdev =
55995e3dd157SKalle Valo 		__cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV);
56005e3dd157SKalle Valo 
56015e3dd157SKalle Valo 	config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
56025e3dd157SKalle Valo 	config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
56035e3dd157SKalle Valo 
5604b3effe61SBartosz Markowski 	len = sizeof(*cmd) +
5605b3effe61SBartosz Markowski 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
5606b3effe61SBartosz Markowski 
56077aa7a72aSMichal Kazior 	buf = ath10k_wmi_alloc_skb(ar, len);
56085e3dd157SKalle Valo 	if (!buf)
5609d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
56105e3dd157SKalle Valo 
56115e3dd157SKalle Valo 	cmd = (struct wmi_init_cmd *)buf->data;
5612b3effe61SBartosz Markowski 
56135e3dd157SKalle Valo 	memcpy(&cmd->resource_config, &config, sizeof(config));
5614cf9fca8fSMichal Kazior 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
56155e3dd157SKalle Valo 
56167aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
5617d7579d12SMichal Kazior 	return buf;
56185e3dd157SKalle Valo }
56195e3dd157SKalle Valo 
5620d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar)
562112b2b9e3SBartosz Markowski {
562212b2b9e3SBartosz Markowski 	struct wmi_init_cmd_10x *cmd;
562312b2b9e3SBartosz Markowski 	struct sk_buff *buf;
562412b2b9e3SBartosz Markowski 	struct wmi_resource_config_10x config = {};
562512b2b9e3SBartosz Markowski 	u32 len, val;
562612b2b9e3SBartosz Markowski 
5627ec6a73f0SBartosz Markowski 	config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
5628ec6a73f0SBartosz Markowski 	config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
5629ec6a73f0SBartosz Markowski 	config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
5630ec6a73f0SBartosz Markowski 	config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
5631ec6a73f0SBartosz Markowski 	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
5632ec6a73f0SBartosz Markowski 	config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
5633ec6a73f0SBartosz Markowski 	config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
5634ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5635ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5636ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
5637ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
5638ccec9038SDavid Liu 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
563912b2b9e3SBartosz Markowski 	config.scan_max_pending_reqs =
5640ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
564112b2b9e3SBartosz Markowski 
564212b2b9e3SBartosz Markowski 	config.bmiss_offload_max_vdev =
5643ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
564412b2b9e3SBartosz Markowski 
564512b2b9e3SBartosz Markowski 	config.roam_offload_max_vdev =
5646ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
564712b2b9e3SBartosz Markowski 
564812b2b9e3SBartosz Markowski 	config.roam_offload_max_ap_profiles =
5649ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
565012b2b9e3SBartosz Markowski 
5651ec6a73f0SBartosz Markowski 	config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
565212b2b9e3SBartosz Markowski 	config.num_mcast_table_elems =
5653ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
565412b2b9e3SBartosz Markowski 
5655ec6a73f0SBartosz Markowski 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
5656ec6a73f0SBartosz Markowski 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
5657ec6a73f0SBartosz Markowski 	config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
5658ec6a73f0SBartosz Markowski 	config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE);
5659ec6a73f0SBartosz Markowski 	config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
566012b2b9e3SBartosz Markowski 
5661ec6a73f0SBartosz Markowski 	val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
566212b2b9e3SBartosz Markowski 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
566312b2b9e3SBartosz Markowski 
5664ec6a73f0SBartosz Markowski 	config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
566512b2b9e3SBartosz Markowski 
5666ec6a73f0SBartosz Markowski 	config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
5667ec6a73f0SBartosz Markowski 	config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
566812b2b9e3SBartosz Markowski 
566912b2b9e3SBartosz Markowski 	len = sizeof(*cmd) +
567012b2b9e3SBartosz Markowski 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
567112b2b9e3SBartosz Markowski 
56727aa7a72aSMichal Kazior 	buf = ath10k_wmi_alloc_skb(ar, len);
567312b2b9e3SBartosz Markowski 	if (!buf)
5674d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
567512b2b9e3SBartosz Markowski 
567612b2b9e3SBartosz Markowski 	cmd = (struct wmi_init_cmd_10x *)buf->data;
567712b2b9e3SBartosz Markowski 
567812b2b9e3SBartosz Markowski 	memcpy(&cmd->resource_config, &config, sizeof(config));
5679cf9fca8fSMichal Kazior 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
568012b2b9e3SBartosz Markowski 
56817aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
5682d7579d12SMichal Kazior 	return buf;
568312b2b9e3SBartosz Markowski }
568412b2b9e3SBartosz Markowski 
5685d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
568624c88f78SMichal Kazior {
568724c88f78SMichal Kazior 	struct wmi_init_cmd_10_2 *cmd;
568824c88f78SMichal Kazior 	struct sk_buff *buf;
568924c88f78SMichal Kazior 	struct wmi_resource_config_10x config = {};
5690b6c8e287SSujith Manoharan 	u32 len, val, features;
569124c88f78SMichal Kazior 
569224c88f78SMichal Kazior 	config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
569324c88f78SMichal Kazior 	config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
5694cc61a1bbSMohammed Shafi Shajakhan 
5695cc61a1bbSMohammed Shafi Shajakhan 	if (ath10k_peer_stats_enabled(ar)) {
5696af9a6a3aSAnilkumar Kolli 		config.num_peers = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_PEERS);
5697af9a6a3aSAnilkumar Kolli 		config.num_tids = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_TIDS);
5698af9a6a3aSAnilkumar Kolli 	} else {
5699af9a6a3aSAnilkumar Kolli 		config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
570024c88f78SMichal Kazior 		config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
5701af9a6a3aSAnilkumar Kolli 	}
5702af9a6a3aSAnilkumar Kolli 
570324c88f78SMichal Kazior 	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
570424c88f78SMichal Kazior 	config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
570524c88f78SMichal Kazior 	config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
570624c88f78SMichal Kazior 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
570724c88f78SMichal Kazior 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
570824c88f78SMichal Kazior 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
570924c88f78SMichal Kazior 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
5710ccec9038SDavid Liu 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
571124c88f78SMichal Kazior 
571224c88f78SMichal Kazior 	config.scan_max_pending_reqs =
571324c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
571424c88f78SMichal Kazior 
571524c88f78SMichal Kazior 	config.bmiss_offload_max_vdev =
571624c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
571724c88f78SMichal Kazior 
571824c88f78SMichal Kazior 	config.roam_offload_max_vdev =
571924c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
572024c88f78SMichal Kazior 
572124c88f78SMichal Kazior 	config.roam_offload_max_ap_profiles =
572224c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
572324c88f78SMichal Kazior 
572424c88f78SMichal Kazior 	config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
572524c88f78SMichal Kazior 	config.num_mcast_table_elems =
572624c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
572724c88f78SMichal Kazior 
572824c88f78SMichal Kazior 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
572924c88f78SMichal Kazior 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
573024c88f78SMichal Kazior 	config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
5731f6603ff2SSujith Manoharan 	config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE);
573224c88f78SMichal Kazior 	config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
573324c88f78SMichal Kazior 
573424c88f78SMichal Kazior 	val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
573524c88f78SMichal Kazior 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
573624c88f78SMichal Kazior 
573724c88f78SMichal Kazior 	config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
573824c88f78SMichal Kazior 
573924c88f78SMichal Kazior 	config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
574024c88f78SMichal Kazior 	config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
574124c88f78SMichal Kazior 
574224c88f78SMichal Kazior 	len = sizeof(*cmd) +
574324c88f78SMichal Kazior 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
574424c88f78SMichal Kazior 
57457aa7a72aSMichal Kazior 	buf = ath10k_wmi_alloc_skb(ar, len);
574624c88f78SMichal Kazior 	if (!buf)
5747d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
574824c88f78SMichal Kazior 
574924c88f78SMichal Kazior 	cmd = (struct wmi_init_cmd_10_2 *)buf->data;
575024c88f78SMichal Kazior 
5751b6c8e287SSujith Manoharan 	features = WMI_10_2_RX_BATCH_MODE;
5752844fa572SYanbo Li 
5753844fa572SYanbo Li 	if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) &&
5754844fa572SYanbo Li 	    test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
5755de0c789bSYanbo Li 		features |= WMI_10_2_COEX_GPIO;
5756844fa572SYanbo Li 
5757cc61a1bbSMohammed Shafi Shajakhan 	if (ath10k_peer_stats_enabled(ar))
5758de46c015SMohammed Shafi Shajakhan 		features |= WMI_10_2_PEER_STATS;
5759de46c015SMohammed Shafi Shajakhan 
5760fa7937e3SRajkumar Manoharan 	if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map))
5761fa7937e3SRajkumar Manoharan 		features |= WMI_10_2_BSS_CHAN_INFO;
5762fa7937e3SRajkumar Manoharan 
5763b6c8e287SSujith Manoharan 	cmd->resource_config.feature_mask = __cpu_to_le32(features);
5764b6c8e287SSujith Manoharan 
576524c88f78SMichal Kazior 	memcpy(&cmd->resource_config.common, &config, sizeof(config));
5766cf9fca8fSMichal Kazior 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
576724c88f78SMichal Kazior 
57687aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
5769d7579d12SMichal Kazior 	return buf;
577012b2b9e3SBartosz Markowski }
577112b2b9e3SBartosz Markowski 
5772d1e52a8eSRaja Mani static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
5773d1e52a8eSRaja Mani {
5774d1e52a8eSRaja Mani 	struct wmi_init_cmd_10_4 *cmd;
5775d1e52a8eSRaja Mani 	struct sk_buff *buf;
5776d1e52a8eSRaja Mani 	struct wmi_resource_config_10_4 config = {};
5777d1e52a8eSRaja Mani 	u32 len;
5778d1e52a8eSRaja Mani 
5779d1e52a8eSRaja Mani 	config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
5780d1e52a8eSRaja Mani 	config.num_peers = __cpu_to_le32(ar->max_num_peers);
5781d1e52a8eSRaja Mani 	config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
5782d1e52a8eSRaja Mani 	config.num_tids = __cpu_to_le32(ar->num_tids);
5783d1e52a8eSRaja Mani 
5784d1e52a8eSRaja Mani 	config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS);
5785d1e52a8eSRaja Mani 	config.num_offload_reorder_buffs =
5786d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS);
5787d1e52a8eSRaja Mani 	config.num_peer_keys  = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS);
5788d1e52a8eSRaja Mani 	config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT);
57895699a6f2SRaja Mani 	config.tx_chain_mask  = __cpu_to_le32(ar->hw_params.tx_chain_mask);
57905699a6f2SRaja Mani 	config.rx_chain_mask  = __cpu_to_le32(ar->hw_params.rx_chain_mask);
5791d1e52a8eSRaja Mani 
5792d1e52a8eSRaja Mani 	config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
5793d1e52a8eSRaja Mani 	config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
5794d1e52a8eSRaja Mani 	config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
5795d1e52a8eSRaja Mani 	config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI);
5796d1e52a8eSRaja Mani 
5797bc27e8cdSPeter Oh 	config.rx_decap_mode	    = __cpu_to_le32(ar->wmi.rx_decap_mode);
5798d1e52a8eSRaja Mani 	config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS);
5799d1e52a8eSRaja Mani 	config.bmiss_offload_max_vdev =
5800d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV);
5801d1e52a8eSRaja Mani 	config.roam_offload_max_vdev  =
5802d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV);
5803d1e52a8eSRaja Mani 	config.roam_offload_max_ap_profiles =
5804d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES);
5805d1e52a8eSRaja Mani 	config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS);
5806d1e52a8eSRaja Mani 	config.num_mcast_table_elems =
5807d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS);
5808d1e52a8eSRaja Mani 
5809d1e52a8eSRaja Mani 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE);
5810d1e52a8eSRaja Mani 	config.tx_dbg_log_size  = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE);
5811d1e52a8eSRaja Mani 	config.num_wds_entries  = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES);
5812d1e52a8eSRaja Mani 	config.dma_burst_size   = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE);
5813d1e52a8eSRaja Mani 	config.mac_aggr_delim   = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM);
5814d1e52a8eSRaja Mani 
5815d1e52a8eSRaja Mani 	config.rx_skip_defrag_timeout_dup_detection_check =
5816d1e52a8eSRaja Mani 	  __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK);
5817d1e52a8eSRaja Mani 
5818d1e52a8eSRaja Mani 	config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG);
5819d1e52a8eSRaja Mani 	config.gtk_offload_max_vdev =
5820d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV);
58215699a6f2SRaja Mani 	config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx);
5822d1e52a8eSRaja Mani 	config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS);
5823d1e52a8eSRaja Mani 	config.max_peer_ext_stats =
5824d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS);
5825d1e52a8eSRaja Mani 	config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP);
5826d1e52a8eSRaja Mani 
5827d1e52a8eSRaja Mani 	config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE);
5828d1e52a8eSRaja Mani 	config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE);
5829d1e52a8eSRaja Mani 	config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE);
5830d1e52a8eSRaja Mani 	config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE);
5831d1e52a8eSRaja Mani 
5832d1e52a8eSRaja Mani 	config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE);
5833d1e52a8eSRaja Mani 	config.tt_support =
5834d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG);
5835d1e52a8eSRaja Mani 	config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG);
5836d1e52a8eSRaja Mani 	config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG);
5837d1e52a8eSRaja Mani 	config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG);
5838d1e52a8eSRaja Mani 
5839d1e52a8eSRaja Mani 	len = sizeof(*cmd) +
5840d1e52a8eSRaja Mani 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
5841d1e52a8eSRaja Mani 
5842d1e52a8eSRaja Mani 	buf = ath10k_wmi_alloc_skb(ar, len);
5843d1e52a8eSRaja Mani 	if (!buf)
5844d1e52a8eSRaja Mani 		return ERR_PTR(-ENOMEM);
5845d1e52a8eSRaja Mani 
5846d1e52a8eSRaja Mani 	cmd = (struct wmi_init_cmd_10_4 *)buf->data;
5847d1e52a8eSRaja Mani 	memcpy(&cmd->resource_config, &config, sizeof(config));
5848d1e52a8eSRaja Mani 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
5849d1e52a8eSRaja Mani 
5850d1e52a8eSRaja Mani 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
5851d1e52a8eSRaja Mani 	return buf;
5852d1e52a8eSRaja Mani }
5853d1e52a8eSRaja Mani 
58540226d602SMichal Kazior int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg)
58555e3dd157SKalle Valo {
5856a6aa5da3SMichal Kazior 	if (arg->ie_len && !arg->ie)
58575e3dd157SKalle Valo 		return -EINVAL;
5858a6aa5da3SMichal Kazior 	if (arg->n_channels && !arg->channels)
5859a6aa5da3SMichal Kazior 		return -EINVAL;
5860a6aa5da3SMichal Kazior 	if (arg->n_ssids && !arg->ssids)
5861a6aa5da3SMichal Kazior 		return -EINVAL;
5862a6aa5da3SMichal Kazior 	if (arg->n_bssids && !arg->bssids)
5863a6aa5da3SMichal Kazior 		return -EINVAL;
5864a6aa5da3SMichal Kazior 
58655e3dd157SKalle Valo 	if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN)
58665e3dd157SKalle Valo 		return -EINVAL;
5867a6aa5da3SMichal Kazior 	if (arg->n_channels > ARRAY_SIZE(arg->channels))
5868a6aa5da3SMichal Kazior 		return -EINVAL;
5869a6aa5da3SMichal Kazior 	if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID)
5870a6aa5da3SMichal Kazior 		return -EINVAL;
5871a6aa5da3SMichal Kazior 	if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID)
5872a6aa5da3SMichal Kazior 		return -EINVAL;
58735e3dd157SKalle Valo 
5874a6aa5da3SMichal Kazior 	return 0;
5875a6aa5da3SMichal Kazior }
5876a6aa5da3SMichal Kazior 
5877a6aa5da3SMichal Kazior static size_t
5878a6aa5da3SMichal Kazior ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg)
5879a6aa5da3SMichal Kazior {
5880a6aa5da3SMichal Kazior 	int len = 0;
5881a6aa5da3SMichal Kazior 
5882a6aa5da3SMichal Kazior 	if (arg->ie_len) {
58835e3dd157SKalle Valo 		len += sizeof(struct wmi_ie_data);
58845e3dd157SKalle Valo 		len += roundup(arg->ie_len, 4);
58855e3dd157SKalle Valo 	}
58865e3dd157SKalle Valo 
58875e3dd157SKalle Valo 	if (arg->n_channels) {
58885e3dd157SKalle Valo 		len += sizeof(struct wmi_chan_list);
58895e3dd157SKalle Valo 		len += sizeof(__le32) * arg->n_channels;
58905e3dd157SKalle Valo 	}
58915e3dd157SKalle Valo 
58925e3dd157SKalle Valo 	if (arg->n_ssids) {
58935e3dd157SKalle Valo 		len += sizeof(struct wmi_ssid_list);
58945e3dd157SKalle Valo 		len += sizeof(struct wmi_ssid) * arg->n_ssids;
58955e3dd157SKalle Valo 	}
58965e3dd157SKalle Valo 
58975e3dd157SKalle Valo 	if (arg->n_bssids) {
58985e3dd157SKalle Valo 		len += sizeof(struct wmi_bssid_list);
58995e3dd157SKalle Valo 		len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
59005e3dd157SKalle Valo 	}
59015e3dd157SKalle Valo 
59025e3dd157SKalle Valo 	return len;
59035e3dd157SKalle Valo }
59045e3dd157SKalle Valo 
59050226d602SMichal Kazior void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn,
59065e3dd157SKalle Valo 				      const struct wmi_start_scan_arg *arg)
59075e3dd157SKalle Valo {
59085e3dd157SKalle Valo 	u32 scan_id;
59095e3dd157SKalle Valo 	u32 scan_req_id;
59105e3dd157SKalle Valo 
59115e3dd157SKalle Valo 	scan_id  = WMI_HOST_SCAN_REQ_ID_PREFIX;
59125e3dd157SKalle Valo 	scan_id |= arg->scan_id;
59135e3dd157SKalle Valo 
59145e3dd157SKalle Valo 	scan_req_id  = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
59155e3dd157SKalle Valo 	scan_req_id |= arg->scan_req_id;
59165e3dd157SKalle Valo 
5917a6aa5da3SMichal Kazior 	cmn->scan_id            = __cpu_to_le32(scan_id);
5918a6aa5da3SMichal Kazior 	cmn->scan_req_id        = __cpu_to_le32(scan_req_id);
5919a6aa5da3SMichal Kazior 	cmn->vdev_id            = __cpu_to_le32(arg->vdev_id);
5920a6aa5da3SMichal Kazior 	cmn->scan_priority      = __cpu_to_le32(arg->scan_priority);
5921a6aa5da3SMichal Kazior 	cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events);
5922a6aa5da3SMichal Kazior 	cmn->dwell_time_active  = __cpu_to_le32(arg->dwell_time_active);
5923a6aa5da3SMichal Kazior 	cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive);
5924a6aa5da3SMichal Kazior 	cmn->min_rest_time      = __cpu_to_le32(arg->min_rest_time);
5925a6aa5da3SMichal Kazior 	cmn->max_rest_time      = __cpu_to_le32(arg->max_rest_time);
5926a6aa5da3SMichal Kazior 	cmn->repeat_probe_time  = __cpu_to_le32(arg->repeat_probe_time);
5927a6aa5da3SMichal Kazior 	cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time);
5928a6aa5da3SMichal Kazior 	cmn->idle_time          = __cpu_to_le32(arg->idle_time);
5929a6aa5da3SMichal Kazior 	cmn->max_scan_time      = __cpu_to_le32(arg->max_scan_time);
5930a6aa5da3SMichal Kazior 	cmn->probe_delay        = __cpu_to_le32(arg->probe_delay);
5931a6aa5da3SMichal Kazior 	cmn->scan_ctrl_flags    = __cpu_to_le32(arg->scan_ctrl_flags);
5932a6aa5da3SMichal Kazior }
59335e3dd157SKalle Valo 
5934a6aa5da3SMichal Kazior static void
5935a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs,
5936a6aa5da3SMichal Kazior 			       const struct wmi_start_scan_arg *arg)
5937a6aa5da3SMichal Kazior {
5938a6aa5da3SMichal Kazior 	struct wmi_ie_data *ie;
5939a6aa5da3SMichal Kazior 	struct wmi_chan_list *channels;
5940a6aa5da3SMichal Kazior 	struct wmi_ssid_list *ssids;
5941a6aa5da3SMichal Kazior 	struct wmi_bssid_list *bssids;
5942a6aa5da3SMichal Kazior 	void *ptr = tlvs->tlvs;
5943a6aa5da3SMichal Kazior 	int i;
59445e3dd157SKalle Valo 
59455e3dd157SKalle Valo 	if (arg->n_channels) {
5946a6aa5da3SMichal Kazior 		channels = ptr;
59475e3dd157SKalle Valo 		channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG);
59485e3dd157SKalle Valo 		channels->num_chan = __cpu_to_le32(arg->n_channels);
59495e3dd157SKalle Valo 
59505e3dd157SKalle Valo 		for (i = 0; i < arg->n_channels; i++)
595124c88f78SMichal Kazior 			channels->channel_list[i].freq =
595224c88f78SMichal Kazior 				__cpu_to_le16(arg->channels[i]);
59535e3dd157SKalle Valo 
5954a6aa5da3SMichal Kazior 		ptr += sizeof(*channels);
5955a6aa5da3SMichal Kazior 		ptr += sizeof(__le32) * arg->n_channels;
59565e3dd157SKalle Valo 	}
59575e3dd157SKalle Valo 
59585e3dd157SKalle Valo 	if (arg->n_ssids) {
5959a6aa5da3SMichal Kazior 		ssids = ptr;
59605e3dd157SKalle Valo 		ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG);
59615e3dd157SKalle Valo 		ssids->num_ssids = __cpu_to_le32(arg->n_ssids);
59625e3dd157SKalle Valo 
59635e3dd157SKalle Valo 		for (i = 0; i < arg->n_ssids; i++) {
59645e3dd157SKalle Valo 			ssids->ssids[i].ssid_len =
59655e3dd157SKalle Valo 				__cpu_to_le32(arg->ssids[i].len);
59665e3dd157SKalle Valo 			memcpy(&ssids->ssids[i].ssid,
59675e3dd157SKalle Valo 			       arg->ssids[i].ssid,
59685e3dd157SKalle Valo 			       arg->ssids[i].len);
59695e3dd157SKalle Valo 		}
59705e3dd157SKalle Valo 
5971a6aa5da3SMichal Kazior 		ptr += sizeof(*ssids);
5972a6aa5da3SMichal Kazior 		ptr += sizeof(struct wmi_ssid) * arg->n_ssids;
59735e3dd157SKalle Valo 	}
59745e3dd157SKalle Valo 
59755e3dd157SKalle Valo 	if (arg->n_bssids) {
5976a6aa5da3SMichal Kazior 		bssids = ptr;
59775e3dd157SKalle Valo 		bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG);
59785e3dd157SKalle Valo 		bssids->num_bssid = __cpu_to_le32(arg->n_bssids);
59795e3dd157SKalle Valo 
59805e3dd157SKalle Valo 		for (i = 0; i < arg->n_bssids; i++)
59818f4ffb7dSKalle Valo 			ether_addr_copy(bssids->bssid_list[i].addr,
59828f4ffb7dSKalle Valo 					arg->bssids[i].bssid);
59835e3dd157SKalle Valo 
5984a6aa5da3SMichal Kazior 		ptr += sizeof(*bssids);
5985a6aa5da3SMichal Kazior 		ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids;
59865e3dd157SKalle Valo 	}
59875e3dd157SKalle Valo 
59885e3dd157SKalle Valo 	if (arg->ie_len) {
5989a6aa5da3SMichal Kazior 		ie = ptr;
59905e3dd157SKalle Valo 		ie->tag = __cpu_to_le32(WMI_IE_TAG);
59915e3dd157SKalle Valo 		ie->ie_len = __cpu_to_le32(arg->ie_len);
59925e3dd157SKalle Valo 		memcpy(ie->ie_data, arg->ie, arg->ie_len);
59935e3dd157SKalle Valo 
5994a6aa5da3SMichal Kazior 		ptr += sizeof(*ie);
5995a6aa5da3SMichal Kazior 		ptr += roundup(arg->ie_len, 4);
5996a6aa5da3SMichal Kazior 	}
59975e3dd157SKalle Valo }
59985e3dd157SKalle Valo 
5999d7579d12SMichal Kazior static struct sk_buff *
6000d7579d12SMichal Kazior ath10k_wmi_op_gen_start_scan(struct ath10k *ar,
6001a6aa5da3SMichal Kazior 			     const struct wmi_start_scan_arg *arg)
6002a6aa5da3SMichal Kazior {
6003d7579d12SMichal Kazior 	struct wmi_start_scan_cmd *cmd;
6004a6aa5da3SMichal Kazior 	struct sk_buff *skb;
6005a6aa5da3SMichal Kazior 	size_t len;
6006a6aa5da3SMichal Kazior 	int ret;
6007a6aa5da3SMichal Kazior 
6008a6aa5da3SMichal Kazior 	ret = ath10k_wmi_start_scan_verify(arg);
6009a6aa5da3SMichal Kazior 	if (ret)
6010d7579d12SMichal Kazior 		return ERR_PTR(ret);
6011a6aa5da3SMichal Kazior 
6012d7579d12SMichal Kazior 	len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6013a6aa5da3SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
6014a6aa5da3SMichal Kazior 	if (!skb)
6015d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6016a6aa5da3SMichal Kazior 
6017a6aa5da3SMichal Kazior 	cmd = (struct wmi_start_scan_cmd *)skb->data;
6018a6aa5da3SMichal Kazior 
6019a6aa5da3SMichal Kazior 	ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6020a6aa5da3SMichal Kazior 	ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6021d7579d12SMichal Kazior 
6022d7579d12SMichal Kazior 	cmd->burst_duration_ms = __cpu_to_le32(0);
60235e3dd157SKalle Valo 
60247aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
6025d7579d12SMichal Kazior 	return skb;
6026d7579d12SMichal Kazior }
6027d7579d12SMichal Kazior 
6028d7579d12SMichal Kazior static struct sk_buff *
6029d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar,
6030d7579d12SMichal Kazior 				 const struct wmi_start_scan_arg *arg)
6031d7579d12SMichal Kazior {
6032d7579d12SMichal Kazior 	struct wmi_10x_start_scan_cmd *cmd;
6033d7579d12SMichal Kazior 	struct sk_buff *skb;
6034d7579d12SMichal Kazior 	size_t len;
6035d7579d12SMichal Kazior 	int ret;
6036d7579d12SMichal Kazior 
6037d7579d12SMichal Kazior 	ret = ath10k_wmi_start_scan_verify(arg);
6038d7579d12SMichal Kazior 	if (ret)
6039d7579d12SMichal Kazior 		return ERR_PTR(ret);
6040d7579d12SMichal Kazior 
6041d7579d12SMichal Kazior 	len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6042d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
6043d7579d12SMichal Kazior 	if (!skb)
6044d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6045d7579d12SMichal Kazior 
6046d7579d12SMichal Kazior 	cmd = (struct wmi_10x_start_scan_cmd *)skb->data;
6047d7579d12SMichal Kazior 
6048d7579d12SMichal Kazior 	ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6049d7579d12SMichal Kazior 	ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6050d7579d12SMichal Kazior 
6051d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
6052d7579d12SMichal Kazior 	return skb;
60535e3dd157SKalle Valo }
60545e3dd157SKalle Valo 
60555e3dd157SKalle Valo void ath10k_wmi_start_scan_init(struct ath10k *ar,
60565e3dd157SKalle Valo 				struct wmi_start_scan_arg *arg)
60575e3dd157SKalle Valo {
60585e3dd157SKalle Valo 	/* setup commonly used values */
60595e3dd157SKalle Valo 	arg->scan_req_id = 1;
60605e3dd157SKalle Valo 	arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
60615e3dd157SKalle Valo 	arg->dwell_time_active = 50;
60625e3dd157SKalle Valo 	arg->dwell_time_passive = 150;
60635e3dd157SKalle Valo 	arg->min_rest_time = 50;
60645e3dd157SKalle Valo 	arg->max_rest_time = 500;
60655e3dd157SKalle Valo 	arg->repeat_probe_time = 0;
60665e3dd157SKalle Valo 	arg->probe_spacing_time = 0;
60675e3dd157SKalle Valo 	arg->idle_time = 0;
6068c322892fSBartosz Markowski 	arg->max_scan_time = 20000;
60695e3dd157SKalle Valo 	arg->probe_delay = 5;
60705e3dd157SKalle Valo 	arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
60715e3dd157SKalle Valo 		| WMI_SCAN_EVENT_COMPLETED
60725e3dd157SKalle Valo 		| WMI_SCAN_EVENT_BSS_CHANNEL
60735e3dd157SKalle Valo 		| WMI_SCAN_EVENT_FOREIGN_CHANNEL
60745e3dd157SKalle Valo 		| WMI_SCAN_EVENT_DEQUEUED;
60755e3dd157SKalle Valo 	arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
60765e3dd157SKalle Valo 	arg->n_bssids = 1;
60775e3dd157SKalle Valo 	arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF";
60785e3dd157SKalle Valo }
60795e3dd157SKalle Valo 
6080d7579d12SMichal Kazior static struct sk_buff *
6081d7579d12SMichal Kazior ath10k_wmi_op_gen_stop_scan(struct ath10k *ar,
6082d7579d12SMichal Kazior 			    const struct wmi_stop_scan_arg *arg)
60835e3dd157SKalle Valo {
60845e3dd157SKalle Valo 	struct wmi_stop_scan_cmd *cmd;
60855e3dd157SKalle Valo 	struct sk_buff *skb;
60865e3dd157SKalle Valo 	u32 scan_id;
60875e3dd157SKalle Valo 	u32 req_id;
60885e3dd157SKalle Valo 
60895e3dd157SKalle Valo 	if (arg->req_id > 0xFFF)
6090d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
60915e3dd157SKalle Valo 	if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF)
6092d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
60935e3dd157SKalle Valo 
60947aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
60955e3dd157SKalle Valo 	if (!skb)
6096d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
60975e3dd157SKalle Valo 
60985e3dd157SKalle Valo 	scan_id = arg->u.scan_id;
60995e3dd157SKalle Valo 	scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;
61005e3dd157SKalle Valo 
61015e3dd157SKalle Valo 	req_id = arg->req_id;
61025e3dd157SKalle Valo 	req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
61035e3dd157SKalle Valo 
61045e3dd157SKalle Valo 	cmd = (struct wmi_stop_scan_cmd *)skb->data;
61055e3dd157SKalle Valo 	cmd->req_type    = __cpu_to_le32(arg->req_type);
61065e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(arg->u.vdev_id);
61075e3dd157SKalle Valo 	cmd->scan_id     = __cpu_to_le32(scan_id);
61085e3dd157SKalle Valo 	cmd->scan_req_id = __cpu_to_le32(req_id);
61095e3dd157SKalle Valo 
61107aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
61115e3dd157SKalle Valo 		   "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
61125e3dd157SKalle Valo 		   arg->req_id, arg->req_type, arg->u.scan_id);
6113d7579d12SMichal Kazior 	return skb;
61145e3dd157SKalle Valo }
61155e3dd157SKalle Valo 
6116d7579d12SMichal Kazior static struct sk_buff *
6117d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id,
61185e3dd157SKalle Valo 			      enum wmi_vdev_type type,
61195e3dd157SKalle Valo 			      enum wmi_vdev_subtype subtype,
61205e3dd157SKalle Valo 			      const u8 macaddr[ETH_ALEN])
61215e3dd157SKalle Valo {
61225e3dd157SKalle Valo 	struct wmi_vdev_create_cmd *cmd;
61235e3dd157SKalle Valo 	struct sk_buff *skb;
61245e3dd157SKalle Valo 
61257aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
61265e3dd157SKalle Valo 	if (!skb)
6127d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
61285e3dd157SKalle Valo 
61295e3dd157SKalle Valo 	cmd = (struct wmi_vdev_create_cmd *)skb->data;
61305e3dd157SKalle Valo 	cmd->vdev_id      = __cpu_to_le32(vdev_id);
61315e3dd157SKalle Valo 	cmd->vdev_type    = __cpu_to_le32(type);
61325e3dd157SKalle Valo 	cmd->vdev_subtype = __cpu_to_le32(subtype);
6133b25f32cbSKalle Valo 	ether_addr_copy(cmd->vdev_macaddr.addr, macaddr);
61345e3dd157SKalle Valo 
61357aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
61365e3dd157SKalle Valo 		   "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
61375e3dd157SKalle Valo 		   vdev_id, type, subtype, macaddr);
6138d7579d12SMichal Kazior 	return skb;
61395e3dd157SKalle Valo }
61405e3dd157SKalle Valo 
6141d7579d12SMichal Kazior static struct sk_buff *
6142d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id)
61435e3dd157SKalle Valo {
61445e3dd157SKalle Valo 	struct wmi_vdev_delete_cmd *cmd;
61455e3dd157SKalle Valo 	struct sk_buff *skb;
61465e3dd157SKalle Valo 
61477aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
61485e3dd157SKalle Valo 	if (!skb)
6149d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
61505e3dd157SKalle Valo 
61515e3dd157SKalle Valo 	cmd = (struct wmi_vdev_delete_cmd *)skb->data;
61525e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
61535e3dd157SKalle Valo 
61547aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
61555e3dd157SKalle Valo 		   "WMI vdev delete id %d\n", vdev_id);
6156d7579d12SMichal Kazior 	return skb;
61575e3dd157SKalle Valo }
61585e3dd157SKalle Valo 
6159d7579d12SMichal Kazior static struct sk_buff *
6160d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_start(struct ath10k *ar,
61615e3dd157SKalle Valo 			     const struct wmi_vdev_start_request_arg *arg,
6162d7579d12SMichal Kazior 			     bool restart)
61635e3dd157SKalle Valo {
61645e3dd157SKalle Valo 	struct wmi_vdev_start_request_cmd *cmd;
61655e3dd157SKalle Valo 	struct sk_buff *skb;
61665e3dd157SKalle Valo 	const char *cmdname;
61675e3dd157SKalle Valo 	u32 flags = 0;
61685e3dd157SKalle Valo 
61695e3dd157SKalle Valo 	if (WARN_ON(arg->hidden_ssid && !arg->ssid))
6170d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
61715e3dd157SKalle Valo 	if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
6172d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
61735e3dd157SKalle Valo 
6174d7579d12SMichal Kazior 	if (restart)
61755e3dd157SKalle Valo 		cmdname = "restart";
61765e3dd157SKalle Valo 	else
6177d7579d12SMichal Kazior 		cmdname = "start";
61785e3dd157SKalle Valo 
61797aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
61805e3dd157SKalle Valo 	if (!skb)
6181d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
61825e3dd157SKalle Valo 
61835e3dd157SKalle Valo 	if (arg->hidden_ssid)
61845e3dd157SKalle Valo 		flags |= WMI_VDEV_START_HIDDEN_SSID;
61855e3dd157SKalle Valo 	if (arg->pmf_enabled)
61865e3dd157SKalle Valo 		flags |= WMI_VDEV_START_PMF_ENABLED;
61875e3dd157SKalle Valo 
61885e3dd157SKalle Valo 	cmd = (struct wmi_vdev_start_request_cmd *)skb->data;
61895e3dd157SKalle Valo 	cmd->vdev_id         = __cpu_to_le32(arg->vdev_id);
61905e3dd157SKalle Valo 	cmd->disable_hw_ack  = __cpu_to_le32(arg->disable_hw_ack);
61915e3dd157SKalle Valo 	cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval);
61925e3dd157SKalle Valo 	cmd->dtim_period     = __cpu_to_le32(arg->dtim_period);
61935e3dd157SKalle Valo 	cmd->flags           = __cpu_to_le32(flags);
61945e3dd157SKalle Valo 	cmd->bcn_tx_rate     = __cpu_to_le32(arg->bcn_tx_rate);
61955e3dd157SKalle Valo 	cmd->bcn_tx_power    = __cpu_to_le32(arg->bcn_tx_power);
61965e3dd157SKalle Valo 
61975e3dd157SKalle Valo 	if (arg->ssid) {
61985e3dd157SKalle Valo 		cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len);
61995e3dd157SKalle Valo 		memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
62005e3dd157SKalle Valo 	}
62015e3dd157SKalle Valo 
62022d66721cSMichal Kazior 	ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel);
62035e3dd157SKalle Valo 
62047aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
62058cc7f26cSKalle Valo 		   "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
62068cc7f26cSKalle Valo 		   cmdname, arg->vdev_id,
6207e8a50f8bSMarek Puzyniak 		   flags, arg->channel.freq, arg->channel.mode,
6208e8a50f8bSMarek Puzyniak 		   cmd->chan.flags, arg->channel.max_power);
62095e3dd157SKalle Valo 
6210d7579d12SMichal Kazior 	return skb;
62115e3dd157SKalle Valo }
62125e3dd157SKalle Valo 
6213d7579d12SMichal Kazior static struct sk_buff *
6214d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id)
62155e3dd157SKalle Valo {
62165e3dd157SKalle Valo 	struct wmi_vdev_stop_cmd *cmd;
62175e3dd157SKalle Valo 	struct sk_buff *skb;
62185e3dd157SKalle Valo 
62197aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
62205e3dd157SKalle Valo 	if (!skb)
6221d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
62225e3dd157SKalle Valo 
62235e3dd157SKalle Valo 	cmd = (struct wmi_vdev_stop_cmd *)skb->data;
62245e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
62255e3dd157SKalle Valo 
62267aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
6227d7579d12SMichal Kazior 	return skb;
62285e3dd157SKalle Valo }
62295e3dd157SKalle Valo 
6230d7579d12SMichal Kazior static struct sk_buff *
6231d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid,
6232d7579d12SMichal Kazior 			  const u8 *bssid)
62335e3dd157SKalle Valo {
62345e3dd157SKalle Valo 	struct wmi_vdev_up_cmd *cmd;
62355e3dd157SKalle Valo 	struct sk_buff *skb;
62365e3dd157SKalle Valo 
62377aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
62385e3dd157SKalle Valo 	if (!skb)
6239d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
62405e3dd157SKalle Valo 
62415e3dd157SKalle Valo 	cmd = (struct wmi_vdev_up_cmd *)skb->data;
62425e3dd157SKalle Valo 	cmd->vdev_id       = __cpu_to_le32(vdev_id);
62435e3dd157SKalle Valo 	cmd->vdev_assoc_id = __cpu_to_le32(aid);
6244b25f32cbSKalle Valo 	ether_addr_copy(cmd->vdev_bssid.addr, bssid);
62455e3dd157SKalle Valo 
62467aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
62475e3dd157SKalle Valo 		   "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
62485e3dd157SKalle Valo 		   vdev_id, aid, bssid);
6249d7579d12SMichal Kazior 	return skb;
62505e3dd157SKalle Valo }
62515e3dd157SKalle Valo 
6252d7579d12SMichal Kazior static struct sk_buff *
6253d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id)
62545e3dd157SKalle Valo {
62555e3dd157SKalle Valo 	struct wmi_vdev_down_cmd *cmd;
62565e3dd157SKalle Valo 	struct sk_buff *skb;
62575e3dd157SKalle Valo 
62587aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
62595e3dd157SKalle Valo 	if (!skb)
6260d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
62615e3dd157SKalle Valo 
62625e3dd157SKalle Valo 	cmd = (struct wmi_vdev_down_cmd *)skb->data;
62635e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
62645e3dd157SKalle Valo 
62657aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
62665e3dd157SKalle Valo 		   "wmi mgmt vdev down id 0x%x\n", vdev_id);
6267d7579d12SMichal Kazior 	return skb;
62685e3dd157SKalle Valo }
62695e3dd157SKalle Valo 
6270d7579d12SMichal Kazior static struct sk_buff *
6271d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id,
62726d1506e7SBartosz Markowski 				 u32 param_id, u32 param_value)
62735e3dd157SKalle Valo {
62745e3dd157SKalle Valo 	struct wmi_vdev_set_param_cmd *cmd;
62755e3dd157SKalle Valo 	struct sk_buff *skb;
62765e3dd157SKalle Valo 
62776d1506e7SBartosz Markowski 	if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
62787aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
62796d1506e7SBartosz Markowski 			   "vdev param %d not supported by firmware\n",
62806d1506e7SBartosz Markowski 			    param_id);
6281d7579d12SMichal Kazior 		return ERR_PTR(-EOPNOTSUPP);
62826d1506e7SBartosz Markowski 	}
62836d1506e7SBartosz Markowski 
62847aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
62855e3dd157SKalle Valo 	if (!skb)
6286d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
62875e3dd157SKalle Valo 
62885e3dd157SKalle Valo 	cmd = (struct wmi_vdev_set_param_cmd *)skb->data;
62895e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
62905e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(param_id);
62915e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(param_value);
62925e3dd157SKalle Valo 
62937aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
62945e3dd157SKalle Valo 		   "wmi vdev id 0x%x set param %d value %d\n",
62955e3dd157SKalle Valo 		   vdev_id, param_id, param_value);
6296d7579d12SMichal Kazior 	return skb;
62975e3dd157SKalle Valo }
62985e3dd157SKalle Valo 
6299d7579d12SMichal Kazior static struct sk_buff *
6300d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar,
63015e3dd157SKalle Valo 				   const struct wmi_vdev_install_key_arg *arg)
63025e3dd157SKalle Valo {
63035e3dd157SKalle Valo 	struct wmi_vdev_install_key_cmd *cmd;
63045e3dd157SKalle Valo 	struct sk_buff *skb;
63055e3dd157SKalle Valo 
63065e3dd157SKalle Valo 	if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
6307d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
63085e3dd157SKalle Valo 	if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
6309d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
63105e3dd157SKalle Valo 
63117aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
63125e3dd157SKalle Valo 	if (!skb)
6313d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
63145e3dd157SKalle Valo 
63155e3dd157SKalle Valo 	cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
63165e3dd157SKalle Valo 	cmd->vdev_id       = __cpu_to_le32(arg->vdev_id);
63175e3dd157SKalle Valo 	cmd->key_idx       = __cpu_to_le32(arg->key_idx);
63185e3dd157SKalle Valo 	cmd->key_flags     = __cpu_to_le32(arg->key_flags);
63195e3dd157SKalle Valo 	cmd->key_cipher    = __cpu_to_le32(arg->key_cipher);
63205e3dd157SKalle Valo 	cmd->key_len       = __cpu_to_le32(arg->key_len);
63215e3dd157SKalle Valo 	cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len);
63225e3dd157SKalle Valo 	cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
63235e3dd157SKalle Valo 
63245e3dd157SKalle Valo 	if (arg->macaddr)
6325b25f32cbSKalle Valo 		ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr);
63265e3dd157SKalle Valo 	if (arg->key_data)
63275e3dd157SKalle Valo 		memcpy(cmd->key_data, arg->key_data, arg->key_len);
63285e3dd157SKalle Valo 
63297aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6330e0c508abSMichal Kazior 		   "wmi vdev install key idx %d cipher %d len %d\n",
6331e0c508abSMichal Kazior 		   arg->key_idx, arg->key_cipher, arg->key_len);
6332d7579d12SMichal Kazior 	return skb;
63335e3dd157SKalle Valo }
63345e3dd157SKalle Valo 
6335d7579d12SMichal Kazior static struct sk_buff *
6336d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar,
6337855aed12SSimon Wunderlich 				     const struct wmi_vdev_spectral_conf_arg *arg)
6338855aed12SSimon Wunderlich {
6339855aed12SSimon Wunderlich 	struct wmi_vdev_spectral_conf_cmd *cmd;
6340855aed12SSimon Wunderlich 	struct sk_buff *skb;
6341855aed12SSimon Wunderlich 
63427aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6343855aed12SSimon Wunderlich 	if (!skb)
6344d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6345855aed12SSimon Wunderlich 
6346855aed12SSimon Wunderlich 	cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data;
6347855aed12SSimon Wunderlich 	cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
6348855aed12SSimon Wunderlich 	cmd->scan_count = __cpu_to_le32(arg->scan_count);
6349855aed12SSimon Wunderlich 	cmd->scan_period = __cpu_to_le32(arg->scan_period);
6350855aed12SSimon Wunderlich 	cmd->scan_priority = __cpu_to_le32(arg->scan_priority);
6351855aed12SSimon Wunderlich 	cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size);
6352855aed12SSimon Wunderlich 	cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena);
6353855aed12SSimon Wunderlich 	cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena);
6354855aed12SSimon Wunderlich 	cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref);
6355855aed12SSimon Wunderlich 	cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay);
6356855aed12SSimon Wunderlich 	cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr);
6357855aed12SSimon Wunderlich 	cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr);
6358855aed12SSimon Wunderlich 	cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode);
6359855aed12SSimon Wunderlich 	cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode);
6360855aed12SSimon Wunderlich 	cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr);
6361855aed12SSimon Wunderlich 	cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format);
6362855aed12SSimon Wunderlich 	cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode);
6363855aed12SSimon Wunderlich 	cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale);
6364855aed12SSimon Wunderlich 	cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj);
6365855aed12SSimon Wunderlich 	cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask);
6366855aed12SSimon Wunderlich 
6367d7579d12SMichal Kazior 	return skb;
6368855aed12SSimon Wunderlich }
6369855aed12SSimon Wunderlich 
6370d7579d12SMichal Kazior static struct sk_buff *
6371d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id,
6372d7579d12SMichal Kazior 				       u32 trigger, u32 enable)
6373855aed12SSimon Wunderlich {
6374855aed12SSimon Wunderlich 	struct wmi_vdev_spectral_enable_cmd *cmd;
6375855aed12SSimon Wunderlich 	struct sk_buff *skb;
6376855aed12SSimon Wunderlich 
63777aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6378855aed12SSimon Wunderlich 	if (!skb)
6379d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6380855aed12SSimon Wunderlich 
6381855aed12SSimon Wunderlich 	cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data;
6382855aed12SSimon Wunderlich 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6383855aed12SSimon Wunderlich 	cmd->trigger_cmd = __cpu_to_le32(trigger);
6384855aed12SSimon Wunderlich 	cmd->enable_cmd = __cpu_to_le32(enable);
6385855aed12SSimon Wunderlich 
6386d7579d12SMichal Kazior 	return skb;
6387855aed12SSimon Wunderlich }
6388855aed12SSimon Wunderlich 
6389d7579d12SMichal Kazior static struct sk_buff *
6390d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
63917390ed34SMarek Puzyniak 			      const u8 peer_addr[ETH_ALEN],
63927390ed34SMarek Puzyniak 			      enum wmi_peer_type peer_type)
63935e3dd157SKalle Valo {
63945e3dd157SKalle Valo 	struct wmi_peer_create_cmd *cmd;
63955e3dd157SKalle Valo 	struct sk_buff *skb;
63965e3dd157SKalle Valo 
63977aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
63985e3dd157SKalle Valo 	if (!skb)
6399d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64005e3dd157SKalle Valo 
64015e3dd157SKalle Valo 	cmd = (struct wmi_peer_create_cmd *)skb->data;
64025e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6403b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
64045e3dd157SKalle Valo 
64057aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
64065e3dd157SKalle Valo 		   "wmi peer create vdev_id %d peer_addr %pM\n",
64075e3dd157SKalle Valo 		   vdev_id, peer_addr);
6408d7579d12SMichal Kazior 	return skb;
64095e3dd157SKalle Valo }
64105e3dd157SKalle Valo 
6411d7579d12SMichal Kazior static struct sk_buff *
6412d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id,
64135e3dd157SKalle Valo 			      const u8 peer_addr[ETH_ALEN])
64145e3dd157SKalle Valo {
64155e3dd157SKalle Valo 	struct wmi_peer_delete_cmd *cmd;
64165e3dd157SKalle Valo 	struct sk_buff *skb;
64175e3dd157SKalle Valo 
64187aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
64195e3dd157SKalle Valo 	if (!skb)
6420d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64215e3dd157SKalle Valo 
64225e3dd157SKalle Valo 	cmd = (struct wmi_peer_delete_cmd *)skb->data;
64235e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
6424b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
64255e3dd157SKalle Valo 
64267aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
64275e3dd157SKalle Valo 		   "wmi peer delete vdev_id %d peer_addr %pM\n",
64285e3dd157SKalle Valo 		   vdev_id, peer_addr);
6429d7579d12SMichal Kazior 	return skb;
64305e3dd157SKalle Valo }
64315e3dd157SKalle Valo 
6432d7579d12SMichal Kazior static struct sk_buff *
6433d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id,
64345e3dd157SKalle Valo 			     const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
64355e3dd157SKalle Valo {
64365e3dd157SKalle Valo 	struct wmi_peer_flush_tids_cmd *cmd;
64375e3dd157SKalle Valo 	struct sk_buff *skb;
64385e3dd157SKalle Valo 
64397aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
64405e3dd157SKalle Valo 	if (!skb)
6441d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64425e3dd157SKalle Valo 
64435e3dd157SKalle Valo 	cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
64445e3dd157SKalle Valo 	cmd->vdev_id         = __cpu_to_le32(vdev_id);
64455e3dd157SKalle Valo 	cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
6446b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
64475e3dd157SKalle Valo 
64487aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
64495e3dd157SKalle Valo 		   "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
64505e3dd157SKalle Valo 		   vdev_id, peer_addr, tid_bitmap);
6451d7579d12SMichal Kazior 	return skb;
64525e3dd157SKalle Valo }
64535e3dd157SKalle Valo 
6454d7579d12SMichal Kazior static struct sk_buff *
6455d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id,
6456d7579d12SMichal Kazior 				 const u8 *peer_addr,
6457d7579d12SMichal Kazior 				 enum wmi_peer_param param_id,
64585e3dd157SKalle Valo 				 u32 param_value)
64595e3dd157SKalle Valo {
64605e3dd157SKalle Valo 	struct wmi_peer_set_param_cmd *cmd;
64615e3dd157SKalle Valo 	struct sk_buff *skb;
64625e3dd157SKalle Valo 
64637aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
64645e3dd157SKalle Valo 	if (!skb)
6465d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64665e3dd157SKalle Valo 
64675e3dd157SKalle Valo 	cmd = (struct wmi_peer_set_param_cmd *)skb->data;
64685e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
64695e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(param_id);
64705e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(param_value);
6471b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
64725e3dd157SKalle Valo 
64737aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
64745e3dd157SKalle Valo 		   "wmi vdev %d peer 0x%pM set param %d value %d\n",
64755e3dd157SKalle Valo 		   vdev_id, peer_addr, param_id, param_value);
6476d7579d12SMichal Kazior 	return skb;
64775e3dd157SKalle Valo }
64785e3dd157SKalle Valo 
6479d7579d12SMichal Kazior static struct sk_buff *
6480d7579d12SMichal Kazior ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
64815e3dd157SKalle Valo 			     enum wmi_sta_ps_mode psmode)
64825e3dd157SKalle Valo {
64835e3dd157SKalle Valo 	struct wmi_sta_powersave_mode_cmd *cmd;
64845e3dd157SKalle Valo 	struct sk_buff *skb;
64855e3dd157SKalle Valo 
64867aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
64875e3dd157SKalle Valo 	if (!skb)
6488d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64895e3dd157SKalle Valo 
64905e3dd157SKalle Valo 	cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data;
64915e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
64925e3dd157SKalle Valo 	cmd->sta_ps_mode = __cpu_to_le32(psmode);
64935e3dd157SKalle Valo 
64947aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
64955e3dd157SKalle Valo 		   "wmi set powersave id 0x%x mode %d\n",
64965e3dd157SKalle Valo 		   vdev_id, psmode);
6497d7579d12SMichal Kazior 	return skb;
64985e3dd157SKalle Valo }
64995e3dd157SKalle Valo 
6500d7579d12SMichal Kazior static struct sk_buff *
6501d7579d12SMichal Kazior ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id,
65025e3dd157SKalle Valo 			     enum wmi_sta_powersave_param param_id,
65035e3dd157SKalle Valo 			     u32 value)
65045e3dd157SKalle Valo {
65055e3dd157SKalle Valo 	struct wmi_sta_powersave_param_cmd *cmd;
65065e3dd157SKalle Valo 	struct sk_buff *skb;
65075e3dd157SKalle Valo 
65087aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
65095e3dd157SKalle Valo 	if (!skb)
6510d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
65115e3dd157SKalle Valo 
65125e3dd157SKalle Valo 	cmd = (struct wmi_sta_powersave_param_cmd *)skb->data;
65135e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
65145e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(param_id);
65155e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(value);
65165e3dd157SKalle Valo 
65177aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
65185e3dd157SKalle Valo 		   "wmi sta ps param vdev_id 0x%x param %d value %d\n",
65195e3dd157SKalle Valo 		   vdev_id, param_id, value);
6520d7579d12SMichal Kazior 	return skb;
65215e3dd157SKalle Valo }
65225e3dd157SKalle Valo 
6523d7579d12SMichal Kazior static struct sk_buff *
6524d7579d12SMichal Kazior ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac,
65255e3dd157SKalle Valo 			    enum wmi_ap_ps_peer_param param_id, u32 value)
65265e3dd157SKalle Valo {
65275e3dd157SKalle Valo 	struct wmi_ap_ps_peer_cmd *cmd;
65285e3dd157SKalle Valo 	struct sk_buff *skb;
65295e3dd157SKalle Valo 
65305e3dd157SKalle Valo 	if (!mac)
6531d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
65325e3dd157SKalle Valo 
65337aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
65345e3dd157SKalle Valo 	if (!skb)
6535d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
65365e3dd157SKalle Valo 
65375e3dd157SKalle Valo 	cmd = (struct wmi_ap_ps_peer_cmd *)skb->data;
65385e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
65395e3dd157SKalle Valo 	cmd->param_id = __cpu_to_le32(param_id);
65405e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(value);
6541b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
65425e3dd157SKalle Valo 
65437aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
65445e3dd157SKalle Valo 		   "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
65455e3dd157SKalle Valo 		   vdev_id, param_id, value, mac);
6546d7579d12SMichal Kazior 	return skb;
65475e3dd157SKalle Valo }
65485e3dd157SKalle Valo 
6549d7579d12SMichal Kazior static struct sk_buff *
6550d7579d12SMichal Kazior ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar,
65515e3dd157SKalle Valo 				 const struct wmi_scan_chan_list_arg *arg)
65525e3dd157SKalle Valo {
65535e3dd157SKalle Valo 	struct wmi_scan_chan_list_cmd *cmd;
65545e3dd157SKalle Valo 	struct sk_buff *skb;
65555e3dd157SKalle Valo 	struct wmi_channel_arg *ch;
65565e3dd157SKalle Valo 	struct wmi_channel *ci;
65575e3dd157SKalle Valo 	int len;
65585e3dd157SKalle Valo 	int i;
65595e3dd157SKalle Valo 
65605e3dd157SKalle Valo 	len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);
65615e3dd157SKalle Valo 
65627aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
65635e3dd157SKalle Valo 	if (!skb)
6564d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
65655e3dd157SKalle Valo 
65665e3dd157SKalle Valo 	cmd = (struct wmi_scan_chan_list_cmd *)skb->data;
65675e3dd157SKalle Valo 	cmd->num_scan_chans = __cpu_to_le32(arg->n_channels);
65685e3dd157SKalle Valo 
65695e3dd157SKalle Valo 	for (i = 0; i < arg->n_channels; i++) {
65705e3dd157SKalle Valo 		ch = &arg->channels[i];
65715e3dd157SKalle Valo 		ci = &cmd->chan_info[i];
65725e3dd157SKalle Valo 
65732d66721cSMichal Kazior 		ath10k_wmi_put_wmi_channel(ci, ch);
65745e3dd157SKalle Valo 	}
65755e3dd157SKalle Valo 
6576d7579d12SMichal Kazior 	return skb;
65775e3dd157SKalle Valo }
65785e3dd157SKalle Valo 
657924c88f78SMichal Kazior static void
658024c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
65815e3dd157SKalle Valo 			   const struct wmi_peer_assoc_complete_arg *arg)
65825e3dd157SKalle Valo {
658324c88f78SMichal Kazior 	struct wmi_common_peer_assoc_complete_cmd *cmd = buf;
65845e3dd157SKalle Valo 
65855e3dd157SKalle Valo 	cmd->vdev_id            = __cpu_to_le32(arg->vdev_id);
65865e3dd157SKalle Valo 	cmd->peer_new_assoc     = __cpu_to_le32(arg->peer_reassoc ? 0 : 1);
65875e3dd157SKalle Valo 	cmd->peer_associd       = __cpu_to_le32(arg->peer_aid);
65885e3dd157SKalle Valo 	cmd->peer_flags         = __cpu_to_le32(arg->peer_flags);
65895e3dd157SKalle Valo 	cmd->peer_caps          = __cpu_to_le32(arg->peer_caps);
65905e3dd157SKalle Valo 	cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval);
65915e3dd157SKalle Valo 	cmd->peer_ht_caps       = __cpu_to_le32(arg->peer_ht_caps);
65925e3dd157SKalle Valo 	cmd->peer_max_mpdu      = __cpu_to_le32(arg->peer_max_mpdu);
65935e3dd157SKalle Valo 	cmd->peer_mpdu_density  = __cpu_to_le32(arg->peer_mpdu_density);
65945e3dd157SKalle Valo 	cmd->peer_rate_caps     = __cpu_to_le32(arg->peer_rate_caps);
65955e3dd157SKalle Valo 	cmd->peer_nss           = __cpu_to_le32(arg->peer_num_spatial_streams);
65965e3dd157SKalle Valo 	cmd->peer_vht_caps      = __cpu_to_le32(arg->peer_vht_caps);
65975e3dd157SKalle Valo 	cmd->peer_phymode       = __cpu_to_le32(arg->peer_phymode);
65985e3dd157SKalle Valo 
6599b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
66005e3dd157SKalle Valo 
66015e3dd157SKalle Valo 	cmd->peer_legacy_rates.num_rates =
66025e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_legacy_rates.num_rates);
66035e3dd157SKalle Valo 	memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
66045e3dd157SKalle Valo 	       arg->peer_legacy_rates.num_rates);
66055e3dd157SKalle Valo 
66065e3dd157SKalle Valo 	cmd->peer_ht_rates.num_rates =
66075e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_ht_rates.num_rates);
66085e3dd157SKalle Valo 	memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
66095e3dd157SKalle Valo 	       arg->peer_ht_rates.num_rates);
66105e3dd157SKalle Valo 
66115e3dd157SKalle Valo 	cmd->peer_vht_rates.rx_max_rate =
66125e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
66135e3dd157SKalle Valo 	cmd->peer_vht_rates.rx_mcs_set =
66145e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
66155e3dd157SKalle Valo 	cmd->peer_vht_rates.tx_max_rate =
66165e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
66175e3dd157SKalle Valo 	cmd->peer_vht_rates.tx_mcs_set =
66185e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
661924c88f78SMichal Kazior }
662024c88f78SMichal Kazior 
662124c88f78SMichal Kazior static void
662224c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf,
662324c88f78SMichal Kazior 				const struct wmi_peer_assoc_complete_arg *arg)
662424c88f78SMichal Kazior {
662524c88f78SMichal Kazior 	struct wmi_main_peer_assoc_complete_cmd *cmd = buf;
662624c88f78SMichal Kazior 
662724c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
662824c88f78SMichal Kazior 	memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info));
662924c88f78SMichal Kazior }
663024c88f78SMichal Kazior 
663124c88f78SMichal Kazior static void
663224c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf,
663324c88f78SMichal Kazior 				const struct wmi_peer_assoc_complete_arg *arg)
663424c88f78SMichal Kazior {
663524c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
663624c88f78SMichal Kazior }
663724c88f78SMichal Kazior 
663824c88f78SMichal Kazior static void
663924c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf,
664024c88f78SMichal Kazior 				const struct wmi_peer_assoc_complete_arg *arg)
664124c88f78SMichal Kazior {
664224c88f78SMichal Kazior 	struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf;
664324c88f78SMichal Kazior 	int max_mcs, max_nss;
664424c88f78SMichal Kazior 	u32 info0;
664524c88f78SMichal Kazior 
664624c88f78SMichal Kazior 	/* TODO: Is using max values okay with firmware? */
664724c88f78SMichal Kazior 	max_mcs = 0xf;
664824c88f78SMichal Kazior 	max_nss = 0xf;
664924c88f78SMichal Kazior 
665024c88f78SMichal Kazior 	info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) |
665124c88f78SMichal Kazior 		SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS);
665224c88f78SMichal Kazior 
665324c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
665424c88f78SMichal Kazior 	cmd->info0 = __cpu_to_le32(info0);
665524c88f78SMichal Kazior }
665624c88f78SMichal Kazior 
6657b54e16f1SVasanthakumar Thiagarajan static void
6658b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf,
6659b54e16f1SVasanthakumar Thiagarajan 				const struct wmi_peer_assoc_complete_arg *arg)
6660b54e16f1SVasanthakumar Thiagarajan {
6661b54e16f1SVasanthakumar Thiagarajan 	struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf;
6662b54e16f1SVasanthakumar Thiagarajan 
6663b54e16f1SVasanthakumar Thiagarajan 	ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
6664b54e16f1SVasanthakumar Thiagarajan 	cmd->peer_bw_rxnss_override = 0;
6665b54e16f1SVasanthakumar Thiagarajan }
6666b54e16f1SVasanthakumar Thiagarajan 
6667d7579d12SMichal Kazior static int
6668d7579d12SMichal Kazior ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg)
666924c88f78SMichal Kazior {
667024c88f78SMichal Kazior 	if (arg->peer_mpdu_density > 16)
667124c88f78SMichal Kazior 		return -EINVAL;
667224c88f78SMichal Kazior 	if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES)
667324c88f78SMichal Kazior 		return -EINVAL;
667424c88f78SMichal Kazior 	if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES)
667524c88f78SMichal Kazior 		return -EINVAL;
667624c88f78SMichal Kazior 
6677d7579d12SMichal Kazior 	return 0;
667824c88f78SMichal Kazior }
667924c88f78SMichal Kazior 
6680d7579d12SMichal Kazior static struct sk_buff *
6681d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar,
6682d7579d12SMichal Kazior 			     const struct wmi_peer_assoc_complete_arg *arg)
6683d7579d12SMichal Kazior {
6684d7579d12SMichal Kazior 	size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd);
6685d7579d12SMichal Kazior 	struct sk_buff *skb;
6686d7579d12SMichal Kazior 	int ret;
6687d7579d12SMichal Kazior 
6688d7579d12SMichal Kazior 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6689d7579d12SMichal Kazior 	if (ret)
6690d7579d12SMichal Kazior 		return ERR_PTR(ret);
6691d7579d12SMichal Kazior 
66927aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
669324c88f78SMichal Kazior 	if (!skb)
6694d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
669524c88f78SMichal Kazior 
669624c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);
66975e3dd157SKalle Valo 
66987aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
669944d6fa90SChun-Yeow Yeoh 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
670044d6fa90SChun-Yeow Yeoh 		   arg->vdev_id, arg->addr,
670144d6fa90SChun-Yeow Yeoh 		   arg->peer_reassoc ? "reassociate" : "new");
6702d7579d12SMichal Kazior 	return skb;
6703d7579d12SMichal Kazior }
6704d7579d12SMichal Kazior 
6705d7579d12SMichal Kazior static struct sk_buff *
6706d7579d12SMichal Kazior ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar,
6707d7579d12SMichal Kazior 				  const struct wmi_peer_assoc_complete_arg *arg)
6708d7579d12SMichal Kazior {
6709d7579d12SMichal Kazior 	size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd);
6710d7579d12SMichal Kazior 	struct sk_buff *skb;
6711d7579d12SMichal Kazior 	int ret;
6712d7579d12SMichal Kazior 
6713d7579d12SMichal Kazior 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6714d7579d12SMichal Kazior 	if (ret)
6715d7579d12SMichal Kazior 		return ERR_PTR(ret);
6716d7579d12SMichal Kazior 
6717d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
6718d7579d12SMichal Kazior 	if (!skb)
6719d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6720d7579d12SMichal Kazior 
6721d7579d12SMichal Kazior 	ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);
6722d7579d12SMichal Kazior 
6723d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6724d7579d12SMichal Kazior 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6725d7579d12SMichal Kazior 		   arg->vdev_id, arg->addr,
6726d7579d12SMichal Kazior 		   arg->peer_reassoc ? "reassociate" : "new");
6727d7579d12SMichal Kazior 	return skb;
6728d7579d12SMichal Kazior }
6729d7579d12SMichal Kazior 
6730d7579d12SMichal Kazior static struct sk_buff *
6731d7579d12SMichal Kazior ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar,
6732d7579d12SMichal Kazior 				  const struct wmi_peer_assoc_complete_arg *arg)
6733d7579d12SMichal Kazior {
6734d7579d12SMichal Kazior 	size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd);
6735d7579d12SMichal Kazior 	struct sk_buff *skb;
6736d7579d12SMichal Kazior 	int ret;
6737d7579d12SMichal Kazior 
6738d7579d12SMichal Kazior 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6739d7579d12SMichal Kazior 	if (ret)
6740d7579d12SMichal Kazior 		return ERR_PTR(ret);
6741d7579d12SMichal Kazior 
6742d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
6743d7579d12SMichal Kazior 	if (!skb)
6744d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6745d7579d12SMichal Kazior 
6746d7579d12SMichal Kazior 	ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);
6747d7579d12SMichal Kazior 
6748d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6749d7579d12SMichal Kazior 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6750d7579d12SMichal Kazior 		   arg->vdev_id, arg->addr,
6751d7579d12SMichal Kazior 		   arg->peer_reassoc ? "reassociate" : "new");
6752d7579d12SMichal Kazior 	return skb;
67535e3dd157SKalle Valo }
67545e3dd157SKalle Valo 
6755a57a6a27SRajkumar Manoharan static struct sk_buff *
6756b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar,
6757b54e16f1SVasanthakumar Thiagarajan 				  const struct wmi_peer_assoc_complete_arg *arg)
6758b54e16f1SVasanthakumar Thiagarajan {
6759b54e16f1SVasanthakumar Thiagarajan 	size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd);
6760b54e16f1SVasanthakumar Thiagarajan 	struct sk_buff *skb;
6761b54e16f1SVasanthakumar Thiagarajan 	int ret;
6762b54e16f1SVasanthakumar Thiagarajan 
6763b54e16f1SVasanthakumar Thiagarajan 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
6764b54e16f1SVasanthakumar Thiagarajan 	if (ret)
6765b54e16f1SVasanthakumar Thiagarajan 		return ERR_PTR(ret);
6766b54e16f1SVasanthakumar Thiagarajan 
6767b54e16f1SVasanthakumar Thiagarajan 	skb = ath10k_wmi_alloc_skb(ar, len);
6768b54e16f1SVasanthakumar Thiagarajan 	if (!skb)
6769b54e16f1SVasanthakumar Thiagarajan 		return ERR_PTR(-ENOMEM);
6770b54e16f1SVasanthakumar Thiagarajan 
6771b54e16f1SVasanthakumar Thiagarajan 	ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);
6772b54e16f1SVasanthakumar Thiagarajan 
6773b54e16f1SVasanthakumar Thiagarajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6774b54e16f1SVasanthakumar Thiagarajan 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
6775b54e16f1SVasanthakumar Thiagarajan 		   arg->vdev_id, arg->addr,
6776b54e16f1SVasanthakumar Thiagarajan 		   arg->peer_reassoc ? "reassociate" : "new");
6777b54e16f1SVasanthakumar Thiagarajan 	return skb;
6778b54e16f1SVasanthakumar Thiagarajan }
6779b54e16f1SVasanthakumar Thiagarajan 
6780b54e16f1SVasanthakumar Thiagarajan static struct sk_buff *
6781a57a6a27SRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
6782a57a6a27SRajkumar Manoharan {
6783a57a6a27SRajkumar Manoharan 	struct sk_buff *skb;
6784a57a6a27SRajkumar Manoharan 
6785a57a6a27SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, 0);
6786a57a6a27SRajkumar Manoharan 	if (!skb)
6787a57a6a27SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
6788a57a6a27SRajkumar Manoharan 
6789a57a6a27SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
6790a57a6a27SRajkumar Manoharan 	return skb;
6791a57a6a27SRajkumar Manoharan }
6792a57a6a27SRajkumar Manoharan 
67938a0b459eSRajkumar Manoharan static struct sk_buff *
67948a0b459eSRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar,
67958a0b459eSRajkumar Manoharan 					  enum wmi_bss_survey_req_type type)
67968a0b459eSRajkumar Manoharan {
67978a0b459eSRajkumar Manoharan 	struct wmi_pdev_chan_info_req_cmd *cmd;
67988a0b459eSRajkumar Manoharan 	struct sk_buff *skb;
67998a0b459eSRajkumar Manoharan 
68008a0b459eSRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
68018a0b459eSRajkumar Manoharan 	if (!skb)
68028a0b459eSRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
68038a0b459eSRajkumar Manoharan 
68048a0b459eSRajkumar Manoharan 	cmd = (struct wmi_pdev_chan_info_req_cmd *)skb->data;
68058a0b459eSRajkumar Manoharan 	cmd->type = __cpu_to_le32(type);
68068a0b459eSRajkumar Manoharan 
68078a0b459eSRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
68088a0b459eSRajkumar Manoharan 		   "wmi pdev bss info request type %d\n", type);
68098a0b459eSRajkumar Manoharan 
68108a0b459eSRajkumar Manoharan 	return skb;
68118a0b459eSRajkumar Manoharan }
68128a0b459eSRajkumar Manoharan 
6813748afc47SMichal Kazior /* This function assumes the beacon is already DMA mapped */
6814d7579d12SMichal Kazior static struct sk_buff *
68159ad50182SMichal Kazior ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn,
68169ad50182SMichal Kazior 			     size_t bcn_len, u32 bcn_paddr, bool dtim_zero,
68179ad50182SMichal Kazior 			     bool deliver_cab)
68185e3dd157SKalle Valo {
6819748afc47SMichal Kazior 	struct wmi_bcn_tx_ref_cmd *cmd;
68205e3dd157SKalle Valo 	struct sk_buff *skb;
6821748afc47SMichal Kazior 	struct ieee80211_hdr *hdr;
6822748afc47SMichal Kazior 	u16 fc;
68235e3dd157SKalle Valo 
68247aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
68255e3dd157SKalle Valo 	if (!skb)
6826d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
68275e3dd157SKalle Valo 
68289ad50182SMichal Kazior 	hdr = (struct ieee80211_hdr *)bcn;
6829748afc47SMichal Kazior 	fc = le16_to_cpu(hdr->frame_control);
68305e3dd157SKalle Valo 
6831748afc47SMichal Kazior 	cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data;
68329ad50182SMichal Kazior 	cmd->vdev_id = __cpu_to_le32(vdev_id);
68339ad50182SMichal Kazior 	cmd->data_len = __cpu_to_le32(bcn_len);
68349ad50182SMichal Kazior 	cmd->data_ptr = __cpu_to_le32(bcn_paddr);
6835748afc47SMichal Kazior 	cmd->msdu_id = 0;
6836748afc47SMichal Kazior 	cmd->frame_control = __cpu_to_le32(fc);
6837748afc47SMichal Kazior 	cmd->flags = 0;
683824c88f78SMichal Kazior 	cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA);
6839748afc47SMichal Kazior 
68409ad50182SMichal Kazior 	if (dtim_zero)
6841748afc47SMichal Kazior 		cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO);
6842748afc47SMichal Kazior 
68439ad50182SMichal Kazior 	if (deliver_cab)
6844748afc47SMichal Kazior 		cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB);
6845748afc47SMichal Kazior 
6846d7579d12SMichal Kazior 	return skb;
68475e3dd157SKalle Valo }
68485e3dd157SKalle Valo 
68495e752e42SMichal Kazior void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
68505e3dd157SKalle Valo 			      const struct wmi_wmm_params_arg *arg)
68515e3dd157SKalle Valo {
68525e3dd157SKalle Valo 	params->cwmin  = __cpu_to_le32(arg->cwmin);
68535e3dd157SKalle Valo 	params->cwmax  = __cpu_to_le32(arg->cwmax);
68545e3dd157SKalle Valo 	params->aifs   = __cpu_to_le32(arg->aifs);
68555e3dd157SKalle Valo 	params->txop   = __cpu_to_le32(arg->txop);
68565e3dd157SKalle Valo 	params->acm    = __cpu_to_le32(arg->acm);
68575e3dd157SKalle Valo 	params->no_ack = __cpu_to_le32(arg->no_ack);
68585e3dd157SKalle Valo }
68595e3dd157SKalle Valo 
6860d7579d12SMichal Kazior static struct sk_buff *
6861d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
68625e752e42SMichal Kazior 			       const struct wmi_wmm_params_all_arg *arg)
68635e3dd157SKalle Valo {
68645e3dd157SKalle Valo 	struct wmi_pdev_set_wmm_params *cmd;
68655e3dd157SKalle Valo 	struct sk_buff *skb;
68665e3dd157SKalle Valo 
68677aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
68685e3dd157SKalle Valo 	if (!skb)
6869d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
68705e3dd157SKalle Valo 
68715e3dd157SKalle Valo 	cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
68725e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
68735e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
68745e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
68755e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
68765e3dd157SKalle Valo 
68777aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
6878d7579d12SMichal Kazior 	return skb;
68795e3dd157SKalle Valo }
68805e3dd157SKalle Valo 
6881d7579d12SMichal Kazior static struct sk_buff *
6882de23d3efSMichal Kazior ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
68835e3dd157SKalle Valo {
68845e3dd157SKalle Valo 	struct wmi_request_stats_cmd *cmd;
68855e3dd157SKalle Valo 	struct sk_buff *skb;
68865e3dd157SKalle Valo 
68877aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
68885e3dd157SKalle Valo 	if (!skb)
6889d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
68905e3dd157SKalle Valo 
68915e3dd157SKalle Valo 	cmd = (struct wmi_request_stats_cmd *)skb->data;
6892de23d3efSMichal Kazior 	cmd->stats_id = __cpu_to_le32(stats_mask);
68935e3dd157SKalle Valo 
6894de23d3efSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
6895de23d3efSMichal Kazior 		   stats_mask);
6896d7579d12SMichal Kazior 	return skb;
68975e3dd157SKalle Valo }
68989cfbce75SMichal Kazior 
6899d7579d12SMichal Kazior static struct sk_buff *
6900d7579d12SMichal Kazior ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
69019cfbce75SMichal Kazior 				enum wmi_force_fw_hang_type type, u32 delay_ms)
69029cfbce75SMichal Kazior {
69039cfbce75SMichal Kazior 	struct wmi_force_fw_hang_cmd *cmd;
69049cfbce75SMichal Kazior 	struct sk_buff *skb;
69059cfbce75SMichal Kazior 
69067aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
69079cfbce75SMichal Kazior 	if (!skb)
6908d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
69099cfbce75SMichal Kazior 
69109cfbce75SMichal Kazior 	cmd = (struct wmi_force_fw_hang_cmd *)skb->data;
69119cfbce75SMichal Kazior 	cmd->type = __cpu_to_le32(type);
69129cfbce75SMichal Kazior 	cmd->delay_ms = __cpu_to_le32(delay_ms);
69139cfbce75SMichal Kazior 
69147aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
69159cfbce75SMichal Kazior 		   type, delay_ms);
6916d7579d12SMichal Kazior 	return skb;
69179cfbce75SMichal Kazior }
6918f118a3e5SKalle Valo 
6919d7579d12SMichal Kazior static struct sk_buff *
6920467210a6SSenthilKumar Jegadeesan ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable,
6921467210a6SSenthilKumar Jegadeesan 			     u32 log_level)
6922f118a3e5SKalle Valo {
6923f118a3e5SKalle Valo 	struct wmi_dbglog_cfg_cmd *cmd;
6924f118a3e5SKalle Valo 	struct sk_buff *skb;
6925f118a3e5SKalle Valo 	u32 cfg;
6926f118a3e5SKalle Valo 
69277aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6928f118a3e5SKalle Valo 	if (!skb)
6929d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6930f118a3e5SKalle Valo 
6931f118a3e5SKalle Valo 	cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
6932f118a3e5SKalle Valo 
6933f118a3e5SKalle Valo 	if (module_enable) {
6934467210a6SSenthilKumar Jegadeesan 		cfg = SM(log_level,
6935f118a3e5SKalle Valo 			 ATH10K_DBGLOG_CFG_LOG_LVL);
6936f118a3e5SKalle Valo 	} else {
6937f118a3e5SKalle Valo 		/* set back defaults, all modules with WARN level */
6938f118a3e5SKalle Valo 		cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
6939f118a3e5SKalle Valo 			 ATH10K_DBGLOG_CFG_LOG_LVL);
6940f118a3e5SKalle Valo 		module_enable = ~0;
6941f118a3e5SKalle Valo 	}
6942f118a3e5SKalle Valo 
6943f118a3e5SKalle Valo 	cmd->module_enable = __cpu_to_le32(module_enable);
6944f118a3e5SKalle Valo 	cmd->module_valid = __cpu_to_le32(~0);
6945f118a3e5SKalle Valo 	cmd->config_enable = __cpu_to_le32(cfg);
6946f118a3e5SKalle Valo 	cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
6947f118a3e5SKalle Valo 
69487aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6949f118a3e5SKalle Valo 		   "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
6950f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->module_enable),
6951f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->module_valid),
6952f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->config_enable),
6953f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->config_valid));
6954d7579d12SMichal Kazior 	return skb;
6955f118a3e5SKalle Valo }
6956b79b9baaSMichal Kazior 
6957d7579d12SMichal Kazior static struct sk_buff *
6958d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap)
695990174455SRajkumar Manoharan {
696090174455SRajkumar Manoharan 	struct wmi_pdev_pktlog_enable_cmd *cmd;
696190174455SRajkumar Manoharan 	struct sk_buff *skb;
696290174455SRajkumar Manoharan 
696390174455SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
696490174455SRajkumar Manoharan 	if (!skb)
6965d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
696690174455SRajkumar Manoharan 
696790174455SRajkumar Manoharan 	ev_bitmap &= ATH10K_PKTLOG_ANY;
696890174455SRajkumar Manoharan 
696990174455SRajkumar Manoharan 	cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data;
697090174455SRajkumar Manoharan 	cmd->ev_bitmap = __cpu_to_le32(ev_bitmap);
6971d7579d12SMichal Kazior 
6972d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
6973d7579d12SMichal Kazior 		   ev_bitmap);
6974d7579d12SMichal Kazior 	return skb;
697590174455SRajkumar Manoharan }
697690174455SRajkumar Manoharan 
6977d7579d12SMichal Kazior static struct sk_buff *
6978d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar)
697990174455SRajkumar Manoharan {
698090174455SRajkumar Manoharan 	struct sk_buff *skb;
698190174455SRajkumar Manoharan 
698290174455SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, 0);
698390174455SRajkumar Manoharan 	if (!skb)
6984d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
698590174455SRajkumar Manoharan 
698690174455SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
6987d7579d12SMichal Kazior 	return skb;
698890174455SRajkumar Manoharan }
698990174455SRajkumar Manoharan 
6990ffdd738dSRajkumar Manoharan static struct sk_buff *
6991ffdd738dSRajkumar Manoharan ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period,
6992ffdd738dSRajkumar Manoharan 				      u32 duration, u32 next_offset,
6993ffdd738dSRajkumar Manoharan 				      u32 enabled)
6994ffdd738dSRajkumar Manoharan {
6995ffdd738dSRajkumar Manoharan 	struct wmi_pdev_set_quiet_cmd *cmd;
6996ffdd738dSRajkumar Manoharan 	struct sk_buff *skb;
6997ffdd738dSRajkumar Manoharan 
6998ffdd738dSRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6999ffdd738dSRajkumar Manoharan 	if (!skb)
7000ffdd738dSRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
7001ffdd738dSRajkumar Manoharan 
7002ffdd738dSRajkumar Manoharan 	cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data;
7003ffdd738dSRajkumar Manoharan 	cmd->period = __cpu_to_le32(period);
7004ffdd738dSRajkumar Manoharan 	cmd->duration = __cpu_to_le32(duration);
7005ffdd738dSRajkumar Manoharan 	cmd->next_start = __cpu_to_le32(next_offset);
7006ffdd738dSRajkumar Manoharan 	cmd->enabled = __cpu_to_le32(enabled);
7007ffdd738dSRajkumar Manoharan 
7008ffdd738dSRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7009ffdd738dSRajkumar Manoharan 		   "wmi quiet param: period %u duration %u enabled %d\n",
7010ffdd738dSRajkumar Manoharan 		   period, duration, enabled);
7011ffdd738dSRajkumar Manoharan 	return skb;
7012ffdd738dSRajkumar Manoharan }
7013ffdd738dSRajkumar Manoharan 
7014dc8ab278SRajkumar Manoharan static struct sk_buff *
7015dc8ab278SRajkumar Manoharan ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id,
7016dc8ab278SRajkumar Manoharan 				   const u8 *mac)
7017dc8ab278SRajkumar Manoharan {
7018dc8ab278SRajkumar Manoharan 	struct wmi_addba_clear_resp_cmd *cmd;
7019dc8ab278SRajkumar Manoharan 	struct sk_buff *skb;
7020dc8ab278SRajkumar Manoharan 
7021dc8ab278SRajkumar Manoharan 	if (!mac)
7022dc8ab278SRajkumar Manoharan 		return ERR_PTR(-EINVAL);
7023dc8ab278SRajkumar Manoharan 
7024dc8ab278SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7025dc8ab278SRajkumar Manoharan 	if (!skb)
7026dc8ab278SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
7027dc8ab278SRajkumar Manoharan 
7028dc8ab278SRajkumar Manoharan 	cmd = (struct wmi_addba_clear_resp_cmd *)skb->data;
7029dc8ab278SRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
7030dc8ab278SRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
7031dc8ab278SRajkumar Manoharan 
7032dc8ab278SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7033dc8ab278SRajkumar Manoharan 		   "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n",
7034dc8ab278SRajkumar Manoharan 		   vdev_id, mac);
7035dc8ab278SRajkumar Manoharan 	return skb;
7036dc8ab278SRajkumar Manoharan }
7037dc8ab278SRajkumar Manoharan 
703865c0893dSRajkumar Manoharan static struct sk_buff *
703965c0893dSRajkumar Manoharan ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
704065c0893dSRajkumar Manoharan 			     u32 tid, u32 buf_size)
704165c0893dSRajkumar Manoharan {
704265c0893dSRajkumar Manoharan 	struct wmi_addba_send_cmd *cmd;
704365c0893dSRajkumar Manoharan 	struct sk_buff *skb;
704465c0893dSRajkumar Manoharan 
704565c0893dSRajkumar Manoharan 	if (!mac)
704665c0893dSRajkumar Manoharan 		return ERR_PTR(-EINVAL);
704765c0893dSRajkumar Manoharan 
704865c0893dSRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
704965c0893dSRajkumar Manoharan 	if (!skb)
705065c0893dSRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
705165c0893dSRajkumar Manoharan 
705265c0893dSRajkumar Manoharan 	cmd = (struct wmi_addba_send_cmd *)skb->data;
705365c0893dSRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
705465c0893dSRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
705565c0893dSRajkumar Manoharan 	cmd->tid = __cpu_to_le32(tid);
705665c0893dSRajkumar Manoharan 	cmd->buffersize = __cpu_to_le32(buf_size);
705765c0893dSRajkumar Manoharan 
705865c0893dSRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
705965c0893dSRajkumar Manoharan 		   "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n",
706065c0893dSRajkumar Manoharan 		   vdev_id, mac, tid, buf_size);
706165c0893dSRajkumar Manoharan 	return skb;
706265c0893dSRajkumar Manoharan }
706365c0893dSRajkumar Manoharan 
706411597413SRajkumar Manoharan static struct sk_buff *
706511597413SRajkumar Manoharan ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
706611597413SRajkumar Manoharan 				 u32 tid, u32 status)
706711597413SRajkumar Manoharan {
706811597413SRajkumar Manoharan 	struct wmi_addba_setresponse_cmd *cmd;
706911597413SRajkumar Manoharan 	struct sk_buff *skb;
707011597413SRajkumar Manoharan 
707111597413SRajkumar Manoharan 	if (!mac)
707211597413SRajkumar Manoharan 		return ERR_PTR(-EINVAL);
707311597413SRajkumar Manoharan 
707411597413SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
707511597413SRajkumar Manoharan 	if (!skb)
707611597413SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
707711597413SRajkumar Manoharan 
707811597413SRajkumar Manoharan 	cmd = (struct wmi_addba_setresponse_cmd *)skb->data;
707911597413SRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
708011597413SRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
708111597413SRajkumar Manoharan 	cmd->tid = __cpu_to_le32(tid);
708211597413SRajkumar Manoharan 	cmd->statuscode = __cpu_to_le32(status);
708311597413SRajkumar Manoharan 
708411597413SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
708511597413SRajkumar Manoharan 		   "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n",
708611597413SRajkumar Manoharan 		   vdev_id, mac, tid, status);
708711597413SRajkumar Manoharan 	return skb;
708811597413SRajkumar Manoharan }
708911597413SRajkumar Manoharan 
709050abef85SRajkumar Manoharan static struct sk_buff *
709150abef85SRajkumar Manoharan ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
709250abef85SRajkumar Manoharan 			     u32 tid, u32 initiator, u32 reason)
709350abef85SRajkumar Manoharan {
709450abef85SRajkumar Manoharan 	struct wmi_delba_send_cmd *cmd;
709550abef85SRajkumar Manoharan 	struct sk_buff *skb;
709650abef85SRajkumar Manoharan 
709750abef85SRajkumar Manoharan 	if (!mac)
709850abef85SRajkumar Manoharan 		return ERR_PTR(-EINVAL);
709950abef85SRajkumar Manoharan 
710050abef85SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
710150abef85SRajkumar Manoharan 	if (!skb)
710250abef85SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
710350abef85SRajkumar Manoharan 
710450abef85SRajkumar Manoharan 	cmd = (struct wmi_delba_send_cmd *)skb->data;
710550abef85SRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
710650abef85SRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
710750abef85SRajkumar Manoharan 	cmd->tid = __cpu_to_le32(tid);
710850abef85SRajkumar Manoharan 	cmd->initiator = __cpu_to_le32(initiator);
710950abef85SRajkumar Manoharan 	cmd->reasoncode = __cpu_to_le32(reason);
711050abef85SRajkumar Manoharan 
711150abef85SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
711250abef85SRajkumar Manoharan 		   "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n",
711350abef85SRajkumar Manoharan 		   vdev_id, mac, tid, initiator, reason);
711450abef85SRajkumar Manoharan 	return skb;
711550abef85SRajkumar Manoharan }
711650abef85SRajkumar Manoharan 
711729542666SMaharaja Kennadyrajan static struct sk_buff *
711829542666SMaharaja Kennadyrajan ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param)
711929542666SMaharaja Kennadyrajan {
712029542666SMaharaja Kennadyrajan 	struct wmi_pdev_get_tpc_config_cmd *cmd;
712129542666SMaharaja Kennadyrajan 	struct sk_buff *skb;
712229542666SMaharaja Kennadyrajan 
712329542666SMaharaja Kennadyrajan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
712429542666SMaharaja Kennadyrajan 	if (!skb)
712529542666SMaharaja Kennadyrajan 		return ERR_PTR(-ENOMEM);
712629542666SMaharaja Kennadyrajan 
712729542666SMaharaja Kennadyrajan 	cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data;
712829542666SMaharaja Kennadyrajan 	cmd->param = __cpu_to_le32(param);
712929542666SMaharaja Kennadyrajan 
713029542666SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
713129542666SMaharaja Kennadyrajan 		   "wmi pdev get tcp config param:%d\n", param);
713229542666SMaharaja Kennadyrajan 	return skb;
713329542666SMaharaja Kennadyrajan }
713429542666SMaharaja Kennadyrajan 
7135bc6f9ae6SManikanta Pubbisetty size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head)
7136bc6f9ae6SManikanta Pubbisetty {
7137bc6f9ae6SManikanta Pubbisetty 	struct ath10k_fw_stats_peer *i;
7138bc6f9ae6SManikanta Pubbisetty 	size_t num = 0;
7139bc6f9ae6SManikanta Pubbisetty 
7140bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(i, head, list)
7141bc6f9ae6SManikanta Pubbisetty 		++num;
7142bc6f9ae6SManikanta Pubbisetty 
7143bc6f9ae6SManikanta Pubbisetty 	return num;
7144bc6f9ae6SManikanta Pubbisetty }
7145bc6f9ae6SManikanta Pubbisetty 
7146bc6f9ae6SManikanta Pubbisetty size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head)
7147bc6f9ae6SManikanta Pubbisetty {
7148bc6f9ae6SManikanta Pubbisetty 	struct ath10k_fw_stats_vdev *i;
7149bc6f9ae6SManikanta Pubbisetty 	size_t num = 0;
7150bc6f9ae6SManikanta Pubbisetty 
7151bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(i, head, list)
7152bc6f9ae6SManikanta Pubbisetty 		++num;
7153bc6f9ae6SManikanta Pubbisetty 
7154bc6f9ae6SManikanta Pubbisetty 	return num;
7155bc6f9ae6SManikanta Pubbisetty }
7156bc6f9ae6SManikanta Pubbisetty 
7157bc6f9ae6SManikanta Pubbisetty static void
7158bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7159bc6f9ae6SManikanta Pubbisetty 				   char *buf, u32 *length)
7160bc6f9ae6SManikanta Pubbisetty {
7161bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
7162bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7163bc6f9ae6SManikanta Pubbisetty 
7164bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7165bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n",
7166bc6f9ae6SManikanta Pubbisetty 			"ath10k PDEV stats");
7167bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7168bc6f9ae6SManikanta Pubbisetty 			"=================");
7169bc6f9ae6SManikanta Pubbisetty 
7170bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7171bc6f9ae6SManikanta Pubbisetty 			"Channel noise floor", pdev->ch_noise_floor);
7172bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7173bc6f9ae6SManikanta Pubbisetty 			"Channel TX power", pdev->chan_tx_power);
7174bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7175bc6f9ae6SManikanta Pubbisetty 			"TX frame count", pdev->tx_frame_count);
7176bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7177bc6f9ae6SManikanta Pubbisetty 			"RX frame count", pdev->rx_frame_count);
7178bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7179bc6f9ae6SManikanta Pubbisetty 			"RX clear count", pdev->rx_clear_count);
7180bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7181bc6f9ae6SManikanta Pubbisetty 			"Cycle count", pdev->cycle_count);
7182bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7183bc6f9ae6SManikanta Pubbisetty 			"PHY error count", pdev->phy_err_count);
7184bc6f9ae6SManikanta Pubbisetty 
7185bc6f9ae6SManikanta Pubbisetty 	*length = len;
7186bc6f9ae6SManikanta Pubbisetty }
7187bc6f9ae6SManikanta Pubbisetty 
7188bc6f9ae6SManikanta Pubbisetty static void
7189bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7190bc6f9ae6SManikanta Pubbisetty 				    char *buf, u32 *length)
7191bc6f9ae6SManikanta Pubbisetty {
7192bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
7193bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7194bc6f9ae6SManikanta Pubbisetty 
7195bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7196bc6f9ae6SManikanta Pubbisetty 			"RTS bad count", pdev->rts_bad);
7197bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7198bc6f9ae6SManikanta Pubbisetty 			"RTS good count", pdev->rts_good);
7199bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7200bc6f9ae6SManikanta Pubbisetty 			"FCS bad count", pdev->fcs_bad);
7201bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7202bc6f9ae6SManikanta Pubbisetty 			"No beacon count", pdev->no_beacons);
7203bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7204bc6f9ae6SManikanta Pubbisetty 			"MIB int count", pdev->mib_int_count);
7205bc6f9ae6SManikanta Pubbisetty 
7206bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7207bc6f9ae6SManikanta Pubbisetty 	*length = len;
7208bc6f9ae6SManikanta Pubbisetty }
7209bc6f9ae6SManikanta Pubbisetty 
7210bc6f9ae6SManikanta Pubbisetty static void
7211bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7212bc6f9ae6SManikanta Pubbisetty 				 char *buf, u32 *length)
7213bc6f9ae6SManikanta Pubbisetty {
7214bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
7215bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7216bc6f9ae6SManikanta Pubbisetty 
7217bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
7218bc6f9ae6SManikanta Pubbisetty 			 "ath10k PDEV TX stats");
7219bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7220bc6f9ae6SManikanta Pubbisetty 				 "=================");
7221bc6f9ae6SManikanta Pubbisetty 
7222bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7223bc6f9ae6SManikanta Pubbisetty 			 "HTT cookies queued", pdev->comp_queued);
7224bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7225bc6f9ae6SManikanta Pubbisetty 			 "HTT cookies disp.", pdev->comp_delivered);
7226bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7227bc6f9ae6SManikanta Pubbisetty 			 "MSDU queued", pdev->msdu_enqued);
7228bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7229bc6f9ae6SManikanta Pubbisetty 			 "MPDU queued", pdev->mpdu_enqued);
7230bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7231bc6f9ae6SManikanta Pubbisetty 			 "MSDUs dropped", pdev->wmm_drop);
7232bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7233bc6f9ae6SManikanta Pubbisetty 			 "Local enqued", pdev->local_enqued);
7234bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7235bc6f9ae6SManikanta Pubbisetty 			 "Local freed", pdev->local_freed);
7236bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7237bc6f9ae6SManikanta Pubbisetty 			 "HW queued", pdev->hw_queued);
7238bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7239bc6f9ae6SManikanta Pubbisetty 			 "PPDUs reaped", pdev->hw_reaped);
7240bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7241bc6f9ae6SManikanta Pubbisetty 			 "Num underruns", pdev->underrun);
7242bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7243bc6f9ae6SManikanta Pubbisetty 			 "PPDUs cleaned", pdev->tx_abort);
7244bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7245bc6f9ae6SManikanta Pubbisetty 			 "MPDUs requed", pdev->mpdus_requed);
7246bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7247bc6f9ae6SManikanta Pubbisetty 			 "Excessive retries", pdev->tx_ko);
7248bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7249bc6f9ae6SManikanta Pubbisetty 			 "HW rate", pdev->data_rc);
7250bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7251bc6f9ae6SManikanta Pubbisetty 			 "Sched self tiggers", pdev->self_triggers);
7252bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7253bc6f9ae6SManikanta Pubbisetty 			 "Dropped due to SW retries",
7254bc6f9ae6SManikanta Pubbisetty 			 pdev->sw_retry_failure);
7255bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7256bc6f9ae6SManikanta Pubbisetty 			 "Illegal rate phy errors",
7257bc6f9ae6SManikanta Pubbisetty 			 pdev->illgl_rate_phy_err);
7258bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7259bc6f9ae6SManikanta Pubbisetty 			 "Pdev continuous xretry", pdev->pdev_cont_xretry);
7260bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7261bc6f9ae6SManikanta Pubbisetty 			 "TX timeout", pdev->pdev_tx_timeout);
7262bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7263bc6f9ae6SManikanta Pubbisetty 			 "PDEV resets", pdev->pdev_resets);
7264bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7265bc6f9ae6SManikanta Pubbisetty 			 "PHY underrun", pdev->phy_underrun);
7266bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7267bc6f9ae6SManikanta Pubbisetty 			 "MPDU is more than txop limit", pdev->txop_ovf);
7268bc6f9ae6SManikanta Pubbisetty 	*length = len;
7269bc6f9ae6SManikanta Pubbisetty }
7270bc6f9ae6SManikanta Pubbisetty 
7271bc6f9ae6SManikanta Pubbisetty static void
7272bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7273bc6f9ae6SManikanta Pubbisetty 				 char *buf, u32 *length)
7274bc6f9ae6SManikanta Pubbisetty {
7275bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
7276bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7277bc6f9ae6SManikanta Pubbisetty 
7278bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
7279bc6f9ae6SManikanta Pubbisetty 			 "ath10k PDEV RX stats");
7280bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7281bc6f9ae6SManikanta Pubbisetty 				 "=================");
7282bc6f9ae6SManikanta Pubbisetty 
7283bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7284bc6f9ae6SManikanta Pubbisetty 			 "Mid PPDU route change",
7285bc6f9ae6SManikanta Pubbisetty 			 pdev->mid_ppdu_route_change);
7286bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7287bc6f9ae6SManikanta Pubbisetty 			 "Tot. number of statuses", pdev->status_rcvd);
7288bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7289bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 0", pdev->r0_frags);
7290bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7291bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 1", pdev->r1_frags);
7292bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7293bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 2", pdev->r2_frags);
7294bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7295bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 3", pdev->r3_frags);
7296bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7297bc6f9ae6SManikanta Pubbisetty 			 "MSDUs delivered to HTT", pdev->htt_msdus);
7298bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7299bc6f9ae6SManikanta Pubbisetty 			 "MPDUs delivered to HTT", pdev->htt_mpdus);
7300bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7301bc6f9ae6SManikanta Pubbisetty 			 "MSDUs delivered to stack", pdev->loc_msdus);
7302bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7303bc6f9ae6SManikanta Pubbisetty 			 "MPDUs delivered to stack", pdev->loc_mpdus);
7304bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7305bc6f9ae6SManikanta Pubbisetty 			 "Oversized AMSUs", pdev->oversize_amsdu);
7306bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7307bc6f9ae6SManikanta Pubbisetty 			 "PHY errors", pdev->phy_errs);
7308bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7309bc6f9ae6SManikanta Pubbisetty 			 "PHY errors drops", pdev->phy_err_drop);
7310bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7311bc6f9ae6SManikanta Pubbisetty 			 "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs);
7312bc6f9ae6SManikanta Pubbisetty 	*length = len;
7313bc6f9ae6SManikanta Pubbisetty }
7314bc6f9ae6SManikanta Pubbisetty 
7315bc6f9ae6SManikanta Pubbisetty static void
7316bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev,
7317bc6f9ae6SManikanta Pubbisetty 			      char *buf, u32 *length)
7318bc6f9ae6SManikanta Pubbisetty {
7319bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
7320bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7321bc6f9ae6SManikanta Pubbisetty 	int i;
7322bc6f9ae6SManikanta Pubbisetty 
7323bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7324bc6f9ae6SManikanta Pubbisetty 			"vdev id", vdev->vdev_id);
7325bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7326bc6f9ae6SManikanta Pubbisetty 			"beacon snr", vdev->beacon_snr);
7327bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7328bc6f9ae6SManikanta Pubbisetty 			"data snr", vdev->data_snr);
7329bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7330bc6f9ae6SManikanta Pubbisetty 			"num rx frames", vdev->num_rx_frames);
7331bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7332bc6f9ae6SManikanta Pubbisetty 			"num rts fail", vdev->num_rts_fail);
7333bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7334bc6f9ae6SManikanta Pubbisetty 			"num rts success", vdev->num_rts_success);
7335bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7336bc6f9ae6SManikanta Pubbisetty 			"num rx err", vdev->num_rx_err);
7337bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7338bc6f9ae6SManikanta Pubbisetty 			"num rx discard", vdev->num_rx_discard);
7339bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7340bc6f9ae6SManikanta Pubbisetty 			"num tx not acked", vdev->num_tx_not_acked);
7341bc6f9ae6SManikanta Pubbisetty 
7342bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++)
7343bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
7344bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
7345bc6f9ae6SManikanta Pubbisetty 				"num tx frames", i,
7346bc6f9ae6SManikanta Pubbisetty 				vdev->num_tx_frames[i]);
7347bc6f9ae6SManikanta Pubbisetty 
7348bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++)
7349bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
7350bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
7351bc6f9ae6SManikanta Pubbisetty 				"num tx frames retries", i,
7352bc6f9ae6SManikanta Pubbisetty 				vdev->num_tx_frames_retries[i]);
7353bc6f9ae6SManikanta Pubbisetty 
7354bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++)
7355bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
7356bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
7357bc6f9ae6SManikanta Pubbisetty 				"num tx frames failures", i,
7358bc6f9ae6SManikanta Pubbisetty 				vdev->num_tx_frames_failures[i]);
7359bc6f9ae6SManikanta Pubbisetty 
7360bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++)
7361bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
7362bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] 0x%08x\n",
7363bc6f9ae6SManikanta Pubbisetty 				"tx rate history", i,
7364bc6f9ae6SManikanta Pubbisetty 				vdev->tx_rate_history[i]);
7365bc6f9ae6SManikanta Pubbisetty 
7366bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++)
7367bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
7368bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
7369bc6f9ae6SManikanta Pubbisetty 				"beacon rssi history", i,
7370bc6f9ae6SManikanta Pubbisetty 				vdev->beacon_rssi_history[i]);
7371bc6f9ae6SManikanta Pubbisetty 
7372bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7373bc6f9ae6SManikanta Pubbisetty 	*length = len;
7374bc6f9ae6SManikanta Pubbisetty }
7375bc6f9ae6SManikanta Pubbisetty 
7376bc6f9ae6SManikanta Pubbisetty static void
7377bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer,
7378bc6f9ae6SManikanta Pubbisetty 			      char *buf, u32 *length)
7379bc6f9ae6SManikanta Pubbisetty {
7380bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
7381bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7382bc6f9ae6SManikanta Pubbisetty 
7383bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
7384bc6f9ae6SManikanta Pubbisetty 			"Peer MAC address", peer->peer_macaddr);
7385bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7386bc6f9ae6SManikanta Pubbisetty 			"Peer RSSI", peer->peer_rssi);
7387bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7388bc6f9ae6SManikanta Pubbisetty 			"Peer TX rate", peer->peer_tx_rate);
7389bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7390bc6f9ae6SManikanta Pubbisetty 			"Peer RX rate", peer->peer_rx_rate);
7391de46c015SMohammed Shafi Shajakhan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7392de46c015SMohammed Shafi Shajakhan 			"Peer RX duration", peer->rx_duration);
7393de46c015SMohammed Shafi Shajakhan 
7394bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7395bc6f9ae6SManikanta Pubbisetty 	*length = len;
7396bc6f9ae6SManikanta Pubbisetty }
7397bc6f9ae6SManikanta Pubbisetty 
7398bc6f9ae6SManikanta Pubbisetty void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar,
7399bc6f9ae6SManikanta Pubbisetty 				      struct ath10k_fw_stats *fw_stats,
7400bc6f9ae6SManikanta Pubbisetty 				      char *buf)
7401bc6f9ae6SManikanta Pubbisetty {
7402bc6f9ae6SManikanta Pubbisetty 	u32 len = 0;
7403bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7404bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_pdev *pdev;
7405bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_vdev *vdev;
7406bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_peer *peer;
7407bc6f9ae6SManikanta Pubbisetty 	size_t num_peers;
7408bc6f9ae6SManikanta Pubbisetty 	size_t num_vdevs;
7409bc6f9ae6SManikanta Pubbisetty 
7410bc6f9ae6SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
7411bc6f9ae6SManikanta Pubbisetty 
7412bc6f9ae6SManikanta Pubbisetty 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
7413bc6f9ae6SManikanta Pubbisetty 					struct ath10k_fw_stats_pdev, list);
7414bc6f9ae6SManikanta Pubbisetty 	if (!pdev) {
7415bc6f9ae6SManikanta Pubbisetty 		ath10k_warn(ar, "failed to get pdev stats\n");
7416bc6f9ae6SManikanta Pubbisetty 		goto unlock;
7417bc6f9ae6SManikanta Pubbisetty 	}
7418bc6f9ae6SManikanta Pubbisetty 
7419bc6f9ae6SManikanta Pubbisetty 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
7420bc6f9ae6SManikanta Pubbisetty 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
7421bc6f9ae6SManikanta Pubbisetty 
7422bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
7423bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
7424bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
7425bc6f9ae6SManikanta Pubbisetty 
7426bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7427bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7428bc6f9ae6SManikanta Pubbisetty 			 "ath10k VDEV stats", num_vdevs);
7429bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7430bc6f9ae6SManikanta Pubbisetty 				 "=================");
7431bc6f9ae6SManikanta Pubbisetty 
7432bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
7433bc6f9ae6SManikanta Pubbisetty 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
7434bc6f9ae6SManikanta Pubbisetty 	}
7435bc6f9ae6SManikanta Pubbisetty 
7436bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7437bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7438bc6f9ae6SManikanta Pubbisetty 			 "ath10k PEER stats", num_peers);
7439bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7440bc6f9ae6SManikanta Pubbisetty 				 "=================");
7441bc6f9ae6SManikanta Pubbisetty 
7442bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(peer, &fw_stats->peers, list) {
7443bc6f9ae6SManikanta Pubbisetty 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
7444bc6f9ae6SManikanta Pubbisetty 	}
7445bc6f9ae6SManikanta Pubbisetty 
7446bc6f9ae6SManikanta Pubbisetty unlock:
7447bc6f9ae6SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
7448bc6f9ae6SManikanta Pubbisetty 
7449bc6f9ae6SManikanta Pubbisetty 	if (len >= buf_len)
7450bc6f9ae6SManikanta Pubbisetty 		buf[len - 1] = 0;
7451bc6f9ae6SManikanta Pubbisetty 	else
7452bc6f9ae6SManikanta Pubbisetty 		buf[len] = 0;
7453bc6f9ae6SManikanta Pubbisetty }
7454bc6f9ae6SManikanta Pubbisetty 
7455bc6f9ae6SManikanta Pubbisetty void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar,
7456bc6f9ae6SManikanta Pubbisetty 				     struct ath10k_fw_stats *fw_stats,
7457bc6f9ae6SManikanta Pubbisetty 				     char *buf)
7458bc6f9ae6SManikanta Pubbisetty {
7459bc6f9ae6SManikanta Pubbisetty 	unsigned int len = 0;
7460bc6f9ae6SManikanta Pubbisetty 	unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
7461bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_pdev *pdev;
7462bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_vdev *vdev;
7463bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_peer *peer;
7464bc6f9ae6SManikanta Pubbisetty 	size_t num_peers;
7465bc6f9ae6SManikanta Pubbisetty 	size_t num_vdevs;
7466bc6f9ae6SManikanta Pubbisetty 
7467bc6f9ae6SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
7468bc6f9ae6SManikanta Pubbisetty 
7469bc6f9ae6SManikanta Pubbisetty 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
7470bc6f9ae6SManikanta Pubbisetty 					struct ath10k_fw_stats_pdev, list);
7471bc6f9ae6SManikanta Pubbisetty 	if (!pdev) {
7472bc6f9ae6SManikanta Pubbisetty 		ath10k_warn(ar, "failed to get pdev stats\n");
7473bc6f9ae6SManikanta Pubbisetty 		goto unlock;
7474bc6f9ae6SManikanta Pubbisetty 	}
7475bc6f9ae6SManikanta Pubbisetty 
7476bc6f9ae6SManikanta Pubbisetty 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
7477bc6f9ae6SManikanta Pubbisetty 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
7478bc6f9ae6SManikanta Pubbisetty 
7479bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
7480bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
7481bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
7482bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
7483bc6f9ae6SManikanta Pubbisetty 
7484bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7485bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7486bc6f9ae6SManikanta Pubbisetty 			 "ath10k VDEV stats", num_vdevs);
7487bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7488bc6f9ae6SManikanta Pubbisetty 				 "=================");
7489bc6f9ae6SManikanta Pubbisetty 
7490bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
7491bc6f9ae6SManikanta Pubbisetty 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
7492bc6f9ae6SManikanta Pubbisetty 	}
7493bc6f9ae6SManikanta Pubbisetty 
7494bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
7495bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7496bc6f9ae6SManikanta Pubbisetty 			 "ath10k PEER stats", num_peers);
7497bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7498bc6f9ae6SManikanta Pubbisetty 				 "=================");
7499bc6f9ae6SManikanta Pubbisetty 
7500bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(peer, &fw_stats->peers, list) {
7501bc6f9ae6SManikanta Pubbisetty 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
7502bc6f9ae6SManikanta Pubbisetty 	}
7503bc6f9ae6SManikanta Pubbisetty 
7504bc6f9ae6SManikanta Pubbisetty unlock:
7505bc6f9ae6SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
7506bc6f9ae6SManikanta Pubbisetty 
7507bc6f9ae6SManikanta Pubbisetty 	if (len >= buf_len)
7508bc6f9ae6SManikanta Pubbisetty 		buf[len - 1] = 0;
7509bc6f9ae6SManikanta Pubbisetty 	else
7510bc6f9ae6SManikanta Pubbisetty 		buf[len] = 0;
7511bc6f9ae6SManikanta Pubbisetty }
7512bc6f9ae6SManikanta Pubbisetty 
751362f77f09SMaharaja static struct sk_buff *
751462f77f09SMaharaja ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
751562f77f09SMaharaja 					   u32 detect_level, u32 detect_margin)
751662f77f09SMaharaja {
751762f77f09SMaharaja 	struct wmi_pdev_set_adaptive_cca_params *cmd;
751862f77f09SMaharaja 	struct sk_buff *skb;
751962f77f09SMaharaja 
752062f77f09SMaharaja 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
752162f77f09SMaharaja 	if (!skb)
752262f77f09SMaharaja 		return ERR_PTR(-ENOMEM);
752362f77f09SMaharaja 
752462f77f09SMaharaja 	cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data;
752562f77f09SMaharaja 	cmd->enable = __cpu_to_le32(enable);
752662f77f09SMaharaja 	cmd->cca_detect_level = __cpu_to_le32(detect_level);
752762f77f09SMaharaja 	cmd->cca_detect_margin = __cpu_to_le32(detect_margin);
752862f77f09SMaharaja 
752962f77f09SMaharaja 	ath10k_dbg(ar, ATH10K_DBG_WMI,
753062f77f09SMaharaja 		   "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
753162f77f09SMaharaja 		   enable, detect_level, detect_margin);
753262f77f09SMaharaja 	return skb;
753362f77f09SMaharaja }
753462f77f09SMaharaja 
753598dd2b92SManikanta Pubbisetty void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar,
753698dd2b92SManikanta Pubbisetty 				      struct ath10k_fw_stats *fw_stats,
753798dd2b92SManikanta Pubbisetty 				      char *buf)
753898dd2b92SManikanta Pubbisetty {
753998dd2b92SManikanta Pubbisetty 	u32 len = 0;
754098dd2b92SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
754198dd2b92SManikanta Pubbisetty 	const struct ath10k_fw_stats_pdev *pdev;
754298dd2b92SManikanta Pubbisetty 	const struct ath10k_fw_stats_vdev *vdev;
754398dd2b92SManikanta Pubbisetty 	const struct ath10k_fw_stats_peer *peer;
754498dd2b92SManikanta Pubbisetty 	size_t num_peers;
754598dd2b92SManikanta Pubbisetty 	size_t num_vdevs;
754698dd2b92SManikanta Pubbisetty 
754798dd2b92SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
754898dd2b92SManikanta Pubbisetty 
754998dd2b92SManikanta Pubbisetty 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
755098dd2b92SManikanta Pubbisetty 					struct ath10k_fw_stats_pdev, list);
755198dd2b92SManikanta Pubbisetty 	if (!pdev) {
755298dd2b92SManikanta Pubbisetty 		ath10k_warn(ar, "failed to get pdev stats\n");
755398dd2b92SManikanta Pubbisetty 		goto unlock;
755498dd2b92SManikanta Pubbisetty 	}
755598dd2b92SManikanta Pubbisetty 
755698dd2b92SManikanta Pubbisetty 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
755798dd2b92SManikanta Pubbisetty 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
755898dd2b92SManikanta Pubbisetty 
755998dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
756098dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
756198dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
756298dd2b92SManikanta Pubbisetty 
756398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
756498dd2b92SManikanta Pubbisetty 			"HW paused", pdev->hw_paused);
756598dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
756698dd2b92SManikanta Pubbisetty 			"Seqs posted", pdev->seq_posted);
756798dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
756898dd2b92SManikanta Pubbisetty 			"Seqs failed queueing", pdev->seq_failed_queueing);
756998dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
757098dd2b92SManikanta Pubbisetty 			"Seqs completed", pdev->seq_completed);
757198dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
757298dd2b92SManikanta Pubbisetty 			"Seqs restarted", pdev->seq_restarted);
757398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
757498dd2b92SManikanta Pubbisetty 			"MU Seqs posted", pdev->mu_seq_posted);
757598dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
757698dd2b92SManikanta Pubbisetty 			"MPDUs SW flushed", pdev->mpdus_sw_flush);
757798dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
757898dd2b92SManikanta Pubbisetty 			"MPDUs HW filtered", pdev->mpdus_hw_filter);
757998dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
758098dd2b92SManikanta Pubbisetty 			"MPDUs truncated", pdev->mpdus_truncated);
758198dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
758298dd2b92SManikanta Pubbisetty 			"MPDUs receive no ACK", pdev->mpdus_ack_failed);
758398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
758498dd2b92SManikanta Pubbisetty 			"MPDUs expired", pdev->mpdus_expired);
758598dd2b92SManikanta Pubbisetty 
758698dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
758798dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
758898dd2b92SManikanta Pubbisetty 			"Num Rx Overflow errors", pdev->rx_ovfl_errs);
758998dd2b92SManikanta Pubbisetty 
759098dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
759198dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
759298dd2b92SManikanta Pubbisetty 			"ath10k VDEV stats", num_vdevs);
759398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
759498dd2b92SManikanta Pubbisetty 				"=================");
759598dd2b92SManikanta Pubbisetty 
759698dd2b92SManikanta Pubbisetty 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
759798dd2b92SManikanta Pubbisetty 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
759898dd2b92SManikanta Pubbisetty 	}
759998dd2b92SManikanta Pubbisetty 
760098dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
760198dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
760298dd2b92SManikanta Pubbisetty 			"ath10k PEER stats", num_peers);
760398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
760498dd2b92SManikanta Pubbisetty 				"=================");
760598dd2b92SManikanta Pubbisetty 
760698dd2b92SManikanta Pubbisetty 	list_for_each_entry(peer, &fw_stats->peers, list) {
760798dd2b92SManikanta Pubbisetty 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
760898dd2b92SManikanta Pubbisetty 	}
760998dd2b92SManikanta Pubbisetty 
761098dd2b92SManikanta Pubbisetty unlock:
761198dd2b92SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
761298dd2b92SManikanta Pubbisetty 
761398dd2b92SManikanta Pubbisetty 	if (len >= buf_len)
761498dd2b92SManikanta Pubbisetty 		buf[len - 1] = 0;
761598dd2b92SManikanta Pubbisetty 	else
761698dd2b92SManikanta Pubbisetty 		buf[len] = 0;
761798dd2b92SManikanta Pubbisetty }
761898dd2b92SManikanta Pubbisetty 
76196e4de1a4SPeter Oh int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar,
76206e4de1a4SPeter Oh 				   enum wmi_vdev_subtype subtype)
76216e4de1a4SPeter Oh {
76226e4de1a4SPeter Oh 	switch (subtype) {
76236e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_NONE:
76246e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_NONE;
76256e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_DEVICE:
76266e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV;
76276e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_CLIENT:
76286e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI;
76296e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_GO:
76306e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO;
76316e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_PROXY_STA:
76326e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA;
76336e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_11S:
76346e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_NON_11S:
76356e4de1a4SPeter Oh 		return -ENOTSUPP;
76366e4de1a4SPeter Oh 	}
76376e4de1a4SPeter Oh 	return -ENOTSUPP;
76386e4de1a4SPeter Oh }
76396e4de1a4SPeter Oh 
76406e4de1a4SPeter Oh static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar,
76416e4de1a4SPeter Oh 						 enum wmi_vdev_subtype subtype)
76426e4de1a4SPeter Oh {
76436e4de1a4SPeter Oh 	switch (subtype) {
76446e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_NONE:
76456e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_NONE;
76466e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_DEVICE:
76476e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV;
76486e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_CLIENT:
76496e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI;
76506e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_GO:
76516e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO;
76526e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_PROXY_STA:
76536e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA;
76546e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_11S:
76556e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S;
76566e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_NON_11S:
76576e4de1a4SPeter Oh 		return -ENOTSUPP;
76586e4de1a4SPeter Oh 	}
76596e4de1a4SPeter Oh 	return -ENOTSUPP;
76606e4de1a4SPeter Oh }
76616e4de1a4SPeter Oh 
76626e4de1a4SPeter Oh static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar,
76636e4de1a4SPeter Oh 					       enum wmi_vdev_subtype subtype)
76646e4de1a4SPeter Oh {
76656e4de1a4SPeter Oh 	switch (subtype) {
76666e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_NONE:
76676e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_NONE;
76686e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_DEVICE:
76696e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_P2P_DEV;
76706e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_CLIENT:
76716e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_P2P_CLI;
76726e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_GO:
76736e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_P2P_GO;
76746e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_PROXY_STA:
76756e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_PROXY_STA;
76766e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_11S:
76776e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_MESH_11S;
76786e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_NON_11S:
76796e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S;
76806e4de1a4SPeter Oh 	}
76816e4de1a4SPeter Oh 	return -ENOTSUPP;
76826e4de1a4SPeter Oh }
76836e4de1a4SPeter Oh 
768447771902SRaja Mani static struct sk_buff *
768547771902SRaja Mani ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar,
768647771902SRaja Mani 				    enum wmi_host_platform_type type,
768747771902SRaja Mani 				    u32 fw_feature_bitmap)
768847771902SRaja Mani {
768947771902SRaja Mani 	struct wmi_ext_resource_config_10_4_cmd *cmd;
769047771902SRaja Mani 	struct sk_buff *skb;
769147771902SRaja Mani 
769247771902SRaja Mani 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
769347771902SRaja Mani 	if (!skb)
769447771902SRaja Mani 		return ERR_PTR(-ENOMEM);
769547771902SRaja Mani 
769647771902SRaja Mani 	cmd = (struct wmi_ext_resource_config_10_4_cmd *)skb->data;
769747771902SRaja Mani 	cmd->host_platform_config = __cpu_to_le32(type);
769847771902SRaja Mani 	cmd->fw_feature_bitmap = __cpu_to_le32(fw_feature_bitmap);
769947771902SRaja Mani 
770047771902SRaja Mani 	ath10k_dbg(ar, ATH10K_DBG_WMI,
770147771902SRaja Mani 		   "wmi ext resource config host type %d firmware feature bitmap %08x\n",
770247771902SRaja Mani 		   type, fw_feature_bitmap);
770347771902SRaja Mani 	return skb;
770447771902SRaja Mani }
770547771902SRaja Mani 
7706e25854f2SMichal Kazior static struct sk_buff *
7707e25854f2SMichal Kazior ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value)
7708e25854f2SMichal Kazior {
7709e25854f2SMichal Kazior 	struct wmi_echo_cmd *cmd;
7710e25854f2SMichal Kazior 	struct sk_buff *skb;
7711e25854f2SMichal Kazior 
7712e25854f2SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7713e25854f2SMichal Kazior 	if (!skb)
7714e25854f2SMichal Kazior 		return ERR_PTR(-ENOMEM);
7715e25854f2SMichal Kazior 
7716e25854f2SMichal Kazior 	cmd = (struct wmi_echo_cmd *)skb->data;
7717e25854f2SMichal Kazior 	cmd->value = cpu_to_le32(value);
7718e25854f2SMichal Kazior 
7719e25854f2SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7720e25854f2SMichal Kazior 		   "wmi echo value 0x%08x\n", value);
7721e25854f2SMichal Kazior 	return skb;
7722e25854f2SMichal Kazior }
7723e25854f2SMichal Kazior 
772420ddca21SMichal Kazior int
772520ddca21SMichal Kazior ath10k_wmi_barrier(struct ath10k *ar)
772620ddca21SMichal Kazior {
772720ddca21SMichal Kazior 	int ret;
772820ddca21SMichal Kazior 	int time_left;
772920ddca21SMichal Kazior 
773020ddca21SMichal Kazior 	spin_lock_bh(&ar->data_lock);
773120ddca21SMichal Kazior 	reinit_completion(&ar->wmi.barrier);
773220ddca21SMichal Kazior 	spin_unlock_bh(&ar->data_lock);
773320ddca21SMichal Kazior 
773420ddca21SMichal Kazior 	ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID);
773520ddca21SMichal Kazior 	if (ret) {
773620ddca21SMichal Kazior 		ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret);
773720ddca21SMichal Kazior 		return ret;
773820ddca21SMichal Kazior 	}
773920ddca21SMichal Kazior 
774020ddca21SMichal Kazior 	time_left = wait_for_completion_timeout(&ar->wmi.barrier,
774120ddca21SMichal Kazior 						ATH10K_WMI_BARRIER_TIMEOUT_HZ);
774220ddca21SMichal Kazior 	if (!time_left)
774320ddca21SMichal Kazior 		return -ETIMEDOUT;
774420ddca21SMichal Kazior 
774520ddca21SMichal Kazior 	return 0;
774620ddca21SMichal Kazior }
774720ddca21SMichal Kazior 
7748d7579d12SMichal Kazior static const struct wmi_ops wmi_ops = {
7749d7579d12SMichal Kazior 	.rx = ath10k_wmi_op_rx,
7750d7579d12SMichal Kazior 	.map_svc = wmi_main_svc_map,
7751d7579d12SMichal Kazior 
7752d7579d12SMichal Kazior 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7753d7579d12SMichal Kazior 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7754d7579d12SMichal Kazior 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7755d7579d12SMichal Kazior 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7756d7579d12SMichal Kazior 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7757d7579d12SMichal Kazior 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7758991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7759d7579d12SMichal Kazior 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7760d7579d12SMichal Kazior 	.pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
7761d7579d12SMichal Kazior 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7762d7579d12SMichal Kazior 	.pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats,
7763c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
776484d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
7765d7579d12SMichal Kazior 
7766d7579d12SMichal Kazior 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7767d7579d12SMichal Kazior 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7768d7579d12SMichal Kazior 	.gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd,
7769d7579d12SMichal Kazior 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7770d7579d12SMichal Kazior 	.gen_init = ath10k_wmi_op_gen_init,
7771d7579d12SMichal Kazior 	.gen_start_scan = ath10k_wmi_op_gen_start_scan,
7772d7579d12SMichal Kazior 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7773d7579d12SMichal Kazior 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7774d7579d12SMichal Kazior 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7775d7579d12SMichal Kazior 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7776d7579d12SMichal Kazior 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7777d7579d12SMichal Kazior 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7778d7579d12SMichal Kazior 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7779d7579d12SMichal Kazior 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7780d7579d12SMichal Kazior 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7781d7579d12SMichal Kazior 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7782d7579d12SMichal Kazior 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
77836d492fe2SMichal Kazior 	/* .gen_vdev_wmm_conf not implemented */
7784d7579d12SMichal Kazior 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7785d7579d12SMichal Kazior 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7786d7579d12SMichal Kazior 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7787d7579d12SMichal Kazior 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7788d7579d12SMichal Kazior 	.gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc,
7789d7579d12SMichal Kazior 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7790d7579d12SMichal Kazior 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7791d7579d12SMichal Kazior 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7792d7579d12SMichal Kazior 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7793d7579d12SMichal Kazior 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7794d7579d12SMichal Kazior 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7795d7579d12SMichal Kazior 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7796d7579d12SMichal Kazior 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7797d7579d12SMichal Kazior 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7798d7579d12SMichal Kazior 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7799d7579d12SMichal Kazior 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7800d7579d12SMichal Kazior 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7801ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7802a57a6a27SRajkumar Manoharan 	/* .gen_pdev_get_temperature not implemented */
7803dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
780465c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
780511597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
780650abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7807bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
78086e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
7809e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
7810be9ce9d8SMichal Kazior 	/* .gen_bcn_tmpl not implemented */
78114c4955feSMichal Kazior 	/* .gen_prb_tmpl not implemented */
7812369242b4SMichal Kazior 	/* .gen_p2p_go_bcn_ie not implemented */
78135b272e30SMichal Kazior 	/* .gen_adaptive_qcs not implemented */
781462f77f09SMaharaja 	/* .gen_pdev_enable_adaptive_cca not implemented */
7815d7579d12SMichal Kazior };
7816d7579d12SMichal Kazior 
7817d7579d12SMichal Kazior static const struct wmi_ops wmi_10_1_ops = {
7818d7579d12SMichal Kazior 	.rx = ath10k_wmi_10_1_op_rx,
7819d7579d12SMichal Kazior 	.map_svc = wmi_10x_svc_map,
7820d7579d12SMichal Kazior 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
7821d7579d12SMichal Kazior 	.pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats,
7822d7579d12SMichal Kazior 	.gen_init = ath10k_wmi_10_1_op_gen_init,
7823d7579d12SMichal Kazior 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
7824d7579d12SMichal Kazior 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
7825d7579d12SMichal Kazior 	.gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc,
7826a57a6a27SRajkumar Manoharan 	/* .gen_pdev_get_temperature not implemented */
7827d7579d12SMichal Kazior 
7828d7579d12SMichal Kazior 	/* shared with main branch */
7829d7579d12SMichal Kazior 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7830d7579d12SMichal Kazior 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7831d7579d12SMichal Kazior 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7832d7579d12SMichal Kazior 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7833d7579d12SMichal Kazior 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7834d7579d12SMichal Kazior 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7835991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7836d7579d12SMichal Kazior 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7837d7579d12SMichal Kazior 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7838c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
783984d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
7840d7579d12SMichal Kazior 
7841d7579d12SMichal Kazior 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7842d7579d12SMichal Kazior 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7843d7579d12SMichal Kazior 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7844d7579d12SMichal Kazior 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7845d7579d12SMichal Kazior 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7846d7579d12SMichal Kazior 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7847d7579d12SMichal Kazior 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7848d7579d12SMichal Kazior 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7849d7579d12SMichal Kazior 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7850d7579d12SMichal Kazior 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7851d7579d12SMichal Kazior 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7852d7579d12SMichal Kazior 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7853d7579d12SMichal Kazior 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7854d7579d12SMichal Kazior 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
78556d492fe2SMichal Kazior 	/* .gen_vdev_wmm_conf not implemented */
7856d7579d12SMichal Kazior 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7857d7579d12SMichal Kazior 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7858d7579d12SMichal Kazior 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7859d7579d12SMichal Kazior 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7860d7579d12SMichal Kazior 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7861d7579d12SMichal Kazior 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7862d7579d12SMichal Kazior 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7863d7579d12SMichal Kazior 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7864d7579d12SMichal Kazior 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7865d7579d12SMichal Kazior 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7866d7579d12SMichal Kazior 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7867d7579d12SMichal Kazior 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7868d7579d12SMichal Kazior 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7869d7579d12SMichal Kazior 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7870d7579d12SMichal Kazior 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7871d7579d12SMichal Kazior 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7872ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7873dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
787465c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
787511597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
787650abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7877bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
78786e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
7879e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
7880be9ce9d8SMichal Kazior 	/* .gen_bcn_tmpl not implemented */
78814c4955feSMichal Kazior 	/* .gen_prb_tmpl not implemented */
7882369242b4SMichal Kazior 	/* .gen_p2p_go_bcn_ie not implemented */
78835b272e30SMichal Kazior 	/* .gen_adaptive_qcs not implemented */
788462f77f09SMaharaja 	/* .gen_pdev_enable_adaptive_cca not implemented */
7885d7579d12SMichal Kazior };
7886d7579d12SMichal Kazior 
7887d7579d12SMichal Kazior static const struct wmi_ops wmi_10_2_ops = {
7888d7579d12SMichal Kazior 	.rx = ath10k_wmi_10_2_op_rx,
788920de2229SMichal Kazior 	.pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats,
7890d7579d12SMichal Kazior 	.gen_init = ath10k_wmi_10_2_op_gen_init,
7891d7579d12SMichal Kazior 	.gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
7892a57a6a27SRajkumar Manoharan 	/* .gen_pdev_get_temperature not implemented */
7893d7579d12SMichal Kazior 
7894d7579d12SMichal Kazior 	/* shared with 10.1 */
7895d7579d12SMichal Kazior 	.map_svc = wmi_10x_svc_map,
7896d7579d12SMichal Kazior 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
7897d7579d12SMichal Kazior 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
7898d7579d12SMichal Kazior 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
7899e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
7900d7579d12SMichal Kazior 
7901d7579d12SMichal Kazior 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
7902d7579d12SMichal Kazior 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
7903d7579d12SMichal Kazior 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
7904d7579d12SMichal Kazior 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
7905d7579d12SMichal Kazior 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
7906d7579d12SMichal Kazior 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
7907991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
7908d7579d12SMichal Kazior 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
7909d7579d12SMichal Kazior 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7910c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
791184d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
7912d7579d12SMichal Kazior 
7913d7579d12SMichal Kazior 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
7914d7579d12SMichal Kazior 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
7915d7579d12SMichal Kazior 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
7916d7579d12SMichal Kazior 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
7917d7579d12SMichal Kazior 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
7918d7579d12SMichal Kazior 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
7919d7579d12SMichal Kazior 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
7920d7579d12SMichal Kazior 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
7921d7579d12SMichal Kazior 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
7922d7579d12SMichal Kazior 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
7923d7579d12SMichal Kazior 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
7924d7579d12SMichal Kazior 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
7925d7579d12SMichal Kazior 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
7926d7579d12SMichal Kazior 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
79276d492fe2SMichal Kazior 	/* .gen_vdev_wmm_conf not implemented */
7928d7579d12SMichal Kazior 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
7929d7579d12SMichal Kazior 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
7930d7579d12SMichal Kazior 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
7931d7579d12SMichal Kazior 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
7932d7579d12SMichal Kazior 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
7933d7579d12SMichal Kazior 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
7934d7579d12SMichal Kazior 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
7935d7579d12SMichal Kazior 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
7936d7579d12SMichal Kazior 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
7937d7579d12SMichal Kazior 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
7938d7579d12SMichal Kazior 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
7939d7579d12SMichal Kazior 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
7940d7579d12SMichal Kazior 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
7941d7579d12SMichal Kazior 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
7942d7579d12SMichal Kazior 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
7943d7579d12SMichal Kazior 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
7944ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
7945dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
794665c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
794711597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
794850abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
7949bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
79506e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
795162f77f09SMaharaja 	/* .gen_pdev_enable_adaptive_cca not implemented */
7952d7579d12SMichal Kazior };
7953d7579d12SMichal Kazior 
79544a16fbecSRajkumar Manoharan static const struct wmi_ops wmi_10_2_4_ops = {
79554a16fbecSRajkumar Manoharan 	.rx = ath10k_wmi_10_2_op_rx,
795620de2229SMichal Kazior 	.pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats,
79574a16fbecSRajkumar Manoharan 	.gen_init = ath10k_wmi_10_2_op_gen_init,
79584a16fbecSRajkumar Manoharan 	.gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
7959a57a6a27SRajkumar Manoharan 	.gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
79608a0b459eSRajkumar Manoharan 	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
79614a16fbecSRajkumar Manoharan 
79624a16fbecSRajkumar Manoharan 	/* shared with 10.1 */
79634a16fbecSRajkumar Manoharan 	.map_svc = wmi_10x_svc_map,
79644a16fbecSRajkumar Manoharan 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
79654a16fbecSRajkumar Manoharan 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
79664a16fbecSRajkumar Manoharan 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
7967e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
79684a16fbecSRajkumar Manoharan 
79694a16fbecSRajkumar Manoharan 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
79704a16fbecSRajkumar Manoharan 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
79714a16fbecSRajkumar Manoharan 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
79724a16fbecSRajkumar Manoharan 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
79734a16fbecSRajkumar Manoharan 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
79748b019fb0SYanbo Li 	.pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev,
7975991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
79764a16fbecSRajkumar Manoharan 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
79774a16fbecSRajkumar Manoharan 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7978c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
797984d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
79804a16fbecSRajkumar Manoharan 
79814a16fbecSRajkumar Manoharan 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
79824a16fbecSRajkumar Manoharan 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
79834a16fbecSRajkumar Manoharan 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
79844a16fbecSRajkumar Manoharan 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
79854a16fbecSRajkumar Manoharan 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
79864a16fbecSRajkumar Manoharan 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
79874a16fbecSRajkumar Manoharan 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
79884a16fbecSRajkumar Manoharan 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
79894a16fbecSRajkumar Manoharan 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
79904a16fbecSRajkumar Manoharan 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
79914a16fbecSRajkumar Manoharan 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
79924a16fbecSRajkumar Manoharan 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
79934a16fbecSRajkumar Manoharan 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
79944a16fbecSRajkumar Manoharan 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
79954a16fbecSRajkumar Manoharan 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
79964a16fbecSRajkumar Manoharan 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
79974a16fbecSRajkumar Manoharan 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
79984a16fbecSRajkumar Manoharan 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
79994a16fbecSRajkumar Manoharan 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
80004a16fbecSRajkumar Manoharan 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
80014a16fbecSRajkumar Manoharan 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
80024a16fbecSRajkumar Manoharan 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
80034a16fbecSRajkumar Manoharan 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
80044a16fbecSRajkumar Manoharan 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
80054a16fbecSRajkumar Manoharan 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
80064a16fbecSRajkumar Manoharan 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
80074a16fbecSRajkumar Manoharan 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
80084a16fbecSRajkumar Manoharan 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
80094a16fbecSRajkumar Manoharan 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
80104a16fbecSRajkumar Manoharan 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8011ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8012dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
801365c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
801411597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
801550abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
801629542666SMaharaja Kennadyrajan 	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
8017bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
801862f77f09SMaharaja 	.gen_pdev_enable_adaptive_cca =
801962f77f09SMaharaja 		ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
80206e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
8021be9ce9d8SMichal Kazior 	/* .gen_bcn_tmpl not implemented */
80224c4955feSMichal Kazior 	/* .gen_prb_tmpl not implemented */
8023369242b4SMichal Kazior 	/* .gen_p2p_go_bcn_ie not implemented */
80245b272e30SMichal Kazior 	/* .gen_adaptive_qcs not implemented */
80254a16fbecSRajkumar Manoharan };
80264a16fbecSRajkumar Manoharan 
8027840357ccSRaja Mani static const struct wmi_ops wmi_10_4_ops = {
80281c092961SRaja Mani 	.rx = ath10k_wmi_10_4_op_rx,
8029840357ccSRaja Mani 	.map_svc = wmi_10_4_svc_map,
8030b2297baaSRaja Mani 
803198dd2b92SManikanta Pubbisetty 	.pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats,
8032b2297baaSRaja Mani 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
80331c092961SRaja Mani 	.pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev,
8034b2297baaSRaja Mani 	.pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev,
8035373b48cfSRaja Mani 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8036373b48cfSRaja Mani 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
80373cec3be3SRaja Mani 	.pull_swba = ath10k_wmi_10_4_op_pull_swba_ev,
80382b0a2e0dSRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr,
80392b0a2e0dSRaja Mani 	.pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
80401c092961SRaja Mani 	.pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
8041d02e752fSRaja Mani 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8042343bf960SMohammed Shafi Shajakhan 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
804308e75ea8SVivek Natarajan 	.get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,
8044373b48cfSRaja Mani 
8045373b48cfSRaja Mani 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8046373b48cfSRaja Mani 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8047373b48cfSRaja Mani 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
8048373b48cfSRaja Mani 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8049d1e52a8eSRaja Mani 	.gen_init = ath10k_wmi_10_4_op_gen_init,
8050b2297baaSRaja Mani 	.gen_start_scan = ath10k_wmi_op_gen_start_scan,
8051b2297baaSRaja Mani 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8052373b48cfSRaja Mani 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8053373b48cfSRaja Mani 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8054373b48cfSRaja Mani 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8055373b48cfSRaja Mani 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8056373b48cfSRaja Mani 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8057373b48cfSRaja Mani 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8058373b48cfSRaja Mani 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8059373b48cfSRaja Mani 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
80604535edbdSRaja Mani 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
80614535edbdSRaja Mani 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8062373b48cfSRaja Mani 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
8063373b48cfSRaja Mani 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8064373b48cfSRaja Mani 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8065373b48cfSRaja Mani 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8066b54e16f1SVasanthakumar Thiagarajan 	.gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc,
8067373b48cfSRaja Mani 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8068373b48cfSRaja Mani 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8069373b48cfSRaja Mani 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8070373b48cfSRaja Mani 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8071373b48cfSRaja Mani 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8072373b48cfSRaja Mani 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8073373b48cfSRaja Mani 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8074373b48cfSRaja Mani 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8075373b48cfSRaja Mani 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8076373b48cfSRaja Mani 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8077373b48cfSRaja Mani 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8078373b48cfSRaja Mani 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8079b2887410SVasanthakumar Thiagarajan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8080b2887410SVasanthakumar Thiagarajan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
8081b2887410SVasanthakumar Thiagarajan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8082b2887410SVasanthakumar Thiagarajan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
808398dd2b92SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill,
808447771902SRaja Mani 	.ext_resource_config = ath10k_wmi_10_4_ext_resource_config,
8085373b48cfSRaja Mani 
8086373b48cfSRaja Mani 	/* shared with 10.2 */
808784d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
808898dd2b92SManikanta Pubbisetty 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
80896dd46348STamizh chelvam 	.gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
80906e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype,
80918a0b459eSRajkumar Manoharan 	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
8092e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
8093840357ccSRaja Mani };
8094840357ccSRaja Mani 
8095b79b9baaSMichal Kazior int ath10k_wmi_attach(struct ath10k *ar)
8096b79b9baaSMichal Kazior {
8097bf3c13abSKalle Valo 	switch (ar->running_fw->fw_file.wmi_op_version) {
80989bd21322SRaja Mani 	case ATH10K_FW_WMI_OP_VERSION_10_4:
8099840357ccSRaja Mani 		ar->wmi.ops = &wmi_10_4_ops;
81002d491e69SRaja Mani 		ar->wmi.cmd = &wmi_10_4_cmd_map;
810193841a15SRaja Mani 		ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
8102d86561ffSRaja Mani 		ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
81033fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
81049bd21322SRaja Mani 		break;
81054a16fbecSRajkumar Manoharan 	case ATH10K_FW_WMI_OP_VERSION_10_2_4:
81064a16fbecSRajkumar Manoharan 		ar->wmi.cmd = &wmi_10_2_4_cmd_map;
81074a16fbecSRajkumar Manoharan 		ar->wmi.ops = &wmi_10_2_4_ops;
81084a16fbecSRajkumar Manoharan 		ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
81094a16fbecSRajkumar Manoharan 		ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
81103fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
81114a16fbecSRajkumar Manoharan 		break;
8112d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_10_2:
8113b79b9baaSMichal Kazior 		ar->wmi.cmd = &wmi_10_2_cmd_map;
8114d7579d12SMichal Kazior 		ar->wmi.ops = &wmi_10_2_ops;
8115b79b9baaSMichal Kazior 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
8116b79b9baaSMichal Kazior 		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
81173fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
8118d7579d12SMichal Kazior 		break;
8119d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_10_1:
8120d7579d12SMichal Kazior 		ar->wmi.cmd = &wmi_10x_cmd_map;
8121d7579d12SMichal Kazior 		ar->wmi.ops = &wmi_10_1_ops;
8122d7579d12SMichal Kazior 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
8123d7579d12SMichal Kazior 		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
81243fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
8125d7579d12SMichal Kazior 		break;
8126d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_MAIN:
8127b79b9baaSMichal Kazior 		ar->wmi.cmd = &wmi_cmd_map;
8128d7579d12SMichal Kazior 		ar->wmi.ops = &wmi_ops;
8129b79b9baaSMichal Kazior 		ar->wmi.vdev_param = &wmi_vdev_param_map;
8130b79b9baaSMichal Kazior 		ar->wmi.pdev_param = &wmi_pdev_param_map;
81313fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_peer_flags_map;
8132d7579d12SMichal Kazior 		break;
8133ca996ec5SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_TLV:
8134ca996ec5SMichal Kazior 		ath10k_wmi_tlv_attach(ar);
8135ca996ec5SMichal Kazior 		break;
8136d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_UNSET:
8137d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_MAX:
8138d7579d12SMichal Kazior 		ath10k_err(ar, "unsupported WMI op version: %d\n",
8139bf3c13abSKalle Valo 			   ar->running_fw->fw_file.wmi_op_version);
8140d7579d12SMichal Kazior 		return -EINVAL;
8141b79b9baaSMichal Kazior 	}
8142b79b9baaSMichal Kazior 
8143b79b9baaSMichal Kazior 	init_completion(&ar->wmi.service_ready);
8144b79b9baaSMichal Kazior 	init_completion(&ar->wmi.unified_ready);
814520ddca21SMichal Kazior 	init_completion(&ar->wmi.barrier);
8146b79b9baaSMichal Kazior 
8147c8ecfc1cSRaja Mani 	INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work);
8148c8ecfc1cSRaja Mani 
8149b79b9baaSMichal Kazior 	return 0;
8150b79b9baaSMichal Kazior }
8151b79b9baaSMichal Kazior 
8152a925a376SVasanthakumar Thiagarajan void ath10k_wmi_free_host_mem(struct ath10k *ar)
8153b79b9baaSMichal Kazior {
8154b79b9baaSMichal Kazior 	int i;
8155b79b9baaSMichal Kazior 
8156b79b9baaSMichal Kazior 	/* free the host memory chunks requested by firmware */
8157b79b9baaSMichal Kazior 	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
8158b0578865SFelix Fietkau 		dma_unmap_single(ar->dev,
8159b0578865SFelix Fietkau 				 ar->wmi.mem_chunks[i].paddr,
8160b79b9baaSMichal Kazior 				 ar->wmi.mem_chunks[i].len,
8161b0578865SFelix Fietkau 				 DMA_TO_DEVICE);
8162b0578865SFelix Fietkau 		kfree(ar->wmi.mem_chunks[i].vaddr);
8163b79b9baaSMichal Kazior 	}
8164b79b9baaSMichal Kazior 
8165b79b9baaSMichal Kazior 	ar->wmi.num_mem_chunks = 0;
8166b79b9baaSMichal Kazior }
8167a925a376SVasanthakumar Thiagarajan 
8168a925a376SVasanthakumar Thiagarajan void ath10k_wmi_detach(struct ath10k *ar)
8169a925a376SVasanthakumar Thiagarajan {
8170a925a376SVasanthakumar Thiagarajan 	cancel_work_sync(&ar->svc_rdy_work);
8171a925a376SVasanthakumar Thiagarajan 
8172a925a376SVasanthakumar Thiagarajan 	if (ar->svc_rdy_skb)
8173a925a376SVasanthakumar Thiagarajan 		dev_kfree_skb(ar->svc_rdy_skb);
8174a925a376SVasanthakumar Thiagarajan }
8175