xref: /openbmc/linux/drivers/net/wireless/ath/ath10k/wmi.c (revision 1382993f)
1f0553ca9SKalle Valo // SPDX-License-Identifier: ISC
25e3dd157SKalle Valo /*
35e3dd157SKalle Valo  * Copyright (c) 2005-2011 Atheros Communications Inc.
48b1083d6SKalle Valo  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
56e8a8991SRakesh Pillai  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
65e3dd157SKalle Valo  */
75e3dd157SKalle Valo 
85e3dd157SKalle Valo #include <linux/skbuff.h>
92fe5288cSKalle Valo #include <linux/ctype.h>
105e3dd157SKalle Valo 
115e3dd157SKalle Valo #include "core.h"
125e3dd157SKalle Valo #include "htc.h"
135e3dd157SKalle Valo #include "debug.h"
145e3dd157SKalle Valo #include "wmi.h"
15ca996ec5SMichal Kazior #include "wmi-tlv.h"
165e3dd157SKalle Valo #include "mac.h"
1743d2a30fSKalle Valo #include "testmode.h"
18d7579d12SMichal Kazior #include "wmi-ops.h"
196a94888fSMichal Kazior #include "p2p.h"
20587f7031SMichal Kazior #include "hw.h"
21bc1efd73SSebastian Gottschall #include "hif.h"
228ed05ed0SManikanta Pubbisetty #include "txrx.h"
235e3dd157SKalle Valo 
2420ddca21SMichal Kazior #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9
2520ddca21SMichal Kazior #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ)
266f6eb1bcSSriram R #define ATH10K_WMI_DFS_CONF_TIMEOUT_HZ (HZ / 6)
2720ddca21SMichal Kazior 
28ce42870eSBartosz Markowski /* MAIN WMI cmd track */
29ce42870eSBartosz Markowski static struct wmi_cmd_map wmi_cmd_map = {
30ce42870eSBartosz Markowski 	.init_cmdid = WMI_INIT_CMDID,
31ce42870eSBartosz Markowski 	.start_scan_cmdid = WMI_START_SCAN_CMDID,
32ce42870eSBartosz Markowski 	.stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
33ce42870eSBartosz Markowski 	.scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
34ce42870eSBartosz Markowski 	.scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
3560e1d0fbSCarl Huang 	.scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
36ce42870eSBartosz Markowski 	.pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
37ce42870eSBartosz Markowski 	.pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
38ce42870eSBartosz Markowski 	.pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
39ce42870eSBartosz Markowski 	.pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
40ce42870eSBartosz Markowski 	.pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
41ce42870eSBartosz Markowski 	.pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
42ce42870eSBartosz Markowski 	.pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
43ce42870eSBartosz Markowski 	.pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
44ce42870eSBartosz Markowski 	.pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
45ce42870eSBartosz Markowski 	.pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
46ce42870eSBartosz Markowski 	.pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
47ce42870eSBartosz Markowski 	.pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
48ce42870eSBartosz Markowski 	.pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
49ce42870eSBartosz Markowski 	.vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
50ce42870eSBartosz Markowski 	.vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
51ce42870eSBartosz Markowski 	.vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
52ce42870eSBartosz Markowski 	.vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
53ce42870eSBartosz Markowski 	.vdev_up_cmdid = WMI_VDEV_UP_CMDID,
54ce42870eSBartosz Markowski 	.vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
55ce42870eSBartosz Markowski 	.vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
56ce42870eSBartosz Markowski 	.vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
57ce42870eSBartosz Markowski 	.vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
58ce42870eSBartosz Markowski 	.peer_create_cmdid = WMI_PEER_CREATE_CMDID,
59ce42870eSBartosz Markowski 	.peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
60ce42870eSBartosz Markowski 	.peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
61ce42870eSBartosz Markowski 	.peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
62ce42870eSBartosz Markowski 	.peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
63ce42870eSBartosz Markowski 	.peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
64ce42870eSBartosz Markowski 	.peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
65ce42870eSBartosz Markowski 	.peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
66ce42870eSBartosz Markowski 	.bcn_tx_cmdid = WMI_BCN_TX_CMDID,
67ce42870eSBartosz Markowski 	.pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
68ce42870eSBartosz Markowski 	.bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
69ce42870eSBartosz Markowski 	.bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
70ce42870eSBartosz Markowski 	.prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
71ce42870eSBartosz Markowski 	.mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
72ce42870eSBartosz Markowski 	.prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
73ce42870eSBartosz Markowski 	.addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
74ce42870eSBartosz Markowski 	.addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
75ce42870eSBartosz Markowski 	.addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
76ce42870eSBartosz Markowski 	.delba_send_cmdid = WMI_DELBA_SEND_CMDID,
77ce42870eSBartosz Markowski 	.addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
78ce42870eSBartosz Markowski 	.send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
79ce42870eSBartosz Markowski 	.sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
80ce42870eSBartosz Markowski 	.sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
81ce42870eSBartosz Markowski 	.sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
82ce42870eSBartosz Markowski 	.pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
83ce42870eSBartosz Markowski 	.pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
84ce42870eSBartosz Markowski 	.roam_scan_mode = WMI_ROAM_SCAN_MODE,
85ce42870eSBartosz Markowski 	.roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
86ce42870eSBartosz Markowski 	.roam_scan_period = WMI_ROAM_SCAN_PERIOD,
87ce42870eSBartosz Markowski 	.roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
88ce42870eSBartosz Markowski 	.roam_ap_profile = WMI_ROAM_AP_PROFILE,
89ce42870eSBartosz Markowski 	.ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
90ce42870eSBartosz Markowski 	.ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
91ce42870eSBartosz Markowski 	.ofl_scan_period = WMI_OFL_SCAN_PERIOD,
92ce42870eSBartosz Markowski 	.p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
93ce42870eSBartosz Markowski 	.p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
94ce42870eSBartosz Markowski 	.p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
95ce42870eSBartosz Markowski 	.p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
96ce42870eSBartosz Markowski 	.p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
97ce42870eSBartosz Markowski 	.ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
98ce42870eSBartosz Markowski 	.ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
99ce42870eSBartosz Markowski 	.peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
100ce42870eSBartosz Markowski 	.wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
101ce42870eSBartosz Markowski 	.wlan_profile_set_hist_intvl_cmdid =
102ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
103ce42870eSBartosz Markowski 	.wlan_profile_get_profile_data_cmdid =
104ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
105ce42870eSBartosz Markowski 	.wlan_profile_enable_profile_id_cmdid =
106ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
107ce42870eSBartosz Markowski 	.wlan_profile_list_profile_id_cmdid =
108ce42870eSBartosz Markowski 				WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
109ce42870eSBartosz Markowski 	.pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
110ce42870eSBartosz Markowski 	.pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
111ce42870eSBartosz Markowski 	.add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
112ce42870eSBartosz Markowski 	.rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
113ce42870eSBartosz Markowski 	.wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
114ce42870eSBartosz Markowski 	.wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
115ce42870eSBartosz Markowski 	.wow_enable_disable_wake_event_cmdid =
116ce42870eSBartosz Markowski 				WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
117ce42870eSBartosz Markowski 	.wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
118ce42870eSBartosz Markowski 	.wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
119ce42870eSBartosz Markowski 	.rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
120ce42870eSBartosz Markowski 	.rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
121ce42870eSBartosz Markowski 	.vdev_spectral_scan_configure_cmdid =
122ce42870eSBartosz Markowski 				WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
123ce42870eSBartosz Markowski 	.vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
124ce42870eSBartosz Markowski 	.request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
125ce42870eSBartosz Markowski 	.set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
126ce42870eSBartosz Markowski 	.network_list_offload_config_cmdid =
127ce42870eSBartosz Markowski 				WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
128ce42870eSBartosz Markowski 	.gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
129ce42870eSBartosz Markowski 	.csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
130ce42870eSBartosz Markowski 	.csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
131ce42870eSBartosz Markowski 	.chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
132ce42870eSBartosz Markowski 	.peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
133ce42870eSBartosz Markowski 	.peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
134ce42870eSBartosz Markowski 	.sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
135ce42870eSBartosz Markowski 	.sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
136ce42870eSBartosz Markowski 	.sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
137ce42870eSBartosz Markowski 	.echo_cmdid = WMI_ECHO_CMDID,
138ce42870eSBartosz Markowski 	.pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
139ce42870eSBartosz Markowski 	.dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
140ce42870eSBartosz Markowski 	.pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
141ce42870eSBartosz Markowski 	.pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
142ce42870eSBartosz Markowski 	.vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
143ce42870eSBartosz Markowski 	.vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
144ce42870eSBartosz Markowski 	.force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
145ce42870eSBartosz Markowski 	.gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
146ce42870eSBartosz Markowski 	.gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
147a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
14862f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
149772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
150772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
151772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
152772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
153772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
154772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
155772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
156772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
157772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
158772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
159772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
160772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
161772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
162772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
163772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
164772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
165772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
166772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
167772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
168772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
169772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
170772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
171772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
172772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
173772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
174772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
175772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
176772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
177772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
178772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
179772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
180772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
181772b4aeeSRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
182772b4aeeSRaja Mani 	.pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
183772b4aeeSRaja Mani 	.pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
184772b4aeeSRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
185772b4aeeSRaja Mani 	.pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
186772b4aeeSRaja Mani 	.vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
187772b4aeeSRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
188772b4aeeSRaja Mani 	.mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
189772b4aeeSRaja Mani 	.set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
190772b4aeeSRaja Mani 	.pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
191bc64d052SMaharaja Kennadyrajan 	.pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
1926f6eb1bcSSriram R 	.radar_found_cmdid = WMI_CMD_UNSUPPORTED,
193ce42870eSBartosz Markowski };
194ce42870eSBartosz Markowski 
195b7e3adf9SBartosz Markowski /* 10.X WMI cmd track */
196b7e3adf9SBartosz Markowski static struct wmi_cmd_map wmi_10x_cmd_map = {
197b7e3adf9SBartosz Markowski 	.init_cmdid = WMI_10X_INIT_CMDID,
198b7e3adf9SBartosz Markowski 	.start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
199b7e3adf9SBartosz Markowski 	.stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
200b7e3adf9SBartosz Markowski 	.scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
20134957b25SBartosz Markowski 	.scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
20260e1d0fbSCarl Huang 	.scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
203b7e3adf9SBartosz Markowski 	.pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
204b7e3adf9SBartosz Markowski 	.pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
205b7e3adf9SBartosz Markowski 	.pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
206b7e3adf9SBartosz Markowski 	.pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
207b7e3adf9SBartosz Markowski 	.pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
208b7e3adf9SBartosz Markowski 	.pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
209b7e3adf9SBartosz Markowski 	.pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
210b7e3adf9SBartosz Markowski 	.pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
211b7e3adf9SBartosz Markowski 	.pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
212b7e3adf9SBartosz Markowski 	.pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
213b7e3adf9SBartosz Markowski 	.pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
214b7e3adf9SBartosz Markowski 	.pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
215b7e3adf9SBartosz Markowski 	.pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
216b7e3adf9SBartosz Markowski 	.vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
217b7e3adf9SBartosz Markowski 	.vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
218b7e3adf9SBartosz Markowski 	.vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
219b7e3adf9SBartosz Markowski 	.vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
220b7e3adf9SBartosz Markowski 	.vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
221b7e3adf9SBartosz Markowski 	.vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
222b7e3adf9SBartosz Markowski 	.vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
223b7e3adf9SBartosz Markowski 	.vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
224b7e3adf9SBartosz Markowski 	.vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
225b7e3adf9SBartosz Markowski 	.peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
226b7e3adf9SBartosz Markowski 	.peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
227b7e3adf9SBartosz Markowski 	.peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
228b7e3adf9SBartosz Markowski 	.peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
229b7e3adf9SBartosz Markowski 	.peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
230b7e3adf9SBartosz Markowski 	.peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
231b7e3adf9SBartosz Markowski 	.peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
232b7e3adf9SBartosz Markowski 	.peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
233b7e3adf9SBartosz Markowski 	.bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
234b7e3adf9SBartosz Markowski 	.pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
23534957b25SBartosz Markowski 	.bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
236b7e3adf9SBartosz Markowski 	.bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
237b7e3adf9SBartosz Markowski 	.prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
238b7e3adf9SBartosz Markowski 	.mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
23934957b25SBartosz Markowski 	.prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
240b7e3adf9SBartosz Markowski 	.addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
241b7e3adf9SBartosz Markowski 	.addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
242b7e3adf9SBartosz Markowski 	.addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
243b7e3adf9SBartosz Markowski 	.delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
244b7e3adf9SBartosz Markowski 	.addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
245b7e3adf9SBartosz Markowski 	.send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
246b7e3adf9SBartosz Markowski 	.sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
247b7e3adf9SBartosz Markowski 	.sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
248b7e3adf9SBartosz Markowski 	.sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
249b7e3adf9SBartosz Markowski 	.pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
250b7e3adf9SBartosz Markowski 	.pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
251b7e3adf9SBartosz Markowski 	.roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
252b7e3adf9SBartosz Markowski 	.roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
253b7e3adf9SBartosz Markowski 	.roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
254b7e3adf9SBartosz Markowski 	.roam_scan_rssi_change_threshold =
255b7e3adf9SBartosz Markowski 				WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
256b7e3adf9SBartosz Markowski 	.roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
257b7e3adf9SBartosz Markowski 	.ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
258b7e3adf9SBartosz Markowski 	.ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
259b7e3adf9SBartosz Markowski 	.ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
260b7e3adf9SBartosz Markowski 	.p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
261b7e3adf9SBartosz Markowski 	.p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
262b7e3adf9SBartosz Markowski 	.p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
263b7e3adf9SBartosz Markowski 	.p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
26434957b25SBartosz Markowski 	.p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
265542fb174SJanusz Dziedzic 	.ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID,
26634957b25SBartosz Markowski 	.ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
267b7e3adf9SBartosz Markowski 	.peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
268b7e3adf9SBartosz Markowski 	.wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
269b7e3adf9SBartosz Markowski 	.wlan_profile_set_hist_intvl_cmdid =
270b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
271b7e3adf9SBartosz Markowski 	.wlan_profile_get_profile_data_cmdid =
272b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
273b7e3adf9SBartosz Markowski 	.wlan_profile_enable_profile_id_cmdid =
274b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
275b7e3adf9SBartosz Markowski 	.wlan_profile_list_profile_id_cmdid =
276b7e3adf9SBartosz Markowski 				WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
277b7e3adf9SBartosz Markowski 	.pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
278b7e3adf9SBartosz Markowski 	.pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
279b7e3adf9SBartosz Markowski 	.add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
280b7e3adf9SBartosz Markowski 	.rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
281b7e3adf9SBartosz Markowski 	.wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
282b7e3adf9SBartosz Markowski 	.wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
283b7e3adf9SBartosz Markowski 	.wow_enable_disable_wake_event_cmdid =
284b7e3adf9SBartosz Markowski 				WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
285b7e3adf9SBartosz Markowski 	.wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
286b7e3adf9SBartosz Markowski 	.wow_hostwakeup_from_sleep_cmdid =
287b7e3adf9SBartosz Markowski 				WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
288b7e3adf9SBartosz Markowski 	.rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
289b7e3adf9SBartosz Markowski 	.rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
290b7e3adf9SBartosz Markowski 	.vdev_spectral_scan_configure_cmdid =
291b7e3adf9SBartosz Markowski 				WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
292b7e3adf9SBartosz Markowski 	.vdev_spectral_scan_enable_cmdid =
293b7e3adf9SBartosz Markowski 				WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
294b7e3adf9SBartosz Markowski 	.request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
29534957b25SBartosz Markowski 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
29634957b25SBartosz Markowski 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
29734957b25SBartosz Markowski 	.gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
29834957b25SBartosz Markowski 	.csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
29934957b25SBartosz Markowski 	.csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
30034957b25SBartosz Markowski 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
30134957b25SBartosz Markowski 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
30234957b25SBartosz Markowski 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
30334957b25SBartosz Markowski 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
30434957b25SBartosz Markowski 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
30534957b25SBartosz Markowski 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
306b7e3adf9SBartosz Markowski 	.echo_cmdid = WMI_10X_ECHO_CMDID,
307b7e3adf9SBartosz Markowski 	.pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
308b7e3adf9SBartosz Markowski 	.dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
309b7e3adf9SBartosz Markowski 	.pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
31034957b25SBartosz Markowski 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
31134957b25SBartosz Markowski 	.vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
31234957b25SBartosz Markowski 	.vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
31334957b25SBartosz Markowski 	.force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
314b7e3adf9SBartosz Markowski 	.gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
315b7e3adf9SBartosz Markowski 	.gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
316a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
31762f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
318772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
319772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
320772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
321772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
322772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
323772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
324772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
325772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
326772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
327772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
328772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
329772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
330772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
331772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
332772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
333772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
334772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
335772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
336772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
337772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
338772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
339772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
340772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
341772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
342772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
343772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
344772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
345772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
346772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
347772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
348772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
349772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
350772b4aeeSRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
351772b4aeeSRaja Mani 	.pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
352772b4aeeSRaja Mani 	.pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
353772b4aeeSRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
354772b4aeeSRaja Mani 	.pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
355772b4aeeSRaja Mani 	.vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
356772b4aeeSRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
357772b4aeeSRaja Mani 	.mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
358772b4aeeSRaja Mani 	.set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
359772b4aeeSRaja Mani 	.pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
360bc64d052SMaharaja Kennadyrajan 	.pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
3616f6eb1bcSSriram R 	.radar_found_cmdid = WMI_CMD_UNSUPPORTED,
362b7e3adf9SBartosz Markowski };
363ce42870eSBartosz Markowski 
3644a16fbecSRajkumar Manoharan /* 10.2.4 WMI cmd track */
3654a16fbecSRajkumar Manoharan static struct wmi_cmd_map wmi_10_2_4_cmd_map = {
3664a16fbecSRajkumar Manoharan 	.init_cmdid = WMI_10_2_INIT_CMDID,
3674a16fbecSRajkumar Manoharan 	.start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
3684a16fbecSRajkumar Manoharan 	.stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
3694a16fbecSRajkumar Manoharan 	.scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
3704a16fbecSRajkumar Manoharan 	.scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
37160e1d0fbSCarl Huang 	.scan_prob_req_oui_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,
529bc64d052SMaharaja Kennadyrajan 	.pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
5306f6eb1bcSSriram R 	.radar_found_cmdid = WMI_CMD_UNSUPPORTED,
53184758d4dSBhagavathi Perumal S 	.set_bb_timing_cmdid = WMI_10_2_PDEV_SET_BB_TIMING_CONFIG_CMDID,
5324a16fbecSRajkumar Manoharan };
5334a16fbecSRajkumar Manoharan 
5342d491e69SRaja Mani /* 10.4 WMI cmd track */
5352d491e69SRaja Mani static struct wmi_cmd_map wmi_10_4_cmd_map = {
5362d491e69SRaja Mani 	.init_cmdid = WMI_10_4_INIT_CMDID,
5372d491e69SRaja Mani 	.start_scan_cmdid = WMI_10_4_START_SCAN_CMDID,
5382d491e69SRaja Mani 	.stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID,
5392d491e69SRaja Mani 	.scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID,
5402d491e69SRaja Mani 	.scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID,
54160e1d0fbSCarl Huang 	.scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
5422d491e69SRaja Mani 	.pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID,
5432d491e69SRaja Mani 	.pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID,
5442d491e69SRaja Mani 	.pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID,
5452d491e69SRaja Mani 	.pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID,
5462d491e69SRaja Mani 	.pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID,
5472d491e69SRaja Mani 	.pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID,
5482d491e69SRaja Mani 	.pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID,
5492d491e69SRaja Mani 	.pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID,
5502d491e69SRaja Mani 	.pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID,
5512d491e69SRaja Mani 	.pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID,
5522d491e69SRaja Mani 	.pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID,
5532d491e69SRaja Mani 	.pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID,
5542d491e69SRaja Mani 	.pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID,
5552d491e69SRaja Mani 	.vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID,
5562d491e69SRaja Mani 	.vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID,
5572d491e69SRaja Mani 	.vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID,
5582d491e69SRaja Mani 	.vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID,
5592d491e69SRaja Mani 	.vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID,
5602d491e69SRaja Mani 	.vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID,
5612d491e69SRaja Mani 	.vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID,
5622d491e69SRaja Mani 	.vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID,
5632d491e69SRaja Mani 	.vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID,
5642d491e69SRaja Mani 	.peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID,
5652d491e69SRaja Mani 	.peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID,
5662d491e69SRaja Mani 	.peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID,
5672d491e69SRaja Mani 	.peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID,
5682d491e69SRaja Mani 	.peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID,
5692d491e69SRaja Mani 	.peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID,
5702d491e69SRaja Mani 	.peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID,
5712d491e69SRaja Mani 	.peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID,
5722d491e69SRaja Mani 	.bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID,
5732d491e69SRaja Mani 	.pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID,
5742d491e69SRaja Mani 	.bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID,
5752d491e69SRaja Mani 	.bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID,
5762d491e69SRaja Mani 	.prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID,
5772d491e69SRaja Mani 	.mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID,
5782d491e69SRaja Mani 	.prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID,
5792d491e69SRaja Mani 	.addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID,
5802d491e69SRaja Mani 	.addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID,
5812d491e69SRaja Mani 	.addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID,
5822d491e69SRaja Mani 	.delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID,
5832d491e69SRaja Mani 	.addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID,
5842d491e69SRaja Mani 	.send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID,
5852d491e69SRaja Mani 	.sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID,
5862d491e69SRaja Mani 	.sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID,
5872d491e69SRaja Mani 	.sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID,
5882d491e69SRaja Mani 	.pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID,
5892d491e69SRaja Mani 	.pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID,
5902d491e69SRaja Mani 	.roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE,
5912d491e69SRaja Mani 	.roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD,
5922d491e69SRaja Mani 	.roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD,
5932d491e69SRaja Mani 	.roam_scan_rssi_change_threshold =
5942d491e69SRaja Mani 				WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
5952d491e69SRaja Mani 	.roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE,
5962d491e69SRaja Mani 	.ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE,
5972d491e69SRaja Mani 	.ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE,
5982d491e69SRaja Mani 	.ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD,
5992d491e69SRaja Mani 	.p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO,
6002d491e69SRaja Mani 	.p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY,
6012d491e69SRaja Mani 	.p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE,
6022d491e69SRaja Mani 	.p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE,
6032d491e69SRaja Mani 	.p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID,
6042d491e69SRaja Mani 	.ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID,
6052d491e69SRaja Mani 	.ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID,
6062d491e69SRaja Mani 	.peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID,
6072d491e69SRaja Mani 	.wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID,
6082d491e69SRaja Mani 	.wlan_profile_set_hist_intvl_cmdid =
6092d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
6102d491e69SRaja Mani 	.wlan_profile_get_profile_data_cmdid =
6112d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
6122d491e69SRaja Mani 	.wlan_profile_enable_profile_id_cmdid =
6132d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
6142d491e69SRaja Mani 	.wlan_profile_list_profile_id_cmdid =
6152d491e69SRaja Mani 				WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
6162d491e69SRaja Mani 	.pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID,
6172d491e69SRaja Mani 	.pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID,
6182d491e69SRaja Mani 	.add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID,
6192d491e69SRaja Mani 	.rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID,
6202d491e69SRaja Mani 	.wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID,
6212d491e69SRaja Mani 	.wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID,
6222d491e69SRaja Mani 	.wow_enable_disable_wake_event_cmdid =
6232d491e69SRaja Mani 				WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
6242d491e69SRaja Mani 	.wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID,
6252d491e69SRaja Mani 	.wow_hostwakeup_from_sleep_cmdid =
6262d491e69SRaja Mani 				WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
6272d491e69SRaja Mani 	.rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID,
6282d491e69SRaja Mani 	.rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID,
6292d491e69SRaja Mani 	.vdev_spectral_scan_configure_cmdid =
6302d491e69SRaja Mani 				WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
6312d491e69SRaja Mani 	.vdev_spectral_scan_enable_cmdid =
6322d491e69SRaja Mani 				WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
6332d491e69SRaja Mani 	.request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID,
6342d491e69SRaja Mani 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
6352d491e69SRaja Mani 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
6362d491e69SRaja Mani 	.gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID,
6372d491e69SRaja Mani 	.csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID,
6382d491e69SRaja Mani 	.csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID,
6392d491e69SRaja Mani 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
6402d491e69SRaja Mani 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
6412d491e69SRaja Mani 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
6422d491e69SRaja Mani 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
6432d491e69SRaja Mani 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
6442d491e69SRaja Mani 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
6452d491e69SRaja Mani 	.echo_cmdid = WMI_10_4_ECHO_CMDID,
6462d491e69SRaja Mani 	.pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID,
6472d491e69SRaja Mani 	.dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID,
6482d491e69SRaja Mani 	.pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID,
6492d491e69SRaja Mani 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
6502d491e69SRaja Mani 	.vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID,
6512d491e69SRaja Mani 	.vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID,
6522d491e69SRaja Mani 	.force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID,
6532d491e69SRaja Mani 	.gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID,
6542d491e69SRaja Mani 	.gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID,
6552d491e69SRaja Mani 	.pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID,
6562d491e69SRaja Mani 	.vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED,
6572d491e69SRaja Mani 	.adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED,
6582d491e69SRaja Mani 	.scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID,
6592d491e69SRaja Mani 	.vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID,
6602d491e69SRaja Mani 	.vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID,
6612d491e69SRaja Mani 	.wlan_peer_caching_add_peer_cmdid =
6622d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID,
6632d491e69SRaja Mani 	.wlan_peer_caching_evict_peer_cmdid =
6642d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID,
6652d491e69SRaja Mani 	.wlan_peer_caching_restore_peer_cmdid =
6662d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID,
6672d491e69SRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid =
6682d491e69SRaja Mani 			WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID,
6692d491e69SRaja Mani 	.peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID,
6702d491e69SRaja Mani 	.peer_add_proxy_sta_entry_cmdid =
6712d491e69SRaja Mani 			WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID,
6722d491e69SRaja Mani 	.rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID,
6732d491e69SRaja Mani 	.oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID,
6742d491e69SRaja Mani 	.nan_cmdid = WMI_10_4_NAN_CMDID,
6752d491e69SRaja Mani 	.vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID,
6762d491e69SRaja Mani 	.qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID,
6772d491e69SRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID,
6782d491e69SRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid =
6792d491e69SRaja Mani 			WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID,
6802d491e69SRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid =
6812d491e69SRaja Mani 			WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID,
6822d491e69SRaja Mani 	.peer_smart_ant_set_train_info_cmdid =
6832d491e69SRaja Mani 			WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID,
6842d491e69SRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid =
6852d491e69SRaja Mani 			WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID,
6862d491e69SRaja Mani 	.pdev_set_antenna_switch_table_cmdid =
6872d491e69SRaja Mani 			WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID,
6882d491e69SRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID,
6892d491e69SRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID,
6902d491e69SRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID,
6912d491e69SRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid =
6922d491e69SRaja Mani 			WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID,
6932d491e69SRaja Mani 	.pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID,
6942d491e69SRaja Mani 	.tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID,
6952d491e69SRaja Mani 	.fwtest_cmdid = WMI_10_4_FWTEST_CMDID,
6962d491e69SRaja Mani 	.vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID,
6972d491e69SRaja Mani 	.peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID,
6982d491e69SRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID,
6992d491e69SRaja Mani 	.pdev_get_ani_ofdm_config_cmdid =
7002d491e69SRaja Mani 			WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID,
7012d491e69SRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID,
7022d491e69SRaja Mani 	.pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID,
7032d491e69SRaja Mani 	.pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID,
7042d491e69SRaja Mani 	.pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID,
7052d491e69SRaja Mani 	.vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID,
7062d491e69SRaja Mani 	.pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID,
7072d491e69SRaja Mani 	.vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID,
7082d491e69SRaja Mani 	.vdev_filter_neighbor_rx_packets_cmdid =
7092d491e69SRaja Mani 			WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID,
7102d491e69SRaja Mani 	.mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID,
7112d491e69SRaja Mani 	.set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID,
7122d491e69SRaja Mani 	.pdev_bss_chan_info_request_cmdid =
7132d491e69SRaja Mani 			WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
71447771902SRaja Mani 	.ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID,
715add6cd8dSManikanta Pubbisetty 	.vdev_set_ie_cmdid = WMI_10_4_VDEV_SET_IE_CMDID,
716add6cd8dSManikanta Pubbisetty 	.set_lteu_config_cmdid = WMI_10_4_SET_LTEU_CONFIG_CMDID,
717add6cd8dSManikanta Pubbisetty 	.atf_ssid_grouping_request_cmdid =
718add6cd8dSManikanta Pubbisetty 			WMI_10_4_ATF_SSID_GROUPING_REQUEST_CMDID,
719add6cd8dSManikanta Pubbisetty 	.peer_atf_ext_request_cmdid = WMI_10_4_PEER_ATF_EXT_REQUEST_CMDID,
720add6cd8dSManikanta Pubbisetty 	.set_periodic_channel_stats_cfg_cmdid =
721add6cd8dSManikanta Pubbisetty 			WMI_10_4_SET_PERIODIC_CHANNEL_STATS_CONFIG,
722add6cd8dSManikanta Pubbisetty 	.peer_bwf_request_cmdid = WMI_10_4_PEER_BWF_REQUEST_CMDID,
723add6cd8dSManikanta Pubbisetty 	.btcoex_cfg_cmdid = WMI_10_4_BTCOEX_CFG_CMDID,
724add6cd8dSManikanta Pubbisetty 	.peer_tx_mu_txmit_count_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_COUNT_CMDID,
725add6cd8dSManikanta Pubbisetty 	.peer_tx_mu_txmit_rstcnt_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_RSTCNT_CMDID,
726add6cd8dSManikanta Pubbisetty 	.peer_gid_userpos_list_cmdid = WMI_10_4_PEER_GID_USERPOS_LIST_CMDID,
727add6cd8dSManikanta Pubbisetty 	.pdev_check_cal_version_cmdid = WMI_10_4_PDEV_CHECK_CAL_VERSION_CMDID,
728add6cd8dSManikanta Pubbisetty 	.coex_version_cfg_cmid = WMI_10_4_COEX_VERSION_CFG_CMID,
729add6cd8dSManikanta Pubbisetty 	.pdev_get_rx_filter_cmdid = WMI_10_4_PDEV_GET_RX_FILTER_CMDID,
730add6cd8dSManikanta Pubbisetty 	.pdev_extended_nss_cfg_cmdid = WMI_10_4_PDEV_EXTENDED_NSS_CFG_CMDID,
731add6cd8dSManikanta Pubbisetty 	.vdev_set_scan_nac_rssi_cmdid = WMI_10_4_VDEV_SET_SCAN_NAC_RSSI_CMDID,
732add6cd8dSManikanta Pubbisetty 	.prog_gpio_band_select_cmdid = WMI_10_4_PROG_GPIO_BAND_SELECT_CMDID,
733add6cd8dSManikanta Pubbisetty 	.config_smart_logging_cmdid = WMI_10_4_CONFIG_SMART_LOGGING_CMDID,
734add6cd8dSManikanta Pubbisetty 	.debug_fatal_condition_cmdid = WMI_10_4_DEBUG_FATAL_CONDITION_CMDID,
735add6cd8dSManikanta Pubbisetty 	.get_tsf_timer_cmdid = WMI_10_4_GET_TSF_TIMER_CMDID,
736add6cd8dSManikanta Pubbisetty 	.pdev_get_tpc_table_cmdid = WMI_10_4_PDEV_GET_TPC_TABLE_CMDID,
737add6cd8dSManikanta Pubbisetty 	.vdev_sifs_trigger_time_cmdid = WMI_10_4_VDEV_SIFS_TRIGGER_TIME_CMDID,
738add6cd8dSManikanta Pubbisetty 	.pdev_wds_entry_list_cmdid = WMI_10_4_PDEV_WDS_ENTRY_LIST_CMDID,
739add6cd8dSManikanta Pubbisetty 	.tdls_set_state_cmdid = WMI_10_4_TDLS_SET_STATE_CMDID,
740add6cd8dSManikanta Pubbisetty 	.tdls_peer_update_cmdid = WMI_10_4_TDLS_PEER_UPDATE_CMDID,
741add6cd8dSManikanta Pubbisetty 	.tdls_set_offchan_mode_cmdid = WMI_10_4_TDLS_SET_OFFCHAN_MODE_CMDID,
7426f6eb1bcSSriram R 	.radar_found_cmdid = WMI_10_4_RADAR_FOUND_CMDID,
7432d491e69SRaja Mani };
7442d491e69SRaja Mani 
745c0e33fe6SRakesh Pillai static struct wmi_peer_param_map wmi_peer_param_map = {
746c0e33fe6SRakesh Pillai 	.smps_state = WMI_PEER_SMPS_STATE,
747c0e33fe6SRakesh Pillai 	.ampdu = WMI_PEER_AMPDU,
748c0e33fe6SRakesh Pillai 	.authorize = WMI_PEER_AUTHORIZE,
749c0e33fe6SRakesh Pillai 	.chan_width = WMI_PEER_CHAN_WIDTH,
750c0e33fe6SRakesh Pillai 	.nss = WMI_PEER_NSS,
751c0e33fe6SRakesh Pillai 	.use_4addr = WMI_PEER_USE_4ADDR,
752c0e33fe6SRakesh Pillai 	.use_fixed_power = WMI_PEER_USE_FIXED_PWR,
753c0e33fe6SRakesh Pillai 	.debug = WMI_PEER_DEBUG,
754c0e33fe6SRakesh Pillai 	.phymode = WMI_PEER_PHYMODE,
755c0e33fe6SRakesh Pillai 	.dummy_var = WMI_PEER_DUMMY_VAR,
756c0e33fe6SRakesh Pillai };
757c0e33fe6SRakesh Pillai 
7586d1506e7SBartosz Markowski /* MAIN WMI VDEV param map */
7596d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_vdev_param_map = {
7606d1506e7SBartosz Markowski 	.rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
7616d1506e7SBartosz Markowski 	.fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
7626d1506e7SBartosz Markowski 	.beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL,
7636d1506e7SBartosz Markowski 	.listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL,
7646d1506e7SBartosz Markowski 	.multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE,
7656d1506e7SBartosz Markowski 	.mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE,
7666d1506e7SBartosz Markowski 	.slot_time = WMI_VDEV_PARAM_SLOT_TIME,
7676d1506e7SBartosz Markowski 	.preamble = WMI_VDEV_PARAM_PREAMBLE,
7686d1506e7SBartosz Markowski 	.swba_time = WMI_VDEV_PARAM_SWBA_TIME,
7696d1506e7SBartosz Markowski 	.wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD,
7706d1506e7SBartosz Markowski 	.wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME,
7716d1506e7SBartosz Markowski 	.wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL,
7726d1506e7SBartosz Markowski 	.dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD,
7736d1506e7SBartosz Markowski 	.wmi_vdev_oc_scheduler_air_time_limit =
7746d1506e7SBartosz Markowski 					WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
7756d1506e7SBartosz Markowski 	.wds = WMI_VDEV_PARAM_WDS,
7766d1506e7SBartosz Markowski 	.atim_window = WMI_VDEV_PARAM_ATIM_WINDOW,
7776d1506e7SBartosz Markowski 	.bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX,
7786d1506e7SBartosz Markowski 	.bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
7796d1506e7SBartosz Markowski 	.bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
7806d1506e7SBartosz Markowski 	.feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM,
7816d1506e7SBartosz Markowski 	.chwidth = WMI_VDEV_PARAM_CHWIDTH,
7826d1506e7SBartosz Markowski 	.chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET,
7836d1506e7SBartosz Markowski 	.disable_htprotection =	WMI_VDEV_PARAM_DISABLE_HTPROTECTION,
7846d1506e7SBartosz Markowski 	.sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT,
7856d1506e7SBartosz Markowski 	.mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE,
7866d1506e7SBartosz Markowski 	.protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE,
7876d1506e7SBartosz Markowski 	.fixed_rate = WMI_VDEV_PARAM_FIXED_RATE,
7886d1506e7SBartosz Markowski 	.sgi = WMI_VDEV_PARAM_SGI,
7896d1506e7SBartosz Markowski 	.ldpc = WMI_VDEV_PARAM_LDPC,
7906d1506e7SBartosz Markowski 	.tx_stbc = WMI_VDEV_PARAM_TX_STBC,
7916d1506e7SBartosz Markowski 	.rx_stbc = WMI_VDEV_PARAM_RX_STBC,
7926d1506e7SBartosz Markowski 	.intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD,
7936d1506e7SBartosz Markowski 	.def_keyid = WMI_VDEV_PARAM_DEF_KEYID,
7946d1506e7SBartosz Markowski 	.nss = WMI_VDEV_PARAM_NSS,
7956d1506e7SBartosz Markowski 	.bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE,
7966d1506e7SBartosz Markowski 	.mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE,
7976d1506e7SBartosz Markowski 	.mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE,
7986d1506e7SBartosz Markowski 	.dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE,
7996d1506e7SBartosz Markowski 	.unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
8006d1506e7SBartosz Markowski 	.ap_keepalive_min_idle_inactive_time_secs =
8016d1506e7SBartosz Markowski 			WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
8026d1506e7SBartosz Markowski 	.ap_keepalive_max_idle_inactive_time_secs =
8036d1506e7SBartosz Markowski 			WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
8046d1506e7SBartosz Markowski 	.ap_keepalive_max_unresponsive_time_secs =
8056d1506e7SBartosz Markowski 			WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
8066d1506e7SBartosz Markowski 	.ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS,
8076d1506e7SBartosz Markowski 	.mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED,
8086d1506e7SBartosz Markowski 	.enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS,
8096d1506e7SBartosz Markowski 	.txbf = WMI_VDEV_PARAM_TXBF,
8106d1506e7SBartosz Markowski 	.packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE,
8116d1506e7SBartosz Markowski 	.drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY,
8126d1506e7SBartosz Markowski 	.tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE,
8136d1506e7SBartosz Markowski 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
8146d1506e7SBartosz Markowski 					WMI_VDEV_PARAM_UNSUPPORTED,
81593841a15SRaja Mani 	.rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
81693841a15SRaja Mani 	.cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
81793841a15SRaja Mani 	.mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
81893841a15SRaja Mani 	.rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
81993841a15SRaja Mani 	.vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
82093841a15SRaja Mani 	.vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
82193841a15SRaja Mani 	.early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
82293841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
82393841a15SRaja Mani 	.early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
82493841a15SRaja Mani 	.early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
82593841a15SRaja Mani 	.early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
82693841a15SRaja Mani 	.early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
82793841a15SRaja Mani 	.proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
82893841a15SRaja Mani 	.meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
82993841a15SRaja Mani 	.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
83093841a15SRaja Mani 	.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
83168c295f2SSathishkumar Muruganandam 	.disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
832059104bfSPradeep Kumar Chitrapu 	.rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
8336d1506e7SBartosz Markowski };
8346d1506e7SBartosz Markowski 
8356d1506e7SBartosz Markowski /* 10.X WMI VDEV param map */
8366d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
8376d1506e7SBartosz Markowski 	.rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
8386d1506e7SBartosz Markowski 	.fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
8396d1506e7SBartosz Markowski 	.beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
8406d1506e7SBartosz Markowski 	.listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
8416d1506e7SBartosz Markowski 	.multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
8426d1506e7SBartosz Markowski 	.mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
8436d1506e7SBartosz Markowski 	.slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
8446d1506e7SBartosz Markowski 	.preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
8456d1506e7SBartosz Markowski 	.swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
8466d1506e7SBartosz Markowski 	.wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
8476d1506e7SBartosz Markowski 	.wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
8486d1506e7SBartosz Markowski 	.wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
8496d1506e7SBartosz Markowski 	.dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
8506d1506e7SBartosz Markowski 	.wmi_vdev_oc_scheduler_air_time_limit =
8516d1506e7SBartosz Markowski 				WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
8526d1506e7SBartosz Markowski 	.wds = WMI_10X_VDEV_PARAM_WDS,
8536d1506e7SBartosz Markowski 	.atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
8546d1506e7SBartosz Markowski 	.bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
8556d1506e7SBartosz Markowski 	.bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
8566d1506e7SBartosz Markowski 	.bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
8576d1506e7SBartosz Markowski 	.feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
8586d1506e7SBartosz Markowski 	.chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
8596d1506e7SBartosz Markowski 	.chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
8606d1506e7SBartosz Markowski 	.disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
8616d1506e7SBartosz Markowski 	.sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
8626d1506e7SBartosz Markowski 	.mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
8636d1506e7SBartosz Markowski 	.protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
8646d1506e7SBartosz Markowski 	.fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
8656d1506e7SBartosz Markowski 	.sgi = WMI_10X_VDEV_PARAM_SGI,
8666d1506e7SBartosz Markowski 	.ldpc = WMI_10X_VDEV_PARAM_LDPC,
8676d1506e7SBartosz Markowski 	.tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
8686d1506e7SBartosz Markowski 	.rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
8696d1506e7SBartosz Markowski 	.intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
8706d1506e7SBartosz Markowski 	.def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
8716d1506e7SBartosz Markowski 	.nss = WMI_10X_VDEV_PARAM_NSS,
8726d1506e7SBartosz Markowski 	.bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
8736d1506e7SBartosz Markowski 	.mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
8746d1506e7SBartosz Markowski 	.mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
8756d1506e7SBartosz Markowski 	.dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
8766d1506e7SBartosz Markowski 	.unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
8776d1506e7SBartosz Markowski 	.ap_keepalive_min_idle_inactive_time_secs =
8786d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
8796d1506e7SBartosz Markowski 	.ap_keepalive_max_idle_inactive_time_secs =
8806d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
8816d1506e7SBartosz Markowski 	.ap_keepalive_max_unresponsive_time_secs =
8826d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
8836d1506e7SBartosz Markowski 	.ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
8846d1506e7SBartosz Markowski 	.mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
8856d1506e7SBartosz Markowski 	.enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
8866d1506e7SBartosz Markowski 	.txbf = WMI_VDEV_PARAM_UNSUPPORTED,
8876d1506e7SBartosz Markowski 	.packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
8886d1506e7SBartosz Markowski 	.drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
8896d1506e7SBartosz Markowski 	.tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
8906d1506e7SBartosz Markowski 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
8916d1506e7SBartosz Markowski 		WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
89293841a15SRaja Mani 	.rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
89393841a15SRaja Mani 	.cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
89493841a15SRaja Mani 	.mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
89593841a15SRaja Mani 	.rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
89693841a15SRaja Mani 	.vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
89793841a15SRaja Mani 	.vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
89893841a15SRaja Mani 	.early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
89993841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
90093841a15SRaja Mani 	.early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
90193841a15SRaja Mani 	.early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
90293841a15SRaja Mani 	.early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
90393841a15SRaja Mani 	.early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
90493841a15SRaja Mani 	.proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
90593841a15SRaja Mani 	.meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
90693841a15SRaja Mani 	.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
90793841a15SRaja Mani 	.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
90868c295f2SSathishkumar Muruganandam 	.disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
909059104bfSPradeep Kumar Chitrapu 	.rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
9106d1506e7SBartosz Markowski };
9116d1506e7SBartosz Markowski 
9124a16fbecSRajkumar Manoharan static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
9134a16fbecSRajkumar Manoharan 	.rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
9144a16fbecSRajkumar Manoharan 	.fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
9154a16fbecSRajkumar Manoharan 	.beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
9164a16fbecSRajkumar Manoharan 	.listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
9174a16fbecSRajkumar Manoharan 	.multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
9184a16fbecSRajkumar Manoharan 	.mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
9194a16fbecSRajkumar Manoharan 	.slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
9204a16fbecSRajkumar Manoharan 	.preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
9214a16fbecSRajkumar Manoharan 	.swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
9224a16fbecSRajkumar Manoharan 	.wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
9234a16fbecSRajkumar Manoharan 	.wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
9244a16fbecSRajkumar Manoharan 	.wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
9254a16fbecSRajkumar Manoharan 	.dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
9264a16fbecSRajkumar Manoharan 	.wmi_vdev_oc_scheduler_air_time_limit =
9274a16fbecSRajkumar Manoharan 				WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
9284a16fbecSRajkumar Manoharan 	.wds = WMI_10X_VDEV_PARAM_WDS,
9294a16fbecSRajkumar Manoharan 	.atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
9304a16fbecSRajkumar Manoharan 	.bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
9314a16fbecSRajkumar Manoharan 	.bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
9324a16fbecSRajkumar Manoharan 	.bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
9334a16fbecSRajkumar Manoharan 	.feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
9344a16fbecSRajkumar Manoharan 	.chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
9354a16fbecSRajkumar Manoharan 	.chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
9364a16fbecSRajkumar Manoharan 	.disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
9374a16fbecSRajkumar Manoharan 	.sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
9384a16fbecSRajkumar Manoharan 	.mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
9394a16fbecSRajkumar Manoharan 	.protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
9404a16fbecSRajkumar Manoharan 	.fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
9414a16fbecSRajkumar Manoharan 	.sgi = WMI_10X_VDEV_PARAM_SGI,
9424a16fbecSRajkumar Manoharan 	.ldpc = WMI_10X_VDEV_PARAM_LDPC,
9434a16fbecSRajkumar Manoharan 	.tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
9444a16fbecSRajkumar Manoharan 	.rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
9454a16fbecSRajkumar Manoharan 	.intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
9464a16fbecSRajkumar Manoharan 	.def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
9474a16fbecSRajkumar Manoharan 	.nss = WMI_10X_VDEV_PARAM_NSS,
9484a16fbecSRajkumar Manoharan 	.bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
9494a16fbecSRajkumar Manoharan 	.mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
9504a16fbecSRajkumar Manoharan 	.mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
9514a16fbecSRajkumar Manoharan 	.dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
9524a16fbecSRajkumar Manoharan 	.unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
9534a16fbecSRajkumar Manoharan 	.ap_keepalive_min_idle_inactive_time_secs =
9544a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
9554a16fbecSRajkumar Manoharan 	.ap_keepalive_max_idle_inactive_time_secs =
9564a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
9574a16fbecSRajkumar Manoharan 	.ap_keepalive_max_unresponsive_time_secs =
9584a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
9594a16fbecSRajkumar Manoharan 	.ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
9604a16fbecSRajkumar Manoharan 	.mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
9614a16fbecSRajkumar Manoharan 	.enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
9624a16fbecSRajkumar Manoharan 	.txbf = WMI_VDEV_PARAM_UNSUPPORTED,
9634a16fbecSRajkumar Manoharan 	.packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
9644a16fbecSRajkumar Manoharan 	.drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
9654a16fbecSRajkumar Manoharan 	.tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
9664a16fbecSRajkumar Manoharan 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
9674a16fbecSRajkumar Manoharan 		WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
96893841a15SRaja Mani 	.rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
96993841a15SRaja Mani 	.cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
97093841a15SRaja Mani 	.mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
97193841a15SRaja Mani 	.rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
97293841a15SRaja Mani 	.vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
97393841a15SRaja Mani 	.vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
97493841a15SRaja Mani 	.early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
97593841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
97693841a15SRaja Mani 	.early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
97793841a15SRaja Mani 	.early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
97893841a15SRaja Mani 	.early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
97993841a15SRaja Mani 	.early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
98093841a15SRaja Mani 	.proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
98193841a15SRaja Mani 	.meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
98293841a15SRaja Mani 	.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
98393841a15SRaja Mani 	.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
98468c295f2SSathishkumar Muruganandam 	.disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
985059104bfSPradeep Kumar Chitrapu 	.rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
98693841a15SRaja Mani };
98793841a15SRaja Mani 
98893841a15SRaja Mani static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
98993841a15SRaja Mani 	.rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD,
99093841a15SRaja Mani 	.fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
99193841a15SRaja Mani 	.beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL,
99293841a15SRaja Mani 	.listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL,
99393841a15SRaja Mani 	.multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE,
99493841a15SRaja Mani 	.mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE,
99593841a15SRaja Mani 	.slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME,
99693841a15SRaja Mani 	.preamble = WMI_10_4_VDEV_PARAM_PREAMBLE,
99793841a15SRaja Mani 	.swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME,
99893841a15SRaja Mani 	.wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD,
99993841a15SRaja Mani 	.wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME,
100093841a15SRaja Mani 	.wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL,
100193841a15SRaja Mani 	.dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD,
100293841a15SRaja Mani 	.wmi_vdev_oc_scheduler_air_time_limit =
100393841a15SRaja Mani 	       WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
100493841a15SRaja Mani 	.wds = WMI_10_4_VDEV_PARAM_WDS,
100593841a15SRaja Mani 	.atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW,
100693841a15SRaja Mani 	.bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX,
100793841a15SRaja Mani 	.bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT,
100893841a15SRaja Mani 	.bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT,
100993841a15SRaja Mani 	.feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM,
101093841a15SRaja Mani 	.chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH,
101193841a15SRaja Mani 	.chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET,
101293841a15SRaja Mani 	.disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION,
101393841a15SRaja Mani 	.sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT,
101493841a15SRaja Mani 	.mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE,
101593841a15SRaja Mani 	.protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE,
101693841a15SRaja Mani 	.fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE,
101793841a15SRaja Mani 	.sgi = WMI_10_4_VDEV_PARAM_SGI,
101893841a15SRaja Mani 	.ldpc = WMI_10_4_VDEV_PARAM_LDPC,
101993841a15SRaja Mani 	.tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC,
102093841a15SRaja Mani 	.rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC,
102193841a15SRaja Mani 	.intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD,
102293841a15SRaja Mani 	.def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID,
102393841a15SRaja Mani 	.nss = WMI_10_4_VDEV_PARAM_NSS,
102493841a15SRaja Mani 	.bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE,
102593841a15SRaja Mani 	.mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE,
102693841a15SRaja Mani 	.mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE,
102793841a15SRaja Mani 	.dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE,
102893841a15SRaja Mani 	.unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
102993841a15SRaja Mani 	.ap_keepalive_min_idle_inactive_time_secs =
103093841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
103193841a15SRaja Mani 	.ap_keepalive_max_idle_inactive_time_secs =
103293841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
103393841a15SRaja Mani 	.ap_keepalive_max_unresponsive_time_secs =
103493841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
103593841a15SRaja Mani 	.ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS,
103693841a15SRaja Mani 	.mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET,
103793841a15SRaja Mani 	.enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS,
103893841a15SRaja Mani 	.txbf = WMI_10_4_VDEV_PARAM_TXBF,
103993841a15SRaja Mani 	.packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE,
104093841a15SRaja Mani 	.drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY,
104193841a15SRaja Mani 	.tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE,
104293841a15SRaja Mani 	.ap_detect_out_of_sync_sleeping_sta_time_secs =
104393841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
104493841a15SRaja Mani 	.rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES,
104593841a15SRaja Mani 	.cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR,
104693841a15SRaja Mani 	.mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET,
104793841a15SRaja Mani 	.rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE,
104893841a15SRaja Mani 	.vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK,
104993841a15SRaja Mani 	.vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK,
105093841a15SRaja Mani 	.early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
105193841a15SRaja Mani 	.early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
105293841a15SRaja Mani 	.early_rx_bmiss_sample_cycle =
105393841a15SRaja Mani 	       WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
105493841a15SRaja Mani 	.early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP,
105593841a15SRaja Mani 	.early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP,
105693841a15SRaja Mani 	.early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
105793841a15SRaja Mani 	.proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA,
105893841a15SRaja Mani 	.meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC,
105993841a15SRaja Mani 	.rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE,
106093841a15SRaja Mani 	.bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK,
1061973324ffSPedersen, Thomas 	.inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
1062973324ffSPedersen, Thomas 	.dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
106368c295f2SSathishkumar Muruganandam 	.disable_4addr_src_lrn = WMI_10_4_VDEV_PARAM_DISABLE_4_ADDR_SRC_LRN,
1064059104bfSPradeep Kumar Chitrapu 	.rtt_responder_role = WMI_10_4_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE,
10654a16fbecSRajkumar Manoharan };
10664a16fbecSRajkumar Manoharan 
1067226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_pdev_param_map = {
1068226a339bSBartosz Markowski 	.tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
1069226a339bSBartosz Markowski 	.rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
1070226a339bSBartosz Markowski 	.txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
1071226a339bSBartosz Markowski 	.txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
1072226a339bSBartosz Markowski 	.txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
1073226a339bSBartosz Markowski 	.beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
1074226a339bSBartosz Markowski 	.beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
1075226a339bSBartosz Markowski 	.resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1076226a339bSBartosz Markowski 	.protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
1077226a339bSBartosz Markowski 	.dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
1078226a339bSBartosz Markowski 	.non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1079226a339bSBartosz Markowski 	.agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
1080226a339bSBartosz Markowski 	.sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
1081226a339bSBartosz Markowski 	.ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1082226a339bSBartosz Markowski 	.ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
1083226a339bSBartosz Markowski 	.ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
1084226a339bSBartosz Markowski 	.ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
1085226a339bSBartosz Markowski 	.ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
1086226a339bSBartosz Markowski 	.ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
1087226a339bSBartosz Markowski 	.ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1088226a339bSBartosz Markowski 	.ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1089226a339bSBartosz Markowski 	.ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
1090226a339bSBartosz Markowski 	.ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1091226a339bSBartosz Markowski 	.l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
1092226a339bSBartosz Markowski 	.dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
1093226a339bSBartosz Markowski 	.pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1094226a339bSBartosz Markowski 	.pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1095226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1096226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1097226a339bSBartosz Markowski 	.pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1098226a339bSBartosz Markowski 	.vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1099226a339bSBartosz Markowski 	.peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1100226a339bSBartosz Markowski 	.bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1101226a339bSBartosz Markowski 	.pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
1102226a339bSBartosz Markowski 	.arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
1103226a339bSBartosz Markowski 	.dcs = WMI_PDEV_PARAM_DCS,
1104226a339bSBartosz Markowski 	.ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
1105226a339bSBartosz Markowski 	.ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
1106226a339bSBartosz Markowski 	.ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
1107226a339bSBartosz Markowski 	.ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
1108226a339bSBartosz Markowski 	.ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
1109226a339bSBartosz Markowski 	.dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
1110226a339bSBartosz Markowski 	.proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
1111226a339bSBartosz Markowski 	.idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
1112226a339bSBartosz Markowski 	.power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
1113226a339bSBartosz Markowski 	.fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1114226a339bSBartosz Markowski 	.burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
1115226a339bSBartosz Markowski 	.burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1116a7bd3e99SPeter Oh 	.cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
1117d86561ffSRaja Mani 	.aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1118d86561ffSRaja Mani 	.rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1119d86561ffSRaja Mani 	.smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1120d86561ffSRaja Mani 	.igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1121d86561ffSRaja Mani 	.igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1122d86561ffSRaja Mani 	.antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1123d86561ffSRaja Mani 	.rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1124d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1125d86561ffSRaja Mani 	.proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1126d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1127d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1128d86561ffSRaja Mani 	.remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1129d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1130d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1131d86561ffSRaja Mani 	.block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1132d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1133d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1134d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1135d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1136d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1137d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1138d86561ffSRaja Mani 	.en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1139d86561ffSRaja Mani 	.mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1140d86561ffSRaja Mani 	.noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1141d86561ffSRaja Mani 	.noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1142d86561ffSRaja Mani 	.dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1143d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1144d86561ffSRaja Mani 	.atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1145d86561ffSRaja Mani 	.atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1146d86561ffSRaja Mani 	.ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1147d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1148d86561ffSRaja Mani 	.sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1149d86561ffSRaja Mani 	.signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1150d86561ffSRaja Mani 	.signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1151d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1152d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1153d86561ffSRaja Mani 	.cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1154d86561ffSRaja Mani 	.rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1155d86561ffSRaja Mani 	.pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1156d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1157d86561ffSRaja Mani 	.arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1158d86561ffSRaja Mani 	.arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
115939136248SRajkumar Manoharan 	.enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1160226a339bSBartosz Markowski };
1161226a339bSBartosz Markowski 
1162226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
1163226a339bSBartosz Markowski 	.tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
1164226a339bSBartosz Markowski 	.rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
1165226a339bSBartosz Markowski 	.txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
1166226a339bSBartosz Markowski 	.txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
1167226a339bSBartosz Markowski 	.txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
1168226a339bSBartosz Markowski 	.beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
1169226a339bSBartosz Markowski 	.beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
1170226a339bSBartosz Markowski 	.resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1171226a339bSBartosz Markowski 	.protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
1172226a339bSBartosz Markowski 	.dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
1173226a339bSBartosz Markowski 	.non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1174226a339bSBartosz Markowski 	.agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
1175226a339bSBartosz Markowski 	.sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
1176226a339bSBartosz Markowski 	.ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1177226a339bSBartosz Markowski 	.ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
1178226a339bSBartosz Markowski 	.ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
1179226a339bSBartosz Markowski 	.ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
1180226a339bSBartosz Markowski 	.ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
1181226a339bSBartosz Markowski 	.ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
1182226a339bSBartosz Markowski 	.ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1183226a339bSBartosz Markowski 	.ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1184226a339bSBartosz Markowski 	.ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
1185226a339bSBartosz Markowski 	.ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1186226a339bSBartosz Markowski 	.l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
1187226a339bSBartosz Markowski 	.dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
1188226a339bSBartosz Markowski 	.pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
1189226a339bSBartosz Markowski 	.pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
1190226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
1191226a339bSBartosz Markowski 	.pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
1192226a339bSBartosz Markowski 	.pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1193226a339bSBartosz Markowski 	.vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1194226a339bSBartosz Markowski 	.peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1195226a339bSBartosz Markowski 	.bcnflt_stats_update_period =
1196226a339bSBartosz Markowski 				WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1197226a339bSBartosz Markowski 	.pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
1198ab6258edSMarek Puzyniak 	.arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
1199226a339bSBartosz Markowski 	.dcs = WMI_10X_PDEV_PARAM_DCS,
1200226a339bSBartosz Markowski 	.ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
1201226a339bSBartosz Markowski 	.ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
1202226a339bSBartosz Markowski 	.ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
1203226a339bSBartosz Markowski 	.ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
1204226a339bSBartosz Markowski 	.ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
1205226a339bSBartosz Markowski 	.dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
1206226a339bSBartosz Markowski 	.proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
1207226a339bSBartosz Markowski 	.idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
1208226a339bSBartosz Markowski 	.power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
1209226a339bSBartosz Markowski 	.fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
1210226a339bSBartosz Markowski 	.burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
1211226a339bSBartosz Markowski 	.burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
1212a7bd3e99SPeter Oh 	.cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1213d86561ffSRaja Mani 	.aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1214d86561ffSRaja Mani 	.rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1215d86561ffSRaja Mani 	.smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1216d86561ffSRaja Mani 	.igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1217d86561ffSRaja Mani 	.igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1218d86561ffSRaja Mani 	.antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1219d86561ffSRaja Mani 	.rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1220d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1221d86561ffSRaja Mani 	.proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1222d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1223d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1224d86561ffSRaja Mani 	.remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1225d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1226d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1227d86561ffSRaja Mani 	.block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1228d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1229d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1230d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1231d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1232d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1233d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1234d86561ffSRaja Mani 	.en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1235d86561ffSRaja Mani 	.mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1236d86561ffSRaja Mani 	.noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1237d86561ffSRaja Mani 	.noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1238d86561ffSRaja Mani 	.dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1239d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1240d86561ffSRaja Mani 	.atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1241d86561ffSRaja Mani 	.atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1242d86561ffSRaja Mani 	.ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1243d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1244d86561ffSRaja Mani 	.sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1245d86561ffSRaja Mani 	.signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1246d86561ffSRaja Mani 	.signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1247d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1248d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1249d86561ffSRaja Mani 	.cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1250d86561ffSRaja Mani 	.rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1251d86561ffSRaja Mani 	.pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1252d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1253d86561ffSRaja Mani 	.arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1254d86561ffSRaja Mani 	.arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
125539136248SRajkumar Manoharan 	.enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1256226a339bSBartosz Markowski };
1257226a339bSBartosz Markowski 
12584a16fbecSRajkumar Manoharan static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = {
12594a16fbecSRajkumar Manoharan 	.tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
12604a16fbecSRajkumar Manoharan 	.rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
12614a16fbecSRajkumar Manoharan 	.txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
12624a16fbecSRajkumar Manoharan 	.txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
12634a16fbecSRajkumar Manoharan 	.txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
12644a16fbecSRajkumar Manoharan 	.beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
12654a16fbecSRajkumar Manoharan 	.beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
12664a16fbecSRajkumar Manoharan 	.resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
12674a16fbecSRajkumar Manoharan 	.protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
12684a16fbecSRajkumar Manoharan 	.dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
12694a16fbecSRajkumar Manoharan 	.non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
12704a16fbecSRajkumar Manoharan 	.agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
12714a16fbecSRajkumar Manoharan 	.sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
12724a16fbecSRajkumar Manoharan 	.ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
12734a16fbecSRajkumar Manoharan 	.ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
12744a16fbecSRajkumar Manoharan 	.ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
12754a16fbecSRajkumar Manoharan 	.ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
12764a16fbecSRajkumar Manoharan 	.ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
12774a16fbecSRajkumar Manoharan 	.ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
12784a16fbecSRajkumar Manoharan 	.ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
12794a16fbecSRajkumar Manoharan 	.ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
12804a16fbecSRajkumar Manoharan 	.ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
12814a16fbecSRajkumar Manoharan 	.ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
12824a16fbecSRajkumar Manoharan 	.l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
12834a16fbecSRajkumar Manoharan 	.dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
12844a16fbecSRajkumar Manoharan 	.pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
12854a16fbecSRajkumar Manoharan 	.pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
12864a16fbecSRajkumar Manoharan 	.pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
12874a16fbecSRajkumar Manoharan 	.pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
12884a16fbecSRajkumar Manoharan 	.pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
12894a16fbecSRajkumar Manoharan 	.vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
12904a16fbecSRajkumar Manoharan 	.peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
12914a16fbecSRajkumar Manoharan 	.bcnflt_stats_update_period =
12924a16fbecSRajkumar Manoharan 				WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
12934a16fbecSRajkumar Manoharan 	.pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
12944a16fbecSRajkumar Manoharan 	.arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
12954a16fbecSRajkumar Manoharan 	.dcs = WMI_10X_PDEV_PARAM_DCS,
12964a16fbecSRajkumar Manoharan 	.ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
12974a16fbecSRajkumar Manoharan 	.ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
12984a16fbecSRajkumar Manoharan 	.ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
12994a16fbecSRajkumar Manoharan 	.ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
13004a16fbecSRajkumar Manoharan 	.ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
13014a16fbecSRajkumar Manoharan 	.dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
13024a16fbecSRajkumar Manoharan 	.proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
13034a16fbecSRajkumar Manoharan 	.idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
13044a16fbecSRajkumar Manoharan 	.power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
13054a16fbecSRajkumar Manoharan 	.fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
13064a16fbecSRajkumar Manoharan 	.burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
13074a16fbecSRajkumar Manoharan 	.burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
13084a16fbecSRajkumar Manoharan 	.cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1309d86561ffSRaja Mani 	.aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1310d86561ffSRaja Mani 	.rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1311d86561ffSRaja Mani 	.smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1312d86561ffSRaja Mani 	.igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1313d86561ffSRaja Mani 	.igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1314d86561ffSRaja Mani 	.antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1315d86561ffSRaja Mani 	.rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1316d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1317d86561ffSRaja Mani 	.proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1318d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1319d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1320d86561ffSRaja Mani 	.remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1321d70c0d46SMaharaja Kennadyrajan 	.peer_sta_ps_statechg_enable =
1322d70c0d46SMaharaja Kennadyrajan 				WMI_10X_PDEV_PARAM_PEER_STA_PS_STATECHG_ENABLE,
1323d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1324d86561ffSRaja Mani 	.block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1325d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1326d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1327d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1328d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1329d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1330d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1331d86561ffSRaja Mani 	.en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1332d86561ffSRaja Mani 	.mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1333d86561ffSRaja Mani 	.noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1334d86561ffSRaja Mani 	.noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1335d86561ffSRaja Mani 	.dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1336d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1337d86561ffSRaja Mani 	.atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1338d86561ffSRaja Mani 	.atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1339d86561ffSRaja Mani 	.ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1340d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1341d86561ffSRaja Mani 	.sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1342d86561ffSRaja Mani 	.signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1343d86561ffSRaja Mani 	.signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1344d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1345d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1346d86561ffSRaja Mani 	.cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1347d86561ffSRaja Mani 	.rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1348db251d7dSMaharaja Kennadyrajan 	.pdev_reset = WMI_10X_PDEV_PARAM_PDEV_RESET,
1349d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1350d86561ffSRaja Mani 	.arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1351d86561ffSRaja Mani 	.arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
135239136248SRajkumar Manoharan 	.enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
13534a16fbecSRajkumar Manoharan };
13544a16fbecSRajkumar Manoharan 
135524c88f78SMichal Kazior /* firmware 10.2 specific mappings */
135624c88f78SMichal Kazior static struct wmi_cmd_map wmi_10_2_cmd_map = {
135724c88f78SMichal Kazior 	.init_cmdid = WMI_10_2_INIT_CMDID,
135824c88f78SMichal Kazior 	.start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
135924c88f78SMichal Kazior 	.stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
136024c88f78SMichal Kazior 	.scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
136124c88f78SMichal Kazior 	.scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
136260e1d0fbSCarl Huang 	.scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
136324c88f78SMichal Kazior 	.pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
136424c88f78SMichal Kazior 	.pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
136524c88f78SMichal Kazior 	.pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
136624c88f78SMichal Kazior 	.pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
136724c88f78SMichal Kazior 	.pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
136824c88f78SMichal Kazior 	.pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
136924c88f78SMichal Kazior 	.pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
137024c88f78SMichal Kazior 	.pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
137124c88f78SMichal Kazior 	.pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
137224c88f78SMichal Kazior 	.pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
137324c88f78SMichal Kazior 	.pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
137424c88f78SMichal Kazior 	.pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
137524c88f78SMichal Kazior 	.vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
137624c88f78SMichal Kazior 	.vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
137724c88f78SMichal Kazior 	.vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
137824c88f78SMichal Kazior 	.vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
137924c88f78SMichal Kazior 	.vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
138024c88f78SMichal Kazior 	.vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
138124c88f78SMichal Kazior 	.vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
138224c88f78SMichal Kazior 	.vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
138324c88f78SMichal Kazior 	.vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
138424c88f78SMichal Kazior 	.peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
138524c88f78SMichal Kazior 	.peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
138624c88f78SMichal Kazior 	.peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
138724c88f78SMichal Kazior 	.peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
138824c88f78SMichal Kazior 	.peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
138924c88f78SMichal Kazior 	.peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
139024c88f78SMichal Kazior 	.peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
139124c88f78SMichal Kazior 	.peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
139224c88f78SMichal Kazior 	.bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
139324c88f78SMichal Kazior 	.pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
139424c88f78SMichal Kazior 	.bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
139524c88f78SMichal Kazior 	.bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
139624c88f78SMichal Kazior 	.prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
139724c88f78SMichal Kazior 	.mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
139824c88f78SMichal Kazior 	.prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
139924c88f78SMichal Kazior 	.addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
140024c88f78SMichal Kazior 	.addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
140124c88f78SMichal Kazior 	.addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
140224c88f78SMichal Kazior 	.delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
140324c88f78SMichal Kazior 	.addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
140424c88f78SMichal Kazior 	.send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
140524c88f78SMichal Kazior 	.sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
140624c88f78SMichal Kazior 	.sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
140724c88f78SMichal Kazior 	.sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
140824c88f78SMichal Kazior 	.pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
140924c88f78SMichal Kazior 	.pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
141024c88f78SMichal Kazior 	.roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
141124c88f78SMichal Kazior 	.roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
141224c88f78SMichal Kazior 	.roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
141324c88f78SMichal Kazior 	.roam_scan_rssi_change_threshold =
141424c88f78SMichal Kazior 				WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
141524c88f78SMichal Kazior 	.roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
141624c88f78SMichal Kazior 	.ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
141724c88f78SMichal Kazior 	.ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
141824c88f78SMichal Kazior 	.ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
141924c88f78SMichal Kazior 	.p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
142024c88f78SMichal Kazior 	.p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
142124c88f78SMichal Kazior 	.p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
142224c88f78SMichal Kazior 	.p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
142324c88f78SMichal Kazior 	.p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
142424c88f78SMichal Kazior 	.ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
142524c88f78SMichal Kazior 	.ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
142624c88f78SMichal Kazior 	.peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
142724c88f78SMichal Kazior 	.wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
142824c88f78SMichal Kazior 	.wlan_profile_set_hist_intvl_cmdid =
142924c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
143024c88f78SMichal Kazior 	.wlan_profile_get_profile_data_cmdid =
143124c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
143224c88f78SMichal Kazior 	.wlan_profile_enable_profile_id_cmdid =
143324c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
143424c88f78SMichal Kazior 	.wlan_profile_list_profile_id_cmdid =
143524c88f78SMichal Kazior 				WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
143624c88f78SMichal Kazior 	.pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
143724c88f78SMichal Kazior 	.pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
143824c88f78SMichal Kazior 	.add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
143924c88f78SMichal Kazior 	.rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
144024c88f78SMichal Kazior 	.wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
144124c88f78SMichal Kazior 	.wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
144224c88f78SMichal Kazior 	.wow_enable_disable_wake_event_cmdid =
144324c88f78SMichal Kazior 				WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
144424c88f78SMichal Kazior 	.wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
144524c88f78SMichal Kazior 	.wow_hostwakeup_from_sleep_cmdid =
144624c88f78SMichal Kazior 				WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
144724c88f78SMichal Kazior 	.rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
144824c88f78SMichal Kazior 	.rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
144924c88f78SMichal Kazior 	.vdev_spectral_scan_configure_cmdid =
145024c88f78SMichal Kazior 				WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
145124c88f78SMichal Kazior 	.vdev_spectral_scan_enable_cmdid =
145224c88f78SMichal Kazior 				WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
145324c88f78SMichal Kazior 	.request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
145424c88f78SMichal Kazior 	.set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
145524c88f78SMichal Kazior 	.network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
145624c88f78SMichal Kazior 	.gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
145724c88f78SMichal Kazior 	.csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
145824c88f78SMichal Kazior 	.csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
145924c88f78SMichal Kazior 	.chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
146024c88f78SMichal Kazior 	.peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
146124c88f78SMichal Kazior 	.peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
146224c88f78SMichal Kazior 	.sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
146324c88f78SMichal Kazior 	.sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
146424c88f78SMichal Kazior 	.sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
146524c88f78SMichal Kazior 	.echo_cmdid = WMI_10_2_ECHO_CMDID,
146624c88f78SMichal Kazior 	.pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
146724c88f78SMichal Kazior 	.dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
146824c88f78SMichal Kazior 	.pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
146924c88f78SMichal Kazior 	.pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
147024c88f78SMichal Kazior 	.vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
147124c88f78SMichal Kazior 	.vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
147224c88f78SMichal Kazior 	.force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
147324c88f78SMichal Kazior 	.gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
147424c88f78SMichal Kazior 	.gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
1475a57a6a27SRajkumar Manoharan 	.pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
147662f77f09SMaharaja 	.pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
1477772b4aeeSRaja Mani 	.scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
1478772b4aeeSRaja Mani 	.vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
1479772b4aeeSRaja Mani 	.vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
1480772b4aeeSRaja Mani 	.wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
1481772b4aeeSRaja Mani 	.wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
1482772b4aeeSRaja Mani 	.wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
1483772b4aeeSRaja Mani 	.wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
1484772b4aeeSRaja Mani 	.peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
1485772b4aeeSRaja Mani 	.peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
1486772b4aeeSRaja Mani 	.rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1487772b4aeeSRaja Mani 	.oem_req_cmdid = WMI_CMD_UNSUPPORTED,
1488772b4aeeSRaja Mani 	.nan_cmdid = WMI_CMD_UNSUPPORTED,
1489772b4aeeSRaja Mani 	.vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
1490772b4aeeSRaja Mani 	.qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
1491772b4aeeSRaja Mani 	.pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
1492772b4aeeSRaja Mani 	.pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1493772b4aeeSRaja Mani 	.peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1494772b4aeeSRaja Mani 	.peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
1495772b4aeeSRaja Mani 	.peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
1496772b4aeeSRaja Mani 	.pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
1497772b4aeeSRaja Mani 	.pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
1498772b4aeeSRaja Mani 	.pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
1499772b4aeeSRaja Mani 	.pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
1500772b4aeeSRaja Mani 	.pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
1501772b4aeeSRaja Mani 	.pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
1502772b4aeeSRaja Mani 	.tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
1503772b4aeeSRaja Mani 	.fwtest_cmdid = WMI_CMD_UNSUPPORTED,
1504772b4aeeSRaja Mani 	.vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1505772b4aeeSRaja Mani 	.peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1506772b4aeeSRaja Mani 	.pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
1507772b4aeeSRaja Mani 	.pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
1508772b4aeeSRaja Mani 	.pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
1509bc64d052SMaharaja Kennadyrajan 	.pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
15106f6eb1bcSSriram R 	.radar_found_cmdid = WMI_CMD_UNSUPPORTED,
151124c88f78SMichal Kazior };
151224c88f78SMichal Kazior 
1513d86561ffSRaja Mani static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
1514d86561ffSRaja Mani 	.tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK,
1515d86561ffSRaja Mani 	.rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK,
1516d86561ffSRaja Mani 	.txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G,
1517d86561ffSRaja Mani 	.txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G,
1518d86561ffSRaja Mani 	.txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE,
1519d86561ffSRaja Mani 	.beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE,
1520d86561ffSRaja Mani 	.beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE,
1521d86561ffSRaja Mani 	.resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1522d86561ffSRaja Mani 	.protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE,
1523d86561ffSRaja Mani 	.dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW,
1524d86561ffSRaja Mani 	.non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1525d86561ffSRaja Mani 	.agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH,
1526d86561ffSRaja Mani 	.sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH,
1527d86561ffSRaja Mani 	.ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1528d86561ffSRaja Mani 	.ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE,
1529d86561ffSRaja Mani 	.ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE,
1530d86561ffSRaja Mani 	.ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK,
1531d86561ffSRaja Mani 	.ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI,
1532d86561ffSRaja Mani 	.ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO,
1533d86561ffSRaja Mani 	.ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1534d86561ffSRaja Mani 	.ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1535d86561ffSRaja Mani 	.ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE,
1536d86561ffSRaja Mani 	.ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1537d86561ffSRaja Mani 	.l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE,
1538d86561ffSRaja Mani 	.dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE,
1539d86561ffSRaja Mani 	.pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1540d86561ffSRaja Mani 	.pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK,
1541d86561ffSRaja Mani 	.pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1542d86561ffSRaja Mani 	.pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1543d86561ffSRaja Mani 	.pdev_stats_update_period =
1544d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1545d86561ffSRaja Mani 	.vdev_stats_update_period =
1546d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1547d86561ffSRaja Mani 	.peer_stats_update_period =
1548d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1549d86561ffSRaja Mani 	.bcnflt_stats_update_period =
1550d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1551d86561ffSRaja Mani 	.pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS,
1552d86561ffSRaja Mani 	.arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE,
1553d86561ffSRaja Mani 	.dcs = WMI_10_4_PDEV_PARAM_DCS,
1554d86561ffSRaja Mani 	.ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE,
1555d86561ffSRaja Mani 	.ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD,
1556d86561ffSRaja Mani 	.ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD,
1557d86561ffSRaja Mani 	.ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL,
1558d86561ffSRaja Mani 	.ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL,
1559d86561ffSRaja Mani 	.dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN,
1560d86561ffSRaja Mani 	.proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA,
1561d86561ffSRaja Mani 	.idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG,
1562d86561ffSRaja Mani 	.power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP,
1563d86561ffSRaja Mani 	.fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET,
1564d86561ffSRaja Mani 	.burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR,
1565d86561ffSRaja Mani 	.burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE,
1566d86561ffSRaja Mani 	.cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD,
1567d86561ffSRaja Mani 	.aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST,
1568d86561ffSRaja Mani 	.rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE,
1569d86561ffSRaja Mani 	.smart_antenna_default_antenna =
1570d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA,
1571d86561ffSRaja Mani 	.igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE,
1572d86561ffSRaja Mani 	.igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID,
1573d86561ffSRaja Mani 	.antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN,
1574d86561ffSRaja Mani 	.rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER,
1575d86561ffSRaja Mani 	.set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID,
1576d86561ffSRaja Mani 	.proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE,
1577d86561ffSRaja Mani 	.set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE,
1578d86561ffSRaja Mani 	.set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER,
1579d86561ffSRaja Mani 	.remove_mcast2ucast_buffer =
1580d86561ffSRaja Mani 			WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER,
1581d86561ffSRaja Mani 	.peer_sta_ps_statechg_enable =
1582d86561ffSRaja Mani 			WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE,
1583d86561ffSRaja Mani 	.igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE,
1584d86561ffSRaja Mani 	.block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS,
1585d86561ffSRaja Mani 	.set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID,
1586d86561ffSRaja Mani 	.set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID,
1587d86561ffSRaja Mani 	.set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID,
1588d86561ffSRaja Mani 	.txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID,
1589d86561ffSRaja Mani 	.set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID,
1590d86561ffSRaja Mani 	.set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID,
1591d86561ffSRaja Mani 	.en_stats = WMI_10_4_PDEV_PARAM_EN_STATS,
1592d86561ffSRaja Mani 	.mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY,
1593d86561ffSRaja Mani 	.noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION,
1594d86561ffSRaja Mani 	.noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD,
1595d86561ffSRaja Mani 	.dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE,
1596d86561ffSRaja Mani 	.set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO,
1597d86561ffSRaja Mani 	.atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH,
1598d86561ffSRaja Mani 	.atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION,
1599d86561ffSRaja Mani 	.ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN,
1600d86561ffSRaja Mani 	.mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT,
1601d86561ffSRaja Mani 	.sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL,
1602d86561ffSRaja Mani 	.signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G,
1603d86561ffSRaja Mani 	.signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G,
1604d86561ffSRaja Mani 	.enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU,
1605d86561ffSRaja Mani 	.enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU,
1606d86561ffSRaja Mani 	.cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD,
1607d86561ffSRaja Mani 	.rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE,
1608d86561ffSRaja Mani 	.pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET,
1609d86561ffSRaja Mani 	.wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET,
1610d86561ffSRaja Mani 	.arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR,
1611d86561ffSRaja Mani 	.arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR,
161239136248SRajkumar Manoharan 	.enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
1613d86561ffSRaja Mani };
1614d86561ffSRaja Mani 
16157d94f862SAbhishek Ambure static const u8 wmi_key_cipher_suites[] = {
16167d94f862SAbhishek Ambure 	[WMI_CIPHER_NONE] = WMI_CIPHER_NONE,
16177d94f862SAbhishek Ambure 	[WMI_CIPHER_WEP] = WMI_CIPHER_WEP,
16187d94f862SAbhishek Ambure 	[WMI_CIPHER_TKIP] = WMI_CIPHER_TKIP,
16197d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_OCB] = WMI_CIPHER_AES_OCB,
16207d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_CCM] = WMI_CIPHER_AES_CCM,
16217d94f862SAbhishek Ambure 	[WMI_CIPHER_WAPI] = WMI_CIPHER_WAPI,
16227d94f862SAbhishek Ambure 	[WMI_CIPHER_CKIP] = WMI_CIPHER_CKIP,
16237d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_CMAC] = WMI_CIPHER_AES_CMAC,
16247d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_GCM] = WMI_CIPHER_AES_GCM,
16257d94f862SAbhishek Ambure };
16267d94f862SAbhishek Ambure 
16277d94f862SAbhishek Ambure static const u8 wmi_tlv_key_cipher_suites[] = {
16287d94f862SAbhishek Ambure 	[WMI_CIPHER_NONE] = WMI_TLV_CIPHER_NONE,
16297d94f862SAbhishek Ambure 	[WMI_CIPHER_WEP] = WMI_TLV_CIPHER_WEP,
16307d94f862SAbhishek Ambure 	[WMI_CIPHER_TKIP] = WMI_TLV_CIPHER_TKIP,
16317d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_OCB] = WMI_TLV_CIPHER_AES_OCB,
16327d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_CCM] = WMI_TLV_CIPHER_AES_CCM,
16337d94f862SAbhishek Ambure 	[WMI_CIPHER_WAPI] = WMI_TLV_CIPHER_WAPI,
16347d94f862SAbhishek Ambure 	[WMI_CIPHER_CKIP] = WMI_TLV_CIPHER_CKIP,
16357d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_CMAC] = WMI_TLV_CIPHER_AES_CMAC,
16367d94f862SAbhishek Ambure 	[WMI_CIPHER_AES_GCM] = WMI_TLV_CIPHER_AES_GCM,
16377d94f862SAbhishek Ambure };
16387d94f862SAbhishek Ambure 
16393fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_peer_flags_map = {
16403fab30f7STamizh chelvam 	.auth = WMI_PEER_AUTH,
16413fab30f7STamizh chelvam 	.qos = WMI_PEER_QOS,
16423fab30f7STamizh chelvam 	.need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY,
16433fab30f7STamizh chelvam 	.need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY,
16443fab30f7STamizh chelvam 	.apsd = WMI_PEER_APSD,
16453fab30f7STamizh chelvam 	.ht = WMI_PEER_HT,
16463fab30f7STamizh chelvam 	.bw40 = WMI_PEER_40MHZ,
16473fab30f7STamizh chelvam 	.stbc = WMI_PEER_STBC,
16483fab30f7STamizh chelvam 	.ldbc = WMI_PEER_LDPC,
16493fab30f7STamizh chelvam 	.dyn_mimops = WMI_PEER_DYN_MIMOPS,
16503fab30f7STamizh chelvam 	.static_mimops = WMI_PEER_STATIC_MIMOPS,
16513fab30f7STamizh chelvam 	.spatial_mux = WMI_PEER_SPATIAL_MUX,
16523fab30f7STamizh chelvam 	.vht = WMI_PEER_VHT,
16533fab30f7STamizh chelvam 	.bw80 = WMI_PEER_80MHZ,
16543fab30f7STamizh chelvam 	.vht_2g = WMI_PEER_VHT_2G,
16553fab30f7STamizh chelvam 	.pmf = WMI_PEER_PMF,
1656bc1efd73SSebastian Gottschall 	.bw160 = WMI_PEER_160MHZ,
16573fab30f7STamizh chelvam };
16583fab30f7STamizh chelvam 
16593fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = {
16603fab30f7STamizh chelvam 	.auth = WMI_10X_PEER_AUTH,
16613fab30f7STamizh chelvam 	.qos = WMI_10X_PEER_QOS,
16623fab30f7STamizh chelvam 	.need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY,
16633fab30f7STamizh chelvam 	.need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY,
16643fab30f7STamizh chelvam 	.apsd = WMI_10X_PEER_APSD,
16653fab30f7STamizh chelvam 	.ht = WMI_10X_PEER_HT,
16663fab30f7STamizh chelvam 	.bw40 = WMI_10X_PEER_40MHZ,
16673fab30f7STamizh chelvam 	.stbc = WMI_10X_PEER_STBC,
16683fab30f7STamizh chelvam 	.ldbc = WMI_10X_PEER_LDPC,
16693fab30f7STamizh chelvam 	.dyn_mimops = WMI_10X_PEER_DYN_MIMOPS,
16703fab30f7STamizh chelvam 	.static_mimops = WMI_10X_PEER_STATIC_MIMOPS,
16713fab30f7STamizh chelvam 	.spatial_mux = WMI_10X_PEER_SPATIAL_MUX,
16723fab30f7STamizh chelvam 	.vht = WMI_10X_PEER_VHT,
16733fab30f7STamizh chelvam 	.bw80 = WMI_10X_PEER_80MHZ,
1674bc1efd73SSebastian Gottschall 	.bw160 = WMI_10X_PEER_160MHZ,
16753fab30f7STamizh chelvam };
16763fab30f7STamizh chelvam 
16773fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = {
16783fab30f7STamizh chelvam 	.auth = WMI_10_2_PEER_AUTH,
16793fab30f7STamizh chelvam 	.qos = WMI_10_2_PEER_QOS,
16803fab30f7STamizh chelvam 	.need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY,
16813fab30f7STamizh chelvam 	.need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY,
16823fab30f7STamizh chelvam 	.apsd = WMI_10_2_PEER_APSD,
16833fab30f7STamizh chelvam 	.ht = WMI_10_2_PEER_HT,
16843fab30f7STamizh chelvam 	.bw40 = WMI_10_2_PEER_40MHZ,
16853fab30f7STamizh chelvam 	.stbc = WMI_10_2_PEER_STBC,
16863fab30f7STamizh chelvam 	.ldbc = WMI_10_2_PEER_LDPC,
16873fab30f7STamizh chelvam 	.dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS,
16883fab30f7STamizh chelvam 	.static_mimops = WMI_10_2_PEER_STATIC_MIMOPS,
16893fab30f7STamizh chelvam 	.spatial_mux = WMI_10_2_PEER_SPATIAL_MUX,
16903fab30f7STamizh chelvam 	.vht = WMI_10_2_PEER_VHT,
16913fab30f7STamizh chelvam 	.bw80 = WMI_10_2_PEER_80MHZ,
16923fab30f7STamizh chelvam 	.vht_2g = WMI_10_2_PEER_VHT_2G,
16933fab30f7STamizh chelvam 	.pmf = WMI_10_2_PEER_PMF,
1694bc1efd73SSebastian Gottschall 	.bw160 = WMI_10_2_PEER_160MHZ,
16953fab30f7STamizh chelvam };
16963fab30f7STamizh chelvam 
16970226d602SMichal Kazior void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
16982d66721cSMichal Kazior 				const struct wmi_channel_arg *arg)
16992d66721cSMichal Kazior {
17002d66721cSMichal Kazior 	u32 flags = 0;
17012d66721cSMichal Kazior 
17022d66721cSMichal Kazior 	memset(ch, 0, sizeof(*ch));
17032d66721cSMichal Kazior 
17042d66721cSMichal Kazior 	if (arg->passive)
17052d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_PASSIVE;
17062d66721cSMichal Kazior 	if (arg->allow_ibss)
17072d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
17082d66721cSMichal Kazior 	if (arg->allow_ht)
17092d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_ALLOW_HT;
17102d66721cSMichal Kazior 	if (arg->allow_vht)
17112d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_ALLOW_VHT;
17122d66721cSMichal Kazior 	if (arg->ht40plus)
17132d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_HT40_PLUS;
17142d66721cSMichal Kazior 	if (arg->chan_radar)
17152d66721cSMichal Kazior 		flags |= WMI_CHAN_FLAG_DFS;
17162d66721cSMichal Kazior 
17172d66721cSMichal Kazior 	ch->mhz = __cpu_to_le32(arg->freq);
17182d66721cSMichal Kazior 	ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1);
1719bc1efd73SSebastian Gottschall 	if (arg->mode == MODE_11AC_VHT80_80)
1720bc1efd73SSebastian Gottschall 		ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq2);
1721bc1efd73SSebastian Gottschall 	else
17222d66721cSMichal Kazior 		ch->band_center_freq2 = 0;
17232d66721cSMichal Kazior 	ch->min_power = arg->min_power;
17242d66721cSMichal Kazior 	ch->max_power = arg->max_power;
17252d66721cSMichal Kazior 	ch->reg_power = arg->max_reg_power;
17262d66721cSMichal Kazior 	ch->antenna_max = arg->max_antenna_gain;
1727513527c8SAlan Liu 	ch->max_tx_power = arg->max_power;
17282d66721cSMichal Kazior 
17292d66721cSMichal Kazior 	/* mode & flags share storage */
17302d66721cSMichal Kazior 	ch->mode = arg->mode;
17312d66721cSMichal Kazior 	ch->flags |= __cpu_to_le32(flags);
17322d66721cSMichal Kazior }
17332d66721cSMichal Kazior 
17345e3dd157SKalle Valo int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
17355e3dd157SKalle Valo {
17369eea5689SNicholas Mc Guire 	unsigned long time_left;
1737af762c0bSKalle Valo 
17389eea5689SNicholas Mc Guire 	time_left = wait_for_completion_timeout(&ar->wmi.service_ready,
17395e3dd157SKalle Valo 						WMI_SERVICE_READY_TIMEOUT_HZ);
17409eea5689SNicholas Mc Guire 	if (!time_left)
17419eea5689SNicholas Mc Guire 		return -ETIMEDOUT;
17429eea5689SNicholas Mc Guire 	return 0;
17435e3dd157SKalle Valo }
17445e3dd157SKalle Valo 
17455e3dd157SKalle Valo int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
17465e3dd157SKalle Valo {
17479eea5689SNicholas Mc Guire 	unsigned long time_left;
1748af762c0bSKalle Valo 
17499eea5689SNicholas Mc Guire 	time_left = wait_for_completion_timeout(&ar->wmi.unified_ready,
17505e3dd157SKalle Valo 						WMI_UNIFIED_READY_TIMEOUT_HZ);
17519eea5689SNicholas Mc Guire 	if (!time_left)
17529eea5689SNicholas Mc Guire 		return -ETIMEDOUT;
17539eea5689SNicholas Mc Guire 	return 0;
17545e3dd157SKalle Valo }
17555e3dd157SKalle Valo 
1756666a73f3SKalle Valo struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len)
17575e3dd157SKalle Valo {
17585e3dd157SKalle Valo 	struct sk_buff *skb;
17595e3dd157SKalle Valo 	u32 round_len = roundup(len, 4);
17605e3dd157SKalle Valo 
17617aa7a72aSMichal Kazior 	skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len);
17625e3dd157SKalle Valo 	if (!skb)
17635e3dd157SKalle Valo 		return NULL;
17645e3dd157SKalle Valo 
17655e3dd157SKalle Valo 	skb_reserve(skb, WMI_SKB_HEADROOM);
17665e3dd157SKalle Valo 	if (!IS_ALIGNED((unsigned long)skb->data, 4))
17677aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unaligned WMI skb\n");
17685e3dd157SKalle Valo 
17695e3dd157SKalle Valo 	skb_put(skb, round_len);
17705e3dd157SKalle Valo 	memset(skb->data, 0, round_len);
17715e3dd157SKalle Valo 
17725e3dd157SKalle Valo 	return skb;
17735e3dd157SKalle Valo }
17745e3dd157SKalle Valo 
17755e3dd157SKalle Valo static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
17765e3dd157SKalle Valo {
17775e3dd157SKalle Valo 	dev_kfree_skb(skb);
17785e3dd157SKalle Valo }
17795e3dd157SKalle Valo 
1780d7579d12SMichal Kazior int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
1781ce42870eSBartosz Markowski 			       u32 cmd_id)
17825e3dd157SKalle Valo {
17835e3dd157SKalle Valo 	struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
17845e3dd157SKalle Valo 	struct wmi_cmd_hdr *cmd_hdr;
1785be8b3943SMichal Kazior 	int ret;
17865e3dd157SKalle Valo 	u32 cmd = 0;
17875e3dd157SKalle Valo 
17885e3dd157SKalle Valo 	if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
17895e3dd157SKalle Valo 		return -ENOMEM;
17905e3dd157SKalle Valo 
17915e3dd157SKalle Valo 	cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID);
17925e3dd157SKalle Valo 
17935e3dd157SKalle Valo 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
17945e3dd157SKalle Valo 	cmd_hdr->cmd_id = __cpu_to_le32(cmd);
17955e3dd157SKalle Valo 
17965e3dd157SKalle Valo 	memset(skb_cb, 0, sizeof(*skb_cb));
17979ef0f58eSCarl Huang 	trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len);
1798be8b3943SMichal Kazior 	ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
17995e3dd157SKalle Valo 
1800be8b3943SMichal Kazior 	if (ret)
1801be8b3943SMichal Kazior 		goto err_pull;
18025e3dd157SKalle Valo 
18035e3dd157SKalle Valo 	return 0;
1804be8b3943SMichal Kazior 
1805be8b3943SMichal Kazior err_pull:
1806be8b3943SMichal Kazior 	skb_pull(skb, sizeof(struct wmi_cmd_hdr));
1807be8b3943SMichal Kazior 	return ret;
1808be8b3943SMichal Kazior }
1809be8b3943SMichal Kazior 
1810ed54388aSMichal Kazior static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
1811ed54388aSMichal Kazior {
1812af21319fSMichal Kazior 	struct ath10k *ar = arvif->ar;
18139ad50182SMichal Kazior 	struct ath10k_skb_cb *cb;
1814af21319fSMichal Kazior 	struct sk_buff *bcn;
181566b8a010SMichal Kazior 	bool dtim_zero;
181666b8a010SMichal Kazior 	bool deliver_cab;
1817ed54388aSMichal Kazior 	int ret;
1818ed54388aSMichal Kazior 
1819af21319fSMichal Kazior 	spin_lock_bh(&ar->data_lock);
1820ed54388aSMichal Kazior 
18219ad50182SMichal Kazior 	bcn = arvif->beacon;
1822ed54388aSMichal Kazior 
1823af21319fSMichal Kazior 	if (!bcn)
1824af21319fSMichal Kazior 		goto unlock;
1825ed54388aSMichal Kazior 
18269ad50182SMichal Kazior 	cb = ATH10K_SKB_CB(bcn);
1827ed54388aSMichal Kazior 
1828af21319fSMichal Kazior 	switch (arvif->beacon_state) {
1829af21319fSMichal Kazior 	case ATH10K_BEACON_SENDING:
1830af21319fSMichal Kazior 	case ATH10K_BEACON_SENT:
1831af21319fSMichal Kazior 		break;
1832af21319fSMichal Kazior 	case ATH10K_BEACON_SCHEDULED:
1833af21319fSMichal Kazior 		arvif->beacon_state = ATH10K_BEACON_SENDING;
1834af21319fSMichal Kazior 		spin_unlock_bh(&ar->data_lock);
1835af21319fSMichal Kazior 
183666b8a010SMichal Kazior 		dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO);
183766b8a010SMichal Kazior 		deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB);
1838af21319fSMichal Kazior 		ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar,
1839af21319fSMichal Kazior 							arvif->vdev_id,
1840af21319fSMichal Kazior 							bcn->data, bcn->len,
1841af21319fSMichal Kazior 							cb->paddr,
184266b8a010SMichal Kazior 							dtim_zero,
184366b8a010SMichal Kazior 							deliver_cab);
1844ed54388aSMichal Kazior 
1845af21319fSMichal Kazior 		spin_lock_bh(&ar->data_lock);
1846af21319fSMichal Kazior 
1847af21319fSMichal Kazior 		if (ret == 0)
1848af21319fSMichal Kazior 			arvif->beacon_state = ATH10K_BEACON_SENT;
1849af21319fSMichal Kazior 		else
1850af21319fSMichal Kazior 			arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
1851af21319fSMichal Kazior 	}
1852af21319fSMichal Kazior 
1853af21319fSMichal Kazior unlock:
1854af21319fSMichal Kazior 	spin_unlock_bh(&ar->data_lock);
1855ed54388aSMichal Kazior }
1856ed54388aSMichal Kazior 
1857ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
1858ed54388aSMichal Kazior 				       struct ieee80211_vif *vif)
1859ed54388aSMichal Kazior {
186056ac13bfSAmadeusz Sławiński 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
1861ed54388aSMichal Kazior 
1862ed54388aSMichal Kazior 	ath10k_wmi_tx_beacon_nowait(arvif);
1863ed54388aSMichal Kazior }
1864ed54388aSMichal Kazior 
1865ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar)
1866ed54388aSMichal Kazior {
1867ed54388aSMichal Kazior 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
1868ed54388aSMichal Kazior 						   IEEE80211_IFACE_ITER_NORMAL,
1869ed54388aSMichal Kazior 						   ath10k_wmi_tx_beacons_iter,
1870ed54388aSMichal Kazior 						   NULL);
1871ed54388aSMichal Kazior }
1872ed54388aSMichal Kazior 
187312acbc43SMichal Kazior static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
1874be8b3943SMichal Kazior {
1875ed54388aSMichal Kazior 	/* try to send pending beacons first. they take priority */
1876ed54388aSMichal Kazior 	ath10k_wmi_tx_beacons_nowait(ar);
1877ed54388aSMichal Kazior 
1878be8b3943SMichal Kazior 	wake_up(&ar->wmi.tx_credits_wq);
1879be8b3943SMichal Kazior }
1880be8b3943SMichal Kazior 
1881666a73f3SKalle Valo int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
1882be8b3943SMichal Kazior {
188334957b25SBartosz Markowski 	int ret = -EOPNOTSUPP;
1884be8b3943SMichal Kazior 
188556b84287SKalle Valo 	might_sleep();
188656b84287SKalle Valo 
188734957b25SBartosz Markowski 	if (cmd_id == WMI_CMD_UNSUPPORTED) {
18887aa7a72aSMichal Kazior 		ath10k_warn(ar, "wmi command %d is not supported by firmware\n",
188955321559SBartosz Markowski 			    cmd_id);
189055321559SBartosz Markowski 		return ret;
189155321559SBartosz Markowski 	}
1892be8b3943SMichal Kazior 
1893be8b3943SMichal Kazior 	wait_event_timeout(ar->wmi.tx_credits_wq, ({
1894ed54388aSMichal Kazior 		/* try to send pending beacons first. they take priority */
1895ed54388aSMichal Kazior 		ath10k_wmi_tx_beacons_nowait(ar);
1896ed54388aSMichal Kazior 
1897be8b3943SMichal Kazior 		ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
18987962b0d8SMichal Kazior 
18997962b0d8SMichal Kazior 		if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
19007962b0d8SMichal Kazior 			ret = -ESHUTDOWN;
19017962b0d8SMichal Kazior 
1902be8b3943SMichal Kazior 		(ret != -EAGAIN);
1903be8b3943SMichal Kazior 	}), 3 * HZ);
1904be8b3943SMichal Kazior 
1905be8b3943SMichal Kazior 	if (ret)
1906be8b3943SMichal Kazior 		dev_kfree_skb_any(skb);
1907be8b3943SMichal Kazior 
1908a9911937SMartin Willi 	if (ret == -EAGAIN) {
1909a9911937SMartin Willi 		ath10k_warn(ar, "wmi command %d timeout, restarting hardware\n",
1910a9911937SMartin Willi 			    cmd_id);
1911a9911937SMartin Willi 		queue_work(ar->workqueue, &ar->restart_work);
1912a9911937SMartin Willi 	}
1913a9911937SMartin Willi 
1914be8b3943SMichal Kazior 	return ret;
19155e3dd157SKalle Valo }
19165e3dd157SKalle Valo 
1917d7579d12SMichal Kazior static struct sk_buff *
1918d7579d12SMichal Kazior ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
19195e00d31aSBartosz Markowski {
1920609db229SMichal Kazior 	struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
1921a66cd733SBob Copeland 	struct ath10k_vif *arvif;
19225e00d31aSBartosz Markowski 	struct wmi_mgmt_tx_cmd *cmd;
19235e00d31aSBartosz Markowski 	struct ieee80211_hdr *hdr;
1924d7579d12SMichal Kazior 	struct sk_buff *skb;
19255e00d31aSBartosz Markowski 	int len;
1926609db229SMichal Kazior 	u32 vdev_id;
1927d7579d12SMichal Kazior 	u32 buf_len = msdu->len;
19285e00d31aSBartosz Markowski 	u16 fc;
19295e00d31aSBartosz Markowski 
1930d7579d12SMichal Kazior 	hdr = (struct ieee80211_hdr *)msdu->data;
19315e00d31aSBartosz Markowski 	fc = le16_to_cpu(hdr->frame_control);
19325e00d31aSBartosz Markowski 
1933a66cd733SBob Copeland 	if (cb->vif) {
1934a66cd733SBob Copeland 		arvif = (void *)cb->vif->drv_priv;
1935609db229SMichal Kazior 		vdev_id = arvif->vdev_id;
1936a66cd733SBob Copeland 	} else {
1937609db229SMichal Kazior 		vdev_id = 0;
1938a66cd733SBob Copeland 	}
1939609db229SMichal Kazior 
19405e00d31aSBartosz Markowski 	if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
1941d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
19425e00d31aSBartosz Markowski 
1943d7579d12SMichal Kazior 	len = sizeof(cmd->hdr) + msdu->len;
1944eeab266cSMarek Kwaczynski 
1945eeab266cSMarek Kwaczynski 	if ((ieee80211_is_action(hdr->frame_control) ||
1946eeab266cSMarek Kwaczynski 	     ieee80211_is_deauth(hdr->frame_control) ||
1947eeab266cSMarek Kwaczynski 	     ieee80211_is_disassoc(hdr->frame_control)) &&
1948eeab266cSMarek Kwaczynski 	     ieee80211_has_protected(hdr->frame_control)) {
1949eeab266cSMarek Kwaczynski 		len += IEEE80211_CCMP_MIC_LEN;
1950eeab266cSMarek Kwaczynski 		buf_len += IEEE80211_CCMP_MIC_LEN;
1951eeab266cSMarek Kwaczynski 	}
1952eeab266cSMarek Kwaczynski 
19535e00d31aSBartosz Markowski 	len = round_up(len, 4);
19545e00d31aSBartosz Markowski 
1955d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
1956d7579d12SMichal Kazior 	if (!skb)
1957d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
19585e00d31aSBartosz Markowski 
1959d7579d12SMichal Kazior 	cmd = (struct wmi_mgmt_tx_cmd *)skb->data;
19605e00d31aSBartosz Markowski 
1961609db229SMichal Kazior 	cmd->hdr.vdev_id = __cpu_to_le32(vdev_id);
19625e00d31aSBartosz Markowski 	cmd->hdr.tx_rate = 0;
19635e00d31aSBartosz Markowski 	cmd->hdr.tx_power = 0;
1964eeab266cSMarek Kwaczynski 	cmd->hdr.buf_len = __cpu_to_le32(buf_len);
19655e00d31aSBartosz Markowski 
1966b25f32cbSKalle Valo 	ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr));
1967d7579d12SMichal Kazior 	memcpy(cmd->buf, msdu->data, msdu->len);
19685e00d31aSBartosz Markowski 
196975b34800SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n",
1970d7579d12SMichal Kazior 		   msdu, skb->len, fc & IEEE80211_FCTL_FTYPE,
19715e00d31aSBartosz Markowski 		   fc & IEEE80211_FCTL_STYPE);
19725ce8e7fdSRajkumar Manoharan 	trace_ath10k_tx_hdr(ar, skb->data, skb->len);
19735ce8e7fdSRajkumar Manoharan 	trace_ath10k_tx_payload(ar, skb->data, skb->len);
19745e00d31aSBartosz Markowski 
1975d7579d12SMichal Kazior 	return skb;
19765e00d31aSBartosz Markowski }
19775e00d31aSBartosz Markowski 
19785c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_started(struct ath10k *ar)
19795c81c7fdSMichal Kazior {
19805c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
19815c81c7fdSMichal Kazior 
19825c81c7fdSMichal Kazior 	switch (ar->scan.state) {
19835c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
19845c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
19855c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
19867aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n",
19875c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
19885c81c7fdSMichal Kazior 			    ar->scan.state);
19895c81c7fdSMichal Kazior 		break;
19905c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
19915c81c7fdSMichal Kazior 		ar->scan.state = ATH10K_SCAN_RUNNING;
19925c81c7fdSMichal Kazior 
19935c81c7fdSMichal Kazior 		if (ar->scan.is_roc)
19945c81c7fdSMichal Kazior 			ieee80211_ready_on_channel(ar->hw);
19955c81c7fdSMichal Kazior 
19965c81c7fdSMichal Kazior 		complete(&ar->scan.started);
19975c81c7fdSMichal Kazior 		break;
19985c81c7fdSMichal Kazior 	}
19995c81c7fdSMichal Kazior }
20005c81c7fdSMichal Kazior 
20012f9eec0bSBen Greear static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
20022f9eec0bSBen Greear {
20032f9eec0bSBen Greear 	lockdep_assert_held(&ar->data_lock);
20042f9eec0bSBen Greear 
20052f9eec0bSBen Greear 	switch (ar->scan.state) {
20062f9eec0bSBen Greear 	case ATH10K_SCAN_IDLE:
20072f9eec0bSBen Greear 	case ATH10K_SCAN_RUNNING:
20082f9eec0bSBen Greear 	case ATH10K_SCAN_ABORTING:
20092f9eec0bSBen Greear 		ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
20102f9eec0bSBen Greear 			    ath10k_scan_state_str(ar->scan.state),
20112f9eec0bSBen Greear 			    ar->scan.state);
20122f9eec0bSBen Greear 		break;
20132f9eec0bSBen Greear 	case ATH10K_SCAN_STARTING:
20142f9eec0bSBen Greear 		complete(&ar->scan.started);
20152f9eec0bSBen Greear 		__ath10k_scan_finish(ar);
20162f9eec0bSBen Greear 		break;
20172f9eec0bSBen Greear 	}
20182f9eec0bSBen Greear }
20192f9eec0bSBen Greear 
20205c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
20215c81c7fdSMichal Kazior {
20225c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
20235c81c7fdSMichal Kazior 
20245c81c7fdSMichal Kazior 	switch (ar->scan.state) {
20255c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
20265c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
20275c81c7fdSMichal Kazior 		/* One suspected reason scan can be completed while starting is
20285c81c7fdSMichal Kazior 		 * if firmware fails to deliver all scan events to the host,
20295c81c7fdSMichal Kazior 		 * e.g. when transport pipe is full. This has been observed
20305c81c7fdSMichal Kazior 		 * with spectral scan phyerr events starving wmi transport
20315c81c7fdSMichal Kazior 		 * pipe. In such case the "scan completed" event should be (and
20325c81c7fdSMichal Kazior 		 * is) ignored by the host as it may be just firmware's scan
20335c81c7fdSMichal Kazior 		 * state machine recovering.
20345c81c7fdSMichal Kazior 		 */
20357aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n",
20365c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
20375c81c7fdSMichal Kazior 			    ar->scan.state);
20385c81c7fdSMichal Kazior 		break;
20395c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
20405c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
20415c81c7fdSMichal Kazior 		__ath10k_scan_finish(ar);
20425c81c7fdSMichal Kazior 		break;
20435c81c7fdSMichal Kazior 	}
20445c81c7fdSMichal Kazior }
20455c81c7fdSMichal Kazior 
20465c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar)
20475c81c7fdSMichal Kazior {
20485c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
20495c81c7fdSMichal Kazior 
20505c81c7fdSMichal Kazior 	switch (ar->scan.state) {
20515c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
20525c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
20537aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n",
20545c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
20555c81c7fdSMichal Kazior 			    ar->scan.state);
20565c81c7fdSMichal Kazior 		break;
20575c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
20585c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
20595c81c7fdSMichal Kazior 		ar->scan_channel = NULL;
20605c81c7fdSMichal Kazior 		break;
20615c81c7fdSMichal Kazior 	}
20625c81c7fdSMichal Kazior }
20635c81c7fdSMichal Kazior 
20645c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq)
20655c81c7fdSMichal Kazior {
20665c81c7fdSMichal Kazior 	lockdep_assert_held(&ar->data_lock);
20675c81c7fdSMichal Kazior 
20685c81c7fdSMichal Kazior 	switch (ar->scan.state) {
20695c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
20705c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
20717aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n",
20725c81c7fdSMichal Kazior 			    ath10k_scan_state_str(ar->scan.state),
20735c81c7fdSMichal Kazior 			    ar->scan.state);
20745c81c7fdSMichal Kazior 		break;
20755c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
20765c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
20775c81c7fdSMichal Kazior 		ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);
20785c81c7fdSMichal Kazior 
20795c81c7fdSMichal Kazior 		if (ar->scan.is_roc && ar->scan.roc_freq == freq)
20805c81c7fdSMichal Kazior 			complete(&ar->scan.on_channel);
20815c81c7fdSMichal Kazior 		break;
20825c81c7fdSMichal Kazior 	}
20835c81c7fdSMichal Kazior }
20845c81c7fdSMichal Kazior 
20859ff8b724SMichal Kazior static const char *
20869ff8b724SMichal Kazior ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type,
20879ff8b724SMichal Kazior 			       enum wmi_scan_completion_reason reason)
20889ff8b724SMichal Kazior {
20899ff8b724SMichal Kazior 	switch (type) {
20909ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_STARTED:
20919ff8b724SMichal Kazior 		return "started";
20929ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_COMPLETED:
20939ff8b724SMichal Kazior 		switch (reason) {
20949ff8b724SMichal Kazior 		case WMI_SCAN_REASON_COMPLETED:
20959ff8b724SMichal Kazior 			return "completed";
20969ff8b724SMichal Kazior 		case WMI_SCAN_REASON_CANCELLED:
20979ff8b724SMichal Kazior 			return "completed [cancelled]";
20989ff8b724SMichal Kazior 		case WMI_SCAN_REASON_PREEMPTED:
20999ff8b724SMichal Kazior 			return "completed [preempted]";
21009ff8b724SMichal Kazior 		case WMI_SCAN_REASON_TIMEDOUT:
21019ff8b724SMichal Kazior 			return "completed [timedout]";
2102b2297baaSRaja Mani 		case WMI_SCAN_REASON_INTERNAL_FAILURE:
2103b2297baaSRaja Mani 			return "completed [internal err]";
21049ff8b724SMichal Kazior 		case WMI_SCAN_REASON_MAX:
21059ff8b724SMichal Kazior 			break;
21069ff8b724SMichal Kazior 		}
21079ff8b724SMichal Kazior 		return "completed [unknown]";
21089ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_BSS_CHANNEL:
21099ff8b724SMichal Kazior 		return "bss channel";
21109ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
21119ff8b724SMichal Kazior 		return "foreign channel";
21129ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_DEQUEUED:
21139ff8b724SMichal Kazior 		return "dequeued";
21149ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_PREEMPTED:
21159ff8b724SMichal Kazior 		return "preempted";
21169ff8b724SMichal Kazior 	case WMI_SCAN_EVENT_START_FAILED:
21179ff8b724SMichal Kazior 		return "start failed";
2118b2297baaSRaja Mani 	case WMI_SCAN_EVENT_RESTARTED:
2119b2297baaSRaja Mani 		return "restarted";
2120b2297baaSRaja Mani 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
2121b2297baaSRaja Mani 		return "foreign channel exit";
21229ff8b724SMichal Kazior 	default:
21239ff8b724SMichal Kazior 		return "unknown";
21249ff8b724SMichal Kazior 	}
21259ff8b724SMichal Kazior }
21269ff8b724SMichal Kazior 
2127d7579d12SMichal Kazior static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb,
212832653cf1SMichal Kazior 				      struct wmi_scan_ev_arg *arg)
212932653cf1SMichal Kazior {
213032653cf1SMichal Kazior 	struct wmi_scan_event *ev = (void *)skb->data;
213132653cf1SMichal Kazior 
213232653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
213332653cf1SMichal Kazior 		return -EPROTO;
213432653cf1SMichal Kazior 
213532653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
213632653cf1SMichal Kazior 	arg->event_type = ev->event_type;
213732653cf1SMichal Kazior 	arg->reason = ev->reason;
213832653cf1SMichal Kazior 	arg->channel_freq = ev->channel_freq;
213932653cf1SMichal Kazior 	arg->scan_req_id = ev->scan_req_id;
214032653cf1SMichal Kazior 	arg->scan_id = ev->scan_id;
214132653cf1SMichal Kazior 	arg->vdev_id = ev->vdev_id;
214232653cf1SMichal Kazior 
214332653cf1SMichal Kazior 	return 0;
214432653cf1SMichal Kazior }
214532653cf1SMichal Kazior 
21460226d602SMichal Kazior int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
21475e3dd157SKalle Valo {
214832653cf1SMichal Kazior 	struct wmi_scan_ev_arg arg = {};
21495e3dd157SKalle Valo 	enum wmi_scan_event_type event_type;
21505e3dd157SKalle Valo 	enum wmi_scan_completion_reason reason;
21515e3dd157SKalle Valo 	u32 freq;
21525e3dd157SKalle Valo 	u32 req_id;
21535e3dd157SKalle Valo 	u32 scan_id;
21545e3dd157SKalle Valo 	u32 vdev_id;
215532653cf1SMichal Kazior 	int ret;
21565e3dd157SKalle Valo 
2157d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_scan(ar, skb, &arg);
215832653cf1SMichal Kazior 	if (ret) {
215932653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse scan event: %d\n", ret);
216032653cf1SMichal Kazior 		return ret;
216132653cf1SMichal Kazior 	}
216232653cf1SMichal Kazior 
216332653cf1SMichal Kazior 	event_type = __le32_to_cpu(arg.event_type);
216432653cf1SMichal Kazior 	reason = __le32_to_cpu(arg.reason);
216532653cf1SMichal Kazior 	freq = __le32_to_cpu(arg.channel_freq);
216632653cf1SMichal Kazior 	req_id = __le32_to_cpu(arg.scan_req_id);
216732653cf1SMichal Kazior 	scan_id = __le32_to_cpu(arg.scan_id);
216832653cf1SMichal Kazior 	vdev_id = __le32_to_cpu(arg.vdev_id);
21695e3dd157SKalle Valo 
21705e3dd157SKalle Valo 	spin_lock_bh(&ar->data_lock);
21715e3dd157SKalle Valo 
21727aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
21735c81c7fdSMichal Kazior 		   "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n",
21745c81c7fdSMichal Kazior 		   ath10k_wmi_event_scan_type_str(event_type, reason),
21755c81c7fdSMichal Kazior 		   event_type, reason, freq, req_id, scan_id, vdev_id,
21765c81c7fdSMichal Kazior 		   ath10k_scan_state_str(ar->scan.state), ar->scan.state);
21775c81c7fdSMichal Kazior 
21785e3dd157SKalle Valo 	switch (event_type) {
21795e3dd157SKalle Valo 	case WMI_SCAN_EVENT_STARTED:
21805c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_started(ar);
21815e3dd157SKalle Valo 		break;
21825e3dd157SKalle Valo 	case WMI_SCAN_EVENT_COMPLETED:
21835c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_completed(ar);
21845e3dd157SKalle Valo 		break;
21855e3dd157SKalle Valo 	case WMI_SCAN_EVENT_BSS_CHANNEL:
21865c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_bss_chan(ar);
21875e3dd157SKalle Valo 		break;
21885e3dd157SKalle Valo 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
21895c81c7fdSMichal Kazior 		ath10k_wmi_event_scan_foreign_chan(ar, freq);
21905c81c7fdSMichal Kazior 		break;
21915c81c7fdSMichal Kazior 	case WMI_SCAN_EVENT_START_FAILED:
21927aa7a72aSMichal Kazior 		ath10k_warn(ar, "received scan start failure event\n");
21932f9eec0bSBen Greear 		ath10k_wmi_event_scan_start_failed(ar);
21945e3dd157SKalle Valo 		break;
21955e3dd157SKalle Valo 	case WMI_SCAN_EVENT_DEQUEUED:
21965e3dd157SKalle Valo 	case WMI_SCAN_EVENT_PREEMPTED:
2197b2297baaSRaja Mani 	case WMI_SCAN_EVENT_RESTARTED:
2198b2297baaSRaja Mani 	case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
21995e3dd157SKalle Valo 	default:
22005e3dd157SKalle Valo 		break;
22015e3dd157SKalle Valo 	}
22025e3dd157SKalle Valo 
22035e3dd157SKalle Valo 	spin_unlock_bh(&ar->data_lock);
22045e3dd157SKalle Valo 	return 0;
22055e3dd157SKalle Valo }
22065e3dd157SKalle Valo 
2207504f6cdfSSujith Manoharan /* If keys are configured, HW decrypts all frames
2208504f6cdfSSujith Manoharan  * with protected bit set. Mark such frames as decrypted.
2209504f6cdfSSujith Manoharan  */
2210504f6cdfSSujith Manoharan static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar,
2211504f6cdfSSujith Manoharan 					 struct sk_buff *skb,
2212504f6cdfSSujith Manoharan 					 struct ieee80211_rx_status *status)
2213504f6cdfSSujith Manoharan {
2214504f6cdfSSujith Manoharan 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2215504f6cdfSSujith Manoharan 	unsigned int hdrlen;
2216504f6cdfSSujith Manoharan 	bool peer_key;
2217504f6cdfSSujith Manoharan 	u8 *addr, keyidx;
2218504f6cdfSSujith Manoharan 
2219504f6cdfSSujith Manoharan 	if (!ieee80211_is_auth(hdr->frame_control) ||
2220504f6cdfSSujith Manoharan 	    !ieee80211_has_protected(hdr->frame_control))
2221504f6cdfSSujith Manoharan 		return;
2222504f6cdfSSujith Manoharan 
2223504f6cdfSSujith Manoharan 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
2224504f6cdfSSujith Manoharan 	if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN))
2225504f6cdfSSujith Manoharan 		return;
2226504f6cdfSSujith Manoharan 
2227504f6cdfSSujith Manoharan 	keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT;
2228504f6cdfSSujith Manoharan 	addr = ieee80211_get_SA(hdr);
2229504f6cdfSSujith Manoharan 
2230504f6cdfSSujith Manoharan 	spin_lock_bh(&ar->data_lock);
2231504f6cdfSSujith Manoharan 	peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx);
2232504f6cdfSSujith Manoharan 	spin_unlock_bh(&ar->data_lock);
2233504f6cdfSSujith Manoharan 
2234504f6cdfSSujith Manoharan 	if (peer_key) {
2235504f6cdfSSujith Manoharan 		ath10k_dbg(ar, ATH10K_DBG_MAC,
2236504f6cdfSSujith Manoharan 			   "mac wep key present for peer %pM\n", addr);
2237504f6cdfSSujith Manoharan 		status->flag |= RX_FLAG_DECRYPTED;
2238504f6cdfSSujith Manoharan 	}
2239504f6cdfSSujith Manoharan }
2240504f6cdfSSujith Manoharan 
2241d7579d12SMichal Kazior static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
2242d7579d12SMichal Kazior 					 struct wmi_mgmt_rx_ev_arg *arg)
22435e3dd157SKalle Valo {
22440d9b0438SMichal Kazior 	struct wmi_mgmt_rx_event_v1 *ev_v1;
22450d9b0438SMichal Kazior 	struct wmi_mgmt_rx_event_v2 *ev_v2;
22460d9b0438SMichal Kazior 	struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
22478d130963SPeter Oh 	struct wmi_mgmt_rx_ext_info *ext_info;
224832653cf1SMichal Kazior 	size_t pull_len;
224932653cf1SMichal Kazior 	u32 msdu_len;
22508d130963SPeter Oh 	u32 len;
22515e3dd157SKalle Valo 
2252c4cdf753SKalle Valo 	if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX,
2253c4cdf753SKalle Valo 		     ar->running_fw->fw_file.fw_features)) {
22540d9b0438SMichal Kazior 		ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data;
22550d9b0438SMichal Kazior 		ev_hdr = &ev_v2->hdr.v1;
22560d9b0438SMichal Kazior 		pull_len = sizeof(*ev_v2);
22570d9b0438SMichal Kazior 	} else {
22580d9b0438SMichal Kazior 		ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data;
22590d9b0438SMichal Kazior 		ev_hdr = &ev_v1->hdr;
22600d9b0438SMichal Kazior 		pull_len = sizeof(*ev_v1);
22610d9b0438SMichal Kazior 	}
22620d9b0438SMichal Kazior 
226332653cf1SMichal Kazior 	if (skb->len < pull_len)
226432653cf1SMichal Kazior 		return -EPROTO;
226532653cf1SMichal Kazior 
226632653cf1SMichal Kazior 	skb_pull(skb, pull_len);
226732653cf1SMichal Kazior 	arg->channel = ev_hdr->channel;
226832653cf1SMichal Kazior 	arg->buf_len = ev_hdr->buf_len;
226932653cf1SMichal Kazior 	arg->status = ev_hdr->status;
227032653cf1SMichal Kazior 	arg->snr = ev_hdr->snr;
227132653cf1SMichal Kazior 	arg->phy_mode = ev_hdr->phy_mode;
227232653cf1SMichal Kazior 	arg->rate = ev_hdr->rate;
227332653cf1SMichal Kazior 
227432653cf1SMichal Kazior 	msdu_len = __le32_to_cpu(arg->buf_len);
227532653cf1SMichal Kazior 	if (skb->len < msdu_len)
227632653cf1SMichal Kazior 		return -EPROTO;
227732653cf1SMichal Kazior 
22788d130963SPeter Oh 	if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
22798d130963SPeter Oh 		len = ALIGN(le32_to_cpu(arg->buf_len), 4);
22808d130963SPeter Oh 		ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
22818d130963SPeter Oh 		memcpy(&arg->ext_info, ext_info,
22828d130963SPeter Oh 		       sizeof(struct wmi_mgmt_rx_ext_info));
22838d130963SPeter Oh 	}
228432653cf1SMichal Kazior 	/* the WMI buffer might've ended up being padded to 4 bytes due to HTC
228532653cf1SMichal Kazior 	 * trailer with credit update. Trim the excess garbage.
228632653cf1SMichal Kazior 	 */
228732653cf1SMichal Kazior 	skb_trim(skb, msdu_len);
228832653cf1SMichal Kazior 
228932653cf1SMichal Kazior 	return 0;
229032653cf1SMichal Kazior }
229132653cf1SMichal Kazior 
22921c092961SRaja Mani static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar,
22931c092961SRaja Mani 					      struct sk_buff *skb,
22941c092961SRaja Mani 					      struct wmi_mgmt_rx_ev_arg *arg)
22951c092961SRaja Mani {
22961c092961SRaja Mani 	struct wmi_10_4_mgmt_rx_event *ev;
22971c092961SRaja Mani 	struct wmi_10_4_mgmt_rx_hdr *ev_hdr;
22981c092961SRaja Mani 	size_t pull_len;
22991c092961SRaja Mani 	u32 msdu_len;
23007d5efd08SPeter Oh 	struct wmi_mgmt_rx_ext_info *ext_info;
23017d5efd08SPeter Oh 	u32 len;
23021c092961SRaja Mani 
23031c092961SRaja Mani 	ev = (struct wmi_10_4_mgmt_rx_event *)skb->data;
23041c092961SRaja Mani 	ev_hdr = &ev->hdr;
23051c092961SRaja Mani 	pull_len = sizeof(*ev);
23061c092961SRaja Mani 
23071c092961SRaja Mani 	if (skb->len < pull_len)
23081c092961SRaja Mani 		return -EPROTO;
23091c092961SRaja Mani 
23101c092961SRaja Mani 	skb_pull(skb, pull_len);
23111c092961SRaja Mani 	arg->channel = ev_hdr->channel;
23121c092961SRaja Mani 	arg->buf_len = ev_hdr->buf_len;
23131c092961SRaja Mani 	arg->status = ev_hdr->status;
23141c092961SRaja Mani 	arg->snr = ev_hdr->snr;
23151c092961SRaja Mani 	arg->phy_mode = ev_hdr->phy_mode;
23161c092961SRaja Mani 	arg->rate = ev_hdr->rate;
23171c092961SRaja Mani 
23181c092961SRaja Mani 	msdu_len = __le32_to_cpu(arg->buf_len);
23191c092961SRaja Mani 	if (skb->len < msdu_len)
23201c092961SRaja Mani 		return -EPROTO;
23211c092961SRaja Mani 
23227d5efd08SPeter Oh 	if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
23237d5efd08SPeter Oh 		len = ALIGN(le32_to_cpu(arg->buf_len), 4);
23247d5efd08SPeter Oh 		ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
23257d5efd08SPeter Oh 		memcpy(&arg->ext_info, ext_info,
23267d5efd08SPeter Oh 		       sizeof(struct wmi_mgmt_rx_ext_info));
23277d5efd08SPeter Oh 	}
23287d5efd08SPeter Oh 
23291c092961SRaja Mani 	/* Make sure bytes added for padding are removed. */
23301c092961SRaja Mani 	skb_trim(skb, msdu_len);
23311c092961SRaja Mani 
23321c092961SRaja Mani 	return 0;
23331c092961SRaja Mani }
23341c092961SRaja Mani 
23357d42298eSRajkumar Manoharan static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar,
23367d42298eSRajkumar Manoharan 				       struct ieee80211_hdr *hdr)
23377d42298eSRajkumar Manoharan {
23387d42298eSRajkumar Manoharan 	if (!ieee80211_has_protected(hdr->frame_control))
23397d42298eSRajkumar Manoharan 		return false;
23407d42298eSRajkumar Manoharan 
23417d42298eSRajkumar Manoharan 	/* FW delivers WEP Shared Auth frame with Protected Bit set and
23427d42298eSRajkumar Manoharan 	 * encrypted payload. However in case of PMF it delivers decrypted
23437d42298eSRajkumar Manoharan 	 * frames with Protected Bit set.
23447d42298eSRajkumar Manoharan 	 */
23457d42298eSRajkumar Manoharan 	if (ieee80211_is_auth(hdr->frame_control))
23467d42298eSRajkumar Manoharan 		return false;
23477d42298eSRajkumar Manoharan 
23487d42298eSRajkumar Manoharan 	/* qca99x0 based FW delivers broadcast or multicast management frames
23497d42298eSRajkumar Manoharan 	 * (ex: group privacy action frames in mesh) as encrypted payload.
23507d42298eSRajkumar Manoharan 	 */
23517d42298eSRajkumar Manoharan 	if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) &&
23527d42298eSRajkumar Manoharan 	    ar->hw_params.sw_decrypt_mcast_mgmt)
23537d42298eSRajkumar Manoharan 		return false;
23547d42298eSRajkumar Manoharan 
23557d42298eSRajkumar Manoharan 	return true;
23567d42298eSRajkumar Manoharan }
23577d42298eSRajkumar Manoharan 
23584b816f17SAbhishek Ambure static int
23594b816f17SAbhishek Ambure wmi_process_mgmt_tx_comp(struct ath10k *ar, struct mgmt_tx_compl_params *param)
2360dc405152SRakesh Pillai {
2361dc405152SRakesh Pillai 	struct ath10k_mgmt_tx_pkt_addr *pkt_addr;
2362dc405152SRakesh Pillai 	struct ath10k_wmi *wmi = &ar->wmi;
2363dc405152SRakesh Pillai 	struct ieee80211_tx_info *info;
2364dc405152SRakesh Pillai 	struct sk_buff *msdu;
2365dc405152SRakesh Pillai 	int ret;
2366dc405152SRakesh Pillai 
2367dc405152SRakesh Pillai 	spin_lock_bh(&ar->data_lock);
2368dc405152SRakesh Pillai 
23694b816f17SAbhishek Ambure 	pkt_addr = idr_find(&wmi->mgmt_pending_tx, param->desc_id);
2370dc405152SRakesh Pillai 	if (!pkt_addr) {
2371dc405152SRakesh Pillai 		ath10k_warn(ar, "received mgmt tx completion for invalid msdu_id: %d\n",
23724b816f17SAbhishek Ambure 			    param->desc_id);
2373dc405152SRakesh Pillai 		ret = -ENOENT;
2374dc405152SRakesh Pillai 		goto out;
2375dc405152SRakesh Pillai 	}
2376dc405152SRakesh Pillai 
2377dc405152SRakesh Pillai 	msdu = pkt_addr->vaddr;
2378dc405152SRakesh Pillai 	dma_unmap_single(ar->dev, pkt_addr->paddr,
23796e8a8991SRakesh Pillai 			 msdu->len, DMA_TO_DEVICE);
2380dc405152SRakesh Pillai 	info = IEEE80211_SKB_CB(msdu);
2381058a7eabSRakesh Pillai 
23824b816f17SAbhishek Ambure 	if (param->status) {
2383058a7eabSRakesh Pillai 		info->flags &= ~IEEE80211_TX_STAT_ACK;
23844b816f17SAbhishek Ambure 	} else {
2385058a7eabSRakesh Pillai 		info->flags |= IEEE80211_TX_STAT_ACK;
23864b816f17SAbhishek Ambure 		info->status.ack_signal = ATH10K_DEFAULT_NOISE_FLOOR +
23874b816f17SAbhishek Ambure 					  param->ack_rssi;
23884b816f17SAbhishek Ambure 		info->status.is_valid_ack_signal = true;
23894b816f17SAbhishek Ambure 	}
2390058a7eabSRakesh Pillai 
2391dc405152SRakesh Pillai 	ieee80211_tx_status_irqsafe(ar->hw, msdu);
2392dc405152SRakesh Pillai 
2393dc405152SRakesh Pillai 	ret = 0;
2394dc405152SRakesh Pillai 
2395dc405152SRakesh Pillai out:
23964b816f17SAbhishek Ambure 	idr_remove(&wmi->mgmt_pending_tx, param->desc_id);
2397dc405152SRakesh Pillai 	spin_unlock_bh(&ar->data_lock);
2398dc405152SRakesh Pillai 	return ret;
2399dc405152SRakesh Pillai }
2400dc405152SRakesh Pillai 
2401dc405152SRakesh Pillai int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb)
2402dc405152SRakesh Pillai {
2403dc405152SRakesh Pillai 	struct wmi_tlv_mgmt_tx_compl_ev_arg arg;
24044b816f17SAbhishek Ambure 	struct mgmt_tx_compl_params param;
2405dc405152SRakesh Pillai 	int ret;
2406dc405152SRakesh Pillai 
2407dc405152SRakesh Pillai 	ret = ath10k_wmi_pull_mgmt_tx_compl(ar, skb, &arg);
2408dc405152SRakesh Pillai 	if (ret) {
2409dc405152SRakesh Pillai 		ath10k_warn(ar, "failed to parse mgmt comp event: %d\n", ret);
2410dc405152SRakesh Pillai 		return ret;
2411dc405152SRakesh Pillai 	}
2412dc405152SRakesh Pillai 
24134b816f17SAbhishek Ambure 	memset(&param, 0, sizeof(struct mgmt_tx_compl_params));
24144b816f17SAbhishek Ambure 	param.desc_id = __le32_to_cpu(arg.desc_id);
24154b816f17SAbhishek Ambure 	param.status = __le32_to_cpu(arg.status);
24164b816f17SAbhishek Ambure 
24174b816f17SAbhishek Ambure 	if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map))
24184b816f17SAbhishek Ambure 		param.ack_rssi = __le32_to_cpu(arg.ack_rssi);
24194b816f17SAbhishek Ambure 
24204b816f17SAbhishek Ambure 	wmi_process_mgmt_tx_comp(ar, &param);
2421dc405152SRakesh Pillai 
2422dc405152SRakesh Pillai 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv evnt mgmt tx completion\n");
2423dc405152SRakesh Pillai 
2424dc405152SRakesh Pillai 	return 0;
2425dc405152SRakesh Pillai }
2426dc405152SRakesh Pillai 
2427cc123facSRakesh Pillai int ath10k_wmi_event_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb)
2428cc123facSRakesh Pillai {
2429cc123facSRakesh Pillai 	struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg arg;
24304b816f17SAbhishek Ambure 	struct mgmt_tx_compl_params param;
2431cc123facSRakesh Pillai 	u32 num_reports;
2432cc123facSRakesh Pillai 	int i, ret;
2433cc123facSRakesh Pillai 
2434cc123facSRakesh Pillai 	ret = ath10k_wmi_pull_mgmt_tx_bundle_compl(ar, skb, &arg);
2435cc123facSRakesh Pillai 	if (ret) {
2436cc123facSRakesh Pillai 		ath10k_warn(ar, "failed to parse bundle mgmt compl event: %d\n", ret);
2437cc123facSRakesh Pillai 		return ret;
2438cc123facSRakesh Pillai 	}
2439cc123facSRakesh Pillai 
2440cc123facSRakesh Pillai 	num_reports = __le32_to_cpu(arg.num_reports);
2441cc123facSRakesh Pillai 
24424b816f17SAbhishek Ambure 	for (i = 0; i < num_reports; i++) {
24434b816f17SAbhishek Ambure 		memset(&param, 0, sizeof(struct mgmt_tx_compl_params));
24444b816f17SAbhishek Ambure 		param.desc_id = __le32_to_cpu(arg.desc_ids[i]);
24454b816f17SAbhishek Ambure 		param.status = __le32_to_cpu(arg.desc_ids[i]);
24464b816f17SAbhishek Ambure 
24474b816f17SAbhishek Ambure 		if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map))
24484b816f17SAbhishek Ambure 			param.ack_rssi = __le32_to_cpu(arg.ack_rssi[i]);
24494b816f17SAbhishek Ambure 		wmi_process_mgmt_tx_comp(ar, &param);
24504b816f17SAbhishek Ambure 	}
2451cc123facSRakesh Pillai 
2452cc123facSRakesh Pillai 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv event bundle mgmt tx completion\n");
2453cc123facSRakesh Pillai 
2454cc123facSRakesh Pillai 	return 0;
2455cc123facSRakesh Pillai }
2456cc123facSRakesh Pillai 
24570226d602SMichal Kazior int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
245832653cf1SMichal Kazior {
245932653cf1SMichal Kazior 	struct wmi_mgmt_rx_ev_arg arg = {};
246032653cf1SMichal Kazior 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
246132653cf1SMichal Kazior 	struct ieee80211_hdr *hdr;
246201cebe1cSMichal Kazior 	struct ieee80211_supported_band *sband;
246332653cf1SMichal Kazior 	u32 rx_status;
246432653cf1SMichal Kazior 	u32 channel;
246532653cf1SMichal Kazior 	u32 phy_mode;
246632653cf1SMichal Kazior 	u32 snr;
246732653cf1SMichal Kazior 	u32 rate;
246832653cf1SMichal Kazior 	u16 fc;
246932653cf1SMichal Kazior 	int ret;
247032653cf1SMichal Kazior 
2471d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg);
247232653cf1SMichal Kazior 	if (ret) {
247332653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret);
247408603f2eSRaja Mani 		dev_kfree_skb(skb);
247532653cf1SMichal Kazior 		return ret;
247632653cf1SMichal Kazior 	}
247732653cf1SMichal Kazior 
247832653cf1SMichal Kazior 	channel = __le32_to_cpu(arg.channel);
247932653cf1SMichal Kazior 	rx_status = __le32_to_cpu(arg.status);
248032653cf1SMichal Kazior 	snr = __le32_to_cpu(arg.snr);
248132653cf1SMichal Kazior 	phy_mode = __le32_to_cpu(arg.phy_mode);
248232653cf1SMichal Kazior 	rate = __le32_to_cpu(arg.rate);
24835e3dd157SKalle Valo 
24845e3dd157SKalle Valo 	memset(status, 0, sizeof(*status));
24855e3dd157SKalle Valo 
24867aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT,
24875e3dd157SKalle Valo 		   "event mgmt rx status %08x\n", rx_status);
24885e3dd157SKalle Valo 
24892c9bceceSManikanta Pubbisetty 	if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) ||
24902c9bceceSManikanta Pubbisetty 	    (rx_status & (WMI_RX_STATUS_ERR_DECRYPT |
24912c9bceceSManikanta Pubbisetty 	    WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) {
2492d67d0a02SMichal Kazior 		dev_kfree_skb(skb);
2493d67d0a02SMichal Kazior 		return 0;
2494d67d0a02SMichal Kazior 	}
2495d67d0a02SMichal Kazior 
24965e3dd157SKalle Valo 	if (rx_status & WMI_RX_STATUS_ERR_MIC)
24975e3dd157SKalle Valo 		status->flag |= RX_FLAG_MMIC_ERROR;
24985e3dd157SKalle Valo 
24998d130963SPeter Oh 	if (rx_status & WMI_RX_STATUS_EXT_INFO) {
25008d130963SPeter Oh 		status->mactime =
25018d130963SPeter Oh 			__le64_to_cpu(arg.ext_info.rx_mac_timestamp);
25028d130963SPeter Oh 		status->flag |= RX_FLAG_MACTIME_END;
25038d130963SPeter Oh 	}
250421040bf9SMichal Kazior 	/* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to
2505453cdb61SMichal Kazior 	 * MODE_11B. This means phy_mode is not a reliable source for the band
250621040bf9SMichal Kazior 	 * of mgmt rx.
250721040bf9SMichal Kazior 	 */
250821040bf9SMichal Kazior 	if (channel >= 1 && channel <= 14) {
250957fbcce3SJohannes Berg 		status->band = NL80211_BAND_2GHZ;
251038441fb6SBen Greear 	} else if (channel >= 36 && channel <= ATH10K_MAX_5G_CHAN) {
251157fbcce3SJohannes Berg 		status->band = NL80211_BAND_5GHZ;
2512453cdb61SMichal Kazior 	} else {
251321040bf9SMichal Kazior 		/* Shouldn't happen unless list of advertised channels to
251421040bf9SMichal Kazior 		 * mac80211 has been changed.
251521040bf9SMichal Kazior 		 */
251621040bf9SMichal Kazior 		WARN_ON_ONCE(1);
251721040bf9SMichal Kazior 		dev_kfree_skb(skb);
251821040bf9SMichal Kazior 		return 0;
2519453cdb61SMichal Kazior 	}
2520453cdb61SMichal Kazior 
252157fbcce3SJohannes Berg 	if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ)
252221040bf9SMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
252321040bf9SMichal Kazior 
252401cebe1cSMichal Kazior 	sband = &ar->mac.sbands[status->band];
252501cebe1cSMichal Kazior 
25265e3dd157SKalle Valo 	status->freq = ieee80211_channel_to_frequency(channel, status->band);
25275e3dd157SKalle Valo 	status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
252801cebe1cSMichal Kazior 	status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100);
25295e3dd157SKalle Valo 
25305e3dd157SKalle Valo 	hdr = (struct ieee80211_hdr *)skb->data;
25315e3dd157SKalle Valo 	fc = le16_to_cpu(hdr->frame_control);
25325e3dd157SKalle Valo 
253360549cabSGrzegorz Bajorski 	/* Firmware is guaranteed to report all essential management frames via
253460549cabSGrzegorz Bajorski 	 * WMI while it can deliver some extra via HTT. Since there can be
253560549cabSGrzegorz Bajorski 	 * duplicates split the reporting wrt monitor/sniffing.
253660549cabSGrzegorz Bajorski 	 */
253760549cabSGrzegorz Bajorski 	status->flag |= RX_FLAG_SKIP_MONITOR;
253860549cabSGrzegorz Bajorski 
2539504f6cdfSSujith Manoharan 	ath10k_wmi_handle_wep_reauth(ar, skb, status);
2540504f6cdfSSujith Manoharan 
25417d42298eSRajkumar Manoharan 	if (ath10k_wmi_rx_is_decrypted(ar, hdr)) {
2542eeab266cSMarek Kwaczynski 		status->flag |= RX_FLAG_DECRYPTED;
2543eeab266cSMarek Kwaczynski 
2544eeab266cSMarek Kwaczynski 		if (!ieee80211_is_action(hdr->frame_control) &&
2545eeab266cSMarek Kwaczynski 		    !ieee80211_is_deauth(hdr->frame_control) &&
2546eeab266cSMarek Kwaczynski 		    !ieee80211_is_disassoc(hdr->frame_control)) {
2547eeab266cSMarek Kwaczynski 			status->flag |= RX_FLAG_IV_STRIPPED |
25485e3dd157SKalle Valo 					RX_FLAG_MMIC_STRIPPED;
25495e3dd157SKalle Valo 			hdr->frame_control = __cpu_to_le16(fc &
25505e3dd157SKalle Valo 					~IEEE80211_FCTL_PROTECTED);
25515e3dd157SKalle Valo 		}
2552eeab266cSMarek Kwaczynski 	}
25535e3dd157SKalle Valo 
2554cc9904e6SMichal Kazior 	if (ieee80211_is_beacon(hdr->frame_control))
2555cc9904e6SMichal Kazior 		ath10k_mac_handle_beacon(ar, skb);
2556cc9904e6SMichal Kazior 
25577aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT,
255875b34800SMaharaja Kennadyrajan 		   "event mgmt rx skb %pK len %d ftype %02x stype %02x\n",
25595e3dd157SKalle Valo 		   skb, skb->len,
25605e3dd157SKalle Valo 		   fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE);
25615e3dd157SKalle Valo 
25627aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT,
25635e3dd157SKalle Valo 		   "event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
25645e3dd157SKalle Valo 		   status->freq, status->band, status->signal,
25655e3dd157SKalle Valo 		   status->rate_idx);
25665e3dd157SKalle Valo 
256737f62c0dSErik Stromdahl 	ieee80211_rx_ni(ar->hw, skb);
256837f62c0dSErik Stromdahl 
25695e3dd157SKalle Valo 	return 0;
25705e3dd157SKalle Valo }
25715e3dd157SKalle Valo 
25722e1dea40SMichal Kazior static int freq_to_idx(struct ath10k *ar, int freq)
25732e1dea40SMichal Kazior {
25742e1dea40SMichal Kazior 	struct ieee80211_supported_band *sband;
25752e1dea40SMichal Kazior 	int band, ch, idx = 0;
25762e1dea40SMichal Kazior 
257757fbcce3SJohannes Berg 	for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
25782e1dea40SMichal Kazior 		sband = ar->hw->wiphy->bands[band];
25792e1dea40SMichal Kazior 		if (!sband)
25802e1dea40SMichal Kazior 			continue;
25812e1dea40SMichal Kazior 
25822e1dea40SMichal Kazior 		for (ch = 0; ch < sband->n_channels; ch++, idx++)
25832e1dea40SMichal Kazior 			if (sband->channels[ch].center_freq == freq)
25842e1dea40SMichal Kazior 				goto exit;
25852e1dea40SMichal Kazior 	}
25862e1dea40SMichal Kazior 
25872e1dea40SMichal Kazior exit:
25882e1dea40SMichal Kazior 	return idx;
25892e1dea40SMichal Kazior }
25902e1dea40SMichal Kazior 
2591d7579d12SMichal Kazior static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb,
259232653cf1SMichal Kazior 					 struct wmi_ch_info_ev_arg *arg)
259332653cf1SMichal Kazior {
259432653cf1SMichal Kazior 	struct wmi_chan_info_event *ev = (void *)skb->data;
259532653cf1SMichal Kazior 
259632653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
259732653cf1SMichal Kazior 		return -EPROTO;
259832653cf1SMichal Kazior 
259932653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
260032653cf1SMichal Kazior 	arg->err_code = ev->err_code;
260132653cf1SMichal Kazior 	arg->freq = ev->freq;
260232653cf1SMichal Kazior 	arg->cmd_flags = ev->cmd_flags;
260332653cf1SMichal Kazior 	arg->noise_floor = ev->noise_floor;
260432653cf1SMichal Kazior 	arg->rx_clear_count = ev->rx_clear_count;
260532653cf1SMichal Kazior 	arg->cycle_count = ev->cycle_count;
260632653cf1SMichal Kazior 
260732653cf1SMichal Kazior 	return 0;
260832653cf1SMichal Kazior }
260932653cf1SMichal Kazior 
2610b2297baaSRaja Mani static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar,
2611b2297baaSRaja Mani 					      struct sk_buff *skb,
2612b2297baaSRaja Mani 					      struct wmi_ch_info_ev_arg *arg)
2613b2297baaSRaja Mani {
2614b2297baaSRaja Mani 	struct wmi_10_4_chan_info_event *ev = (void *)skb->data;
2615b2297baaSRaja Mani 
2616b2297baaSRaja Mani 	if (skb->len < sizeof(*ev))
2617b2297baaSRaja Mani 		return -EPROTO;
2618b2297baaSRaja Mani 
2619b2297baaSRaja Mani 	skb_pull(skb, sizeof(*ev));
2620b2297baaSRaja Mani 	arg->err_code = ev->err_code;
2621b2297baaSRaja Mani 	arg->freq = ev->freq;
2622b2297baaSRaja Mani 	arg->cmd_flags = ev->cmd_flags;
2623b2297baaSRaja Mani 	arg->noise_floor = ev->noise_floor;
2624b2297baaSRaja Mani 	arg->rx_clear_count = ev->rx_clear_count;
2625b2297baaSRaja Mani 	arg->cycle_count = ev->cycle_count;
2626b2297baaSRaja Mani 	arg->chan_tx_pwr_range = ev->chan_tx_pwr_range;
2627b2297baaSRaja Mani 	arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp;
2628b2297baaSRaja Mani 	arg->rx_frame_count = ev->rx_frame_count;
2629b2297baaSRaja Mani 
2630b2297baaSRaja Mani 	return 0;
2631b2297baaSRaja Mani }
2632b2297baaSRaja Mani 
263313104929SRakesh Pillai /*
263413104929SRakesh Pillai  * Handle the channel info event for firmware which only sends one
263513104929SRakesh Pillai  * chan_info event per scanned channel.
263613104929SRakesh Pillai  */
263713104929SRakesh Pillai static void ath10k_wmi_event_chan_info_unpaired(struct ath10k *ar,
263813104929SRakesh Pillai 						struct chan_info_params *params)
263913104929SRakesh Pillai {
264013104929SRakesh Pillai 	struct survey_info *survey;
264113104929SRakesh Pillai 	int idx;
264213104929SRakesh Pillai 
264313104929SRakesh Pillai 	if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
264413104929SRakesh Pillai 		ath10k_dbg(ar, ATH10K_DBG_WMI, "chan info report completed\n");
264513104929SRakesh Pillai 		return;
264613104929SRakesh Pillai 	}
264713104929SRakesh Pillai 
264813104929SRakesh Pillai 	idx = freq_to_idx(ar, params->freq);
264913104929SRakesh Pillai 	if (idx >= ARRAY_SIZE(ar->survey)) {
265013104929SRakesh Pillai 		ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
265113104929SRakesh Pillai 			    params->freq, idx);
265213104929SRakesh Pillai 		return;
265313104929SRakesh Pillai 	}
265413104929SRakesh Pillai 
265513104929SRakesh Pillai 	survey = &ar->survey[idx];
265613104929SRakesh Pillai 
265727120f2aSDan Carpenter 	if (!params->mac_clk_mhz)
265813104929SRakesh Pillai 		return;
265913104929SRakesh Pillai 
266013104929SRakesh Pillai 	memset(survey, 0, sizeof(*survey));
266113104929SRakesh Pillai 
266213104929SRakesh Pillai 	survey->noise = params->noise_floor;
266313104929SRakesh Pillai 	survey->time = (params->cycle_count / params->mac_clk_mhz) / 1000;
266413104929SRakesh Pillai 	survey->time_busy = (params->rx_clear_count / params->mac_clk_mhz) / 1000;
266513104929SRakesh Pillai 	survey->filled |= SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME |
266613104929SRakesh Pillai 			  SURVEY_INFO_TIME_BUSY;
266713104929SRakesh Pillai }
266813104929SRakesh Pillai 
266913104929SRakesh Pillai /*
267013104929SRakesh Pillai  * Handle the channel info event for firmware which sends chan_info
267113104929SRakesh Pillai  * event in pairs(start and stop events) for every scanned channel.
267213104929SRakesh Pillai  */
267313104929SRakesh Pillai static void ath10k_wmi_event_chan_info_paired(struct ath10k *ar,
267413104929SRakesh Pillai 					      struct chan_info_params *params)
267513104929SRakesh Pillai {
267613104929SRakesh Pillai 	struct survey_info *survey;
267713104929SRakesh Pillai 	int idx;
267813104929SRakesh Pillai 
267913104929SRakesh Pillai 	idx = freq_to_idx(ar, params->freq);
268013104929SRakesh Pillai 	if (idx >= ARRAY_SIZE(ar->survey)) {
268113104929SRakesh Pillai 		ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
268213104929SRakesh Pillai 			    params->freq, idx);
268313104929SRakesh Pillai 		return;
268413104929SRakesh Pillai 	}
268513104929SRakesh Pillai 
268613104929SRakesh Pillai 	if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
268713104929SRakesh Pillai 		if (ar->ch_info_can_report_survey) {
268813104929SRakesh Pillai 			survey = &ar->survey[idx];
268913104929SRakesh Pillai 			survey->noise = params->noise_floor;
269013104929SRakesh Pillai 			survey->filled = SURVEY_INFO_NOISE_DBM;
269113104929SRakesh Pillai 
269213104929SRakesh Pillai 			ath10k_hw_fill_survey_time(ar,
269313104929SRakesh Pillai 						   survey,
269413104929SRakesh Pillai 						   params->cycle_count,
269513104929SRakesh Pillai 						   params->rx_clear_count,
269613104929SRakesh Pillai 						   ar->survey_last_cycle_count,
269713104929SRakesh Pillai 						   ar->survey_last_rx_clear_count);
269813104929SRakesh Pillai 		}
269913104929SRakesh Pillai 
270013104929SRakesh Pillai 		ar->ch_info_can_report_survey = false;
270113104929SRakesh Pillai 	} else {
270213104929SRakesh Pillai 		ar->ch_info_can_report_survey = true;
270313104929SRakesh Pillai 	}
270413104929SRakesh Pillai 
270513104929SRakesh Pillai 	if (!(params->cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) {
270613104929SRakesh Pillai 		ar->survey_last_rx_clear_count = params->rx_clear_count;
270713104929SRakesh Pillai 		ar->survey_last_cycle_count = params->cycle_count;
270813104929SRakesh Pillai 	}
270913104929SRakesh Pillai }
271013104929SRakesh Pillai 
27110226d602SMichal Kazior void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
27125e3dd157SKalle Valo {
271313104929SRakesh Pillai 	struct chan_info_params ch_info_param;
271432653cf1SMichal Kazior 	struct wmi_ch_info_ev_arg arg = {};
271513104929SRakesh Pillai 	int ret;
27162e1dea40SMichal Kazior 
2717d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_ch_info(ar, skb, &arg);
271832653cf1SMichal Kazior 	if (ret) {
271932653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse chan info event: %d\n", ret);
272032653cf1SMichal Kazior 		return;
272132653cf1SMichal Kazior 	}
27222e1dea40SMichal Kazior 
272313104929SRakesh Pillai 	ch_info_param.err_code = __le32_to_cpu(arg.err_code);
272413104929SRakesh Pillai 	ch_info_param.freq = __le32_to_cpu(arg.freq);
272513104929SRakesh Pillai 	ch_info_param.cmd_flags = __le32_to_cpu(arg.cmd_flags);
272613104929SRakesh Pillai 	ch_info_param.noise_floor = __le32_to_cpu(arg.noise_floor);
272713104929SRakesh Pillai 	ch_info_param.rx_clear_count = __le32_to_cpu(arg.rx_clear_count);
272813104929SRakesh Pillai 	ch_info_param.cycle_count = __le32_to_cpu(arg.cycle_count);
272913104929SRakesh Pillai 	ch_info_param.mac_clk_mhz = __le32_to_cpu(arg.mac_clk_mhz);
27302e1dea40SMichal Kazior 
27317aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
27322e1dea40SMichal Kazior 		   "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
273313104929SRakesh Pillai 		   ch_info_param.err_code, ch_info_param.freq, ch_info_param.cmd_flags,
273413104929SRakesh Pillai 		   ch_info_param.noise_floor, ch_info_param.rx_clear_count,
273513104929SRakesh Pillai 		   ch_info_param.cycle_count);
27362e1dea40SMichal Kazior 
27372e1dea40SMichal Kazior 	spin_lock_bh(&ar->data_lock);
27382e1dea40SMichal Kazior 
27395c81c7fdSMichal Kazior 	switch (ar->scan.state) {
27405c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
27415c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
27427aa7a72aSMichal Kazior 		ath10k_warn(ar, "received chan info event without a scan request, ignoring\n");
27432e1dea40SMichal Kazior 		goto exit;
27445c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
27455c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
27465c81c7fdSMichal Kazior 		break;
27472e1dea40SMichal Kazior 	}
27482e1dea40SMichal Kazior 
274913104929SRakesh Pillai 	if (test_bit(ATH10K_FW_FEATURE_SINGLE_CHAN_INFO_PER_CHANNEL,
275013104929SRakesh Pillai 		     ar->running_fw->fw_file.fw_features))
275113104929SRakesh Pillai 		ath10k_wmi_event_chan_info_unpaired(ar, &ch_info_param);
275213104929SRakesh Pillai 	else
275313104929SRakesh Pillai 		ath10k_wmi_event_chan_info_paired(ar, &ch_info_param);
27542e1dea40SMichal Kazior 
27552e1dea40SMichal Kazior exit:
27562e1dea40SMichal Kazior 	spin_unlock_bh(&ar->data_lock);
27575e3dd157SKalle Valo }
27585e3dd157SKalle Valo 
27590226d602SMichal Kazior void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
27605e3dd157SKalle Valo {
276184d4911bSMichal Kazior 	struct wmi_echo_ev_arg arg = {};
276284d4911bSMichal Kazior 	int ret;
276384d4911bSMichal Kazior 
276484d4911bSMichal Kazior 	ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg);
276584d4911bSMichal Kazior 	if (ret) {
276684d4911bSMichal Kazior 		ath10k_warn(ar, "failed to parse echo: %d\n", ret);
276784d4911bSMichal Kazior 		return;
276884d4911bSMichal Kazior 	}
276984d4911bSMichal Kazior 
277084d4911bSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
277184d4911bSMichal Kazior 		   "wmi event echo value 0x%08x\n",
277284d4911bSMichal Kazior 		   le32_to_cpu(arg.value));
277320ddca21SMichal Kazior 
277420ddca21SMichal Kazior 	if (le32_to_cpu(arg.value) == ATH10K_WMI_BARRIER_ECHO_ID)
277520ddca21SMichal Kazior 		complete(&ar->wmi.barrier);
27765e3dd157SKalle Valo }
27775e3dd157SKalle Valo 
27780226d602SMichal Kazior int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
27795e3dd157SKalle Valo {
27807aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
2781869526b9SKalle Valo 		   skb->len);
2782869526b9SKalle Valo 
2783d35a6c18SMichal Kazior 	trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);
2784869526b9SKalle Valo 
2785869526b9SKalle Valo 	return 0;
27865e3dd157SKalle Valo }
27875e3dd157SKalle Valo 
2788b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src,
27895326849aSMichal Kazior 				     struct ath10k_fw_stats_pdev *dst)
2790d15fb520SMichal Kazior {
2791d15fb520SMichal Kazior 	dst->ch_noise_floor = __le32_to_cpu(src->chan_nf);
2792d15fb520SMichal Kazior 	dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count);
2793d15fb520SMichal Kazior 	dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count);
2794d15fb520SMichal Kazior 	dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count);
2795d15fb520SMichal Kazior 	dst->cycle_count = __le32_to_cpu(src->cycle_count);
2796d15fb520SMichal Kazior 	dst->phy_err_count = __le32_to_cpu(src->phy_err_count);
2797d15fb520SMichal Kazior 	dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr);
2798b91251fbSMichal Kazior }
2799d15fb520SMichal Kazior 
2800b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src,
2801b91251fbSMichal Kazior 				   struct ath10k_fw_stats_pdev *dst)
2802b91251fbSMichal Kazior {
2803b91251fbSMichal Kazior 	dst->comp_queued = __le32_to_cpu(src->comp_queued);
2804b91251fbSMichal Kazior 	dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
2805b91251fbSMichal Kazior 	dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
2806b91251fbSMichal Kazior 	dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
2807b91251fbSMichal Kazior 	dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
2808b91251fbSMichal Kazior 	dst->local_enqued = __le32_to_cpu(src->local_enqued);
2809b91251fbSMichal Kazior 	dst->local_freed = __le32_to_cpu(src->local_freed);
2810b91251fbSMichal Kazior 	dst->hw_queued = __le32_to_cpu(src->hw_queued);
2811b91251fbSMichal Kazior 	dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
2812b91251fbSMichal Kazior 	dst->underrun = __le32_to_cpu(src->underrun);
2813b91251fbSMichal Kazior 	dst->tx_abort = __le32_to_cpu(src->tx_abort);
2814b91251fbSMichal Kazior 	dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
2815b91251fbSMichal Kazior 	dst->tx_ko = __le32_to_cpu(src->tx_ko);
2816b91251fbSMichal Kazior 	dst->data_rc = __le32_to_cpu(src->data_rc);
2817b91251fbSMichal Kazior 	dst->self_triggers = __le32_to_cpu(src->self_triggers);
2818b91251fbSMichal Kazior 	dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
2819b91251fbSMichal Kazior 	dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
2820b91251fbSMichal Kazior 	dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
2821b91251fbSMichal Kazior 	dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
2822b91251fbSMichal Kazior 	dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
2823b91251fbSMichal Kazior 	dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
2824b91251fbSMichal Kazior 	dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
2825b91251fbSMichal Kazior }
2826d15fb520SMichal Kazior 
282798dd2b92SManikanta Pubbisetty static void
282898dd2b92SManikanta Pubbisetty ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src,
282998dd2b92SManikanta Pubbisetty 				   struct ath10k_fw_stats_pdev *dst)
283098dd2b92SManikanta Pubbisetty {
283198dd2b92SManikanta Pubbisetty 	dst->comp_queued = __le32_to_cpu(src->comp_queued);
283298dd2b92SManikanta Pubbisetty 	dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
283398dd2b92SManikanta Pubbisetty 	dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
283498dd2b92SManikanta Pubbisetty 	dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
283598dd2b92SManikanta Pubbisetty 	dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
283698dd2b92SManikanta Pubbisetty 	dst->local_enqued = __le32_to_cpu(src->local_enqued);
283798dd2b92SManikanta Pubbisetty 	dst->local_freed = __le32_to_cpu(src->local_freed);
283898dd2b92SManikanta Pubbisetty 	dst->hw_queued = __le32_to_cpu(src->hw_queued);
283998dd2b92SManikanta Pubbisetty 	dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
284098dd2b92SManikanta Pubbisetty 	dst->underrun = __le32_to_cpu(src->underrun);
284198dd2b92SManikanta Pubbisetty 	dst->tx_abort = __le32_to_cpu(src->tx_abort);
284298dd2b92SManikanta Pubbisetty 	dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
284398dd2b92SManikanta Pubbisetty 	dst->tx_ko = __le32_to_cpu(src->tx_ko);
284498dd2b92SManikanta Pubbisetty 	dst->data_rc = __le32_to_cpu(src->data_rc);
284598dd2b92SManikanta Pubbisetty 	dst->self_triggers = __le32_to_cpu(src->self_triggers);
284698dd2b92SManikanta Pubbisetty 	dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
284798dd2b92SManikanta Pubbisetty 	dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
284898dd2b92SManikanta Pubbisetty 	dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
284998dd2b92SManikanta Pubbisetty 	dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
285098dd2b92SManikanta Pubbisetty 	dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
285198dd2b92SManikanta Pubbisetty 	dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
285298dd2b92SManikanta Pubbisetty 	dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
285398dd2b92SManikanta Pubbisetty 	dst->hw_paused = __le32_to_cpu(src->hw_paused);
285498dd2b92SManikanta Pubbisetty 	dst->seq_posted = __le32_to_cpu(src->seq_posted);
285598dd2b92SManikanta Pubbisetty 	dst->seq_failed_queueing =
285698dd2b92SManikanta Pubbisetty 		__le32_to_cpu(src->seq_failed_queueing);
285798dd2b92SManikanta Pubbisetty 	dst->seq_completed = __le32_to_cpu(src->seq_completed);
285898dd2b92SManikanta Pubbisetty 	dst->seq_restarted = __le32_to_cpu(src->seq_restarted);
285998dd2b92SManikanta Pubbisetty 	dst->mu_seq_posted = __le32_to_cpu(src->mu_seq_posted);
286098dd2b92SManikanta Pubbisetty 	dst->mpdus_sw_flush = __le32_to_cpu(src->mpdus_sw_flush);
286198dd2b92SManikanta Pubbisetty 	dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
286298dd2b92SManikanta Pubbisetty 	dst->mpdus_truncated = __le32_to_cpu(src->mpdus_truncated);
286398dd2b92SManikanta Pubbisetty 	dst->mpdus_ack_failed = __le32_to_cpu(src->mpdus_ack_failed);
286498dd2b92SManikanta Pubbisetty 	dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
286598dd2b92SManikanta Pubbisetty 	dst->mpdus_expired = __le32_to_cpu(src->mpdus_expired);
286698dd2b92SManikanta Pubbisetty }
286798dd2b92SManikanta Pubbisetty 
2868b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src,
2869b91251fbSMichal Kazior 				   struct ath10k_fw_stats_pdev *dst)
2870b91251fbSMichal Kazior {
2871b91251fbSMichal Kazior 	dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change);
2872b91251fbSMichal Kazior 	dst->status_rcvd = __le32_to_cpu(src->status_rcvd);
2873b91251fbSMichal Kazior 	dst->r0_frags = __le32_to_cpu(src->r0_frags);
2874b91251fbSMichal Kazior 	dst->r1_frags = __le32_to_cpu(src->r1_frags);
2875b91251fbSMichal Kazior 	dst->r2_frags = __le32_to_cpu(src->r2_frags);
2876b91251fbSMichal Kazior 	dst->r3_frags = __le32_to_cpu(src->r3_frags);
2877b91251fbSMichal Kazior 	dst->htt_msdus = __le32_to_cpu(src->htt_msdus);
2878b91251fbSMichal Kazior 	dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus);
2879b91251fbSMichal Kazior 	dst->loc_msdus = __le32_to_cpu(src->loc_msdus);
2880b91251fbSMichal Kazior 	dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus);
2881b91251fbSMichal Kazior 	dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu);
2882b91251fbSMichal Kazior 	dst->phy_errs = __le32_to_cpu(src->phy_errs);
2883b91251fbSMichal Kazior 	dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop);
2884b91251fbSMichal Kazior 	dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs);
2885b91251fbSMichal Kazior }
2886b91251fbSMichal Kazior 
2887b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src,
2888b91251fbSMichal Kazior 				      struct ath10k_fw_stats_pdev *dst)
2889b91251fbSMichal Kazior {
2890b91251fbSMichal Kazior 	dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad);
2891b91251fbSMichal Kazior 	dst->rts_bad = __le32_to_cpu(src->rts_bad);
2892b91251fbSMichal Kazior 	dst->rts_good = __le32_to_cpu(src->rts_good);
2893b91251fbSMichal Kazior 	dst->fcs_bad = __le32_to_cpu(src->fcs_bad);
2894b91251fbSMichal Kazior 	dst->no_beacons = __le32_to_cpu(src->no_beacons);
2895b91251fbSMichal Kazior 	dst->mib_int_count = __le32_to_cpu(src->mib_int_count);
2896d15fb520SMichal Kazior }
2897d15fb520SMichal Kazior 
28980226d602SMichal Kazior void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src,
289960ef401aSMichal Kazior 				struct ath10k_fw_stats_peer *dst)
2900d15fb520SMichal Kazior {
2901d15fb520SMichal Kazior 	ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2902d15fb520SMichal Kazior 	dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2903d15fb520SMichal Kazior 	dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2904d15fb520SMichal Kazior }
2905d15fb520SMichal Kazior 
2906f9575793SMohammed Shafi Shajakhan static void
2907f9575793SMohammed Shafi Shajakhan ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats *src,
2908f9575793SMohammed Shafi Shajakhan 				struct ath10k_fw_stats_peer *dst)
2909f9575793SMohammed Shafi Shajakhan {
2910f9575793SMohammed Shafi Shajakhan 	ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2911f9575793SMohammed Shafi Shajakhan 	dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2912f9575793SMohammed Shafi Shajakhan 	dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2913f9575793SMohammed Shafi Shajakhan 	dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2914f9575793SMohammed Shafi Shajakhan }
2915f9575793SMohammed Shafi Shajakhan 
29161b3fdb50SRajkumar Manoharan static void
29171b3fdb50SRajkumar Manoharan ath10k_wmi_10_4_pull_vdev_stats(const struct wmi_vdev_stats_extd *src,
29181b3fdb50SRajkumar Manoharan 				struct ath10k_fw_stats_vdev_extd *dst)
29191b3fdb50SRajkumar Manoharan {
29201b3fdb50SRajkumar Manoharan 	dst->vdev_id = __le32_to_cpu(src->vdev_id);
29211b3fdb50SRajkumar Manoharan 	dst->ppdu_aggr_cnt = __le32_to_cpu(src->ppdu_aggr_cnt);
29221b3fdb50SRajkumar Manoharan 	dst->ppdu_noack = __le32_to_cpu(src->ppdu_noack);
29231b3fdb50SRajkumar Manoharan 	dst->mpdu_queued = __le32_to_cpu(src->mpdu_queued);
29241b3fdb50SRajkumar Manoharan 	dst->ppdu_nonaggr_cnt = __le32_to_cpu(src->ppdu_nonaggr_cnt);
29251b3fdb50SRajkumar Manoharan 	dst->mpdu_sw_requeued = __le32_to_cpu(src->mpdu_sw_requeued);
29261b3fdb50SRajkumar Manoharan 	dst->mpdu_suc_retry = __le32_to_cpu(src->mpdu_suc_retry);
29271b3fdb50SRajkumar Manoharan 	dst->mpdu_suc_multitry = __le32_to_cpu(src->mpdu_suc_multitry);
29281b3fdb50SRajkumar Manoharan 	dst->mpdu_fail_retry = __le32_to_cpu(src->mpdu_fail_retry);
29291b3fdb50SRajkumar Manoharan 	dst->tx_ftm_suc = __le32_to_cpu(src->tx_ftm_suc);
29301b3fdb50SRajkumar Manoharan 	dst->tx_ftm_suc_retry = __le32_to_cpu(src->tx_ftm_suc_retry);
29311b3fdb50SRajkumar Manoharan 	dst->tx_ftm_fail = __le32_to_cpu(src->tx_ftm_fail);
29321b3fdb50SRajkumar Manoharan 	dst->rx_ftmr_cnt = __le32_to_cpu(src->rx_ftmr_cnt);
29331b3fdb50SRajkumar Manoharan 	dst->rx_ftmr_dup_cnt = __le32_to_cpu(src->rx_ftmr_dup_cnt);
29341b3fdb50SRajkumar Manoharan 	dst->rx_iftmr_cnt = __le32_to_cpu(src->rx_iftmr_cnt);
29351b3fdb50SRajkumar Manoharan 	dst->rx_iftmr_dup_cnt = __le32_to_cpu(src->rx_iftmr_dup_cnt);
29361b3fdb50SRajkumar Manoharan }
29371b3fdb50SRajkumar Manoharan 
2938d7579d12SMichal Kazior static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar,
2939d15fb520SMichal Kazior 					    struct sk_buff *skb,
294060ef401aSMichal Kazior 					    struct ath10k_fw_stats *stats)
2941d15fb520SMichal Kazior {
2942d15fb520SMichal Kazior 	const struct wmi_stats_event *ev = (void *)skb->data;
29433e2740cdSKenneth Lu 	u32 num_pdev_stats, num_peer_stats;
2944d15fb520SMichal Kazior 	int i;
2945d15fb520SMichal Kazior 
2946d15fb520SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
2947d15fb520SMichal Kazior 		return -EPROTO;
2948d15fb520SMichal Kazior 
2949d15fb520SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2950d15fb520SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2951d15fb520SMichal Kazior 
29525326849aSMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
2953d15fb520SMichal Kazior 		const struct wmi_pdev_stats *src;
29545326849aSMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
2955d15fb520SMichal Kazior 
2956d15fb520SMichal Kazior 		src = (void *)skb->data;
2957d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
2958d15fb520SMichal Kazior 			return -EPROTO;
2959d15fb520SMichal Kazior 
29605326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
29615326849aSMichal Kazior 		if (!dst)
29625326849aSMichal Kazior 			continue;
29635326849aSMichal Kazior 
2964b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2965b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2966b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2967b91251fbSMichal Kazior 
29685326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
2969d15fb520SMichal Kazior 	}
2970d15fb520SMichal Kazior 
2971d15fb520SMichal Kazior 	/* fw doesn't implement vdev stats */
2972d15fb520SMichal Kazior 
2973d15fb520SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
2974d15fb520SMichal Kazior 		const struct wmi_peer_stats *src;
29755326849aSMichal Kazior 		struct ath10k_fw_stats_peer *dst;
2976d15fb520SMichal Kazior 
2977d15fb520SMichal Kazior 		src = (void *)skb->data;
2978d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
2979d15fb520SMichal Kazior 			return -EPROTO;
2980d15fb520SMichal Kazior 
29815326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
29825326849aSMichal Kazior 		if (!dst)
29835326849aSMichal Kazior 			continue;
29845326849aSMichal Kazior 
29855326849aSMichal Kazior 		ath10k_wmi_pull_peer_stats(src, dst);
29865326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
2987d15fb520SMichal Kazior 	}
2988d15fb520SMichal Kazior 
2989d15fb520SMichal Kazior 	return 0;
2990d15fb520SMichal Kazior }
2991d15fb520SMichal Kazior 
2992d7579d12SMichal Kazior static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar,
2993d15fb520SMichal Kazior 					   struct sk_buff *skb,
299460ef401aSMichal Kazior 					   struct ath10k_fw_stats *stats)
2995d15fb520SMichal Kazior {
2996d15fb520SMichal Kazior 	const struct wmi_stats_event *ev = (void *)skb->data;
29973e2740cdSKenneth Lu 	u32 num_pdev_stats, num_peer_stats;
2998d15fb520SMichal Kazior 	int i;
2999d15fb520SMichal Kazior 
3000d15fb520SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
3001d15fb520SMichal Kazior 		return -EPROTO;
3002d15fb520SMichal Kazior 
3003d15fb520SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
3004d15fb520SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
3005d15fb520SMichal Kazior 
30065326849aSMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
3007d15fb520SMichal Kazior 		const struct wmi_10x_pdev_stats *src;
30085326849aSMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
3009d15fb520SMichal Kazior 
3010d15fb520SMichal Kazior 		src = (void *)skb->data;
3011d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
3012d15fb520SMichal Kazior 			return -EPROTO;
3013d15fb520SMichal Kazior 
30145326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
30155326849aSMichal Kazior 		if (!dst)
30165326849aSMichal Kazior 			continue;
3017d15fb520SMichal Kazior 
3018b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
3019b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
3020b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
3021b91251fbSMichal Kazior 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
30225326849aSMichal Kazior 
30235326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
3024d15fb520SMichal Kazior 	}
3025d15fb520SMichal Kazior 
3026d15fb520SMichal Kazior 	/* fw doesn't implement vdev stats */
3027d15fb520SMichal Kazior 
3028d15fb520SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
3029d15fb520SMichal Kazior 		const struct wmi_10x_peer_stats *src;
30305326849aSMichal Kazior 		struct ath10k_fw_stats_peer *dst;
3031d15fb520SMichal Kazior 
3032d15fb520SMichal Kazior 		src = (void *)skb->data;
3033d15fb520SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
3034d15fb520SMichal Kazior 			return -EPROTO;
3035d15fb520SMichal Kazior 
30365326849aSMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
30375326849aSMichal Kazior 		if (!dst)
30385326849aSMichal Kazior 			continue;
3039d15fb520SMichal Kazior 
30405326849aSMichal Kazior 		ath10k_wmi_pull_peer_stats(&src->old, dst);
30415326849aSMichal Kazior 
30425326849aSMichal Kazior 		dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
30435326849aSMichal Kazior 
30445326849aSMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
3045d15fb520SMichal Kazior 	}
3046d15fb520SMichal Kazior 
3047d15fb520SMichal Kazior 	return 0;
3048d15fb520SMichal Kazior }
3049d15fb520SMichal Kazior 
305020de2229SMichal Kazior static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar,
305120de2229SMichal Kazior 					    struct sk_buff *skb,
305220de2229SMichal Kazior 					    struct ath10k_fw_stats *stats)
305320de2229SMichal Kazior {
305420de2229SMichal Kazior 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
305520de2229SMichal Kazior 	u32 num_pdev_stats;
305620de2229SMichal Kazior 	u32 num_pdev_ext_stats;
305720de2229SMichal Kazior 	u32 num_peer_stats;
305820de2229SMichal Kazior 	int i;
305920de2229SMichal Kazior 
306020de2229SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
306120de2229SMichal Kazior 		return -EPROTO;
306220de2229SMichal Kazior 
306320de2229SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
306420de2229SMichal Kazior 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
306520de2229SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
306620de2229SMichal Kazior 
306720de2229SMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
306820de2229SMichal Kazior 		const struct wmi_10_2_pdev_stats *src;
306920de2229SMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
307020de2229SMichal Kazior 
307120de2229SMichal Kazior 		src = (void *)skb->data;
307220de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
307320de2229SMichal Kazior 			return -EPROTO;
307420de2229SMichal Kazior 
307520de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
307620de2229SMichal Kazior 		if (!dst)
307720de2229SMichal Kazior 			continue;
307820de2229SMichal Kazior 
307920de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
308020de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
308120de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
308220de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
308320de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
308420de2229SMichal Kazior 
308520de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
308620de2229SMichal Kazior 	}
308720de2229SMichal Kazior 
308820de2229SMichal Kazior 	for (i = 0; i < num_pdev_ext_stats; i++) {
308920de2229SMichal Kazior 		const struct wmi_10_2_pdev_ext_stats *src;
309020de2229SMichal Kazior 
309120de2229SMichal Kazior 		src = (void *)skb->data;
309220de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
309320de2229SMichal Kazior 			return -EPROTO;
309420de2229SMichal Kazior 
309520de2229SMichal Kazior 		/* FIXME: expose values to userspace
309620de2229SMichal Kazior 		 *
309720de2229SMichal Kazior 		 * Note: Even though this loop seems to do nothing it is
309820de2229SMichal Kazior 		 * required to parse following sub-structures properly.
309920de2229SMichal Kazior 		 */
310020de2229SMichal Kazior 	}
310120de2229SMichal Kazior 
310220de2229SMichal Kazior 	/* fw doesn't implement vdev stats */
310320de2229SMichal Kazior 
310420de2229SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
310520de2229SMichal Kazior 		const struct wmi_10_2_peer_stats *src;
310620de2229SMichal Kazior 		struct ath10k_fw_stats_peer *dst;
310720de2229SMichal Kazior 
310820de2229SMichal Kazior 		src = (void *)skb->data;
310920de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
311020de2229SMichal Kazior 			return -EPROTO;
311120de2229SMichal Kazior 
311220de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
311320de2229SMichal Kazior 		if (!dst)
311420de2229SMichal Kazior 			continue;
311520de2229SMichal Kazior 
311620de2229SMichal Kazior 		ath10k_wmi_pull_peer_stats(&src->old, dst);
311720de2229SMichal Kazior 
311820de2229SMichal Kazior 		dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
311920de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
312020de2229SMichal Kazior 
312120de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
312220de2229SMichal Kazior 	}
312320de2229SMichal Kazior 
312420de2229SMichal Kazior 	return 0;
312520de2229SMichal Kazior }
312620de2229SMichal Kazior 
312720de2229SMichal Kazior static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar,
312820de2229SMichal Kazior 					      struct sk_buff *skb,
312920de2229SMichal Kazior 					      struct ath10k_fw_stats *stats)
313020de2229SMichal Kazior {
313120de2229SMichal Kazior 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
313220de2229SMichal Kazior 	u32 num_pdev_stats;
313320de2229SMichal Kazior 	u32 num_pdev_ext_stats;
313420de2229SMichal Kazior 	u32 num_peer_stats;
313520de2229SMichal Kazior 	int i;
313620de2229SMichal Kazior 
313720de2229SMichal Kazior 	if (!skb_pull(skb, sizeof(*ev)))
313820de2229SMichal Kazior 		return -EPROTO;
313920de2229SMichal Kazior 
314020de2229SMichal Kazior 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
314120de2229SMichal Kazior 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
314220de2229SMichal Kazior 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
314320de2229SMichal Kazior 
314420de2229SMichal Kazior 	for (i = 0; i < num_pdev_stats; i++) {
314520de2229SMichal Kazior 		const struct wmi_10_2_pdev_stats *src;
314620de2229SMichal Kazior 		struct ath10k_fw_stats_pdev *dst;
314720de2229SMichal Kazior 
314820de2229SMichal Kazior 		src = (void *)skb->data;
314920de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
315020de2229SMichal Kazior 			return -EPROTO;
315120de2229SMichal Kazior 
315220de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
315320de2229SMichal Kazior 		if (!dst)
315420de2229SMichal Kazior 			continue;
315520de2229SMichal Kazior 
315620de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
315720de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
315820de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
315920de2229SMichal Kazior 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
316020de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
316120de2229SMichal Kazior 
316220de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->pdevs);
316320de2229SMichal Kazior 	}
316420de2229SMichal Kazior 
316520de2229SMichal Kazior 	for (i = 0; i < num_pdev_ext_stats; i++) {
316620de2229SMichal Kazior 		const struct wmi_10_2_pdev_ext_stats *src;
316720de2229SMichal Kazior 
316820de2229SMichal Kazior 		src = (void *)skb->data;
316920de2229SMichal Kazior 		if (!skb_pull(skb, sizeof(*src)))
317020de2229SMichal Kazior 			return -EPROTO;
317120de2229SMichal Kazior 
317220de2229SMichal Kazior 		/* FIXME: expose values to userspace
317320de2229SMichal Kazior 		 *
317420de2229SMichal Kazior 		 * Note: Even though this loop seems to do nothing it is
317520de2229SMichal Kazior 		 * required to parse following sub-structures properly.
317620de2229SMichal Kazior 		 */
317720de2229SMichal Kazior 	}
317820de2229SMichal Kazior 
317920de2229SMichal Kazior 	/* fw doesn't implement vdev stats */
318020de2229SMichal Kazior 
318120de2229SMichal Kazior 	for (i = 0; i < num_peer_stats; i++) {
3182de46c015SMohammed Shafi Shajakhan 		const struct wmi_10_2_4_ext_peer_stats *src;
318320de2229SMichal Kazior 		struct ath10k_fw_stats_peer *dst;
3184de46c015SMohammed Shafi Shajakhan 		int stats_len;
3185de46c015SMohammed Shafi Shajakhan 
3186cc61a1bbSMohammed Shafi Shajakhan 		if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
3187de46c015SMohammed Shafi Shajakhan 			stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats);
3188de46c015SMohammed Shafi Shajakhan 		else
3189de46c015SMohammed Shafi Shajakhan 			stats_len = sizeof(struct wmi_10_2_4_peer_stats);
319020de2229SMichal Kazior 
319120de2229SMichal Kazior 		src = (void *)skb->data;
3192de46c015SMohammed Shafi Shajakhan 		if (!skb_pull(skb, stats_len))
319320de2229SMichal Kazior 			return -EPROTO;
319420de2229SMichal Kazior 
319520de2229SMichal Kazior 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
319620de2229SMichal Kazior 		if (!dst)
319720de2229SMichal Kazior 			continue;
319820de2229SMichal Kazior 
319920de2229SMichal Kazior 		ath10k_wmi_pull_peer_stats(&src->common.old, dst);
320020de2229SMichal Kazior 
320120de2229SMichal Kazior 		dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate);
3202de46c015SMohammed Shafi Shajakhan 
3203cc61a1bbSMohammed Shafi Shajakhan 		if (ath10k_peer_stats_enabled(ar))
3204de46c015SMohammed Shafi Shajakhan 			dst->rx_duration = __le32_to_cpu(src->rx_duration);
320520de2229SMichal Kazior 		/* FIXME: expose 10.2 specific values */
320620de2229SMichal Kazior 
320720de2229SMichal Kazior 		list_add_tail(&dst->list, &stats->peers);
320820de2229SMichal Kazior 	}
320920de2229SMichal Kazior 
321020de2229SMichal Kazior 	return 0;
321120de2229SMichal Kazior }
321220de2229SMichal Kazior 
321398dd2b92SManikanta Pubbisetty static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
321498dd2b92SManikanta Pubbisetty 					    struct sk_buff *skb,
321598dd2b92SManikanta Pubbisetty 					    struct ath10k_fw_stats *stats)
321698dd2b92SManikanta Pubbisetty {
321798dd2b92SManikanta Pubbisetty 	const struct wmi_10_2_stats_event *ev = (void *)skb->data;
321898dd2b92SManikanta Pubbisetty 	u32 num_pdev_stats;
321998dd2b92SManikanta Pubbisetty 	u32 num_pdev_ext_stats;
322098dd2b92SManikanta Pubbisetty 	u32 num_vdev_stats;
322198dd2b92SManikanta Pubbisetty 	u32 num_peer_stats;
32224a49ae94SMohammed Shafi Shajakhan 	u32 num_bcnflt_stats;
3223f9575793SMohammed Shafi Shajakhan 	u32 stats_id;
322498dd2b92SManikanta Pubbisetty 	int i;
322598dd2b92SManikanta Pubbisetty 
322698dd2b92SManikanta Pubbisetty 	if (!skb_pull(skb, sizeof(*ev)))
322798dd2b92SManikanta Pubbisetty 		return -EPROTO;
322898dd2b92SManikanta Pubbisetty 
322998dd2b92SManikanta Pubbisetty 	num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
323098dd2b92SManikanta Pubbisetty 	num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
323198dd2b92SManikanta Pubbisetty 	num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
323298dd2b92SManikanta Pubbisetty 	num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
32334a49ae94SMohammed Shafi Shajakhan 	num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats);
3234f9575793SMohammed Shafi Shajakhan 	stats_id = __le32_to_cpu(ev->stats_id);
323598dd2b92SManikanta Pubbisetty 
323698dd2b92SManikanta Pubbisetty 	for (i = 0; i < num_pdev_stats; i++) {
323798dd2b92SManikanta Pubbisetty 		const struct wmi_10_4_pdev_stats *src;
323898dd2b92SManikanta Pubbisetty 		struct ath10k_fw_stats_pdev *dst;
323998dd2b92SManikanta Pubbisetty 
324098dd2b92SManikanta Pubbisetty 		src = (void *)skb->data;
324198dd2b92SManikanta Pubbisetty 		if (!skb_pull(skb, sizeof(*src)))
324298dd2b92SManikanta Pubbisetty 			return -EPROTO;
324398dd2b92SManikanta Pubbisetty 
324498dd2b92SManikanta Pubbisetty 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
324598dd2b92SManikanta Pubbisetty 		if (!dst)
324698dd2b92SManikanta Pubbisetty 			continue;
324798dd2b92SManikanta Pubbisetty 
324898dd2b92SManikanta Pubbisetty 		ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
324998dd2b92SManikanta Pubbisetty 		ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst);
325098dd2b92SManikanta Pubbisetty 		ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
325198dd2b92SManikanta Pubbisetty 		dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs);
325298dd2b92SManikanta Pubbisetty 		ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
325398dd2b92SManikanta Pubbisetty 
325498dd2b92SManikanta Pubbisetty 		list_add_tail(&dst->list, &stats->pdevs);
325598dd2b92SManikanta Pubbisetty 	}
325698dd2b92SManikanta Pubbisetty 
325798dd2b92SManikanta Pubbisetty 	for (i = 0; i < num_pdev_ext_stats; i++) {
325898dd2b92SManikanta Pubbisetty 		const struct wmi_10_2_pdev_ext_stats *src;
325998dd2b92SManikanta Pubbisetty 
326098dd2b92SManikanta Pubbisetty 		src = (void *)skb->data;
326198dd2b92SManikanta Pubbisetty 		if (!skb_pull(skb, sizeof(*src)))
326298dd2b92SManikanta Pubbisetty 			return -EPROTO;
326398dd2b92SManikanta Pubbisetty 
326498dd2b92SManikanta Pubbisetty 		/* FIXME: expose values to userspace
326598dd2b92SManikanta Pubbisetty 		 *
326698dd2b92SManikanta Pubbisetty 		 * Note: Even though this loop seems to do nothing it is
326798dd2b92SManikanta Pubbisetty 		 * required to parse following sub-structures properly.
326898dd2b92SManikanta Pubbisetty 		 */
326998dd2b92SManikanta Pubbisetty 	}
327098dd2b92SManikanta Pubbisetty 
32711b3fdb50SRajkumar Manoharan 	for (i = 0; i < num_vdev_stats; i++) {
32721b3fdb50SRajkumar Manoharan 		const struct wmi_vdev_stats *src;
32731b3fdb50SRajkumar Manoharan 
32741b3fdb50SRajkumar Manoharan 		/* Ignore vdev stats here as it has only vdev id. Actual vdev
32751b3fdb50SRajkumar Manoharan 		 * stats will be retrieved from vdev extended stats.
32761b3fdb50SRajkumar Manoharan 		 */
32771b3fdb50SRajkumar Manoharan 		src = (void *)skb->data;
32781b3fdb50SRajkumar Manoharan 		if (!skb_pull(skb, sizeof(*src)))
32791b3fdb50SRajkumar Manoharan 			return -EPROTO;
32801b3fdb50SRajkumar Manoharan 	}
328198dd2b92SManikanta Pubbisetty 
328298dd2b92SManikanta Pubbisetty 	for (i = 0; i < num_peer_stats; i++) {
32834a49ae94SMohammed Shafi Shajakhan 		const struct wmi_10_4_peer_stats *src;
328498dd2b92SManikanta Pubbisetty 		struct ath10k_fw_stats_peer *dst;
328598dd2b92SManikanta Pubbisetty 
328698dd2b92SManikanta Pubbisetty 		src = (void *)skb->data;
32874a49ae94SMohammed Shafi Shajakhan 		if (!skb_pull(skb, sizeof(*src)))
328898dd2b92SManikanta Pubbisetty 			return -EPROTO;
328998dd2b92SManikanta Pubbisetty 
329098dd2b92SManikanta Pubbisetty 		dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
329198dd2b92SManikanta Pubbisetty 		if (!dst)
329298dd2b92SManikanta Pubbisetty 			continue;
329398dd2b92SManikanta Pubbisetty 
32944a49ae94SMohammed Shafi Shajakhan 		ath10k_wmi_10_4_pull_peer_stats(src, dst);
329598dd2b92SManikanta Pubbisetty 		list_add_tail(&dst->list, &stats->peers);
329698dd2b92SManikanta Pubbisetty 	}
329798dd2b92SManikanta Pubbisetty 
32984a49ae94SMohammed Shafi Shajakhan 	for (i = 0; i < num_bcnflt_stats; i++) {
32994a49ae94SMohammed Shafi Shajakhan 		const struct wmi_10_4_bss_bcn_filter_stats *src;
33004a49ae94SMohammed Shafi Shajakhan 
33014a49ae94SMohammed Shafi Shajakhan 		src = (void *)skb->data;
33024a49ae94SMohammed Shafi Shajakhan 		if (!skb_pull(skb, sizeof(*src)))
33034a49ae94SMohammed Shafi Shajakhan 			return -EPROTO;
33044a49ae94SMohammed Shafi Shajakhan 
33054a49ae94SMohammed Shafi Shajakhan 		/* FIXME: expose values to userspace
33064a49ae94SMohammed Shafi Shajakhan 		 *
33074a49ae94SMohammed Shafi Shajakhan 		 * Note: Even though this loop seems to do nothing it is
33084a49ae94SMohammed Shafi Shajakhan 		 * required to parse following sub-structures properly.
33094a49ae94SMohammed Shafi Shajakhan 		 */
33104a49ae94SMohammed Shafi Shajakhan 	}
33114a49ae94SMohammed Shafi Shajakhan 
33121b3fdb50SRajkumar Manoharan 	if (stats_id & WMI_10_4_STAT_PEER_EXTD) {
33134a49ae94SMohammed Shafi Shajakhan 		stats->extended = true;
33144a49ae94SMohammed Shafi Shajakhan 
33154a49ae94SMohammed Shafi Shajakhan 		for (i = 0; i < num_peer_stats; i++) {
33164a49ae94SMohammed Shafi Shajakhan 			const struct wmi_10_4_peer_extd_stats *src;
33174a49ae94SMohammed Shafi Shajakhan 			struct ath10k_fw_extd_stats_peer *dst;
33184a49ae94SMohammed Shafi Shajakhan 
33194a49ae94SMohammed Shafi Shajakhan 			src = (void *)skb->data;
33204a49ae94SMohammed Shafi Shajakhan 			if (!skb_pull(skb, sizeof(*src)))
33214a49ae94SMohammed Shafi Shajakhan 				return -EPROTO;
33224a49ae94SMohammed Shafi Shajakhan 
33234a49ae94SMohammed Shafi Shajakhan 			dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
33244a49ae94SMohammed Shafi Shajakhan 			if (!dst)
33254a49ae94SMohammed Shafi Shajakhan 				continue;
33264a49ae94SMohammed Shafi Shajakhan 
33271b3fdb50SRajkumar Manoharan 			ether_addr_copy(dst->peer_macaddr,
33281b3fdb50SRajkumar Manoharan 					src->peer_macaddr.addr);
33294a49ae94SMohammed Shafi Shajakhan 			dst->rx_duration = __le32_to_cpu(src->rx_duration);
33304a49ae94SMohammed Shafi Shajakhan 			list_add_tail(&dst->list, &stats->peers_extd);
33314a49ae94SMohammed Shafi Shajakhan 		}
33321b3fdb50SRajkumar Manoharan 	}
33331b3fdb50SRajkumar Manoharan 
33341b3fdb50SRajkumar Manoharan 	if (stats_id & WMI_10_4_STAT_VDEV_EXTD) {
33351b3fdb50SRajkumar Manoharan 		for (i = 0; i < num_vdev_stats; i++) {
33361b3fdb50SRajkumar Manoharan 			const struct wmi_vdev_stats_extd *src;
33371b3fdb50SRajkumar Manoharan 			struct ath10k_fw_stats_vdev_extd *dst;
33381b3fdb50SRajkumar Manoharan 
33391b3fdb50SRajkumar Manoharan 			src = (void *)skb->data;
33401b3fdb50SRajkumar Manoharan 			if (!skb_pull(skb, sizeof(*src)))
33411b3fdb50SRajkumar Manoharan 				return -EPROTO;
33421b3fdb50SRajkumar Manoharan 
33431b3fdb50SRajkumar Manoharan 			dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
33441b3fdb50SRajkumar Manoharan 			if (!dst)
33451b3fdb50SRajkumar Manoharan 				continue;
33461b3fdb50SRajkumar Manoharan 			ath10k_wmi_10_4_pull_vdev_stats(src, dst);
33471b3fdb50SRajkumar Manoharan 			list_add_tail(&dst->list, &stats->vdevs);
33481b3fdb50SRajkumar Manoharan 		}
33491b3fdb50SRajkumar Manoharan 	}
33504a49ae94SMohammed Shafi Shajakhan 
335198dd2b92SManikanta Pubbisetty 	return 0;
335298dd2b92SManikanta Pubbisetty }
335398dd2b92SManikanta Pubbisetty 
33540226d602SMichal Kazior void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb)
33555e3dd157SKalle Valo {
33567aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
335760ef401aSMichal Kazior 	ath10k_debug_fw_stats_process(ar, skb);
33585e3dd157SKalle Valo }
33595e3dd157SKalle Valo 
3360d7579d12SMichal Kazior static int
3361d7579d12SMichal Kazior ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb,
336232653cf1SMichal Kazior 				 struct wmi_vdev_start_ev_arg *arg)
336332653cf1SMichal Kazior {
336432653cf1SMichal Kazior 	struct wmi_vdev_start_response_event *ev = (void *)skb->data;
336532653cf1SMichal Kazior 
336632653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
336732653cf1SMichal Kazior 		return -EPROTO;
336832653cf1SMichal Kazior 
336932653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
337032653cf1SMichal Kazior 	arg->vdev_id = ev->vdev_id;
337132653cf1SMichal Kazior 	arg->req_id = ev->req_id;
337232653cf1SMichal Kazior 	arg->resp_type = ev->resp_type;
337332653cf1SMichal Kazior 	arg->status = ev->status;
337432653cf1SMichal Kazior 
337532653cf1SMichal Kazior 	return 0;
337632653cf1SMichal Kazior }
337732653cf1SMichal Kazior 
33780226d602SMichal Kazior void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb)
33795e3dd157SKalle Valo {
338032653cf1SMichal Kazior 	struct wmi_vdev_start_ev_arg arg = {};
338132653cf1SMichal Kazior 	int ret;
3382833fd34dSBen Greear 	u32 status;
33835e3dd157SKalle Valo 
33847aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
33855e3dd157SKalle Valo 
3386833fd34dSBen Greear 	ar->last_wmi_vdev_start_status = 0;
3387833fd34dSBen Greear 
3388d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg);
338932653cf1SMichal Kazior 	if (ret) {
339032653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret);
3391833fd34dSBen Greear 		ar->last_wmi_vdev_start_status = ret;
3392833fd34dSBen Greear 		goto out;
339332653cf1SMichal Kazior 	}
33945e3dd157SKalle Valo 
3395833fd34dSBen Greear 	status = __le32_to_cpu(arg.status);
3396833fd34dSBen Greear 	if (WARN_ON_ONCE(status)) {
3397833fd34dSBen Greear 		ath10k_warn(ar, "vdev-start-response reports status error: %d (%s)\n",
3398833fd34dSBen Greear 			    status, (status == WMI_VDEV_START_CHAN_INVALID) ?
3399833fd34dSBen Greear 			    "chan-invalid" : "unknown");
3400833fd34dSBen Greear 		/* Setup is done one way or another though, so we should still
3401833fd34dSBen Greear 		 * do the completion, so don't return here.
3402833fd34dSBen Greear 		 */
3403833fd34dSBen Greear 		ar->last_wmi_vdev_start_status = -EINVAL;
3404833fd34dSBen Greear 	}
34055e3dd157SKalle Valo 
3406833fd34dSBen Greear out:
34075e3dd157SKalle Valo 	complete(&ar->vdev_setup_done);
34085e3dd157SKalle Valo }
34095e3dd157SKalle Valo 
34100226d602SMichal Kazior void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb)
34115e3dd157SKalle Valo {
34127aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
34135e3dd157SKalle Valo 	complete(&ar->vdev_setup_done);
34145e3dd157SKalle Valo }
34155e3dd157SKalle Valo 
3416d7579d12SMichal Kazior static int
3417d7579d12SMichal Kazior ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb,
341832653cf1SMichal Kazior 				struct wmi_peer_kick_ev_arg *arg)
341932653cf1SMichal Kazior {
342032653cf1SMichal Kazior 	struct wmi_peer_sta_kickout_event *ev = (void *)skb->data;
342132653cf1SMichal Kazior 
342232653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
342332653cf1SMichal Kazior 		return -EPROTO;
342432653cf1SMichal Kazior 
342532653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
342632653cf1SMichal Kazior 	arg->mac_addr = ev->peer_macaddr.addr;
342732653cf1SMichal Kazior 
342832653cf1SMichal Kazior 	return 0;
342932653cf1SMichal Kazior }
343032653cf1SMichal Kazior 
34310226d602SMichal Kazior void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb)
34325e3dd157SKalle Valo {
343332653cf1SMichal Kazior 	struct wmi_peer_kick_ev_arg arg = {};
34345a13e76eSKalle Valo 	struct ieee80211_sta *sta;
343532653cf1SMichal Kazior 	int ret;
34365a13e76eSKalle Valo 
3437d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
343832653cf1SMichal Kazior 	if (ret) {
343932653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse peer kickout event: %d\n",
344032653cf1SMichal Kazior 			    ret);
344132653cf1SMichal Kazior 		return;
344232653cf1SMichal Kazior 	}
34435a13e76eSKalle Valo 
34447aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n",
344532653cf1SMichal Kazior 		   arg.mac_addr);
34465a13e76eSKalle Valo 
34475a13e76eSKalle Valo 	rcu_read_lock();
34485a13e76eSKalle Valo 
344932653cf1SMichal Kazior 	sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
34505a13e76eSKalle Valo 	if (!sta) {
34517aa7a72aSMichal Kazior 		ath10k_warn(ar, "Spurious quick kickout for STA %pM\n",
345232653cf1SMichal Kazior 			    arg.mac_addr);
34535a13e76eSKalle Valo 		goto exit;
34545a13e76eSKalle Valo 	}
34555a13e76eSKalle Valo 
34565a13e76eSKalle Valo 	ieee80211_report_low_ack(sta, 10);
34575a13e76eSKalle Valo 
34585a13e76eSKalle Valo exit:
34595a13e76eSKalle Valo 	rcu_read_unlock();
34605e3dd157SKalle Valo }
34615e3dd157SKalle Valo 
34625e3dd157SKalle Valo /*
34635e3dd157SKalle Valo  * FIXME
34645e3dd157SKalle Valo  *
34655e3dd157SKalle Valo  * We don't report to mac80211 sleep state of connected
34665e3dd157SKalle Valo  * stations. Due to this mac80211 can't fill in TIM IE
34675e3dd157SKalle Valo  * correctly.
34685e3dd157SKalle Valo  *
34695e3dd157SKalle Valo  * I know of no way of getting nullfunc frames that contain
34705e3dd157SKalle Valo  * sleep transition from connected stations - these do not
34715e3dd157SKalle Valo  * seem to be sent from the target to the host. There also
34725e3dd157SKalle Valo  * doesn't seem to be a dedicated event for that. So the
34735e3dd157SKalle Valo  * only way left to do this would be to read tim_bitmap
34745e3dd157SKalle Valo  * during SWBA.
34755e3dd157SKalle Valo  *
34765e3dd157SKalle Valo  * We could probably try using tim_bitmap from SWBA to tell
34775e3dd157SKalle Valo  * mac80211 which stations are asleep and which are not. The
34785e3dd157SKalle Valo  * problem here is calling mac80211 functions so many times
34795e3dd157SKalle Valo  * could take too long and make us miss the time to submit
34805e3dd157SKalle Valo  * the beacon to the target.
34815e3dd157SKalle Valo  *
34825e3dd157SKalle Valo  * So as a workaround we try to extend the TIM IE if there
34835e3dd157SKalle Valo  * is unicast buffered for stations with aid > 7 and fill it
34845e3dd157SKalle Valo  * in ourselves.
34855e3dd157SKalle Valo  */
34865e3dd157SKalle Valo static void ath10k_wmi_update_tim(struct ath10k *ar,
34875e3dd157SKalle Valo 				  struct ath10k_vif *arvif,
34885e3dd157SKalle Valo 				  struct sk_buff *bcn,
3489a03fee34SRaja Mani 				  const struct wmi_tim_info_arg *tim_info)
34905e3dd157SKalle Valo {
34915e3dd157SKalle Valo 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data;
34925e3dd157SKalle Valo 	struct ieee80211_tim_ie *tim;
34935e3dd157SKalle Valo 	u8 *ies, *ie;
34945e3dd157SKalle Valo 	u8 ie_len, pvm_len;
3495af762c0bSKalle Valo 	__le32 t;
3496a03fee34SRaja Mani 	u32 v, tim_len;
3497a03fee34SRaja Mani 
3498a03fee34SRaja Mani 	/* When FW reports 0 in tim_len, ensure atleast first byte
3499a03fee34SRaja Mani 	 * in tim_bitmap is considered for pvm calculation.
3500a03fee34SRaja Mani 	 */
3501a03fee34SRaja Mani 	tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1;
35025e3dd157SKalle Valo 
35035e3dd157SKalle Valo 	/* if next SWBA has no tim_changed the tim_bitmap is garbage.
3504d6dfe25cSMarcin Rokicki 	 * we must copy the bitmap upon change and reuse it later
3505d6dfe25cSMarcin Rokicki 	 */
350632653cf1SMichal Kazior 	if (__le32_to_cpu(tim_info->tim_changed)) {
35075e3dd157SKalle Valo 		int i;
35085e3dd157SKalle Valo 
3509a03fee34SRaja Mani 		if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) {
3510a03fee34SRaja Mani 			ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu",
3511a03fee34SRaja Mani 				    tim_len, sizeof(arvif->u.ap.tim_bitmap));
3512a03fee34SRaja Mani 			tim_len = sizeof(arvif->u.ap.tim_bitmap);
3513a03fee34SRaja Mani 		}
35145e3dd157SKalle Valo 
3515a03fee34SRaja Mani 		for (i = 0; i < tim_len; i++) {
351632653cf1SMichal Kazior 			t = tim_info->tim_bitmap[i / 4];
3517af762c0bSKalle Valo 			v = __le32_to_cpu(t);
35185e3dd157SKalle Valo 			arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
35195e3dd157SKalle Valo 		}
35205e3dd157SKalle Valo 
3521a03fee34SRaja Mani 		/* FW reports either length 0 or length based on max supported
3522a03fee34SRaja Mani 		 * station. so we calculate this on our own
3523a03fee34SRaja Mani 		 */
35245e3dd157SKalle Valo 		arvif->u.ap.tim_len = 0;
3525a03fee34SRaja Mani 		for (i = 0; i < tim_len; i++)
35265e3dd157SKalle Valo 			if (arvif->u.ap.tim_bitmap[i])
35275e3dd157SKalle Valo 				arvif->u.ap.tim_len = i;
35285e3dd157SKalle Valo 
35295e3dd157SKalle Valo 		arvif->u.ap.tim_len++;
35305e3dd157SKalle Valo 	}
35315e3dd157SKalle Valo 
35325e3dd157SKalle Valo 	ies = bcn->data;
35335e3dd157SKalle Valo 	ies += ieee80211_hdrlen(hdr->frame_control);
35345e3dd157SKalle Valo 	ies += 12; /* fixed parameters */
35355e3dd157SKalle Valo 
35365e3dd157SKalle Valo 	ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies,
35375e3dd157SKalle Valo 				    (u8 *)skb_tail_pointer(bcn) - ies);
35385e3dd157SKalle Valo 	if (!ie) {
353909af8f85SMichal Kazior 		if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
35407aa7a72aSMichal Kazior 			ath10k_warn(ar, "no tim ie found;\n");
35415e3dd157SKalle Valo 		return;
35425e3dd157SKalle Valo 	}
35435e3dd157SKalle Valo 
35445e3dd157SKalle Valo 	tim = (void *)ie + 2;
35455e3dd157SKalle Valo 	ie_len = ie[1];
35465e3dd157SKalle Valo 	pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */
35475e3dd157SKalle Valo 
35485e3dd157SKalle Valo 	if (pvm_len < arvif->u.ap.tim_len) {
3549a03fee34SRaja Mani 		int expand_size = tim_len - pvm_len;
35505e3dd157SKalle Valo 		int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
35515e3dd157SKalle Valo 		void *next_ie = ie + 2 + ie_len;
35525e3dd157SKalle Valo 
35535e3dd157SKalle Valo 		if (skb_put(bcn, expand_size)) {
35545e3dd157SKalle Valo 			memmove(next_ie + expand_size, next_ie, move_size);
35555e3dd157SKalle Valo 
35565e3dd157SKalle Valo 			ie[1] += expand_size;
35575e3dd157SKalle Valo 			ie_len += expand_size;
35585e3dd157SKalle Valo 			pvm_len += expand_size;
35595e3dd157SKalle Valo 		} else {
35607aa7a72aSMichal Kazior 			ath10k_warn(ar, "tim expansion failed\n");
35615e3dd157SKalle Valo 		}
35625e3dd157SKalle Valo 	}
35635e3dd157SKalle Valo 
3564a03fee34SRaja Mani 	if (pvm_len > tim_len) {
35657aa7a72aSMichal Kazior 		ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len);
35665e3dd157SKalle Valo 		return;
35675e3dd157SKalle Valo 	}
35685e3dd157SKalle Valo 
356932653cf1SMichal Kazior 	tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast);
35705e3dd157SKalle Valo 	memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
35715e3dd157SKalle Valo 
3572748afc47SMichal Kazior 	if (tim->dtim_count == 0) {
357366b8a010SMichal Kazior 		ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO;
3574748afc47SMichal Kazior 
357532653cf1SMichal Kazior 		if (__le32_to_cpu(tim_info->tim_mcast) == 1)
357666b8a010SMichal Kazior 			ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB;
3577748afc47SMichal Kazior 	}
3578748afc47SMichal Kazior 
35797aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
35805e3dd157SKalle Valo 		   tim->dtim_count, tim->dtim_period,
35815e3dd157SKalle Valo 		   tim->bitmap_ctrl, pvm_len);
35825e3dd157SKalle Valo }
35835e3dd157SKalle Valo 
35845e3dd157SKalle Valo static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
35855e3dd157SKalle Valo 				  struct sk_buff *bcn,
358632653cf1SMichal Kazior 				  const struct wmi_p2p_noa_info *noa)
35875e3dd157SKalle Valo {
358808c27be1SPeter Oh 	if (!arvif->vif->p2p)
35895e3dd157SKalle Valo 		return;
35905e3dd157SKalle Valo 
35917aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
35925e3dd157SKalle Valo 
35936a94888fSMichal Kazior 	if (noa->changed & WMI_P2P_NOA_CHANGED_BIT)
35946a94888fSMichal Kazior 		ath10k_p2p_noa_update(arvif, noa);
35955e3dd157SKalle Valo 
35965e3dd157SKalle Valo 	if (arvif->u.ap.noa_data)
35975e3dd157SKalle Valo 		if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
359859ae1d12SJohannes Berg 			skb_put_data(bcn, arvif->u.ap.noa_data,
35995e3dd157SKalle Valo 				     arvif->u.ap.noa_len);
36005e3dd157SKalle Valo }
36015e3dd157SKalle Valo 
3602d7579d12SMichal Kazior static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
360332653cf1SMichal Kazior 				      struct wmi_swba_ev_arg *arg)
360432653cf1SMichal Kazior {
360532653cf1SMichal Kazior 	struct wmi_host_swba_event *ev = (void *)skb->data;
360632653cf1SMichal Kazior 	u32 map;
360732653cf1SMichal Kazior 	size_t i;
360832653cf1SMichal Kazior 
360932653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
361032653cf1SMichal Kazior 		return -EPROTO;
361132653cf1SMichal Kazior 
361232653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
361332653cf1SMichal Kazior 	arg->vdev_map = ev->vdev_map;
361432653cf1SMichal Kazior 
361532653cf1SMichal Kazior 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
361632653cf1SMichal Kazior 		if (!(map & BIT(0)))
361732653cf1SMichal Kazior 			continue;
361832653cf1SMichal Kazior 
361932653cf1SMichal Kazior 		/* If this happens there were some changes in firmware and
362032653cf1SMichal Kazior 		 * ath10k should update the max size of tim_info array.
362132653cf1SMichal Kazior 		 */
362232653cf1SMichal Kazior 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
362332653cf1SMichal Kazior 			break;
362432653cf1SMichal Kazior 
3625a03fee34SRaja Mani 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3626a03fee34SRaja Mani 		     sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3627a03fee34SRaja Mani 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3628a03fee34SRaja Mani 			return -EPROTO;
3629a03fee34SRaja Mani 		}
3630a03fee34SRaja Mani 
3631a03fee34SRaja Mani 		arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3632a03fee34SRaja Mani 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3633a03fee34SRaja Mani 		arg->tim_info[i].tim_bitmap =
3634a03fee34SRaja Mani 				ev->bcn_info[i].tim_info.tim_bitmap;
3635a03fee34SRaja Mani 		arg->tim_info[i].tim_changed =
3636a03fee34SRaja Mani 				ev->bcn_info[i].tim_info.tim_changed;
3637a03fee34SRaja Mani 		arg->tim_info[i].tim_num_ps_pending =
3638a03fee34SRaja Mani 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
3639a03fee34SRaja Mani 
364032653cf1SMichal Kazior 		arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info;
364132653cf1SMichal Kazior 		i++;
364232653cf1SMichal Kazior 	}
364332653cf1SMichal Kazior 
364432653cf1SMichal Kazior 	return 0;
364532653cf1SMichal Kazior }
364632653cf1SMichal Kazior 
36478b019fb0SYanbo Li static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar,
36488b019fb0SYanbo Li 					     struct sk_buff *skb,
36498b019fb0SYanbo Li 					     struct wmi_swba_ev_arg *arg)
36508b019fb0SYanbo Li {
36518b019fb0SYanbo Li 	struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data;
36528b019fb0SYanbo Li 	u32 map;
36538b019fb0SYanbo Li 	size_t i;
36548b019fb0SYanbo Li 
36558b019fb0SYanbo Li 	if (skb->len < sizeof(*ev))
36568b019fb0SYanbo Li 		return -EPROTO;
36578b019fb0SYanbo Li 
36588b019fb0SYanbo Li 	skb_pull(skb, sizeof(*ev));
36598b019fb0SYanbo Li 	arg->vdev_map = ev->vdev_map;
36608b019fb0SYanbo Li 
36618b019fb0SYanbo Li 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
36628b019fb0SYanbo Li 		if (!(map & BIT(0)))
36638b019fb0SYanbo Li 			continue;
36648b019fb0SYanbo Li 
36658b019fb0SYanbo Li 		/* If this happens there were some changes in firmware and
36668b019fb0SYanbo Li 		 * ath10k should update the max size of tim_info array.
36678b019fb0SYanbo Li 		 */
36688b019fb0SYanbo Li 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
36698b019fb0SYanbo Li 			break;
36708b019fb0SYanbo Li 
36718b019fb0SYanbo Li 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
36728b019fb0SYanbo Li 		     sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
36738b019fb0SYanbo Li 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
36748b019fb0SYanbo Li 			return -EPROTO;
36758b019fb0SYanbo Li 		}
36768b019fb0SYanbo Li 
36778b019fb0SYanbo Li 		arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
36788b019fb0SYanbo Li 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
36798b019fb0SYanbo Li 		arg->tim_info[i].tim_bitmap =
36808b019fb0SYanbo Li 				ev->bcn_info[i].tim_info.tim_bitmap;
36818b019fb0SYanbo Li 		arg->tim_info[i].tim_changed =
36828b019fb0SYanbo Li 				ev->bcn_info[i].tim_info.tim_changed;
36838b019fb0SYanbo Li 		arg->tim_info[i].tim_num_ps_pending =
36848b019fb0SYanbo Li 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
36858b019fb0SYanbo Li 		i++;
36868b019fb0SYanbo Li 	}
36878b019fb0SYanbo Li 
36888b019fb0SYanbo Li 	return 0;
36898b019fb0SYanbo Li }
36908b019fb0SYanbo Li 
36913cec3be3SRaja Mani static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
36923cec3be3SRaja Mani 					   struct sk_buff *skb,
36933cec3be3SRaja Mani 					   struct wmi_swba_ev_arg *arg)
36943cec3be3SRaja Mani {
36953cec3be3SRaja Mani 	struct wmi_10_4_host_swba_event *ev = (void *)skb->data;
36963cec3be3SRaja Mani 	u32 map, tim_len;
36973cec3be3SRaja Mani 	size_t i;
36983cec3be3SRaja Mani 
36993cec3be3SRaja Mani 	if (skb->len < sizeof(*ev))
37003cec3be3SRaja Mani 		return -EPROTO;
37013cec3be3SRaja Mani 
37023cec3be3SRaja Mani 	skb_pull(skb, sizeof(*ev));
37033cec3be3SRaja Mani 	arg->vdev_map = ev->vdev_map;
37043cec3be3SRaja Mani 
37053cec3be3SRaja Mani 	for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
37063cec3be3SRaja Mani 		if (!(map & BIT(0)))
37073cec3be3SRaja Mani 			continue;
37083cec3be3SRaja Mani 
37093cec3be3SRaja Mani 		/* If this happens there were some changes in firmware and
37103cec3be3SRaja Mani 		 * ath10k should update the max size of tim_info array.
37113cec3be3SRaja Mani 		 */
37123cec3be3SRaja Mani 		if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
37133cec3be3SRaja Mani 			break;
37143cec3be3SRaja Mani 
37153cec3be3SRaja Mani 		if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
37163cec3be3SRaja Mani 		      sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
37173cec3be3SRaja Mani 			ath10k_warn(ar, "refusing to parse invalid swba structure\n");
37183cec3be3SRaja Mani 			return -EPROTO;
37193cec3be3SRaja Mani 		}
37203cec3be3SRaja Mani 
37213cec3be3SRaja Mani 		tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len);
37223cec3be3SRaja Mani 		if (tim_len) {
37233cec3be3SRaja Mani 			/* Exclude 4 byte guard length */
37243cec3be3SRaja Mani 			tim_len -= 4;
37253cec3be3SRaja Mani 			arg->tim_info[i].tim_len = __cpu_to_le32(tim_len);
37263cec3be3SRaja Mani 		} else {
37273cec3be3SRaja Mani 			arg->tim_info[i].tim_len = 0;
37283cec3be3SRaja Mani 		}
37293cec3be3SRaja Mani 
37303cec3be3SRaja Mani 		arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
37313cec3be3SRaja Mani 		arg->tim_info[i].tim_bitmap =
37323cec3be3SRaja Mani 				ev->bcn_info[i].tim_info.tim_bitmap;
37333cec3be3SRaja Mani 		arg->tim_info[i].tim_changed =
37343cec3be3SRaja Mani 				ev->bcn_info[i].tim_info.tim_changed;
37353cec3be3SRaja Mani 		arg->tim_info[i].tim_num_ps_pending =
37363cec3be3SRaja Mani 				ev->bcn_info[i].tim_info.tim_num_ps_pending;
37373cec3be3SRaja Mani 
37383cec3be3SRaja Mani 		/* 10.4 firmware doesn't have p2p support. notice of absence
37393cec3be3SRaja Mani 		 * info can be ignored for now.
37403cec3be3SRaja Mani 		 */
37413cec3be3SRaja Mani 
37423cec3be3SRaja Mani 		i++;
37433cec3be3SRaja Mani 	}
37443cec3be3SRaja Mani 
37453cec3be3SRaja Mani 	return 0;
37463cec3be3SRaja Mani }
37473cec3be3SRaja Mani 
374808e75ea8SVivek Natarajan static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar)
374908e75ea8SVivek Natarajan {
375008e75ea8SVivek Natarajan 	return WMI_TXBF_CONF_BEFORE_ASSOC;
375108e75ea8SVivek Natarajan }
375208e75ea8SVivek Natarajan 
37530226d602SMichal Kazior void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
37545e3dd157SKalle Valo {
375532653cf1SMichal Kazior 	struct wmi_swba_ev_arg arg = {};
37565e3dd157SKalle Valo 	u32 map;
37575e3dd157SKalle Valo 	int i = -1;
3758a03fee34SRaja Mani 	const struct wmi_tim_info_arg *tim_info;
375932653cf1SMichal Kazior 	const struct wmi_p2p_noa_info *noa_info;
37605e3dd157SKalle Valo 	struct ath10k_vif *arvif;
37615e3dd157SKalle Valo 	struct sk_buff *bcn;
376264badcb6SMichal Kazior 	dma_addr_t paddr;
3763767d34fcSMichal Kazior 	int ret, vdev_id = 0;
37645e3dd157SKalle Valo 
3765d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_swba(ar, skb, &arg);
376632653cf1SMichal Kazior 	if (ret) {
376732653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse swba event: %d\n", ret);
376832653cf1SMichal Kazior 		return;
376932653cf1SMichal Kazior 	}
377032653cf1SMichal Kazior 
377132653cf1SMichal Kazior 	map = __le32_to_cpu(arg.vdev_map);
37725e3dd157SKalle Valo 
37737aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
377432653cf1SMichal Kazior 		   map);
37755e3dd157SKalle Valo 
37765e3dd157SKalle Valo 	for (; map; map >>= 1, vdev_id++) {
37775e3dd157SKalle Valo 		if (!(map & 0x1))
37785e3dd157SKalle Valo 			continue;
37795e3dd157SKalle Valo 
37805e3dd157SKalle Valo 		i++;
37815e3dd157SKalle Valo 
37825e3dd157SKalle Valo 		if (i >= WMI_MAX_AP_VDEV) {
37837aa7a72aSMichal Kazior 			ath10k_warn(ar, "swba has corrupted vdev map\n");
37845e3dd157SKalle Valo 			break;
37855e3dd157SKalle Valo 		}
37865e3dd157SKalle Valo 
3787a03fee34SRaja Mani 		tim_info = &arg.tim_info[i];
378832653cf1SMichal Kazior 		noa_info = arg.noa_info[i];
37895e3dd157SKalle Valo 
37907aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_MGMT,
37917a8a396bSKalle Valo 			   "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n",
37925e3dd157SKalle Valo 			   i,
379332653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_len),
379432653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_mcast),
379532653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_changed),
379632653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_num_ps_pending),
379732653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[3]),
379832653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[2]),
379932653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[1]),
380032653cf1SMichal Kazior 			   __le32_to_cpu(tim_info->tim_bitmap[0]));
38015e3dd157SKalle Valo 
3802a03fee34SRaja Mani 		/* TODO: Only first 4 word from tim_bitmap is dumped.
3803a03fee34SRaja Mani 		 * Extend debug code to dump full tim_bitmap.
3804a03fee34SRaja Mani 		 */
3805a03fee34SRaja Mani 
38065e3dd157SKalle Valo 		arvif = ath10k_get_arvif(ar, vdev_id);
38075e3dd157SKalle Valo 		if (arvif == NULL) {
38087aa7a72aSMichal Kazior 			ath10k_warn(ar, "no vif for vdev_id %d found\n",
38097aa7a72aSMichal Kazior 				    vdev_id);
38105e3dd157SKalle Valo 			continue;
38115e3dd157SKalle Valo 		}
38125e3dd157SKalle Valo 
3813b63b33ecSMohammed Shafi Shajakhan 		/* mac80211 would have already asked us to stop beaconing and
3814b63b33ecSMohammed Shafi Shajakhan 		 * bring the vdev down, so continue in that case
3815b63b33ecSMohammed Shafi Shajakhan 		 */
3816b63b33ecSMohammed Shafi Shajakhan 		if (!arvif->is_up)
3817b63b33ecSMohammed Shafi Shajakhan 			continue;
3818b63b33ecSMohammed Shafi Shajakhan 
3819c2df44b3SMichal Kazior 		/* There are no completions for beacons so wait for next SWBA
3820c2df44b3SMichal Kazior 		 * before telling mac80211 to decrement CSA counter
3821c2df44b3SMichal Kazior 		 *
3822c2df44b3SMichal Kazior 		 * Once CSA counter is completed stop sending beacons until
3823d6dfe25cSMarcin Rokicki 		 * actual channel switch is done
3824d6dfe25cSMarcin Rokicki 		 */
3825c2df44b3SMichal Kazior 		if (arvif->vif->csa_active &&
3826c2df44b3SMichal Kazior 		    ieee80211_csa_is_complete(arvif->vif)) {
3827c2df44b3SMichal Kazior 			ieee80211_csa_finish(arvif->vif);
3828c2df44b3SMichal Kazior 			continue;
3829c2df44b3SMichal Kazior 		}
3830c2df44b3SMichal Kazior 
38315e3dd157SKalle Valo 		bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
38325e3dd157SKalle Valo 		if (!bcn) {
38337aa7a72aSMichal Kazior 			ath10k_warn(ar, "could not get mac80211 beacon\n");
38345e3dd157SKalle Valo 			continue;
38355e3dd157SKalle Valo 		}
38365e3dd157SKalle Valo 
38374b604558SMichal Kazior 		ath10k_tx_h_seq_no(arvif->vif, bcn);
383832653cf1SMichal Kazior 		ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
383932653cf1SMichal Kazior 		ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);
38405e3dd157SKalle Valo 
3841ed54388aSMichal Kazior 		spin_lock_bh(&ar->data_lock);
3842748afc47SMichal Kazior 
3843ed54388aSMichal Kazior 		if (arvif->beacon) {
3844af21319fSMichal Kazior 			switch (arvif->beacon_state) {
3845af21319fSMichal Kazior 			case ATH10K_BEACON_SENT:
3846af21319fSMichal Kazior 				break;
3847af21319fSMichal Kazior 			case ATH10K_BEACON_SCHEDULED:
3848af21319fSMichal Kazior 				ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n",
3849ed54388aSMichal Kazior 					    arvif->vdev_id);
3850af21319fSMichal Kazior 				break;
3851af21319fSMichal Kazior 			case ATH10K_BEACON_SENDING:
3852af21319fSMichal Kazior 				ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n",
3853af21319fSMichal Kazior 					    arvif->vdev_id);
3854af21319fSMichal Kazior 				dev_kfree_skb(bcn);
3855af21319fSMichal Kazior 				goto skip;
3856af21319fSMichal Kazior 			}
3857748afc47SMichal Kazior 
385864badcb6SMichal Kazior 			ath10k_mac_vif_beacon_free(arvif);
3859ed54388aSMichal Kazior 		}
38605e3dd157SKalle Valo 
386164badcb6SMichal Kazior 		if (!arvif->beacon_buf) {
386264badcb6SMichal Kazior 			paddr = dma_map_single(arvif->ar->dev, bcn->data,
386364badcb6SMichal Kazior 					       bcn->len, DMA_TO_DEVICE);
386464badcb6SMichal Kazior 			ret = dma_mapping_error(arvif->ar->dev, paddr);
3865767d34fcSMichal Kazior 			if (ret) {
386664badcb6SMichal Kazior 				ath10k_warn(ar, "failed to map beacon: %d\n",
386764badcb6SMichal Kazior 					    ret);
3868ad3d2153SMichal Kazior 				dev_kfree_skb_any(bcn);
3869767d34fcSMichal Kazior 				goto skip;
3870767d34fcSMichal Kazior 			}
3871748afc47SMichal Kazior 
387264badcb6SMichal Kazior 			ATH10K_SKB_CB(bcn)->paddr = paddr;
387364badcb6SMichal Kazior 		} else {
387464badcb6SMichal Kazior 			if (bcn->len > IEEE80211_MAX_FRAME_LEN) {
387564badcb6SMichal Kazior 				ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n",
387664badcb6SMichal Kazior 					    bcn->len, IEEE80211_MAX_FRAME_LEN);
387764badcb6SMichal Kazior 				skb_trim(bcn, IEEE80211_MAX_FRAME_LEN);
387864badcb6SMichal Kazior 			}
387964badcb6SMichal Kazior 			memcpy(arvif->beacon_buf, bcn->data, bcn->len);
388064badcb6SMichal Kazior 			ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr;
388164badcb6SMichal Kazior 		}
388264badcb6SMichal Kazior 
3883ed54388aSMichal Kazior 		arvif->beacon = bcn;
3884af21319fSMichal Kazior 		arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
38855e3dd157SKalle Valo 
38865ce8e7fdSRajkumar Manoharan 		trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
38875ce8e7fdSRajkumar Manoharan 		trace_ath10k_tx_payload(ar, bcn->data, bcn->len);
38885ce8e7fdSRajkumar Manoharan 
3889767d34fcSMichal Kazior skip:
3890ed54388aSMichal Kazior 		spin_unlock_bh(&ar->data_lock);
38915e3dd157SKalle Valo 	}
3892af21319fSMichal Kazior 
3893af21319fSMichal Kazior 	ath10k_wmi_tx_beacons_nowait(ar);
38945e3dd157SKalle Valo }
38955e3dd157SKalle Valo 
38960226d602SMichal Kazior void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb)
38975e3dd157SKalle Valo {
38987aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
38995e3dd157SKalle Valo }
39005e3dd157SKalle Valo 
39016f6eb1bcSSriram R static void ath10k_radar_detected(struct ath10k *ar)
39026f6eb1bcSSriram R {
39036f6eb1bcSSriram R 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
39046f6eb1bcSSriram R 	ATH10K_DFS_STAT_INC(ar, radar_detected);
39056f6eb1bcSSriram R 
39066f6eb1bcSSriram R 	/* Control radar events reporting in debugfs file
39076f6eb1bcSSriram R 	 * dfs_block_radar_events
39086f6eb1bcSSriram R 	 */
39096f6eb1bcSSriram R 	if (ar->dfs_block_radar_events)
39106f6eb1bcSSriram R 		ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
39116f6eb1bcSSriram R 	else
39126f6eb1bcSSriram R 		ieee80211_radar_detected(ar->hw);
39136f6eb1bcSSriram R }
39146f6eb1bcSSriram R 
39156f6eb1bcSSriram R static void ath10k_radar_confirmation_work(struct work_struct *work)
39166f6eb1bcSSriram R {
39176f6eb1bcSSriram R 	struct ath10k *ar = container_of(work, struct ath10k,
39186f6eb1bcSSriram R 					 radar_confirmation_work);
39196f6eb1bcSSriram R 	struct ath10k_radar_found_info radar_info;
39206f6eb1bcSSriram R 	int ret, time_left;
39216f6eb1bcSSriram R 
39226f6eb1bcSSriram R 	reinit_completion(&ar->wmi.radar_confirm);
39236f6eb1bcSSriram R 
39246f6eb1bcSSriram R 	spin_lock_bh(&ar->data_lock);
39256f6eb1bcSSriram R 	memcpy(&radar_info, &ar->last_radar_info, sizeof(radar_info));
39266f6eb1bcSSriram R 	spin_unlock_bh(&ar->data_lock);
39276f6eb1bcSSriram R 
39286f6eb1bcSSriram R 	ret = ath10k_wmi_report_radar_found(ar, &radar_info);
39296f6eb1bcSSriram R 	if (ret) {
39306f6eb1bcSSriram R 		ath10k_warn(ar, "failed to send radar found %d\n", ret);
39316f6eb1bcSSriram R 		goto wait_complete;
39326f6eb1bcSSriram R 	}
39336f6eb1bcSSriram R 
39346f6eb1bcSSriram R 	time_left = wait_for_completion_timeout(&ar->wmi.radar_confirm,
39356f6eb1bcSSriram R 						ATH10K_WMI_DFS_CONF_TIMEOUT_HZ);
39366f6eb1bcSSriram R 	if (time_left) {
39376f6eb1bcSSriram R 		/* DFS Confirmation status event received and
39386f6eb1bcSSriram R 		 * necessary action completed.
39396f6eb1bcSSriram R 		 */
39406f6eb1bcSSriram R 		goto wait_complete;
39416f6eb1bcSSriram R 	} else {
39426f6eb1bcSSriram R 		/* DFS Confirmation event not received from FW.Considering this
39436f6eb1bcSSriram R 		 * as real radar.
39446f6eb1bcSSriram R 		 */
39456f6eb1bcSSriram R 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
39466f6eb1bcSSriram R 			   "dfs confirmation not received from fw, considering as radar\n");
39476f6eb1bcSSriram R 		goto radar_detected;
39486f6eb1bcSSriram R 	}
39496f6eb1bcSSriram R 
39506f6eb1bcSSriram R radar_detected:
39516f6eb1bcSSriram R 	ath10k_radar_detected(ar);
39526f6eb1bcSSriram R 
39536f6eb1bcSSriram R 	/* Reset state to allow sending confirmation on consecutive radar
39546f6eb1bcSSriram R 	 * detections, unless radar confirmation is disabled/stopped.
39556f6eb1bcSSriram R 	 */
39566f6eb1bcSSriram R wait_complete:
39576f6eb1bcSSriram R 	spin_lock_bh(&ar->data_lock);
39586f6eb1bcSSriram R 	if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_STOPPED)
39596f6eb1bcSSriram R 		ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
39606f6eb1bcSSriram R 	spin_unlock_bh(&ar->data_lock);
39616f6eb1bcSSriram R }
39626f6eb1bcSSriram R 
39639702c686SJanusz Dziedzic static void ath10k_dfs_radar_report(struct ath10k *ar,
3964991adf71SRaja Mani 				    struct wmi_phyerr_ev_arg *phyerr,
39652332d0aeSMichal Kazior 				    const struct phyerr_radar_report *rr,
39669702c686SJanusz Dziedzic 				    u64 tsf)
39679702c686SJanusz Dziedzic {
39689702c686SJanusz Dziedzic 	u32 reg0, reg1, tsf32l;
3969500ff9f9SMichal Kazior 	struct ieee80211_channel *ch;
39709702c686SJanusz Dziedzic 	struct pulse_event pe;
39716f6eb1bcSSriram R 	struct radar_detector_specs rs;
39729702c686SJanusz Dziedzic 	u64 tsf64;
39739702c686SJanusz Dziedzic 	u8 rssi, width;
39746f6eb1bcSSriram R 	struct ath10k_radar_found_info *radar_info;
39759702c686SJanusz Dziedzic 
39769702c686SJanusz Dziedzic 	reg0 = __le32_to_cpu(rr->reg0);
39779702c686SJanusz Dziedzic 	reg1 = __le32_to_cpu(rr->reg1);
39789702c686SJanusz Dziedzic 
39797aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
39809702c686SJanusz Dziedzic 		   "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n",
39819702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP),
39829702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH),
39839702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN),
39849702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF));
39857aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
39869702c686SJanusz Dziedzic 		   "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n",
39879702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK),
39889702c686SJanusz Dziedzic 		   MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX),
39899702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID),
39909702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN),
39919702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK));
39927aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
39939702c686SJanusz Dziedzic 		   "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n",
39949702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET),
39959702c686SJanusz Dziedzic 		   MS(reg1, RADAR_REPORT_REG1_PULSE_DUR));
39969702c686SJanusz Dziedzic 
39979702c686SJanusz Dziedzic 	if (!ar->dfs_detector)
39989702c686SJanusz Dziedzic 		return;
39999702c686SJanusz Dziedzic 
4000500ff9f9SMichal Kazior 	spin_lock_bh(&ar->data_lock);
4001500ff9f9SMichal Kazior 	ch = ar->rx_channel;
4002a28f6f27SMohammed Shafi Shajakhan 
4003a28f6f27SMohammed Shafi Shajakhan 	/* fetch target operating channel during channel change */
4004a28f6f27SMohammed Shafi Shajakhan 	if (!ch)
4005a28f6f27SMohammed Shafi Shajakhan 		ch = ar->tgt_oper_chan;
4006a28f6f27SMohammed Shafi Shajakhan 
4007500ff9f9SMichal Kazior 	spin_unlock_bh(&ar->data_lock);
4008500ff9f9SMichal Kazior 
4009500ff9f9SMichal Kazior 	if (!ch) {
4010500ff9f9SMichal Kazior 		ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n");
4011500ff9f9SMichal Kazior 		goto radar_detected;
4012500ff9f9SMichal Kazior 	}
4013500ff9f9SMichal Kazior 
40149702c686SJanusz Dziedzic 	/* report event to DFS pattern detector */
4015991adf71SRaja Mani 	tsf32l = phyerr->tsf_timestamp;
40169702c686SJanusz Dziedzic 	tsf64 = tsf & (~0xFFFFFFFFULL);
40179702c686SJanusz Dziedzic 	tsf64 |= tsf32l;
40189702c686SJanusz Dziedzic 
40199702c686SJanusz Dziedzic 	width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
40202332d0aeSMichal Kazior 	rssi = phyerr->rssi_combined;
40219702c686SJanusz Dziedzic 
40229702c686SJanusz Dziedzic 	/* hardware store this as 8 bit signed value,
40239702c686SJanusz Dziedzic 	 * set to zero if negative number
40249702c686SJanusz Dziedzic 	 */
40259702c686SJanusz Dziedzic 	if (rssi & 0x80)
40269702c686SJanusz Dziedzic 		rssi = 0;
40279702c686SJanusz Dziedzic 
40289702c686SJanusz Dziedzic 	pe.ts = tsf64;
4029500ff9f9SMichal Kazior 	pe.freq = ch->center_freq;
40309702c686SJanusz Dziedzic 	pe.width = width;
40319702c686SJanusz Dziedzic 	pe.rssi = rssi;
40322c3f26a0SPeter Oh 	pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0);
40337aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
40349702c686SJanusz Dziedzic 		   "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n",
40359702c686SJanusz Dziedzic 		   pe.freq, pe.width, pe.rssi, pe.ts);
40369702c686SJanusz Dziedzic 
40379702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, pulses_detected);
40389702c686SJanusz Dziedzic 
40396f6eb1bcSSriram R 	if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe, &rs)) {
40407aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
40419702c686SJanusz Dziedzic 			   "dfs no pulse pattern detected, yet\n");
40429702c686SJanusz Dziedzic 		return;
40439702c686SJanusz Dziedzic 	}
40449702c686SJanusz Dziedzic 
40456f6eb1bcSSriram R 	if ((test_bit(WMI_SERVICE_HOST_DFS_CHECK_SUPPORT, ar->wmi.svc_map)) &&
40466f6eb1bcSSriram R 	    ar->dfs_detector->region == NL80211_DFS_FCC) {
40476f6eb1bcSSriram R 		/* Consecutive radar indications need not be
40486f6eb1bcSSriram R 		 * sent to the firmware until we get confirmation
40496f6eb1bcSSriram R 		 * for the previous detected radar.
4050d6dfe25cSMarcin Rokicki 		 */
40516f6eb1bcSSriram R 		spin_lock_bh(&ar->data_lock);
40526f6eb1bcSSriram R 		if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_IDLE) {
40536f6eb1bcSSriram R 			spin_unlock_bh(&ar->data_lock);
40546f6eb1bcSSriram R 			return;
40556f6eb1bcSSriram R 		}
40566f6eb1bcSSriram R 		ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_INPROGRESS;
40576f6eb1bcSSriram R 		radar_info = &ar->last_radar_info;
40586f6eb1bcSSriram R 
40596f6eb1bcSSriram R 		radar_info->pri_min = rs.pri_min;
40606f6eb1bcSSriram R 		radar_info->pri_max = rs.pri_max;
40616f6eb1bcSSriram R 		radar_info->width_min = rs.width_min;
40626f6eb1bcSSriram R 		radar_info->width_max = rs.width_max;
40636f6eb1bcSSriram R 		/*TODO Find sidx_min and sidx_max */
40646f6eb1bcSSriram R 		radar_info->sidx_min = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX);
40656f6eb1bcSSriram R 		radar_info->sidx_max = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX);
40666f6eb1bcSSriram R 
40676f6eb1bcSSriram R 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
40686f6eb1bcSSriram R 			   "sending wmi radar found cmd pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n",
40696f6eb1bcSSriram R 			   radar_info->pri_min, radar_info->pri_max,
40706f6eb1bcSSriram R 			   radar_info->width_min, radar_info->width_max,
40716f6eb1bcSSriram R 			   radar_info->sidx_min, radar_info->sidx_max);
40726f6eb1bcSSriram R 		ieee80211_queue_work(ar->hw, &ar->radar_confirmation_work);
40736f6eb1bcSSriram R 		spin_unlock_bh(&ar->data_lock);
40747d9b40b4SMarek Puzyniak 		return;
40757d9b40b4SMarek Puzyniak 	}
40767d9b40b4SMarek Puzyniak 
40776f6eb1bcSSriram R radar_detected:
40786f6eb1bcSSriram R 	ath10k_radar_detected(ar);
40799702c686SJanusz Dziedzic }
40809702c686SJanusz Dziedzic 
40819702c686SJanusz Dziedzic static int ath10k_dfs_fft_report(struct ath10k *ar,
4082991adf71SRaja Mani 				 struct wmi_phyerr_ev_arg *phyerr,
40832332d0aeSMichal Kazior 				 const struct phyerr_fft_report *fftr,
40849702c686SJanusz Dziedzic 				 u64 tsf)
40859702c686SJanusz Dziedzic {
40869702c686SJanusz Dziedzic 	u32 reg0, reg1;
40879702c686SJanusz Dziedzic 	u8 rssi, peak_mag;
40889702c686SJanusz Dziedzic 
40899702c686SJanusz Dziedzic 	reg0 = __le32_to_cpu(fftr->reg0);
40909702c686SJanusz Dziedzic 	reg1 = __le32_to_cpu(fftr->reg1);
40912332d0aeSMichal Kazior 	rssi = phyerr->rssi_combined;
40929702c686SJanusz Dziedzic 
40937aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
40949702c686SJanusz Dziedzic 		   "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
40959702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB),
40969702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB),
40979702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX),
40989702c686SJanusz Dziedzic 		   MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX));
40997aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
41009702c686SJanusz Dziedzic 		   "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n",
41019702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB),
41029702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB),
41039702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG),
41049702c686SJanusz Dziedzic 		   MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB));
41059702c686SJanusz Dziedzic 
41069702c686SJanusz Dziedzic 	peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG);
41079702c686SJanusz Dziedzic 
41089702c686SJanusz Dziedzic 	/* false event detection */
41099702c686SJanusz Dziedzic 	if (rssi == DFS_RSSI_POSSIBLY_FALSE &&
41109702c686SJanusz Dziedzic 	    peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) {
41117aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
41129702c686SJanusz Dziedzic 		ATH10K_DFS_STAT_INC(ar, pulses_discarded);
41139702c686SJanusz Dziedzic 		return -EINVAL;
41149702c686SJanusz Dziedzic 	}
41159702c686SJanusz Dziedzic 
41169702c686SJanusz Dziedzic 	return 0;
41179702c686SJanusz Dziedzic }
41189702c686SJanusz Dziedzic 
41190226d602SMichal Kazior void ath10k_wmi_event_dfs(struct ath10k *ar,
4120991adf71SRaja Mani 			  struct wmi_phyerr_ev_arg *phyerr,
41219702c686SJanusz Dziedzic 			  u64 tsf)
41229702c686SJanusz Dziedzic {
41239702c686SJanusz Dziedzic 	int buf_len, tlv_len, res, i = 0;
41242332d0aeSMichal Kazior 	const struct phyerr_tlv *tlv;
41252332d0aeSMichal Kazior 	const struct phyerr_radar_report *rr;
41262332d0aeSMichal Kazior 	const struct phyerr_fft_report *fftr;
41272332d0aeSMichal Kazior 	const u8 *tlv_buf;
41289702c686SJanusz Dziedzic 
4129991adf71SRaja Mani 	buf_len = phyerr->buf_len;
41307aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
41319702c686SJanusz Dziedzic 		   "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
41322332d0aeSMichal Kazior 		   phyerr->phy_err_code, phyerr->rssi_combined,
4133991adf71SRaja Mani 		   phyerr->tsf_timestamp, tsf, buf_len);
41349702c686SJanusz Dziedzic 
41359702c686SJanusz Dziedzic 	/* Skip event if DFS disabled */
413697f2645fSMasahiro Yamada 	if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED))
41379702c686SJanusz Dziedzic 		return;
41389702c686SJanusz Dziedzic 
41399702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, pulses_total);
41409702c686SJanusz Dziedzic 
41419702c686SJanusz Dziedzic 	while (i < buf_len) {
41429702c686SJanusz Dziedzic 		if (i + sizeof(*tlv) > buf_len) {
41437aa7a72aSMichal Kazior 			ath10k_warn(ar, "too short buf for tlv header (%d)\n",
41447aa7a72aSMichal Kazior 				    i);
41459702c686SJanusz Dziedzic 			return;
41469702c686SJanusz Dziedzic 		}
41479702c686SJanusz Dziedzic 
41482332d0aeSMichal Kazior 		tlv = (struct phyerr_tlv *)&phyerr->buf[i];
41499702c686SJanusz Dziedzic 		tlv_len = __le16_to_cpu(tlv->len);
41502332d0aeSMichal Kazior 		tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
41517aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
41529702c686SJanusz Dziedzic 			   "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
41539702c686SJanusz Dziedzic 			   tlv_len, tlv->tag, tlv->sig);
41549702c686SJanusz Dziedzic 
41559702c686SJanusz Dziedzic 		switch (tlv->tag) {
41569702c686SJanusz Dziedzic 		case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY:
41579702c686SJanusz Dziedzic 			if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) {
41587aa7a72aSMichal Kazior 				ath10k_warn(ar, "too short radar pulse summary (%d)\n",
41599702c686SJanusz Dziedzic 					    i);
41609702c686SJanusz Dziedzic 				return;
41619702c686SJanusz Dziedzic 			}
41629702c686SJanusz Dziedzic 
41639702c686SJanusz Dziedzic 			rr = (struct phyerr_radar_report *)tlv_buf;
41642332d0aeSMichal Kazior 			ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
41659702c686SJanusz Dziedzic 			break;
41669702c686SJanusz Dziedzic 		case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
41679702c686SJanusz Dziedzic 			if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
41687aa7a72aSMichal Kazior 				ath10k_warn(ar, "too short fft report (%d)\n",
41697aa7a72aSMichal Kazior 					    i);
41709702c686SJanusz Dziedzic 				return;
41719702c686SJanusz Dziedzic 			}
41729702c686SJanusz Dziedzic 
41739702c686SJanusz Dziedzic 			fftr = (struct phyerr_fft_report *)tlv_buf;
41742332d0aeSMichal Kazior 			res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
41759702c686SJanusz Dziedzic 			if (res)
41769702c686SJanusz Dziedzic 				return;
41779702c686SJanusz Dziedzic 			break;
41789702c686SJanusz Dziedzic 		}
41799702c686SJanusz Dziedzic 
41809702c686SJanusz Dziedzic 		i += sizeof(*tlv) + tlv_len;
41819702c686SJanusz Dziedzic 	}
41829702c686SJanusz Dziedzic }
41839702c686SJanusz Dziedzic 
41840226d602SMichal Kazior void ath10k_wmi_event_spectral_scan(struct ath10k *ar,
4185991adf71SRaja Mani 				    struct wmi_phyerr_ev_arg *phyerr,
41869702c686SJanusz Dziedzic 				    u64 tsf)
41879702c686SJanusz Dziedzic {
4188855aed12SSimon Wunderlich 	int buf_len, tlv_len, res, i = 0;
4189855aed12SSimon Wunderlich 	struct phyerr_tlv *tlv;
41902332d0aeSMichal Kazior 	const void *tlv_buf;
41912332d0aeSMichal Kazior 	const struct phyerr_fft_report *fftr;
4192855aed12SSimon Wunderlich 	size_t fftr_len;
4193855aed12SSimon Wunderlich 
4194991adf71SRaja Mani 	buf_len = phyerr->buf_len;
4195855aed12SSimon Wunderlich 
4196855aed12SSimon Wunderlich 	while (i < buf_len) {
4197855aed12SSimon Wunderlich 		if (i + sizeof(*tlv) > buf_len) {
41987aa7a72aSMichal Kazior 			ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n",
4199855aed12SSimon Wunderlich 				    i);
4200855aed12SSimon Wunderlich 			return;
4201855aed12SSimon Wunderlich 		}
4202855aed12SSimon Wunderlich 
42032332d0aeSMichal Kazior 		tlv = (struct phyerr_tlv *)&phyerr->buf[i];
4204855aed12SSimon Wunderlich 		tlv_len = __le16_to_cpu(tlv->len);
42052332d0aeSMichal Kazior 		tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
4206855aed12SSimon Wunderlich 
4207855aed12SSimon Wunderlich 		if (i + sizeof(*tlv) + tlv_len > buf_len) {
42087aa7a72aSMichal Kazior 			ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
4209855aed12SSimon Wunderlich 				    i);
4210855aed12SSimon Wunderlich 			return;
4211855aed12SSimon Wunderlich 		}
4212855aed12SSimon Wunderlich 
4213855aed12SSimon Wunderlich 		switch (tlv->tag) {
4214855aed12SSimon Wunderlich 		case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
4215855aed12SSimon Wunderlich 			if (sizeof(*fftr) > tlv_len) {
42167aa7a72aSMichal Kazior 				ath10k_warn(ar, "failed to parse fft report at byte %d\n",
4217855aed12SSimon Wunderlich 					    i);
4218855aed12SSimon Wunderlich 				return;
4219855aed12SSimon Wunderlich 			}
4220855aed12SSimon Wunderlich 
4221855aed12SSimon Wunderlich 			fftr_len = tlv_len - sizeof(*fftr);
42222332d0aeSMichal Kazior 			fftr = tlv_buf;
42232332d0aeSMichal Kazior 			res = ath10k_spectral_process_fft(ar, phyerr,
4224855aed12SSimon Wunderlich 							  fftr, fftr_len,
4225855aed12SSimon Wunderlich 							  tsf);
4226855aed12SSimon Wunderlich 			if (res < 0) {
42273413e97dSKevin Darbyshire-Bryant 				ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
4228855aed12SSimon Wunderlich 					   res);
4229855aed12SSimon Wunderlich 				return;
4230855aed12SSimon Wunderlich 			}
4231855aed12SSimon Wunderlich 			break;
4232855aed12SSimon Wunderlich 		}
4233855aed12SSimon Wunderlich 
4234855aed12SSimon Wunderlich 		i += sizeof(*tlv) + tlv_len;
4235855aed12SSimon Wunderlich 	}
42369702c686SJanusz Dziedzic }
42379702c686SJanusz Dziedzic 
4238991adf71SRaja Mani static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar,
4239991adf71SRaja Mani 					    struct sk_buff *skb,
4240991adf71SRaja Mani 					    struct wmi_phyerr_hdr_arg *arg)
424132653cf1SMichal Kazior {
424232653cf1SMichal Kazior 	struct wmi_phyerr_event *ev = (void *)skb->data;
424332653cf1SMichal Kazior 
424432653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
424532653cf1SMichal Kazior 		return -EPROTO;
424632653cf1SMichal Kazior 
4247991adf71SRaja Mani 	arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs);
4248991adf71SRaja Mani 	arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
4249991adf71SRaja Mani 	arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
4250991adf71SRaja Mani 	arg->buf_len = skb->len - sizeof(*ev);
425132653cf1SMichal Kazior 	arg->phyerrs = ev->phyerrs;
425232653cf1SMichal Kazior 
425332653cf1SMichal Kazior 	return 0;
425432653cf1SMichal Kazior }
425532653cf1SMichal Kazior 
42562b0a2e0dSRaja Mani static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar,
42572b0a2e0dSRaja Mani 						 struct sk_buff *skb,
42582b0a2e0dSRaja Mani 						 struct wmi_phyerr_hdr_arg *arg)
42592b0a2e0dSRaja Mani {
42602b0a2e0dSRaja Mani 	struct wmi_10_4_phyerr_event *ev = (void *)skb->data;
42612b0a2e0dSRaja Mani 
42622b0a2e0dSRaja Mani 	if (skb->len < sizeof(*ev))
42632b0a2e0dSRaja Mani 		return -EPROTO;
42642b0a2e0dSRaja Mani 
42652b0a2e0dSRaja Mani 	/* 10.4 firmware always reports only one phyerr */
42662b0a2e0dSRaja Mani 	arg->num_phyerrs = 1;
42672b0a2e0dSRaja Mani 
42682b0a2e0dSRaja Mani 	arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
42692b0a2e0dSRaja Mani 	arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
42702b0a2e0dSRaja Mani 	arg->buf_len = skb->len;
42712b0a2e0dSRaja Mani 	arg->phyerrs = skb->data;
42722b0a2e0dSRaja Mani 
42732b0a2e0dSRaja Mani 	return 0;
42742b0a2e0dSRaja Mani }
42752b0a2e0dSRaja Mani 
4276991adf71SRaja Mani int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar,
4277991adf71SRaja Mani 				 const void *phyerr_buf,
4278991adf71SRaja Mani 				 int left_len,
4279991adf71SRaja Mani 				 struct wmi_phyerr_ev_arg *arg)
4280991adf71SRaja Mani {
4281991adf71SRaja Mani 	const struct wmi_phyerr *phyerr = phyerr_buf;
4282991adf71SRaja Mani 	int i;
4283991adf71SRaja Mani 
4284991adf71SRaja Mani 	if (left_len < sizeof(*phyerr)) {
4285ee92a209SRaja Mani 		ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
4286991adf71SRaja Mani 			    left_len, sizeof(*phyerr));
4287991adf71SRaja Mani 		return -EINVAL;
4288991adf71SRaja Mani 	}
4289991adf71SRaja Mani 
4290991adf71SRaja Mani 	arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
4291991adf71SRaja Mani 	arg->freq1 = __le16_to_cpu(phyerr->freq1);
4292991adf71SRaja Mani 	arg->freq2 = __le16_to_cpu(phyerr->freq2);
4293991adf71SRaja Mani 	arg->rssi_combined = phyerr->rssi_combined;
4294991adf71SRaja Mani 	arg->chan_width_mhz = phyerr->chan_width_mhz;
4295991adf71SRaja Mani 	arg->buf_len = __le32_to_cpu(phyerr->buf_len);
4296991adf71SRaja Mani 	arg->buf = phyerr->buf;
4297991adf71SRaja Mani 	arg->hdr_len = sizeof(*phyerr);
4298991adf71SRaja Mani 
4299991adf71SRaja Mani 	for (i = 0; i < 4; i++)
4300991adf71SRaja Mani 		arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
4301991adf71SRaja Mani 
4302991adf71SRaja Mani 	switch (phyerr->phy_err_code) {
4303991adf71SRaja Mani 	case PHY_ERROR_GEN_SPECTRAL_SCAN:
4304991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
4305991adf71SRaja Mani 		break;
4306991adf71SRaja Mani 	case PHY_ERROR_GEN_FALSE_RADAR_EXT:
4307991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT;
4308991adf71SRaja Mani 		break;
4309991adf71SRaja Mani 	case PHY_ERROR_GEN_RADAR:
4310991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_RADAR;
4311991adf71SRaja Mani 		break;
4312991adf71SRaja Mani 	default:
4313991adf71SRaja Mani 		arg->phy_err_code = PHY_ERROR_UNKNOWN;
4314991adf71SRaja Mani 		break;
4315991adf71SRaja Mani 	}
4316991adf71SRaja Mani 
4317991adf71SRaja Mani 	return 0;
4318991adf71SRaja Mani }
4319991adf71SRaja Mani 
43202b0a2e0dSRaja Mani static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar,
43212b0a2e0dSRaja Mani 					     const void *phyerr_buf,
43222b0a2e0dSRaja Mani 					     int left_len,
43232b0a2e0dSRaja Mani 					     struct wmi_phyerr_ev_arg *arg)
43242b0a2e0dSRaja Mani {
43252b0a2e0dSRaja Mani 	const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf;
43262b0a2e0dSRaja Mani 	u32 phy_err_mask;
43272b0a2e0dSRaja Mani 	int i;
43282b0a2e0dSRaja Mani 
43292b0a2e0dSRaja Mani 	if (left_len < sizeof(*phyerr)) {
4330ee92a209SRaja Mani 		ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
43312b0a2e0dSRaja Mani 			    left_len, sizeof(*phyerr));
43322b0a2e0dSRaja Mani 		return -EINVAL;
43332b0a2e0dSRaja Mani 	}
43342b0a2e0dSRaja Mani 
43352b0a2e0dSRaja Mani 	arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
43362b0a2e0dSRaja Mani 	arg->freq1 = __le16_to_cpu(phyerr->freq1);
43372b0a2e0dSRaja Mani 	arg->freq2 = __le16_to_cpu(phyerr->freq2);
43382b0a2e0dSRaja Mani 	arg->rssi_combined = phyerr->rssi_combined;
43392b0a2e0dSRaja Mani 	arg->chan_width_mhz = phyerr->chan_width_mhz;
43402b0a2e0dSRaja Mani 	arg->buf_len = __le32_to_cpu(phyerr->buf_len);
43412b0a2e0dSRaja Mani 	arg->buf = phyerr->buf;
43422b0a2e0dSRaja Mani 	arg->hdr_len = sizeof(*phyerr);
43432b0a2e0dSRaja Mani 
43442b0a2e0dSRaja Mani 	for (i = 0; i < 4; i++)
43452b0a2e0dSRaja Mani 		arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
43462b0a2e0dSRaja Mani 
43472b0a2e0dSRaja Mani 	phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]);
43482b0a2e0dSRaja Mani 
43492b0a2e0dSRaja Mani 	if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK)
43502b0a2e0dSRaja Mani 		arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
43512b0a2e0dSRaja Mani 	else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK)
43522b0a2e0dSRaja Mani 		arg->phy_err_code = PHY_ERROR_RADAR;
43532b0a2e0dSRaja Mani 	else
43542b0a2e0dSRaja Mani 		arg->phy_err_code = PHY_ERROR_UNKNOWN;
43552b0a2e0dSRaja Mani 
43562b0a2e0dSRaja Mani 	return 0;
43572b0a2e0dSRaja Mani }
43582b0a2e0dSRaja Mani 
43590226d602SMichal Kazior void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
43605e3dd157SKalle Valo {
4361991adf71SRaja Mani 	struct wmi_phyerr_hdr_arg hdr_arg = {};
4362991adf71SRaja Mani 	struct wmi_phyerr_ev_arg phyerr_arg = {};
4363991adf71SRaja Mani 	const void *phyerr;
43649702c686SJanusz Dziedzic 	u32 count, i, buf_len, phy_err_code;
43659702c686SJanusz Dziedzic 	u64 tsf;
436632653cf1SMichal Kazior 	int left_len, ret;
43679702c686SJanusz Dziedzic 
43689702c686SJanusz Dziedzic 	ATH10K_DFS_STAT_INC(ar, phy_errors);
43699702c686SJanusz Dziedzic 
4370991adf71SRaja Mani 	ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
437132653cf1SMichal Kazior 	if (ret) {
4372991adf71SRaja Mani 		ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret);
43739702c686SJanusz Dziedzic 		return;
43749702c686SJanusz Dziedzic 	}
43759702c686SJanusz Dziedzic 
43769702c686SJanusz Dziedzic 	/* Check number of included events */
4377991adf71SRaja Mani 	count = hdr_arg.num_phyerrs;
43789702c686SJanusz Dziedzic 
4379991adf71SRaja Mani 	left_len = hdr_arg.buf_len;
4380991adf71SRaja Mani 
4381991adf71SRaja Mani 	tsf = hdr_arg.tsf_u32;
43829702c686SJanusz Dziedzic 	tsf <<= 32;
4383991adf71SRaja Mani 	tsf |= hdr_arg.tsf_l32;
43849702c686SJanusz Dziedzic 
43857aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
43869702c686SJanusz Dziedzic 		   "wmi event phyerr count %d tsf64 0x%llX\n",
43879702c686SJanusz Dziedzic 		   count, tsf);
43889702c686SJanusz Dziedzic 
4389991adf71SRaja Mani 	phyerr = hdr_arg.phyerrs;
43909702c686SJanusz Dziedzic 	for (i = 0; i < count; i++) {
4391991adf71SRaja Mani 		ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
4392991adf71SRaja Mani 		if (ret) {
4393991adf71SRaja Mani 			ath10k_warn(ar, "failed to parse phyerr event (%d)\n",
43947aa7a72aSMichal Kazior 				    i);
43959702c686SJanusz Dziedzic 			return;
43969702c686SJanusz Dziedzic 		}
43979702c686SJanusz Dziedzic 
4398991adf71SRaja Mani 		left_len -= phyerr_arg.hdr_len;
4399991adf71SRaja Mani 		buf_len = phyerr_arg.buf_len;
4400991adf71SRaja Mani 		phy_err_code = phyerr_arg.phy_err_code;
44019702c686SJanusz Dziedzic 
44029702c686SJanusz Dziedzic 		if (left_len < buf_len) {
44037aa7a72aSMichal Kazior 			ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
44049702c686SJanusz Dziedzic 			return;
44059702c686SJanusz Dziedzic 		}
44069702c686SJanusz Dziedzic 
44079702c686SJanusz Dziedzic 		left_len -= buf_len;
44089702c686SJanusz Dziedzic 
44099702c686SJanusz Dziedzic 		switch (phy_err_code) {
44109702c686SJanusz Dziedzic 		case PHY_ERROR_RADAR:
4411991adf71SRaja Mani 			ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
44129702c686SJanusz Dziedzic 			break;
44139702c686SJanusz Dziedzic 		case PHY_ERROR_SPECTRAL_SCAN:
4414991adf71SRaja Mani 			ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
44159702c686SJanusz Dziedzic 			break;
44169702c686SJanusz Dziedzic 		case PHY_ERROR_FALSE_RADAR_EXT:
4417991adf71SRaja Mani 			ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4418991adf71SRaja Mani 			ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
44199702c686SJanusz Dziedzic 			break;
44209702c686SJanusz Dziedzic 		default:
44219702c686SJanusz Dziedzic 			break;
44229702c686SJanusz Dziedzic 		}
44239702c686SJanusz Dziedzic 
4424991adf71SRaja Mani 		phyerr = phyerr + phyerr_arg.hdr_len + buf_len;
44259702c686SJanusz Dziedzic 	}
44265e3dd157SKalle Valo }
44275e3dd157SKalle Valo 
44286f6eb1bcSSriram R static int
44296f6eb1bcSSriram R ath10k_wmi_10_4_op_pull_dfs_status_ev(struct ath10k *ar, struct sk_buff *skb,
44306f6eb1bcSSriram R 				      struct wmi_dfs_status_ev_arg *arg)
44316f6eb1bcSSriram R {
44326f6eb1bcSSriram R 	struct wmi_dfs_status_ev_arg *ev = (void *)skb->data;
44336f6eb1bcSSriram R 
44346f6eb1bcSSriram R 	if (skb->len < sizeof(*ev))
44356f6eb1bcSSriram R 		return -EPROTO;
44366f6eb1bcSSriram R 
44376f6eb1bcSSriram R 	arg->status = ev->status;
44386f6eb1bcSSriram R 
44396f6eb1bcSSriram R 	return 0;
44406f6eb1bcSSriram R }
44416f6eb1bcSSriram R 
44426f6eb1bcSSriram R static void
44436f6eb1bcSSriram R ath10k_wmi_event_dfs_status_check(struct ath10k *ar, struct sk_buff *skb)
44446f6eb1bcSSriram R {
44456f6eb1bcSSriram R 	struct wmi_dfs_status_ev_arg status_arg = {};
44466f6eb1bcSSriram R 	int ret;
44476f6eb1bcSSriram R 
44486f6eb1bcSSriram R 	ret = ath10k_wmi_pull_dfs_status(ar, skb, &status_arg);
44496f6eb1bcSSriram R 
44506f6eb1bcSSriram R 	if (ret) {
44516f6eb1bcSSriram R 		ath10k_warn(ar, "failed to parse dfs status event: %d\n", ret);
44526f6eb1bcSSriram R 		return;
44536f6eb1bcSSriram R 	}
44546f6eb1bcSSriram R 
44556f6eb1bcSSriram R 	ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
44566f6eb1bcSSriram R 		   "dfs status event received from fw: %d\n",
44576f6eb1bcSSriram R 		   status_arg.status);
44586f6eb1bcSSriram R 
44596f6eb1bcSSriram R 	/* Even in case of radar detection failure we follow the same
44606f6eb1bcSSriram R 	 * behaviour as if radar is detected i.e to switch to a different
44616f6eb1bcSSriram R 	 * channel.
44626f6eb1bcSSriram R 	 */
44636f6eb1bcSSriram R 	if (status_arg.status == WMI_HW_RADAR_DETECTED ||
44646f6eb1bcSSriram R 	    status_arg.status == WMI_RADAR_DETECTION_FAIL)
44656f6eb1bcSSriram R 		ath10k_radar_detected(ar);
44666f6eb1bcSSriram R 	complete(&ar->wmi.radar_confirm);
44676f6eb1bcSSriram R }
44686f6eb1bcSSriram R 
44690226d602SMichal Kazior void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
44705e3dd157SKalle Valo {
4471c1a4654aSMichal Kazior 	struct wmi_roam_ev_arg arg = {};
4472c1a4654aSMichal Kazior 	int ret;
4473c1a4654aSMichal Kazior 	u32 vdev_id;
4474c1a4654aSMichal Kazior 	u32 reason;
4475c1a4654aSMichal Kazior 	s32 rssi;
4476c1a4654aSMichal Kazior 
4477c1a4654aSMichal Kazior 	ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
4478c1a4654aSMichal Kazior 	if (ret) {
4479c1a4654aSMichal Kazior 		ath10k_warn(ar, "failed to parse roam event: %d\n", ret);
4480c1a4654aSMichal Kazior 		return;
4481c1a4654aSMichal Kazior 	}
4482c1a4654aSMichal Kazior 
4483c1a4654aSMichal Kazior 	vdev_id = __le32_to_cpu(arg.vdev_id);
4484c1a4654aSMichal Kazior 	reason = __le32_to_cpu(arg.reason);
4485c1a4654aSMichal Kazior 	rssi = __le32_to_cpu(arg.rssi);
4486c1a4654aSMichal Kazior 	rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT;
4487c1a4654aSMichal Kazior 
4488c1a4654aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
4489c1a4654aSMichal Kazior 		   "wmi roam event vdev %u reason 0x%08x rssi %d\n",
4490c1a4654aSMichal Kazior 		   vdev_id, reason, rssi);
4491c1a4654aSMichal Kazior 
4492c1a4654aSMichal Kazior 	if (reason >= WMI_ROAM_REASON_MAX)
4493c1a4654aSMichal Kazior 		ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n",
4494c1a4654aSMichal Kazior 			    reason, vdev_id);
4495c1a4654aSMichal Kazior 
4496c1a4654aSMichal Kazior 	switch (reason) {
4497c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_BEACON_MISS:
4498cc9904e6SMichal Kazior 		ath10k_mac_handle_beacon_miss(ar, vdev_id);
4499cc9904e6SMichal Kazior 		break;
4500cc9904e6SMichal Kazior 	case WMI_ROAM_REASON_BETTER_AP:
4501c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_LOW_RSSI:
4502c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_SUITABLE_AP_FOUND:
4503c1a4654aSMichal Kazior 	case WMI_ROAM_REASON_HO_FAILED:
4504c1a4654aSMichal Kazior 		ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n",
4505c1a4654aSMichal Kazior 			    reason, vdev_id);
4506c1a4654aSMichal Kazior 		break;
4507c1a4654aSMichal Kazior 	}
45085e3dd157SKalle Valo }
45095e3dd157SKalle Valo 
45100226d602SMichal Kazior void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb)
45115e3dd157SKalle Valo {
45127aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
45135e3dd157SKalle Valo }
45145e3dd157SKalle Valo 
45150226d602SMichal Kazior void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb)
45165e3dd157SKalle Valo {
45172fe5288cSKalle Valo 	char buf[101], c;
45182fe5288cSKalle Valo 	int i;
45192fe5288cSKalle Valo 
45202fe5288cSKalle Valo 	for (i = 0; i < sizeof(buf) - 1; i++) {
45212fe5288cSKalle Valo 		if (i >= skb->len)
45222fe5288cSKalle Valo 			break;
45232fe5288cSKalle Valo 
45242fe5288cSKalle Valo 		c = skb->data[i];
45252fe5288cSKalle Valo 
45262fe5288cSKalle Valo 		if (c == '\0')
45272fe5288cSKalle Valo 			break;
45282fe5288cSKalle Valo 
45292fe5288cSKalle Valo 		if (isascii(c) && isprint(c))
45302fe5288cSKalle Valo 			buf[i] = c;
45312fe5288cSKalle Valo 		else
45322fe5288cSKalle Valo 			buf[i] = '.';
45332fe5288cSKalle Valo 	}
45342fe5288cSKalle Valo 
45352fe5288cSKalle Valo 	if (i == sizeof(buf) - 1)
45367aa7a72aSMichal Kazior 		ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len);
45372fe5288cSKalle Valo 
45382fe5288cSKalle Valo 	/* for some reason the debug prints end with \n, remove that */
45392fe5288cSKalle Valo 	if (skb->data[i - 1] == '\n')
45402fe5288cSKalle Valo 		i--;
45412fe5288cSKalle Valo 
45422fe5288cSKalle Valo 	/* the last byte is always reserved for the null character */
45432fe5288cSKalle Valo 	buf[i] = '\0';
45442fe5288cSKalle Valo 
45453be004c3SBen Greear 	ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
45465e3dd157SKalle Valo }
45475e3dd157SKalle Valo 
45480226d602SMichal Kazior void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
45495e3dd157SKalle Valo {
45507aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
45515e3dd157SKalle Valo }
45525e3dd157SKalle Valo 
45530226d602SMichal Kazior void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb)
45545e3dd157SKalle Valo {
45557aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
45565e3dd157SKalle Valo }
45575e3dd157SKalle Valo 
45580226d602SMichal Kazior void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
45595e3dd157SKalle Valo 					     struct sk_buff *skb)
45605e3dd157SKalle Valo {
45617aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
45625e3dd157SKalle Valo }
45635e3dd157SKalle Valo 
45640226d602SMichal Kazior void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
45655e3dd157SKalle Valo 					     struct sk_buff *skb)
45665e3dd157SKalle Valo {
45677aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
45685e3dd157SKalle Valo }
45695e3dd157SKalle Valo 
45700226d602SMichal Kazior void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb)
45715e3dd157SKalle Valo {
45727aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
45735e3dd157SKalle Valo }
45745e3dd157SKalle Valo 
45750226d602SMichal Kazior void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb)
45765e3dd157SKalle Valo {
45775fd3ac3cSJanusz Dziedzic 	struct wmi_wow_ev_arg ev = {};
45785fd3ac3cSJanusz Dziedzic 	int ret;
45795fd3ac3cSJanusz Dziedzic 
45805fd3ac3cSJanusz Dziedzic 	complete(&ar->wow.wakeup_completed);
45815fd3ac3cSJanusz Dziedzic 
45825fd3ac3cSJanusz Dziedzic 	ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
45835fd3ac3cSJanusz Dziedzic 	if (ret) {
45845fd3ac3cSJanusz Dziedzic 		ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret);
45855fd3ac3cSJanusz Dziedzic 		return;
45865fd3ac3cSJanusz Dziedzic 	}
45875fd3ac3cSJanusz Dziedzic 
45885fd3ac3cSJanusz Dziedzic 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
45895fd3ac3cSJanusz Dziedzic 		   wow_reason(ev.wake_reason));
45905e3dd157SKalle Valo }
45915e3dd157SKalle Valo 
45920226d602SMichal Kazior void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb)
45935e3dd157SKalle Valo {
45947aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
45955e3dd157SKalle Valo }
45965e3dd157SKalle Valo 
459729542666SMaharaja Kennadyrajan static u8 ath10k_tpc_config_get_rate(struct ath10k *ar,
459829542666SMaharaja Kennadyrajan 				     struct wmi_pdev_tpc_config_event *ev,
459929542666SMaharaja Kennadyrajan 				     u32 rate_idx, u32 num_chains,
460029542666SMaharaja Kennadyrajan 				     u32 rate_code, u8 type)
460129542666SMaharaja Kennadyrajan {
460229542666SMaharaja Kennadyrajan 	u8 tpc, num_streams, preamble, ch, stm_idx;
460329542666SMaharaja Kennadyrajan 
460429542666SMaharaja Kennadyrajan 	num_streams = ATH10K_HW_NSS(rate_code);
460529542666SMaharaja Kennadyrajan 	preamble = ATH10K_HW_PREAMBLE(rate_code);
460629542666SMaharaja Kennadyrajan 	ch = num_chains - 1;
460729542666SMaharaja Kennadyrajan 
460829542666SMaharaja Kennadyrajan 	tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]);
460929542666SMaharaja Kennadyrajan 
461029542666SMaharaja Kennadyrajan 	if (__le32_to_cpu(ev->num_tx_chain) <= 1)
461129542666SMaharaja Kennadyrajan 		goto out;
461229542666SMaharaja Kennadyrajan 
461329542666SMaharaja Kennadyrajan 	if (preamble == WMI_RATE_PREAMBLE_CCK)
461429542666SMaharaja Kennadyrajan 		goto out;
461529542666SMaharaja Kennadyrajan 
461629542666SMaharaja Kennadyrajan 	stm_idx = num_streams - 1;
461729542666SMaharaja Kennadyrajan 	if (num_chains <= num_streams)
461829542666SMaharaja Kennadyrajan 		goto out;
461929542666SMaharaja Kennadyrajan 
462029542666SMaharaja Kennadyrajan 	switch (type) {
462129542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_STBC:
462229542666SMaharaja Kennadyrajan 		tpc = min_t(u8, tpc,
462329542666SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]);
462429542666SMaharaja Kennadyrajan 		break;
462529542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_TXBF:
462629542666SMaharaja Kennadyrajan 		tpc = min_t(u8, tpc,
462729542666SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]);
462829542666SMaharaja Kennadyrajan 		break;
462929542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_CDD:
463029542666SMaharaja Kennadyrajan 		tpc = min_t(u8, tpc,
463129542666SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]);
463229542666SMaharaja Kennadyrajan 		break;
463329542666SMaharaja Kennadyrajan 	default:
463429542666SMaharaja Kennadyrajan 		ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type);
463529542666SMaharaja Kennadyrajan 		tpc = 0;
463629542666SMaharaja Kennadyrajan 		break;
463729542666SMaharaja Kennadyrajan 	}
463829542666SMaharaja Kennadyrajan 
463929542666SMaharaja Kennadyrajan out:
464029542666SMaharaja Kennadyrajan 	return tpc;
464129542666SMaharaja Kennadyrajan }
464229542666SMaharaja Kennadyrajan 
464329542666SMaharaja Kennadyrajan static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
464429542666SMaharaja Kennadyrajan 					  struct wmi_pdev_tpc_config_event *ev,
464529542666SMaharaja Kennadyrajan 					  struct ath10k_tpc_stats *tpc_stats,
464629542666SMaharaja Kennadyrajan 					  u8 *rate_code, u16 *pream_table, u8 type)
464729542666SMaharaja Kennadyrajan {
464829542666SMaharaja Kennadyrajan 	u32 i, j, pream_idx, flags;
464929542666SMaharaja Kennadyrajan 	u8 tpc[WMI_TPC_TX_N_CHAIN];
465029542666SMaharaja Kennadyrajan 	char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
465129542666SMaharaja Kennadyrajan 	char buff[WMI_TPC_BUF_SIZE];
465229542666SMaharaja Kennadyrajan 
465329542666SMaharaja Kennadyrajan 	flags = __le32_to_cpu(ev->flags);
465429542666SMaharaja Kennadyrajan 
465529542666SMaharaja Kennadyrajan 	switch (type) {
465629542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_CDD:
465729542666SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
465829542666SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
465929542666SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
466029542666SMaharaja Kennadyrajan 			return;
466129542666SMaharaja Kennadyrajan 		}
466229542666SMaharaja Kennadyrajan 		break;
466329542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_STBC:
466429542666SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
466529542666SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
466629542666SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
466729542666SMaharaja Kennadyrajan 			return;
466829542666SMaharaja Kennadyrajan 		}
466929542666SMaharaja Kennadyrajan 		break;
467029542666SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_TXBF:
467129542666SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
467229542666SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
467329542666SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
467429542666SMaharaja Kennadyrajan 			return;
467529542666SMaharaja Kennadyrajan 		}
467629542666SMaharaja Kennadyrajan 		break;
467729542666SMaharaja Kennadyrajan 	default:
467829542666SMaharaja Kennadyrajan 		ath10k_dbg(ar, ATH10K_DBG_WMI,
467929542666SMaharaja Kennadyrajan 			   "invalid table type in wmi tpc event: %d\n", type);
468029542666SMaharaja Kennadyrajan 		return;
468129542666SMaharaja Kennadyrajan 	}
468229542666SMaharaja Kennadyrajan 
468329542666SMaharaja Kennadyrajan 	pream_idx = 0;
468429542666SMaharaja Kennadyrajan 	for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
468529542666SMaharaja Kennadyrajan 		memset(tpc_value, 0, sizeof(tpc_value));
468629542666SMaharaja Kennadyrajan 		memset(buff, 0, sizeof(buff));
468729542666SMaharaja Kennadyrajan 		if (i == pream_table[pream_idx])
468829542666SMaharaja Kennadyrajan 			pream_idx++;
468929542666SMaharaja Kennadyrajan 
469029542666SMaharaja Kennadyrajan 		for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
469129542666SMaharaja Kennadyrajan 			if (j >= __le32_to_cpu(ev->num_tx_chain))
469229542666SMaharaja Kennadyrajan 				break;
469329542666SMaharaja Kennadyrajan 
469429542666SMaharaja Kennadyrajan 			tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
469529542666SMaharaja Kennadyrajan 							    rate_code[i],
469629542666SMaharaja Kennadyrajan 							    type);
469729542666SMaharaja Kennadyrajan 			snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
46986707ba01SArnd Bergmann 			strlcat(tpc_value, buff, sizeof(tpc_value));
469929542666SMaharaja Kennadyrajan 		}
470029542666SMaharaja Kennadyrajan 		tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
470129542666SMaharaja Kennadyrajan 		tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
470229542666SMaharaja Kennadyrajan 		memcpy(tpc_stats->tpc_table[type].tpc_value[i],
470329542666SMaharaja Kennadyrajan 		       tpc_value, sizeof(tpc_value));
470429542666SMaharaja Kennadyrajan 	}
470529542666SMaharaja Kennadyrajan }
470629542666SMaharaja Kennadyrajan 
4707bc64d052SMaharaja Kennadyrajan void ath10k_wmi_tpc_config_get_rate_code(u8 *rate_code, u16 *pream_table,
4708bc64d052SMaharaja Kennadyrajan 					 u32 num_tx_chain)
47095e3dd157SKalle Valo {
4710bc64d052SMaharaja Kennadyrajan 	u32 i, j, pream_idx;
4711bc64d052SMaharaja Kennadyrajan 	u8 rate_idx;
471229542666SMaharaja Kennadyrajan 
471329542666SMaharaja Kennadyrajan 	/* Create the rate code table based on the chains supported */
471429542666SMaharaja Kennadyrajan 	rate_idx = 0;
471529542666SMaharaja Kennadyrajan 	pream_idx = 0;
471629542666SMaharaja Kennadyrajan 
471729542666SMaharaja Kennadyrajan 	/* Fill CCK rate code */
471829542666SMaharaja Kennadyrajan 	for (i = 0; i < 4; i++) {
471929542666SMaharaja Kennadyrajan 		rate_code[rate_idx] =
472029542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK);
472129542666SMaharaja Kennadyrajan 		rate_idx++;
472229542666SMaharaja Kennadyrajan 	}
472329542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
472429542666SMaharaja Kennadyrajan 	pream_idx++;
472529542666SMaharaja Kennadyrajan 
472629542666SMaharaja Kennadyrajan 	/* Fill OFDM rate code */
472729542666SMaharaja Kennadyrajan 	for (i = 0; i < 8; i++) {
472829542666SMaharaja Kennadyrajan 		rate_code[rate_idx] =
472929542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM);
473029542666SMaharaja Kennadyrajan 		rate_idx++;
473129542666SMaharaja Kennadyrajan 	}
473229542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
473329542666SMaharaja Kennadyrajan 	pream_idx++;
473429542666SMaharaja Kennadyrajan 
473529542666SMaharaja Kennadyrajan 	/* Fill HT20 rate code */
473629542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
473729542666SMaharaja Kennadyrajan 		for (j = 0; j < 8; j++) {
473829542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
473929542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
474029542666SMaharaja Kennadyrajan 			rate_idx++;
474129542666SMaharaja Kennadyrajan 		}
474229542666SMaharaja Kennadyrajan 	}
474329542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
474429542666SMaharaja Kennadyrajan 	pream_idx++;
474529542666SMaharaja Kennadyrajan 
474629542666SMaharaja Kennadyrajan 	/* Fill HT40 rate code */
474729542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
474829542666SMaharaja Kennadyrajan 		for (j = 0; j < 8; j++) {
474929542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
475029542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
475129542666SMaharaja Kennadyrajan 			rate_idx++;
475229542666SMaharaja Kennadyrajan 		}
475329542666SMaharaja Kennadyrajan 	}
475429542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
475529542666SMaharaja Kennadyrajan 	pream_idx++;
475629542666SMaharaja Kennadyrajan 
475729542666SMaharaja Kennadyrajan 	/* Fill VHT20 rate code */
4758bc64d052SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
475929542666SMaharaja Kennadyrajan 		for (j = 0; j < 10; j++) {
476029542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
476129542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
476229542666SMaharaja Kennadyrajan 			rate_idx++;
476329542666SMaharaja Kennadyrajan 		}
476429542666SMaharaja Kennadyrajan 	}
476529542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
476629542666SMaharaja Kennadyrajan 	pream_idx++;
476729542666SMaharaja Kennadyrajan 
476829542666SMaharaja Kennadyrajan 	/* Fill VHT40 rate code */
476929542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
477029542666SMaharaja Kennadyrajan 		for (j = 0; j < 10; j++) {
477129542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
477229542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
477329542666SMaharaja Kennadyrajan 			rate_idx++;
477429542666SMaharaja Kennadyrajan 		}
477529542666SMaharaja Kennadyrajan 	}
477629542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
477729542666SMaharaja Kennadyrajan 	pream_idx++;
477829542666SMaharaja Kennadyrajan 
477929542666SMaharaja Kennadyrajan 	/* Fill VHT80 rate code */
478029542666SMaharaja Kennadyrajan 	for (i = 0; i < num_tx_chain; i++) {
478129542666SMaharaja Kennadyrajan 		for (j = 0; j < 10; j++) {
478229542666SMaharaja Kennadyrajan 			rate_code[rate_idx] =
478329542666SMaharaja Kennadyrajan 			ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
478429542666SMaharaja Kennadyrajan 			rate_idx++;
478529542666SMaharaja Kennadyrajan 		}
478629542666SMaharaja Kennadyrajan 	}
478729542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = rate_idx;
478829542666SMaharaja Kennadyrajan 	pream_idx++;
478929542666SMaharaja Kennadyrajan 
479029542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
479129542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
479229542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
479329542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
479429542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
479529542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
479629542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
479729542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
479829542666SMaharaja Kennadyrajan 	rate_code[rate_idx++] =
479929542666SMaharaja Kennadyrajan 		ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
480029542666SMaharaja Kennadyrajan 
480129542666SMaharaja Kennadyrajan 	pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END;
4802bc64d052SMaharaja Kennadyrajan }
4803bc64d052SMaharaja Kennadyrajan 
4804bc64d052SMaharaja Kennadyrajan void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb)
4805bc64d052SMaharaja Kennadyrajan {
4806bc64d052SMaharaja Kennadyrajan 	u32 num_tx_chain;
4807bc64d052SMaharaja Kennadyrajan 	u8 rate_code[WMI_TPC_RATE_MAX];
4808bc64d052SMaharaja Kennadyrajan 	u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
4809bc64d052SMaharaja Kennadyrajan 	struct wmi_pdev_tpc_config_event *ev;
4810bc64d052SMaharaja Kennadyrajan 	struct ath10k_tpc_stats *tpc_stats;
4811bc64d052SMaharaja Kennadyrajan 
4812bc64d052SMaharaja Kennadyrajan 	ev = (struct wmi_pdev_tpc_config_event *)skb->data;
4813bc64d052SMaharaja Kennadyrajan 
4814bc64d052SMaharaja Kennadyrajan 	num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4815bc64d052SMaharaja Kennadyrajan 
48164b190675STamizh Chelvam 	if (num_tx_chain > WMI_TPC_TX_N_CHAIN) {
48174b190675STamizh Chelvam 		ath10k_warn(ar, "number of tx chain is %d greater than TPC configured tx chain %d\n",
48184b190675STamizh Chelvam 			    num_tx_chain, WMI_TPC_TX_N_CHAIN);
48194b190675STamizh Chelvam 		return;
48204b190675STamizh Chelvam 	}
48214b190675STamizh Chelvam 
4822260e629bSColin Ian King 	tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
4823260e629bSColin Ian King 	if (!tpc_stats)
4824260e629bSColin Ian King 		return;
4825260e629bSColin Ian King 
4826bc64d052SMaharaja Kennadyrajan 	ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table,
4827bc64d052SMaharaja Kennadyrajan 					    num_tx_chain);
482829542666SMaharaja Kennadyrajan 
482929542666SMaharaja Kennadyrajan 	tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
483029542666SMaharaja Kennadyrajan 	tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
483129542666SMaharaja Kennadyrajan 	tpc_stats->ctl = __le32_to_cpu(ev->ctl);
483229542666SMaharaja Kennadyrajan 	tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
483329542666SMaharaja Kennadyrajan 	tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
483429542666SMaharaja Kennadyrajan 	tpc_stats->twice_antenna_reduction =
483529542666SMaharaja Kennadyrajan 		__le32_to_cpu(ev->twice_antenna_reduction);
483629542666SMaharaja Kennadyrajan 	tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
483729542666SMaharaja Kennadyrajan 	tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
483829542666SMaharaja Kennadyrajan 	tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
483929542666SMaharaja Kennadyrajan 	tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
484029542666SMaharaja Kennadyrajan 
484129542666SMaharaja Kennadyrajan 	ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
484229542666SMaharaja Kennadyrajan 				      rate_code, pream_table,
484329542666SMaharaja Kennadyrajan 				      WMI_TPC_TABLE_TYPE_CDD);
484429542666SMaharaja Kennadyrajan 	ath10k_tpc_config_disp_tables(ar, ev,  tpc_stats,
484529542666SMaharaja Kennadyrajan 				      rate_code, pream_table,
484629542666SMaharaja Kennadyrajan 				      WMI_TPC_TABLE_TYPE_STBC);
484729542666SMaharaja Kennadyrajan 	ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
484829542666SMaharaja Kennadyrajan 				      rate_code, pream_table,
484929542666SMaharaja Kennadyrajan 				      WMI_TPC_TABLE_TYPE_TXBF);
485029542666SMaharaja Kennadyrajan 
485129542666SMaharaja Kennadyrajan 	ath10k_debug_tpc_stats_process(ar, tpc_stats);
485229542666SMaharaja Kennadyrajan 
485329542666SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
485429542666SMaharaja 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",
485529542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->chan_freq),
485629542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->phy_mode),
485729542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->ctl),
485829542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->reg_domain),
485929542666SMaharaja Kennadyrajan 		   a_sle32_to_cpu(ev->twice_antenna_gain),
486029542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->twice_antenna_reduction),
486129542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->power_limit),
486229542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->twice_max_rd_power) / 2,
486329542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->num_tx_chain),
486429542666SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->rate_max));
48655e3dd157SKalle Valo }
48665e3dd157SKalle Valo 
4867bc64d052SMaharaja Kennadyrajan static u8
4868bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_final_get_rate(struct ath10k *ar,
4869bc64d052SMaharaja Kennadyrajan 			      struct wmi_pdev_tpc_final_table_event *ev,
4870bc64d052SMaharaja Kennadyrajan 			      u32 rate_idx, u32 num_chains,
4871bc64d052SMaharaja Kennadyrajan 			      u32 rate_code, u8 type, u32 pream_idx)
4872bc64d052SMaharaja Kennadyrajan {
4873bc64d052SMaharaja Kennadyrajan 	u8 tpc, num_streams, preamble, ch, stm_idx;
4874bc64d052SMaharaja Kennadyrajan 	s8 pow_agcdd, pow_agstbc, pow_agtxbf;
4875bc64d052SMaharaja Kennadyrajan 	int pream;
4876bc64d052SMaharaja Kennadyrajan 
4877bc64d052SMaharaja Kennadyrajan 	num_streams = ATH10K_HW_NSS(rate_code);
4878bc64d052SMaharaja Kennadyrajan 	preamble = ATH10K_HW_PREAMBLE(rate_code);
4879bc64d052SMaharaja Kennadyrajan 	ch = num_chains - 1;
4880bc64d052SMaharaja Kennadyrajan 	stm_idx = num_streams - 1;
4881bc64d052SMaharaja Kennadyrajan 	pream = -1;
4882bc64d052SMaharaja Kennadyrajan 
4883bc64d052SMaharaja Kennadyrajan 	if (__le32_to_cpu(ev->chan_freq) <= 2483) {
4884bc64d052SMaharaja Kennadyrajan 		switch (pream_idx) {
4885bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_CCK:
4886bc64d052SMaharaja Kennadyrajan 			pream = 0;
4887bc64d052SMaharaja Kennadyrajan 			break;
4888bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_OFDM:
4889bc64d052SMaharaja Kennadyrajan 			pream = 1;
4890bc64d052SMaharaja Kennadyrajan 			break;
4891bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_HT20:
4892bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_VHT20:
4893bc64d052SMaharaja Kennadyrajan 			pream = 2;
4894bc64d052SMaharaja Kennadyrajan 			break;
4895bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_HT40:
4896bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_VHT40:
4897bc64d052SMaharaja Kennadyrajan 			pream = 3;
4898bc64d052SMaharaja Kennadyrajan 			break;
4899bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_2GHZ_VHT80:
4900bc64d052SMaharaja Kennadyrajan 			pream = 4;
4901bc64d052SMaharaja Kennadyrajan 			break;
4902bc64d052SMaharaja Kennadyrajan 		default:
4903bc64d052SMaharaja Kennadyrajan 			pream = -1;
4904bc64d052SMaharaja Kennadyrajan 			break;
4905bc64d052SMaharaja Kennadyrajan 		}
4906bc64d052SMaharaja Kennadyrajan 	}
4907bc64d052SMaharaja Kennadyrajan 
4908bc64d052SMaharaja Kennadyrajan 	if (__le32_to_cpu(ev->chan_freq) >= 5180) {
4909bc64d052SMaharaja Kennadyrajan 		switch (pream_idx) {
4910bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_OFDM:
4911bc64d052SMaharaja Kennadyrajan 			pream = 0;
4912bc64d052SMaharaja Kennadyrajan 			break;
4913bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_HT20:
4914bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_VHT20:
4915bc64d052SMaharaja Kennadyrajan 			pream = 1;
4916bc64d052SMaharaja Kennadyrajan 			break;
4917bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_HT40:
4918bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_VHT40:
4919bc64d052SMaharaja Kennadyrajan 			pream = 2;
4920bc64d052SMaharaja Kennadyrajan 			break;
4921bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_VHT80:
4922bc64d052SMaharaja Kennadyrajan 			pream = 3;
4923bc64d052SMaharaja Kennadyrajan 			break;
4924bc64d052SMaharaja Kennadyrajan 		case WMI_TPC_PREAM_5GHZ_HTCUP:
4925bc64d052SMaharaja Kennadyrajan 			pream = 4;
4926bc64d052SMaharaja Kennadyrajan 			break;
4927bc64d052SMaharaja Kennadyrajan 		default:
4928bc64d052SMaharaja Kennadyrajan 			pream = -1;
4929bc64d052SMaharaja Kennadyrajan 			break;
4930bc64d052SMaharaja Kennadyrajan 		}
4931bc64d052SMaharaja Kennadyrajan 	}
4932bc64d052SMaharaja Kennadyrajan 
493397c69a70SK.T.VIJAYAKUMAAR 	if (pream == -1) {
493497c69a70SK.T.VIJAYAKUMAAR 		ath10k_warn(ar, "unknown wmi tpc final index and frequency: %u, %u\n",
493597c69a70SK.T.VIJAYAKUMAAR 			    pream_idx, __le32_to_cpu(ev->chan_freq));
493697c69a70SK.T.VIJAYAKUMAAR 		tpc = 0;
493797c69a70SK.T.VIJAYAKUMAAR 		goto out;
493897c69a70SK.T.VIJAYAKUMAAR 	}
493997c69a70SK.T.VIJAYAKUMAAR 
4940bc64d052SMaharaja Kennadyrajan 	if (pream == 4)
4941bc64d052SMaharaja Kennadyrajan 		tpc = min_t(u8, ev->rates_array[rate_idx],
4942bc64d052SMaharaja Kennadyrajan 			    ev->max_reg_allow_pow[ch]);
4943bc64d052SMaharaja Kennadyrajan 	else
4944bc64d052SMaharaja Kennadyrajan 		tpc = min_t(u8, min_t(u8, ev->rates_array[rate_idx],
4945bc64d052SMaharaja Kennadyrajan 				      ev->max_reg_allow_pow[ch]),
4946bc64d052SMaharaja Kennadyrajan 			    ev->ctl_power_table[0][pream][stm_idx]);
4947bc64d052SMaharaja Kennadyrajan 
4948bc64d052SMaharaja Kennadyrajan 	if (__le32_to_cpu(ev->num_tx_chain) <= 1)
4949bc64d052SMaharaja Kennadyrajan 		goto out;
4950bc64d052SMaharaja Kennadyrajan 
4951bc64d052SMaharaja Kennadyrajan 	if (preamble == WMI_RATE_PREAMBLE_CCK)
4952bc64d052SMaharaja Kennadyrajan 		goto out;
4953bc64d052SMaharaja Kennadyrajan 
4954bc64d052SMaharaja Kennadyrajan 	if (num_chains <= num_streams)
4955bc64d052SMaharaja Kennadyrajan 		goto out;
4956bc64d052SMaharaja Kennadyrajan 
4957bc64d052SMaharaja Kennadyrajan 	switch (type) {
4958bc64d052SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_STBC:
4959bc64d052SMaharaja Kennadyrajan 		pow_agstbc = ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx];
4960bc64d052SMaharaja Kennadyrajan 		if (pream == 4)
4961bc64d052SMaharaja Kennadyrajan 			tpc = min_t(u8, tpc, pow_agstbc);
4962bc64d052SMaharaja Kennadyrajan 		else
4963bc64d052SMaharaja Kennadyrajan 			tpc = min_t(u8, min_t(u8, tpc, pow_agstbc),
4964bc64d052SMaharaja Kennadyrajan 				    ev->ctl_power_table[0][pream][stm_idx]);
4965bc64d052SMaharaja Kennadyrajan 		break;
4966bc64d052SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_TXBF:
4967bc64d052SMaharaja Kennadyrajan 		pow_agtxbf = ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx];
4968bc64d052SMaharaja Kennadyrajan 		if (pream == 4)
4969bc64d052SMaharaja Kennadyrajan 			tpc = min_t(u8, tpc, pow_agtxbf);
4970bc64d052SMaharaja Kennadyrajan 		else
4971bc64d052SMaharaja Kennadyrajan 			tpc = min_t(u8, min_t(u8, tpc, pow_agtxbf),
4972bc64d052SMaharaja Kennadyrajan 				    ev->ctl_power_table[1][pream][stm_idx]);
4973bc64d052SMaharaja Kennadyrajan 		break;
4974bc64d052SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_CDD:
4975bc64d052SMaharaja Kennadyrajan 		pow_agcdd = ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx];
4976bc64d052SMaharaja Kennadyrajan 		if (pream == 4)
4977bc64d052SMaharaja Kennadyrajan 			tpc = min_t(u8, tpc, pow_agcdd);
4978bc64d052SMaharaja Kennadyrajan 		else
4979bc64d052SMaharaja Kennadyrajan 			tpc = min_t(u8, min_t(u8, tpc, pow_agcdd),
4980bc64d052SMaharaja Kennadyrajan 				    ev->ctl_power_table[0][pream][stm_idx]);
4981bc64d052SMaharaja Kennadyrajan 		break;
4982bc64d052SMaharaja Kennadyrajan 	default:
4983bc64d052SMaharaja Kennadyrajan 		ath10k_warn(ar, "unknown wmi tpc final table type: %d\n", type);
4984bc64d052SMaharaja Kennadyrajan 		tpc = 0;
4985bc64d052SMaharaja Kennadyrajan 		break;
4986bc64d052SMaharaja Kennadyrajan 	}
4987bc64d052SMaharaja Kennadyrajan 
4988bc64d052SMaharaja Kennadyrajan out:
4989bc64d052SMaharaja Kennadyrajan 	return tpc;
4990bc64d052SMaharaja Kennadyrajan }
4991bc64d052SMaharaja Kennadyrajan 
4992bc64d052SMaharaja Kennadyrajan static void
4993bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_stats_final_disp_tables(struct ath10k *ar,
4994bc64d052SMaharaja Kennadyrajan 				       struct wmi_pdev_tpc_final_table_event *ev,
4995bc64d052SMaharaja Kennadyrajan 				       struct ath10k_tpc_stats_final *tpc_stats,
4996bc64d052SMaharaja Kennadyrajan 				       u8 *rate_code, u16 *pream_table, u8 type)
4997bc64d052SMaharaja Kennadyrajan {
4998bc64d052SMaharaja Kennadyrajan 	u32 i, j, pream_idx, flags;
4999bc64d052SMaharaja Kennadyrajan 	u8 tpc[WMI_TPC_TX_N_CHAIN];
5000bc64d052SMaharaja Kennadyrajan 	char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
5001bc64d052SMaharaja Kennadyrajan 	char buff[WMI_TPC_BUF_SIZE];
5002bc64d052SMaharaja Kennadyrajan 
5003bc64d052SMaharaja Kennadyrajan 	flags = __le32_to_cpu(ev->flags);
5004bc64d052SMaharaja Kennadyrajan 
5005bc64d052SMaharaja Kennadyrajan 	switch (type) {
5006bc64d052SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_CDD:
5007bc64d052SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
5008bc64d052SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
5009bc64d052SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
5010bc64d052SMaharaja Kennadyrajan 			return;
5011bc64d052SMaharaja Kennadyrajan 		}
5012bc64d052SMaharaja Kennadyrajan 		break;
5013bc64d052SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_STBC:
5014bc64d052SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
5015bc64d052SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
5016bc64d052SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
5017bc64d052SMaharaja Kennadyrajan 			return;
5018bc64d052SMaharaja Kennadyrajan 		}
5019bc64d052SMaharaja Kennadyrajan 		break;
5020bc64d052SMaharaja Kennadyrajan 	case WMI_TPC_TABLE_TYPE_TXBF:
5021bc64d052SMaharaja Kennadyrajan 		if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
5022bc64d052SMaharaja Kennadyrajan 			ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
5023bc64d052SMaharaja Kennadyrajan 			tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
5024bc64d052SMaharaja Kennadyrajan 			return;
5025bc64d052SMaharaja Kennadyrajan 		}
5026bc64d052SMaharaja Kennadyrajan 		break;
5027bc64d052SMaharaja Kennadyrajan 	default:
5028bc64d052SMaharaja Kennadyrajan 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5029bc64d052SMaharaja Kennadyrajan 			   "invalid table type in wmi tpc event: %d\n", type);
5030bc64d052SMaharaja Kennadyrajan 		return;
5031bc64d052SMaharaja Kennadyrajan 	}
5032bc64d052SMaharaja Kennadyrajan 
5033bc64d052SMaharaja Kennadyrajan 	pream_idx = 0;
5034bc64d052SMaharaja Kennadyrajan 	for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
5035bc64d052SMaharaja Kennadyrajan 		memset(tpc_value, 0, sizeof(tpc_value));
5036bc64d052SMaharaja Kennadyrajan 		memset(buff, 0, sizeof(buff));
5037bc64d052SMaharaja Kennadyrajan 		if (i == pream_table[pream_idx])
5038bc64d052SMaharaja Kennadyrajan 			pream_idx++;
5039bc64d052SMaharaja Kennadyrajan 
5040bc64d052SMaharaja Kennadyrajan 		for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
5041bc64d052SMaharaja Kennadyrajan 			if (j >= __le32_to_cpu(ev->num_tx_chain))
5042bc64d052SMaharaja Kennadyrajan 				break;
5043bc64d052SMaharaja Kennadyrajan 
5044bc64d052SMaharaja Kennadyrajan 			tpc[j] = ath10k_wmi_tpc_final_get_rate(ar, ev, i, j + 1,
5045bc64d052SMaharaja Kennadyrajan 							       rate_code[i],
5046bc64d052SMaharaja Kennadyrajan 							       type, pream_idx);
5047bc64d052SMaharaja Kennadyrajan 			snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
50486707ba01SArnd Bergmann 			strlcat(tpc_value, buff, sizeof(tpc_value));
5049bc64d052SMaharaja Kennadyrajan 		}
5050bc64d052SMaharaja Kennadyrajan 		tpc_stats->tpc_table_final[type].pream_idx[i] = pream_idx;
5051bc64d052SMaharaja Kennadyrajan 		tpc_stats->tpc_table_final[type].rate_code[i] = rate_code[i];
5052bc64d052SMaharaja Kennadyrajan 		memcpy(tpc_stats->tpc_table_final[type].tpc_value[i],
5053bc64d052SMaharaja Kennadyrajan 		       tpc_value, sizeof(tpc_value));
5054bc64d052SMaharaja Kennadyrajan 	}
5055bc64d052SMaharaja Kennadyrajan }
5056bc64d052SMaharaja Kennadyrajan 
5057bc64d052SMaharaja Kennadyrajan void ath10k_wmi_event_tpc_final_table(struct ath10k *ar, struct sk_buff *skb)
5058bc64d052SMaharaja Kennadyrajan {
5059bc64d052SMaharaja Kennadyrajan 	u32 num_tx_chain;
5060bc64d052SMaharaja Kennadyrajan 	u8 rate_code[WMI_TPC_FINAL_RATE_MAX];
5061bc64d052SMaharaja Kennadyrajan 	u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
5062bc64d052SMaharaja Kennadyrajan 	struct wmi_pdev_tpc_final_table_event *ev;
5063bc64d052SMaharaja Kennadyrajan 	struct ath10k_tpc_stats_final *tpc_stats;
5064bc64d052SMaharaja Kennadyrajan 
5065bc64d052SMaharaja Kennadyrajan 	ev = (struct wmi_pdev_tpc_final_table_event *)skb->data;
5066bc64d052SMaharaja Kennadyrajan 
5067bc64d052SMaharaja Kennadyrajan 	tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
5068bc64d052SMaharaja Kennadyrajan 	if (!tpc_stats)
5069bc64d052SMaharaja Kennadyrajan 		return;
5070bc64d052SMaharaja Kennadyrajan 
5071bc64d052SMaharaja Kennadyrajan 	num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
5072bc64d052SMaharaja Kennadyrajan 
5073bc64d052SMaharaja Kennadyrajan 	ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table,
5074bc64d052SMaharaja Kennadyrajan 					    num_tx_chain);
5075bc64d052SMaharaja Kennadyrajan 
5076bc64d052SMaharaja Kennadyrajan 	tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
5077bc64d052SMaharaja Kennadyrajan 	tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
5078bc64d052SMaharaja Kennadyrajan 	tpc_stats->ctl = __le32_to_cpu(ev->ctl);
5079bc64d052SMaharaja Kennadyrajan 	tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
5080bc64d052SMaharaja Kennadyrajan 	tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
5081bc64d052SMaharaja Kennadyrajan 	tpc_stats->twice_antenna_reduction =
5082bc64d052SMaharaja Kennadyrajan 		__le32_to_cpu(ev->twice_antenna_reduction);
5083bc64d052SMaharaja Kennadyrajan 	tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
5084bc64d052SMaharaja Kennadyrajan 	tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
5085bc64d052SMaharaja Kennadyrajan 	tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
5086bc64d052SMaharaja Kennadyrajan 	tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
5087bc64d052SMaharaja Kennadyrajan 
5088bc64d052SMaharaja Kennadyrajan 	ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5089bc64d052SMaharaja Kennadyrajan 					       rate_code, pream_table,
5090bc64d052SMaharaja Kennadyrajan 					       WMI_TPC_TABLE_TYPE_CDD);
5091bc64d052SMaharaja Kennadyrajan 	ath10k_wmi_tpc_stats_final_disp_tables(ar, ev,  tpc_stats,
5092bc64d052SMaharaja Kennadyrajan 					       rate_code, pream_table,
5093bc64d052SMaharaja Kennadyrajan 					       WMI_TPC_TABLE_TYPE_STBC);
5094bc64d052SMaharaja Kennadyrajan 	ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5095bc64d052SMaharaja Kennadyrajan 					       rate_code, pream_table,
5096bc64d052SMaharaja Kennadyrajan 					       WMI_TPC_TABLE_TYPE_TXBF);
5097bc64d052SMaharaja Kennadyrajan 
5098bc64d052SMaharaja Kennadyrajan 	ath10k_debug_tpc_stats_final_process(ar, tpc_stats);
5099bc64d052SMaharaja Kennadyrajan 
5100bc64d052SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
5101bc64d052SMaharaja Kennadyrajan 		   "wmi event tpc final table channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n",
5102bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->chan_freq),
5103bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->phy_mode),
5104bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->ctl),
5105bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->reg_domain),
5106bc64d052SMaharaja Kennadyrajan 		   a_sle32_to_cpu(ev->twice_antenna_gain),
5107bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->twice_antenna_reduction),
5108bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->power_limit),
5109bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->twice_max_rd_power) / 2,
5110bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->num_tx_chain),
5111bc64d052SMaharaja Kennadyrajan 		   __le32_to_cpu(ev->rate_max));
5112bc64d052SMaharaja Kennadyrajan }
5113bc64d052SMaharaja Kennadyrajan 
51148ed05ed0SManikanta Pubbisetty static void
51158ed05ed0SManikanta Pubbisetty ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb)
51168ed05ed0SManikanta Pubbisetty {
51178ed05ed0SManikanta Pubbisetty 	struct wmi_tdls_peer_event *ev;
51188ed05ed0SManikanta Pubbisetty 	struct ath10k_peer *peer;
51198ed05ed0SManikanta Pubbisetty 	struct ath10k_vif *arvif;
51208ed05ed0SManikanta Pubbisetty 	int vdev_id;
51218ed05ed0SManikanta Pubbisetty 	int peer_status;
51228ed05ed0SManikanta Pubbisetty 	int peer_reason;
51238ed05ed0SManikanta Pubbisetty 	u8 reason;
51248ed05ed0SManikanta Pubbisetty 
51258ed05ed0SManikanta Pubbisetty 	if (skb->len < sizeof(*ev)) {
51268ed05ed0SManikanta Pubbisetty 		ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n",
51278ed05ed0SManikanta Pubbisetty 			   skb->len);
51288ed05ed0SManikanta Pubbisetty 		return;
51298ed05ed0SManikanta Pubbisetty 	}
51308ed05ed0SManikanta Pubbisetty 
51318ed05ed0SManikanta Pubbisetty 	ev = (struct wmi_tdls_peer_event *)skb->data;
51328ed05ed0SManikanta Pubbisetty 	vdev_id = __le32_to_cpu(ev->vdev_id);
51338ed05ed0SManikanta Pubbisetty 	peer_status = __le32_to_cpu(ev->peer_status);
51348ed05ed0SManikanta Pubbisetty 	peer_reason = __le32_to_cpu(ev->peer_reason);
51358ed05ed0SManikanta Pubbisetty 
51368ed05ed0SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
51378ed05ed0SManikanta Pubbisetty 	peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr);
51388ed05ed0SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
51398ed05ed0SManikanta Pubbisetty 
51408ed05ed0SManikanta Pubbisetty 	if (!peer) {
51418ed05ed0SManikanta Pubbisetty 		ath10k_warn(ar, "failed to find peer entry for %pM\n",
51428ed05ed0SManikanta Pubbisetty 			    ev->peer_macaddr.addr);
51438ed05ed0SManikanta Pubbisetty 		return;
51448ed05ed0SManikanta Pubbisetty 	}
51458ed05ed0SManikanta Pubbisetty 
51468ed05ed0SManikanta Pubbisetty 	switch (peer_status) {
51478ed05ed0SManikanta Pubbisetty 	case WMI_TDLS_SHOULD_TEARDOWN:
51488ed05ed0SManikanta Pubbisetty 		switch (peer_reason) {
51498ed05ed0SManikanta Pubbisetty 		case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT:
51508ed05ed0SManikanta Pubbisetty 		case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE:
51518ed05ed0SManikanta Pubbisetty 		case WMI_TDLS_TEARDOWN_REASON_RSSI:
51528ed05ed0SManikanta Pubbisetty 			reason = WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE;
51538ed05ed0SManikanta Pubbisetty 			break;
51548ed05ed0SManikanta Pubbisetty 		default:
51558ed05ed0SManikanta Pubbisetty 			reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED;
51568ed05ed0SManikanta Pubbisetty 			break;
51578ed05ed0SManikanta Pubbisetty 		}
51588ed05ed0SManikanta Pubbisetty 
51598ed05ed0SManikanta Pubbisetty 		arvif = ath10k_get_arvif(ar, vdev_id);
51608ed05ed0SManikanta Pubbisetty 		if (!arvif) {
51618ed05ed0SManikanta Pubbisetty 			ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n",
51628ed05ed0SManikanta Pubbisetty 				    vdev_id);
51638ed05ed0SManikanta Pubbisetty 			return;
51648ed05ed0SManikanta Pubbisetty 		}
51658ed05ed0SManikanta Pubbisetty 
51668ed05ed0SManikanta Pubbisetty 		ieee80211_tdls_oper_request(arvif->vif, ev->peer_macaddr.addr,
51678ed05ed0SManikanta Pubbisetty 					    NL80211_TDLS_TEARDOWN, reason,
51688ed05ed0SManikanta Pubbisetty 					    GFP_ATOMIC);
51698ed05ed0SManikanta Pubbisetty 
51708ed05ed0SManikanta Pubbisetty 		ath10k_dbg(ar, ATH10K_DBG_WMI,
51718ed05ed0SManikanta Pubbisetty 			   "received tdls teardown event for peer %pM reason %u\n",
51728ed05ed0SManikanta Pubbisetty 			   ev->peer_macaddr.addr, peer_reason);
51738ed05ed0SManikanta Pubbisetty 		break;
51748ed05ed0SManikanta Pubbisetty 	default:
51758ed05ed0SManikanta Pubbisetty 		ath10k_dbg(ar, ATH10K_DBG_WMI,
51768ed05ed0SManikanta Pubbisetty 			   "received unknown tdls peer event %u\n",
51778ed05ed0SManikanta Pubbisetty 			   peer_status);
51788ed05ed0SManikanta Pubbisetty 		break;
51798ed05ed0SManikanta Pubbisetty 	}
51808ed05ed0SManikanta Pubbisetty }
51818ed05ed0SManikanta Pubbisetty 
5182d70c0d46SMaharaja Kennadyrajan static void
5183d70c0d46SMaharaja Kennadyrajan ath10k_wmi_event_peer_sta_ps_state_chg(struct ath10k *ar, struct sk_buff *skb)
5184d70c0d46SMaharaja Kennadyrajan {
5185d70c0d46SMaharaja Kennadyrajan 	struct wmi_peer_sta_ps_state_chg_event *ev;
5186d70c0d46SMaharaja Kennadyrajan 	struct ieee80211_sta *sta;
5187d70c0d46SMaharaja Kennadyrajan 	struct ath10k_sta *arsta;
5188d70c0d46SMaharaja Kennadyrajan 	u8 peer_addr[ETH_ALEN];
5189d70c0d46SMaharaja Kennadyrajan 
5190d70c0d46SMaharaja Kennadyrajan 	lockdep_assert_held(&ar->data_lock);
5191d70c0d46SMaharaja Kennadyrajan 
5192d70c0d46SMaharaja Kennadyrajan 	ev = (struct wmi_peer_sta_ps_state_chg_event *)skb->data;
5193d70c0d46SMaharaja Kennadyrajan 	ether_addr_copy(peer_addr, ev->peer_macaddr.addr);
5194d70c0d46SMaharaja Kennadyrajan 
5195d70c0d46SMaharaja Kennadyrajan 	rcu_read_lock();
5196d70c0d46SMaharaja Kennadyrajan 
5197d70c0d46SMaharaja Kennadyrajan 	sta = ieee80211_find_sta_by_ifaddr(ar->hw, peer_addr, NULL);
5198d70c0d46SMaharaja Kennadyrajan 
5199d70c0d46SMaharaja Kennadyrajan 	if (!sta) {
5200d70c0d46SMaharaja Kennadyrajan 		ath10k_warn(ar, "failed to find station entry %pM\n",
5201d70c0d46SMaharaja Kennadyrajan 			    peer_addr);
5202d70c0d46SMaharaja Kennadyrajan 		goto exit;
5203d70c0d46SMaharaja Kennadyrajan 	}
5204d70c0d46SMaharaja Kennadyrajan 
5205d70c0d46SMaharaja Kennadyrajan 	arsta = (struct ath10k_sta *)sta->drv_priv;
5206d70c0d46SMaharaja Kennadyrajan 	arsta->peer_ps_state = __le32_to_cpu(ev->peer_ps_state);
5207d70c0d46SMaharaja Kennadyrajan 
5208d70c0d46SMaharaja Kennadyrajan exit:
5209d70c0d46SMaharaja Kennadyrajan 	rcu_read_unlock();
5210d70c0d46SMaharaja Kennadyrajan }
5211d70c0d46SMaharaja Kennadyrajan 
52120226d602SMichal Kazior void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
52135e3dd157SKalle Valo {
52147aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
52155e3dd157SKalle Valo }
52165e3dd157SKalle Valo 
52170226d602SMichal Kazior void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb)
52185e3dd157SKalle Valo {
52197aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
52205e3dd157SKalle Valo }
52215e3dd157SKalle Valo 
52220226d602SMichal Kazior void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb)
52235e3dd157SKalle Valo {
52247aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
52255e3dd157SKalle Valo }
52265e3dd157SKalle Valo 
52270226d602SMichal Kazior void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb)
52285e3dd157SKalle Valo {
52297aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
52305e3dd157SKalle Valo }
52315e3dd157SKalle Valo 
52320226d602SMichal Kazior void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb)
52335e3dd157SKalle Valo {
52347aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
52355e3dd157SKalle Valo }
52365e3dd157SKalle Valo 
52370226d602SMichal Kazior void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
52385e3dd157SKalle Valo 						struct sk_buff *skb)
52395e3dd157SKalle Valo {
52407aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
52415e3dd157SKalle Valo }
52425e3dd157SKalle Valo 
52430226d602SMichal Kazior void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb)
52448a6618b0SBartosz Markowski {
52457aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
52468a6618b0SBartosz Markowski }
52478a6618b0SBartosz Markowski 
52480226d602SMichal Kazior void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb)
52498a6618b0SBartosz Markowski {
52507aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
52518a6618b0SBartosz Markowski }
52528a6618b0SBartosz Markowski 
52530226d602SMichal Kazior void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb)
52548a6618b0SBartosz Markowski {
52557aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
52568a6618b0SBartosz Markowski }
52578a6618b0SBartosz Markowski 
5258b0578865SFelix Fietkau static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
5259b3effe61SBartosz Markowski 				  u32 num_units, u32 unit_len)
5260b3effe61SBartosz Markowski {
5261b3effe61SBartosz Markowski 	dma_addr_t paddr;
526279e68821SAdrian Chadd 	u32 pool_size;
5263b3effe61SBartosz Markowski 	int idx = ar->wmi.num_mem_chunks;
526479e68821SAdrian Chadd 	void *vaddr;
5265b3effe61SBartosz Markowski 
5266b3effe61SBartosz Markowski 	pool_size = num_units * round_up(unit_len, 4);
5267750afb08SLuis Chamberlain 	vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL);
5268b3effe61SBartosz Markowski 
5269b0578865SFelix Fietkau 	if (!vaddr)
5270b0578865SFelix Fietkau 		return -ENOMEM;
5271b0578865SFelix Fietkau 
5272b0578865SFelix Fietkau 	ar->wmi.mem_chunks[idx].vaddr = vaddr;
5273b3effe61SBartosz Markowski 	ar->wmi.mem_chunks[idx].paddr = paddr;
5274b3effe61SBartosz Markowski 	ar->wmi.mem_chunks[idx].len = pool_size;
5275b3effe61SBartosz Markowski 	ar->wmi.mem_chunks[idx].req_id = req_id;
5276b3effe61SBartosz Markowski 	ar->wmi.num_mem_chunks++;
5277b3effe61SBartosz Markowski 
5278b0578865SFelix Fietkau 	return num_units;
5279b0578865SFelix Fietkau }
5280b0578865SFelix Fietkau 
5281b0578865SFelix Fietkau static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
5282b0578865SFelix Fietkau 				     u32 num_units, u32 unit_len)
5283b0578865SFelix Fietkau {
5284b0578865SFelix Fietkau 	int ret;
5285b0578865SFelix Fietkau 
5286b0578865SFelix Fietkau 	while (num_units) {
5287b0578865SFelix Fietkau 		ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len);
5288b0578865SFelix Fietkau 		if (ret < 0)
5289b0578865SFelix Fietkau 			return ret;
5290b0578865SFelix Fietkau 
5291b0578865SFelix Fietkau 		num_units -= ret;
5292b0578865SFelix Fietkau 	}
5293b0578865SFelix Fietkau 
5294b3effe61SBartosz Markowski 	return 0;
5295b3effe61SBartosz Markowski }
5296b3effe61SBartosz Markowski 
5297a925a376SVasanthakumar Thiagarajan static bool
5298a925a376SVasanthakumar Thiagarajan ath10k_wmi_is_host_mem_allocated(struct ath10k *ar,
5299a925a376SVasanthakumar Thiagarajan 				 const struct wlan_host_mem_req **mem_reqs,
5300a925a376SVasanthakumar Thiagarajan 				 u32 num_mem_reqs)
5301a925a376SVasanthakumar Thiagarajan {
5302a925a376SVasanthakumar Thiagarajan 	u32 req_id, num_units, unit_size, num_unit_info;
5303a925a376SVasanthakumar Thiagarajan 	u32 pool_size;
5304a925a376SVasanthakumar Thiagarajan 	int i, j;
5305a925a376SVasanthakumar Thiagarajan 	bool found;
5306a925a376SVasanthakumar Thiagarajan 
5307a925a376SVasanthakumar Thiagarajan 	if (ar->wmi.num_mem_chunks != num_mem_reqs)
5308a925a376SVasanthakumar Thiagarajan 		return false;
5309a925a376SVasanthakumar Thiagarajan 
5310a925a376SVasanthakumar Thiagarajan 	for (i = 0; i < num_mem_reqs; ++i) {
5311a925a376SVasanthakumar Thiagarajan 		req_id = __le32_to_cpu(mem_reqs[i]->req_id);
5312a925a376SVasanthakumar Thiagarajan 		num_units = __le32_to_cpu(mem_reqs[i]->num_units);
5313a925a376SVasanthakumar Thiagarajan 		unit_size = __le32_to_cpu(mem_reqs[i]->unit_size);
5314a925a376SVasanthakumar Thiagarajan 		num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info);
5315a925a376SVasanthakumar Thiagarajan 
5316a925a376SVasanthakumar Thiagarajan 		if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
5317a925a376SVasanthakumar Thiagarajan 			if (ar->num_active_peers)
5318a925a376SVasanthakumar Thiagarajan 				num_units = ar->num_active_peers + 1;
5319a925a376SVasanthakumar Thiagarajan 			else
5320a925a376SVasanthakumar Thiagarajan 				num_units = ar->max_num_peers + 1;
5321a925a376SVasanthakumar Thiagarajan 		} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
5322a925a376SVasanthakumar Thiagarajan 			num_units = ar->max_num_peers + 1;
5323a925a376SVasanthakumar Thiagarajan 		} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
5324a925a376SVasanthakumar Thiagarajan 			num_units = ar->max_num_vdevs + 1;
5325a925a376SVasanthakumar Thiagarajan 		}
5326a925a376SVasanthakumar Thiagarajan 
5327a925a376SVasanthakumar Thiagarajan 		found = false;
5328a925a376SVasanthakumar Thiagarajan 		for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
5329a925a376SVasanthakumar Thiagarajan 			if (ar->wmi.mem_chunks[j].req_id == req_id) {
5330a925a376SVasanthakumar Thiagarajan 				pool_size = num_units * round_up(unit_size, 4);
5331a925a376SVasanthakumar Thiagarajan 				if (ar->wmi.mem_chunks[j].len == pool_size) {
5332a925a376SVasanthakumar Thiagarajan 					found = true;
5333a925a376SVasanthakumar Thiagarajan 					break;
5334a925a376SVasanthakumar Thiagarajan 				}
5335a925a376SVasanthakumar Thiagarajan 			}
5336a925a376SVasanthakumar Thiagarajan 		}
5337a925a376SVasanthakumar Thiagarajan 		if (!found)
5338a925a376SVasanthakumar Thiagarajan 			return false;
5339a925a376SVasanthakumar Thiagarajan 	}
5340a925a376SVasanthakumar Thiagarajan 
5341a925a376SVasanthakumar Thiagarajan 	return true;
5342a925a376SVasanthakumar Thiagarajan }
5343a925a376SVasanthakumar Thiagarajan 
5344d7579d12SMichal Kazior static int
5345d7579d12SMichal Kazior ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
53465c01aa3dSMichal Kazior 				   struct wmi_svc_rdy_ev_arg *arg)
53475c01aa3dSMichal Kazior {
53485c01aa3dSMichal Kazior 	struct wmi_service_ready_event *ev;
53495c01aa3dSMichal Kazior 	size_t i, n;
53505c01aa3dSMichal Kazior 
53515c01aa3dSMichal Kazior 	if (skb->len < sizeof(*ev))
53525c01aa3dSMichal Kazior 		return -EPROTO;
53535c01aa3dSMichal Kazior 
53545c01aa3dSMichal Kazior 	ev = (void *)skb->data;
53555c01aa3dSMichal Kazior 	skb_pull(skb, sizeof(*ev));
53565c01aa3dSMichal Kazior 	arg->min_tx_power = ev->hw_min_tx_power;
53575c01aa3dSMichal Kazior 	arg->max_tx_power = ev->hw_max_tx_power;
53585c01aa3dSMichal Kazior 	arg->ht_cap = ev->ht_cap_info;
53595c01aa3dSMichal Kazior 	arg->vht_cap = ev->vht_cap_info;
536073690c48STomislav Požega 	arg->vht_supp_mcs = ev->vht_supp_mcs;
53615c01aa3dSMichal Kazior 	arg->sw_ver0 = ev->sw_version;
53625c01aa3dSMichal Kazior 	arg->sw_ver1 = ev->sw_version_1;
53635c01aa3dSMichal Kazior 	arg->phy_capab = ev->phy_capability;
53645c01aa3dSMichal Kazior 	arg->num_rf_chains = ev->num_rf_chains;
53655c01aa3dSMichal Kazior 	arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
5366fa879490STomislav Požega 	arg->low_2ghz_chan = ev->hal_reg_capabilities.low_2ghz_chan;
5367fa879490STomislav Požega 	arg->high_2ghz_chan = ev->hal_reg_capabilities.high_2ghz_chan;
5368523f6701STamizh chelvam 	arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
5369523f6701STamizh chelvam 	arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
53705c01aa3dSMichal Kazior 	arg->num_mem_reqs = ev->num_mem_reqs;
53715c01aa3dSMichal Kazior 	arg->service_map = ev->wmi_service_bitmap;
53722a3e60d3SMichal Kazior 	arg->service_map_len = sizeof(ev->wmi_service_bitmap);
53735c01aa3dSMichal Kazior 
53745c01aa3dSMichal Kazior 	n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
53755c01aa3dSMichal Kazior 		  ARRAY_SIZE(arg->mem_reqs));
53765c01aa3dSMichal Kazior 	for (i = 0; i < n; i++)
53775c01aa3dSMichal Kazior 		arg->mem_reqs[i] = &ev->mem_reqs[i];
53785c01aa3dSMichal Kazior 
53795c01aa3dSMichal Kazior 	if (skb->len <
53805c01aa3dSMichal Kazior 	    __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
53815c01aa3dSMichal Kazior 		return -EPROTO;
53825c01aa3dSMichal Kazior 
53835c01aa3dSMichal Kazior 	return 0;
53845c01aa3dSMichal Kazior }
53855c01aa3dSMichal Kazior 
5386d7579d12SMichal Kazior static int
5387d7579d12SMichal Kazior ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
53885c01aa3dSMichal Kazior 				  struct wmi_svc_rdy_ev_arg *arg)
53895c01aa3dSMichal Kazior {
53905c01aa3dSMichal Kazior 	struct wmi_10x_service_ready_event *ev;
53915c01aa3dSMichal Kazior 	int i, n;
53925c01aa3dSMichal Kazior 
53935c01aa3dSMichal Kazior 	if (skb->len < sizeof(*ev))
53945c01aa3dSMichal Kazior 		return -EPROTO;
53955c01aa3dSMichal Kazior 
53965c01aa3dSMichal Kazior 	ev = (void *)skb->data;
53975c01aa3dSMichal Kazior 	skb_pull(skb, sizeof(*ev));
53985c01aa3dSMichal Kazior 	arg->min_tx_power = ev->hw_min_tx_power;
53995c01aa3dSMichal Kazior 	arg->max_tx_power = ev->hw_max_tx_power;
54005c01aa3dSMichal Kazior 	arg->ht_cap = ev->ht_cap_info;
54015c01aa3dSMichal Kazior 	arg->vht_cap = ev->vht_cap_info;
540273690c48STomislav Požega 	arg->vht_supp_mcs = ev->vht_supp_mcs;
54035c01aa3dSMichal Kazior 	arg->sw_ver0 = ev->sw_version;
54045c01aa3dSMichal Kazior 	arg->phy_capab = ev->phy_capability;
54055c01aa3dSMichal Kazior 	arg->num_rf_chains = ev->num_rf_chains;
54065c01aa3dSMichal Kazior 	arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
5407fa879490STomislav Požega 	arg->low_2ghz_chan = ev->hal_reg_capabilities.low_2ghz_chan;
5408fa879490STomislav Požega 	arg->high_2ghz_chan = ev->hal_reg_capabilities.high_2ghz_chan;
5409523f6701STamizh chelvam 	arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
5410523f6701STamizh chelvam 	arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
54115c01aa3dSMichal Kazior 	arg->num_mem_reqs = ev->num_mem_reqs;
54125c01aa3dSMichal Kazior 	arg->service_map = ev->wmi_service_bitmap;
54132a3e60d3SMichal Kazior 	arg->service_map_len = sizeof(ev->wmi_service_bitmap);
54145c01aa3dSMichal Kazior 
54151382993fSWen Gong 	/* Deliberately skipping ev->sys_cap_info as WMI and WMI-TLV have
54161382993fSWen Gong 	 * different values. We would need a translation to handle that,
54171382993fSWen Gong 	 * but as we don't currently need anything from sys_cap_info from
54181382993fSWen Gong 	 * WMI interface (only from WMI-TLV) safest it to skip it.
54191382993fSWen Gong 	 */
54201382993fSWen Gong 
54215c01aa3dSMichal Kazior 	n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
54225c01aa3dSMichal Kazior 		  ARRAY_SIZE(arg->mem_reqs));
54235c01aa3dSMichal Kazior 	for (i = 0; i < n; i++)
54245c01aa3dSMichal Kazior 		arg->mem_reqs[i] = &ev->mem_reqs[i];
54255c01aa3dSMichal Kazior 
54265c01aa3dSMichal Kazior 	if (skb->len <
54275c01aa3dSMichal Kazior 	    __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
54285c01aa3dSMichal Kazior 		return -EPROTO;
54295c01aa3dSMichal Kazior 
54305c01aa3dSMichal Kazior 	return 0;
54315c01aa3dSMichal Kazior }
54325c01aa3dSMichal Kazior 
5433c8ecfc1cSRaja Mani static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
54345e3dd157SKalle Valo {
5435c8ecfc1cSRaja Mani 	struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work);
5436c8ecfc1cSRaja Mani 	struct sk_buff *skb = ar->svc_rdy_skb;
54375c01aa3dSMichal Kazior 	struct wmi_svc_rdy_ev_arg arg = {};
54385c01aa3dSMichal Kazior 	u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
54395c01aa3dSMichal Kazior 	int ret;
5440a925a376SVasanthakumar Thiagarajan 	bool allocated;
54415e3dd157SKalle Valo 
5442c8ecfc1cSRaja Mani 	if (!skb) {
5443c8ecfc1cSRaja Mani 		ath10k_warn(ar, "invalid service ready event skb\n");
5444c8ecfc1cSRaja Mani 		return;
5445c8ecfc1cSRaja Mani 	}
5446c8ecfc1cSRaja Mani 
5447d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg);
54485c01aa3dSMichal Kazior 	if (ret) {
54495c01aa3dSMichal Kazior 		ath10k_warn(ar, "failed to parse service ready: %d\n", ret);
54505e3dd157SKalle Valo 		return;
54515e3dd157SKalle Valo 	}
54525e3dd157SKalle Valo 
5453d7579d12SMichal Kazior 	ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
5454d7579d12SMichal Kazior 			   arg.service_map_len);
5455d7579d12SMichal Kazior 
54565c01aa3dSMichal Kazior 	ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power);
54575c01aa3dSMichal Kazior 	ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power);
54585c01aa3dSMichal Kazior 	ar->ht_cap_info = __le32_to_cpu(arg.ht_cap);
54595c01aa3dSMichal Kazior 	ar->vht_cap_info = __le32_to_cpu(arg.vht_cap);
546073690c48STomislav Požega 	ar->vht_supp_mcs = __le32_to_cpu(arg.vht_supp_mcs);
54615e3dd157SKalle Valo 	ar->fw_version_major =
54625c01aa3dSMichal Kazior 		(__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24;
54635c01aa3dSMichal Kazior 	ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff);
54645e3dd157SKalle Valo 	ar->fw_version_release =
54655c01aa3dSMichal Kazior 		(__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16;
54665c01aa3dSMichal Kazior 	ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff);
54675c01aa3dSMichal Kazior 	ar->phy_capability = __le32_to_cpu(arg.phy_capab);
54685c01aa3dSMichal Kazior 	ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains);
5469209b2a68SBartosz Markowski 	ar->hw_eeprom_rd = __le32_to_cpu(arg.eeprom_rd);
5470fa879490STomislav Požega 	ar->low_2ghz_chan = __le32_to_cpu(arg.low_2ghz_chan);
5471fa879490STomislav Požega 	ar->high_2ghz_chan = __le32_to_cpu(arg.high_2ghz_chan);
5472523f6701STamizh chelvam 	ar->low_5ghz_chan = __le32_to_cpu(arg.low_5ghz_chan);
5473523f6701STamizh chelvam 	ar->high_5ghz_chan = __le32_to_cpu(arg.high_5ghz_chan);
54741382993fSWen Gong 	ar->sys_cap_info = __le32_to_cpu(arg.sys_cap_info);
54755c01aa3dSMichal Kazior 
54765c01aa3dSMichal Kazior 	ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
54772a3e60d3SMichal Kazior 			arg.service_map, arg.service_map_len);
54781382993fSWen Gong 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi sys_cap_info 0x%x\n",
54791382993fSWen Gong 		   ar->sys_cap_info);
54808865bee4SMichal Kazior 
54815c8726ecSRaja Mani 	if (ar->num_rf_chains > ar->max_spatial_stream) {
54827aa7a72aSMichal Kazior 		ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n",
54835c8726ecSRaja Mani 			    ar->num_rf_chains, ar->max_spatial_stream);
54845c8726ecSRaja Mani 		ar->num_rf_chains = ar->max_spatial_stream;
54858865bee4SMichal Kazior 	}
54865e3dd157SKalle Valo 
5487166de3f1SRajkumar Manoharan 	if (!ar->cfg_tx_chainmask) {
5488166de3f1SRajkumar Manoharan 		ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
5489166de3f1SRajkumar Manoharan 		ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
5490166de3f1SRajkumar Manoharan 	}
5491fdb959c7SMichal Kazior 
54925e3dd157SKalle Valo 	if (strlen(ar->hw->wiphy->fw_version) == 0) {
54935e3dd157SKalle Valo 		snprintf(ar->hw->wiphy->fw_version,
54945e3dd157SKalle Valo 			 sizeof(ar->hw->wiphy->fw_version),
54955e3dd157SKalle Valo 			 "%u.%u.%u.%u",
54965e3dd157SKalle Valo 			 ar->fw_version_major,
54975e3dd157SKalle Valo 			 ar->fw_version_minor,
54985e3dd157SKalle Valo 			 ar->fw_version_release,
54995e3dd157SKalle Valo 			 ar->fw_version_build);
55005e3dd157SKalle Valo 	}
55015e3dd157SKalle Valo 
55025c01aa3dSMichal Kazior 	num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs);
55035c01aa3dSMichal Kazior 	if (num_mem_reqs > WMI_MAX_MEM_REQS) {
55047aa7a72aSMichal Kazior 		ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n",
5505b3effe61SBartosz Markowski 			    num_mem_reqs);
5506b3effe61SBartosz Markowski 		return;
55076f97d256SBartosz Markowski 	}
55086f97d256SBartosz Markowski 
5509b0399417SRaja Mani 	if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) {
551099ad1cbaSMichal Kazior 		if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
5511c4cdf753SKalle Valo 			     ar->running_fw->fw_file.fw_features))
551299ad1cbaSMichal Kazior 			ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC +
55135699a6f2SRaja Mani 					       ar->max_num_vdevs;
551499ad1cbaSMichal Kazior 		else
551599ad1cbaSMichal Kazior 			ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
551699ad1cbaSMichal Kazior 					       ar->max_num_vdevs;
551799ad1cbaSMichal Kazior 
551899ad1cbaSMichal Kazior 		ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
55195699a6f2SRaja Mani 				    ar->max_num_vdevs;
5520b0399417SRaja Mani 		ar->num_tids = ar->num_active_peers * 2;
5521b0399417SRaja Mani 		ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
5522b0399417SRaja Mani 	}
5523b0399417SRaja Mani 
5524b0399417SRaja Mani 	/* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE
5525b0399417SRaja Mani 	 * and WMI_SERVICE_IRAM_TIDS, etc.
5526b0399417SRaja Mani 	 */
5527b0399417SRaja Mani 
5528a925a376SVasanthakumar Thiagarajan 	allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
5529a925a376SVasanthakumar Thiagarajan 						     num_mem_reqs);
5530a925a376SVasanthakumar Thiagarajan 	if (allocated)
5531a925a376SVasanthakumar Thiagarajan 		goto skip_mem_alloc;
5532a925a376SVasanthakumar Thiagarajan 
5533a925a376SVasanthakumar Thiagarajan 	/* Either this event is received during boot time or there is a change
5534a925a376SVasanthakumar Thiagarajan 	 * in memory requirement from firmware when compared to last request.
5535a925a376SVasanthakumar Thiagarajan 	 * Free any old memory and do a fresh allocation based on the current
5536a925a376SVasanthakumar Thiagarajan 	 * memory requirement.
5537a925a376SVasanthakumar Thiagarajan 	 */
5538a925a376SVasanthakumar Thiagarajan 	ath10k_wmi_free_host_mem(ar);
5539a925a376SVasanthakumar Thiagarajan 
5540b3effe61SBartosz Markowski 	for (i = 0; i < num_mem_reqs; ++i) {
55415c01aa3dSMichal Kazior 		req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id);
55425c01aa3dSMichal Kazior 		num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units);
55435c01aa3dSMichal Kazior 		unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size);
55445c01aa3dSMichal Kazior 		num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info);
5545b3effe61SBartosz Markowski 
5546b0399417SRaja Mani 		if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
5547b0399417SRaja Mani 			if (ar->num_active_peers)
5548b0399417SRaja Mani 				num_units = ar->num_active_peers + 1;
5549b0399417SRaja Mani 			else
5550b0399417SRaja Mani 				num_units = ar->max_num_peers + 1;
5551b0399417SRaja Mani 		} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
5552b3effe61SBartosz Markowski 			/* number of units to allocate is number of
5553d6dfe25cSMarcin Rokicki 			 * peers, 1 extra for self peer on target
5554d6dfe25cSMarcin Rokicki 			 * this needs to be tied, host and target
5555d6dfe25cSMarcin Rokicki 			 * can get out of sync
5556d6dfe25cSMarcin Rokicki 			 */
5557b0399417SRaja Mani 			num_units = ar->max_num_peers + 1;
5558b0399417SRaja Mani 		} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
5559b0399417SRaja Mani 			num_units = ar->max_num_vdevs + 1;
5560b0399417SRaja Mani 		}
5561b3effe61SBartosz Markowski 
55627aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
5563b3effe61SBartosz Markowski 			   "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
5564b3effe61SBartosz Markowski 			   req_id,
55655c01aa3dSMichal Kazior 			   __le32_to_cpu(arg.mem_reqs[i]->num_units),
5566b3effe61SBartosz Markowski 			   num_unit_info,
5567b3effe61SBartosz Markowski 			   unit_size,
5568b3effe61SBartosz Markowski 			   num_units);
5569b3effe61SBartosz Markowski 
5570b3effe61SBartosz Markowski 		ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
5571b3effe61SBartosz Markowski 						unit_size);
5572b3effe61SBartosz Markowski 		if (ret)
5573b3effe61SBartosz Markowski 			return;
5574b3effe61SBartosz Markowski 	}
5575b3effe61SBartosz Markowski 
5576a925a376SVasanthakumar Thiagarajan skip_mem_alloc:
55777aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
557873690c48STomislav Požega 		   "wmi event service ready min_tx_power 0x%08x max_tx_power 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_mcs 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 low_2ghz_chan %d high_2ghz_chan %d low_5ghz_chan %d high_5ghz_chan %d num_mem_reqs 0x%08x\n",
55795c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.min_tx_power),
55805c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.max_tx_power),
55815c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.ht_cap),
55825c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.vht_cap),
558373690c48STomislav Požega 		   __le32_to_cpu(arg.vht_supp_mcs),
55845c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.sw_ver0),
55855c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.sw_ver1),
5586ca996ec5SMichal Kazior 		   __le32_to_cpu(arg.fw_build),
55875c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.phy_capab),
55885c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.num_rf_chains),
55895c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.eeprom_rd),
5590275ea1b2STomislav Požega 		   __le32_to_cpu(arg.low_2ghz_chan),
5591275ea1b2STomislav Požega 		   __le32_to_cpu(arg.high_2ghz_chan),
5592275ea1b2STomislav Požega 		   __le32_to_cpu(arg.low_5ghz_chan),
5593275ea1b2STomislav Požega 		   __le32_to_cpu(arg.high_5ghz_chan),
55945c01aa3dSMichal Kazior 		   __le32_to_cpu(arg.num_mem_reqs));
55956f97d256SBartosz Markowski 
5596c8ecfc1cSRaja Mani 	dev_kfree_skb(skb);
5597c8ecfc1cSRaja Mani 	ar->svc_rdy_skb = NULL;
55986f97d256SBartosz Markowski 	complete(&ar->wmi.service_ready);
55996f97d256SBartosz Markowski }
56006f97d256SBartosz Markowski 
5601c8ecfc1cSRaja Mani void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb)
5602c8ecfc1cSRaja Mani {
5603c8ecfc1cSRaja Mani 	ar->svc_rdy_skb = skb;
5604c8ecfc1cSRaja Mani 	queue_work(ar->workqueue_aux, &ar->svc_rdy_work);
5605c8ecfc1cSRaja Mani }
5606c8ecfc1cSRaja Mani 
5607d7579d12SMichal Kazior static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
560832653cf1SMichal Kazior 				     struct wmi_rdy_ev_arg *arg)
560932653cf1SMichal Kazior {
561032653cf1SMichal Kazior 	struct wmi_ready_event *ev = (void *)skb->data;
561132653cf1SMichal Kazior 
561232653cf1SMichal Kazior 	if (skb->len < sizeof(*ev))
561332653cf1SMichal Kazior 		return -EPROTO;
561432653cf1SMichal Kazior 
561532653cf1SMichal Kazior 	skb_pull(skb, sizeof(*ev));
561632653cf1SMichal Kazior 	arg->sw_version = ev->sw_version;
561732653cf1SMichal Kazior 	arg->abi_version = ev->abi_version;
561832653cf1SMichal Kazior 	arg->status = ev->status;
561932653cf1SMichal Kazior 	arg->mac_addr = ev->mac_addr.addr;
562032653cf1SMichal Kazior 
562132653cf1SMichal Kazior 	return 0;
562232653cf1SMichal Kazior }
562332653cf1SMichal Kazior 
5624c1a4654aSMichal Kazior static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
5625c1a4654aSMichal Kazior 				      struct wmi_roam_ev_arg *arg)
5626c1a4654aSMichal Kazior {
5627c1a4654aSMichal Kazior 	struct wmi_roam_ev *ev = (void *)skb->data;
5628c1a4654aSMichal Kazior 
5629c1a4654aSMichal Kazior 	if (skb->len < sizeof(*ev))
5630c1a4654aSMichal Kazior 		return -EPROTO;
5631c1a4654aSMichal Kazior 
5632c1a4654aSMichal Kazior 	skb_pull(skb, sizeof(*ev));
5633c1a4654aSMichal Kazior 	arg->vdev_id = ev->vdev_id;
5634c1a4654aSMichal Kazior 	arg->reason = ev->reason;
5635c1a4654aSMichal Kazior 
5636c1a4654aSMichal Kazior 	return 0;
5637c1a4654aSMichal Kazior }
5638c1a4654aSMichal Kazior 
563984d4911bSMichal Kazior static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar,
564084d4911bSMichal Kazior 				      struct sk_buff *skb,
564184d4911bSMichal Kazior 				      struct wmi_echo_ev_arg *arg)
564284d4911bSMichal Kazior {
564384d4911bSMichal Kazior 	struct wmi_echo_event *ev = (void *)skb->data;
564484d4911bSMichal Kazior 
564584d4911bSMichal Kazior 	arg->value = ev->value;
564684d4911bSMichal Kazior 
564784d4911bSMichal Kazior 	return 0;
564884d4911bSMichal Kazior }
564984d4911bSMichal Kazior 
56500226d602SMichal Kazior int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb)
56515e3dd157SKalle Valo {
565232653cf1SMichal Kazior 	struct wmi_rdy_ev_arg arg = {};
565332653cf1SMichal Kazior 	int ret;
56545e3dd157SKalle Valo 
5655d7579d12SMichal Kazior 	ret = ath10k_wmi_pull_rdy(ar, skb, &arg);
565632653cf1SMichal Kazior 	if (ret) {
565732653cf1SMichal Kazior 		ath10k_warn(ar, "failed to parse ready event: %d\n", ret);
565832653cf1SMichal Kazior 		return ret;
565932653cf1SMichal Kazior 	}
56605e3dd157SKalle Valo 
56617aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
56627b308732STomislav Požega 		   "wmi event ready sw_version 0x%08x abi_version %u mac_addr %pM status %d\n",
566332653cf1SMichal Kazior 		   __le32_to_cpu(arg.sw_version),
566432653cf1SMichal Kazior 		   __le32_to_cpu(arg.abi_version),
566532653cf1SMichal Kazior 		   arg.mac_addr,
566632653cf1SMichal Kazior 		   __le32_to_cpu(arg.status));
56675e3dd157SKalle Valo 
56689d580466SBrian Norris 	if (is_zero_ether_addr(ar->mac_addr))
566932653cf1SMichal Kazior 		ether_addr_copy(ar->mac_addr, arg.mac_addr);
56705e3dd157SKalle Valo 	complete(&ar->wmi.unified_ready);
56715e3dd157SKalle Valo 	return 0;
56725e3dd157SKalle Valo }
56735e3dd157SKalle Valo 
5674cea19a6cSCarl Huang void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb)
5675cea19a6cSCarl Huang {
5676cea19a6cSCarl Huang 	int ret;
5677cea19a6cSCarl Huang 	struct wmi_svc_avail_ev_arg arg = {};
5678cea19a6cSCarl Huang 
5679cea19a6cSCarl Huang 	ret = ath10k_wmi_pull_svc_avail(ar, skb, &arg);
5680cea19a6cSCarl Huang 	if (ret) {
568178528134SColin Ian King 		ath10k_warn(ar, "failed to parse service available event: %d\n",
5682cea19a6cSCarl Huang 			    ret);
5683cea19a6cSCarl Huang 	}
5684cea19a6cSCarl Huang 
5685cea19a6cSCarl Huang 	ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
5686cea19a6cSCarl Huang 			       __le32_to_cpu(arg.service_map_ext_len));
5687cea19a6cSCarl Huang }
5688cea19a6cSCarl Huang 
5689a57a6a27SRajkumar Manoharan static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
5690a57a6a27SRajkumar Manoharan {
5691a57a6a27SRajkumar Manoharan 	const struct wmi_pdev_temperature_event *ev;
5692a57a6a27SRajkumar Manoharan 
5693a57a6a27SRajkumar Manoharan 	ev = (struct wmi_pdev_temperature_event *)skb->data;
5694a57a6a27SRajkumar Manoharan 	if (WARN_ON(skb->len < sizeof(*ev)))
5695a57a6a27SRajkumar Manoharan 		return -EPROTO;
5696a57a6a27SRajkumar Manoharan 
5697ac2953fcSRajkumar Manoharan 	ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature));
5698a57a6a27SRajkumar Manoharan 	return 0;
5699a57a6a27SRajkumar Manoharan }
5700a57a6a27SRajkumar Manoharan 
570189d2d183SRajkumar Manoharan static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar,
570289d2d183SRajkumar Manoharan 					       struct sk_buff *skb)
570389d2d183SRajkumar Manoharan {
570489d2d183SRajkumar Manoharan 	struct wmi_pdev_bss_chan_info_event *ev;
5705fa7937e3SRajkumar Manoharan 	struct survey_info *survey;
570689d2d183SRajkumar Manoharan 	u64 busy, total, tx, rx, rx_bss;
570789d2d183SRajkumar Manoharan 	u32 freq, noise_floor;
5708fa7937e3SRajkumar Manoharan 	u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz;
5709fa7937e3SRajkumar Manoharan 	int idx;
571089d2d183SRajkumar Manoharan 
571189d2d183SRajkumar Manoharan 	ev = (struct wmi_pdev_bss_chan_info_event *)skb->data;
571289d2d183SRajkumar Manoharan 	if (WARN_ON(skb->len < sizeof(*ev)))
571389d2d183SRajkumar Manoharan 		return -EPROTO;
571489d2d183SRajkumar Manoharan 
571589d2d183SRajkumar Manoharan 	freq        = __le32_to_cpu(ev->freq);
571689d2d183SRajkumar Manoharan 	noise_floor = __le32_to_cpu(ev->noise_floor);
571789d2d183SRajkumar Manoharan 	busy        = __le64_to_cpu(ev->cycle_busy);
571889d2d183SRajkumar Manoharan 	total       = __le64_to_cpu(ev->cycle_total);
571989d2d183SRajkumar Manoharan 	tx          = __le64_to_cpu(ev->cycle_tx);
572089d2d183SRajkumar Manoharan 	rx          = __le64_to_cpu(ev->cycle_rx);
572189d2d183SRajkumar Manoharan 	rx_bss      = __le64_to_cpu(ev->cycle_rx_bss);
572289d2d183SRajkumar Manoharan 
572389d2d183SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
572489d2d183SRajkumar 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",
572589d2d183SRajkumar Manoharan 		   freq, noise_floor, busy, total, tx, rx, rx_bss);
572689d2d183SRajkumar Manoharan 
5727fa7937e3SRajkumar Manoharan 	spin_lock_bh(&ar->data_lock);
5728fa7937e3SRajkumar Manoharan 	idx = freq_to_idx(ar, freq);
5729fa7937e3SRajkumar Manoharan 	if (idx >= ARRAY_SIZE(ar->survey)) {
5730fa7937e3SRajkumar Manoharan 		ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n",
5731fa7937e3SRajkumar Manoharan 			    freq, idx);
5732fa7937e3SRajkumar Manoharan 		goto exit;
5733fa7937e3SRajkumar Manoharan 	}
5734fa7937e3SRajkumar Manoharan 
5735fa7937e3SRajkumar Manoharan 	survey = &ar->survey[idx];
5736fa7937e3SRajkumar Manoharan 
5737fa7937e3SRajkumar Manoharan 	survey->noise     = noise_floor;
5738fa7937e3SRajkumar Manoharan 	survey->time      = div_u64(total, cc_freq_hz);
5739fa7937e3SRajkumar Manoharan 	survey->time_busy = div_u64(busy, cc_freq_hz);
5740fa7937e3SRajkumar Manoharan 	survey->time_rx   = div_u64(rx_bss, cc_freq_hz);
5741fa7937e3SRajkumar Manoharan 	survey->time_tx   = div_u64(tx, cc_freq_hz);
5742fa7937e3SRajkumar Manoharan 	survey->filled   |= (SURVEY_INFO_NOISE_DBM |
5743fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME |
5744fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME_BUSY |
5745fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME_RX |
5746fa7937e3SRajkumar Manoharan 			     SURVEY_INFO_TIME_TX);
5747fa7937e3SRajkumar Manoharan exit:
5748fa7937e3SRajkumar Manoharan 	spin_unlock_bh(&ar->data_lock);
5749fa7937e3SRajkumar Manoharan 	complete(&ar->bss_survey_done);
575089d2d183SRajkumar Manoharan 	return 0;
575189d2d183SRajkumar Manoharan }
575289d2d183SRajkumar Manoharan 
5753ebee76f7SBenjamin Berg static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k *ar)
5754ebee76f7SBenjamin Berg {
5755ebee76f7SBenjamin Berg 	if (ar->hw_params.hw_ops->set_coverage_class) {
5756ebee76f7SBenjamin Berg 		spin_lock_bh(&ar->data_lock);
5757ebee76f7SBenjamin Berg 
5758ebee76f7SBenjamin Berg 		/* This call only ensures that the modified coverage class
5759ebee76f7SBenjamin Berg 		 * persists in case the firmware sets the registers back to
5760ebee76f7SBenjamin Berg 		 * their default value. So calling it is only necessary if the
5761ebee76f7SBenjamin Berg 		 * coverage class has a non-zero value.
5762ebee76f7SBenjamin Berg 		 */
5763ebee76f7SBenjamin Berg 		if (ar->fw_coverage.coverage_class)
5764ebee76f7SBenjamin Berg 			queue_work(ar->workqueue, &ar->set_coverage_class_work);
5765ebee76f7SBenjamin Berg 
5766ebee76f7SBenjamin Berg 		spin_unlock_bh(&ar->data_lock);
5767ebee76f7SBenjamin Berg 	}
5768ebee76f7SBenjamin Berg }
5769ebee76f7SBenjamin Berg 
5770d7579d12SMichal Kazior static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb)
57715e3dd157SKalle Valo {
57725e3dd157SKalle Valo 	struct wmi_cmd_hdr *cmd_hdr;
57735e3dd157SKalle Valo 	enum wmi_event_id id;
57745e3dd157SKalle Valo 
57755e3dd157SKalle Valo 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
57765e3dd157SKalle Valo 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
57775e3dd157SKalle Valo 
57785e3dd157SKalle Valo 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5779469d479fSMichal Kazior 		goto out;
57805e3dd157SKalle Valo 
5781d35a6c18SMichal Kazior 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
57825e3dd157SKalle Valo 
57835e3dd157SKalle Valo 	switch (id) {
57845e3dd157SKalle Valo 	case WMI_MGMT_RX_EVENTID:
57855e3dd157SKalle Valo 		ath10k_wmi_event_mgmt_rx(ar, skb);
57865e3dd157SKalle Valo 		/* mgmt_rx() owns the skb now! */
57875e3dd157SKalle Valo 		return;
57885e3dd157SKalle Valo 	case WMI_SCAN_EVENTID:
57895e3dd157SKalle Valo 		ath10k_wmi_event_scan(ar, skb);
5790ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
57915e3dd157SKalle Valo 		break;
57925e3dd157SKalle Valo 	case WMI_CHAN_INFO_EVENTID:
57935e3dd157SKalle Valo 		ath10k_wmi_event_chan_info(ar, skb);
57945e3dd157SKalle Valo 		break;
57955e3dd157SKalle Valo 	case WMI_ECHO_EVENTID:
57965e3dd157SKalle Valo 		ath10k_wmi_event_echo(ar, skb);
57975e3dd157SKalle Valo 		break;
57985e3dd157SKalle Valo 	case WMI_DEBUG_MESG_EVENTID:
57995e3dd157SKalle Valo 		ath10k_wmi_event_debug_mesg(ar, skb);
5800ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
58015e3dd157SKalle Valo 		break;
58025e3dd157SKalle Valo 	case WMI_UPDATE_STATS_EVENTID:
58035e3dd157SKalle Valo 		ath10k_wmi_event_update_stats(ar, skb);
58045e3dd157SKalle Valo 		break;
58055e3dd157SKalle Valo 	case WMI_VDEV_START_RESP_EVENTID:
58065e3dd157SKalle Valo 		ath10k_wmi_event_vdev_start_resp(ar, skb);
5807ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
58085e3dd157SKalle Valo 		break;
58095e3dd157SKalle Valo 	case WMI_VDEV_STOPPED_EVENTID:
58105e3dd157SKalle Valo 		ath10k_wmi_event_vdev_stopped(ar, skb);
5811ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
58125e3dd157SKalle Valo 		break;
58135e3dd157SKalle Valo 	case WMI_PEER_STA_KICKOUT_EVENTID:
58145e3dd157SKalle Valo 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
58155e3dd157SKalle Valo 		break;
58165e3dd157SKalle Valo 	case WMI_HOST_SWBA_EVENTID:
58175e3dd157SKalle Valo 		ath10k_wmi_event_host_swba(ar, skb);
58185e3dd157SKalle Valo 		break;
58195e3dd157SKalle Valo 	case WMI_TBTTOFFSET_UPDATE_EVENTID:
58205e3dd157SKalle Valo 		ath10k_wmi_event_tbttoffset_update(ar, skb);
58215e3dd157SKalle Valo 		break;
58225e3dd157SKalle Valo 	case WMI_PHYERR_EVENTID:
58235e3dd157SKalle Valo 		ath10k_wmi_event_phyerr(ar, skb);
58245e3dd157SKalle Valo 		break;
58255e3dd157SKalle Valo 	case WMI_ROAM_EVENTID:
58265e3dd157SKalle Valo 		ath10k_wmi_event_roam(ar, skb);
5827ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
58285e3dd157SKalle Valo 		break;
58295e3dd157SKalle Valo 	case WMI_PROFILE_MATCH:
58305e3dd157SKalle Valo 		ath10k_wmi_event_profile_match(ar, skb);
58315e3dd157SKalle Valo 		break;
58325e3dd157SKalle Valo 	case WMI_DEBUG_PRINT_EVENTID:
58335e3dd157SKalle Valo 		ath10k_wmi_event_debug_print(ar, skb);
5834ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
58355e3dd157SKalle Valo 		break;
58365e3dd157SKalle Valo 	case WMI_PDEV_QVIT_EVENTID:
58375e3dd157SKalle Valo 		ath10k_wmi_event_pdev_qvit(ar, skb);
58385e3dd157SKalle Valo 		break;
58395e3dd157SKalle Valo 	case WMI_WLAN_PROFILE_DATA_EVENTID:
58405e3dd157SKalle Valo 		ath10k_wmi_event_wlan_profile_data(ar, skb);
58415e3dd157SKalle Valo 		break;
58425e3dd157SKalle Valo 	case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
58435e3dd157SKalle Valo 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
58445e3dd157SKalle Valo 		break;
58455e3dd157SKalle Valo 	case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
58465e3dd157SKalle Valo 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
58475e3dd157SKalle Valo 		break;
58485e3dd157SKalle Valo 	case WMI_RTT_ERROR_REPORT_EVENTID:
58495e3dd157SKalle Valo 		ath10k_wmi_event_rtt_error_report(ar, skb);
58505e3dd157SKalle Valo 		break;
58515e3dd157SKalle Valo 	case WMI_WOW_WAKEUP_HOST_EVENTID:
58525e3dd157SKalle Valo 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
58535e3dd157SKalle Valo 		break;
58545e3dd157SKalle Valo 	case WMI_DCS_INTERFERENCE_EVENTID:
58555e3dd157SKalle Valo 		ath10k_wmi_event_dcs_interference(ar, skb);
58565e3dd157SKalle Valo 		break;
58575e3dd157SKalle Valo 	case WMI_PDEV_TPC_CONFIG_EVENTID:
58585e3dd157SKalle Valo 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
58595e3dd157SKalle Valo 		break;
58605e3dd157SKalle Valo 	case WMI_PDEV_FTM_INTG_EVENTID:
58615e3dd157SKalle Valo 		ath10k_wmi_event_pdev_ftm_intg(ar, skb);
58625e3dd157SKalle Valo 		break;
58635e3dd157SKalle Valo 	case WMI_GTK_OFFLOAD_STATUS_EVENTID:
58645e3dd157SKalle Valo 		ath10k_wmi_event_gtk_offload_status(ar, skb);
58655e3dd157SKalle Valo 		break;
58665e3dd157SKalle Valo 	case WMI_GTK_REKEY_FAIL_EVENTID:
58675e3dd157SKalle Valo 		ath10k_wmi_event_gtk_rekey_fail(ar, skb);
58685e3dd157SKalle Valo 		break;
58695e3dd157SKalle Valo 	case WMI_TX_DELBA_COMPLETE_EVENTID:
58705e3dd157SKalle Valo 		ath10k_wmi_event_delba_complete(ar, skb);
58715e3dd157SKalle Valo 		break;
58725e3dd157SKalle Valo 	case WMI_TX_ADDBA_COMPLETE_EVENTID:
58735e3dd157SKalle Valo 		ath10k_wmi_event_addba_complete(ar, skb);
58745e3dd157SKalle Valo 		break;
58755e3dd157SKalle Valo 	case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
58765e3dd157SKalle Valo 		ath10k_wmi_event_vdev_install_key_complete(ar, skb);
58775e3dd157SKalle Valo 		break;
58785e3dd157SKalle Valo 	case WMI_SERVICE_READY_EVENTID:
5879b34d2b3dSMichal Kazior 		ath10k_wmi_event_service_ready(ar, skb);
5880c8ecfc1cSRaja Mani 		return;
58815e3dd157SKalle Valo 	case WMI_READY_EVENTID:
5882b34d2b3dSMichal Kazior 		ath10k_wmi_event_ready(ar, skb);
5883ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
58845e3dd157SKalle Valo 		break;
5885cea19a6cSCarl Huang 	case WMI_SERVICE_AVAILABLE_EVENTID:
5886cea19a6cSCarl Huang 		ath10k_wmi_event_service_available(ar, skb);
5887cea19a6cSCarl Huang 		break;
58885e3dd157SKalle Valo 	default:
58897aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
58905e3dd157SKalle Valo 		break;
58915e3dd157SKalle Valo 	}
58925e3dd157SKalle Valo 
5893469d479fSMichal Kazior out:
58945e3dd157SKalle Valo 	dev_kfree_skb(skb);
58955e3dd157SKalle Valo }
58965e3dd157SKalle Valo 
5897d7579d12SMichal Kazior static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb)
58988a6618b0SBartosz Markowski {
58998a6618b0SBartosz Markowski 	struct wmi_cmd_hdr *cmd_hdr;
59008a6618b0SBartosz Markowski 	enum wmi_10x_event_id id;
590143d2a30fSKalle Valo 	bool consumed;
59028a6618b0SBartosz Markowski 
59038a6618b0SBartosz Markowski 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
59048a6618b0SBartosz Markowski 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
59058a6618b0SBartosz Markowski 
59068a6618b0SBartosz Markowski 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5907469d479fSMichal Kazior 		goto out;
59088a6618b0SBartosz Markowski 
5909d35a6c18SMichal Kazior 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
59108a6618b0SBartosz Markowski 
591143d2a30fSKalle Valo 	consumed = ath10k_tm_event_wmi(ar, id, skb);
591243d2a30fSKalle Valo 
591343d2a30fSKalle Valo 	/* Ready event must be handled normally also in UTF mode so that we
591443d2a30fSKalle Valo 	 * know the UTF firmware has booted, others we are just bypass WMI
591543d2a30fSKalle Valo 	 * events to testmode.
591643d2a30fSKalle Valo 	 */
591743d2a30fSKalle Valo 	if (consumed && id != WMI_10X_READY_EVENTID) {
591843d2a30fSKalle Valo 		ath10k_dbg(ar, ATH10K_DBG_WMI,
591943d2a30fSKalle Valo 			   "wmi testmode consumed 0x%x\n", id);
592043d2a30fSKalle Valo 		goto out;
592143d2a30fSKalle Valo 	}
592243d2a30fSKalle Valo 
59238a6618b0SBartosz Markowski 	switch (id) {
59248a6618b0SBartosz Markowski 	case WMI_10X_MGMT_RX_EVENTID:
59258a6618b0SBartosz Markowski 		ath10k_wmi_event_mgmt_rx(ar, skb);
59268a6618b0SBartosz Markowski 		/* mgmt_rx() owns the skb now! */
59278a6618b0SBartosz Markowski 		return;
59288a6618b0SBartosz Markowski 	case WMI_10X_SCAN_EVENTID:
59298a6618b0SBartosz Markowski 		ath10k_wmi_event_scan(ar, skb);
5930ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
59318a6618b0SBartosz Markowski 		break;
59328a6618b0SBartosz Markowski 	case WMI_10X_CHAN_INFO_EVENTID:
59338a6618b0SBartosz Markowski 		ath10k_wmi_event_chan_info(ar, skb);
59348a6618b0SBartosz Markowski 		break;
59358a6618b0SBartosz Markowski 	case WMI_10X_ECHO_EVENTID:
59368a6618b0SBartosz Markowski 		ath10k_wmi_event_echo(ar, skb);
59378a6618b0SBartosz Markowski 		break;
59388a6618b0SBartosz Markowski 	case WMI_10X_DEBUG_MESG_EVENTID:
59398a6618b0SBartosz Markowski 		ath10k_wmi_event_debug_mesg(ar, skb);
5940ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
59418a6618b0SBartosz Markowski 		break;
59428a6618b0SBartosz Markowski 	case WMI_10X_UPDATE_STATS_EVENTID:
59438a6618b0SBartosz Markowski 		ath10k_wmi_event_update_stats(ar, skb);
59448a6618b0SBartosz Markowski 		break;
59458a6618b0SBartosz Markowski 	case WMI_10X_VDEV_START_RESP_EVENTID:
59468a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_start_resp(ar, skb);
5947ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
59488a6618b0SBartosz Markowski 		break;
59498a6618b0SBartosz Markowski 	case WMI_10X_VDEV_STOPPED_EVENTID:
59508a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_stopped(ar, skb);
5951ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
59528a6618b0SBartosz Markowski 		break;
59538a6618b0SBartosz Markowski 	case WMI_10X_PEER_STA_KICKOUT_EVENTID:
59548a6618b0SBartosz Markowski 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
59558a6618b0SBartosz Markowski 		break;
59568a6618b0SBartosz Markowski 	case WMI_10X_HOST_SWBA_EVENTID:
59578a6618b0SBartosz Markowski 		ath10k_wmi_event_host_swba(ar, skb);
59588a6618b0SBartosz Markowski 		break;
59598a6618b0SBartosz Markowski 	case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
59608a6618b0SBartosz Markowski 		ath10k_wmi_event_tbttoffset_update(ar, skb);
59618a6618b0SBartosz Markowski 		break;
59628a6618b0SBartosz Markowski 	case WMI_10X_PHYERR_EVENTID:
59638a6618b0SBartosz Markowski 		ath10k_wmi_event_phyerr(ar, skb);
59648a6618b0SBartosz Markowski 		break;
59658a6618b0SBartosz Markowski 	case WMI_10X_ROAM_EVENTID:
59668a6618b0SBartosz Markowski 		ath10k_wmi_event_roam(ar, skb);
5967ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
59688a6618b0SBartosz Markowski 		break;
59698a6618b0SBartosz Markowski 	case WMI_10X_PROFILE_MATCH:
59708a6618b0SBartosz Markowski 		ath10k_wmi_event_profile_match(ar, skb);
59718a6618b0SBartosz Markowski 		break;
59728a6618b0SBartosz Markowski 	case WMI_10X_DEBUG_PRINT_EVENTID:
59738a6618b0SBartosz Markowski 		ath10k_wmi_event_debug_print(ar, skb);
5974ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
59758a6618b0SBartosz Markowski 		break;
59768a6618b0SBartosz Markowski 	case WMI_10X_PDEV_QVIT_EVENTID:
59778a6618b0SBartosz Markowski 		ath10k_wmi_event_pdev_qvit(ar, skb);
59788a6618b0SBartosz Markowski 		break;
59798a6618b0SBartosz Markowski 	case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
59808a6618b0SBartosz Markowski 		ath10k_wmi_event_wlan_profile_data(ar, skb);
59818a6618b0SBartosz Markowski 		break;
59828a6618b0SBartosz Markowski 	case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
59838a6618b0SBartosz Markowski 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
59848a6618b0SBartosz Markowski 		break;
59858a6618b0SBartosz Markowski 	case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
59868a6618b0SBartosz Markowski 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
59878a6618b0SBartosz Markowski 		break;
59888a6618b0SBartosz Markowski 	case WMI_10X_RTT_ERROR_REPORT_EVENTID:
59898a6618b0SBartosz Markowski 		ath10k_wmi_event_rtt_error_report(ar, skb);
59908a6618b0SBartosz Markowski 		break;
59918a6618b0SBartosz Markowski 	case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
59928a6618b0SBartosz Markowski 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
59938a6618b0SBartosz Markowski 		break;
59948a6618b0SBartosz Markowski 	case WMI_10X_DCS_INTERFERENCE_EVENTID:
59958a6618b0SBartosz Markowski 		ath10k_wmi_event_dcs_interference(ar, skb);
59968a6618b0SBartosz Markowski 		break;
59978a6618b0SBartosz Markowski 	case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
59988a6618b0SBartosz Markowski 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
59998a6618b0SBartosz Markowski 		break;
60008a6618b0SBartosz Markowski 	case WMI_10X_INST_RSSI_STATS_EVENTID:
60018a6618b0SBartosz Markowski 		ath10k_wmi_event_inst_rssi_stats(ar, skb);
60028a6618b0SBartosz Markowski 		break;
60038a6618b0SBartosz Markowski 	case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
60048a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_standby_req(ar, skb);
60058a6618b0SBartosz Markowski 		break;
60068a6618b0SBartosz Markowski 	case WMI_10X_VDEV_RESUME_REQ_EVENTID:
60078a6618b0SBartosz Markowski 		ath10k_wmi_event_vdev_resume_req(ar, skb);
60088a6618b0SBartosz Markowski 		break;
60098a6618b0SBartosz Markowski 	case WMI_10X_SERVICE_READY_EVENTID:
6010b34d2b3dSMichal Kazior 		ath10k_wmi_event_service_ready(ar, skb);
6011c8ecfc1cSRaja Mani 		return;
60128a6618b0SBartosz Markowski 	case WMI_10X_READY_EVENTID:
6013b34d2b3dSMichal Kazior 		ath10k_wmi_event_ready(ar, skb);
6014ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
60158a6618b0SBartosz Markowski 		break;
601643d2a30fSKalle Valo 	case WMI_10X_PDEV_UTF_EVENTID:
601743d2a30fSKalle Valo 		/* ignore utf events */
601843d2a30fSKalle Valo 		break;
60198a6618b0SBartosz Markowski 	default:
60207aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
60218a6618b0SBartosz Markowski 		break;
60228a6618b0SBartosz Markowski 	}
60238a6618b0SBartosz Markowski 
602443d2a30fSKalle Valo out:
60258a6618b0SBartosz Markowski 	dev_kfree_skb(skb);
60268a6618b0SBartosz Markowski }
60278a6618b0SBartosz Markowski 
6028d7579d12SMichal Kazior static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
602924c88f78SMichal Kazior {
603024c88f78SMichal Kazior 	struct wmi_cmd_hdr *cmd_hdr;
603124c88f78SMichal Kazior 	enum wmi_10_2_event_id id;
6032d912fc09STamizh chelvam 	bool consumed;
603324c88f78SMichal Kazior 
603424c88f78SMichal Kazior 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
603524c88f78SMichal Kazior 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
603624c88f78SMichal Kazior 
603724c88f78SMichal Kazior 	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
6038469d479fSMichal Kazior 		goto out;
603924c88f78SMichal Kazior 
6040d35a6c18SMichal Kazior 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
604124c88f78SMichal Kazior 
6042d912fc09STamizh chelvam 	consumed = ath10k_tm_event_wmi(ar, id, skb);
6043d912fc09STamizh chelvam 
6044d912fc09STamizh chelvam 	/* Ready event must be handled normally also in UTF mode so that we
6045d912fc09STamizh chelvam 	 * know the UTF firmware has booted, others we are just bypass WMI
6046d912fc09STamizh chelvam 	 * events to testmode.
6047d912fc09STamizh chelvam 	 */
6048d912fc09STamizh chelvam 	if (consumed && id != WMI_10_2_READY_EVENTID) {
6049d912fc09STamizh chelvam 		ath10k_dbg(ar, ATH10K_DBG_WMI,
6050d912fc09STamizh chelvam 			   "wmi testmode consumed 0x%x\n", id);
6051d912fc09STamizh chelvam 		goto out;
6052d912fc09STamizh chelvam 	}
6053d912fc09STamizh chelvam 
605424c88f78SMichal Kazior 	switch (id) {
605524c88f78SMichal Kazior 	case WMI_10_2_MGMT_RX_EVENTID:
605624c88f78SMichal Kazior 		ath10k_wmi_event_mgmt_rx(ar, skb);
605724c88f78SMichal Kazior 		/* mgmt_rx() owns the skb now! */
605824c88f78SMichal Kazior 		return;
605924c88f78SMichal Kazior 	case WMI_10_2_SCAN_EVENTID:
606024c88f78SMichal Kazior 		ath10k_wmi_event_scan(ar, skb);
6061ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
606224c88f78SMichal Kazior 		break;
606324c88f78SMichal Kazior 	case WMI_10_2_CHAN_INFO_EVENTID:
606424c88f78SMichal Kazior 		ath10k_wmi_event_chan_info(ar, skb);
606524c88f78SMichal Kazior 		break;
606624c88f78SMichal Kazior 	case WMI_10_2_ECHO_EVENTID:
606724c88f78SMichal Kazior 		ath10k_wmi_event_echo(ar, skb);
606824c88f78SMichal Kazior 		break;
606924c88f78SMichal Kazior 	case WMI_10_2_DEBUG_MESG_EVENTID:
607024c88f78SMichal Kazior 		ath10k_wmi_event_debug_mesg(ar, skb);
6071ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
607224c88f78SMichal Kazior 		break;
607324c88f78SMichal Kazior 	case WMI_10_2_UPDATE_STATS_EVENTID:
607424c88f78SMichal Kazior 		ath10k_wmi_event_update_stats(ar, skb);
607524c88f78SMichal Kazior 		break;
607624c88f78SMichal Kazior 	case WMI_10_2_VDEV_START_RESP_EVENTID:
607724c88f78SMichal Kazior 		ath10k_wmi_event_vdev_start_resp(ar, skb);
6078ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
607924c88f78SMichal Kazior 		break;
608024c88f78SMichal Kazior 	case WMI_10_2_VDEV_STOPPED_EVENTID:
608124c88f78SMichal Kazior 		ath10k_wmi_event_vdev_stopped(ar, skb);
6082ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
608324c88f78SMichal Kazior 		break;
608424c88f78SMichal Kazior 	case WMI_10_2_PEER_STA_KICKOUT_EVENTID:
608524c88f78SMichal Kazior 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
608624c88f78SMichal Kazior 		break;
608724c88f78SMichal Kazior 	case WMI_10_2_HOST_SWBA_EVENTID:
608824c88f78SMichal Kazior 		ath10k_wmi_event_host_swba(ar, skb);
608924c88f78SMichal Kazior 		break;
609024c88f78SMichal Kazior 	case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID:
609124c88f78SMichal Kazior 		ath10k_wmi_event_tbttoffset_update(ar, skb);
609224c88f78SMichal Kazior 		break;
609324c88f78SMichal Kazior 	case WMI_10_2_PHYERR_EVENTID:
609424c88f78SMichal Kazior 		ath10k_wmi_event_phyerr(ar, skb);
609524c88f78SMichal Kazior 		break;
609624c88f78SMichal Kazior 	case WMI_10_2_ROAM_EVENTID:
609724c88f78SMichal Kazior 		ath10k_wmi_event_roam(ar, skb);
6098ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
609924c88f78SMichal Kazior 		break;
610024c88f78SMichal Kazior 	case WMI_10_2_PROFILE_MATCH:
610124c88f78SMichal Kazior 		ath10k_wmi_event_profile_match(ar, skb);
610224c88f78SMichal Kazior 		break;
610324c88f78SMichal Kazior 	case WMI_10_2_DEBUG_PRINT_EVENTID:
610424c88f78SMichal Kazior 		ath10k_wmi_event_debug_print(ar, skb);
6105ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
610624c88f78SMichal Kazior 		break;
610724c88f78SMichal Kazior 	case WMI_10_2_PDEV_QVIT_EVENTID:
610824c88f78SMichal Kazior 		ath10k_wmi_event_pdev_qvit(ar, skb);
610924c88f78SMichal Kazior 		break;
611024c88f78SMichal Kazior 	case WMI_10_2_WLAN_PROFILE_DATA_EVENTID:
611124c88f78SMichal Kazior 		ath10k_wmi_event_wlan_profile_data(ar, skb);
611224c88f78SMichal Kazior 		break;
611324c88f78SMichal Kazior 	case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID:
611424c88f78SMichal Kazior 		ath10k_wmi_event_rtt_measurement_report(ar, skb);
611524c88f78SMichal Kazior 		break;
611624c88f78SMichal Kazior 	case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID:
611724c88f78SMichal Kazior 		ath10k_wmi_event_tsf_measurement_report(ar, skb);
611824c88f78SMichal Kazior 		break;
611924c88f78SMichal Kazior 	case WMI_10_2_RTT_ERROR_REPORT_EVENTID:
612024c88f78SMichal Kazior 		ath10k_wmi_event_rtt_error_report(ar, skb);
612124c88f78SMichal Kazior 		break;
612224c88f78SMichal Kazior 	case WMI_10_2_WOW_WAKEUP_HOST_EVENTID:
612324c88f78SMichal Kazior 		ath10k_wmi_event_wow_wakeup_host(ar, skb);
612424c88f78SMichal Kazior 		break;
612524c88f78SMichal Kazior 	case WMI_10_2_DCS_INTERFERENCE_EVENTID:
612624c88f78SMichal Kazior 		ath10k_wmi_event_dcs_interference(ar, skb);
612724c88f78SMichal Kazior 		break;
612824c88f78SMichal Kazior 	case WMI_10_2_PDEV_TPC_CONFIG_EVENTID:
612924c88f78SMichal Kazior 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
613024c88f78SMichal Kazior 		break;
613124c88f78SMichal Kazior 	case WMI_10_2_INST_RSSI_STATS_EVENTID:
613224c88f78SMichal Kazior 		ath10k_wmi_event_inst_rssi_stats(ar, skb);
613324c88f78SMichal Kazior 		break;
613424c88f78SMichal Kazior 	case WMI_10_2_VDEV_STANDBY_REQ_EVENTID:
613524c88f78SMichal Kazior 		ath10k_wmi_event_vdev_standby_req(ar, skb);
6136ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
613724c88f78SMichal Kazior 		break;
613824c88f78SMichal Kazior 	case WMI_10_2_VDEV_RESUME_REQ_EVENTID:
613924c88f78SMichal Kazior 		ath10k_wmi_event_vdev_resume_req(ar, skb);
6140ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
614124c88f78SMichal Kazior 		break;
614224c88f78SMichal Kazior 	case WMI_10_2_SERVICE_READY_EVENTID:
6143b34d2b3dSMichal Kazior 		ath10k_wmi_event_service_ready(ar, skb);
6144c8ecfc1cSRaja Mani 		return;
614524c88f78SMichal Kazior 	case WMI_10_2_READY_EVENTID:
6146b34d2b3dSMichal Kazior 		ath10k_wmi_event_ready(ar, skb);
6147ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
614824c88f78SMichal Kazior 		break;
6149a57a6a27SRajkumar Manoharan 	case WMI_10_2_PDEV_TEMPERATURE_EVENTID:
6150a57a6a27SRajkumar Manoharan 		ath10k_wmi_event_temperature(ar, skb);
6151a57a6a27SRajkumar Manoharan 		break;
615289d2d183SRajkumar Manoharan 	case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID:
615389d2d183SRajkumar Manoharan 		ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
615489d2d183SRajkumar Manoharan 		break;
615524c88f78SMichal Kazior 	case WMI_10_2_RTT_KEEPALIVE_EVENTID:
615624c88f78SMichal Kazior 	case WMI_10_2_GPIO_INPUT_EVENTID:
615724c88f78SMichal Kazior 	case WMI_10_2_PEER_RATECODE_LIST_EVENTID:
615824c88f78SMichal Kazior 	case WMI_10_2_GENERIC_BUFFER_EVENTID:
615924c88f78SMichal Kazior 	case WMI_10_2_MCAST_BUF_RELEASE_EVENTID:
616024c88f78SMichal Kazior 	case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID:
616124c88f78SMichal Kazior 	case WMI_10_2_WDS_PEER_EVENTID:
61627aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
616324c88f78SMichal Kazior 			   "received event id %d not implemented\n", id);
616424c88f78SMichal Kazior 		break;
6165d70c0d46SMaharaja Kennadyrajan 	case WMI_10_2_PEER_STA_PS_STATECHG_EVENTID:
6166d70c0d46SMaharaja Kennadyrajan 		ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb);
6167d70c0d46SMaharaja Kennadyrajan 		break;
616824c88f78SMichal Kazior 	default:
61697aa7a72aSMichal Kazior 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
617024c88f78SMichal Kazior 		break;
617124c88f78SMichal Kazior 	}
617224c88f78SMichal Kazior 
6173469d479fSMichal Kazior out:
617424c88f78SMichal Kazior 	dev_kfree_skb(skb);
617524c88f78SMichal Kazior }
61768a6618b0SBartosz Markowski 
61771c092961SRaja Mani static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
61781c092961SRaja Mani {
61791c092961SRaja Mani 	struct wmi_cmd_hdr *cmd_hdr;
61801c092961SRaja Mani 	enum wmi_10_4_event_id id;
6181d912fc09STamizh chelvam 	bool consumed;
61821c092961SRaja Mani 
61831c092961SRaja Mani 	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
61841c092961SRaja Mani 	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
61851c092961SRaja Mani 
61861c092961SRaja Mani 	if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr)))
61871c092961SRaja Mani 		goto out;
61881c092961SRaja Mani 
61891c092961SRaja Mani 	trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
61901c092961SRaja Mani 
6191d912fc09STamizh chelvam 	consumed = ath10k_tm_event_wmi(ar, id, skb);
6192d912fc09STamizh chelvam 
6193d912fc09STamizh chelvam 	/* Ready event must be handled normally also in UTF mode so that we
6194d912fc09STamizh chelvam 	 * know the UTF firmware has booted, others we are just bypass WMI
6195d912fc09STamizh chelvam 	 * events to testmode.
6196d912fc09STamizh chelvam 	 */
6197d912fc09STamizh chelvam 	if (consumed && id != WMI_10_4_READY_EVENTID) {
6198d912fc09STamizh chelvam 		ath10k_dbg(ar, ATH10K_DBG_WMI,
6199d912fc09STamizh chelvam 			   "wmi testmode consumed 0x%x\n", id);
6200d912fc09STamizh chelvam 		goto out;
6201d912fc09STamizh chelvam 	}
6202d912fc09STamizh chelvam 
62031c092961SRaja Mani 	switch (id) {
62041c092961SRaja Mani 	case WMI_10_4_MGMT_RX_EVENTID:
62051c092961SRaja Mani 		ath10k_wmi_event_mgmt_rx(ar, skb);
62061c092961SRaja Mani 		/* mgmt_rx() owns the skb now! */
62071c092961SRaja Mani 		return;
6208373b48cfSRaja Mani 	case WMI_10_4_ECHO_EVENTID:
6209373b48cfSRaja Mani 		ath10k_wmi_event_echo(ar, skb);
6210373b48cfSRaja Mani 		break;
6211373b48cfSRaja Mani 	case WMI_10_4_DEBUG_MESG_EVENTID:
6212373b48cfSRaja Mani 		ath10k_wmi_event_debug_mesg(ar, skb);
6213ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6214373b48cfSRaja Mani 		break;
6215373b48cfSRaja Mani 	case WMI_10_4_SERVICE_READY_EVENTID:
6216373b48cfSRaja Mani 		ath10k_wmi_event_service_ready(ar, skb);
6217c8ecfc1cSRaja Mani 		return;
6218b2297baaSRaja Mani 	case WMI_10_4_SCAN_EVENTID:
6219b2297baaSRaja Mani 		ath10k_wmi_event_scan(ar, skb);
6220ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6221b2297baaSRaja Mani 		break;
6222b2297baaSRaja Mani 	case WMI_10_4_CHAN_INFO_EVENTID:
6223b2297baaSRaja Mani 		ath10k_wmi_event_chan_info(ar, skb);
6224b2297baaSRaja Mani 		break;
62252b0a2e0dSRaja Mani 	case WMI_10_4_PHYERR_EVENTID:
62262b0a2e0dSRaja Mani 		ath10k_wmi_event_phyerr(ar, skb);
62272b0a2e0dSRaja Mani 		break;
6228d02e752fSRaja Mani 	case WMI_10_4_READY_EVENTID:
6229d02e752fSRaja Mani 		ath10k_wmi_event_ready(ar, skb);
6230ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6231d02e752fSRaja Mani 		break;
6232373b48cfSRaja Mani 	case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
6233373b48cfSRaja Mani 		ath10k_wmi_event_peer_sta_kickout(ar, skb);
6234373b48cfSRaja Mani 		break;
6235343bf960SMohammed Shafi Shajakhan 	case WMI_10_4_ROAM_EVENTID:
6236343bf960SMohammed Shafi Shajakhan 		ath10k_wmi_event_roam(ar, skb);
6237ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6238343bf960SMohammed Shafi Shajakhan 		break;
62393cec3be3SRaja Mani 	case WMI_10_4_HOST_SWBA_EVENTID:
62403cec3be3SRaja Mani 		ath10k_wmi_event_host_swba(ar, skb);
62413cec3be3SRaja Mani 		break;
6242373b48cfSRaja Mani 	case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID:
6243373b48cfSRaja Mani 		ath10k_wmi_event_tbttoffset_update(ar, skb);
6244373b48cfSRaja Mani 		break;
6245373b48cfSRaja Mani 	case WMI_10_4_DEBUG_PRINT_EVENTID:
6246373b48cfSRaja Mani 		ath10k_wmi_event_debug_print(ar, skb);
6247ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6248373b48cfSRaja Mani 		break;
6249373b48cfSRaja Mani 	case WMI_10_4_VDEV_START_RESP_EVENTID:
6250373b48cfSRaja Mani 		ath10k_wmi_event_vdev_start_resp(ar, skb);
6251ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6252373b48cfSRaja Mani 		break;
6253373b48cfSRaja Mani 	case WMI_10_4_VDEV_STOPPED_EVENTID:
6254373b48cfSRaja Mani 		ath10k_wmi_event_vdev_stopped(ar, skb);
6255ebee76f7SBenjamin Berg 		ath10k_wmi_queue_set_coverage_class_work(ar);
6256373b48cfSRaja Mani 		break;
6257373b48cfSRaja Mani 	case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
625836bd39bbSVasanthakumar Thiagarajan 	case WMI_10_4_PEER_RATECODE_LIST_EVENTID:
625903c41cc1SMohammed Shafi Shajakhan 	case WMI_10_4_WDS_PEER_EVENTID:
6260606204bbSSathishkumar Muruganandam 	case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID:
6261373b48cfSRaja Mani 		ath10k_dbg(ar, ATH10K_DBG_WMI,
6262373b48cfSRaja Mani 			   "received event id %d not implemented\n", id);
6263373b48cfSRaja Mani 		break;
626498dd2b92SManikanta Pubbisetty 	case WMI_10_4_UPDATE_STATS_EVENTID:
626598dd2b92SManikanta Pubbisetty 		ath10k_wmi_event_update_stats(ar, skb);
626698dd2b92SManikanta Pubbisetty 		break;
62676dd46348STamizh chelvam 	case WMI_10_4_PDEV_TEMPERATURE_EVENTID:
62686dd46348STamizh chelvam 		ath10k_wmi_event_temperature(ar, skb);
62696dd46348STamizh chelvam 		break;
627089d2d183SRajkumar Manoharan 	case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID:
627189d2d183SRajkumar Manoharan 		ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
627289d2d183SRajkumar Manoharan 		break;
6273ac86aa57SMaharaja Kennadyrajan 	case WMI_10_4_PDEV_TPC_CONFIG_EVENTID:
6274ac86aa57SMaharaja Kennadyrajan 		ath10k_wmi_event_pdev_tpc_config(ar, skb);
6275ac86aa57SMaharaja Kennadyrajan 		break;
62768ed05ed0SManikanta Pubbisetty 	case WMI_10_4_TDLS_PEER_EVENTID:
62778ed05ed0SManikanta Pubbisetty 		ath10k_wmi_handle_tdls_peer_event(ar, skb);
62788ed05ed0SManikanta Pubbisetty 		break;
6279bc64d052SMaharaja Kennadyrajan 	case WMI_10_4_PDEV_TPC_TABLE_EVENTID:
6280bc64d052SMaharaja Kennadyrajan 		ath10k_wmi_event_tpc_final_table(ar, skb);
6281bc64d052SMaharaja Kennadyrajan 		break;
62826f6eb1bcSSriram R 	case WMI_10_4_DFS_STATUS_CHECK_EVENTID:
62836f6eb1bcSSriram R 		ath10k_wmi_event_dfs_status_check(ar, skb);
62846f6eb1bcSSriram R 		break;
6285d70c0d46SMaharaja Kennadyrajan 	case WMI_10_4_PEER_STA_PS_STATECHG_EVENTID:
6286d70c0d46SMaharaja Kennadyrajan 		ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb);
6287d70c0d46SMaharaja Kennadyrajan 		break;
62881c092961SRaja Mani 	default:
62891c092961SRaja Mani 		ath10k_warn(ar, "Unknown eventid: %d\n", id);
62901c092961SRaja Mani 		break;
62911c092961SRaja Mani 	}
62921c092961SRaja Mani 
62931c092961SRaja Mani out:
62941c092961SRaja Mani 	dev_kfree_skb(skb);
62951c092961SRaja Mani }
62961c092961SRaja Mani 
6297ce42870eSBartosz Markowski static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
6298ce42870eSBartosz Markowski {
6299d7579d12SMichal Kazior 	int ret;
6300d7579d12SMichal Kazior 
6301d7579d12SMichal Kazior 	ret = ath10k_wmi_rx(ar, skb);
6302d7579d12SMichal Kazior 	if (ret)
6303d7579d12SMichal Kazior 		ath10k_warn(ar, "failed to process wmi rx: %d\n", ret);
630424c88f78SMichal Kazior }
6305ce42870eSBartosz Markowski 
630695bf21f9SMichal Kazior int ath10k_wmi_connect(struct ath10k *ar)
63075e3dd157SKalle Valo {
63085e3dd157SKalle Valo 	int status;
63095e3dd157SKalle Valo 	struct ath10k_htc_svc_conn_req conn_req;
63105e3dd157SKalle Valo 	struct ath10k_htc_svc_conn_resp conn_resp;
63115e3dd157SKalle Valo 
6312cea19a6cSCarl Huang 	memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
6313cea19a6cSCarl Huang 
63145e3dd157SKalle Valo 	memset(&conn_req, 0, sizeof(conn_req));
63155e3dd157SKalle Valo 	memset(&conn_resp, 0, sizeof(conn_resp));
63165e3dd157SKalle Valo 
63175e3dd157SKalle Valo 	/* these fields are the same for all service endpoints */
63185e3dd157SKalle Valo 	conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
63195e3dd157SKalle Valo 	conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
6320be8b3943SMichal Kazior 	conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;
63215e3dd157SKalle Valo 
63225e3dd157SKalle Valo 	/* connect to control service */
63235e3dd157SKalle Valo 	conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;
63245e3dd157SKalle Valo 
6325cd003fadSMichal Kazior 	status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
63265e3dd157SKalle Valo 	if (status) {
63277aa7a72aSMichal Kazior 		ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n",
63285e3dd157SKalle Valo 			    status);
63295e3dd157SKalle Valo 		return status;
63305e3dd157SKalle Valo 	}
63315e3dd157SKalle Valo 
63325e3dd157SKalle Valo 	ar->wmi.eid = conn_resp.eid;
63335e3dd157SKalle Valo 	return 0;
63345e3dd157SKalle Valo }
63355e3dd157SKalle Valo 
6336d7579d12SMichal Kazior static struct sk_buff *
633705e7ba24SChristian Lamparter ath10k_wmi_op_gen_pdev_set_base_macaddr(struct ath10k *ar,
633805e7ba24SChristian Lamparter 					const u8 macaddr[ETH_ALEN])
633905e7ba24SChristian Lamparter {
634005e7ba24SChristian Lamparter 	struct wmi_pdev_set_base_macaddr_cmd *cmd;
634105e7ba24SChristian Lamparter 	struct sk_buff *skb;
634205e7ba24SChristian Lamparter 
634305e7ba24SChristian Lamparter 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
634405e7ba24SChristian Lamparter 	if (!skb)
634505e7ba24SChristian Lamparter 		return ERR_PTR(-ENOMEM);
634605e7ba24SChristian Lamparter 
634705e7ba24SChristian Lamparter 	cmd = (struct wmi_pdev_set_base_macaddr_cmd *)skb->data;
634805e7ba24SChristian Lamparter 	ether_addr_copy(cmd->mac_addr.addr, macaddr);
634905e7ba24SChristian Lamparter 
635005e7ba24SChristian Lamparter 	ath10k_dbg(ar, ATH10K_DBG_WMI,
635105e7ba24SChristian Lamparter 		   "wmi pdev basemac %pM\n", macaddr);
635205e7ba24SChristian Lamparter 	return skb;
635305e7ba24SChristian Lamparter }
635405e7ba24SChristian Lamparter 
635505e7ba24SChristian Lamparter static struct sk_buff *
6356d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
6357d7579d12SMichal Kazior 			      u16 ctl2g, u16 ctl5g,
6358d7579d12SMichal Kazior 			      enum wmi_dfs_region dfs_reg)
63595e3dd157SKalle Valo {
63605e3dd157SKalle Valo 	struct wmi_pdev_set_regdomain_cmd *cmd;
63615e3dd157SKalle Valo 	struct sk_buff *skb;
63625e3dd157SKalle Valo 
63637aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
63645e3dd157SKalle Valo 	if (!skb)
6365d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
63665e3dd157SKalle Valo 
63675e3dd157SKalle Valo 	cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data;
63685e3dd157SKalle Valo 	cmd->reg_domain = __cpu_to_le32(rd);
63695e3dd157SKalle Valo 	cmd->reg_domain_2G = __cpu_to_le32(rd2g);
63705e3dd157SKalle Valo 	cmd->reg_domain_5G = __cpu_to_le32(rd5g);
63715e3dd157SKalle Valo 	cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
63725e3dd157SKalle Valo 	cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
63735e3dd157SKalle Valo 
63747aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
63755e3dd157SKalle Valo 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
63765e3dd157SKalle Valo 		   rd, rd2g, rd5g, ctl2g, ctl5g);
6377d7579d12SMichal Kazior 	return skb;
63785e3dd157SKalle Valo }
63795e3dd157SKalle Valo 
6380d7579d12SMichal Kazior static struct sk_buff *
6381d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16
6382d7579d12SMichal Kazior 				  rd5g, u16 ctl2g, u16 ctl5g,
6383821af6aeSMarek Puzyniak 				  enum wmi_dfs_region dfs_reg)
6384821af6aeSMarek Puzyniak {
6385821af6aeSMarek Puzyniak 	struct wmi_pdev_set_regdomain_cmd_10x *cmd;
6386821af6aeSMarek Puzyniak 	struct sk_buff *skb;
6387821af6aeSMarek Puzyniak 
63887aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6389821af6aeSMarek Puzyniak 	if (!skb)
6390d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6391821af6aeSMarek Puzyniak 
6392821af6aeSMarek Puzyniak 	cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data;
6393821af6aeSMarek Puzyniak 	cmd->reg_domain = __cpu_to_le32(rd);
6394821af6aeSMarek Puzyniak 	cmd->reg_domain_2G = __cpu_to_le32(rd2g);
6395821af6aeSMarek Puzyniak 	cmd->reg_domain_5G = __cpu_to_le32(rd5g);
6396821af6aeSMarek Puzyniak 	cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
6397821af6aeSMarek Puzyniak 	cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
6398821af6aeSMarek Puzyniak 	cmd->dfs_domain = __cpu_to_le32(dfs_reg);
6399821af6aeSMarek Puzyniak 
64007aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
6401821af6aeSMarek Puzyniak 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
6402821af6aeSMarek Puzyniak 		   rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
6403d7579d12SMichal Kazior 	return skb;
6404821af6aeSMarek Puzyniak }
6405821af6aeSMarek Puzyniak 
6406d7579d12SMichal Kazior static struct sk_buff *
6407d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt)
64085e3dd157SKalle Valo {
64095e3dd157SKalle Valo 	struct wmi_pdev_suspend_cmd *cmd;
64105e3dd157SKalle Valo 	struct sk_buff *skb;
64115e3dd157SKalle Valo 
64127aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
64135e3dd157SKalle Valo 	if (!skb)
6414d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64155e3dd157SKalle Valo 
64165e3dd157SKalle Valo 	cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
641700f5482bSMarek Puzyniak 	cmd->suspend_opt = __cpu_to_le32(suspend_opt);
64185e3dd157SKalle Valo 
6419d7579d12SMichal Kazior 	return skb;
64205e3dd157SKalle Valo }
64215e3dd157SKalle Valo 
6422d7579d12SMichal Kazior static struct sk_buff *
6423d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar)
64245e3dd157SKalle Valo {
64255e3dd157SKalle Valo 	struct sk_buff *skb;
64265e3dd157SKalle Valo 
64277aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, 0);
6428d7579d12SMichal Kazior 	if (!skb)
6429d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64305e3dd157SKalle Valo 
6431d7579d12SMichal Kazior 	return skb;
64325e3dd157SKalle Valo }
64335e3dd157SKalle Valo 
6434d7579d12SMichal Kazior static struct sk_buff *
6435d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
64365e3dd157SKalle Valo {
64375e3dd157SKalle Valo 	struct wmi_pdev_set_param_cmd *cmd;
64385e3dd157SKalle Valo 	struct sk_buff *skb;
64395e3dd157SKalle Valo 
6440226a339bSBartosz Markowski 	if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
64417aa7a72aSMichal Kazior 		ath10k_warn(ar, "pdev param %d not supported by firmware\n",
64427aa7a72aSMichal Kazior 			    id);
6443d7579d12SMichal Kazior 		return ERR_PTR(-EOPNOTSUPP);
6444226a339bSBartosz Markowski 	}
6445226a339bSBartosz Markowski 
64467aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
64475e3dd157SKalle Valo 	if (!skb)
6448d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
64495e3dd157SKalle Valo 
64505e3dd157SKalle Valo 	cmd = (struct wmi_pdev_set_param_cmd *)skb->data;
64515e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(id);
64525e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(value);
64535e3dd157SKalle Valo 
64547aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
64555e3dd157SKalle Valo 		   id, value);
6456d7579d12SMichal Kazior 	return skb;
64575e3dd157SKalle Valo }
64585e3dd157SKalle Valo 
64590226d602SMichal Kazior void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
6460cf9fca8fSMichal Kazior 				    struct wmi_host_mem_chunks *chunks)
6461cf9fca8fSMichal Kazior {
6462cf9fca8fSMichal Kazior 	struct host_memory_chunk *chunk;
6463cf9fca8fSMichal Kazior 	int i;
6464cf9fca8fSMichal Kazior 
6465cf9fca8fSMichal Kazior 	chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks);
6466cf9fca8fSMichal Kazior 
6467cf9fca8fSMichal Kazior 	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
6468cf9fca8fSMichal Kazior 		chunk = &chunks->items[i];
6469cf9fca8fSMichal Kazior 		chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
6470cf9fca8fSMichal Kazior 		chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len);
6471cf9fca8fSMichal Kazior 		chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
6472cf9fca8fSMichal Kazior 
6473cf9fca8fSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
6474cf9fca8fSMichal Kazior 			   "wmi chunk %d len %d requested, addr 0x%llx\n",
6475cf9fca8fSMichal Kazior 			   i,
6476cf9fca8fSMichal Kazior 			   ar->wmi.mem_chunks[i].len,
6477cf9fca8fSMichal Kazior 			   (unsigned long long)ar->wmi.mem_chunks[i].paddr);
6478cf9fca8fSMichal Kazior 	}
6479cf9fca8fSMichal Kazior }
6480cf9fca8fSMichal Kazior 
6481d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar)
64825e3dd157SKalle Valo {
64835e3dd157SKalle Valo 	struct wmi_init_cmd *cmd;
64845e3dd157SKalle Valo 	struct sk_buff *buf;
64855e3dd157SKalle Valo 	struct wmi_resource_config config = {};
6486b3effe61SBartosz Markowski 	u32 len, val;
64875e3dd157SKalle Valo 
64885e3dd157SKalle Valo 	config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
6489cfd1061eSMichal Kazior 	config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS);
64905e3dd157SKalle Valo 	config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS);
64915e3dd157SKalle Valo 
64925e3dd157SKalle Valo 	config.num_offload_reorder_bufs =
64935e3dd157SKalle Valo 		__cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS);
64945e3dd157SKalle Valo 
64955e3dd157SKalle Valo 	config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS);
64965e3dd157SKalle Valo 	config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS);
64975e3dd157SKalle Valo 	config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT);
64985e3dd157SKalle Valo 	config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK);
64995e3dd157SKalle Valo 	config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK);
65005e3dd157SKalle Valo 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
65015e3dd157SKalle Valo 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
65025e3dd157SKalle Valo 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
65035e3dd157SKalle Valo 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI);
6504ccec9038SDavid Liu 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
65055e3dd157SKalle Valo 	config.scan_max_pending_reqs =
65065e3dd157SKalle Valo 		__cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS);
65075e3dd157SKalle Valo 
65085e3dd157SKalle Valo 	config.bmiss_offload_max_vdev =
65095e3dd157SKalle Valo 		__cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV);
65105e3dd157SKalle Valo 
65115e3dd157SKalle Valo 	config.roam_offload_max_vdev =
65125e3dd157SKalle Valo 		__cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV);
65135e3dd157SKalle Valo 
65145e3dd157SKalle Valo 	config.roam_offload_max_ap_profiles =
65155e3dd157SKalle Valo 		__cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES);
65165e3dd157SKalle Valo 
65175e3dd157SKalle Valo 	config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS);
65185e3dd157SKalle Valo 	config.num_mcast_table_elems =
65195e3dd157SKalle Valo 		__cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS);
65205e3dd157SKalle Valo 
65215e3dd157SKalle Valo 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE);
65225e3dd157SKalle Valo 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE);
65235e3dd157SKalle Valo 	config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES);
65245e3dd157SKalle Valo 	config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE);
65255e3dd157SKalle Valo 	config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM);
65265e3dd157SKalle Valo 
65275e3dd157SKalle Valo 	val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
65285e3dd157SKalle Valo 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
65295e3dd157SKalle Valo 
65305e3dd157SKalle Valo 	config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG);
65315e3dd157SKalle Valo 
65325e3dd157SKalle Valo 	config.gtk_offload_max_vdev =
65335e3dd157SKalle Valo 		__cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV);
65345e3dd157SKalle Valo 
65355e3dd157SKalle Valo 	config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
65365e3dd157SKalle Valo 	config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
65375e3dd157SKalle Valo 
6538b3effe61SBartosz Markowski 	len = sizeof(*cmd) +
6539b3effe61SBartosz Markowski 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6540b3effe61SBartosz Markowski 
65417aa7a72aSMichal Kazior 	buf = ath10k_wmi_alloc_skb(ar, len);
65425e3dd157SKalle Valo 	if (!buf)
6543d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
65445e3dd157SKalle Valo 
65455e3dd157SKalle Valo 	cmd = (struct wmi_init_cmd *)buf->data;
6546b3effe61SBartosz Markowski 
65475e3dd157SKalle Valo 	memcpy(&cmd->resource_config, &config, sizeof(config));
6548cf9fca8fSMichal Kazior 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
65495e3dd157SKalle Valo 
65507aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
6551d7579d12SMichal Kazior 	return buf;
65525e3dd157SKalle Valo }
65535e3dd157SKalle Valo 
6554d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar)
655512b2b9e3SBartosz Markowski {
655612b2b9e3SBartosz Markowski 	struct wmi_init_cmd_10x *cmd;
655712b2b9e3SBartosz Markowski 	struct sk_buff *buf;
655812b2b9e3SBartosz Markowski 	struct wmi_resource_config_10x config = {};
655912b2b9e3SBartosz Markowski 	u32 len, val;
656012b2b9e3SBartosz Markowski 
6561ec6a73f0SBartosz Markowski 	config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
6562ec6a73f0SBartosz Markowski 	config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
6563ec6a73f0SBartosz Markowski 	config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
6564ec6a73f0SBartosz Markowski 	config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
6565ec6a73f0SBartosz Markowski 	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
6566ec6a73f0SBartosz Markowski 	config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
6567ec6a73f0SBartosz Markowski 	config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
6568ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6569ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6570ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6571ec6a73f0SBartosz Markowski 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
6572ccec9038SDavid Liu 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
657312b2b9e3SBartosz Markowski 	config.scan_max_pending_reqs =
6574ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
657512b2b9e3SBartosz Markowski 
657612b2b9e3SBartosz Markowski 	config.bmiss_offload_max_vdev =
6577ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
657812b2b9e3SBartosz Markowski 
657912b2b9e3SBartosz Markowski 	config.roam_offload_max_vdev =
6580ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
658112b2b9e3SBartosz Markowski 
658212b2b9e3SBartosz Markowski 	config.roam_offload_max_ap_profiles =
6583ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
658412b2b9e3SBartosz Markowski 
6585ec6a73f0SBartosz Markowski 	config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
658612b2b9e3SBartosz Markowski 	config.num_mcast_table_elems =
6587ec6a73f0SBartosz Markowski 		__cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
658812b2b9e3SBartosz Markowski 
6589ec6a73f0SBartosz Markowski 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
6590ec6a73f0SBartosz Markowski 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
6591ec6a73f0SBartosz Markowski 	config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
6592ec6a73f0SBartosz Markowski 	config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE);
6593ec6a73f0SBartosz Markowski 	config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
659412b2b9e3SBartosz Markowski 
6595ec6a73f0SBartosz Markowski 	val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
659612b2b9e3SBartosz Markowski 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
659712b2b9e3SBartosz Markowski 
6598ec6a73f0SBartosz Markowski 	config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
659912b2b9e3SBartosz Markowski 
6600ec6a73f0SBartosz Markowski 	config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
6601ec6a73f0SBartosz Markowski 	config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
660212b2b9e3SBartosz Markowski 
660312b2b9e3SBartosz Markowski 	len = sizeof(*cmd) +
660412b2b9e3SBartosz Markowski 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
660512b2b9e3SBartosz Markowski 
66067aa7a72aSMichal Kazior 	buf = ath10k_wmi_alloc_skb(ar, len);
660712b2b9e3SBartosz Markowski 	if (!buf)
6608d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
660912b2b9e3SBartosz Markowski 
661012b2b9e3SBartosz Markowski 	cmd = (struct wmi_init_cmd_10x *)buf->data;
661112b2b9e3SBartosz Markowski 
661212b2b9e3SBartosz Markowski 	memcpy(&cmd->resource_config, &config, sizeof(config));
6613cf9fca8fSMichal Kazior 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
661412b2b9e3SBartosz Markowski 
66157aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
6616d7579d12SMichal Kazior 	return buf;
661712b2b9e3SBartosz Markowski }
661812b2b9e3SBartosz Markowski 
6619d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
662024c88f78SMichal Kazior {
662124c88f78SMichal Kazior 	struct wmi_init_cmd_10_2 *cmd;
662224c88f78SMichal Kazior 	struct sk_buff *buf;
662324c88f78SMichal Kazior 	struct wmi_resource_config_10x config = {};
6624b6c8e287SSujith Manoharan 	u32 len, val, features;
662524c88f78SMichal Kazior 
662624c88f78SMichal Kazior 	config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
662724c88f78SMichal Kazior 	config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
6628cc61a1bbSMohammed Shafi Shajakhan 
6629cc61a1bbSMohammed Shafi Shajakhan 	if (ath10k_peer_stats_enabled(ar)) {
6630af9a6a3aSAnilkumar Kolli 		config.num_peers = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_PEERS);
6631af9a6a3aSAnilkumar Kolli 		config.num_tids = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_TIDS);
6632af9a6a3aSAnilkumar Kolli 	} else {
6633af9a6a3aSAnilkumar Kolli 		config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
663424c88f78SMichal Kazior 		config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
6635af9a6a3aSAnilkumar Kolli 	}
6636af9a6a3aSAnilkumar Kolli 
663724c88f78SMichal Kazior 	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
663824c88f78SMichal Kazior 	config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
663924c88f78SMichal Kazior 	config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
664024c88f78SMichal Kazior 	config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
664124c88f78SMichal Kazior 	config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
664224c88f78SMichal Kazior 	config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
664324c88f78SMichal Kazior 	config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
6644ccec9038SDavid Liu 	config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
664524c88f78SMichal Kazior 
664624c88f78SMichal Kazior 	config.scan_max_pending_reqs =
664724c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
664824c88f78SMichal Kazior 
664924c88f78SMichal Kazior 	config.bmiss_offload_max_vdev =
665024c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
665124c88f78SMichal Kazior 
665224c88f78SMichal Kazior 	config.roam_offload_max_vdev =
665324c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
665424c88f78SMichal Kazior 
665524c88f78SMichal Kazior 	config.roam_offload_max_ap_profiles =
665624c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
665724c88f78SMichal Kazior 
665824c88f78SMichal Kazior 	config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
665924c88f78SMichal Kazior 	config.num_mcast_table_elems =
666024c88f78SMichal Kazior 		__cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
666124c88f78SMichal Kazior 
666224c88f78SMichal Kazior 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
666324c88f78SMichal Kazior 	config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
666424c88f78SMichal Kazior 	config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
6665f6603ff2SSujith Manoharan 	config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE);
666624c88f78SMichal Kazior 	config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
666724c88f78SMichal Kazior 
666824c88f78SMichal Kazior 	val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
666924c88f78SMichal Kazior 	config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
667024c88f78SMichal Kazior 
667124c88f78SMichal Kazior 	config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
667224c88f78SMichal Kazior 
667324c88f78SMichal Kazior 	config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
667424c88f78SMichal Kazior 	config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
667524c88f78SMichal Kazior 
667624c88f78SMichal Kazior 	len = sizeof(*cmd) +
667724c88f78SMichal Kazior 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
667824c88f78SMichal Kazior 
66797aa7a72aSMichal Kazior 	buf = ath10k_wmi_alloc_skb(ar, len);
668024c88f78SMichal Kazior 	if (!buf)
6681d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
668224c88f78SMichal Kazior 
668324c88f78SMichal Kazior 	cmd = (struct wmi_init_cmd_10_2 *)buf->data;
668424c88f78SMichal Kazior 
6685b6c8e287SSujith Manoharan 	features = WMI_10_2_RX_BATCH_MODE;
6686844fa572SYanbo Li 
6687844fa572SYanbo Li 	if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) &&
6688844fa572SYanbo Li 	    test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
6689de0c789bSYanbo Li 		features |= WMI_10_2_COEX_GPIO;
6690844fa572SYanbo Li 
6691cc61a1bbSMohammed Shafi Shajakhan 	if (ath10k_peer_stats_enabled(ar))
6692de46c015SMohammed Shafi Shajakhan 		features |= WMI_10_2_PEER_STATS;
6693de46c015SMohammed Shafi Shajakhan 
6694fa7937e3SRajkumar Manoharan 	if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map))
6695fa7937e3SRajkumar Manoharan 		features |= WMI_10_2_BSS_CHAN_INFO;
6696fa7937e3SRajkumar Manoharan 
6697b6c8e287SSujith Manoharan 	cmd->resource_config.feature_mask = __cpu_to_le32(features);
6698b6c8e287SSujith Manoharan 
669924c88f78SMichal Kazior 	memcpy(&cmd->resource_config.common, &config, sizeof(config));
6700cf9fca8fSMichal Kazior 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
670124c88f78SMichal Kazior 
67027aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
6703d7579d12SMichal Kazior 	return buf;
670412b2b9e3SBartosz Markowski }
670512b2b9e3SBartosz Markowski 
6706d1e52a8eSRaja Mani static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
6707d1e52a8eSRaja Mani {
6708d1e52a8eSRaja Mani 	struct wmi_init_cmd_10_4 *cmd;
6709d1e52a8eSRaja Mani 	struct sk_buff *buf;
6710d1e52a8eSRaja Mani 	struct wmi_resource_config_10_4 config = {};
6711d1e52a8eSRaja Mani 	u32 len;
6712d1e52a8eSRaja Mani 
6713d1e52a8eSRaja Mani 	config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
6714d1e52a8eSRaja Mani 	config.num_peers = __cpu_to_le32(ar->max_num_peers);
6715d1e52a8eSRaja Mani 	config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
6716d1e52a8eSRaja Mani 	config.num_tids = __cpu_to_le32(ar->num_tids);
6717d1e52a8eSRaja Mani 
6718d1e52a8eSRaja Mani 	config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS);
6719d1e52a8eSRaja Mani 	config.num_offload_reorder_buffs =
6720d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS);
6721d1e52a8eSRaja Mani 	config.num_peer_keys  = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS);
6722d1e52a8eSRaja Mani 	config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT);
67235699a6f2SRaja Mani 	config.tx_chain_mask  = __cpu_to_le32(ar->hw_params.tx_chain_mask);
67245699a6f2SRaja Mani 	config.rx_chain_mask  = __cpu_to_le32(ar->hw_params.rx_chain_mask);
6725d1e52a8eSRaja Mani 
6726d1e52a8eSRaja Mani 	config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6727d1e52a8eSRaja Mani 	config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6728d1e52a8eSRaja Mani 	config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6729d1e52a8eSRaja Mani 	config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI);
6730d1e52a8eSRaja Mani 
6731bc27e8cdSPeter Oh 	config.rx_decap_mode	    = __cpu_to_le32(ar->wmi.rx_decap_mode);
6732d1e52a8eSRaja Mani 	config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS);
6733d1e52a8eSRaja Mani 	config.bmiss_offload_max_vdev =
6734d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV);
6735d1e52a8eSRaja Mani 	config.roam_offload_max_vdev  =
6736d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV);
6737d1e52a8eSRaja Mani 	config.roam_offload_max_ap_profiles =
6738d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES);
6739d1e52a8eSRaja Mani 	config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS);
6740d1e52a8eSRaja Mani 	config.num_mcast_table_elems =
6741d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS);
6742d1e52a8eSRaja Mani 
6743d1e52a8eSRaja Mani 	config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE);
6744d1e52a8eSRaja Mani 	config.tx_dbg_log_size  = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE);
6745d1e52a8eSRaja Mani 	config.num_wds_entries  = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES);
6746d1e52a8eSRaja Mani 	config.dma_burst_size   = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE);
6747d1e52a8eSRaja Mani 	config.mac_aggr_delim   = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM);
6748d1e52a8eSRaja Mani 
6749d1e52a8eSRaja Mani 	config.rx_skip_defrag_timeout_dup_detection_check =
6750d1e52a8eSRaja Mani 	  __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK);
6751d1e52a8eSRaja Mani 
6752d1e52a8eSRaja Mani 	config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG);
6753d1e52a8eSRaja Mani 	config.gtk_offload_max_vdev =
6754d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV);
67555699a6f2SRaja Mani 	config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx);
6756d1e52a8eSRaja Mani 	config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS);
6757d1e52a8eSRaja Mani 	config.max_peer_ext_stats =
6758d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS);
6759d1e52a8eSRaja Mani 	config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP);
6760d1e52a8eSRaja Mani 
6761d1e52a8eSRaja Mani 	config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE);
6762d1e52a8eSRaja Mani 	config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE);
6763d1e52a8eSRaja Mani 	config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE);
6764d1e52a8eSRaja Mani 	config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE);
6765d1e52a8eSRaja Mani 
6766d1e52a8eSRaja Mani 	config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE);
6767d1e52a8eSRaja Mani 	config.tt_support =
6768d1e52a8eSRaja Mani 			__cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG);
6769d1e52a8eSRaja Mani 	config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG);
6770d1e52a8eSRaja Mani 	config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG);
6771d1e52a8eSRaja Mani 	config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG);
6772d1e52a8eSRaja Mani 
6773d1e52a8eSRaja Mani 	len = sizeof(*cmd) +
6774d1e52a8eSRaja Mani 	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6775d1e52a8eSRaja Mani 
6776d1e52a8eSRaja Mani 	buf = ath10k_wmi_alloc_skb(ar, len);
6777d1e52a8eSRaja Mani 	if (!buf)
6778d1e52a8eSRaja Mani 		return ERR_PTR(-ENOMEM);
6779d1e52a8eSRaja Mani 
6780d1e52a8eSRaja Mani 	cmd = (struct wmi_init_cmd_10_4 *)buf->data;
6781d1e52a8eSRaja Mani 	memcpy(&cmd->resource_config, &config, sizeof(config));
6782d1e52a8eSRaja Mani 	ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6783d1e52a8eSRaja Mani 
6784d1e52a8eSRaja Mani 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
6785d1e52a8eSRaja Mani 	return buf;
6786d1e52a8eSRaja Mani }
6787d1e52a8eSRaja Mani 
67880226d602SMichal Kazior int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg)
67895e3dd157SKalle Valo {
67905e3dd157SKalle Valo 	if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN)
67915e3dd157SKalle Valo 		return -EINVAL;
6792a6aa5da3SMichal Kazior 	if (arg->n_channels > ARRAY_SIZE(arg->channels))
6793a6aa5da3SMichal Kazior 		return -EINVAL;
6794a6aa5da3SMichal Kazior 	if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID)
6795a6aa5da3SMichal Kazior 		return -EINVAL;
6796a6aa5da3SMichal Kazior 	if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID)
6797a6aa5da3SMichal Kazior 		return -EINVAL;
67985e3dd157SKalle Valo 
6799a6aa5da3SMichal Kazior 	return 0;
6800a6aa5da3SMichal Kazior }
6801a6aa5da3SMichal Kazior 
6802a6aa5da3SMichal Kazior static size_t
6803a6aa5da3SMichal Kazior ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg)
6804a6aa5da3SMichal Kazior {
6805a6aa5da3SMichal Kazior 	int len = 0;
6806a6aa5da3SMichal Kazior 
6807a6aa5da3SMichal Kazior 	if (arg->ie_len) {
68085e3dd157SKalle Valo 		len += sizeof(struct wmi_ie_data);
68095e3dd157SKalle Valo 		len += roundup(arg->ie_len, 4);
68105e3dd157SKalle Valo 	}
68115e3dd157SKalle Valo 
68125e3dd157SKalle Valo 	if (arg->n_channels) {
68135e3dd157SKalle Valo 		len += sizeof(struct wmi_chan_list);
68145e3dd157SKalle Valo 		len += sizeof(__le32) * arg->n_channels;
68155e3dd157SKalle Valo 	}
68165e3dd157SKalle Valo 
68175e3dd157SKalle Valo 	if (arg->n_ssids) {
68185e3dd157SKalle Valo 		len += sizeof(struct wmi_ssid_list);
68195e3dd157SKalle Valo 		len += sizeof(struct wmi_ssid) * arg->n_ssids;
68205e3dd157SKalle Valo 	}
68215e3dd157SKalle Valo 
68225e3dd157SKalle Valo 	if (arg->n_bssids) {
68235e3dd157SKalle Valo 		len += sizeof(struct wmi_bssid_list);
68245e3dd157SKalle Valo 		len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
68255e3dd157SKalle Valo 	}
68265e3dd157SKalle Valo 
68275e3dd157SKalle Valo 	return len;
68285e3dd157SKalle Valo }
68295e3dd157SKalle Valo 
68300226d602SMichal Kazior void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn,
68315e3dd157SKalle Valo 				      const struct wmi_start_scan_arg *arg)
68325e3dd157SKalle Valo {
68335e3dd157SKalle Valo 	u32 scan_id;
68345e3dd157SKalle Valo 	u32 scan_req_id;
68355e3dd157SKalle Valo 
68365e3dd157SKalle Valo 	scan_id  = WMI_HOST_SCAN_REQ_ID_PREFIX;
68375e3dd157SKalle Valo 	scan_id |= arg->scan_id;
68385e3dd157SKalle Valo 
68395e3dd157SKalle Valo 	scan_req_id  = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
68405e3dd157SKalle Valo 	scan_req_id |= arg->scan_req_id;
68415e3dd157SKalle Valo 
6842a6aa5da3SMichal Kazior 	cmn->scan_id            = __cpu_to_le32(scan_id);
6843a6aa5da3SMichal Kazior 	cmn->scan_req_id        = __cpu_to_le32(scan_req_id);
6844a6aa5da3SMichal Kazior 	cmn->vdev_id            = __cpu_to_le32(arg->vdev_id);
6845a6aa5da3SMichal Kazior 	cmn->scan_priority      = __cpu_to_le32(arg->scan_priority);
6846a6aa5da3SMichal Kazior 	cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events);
6847a6aa5da3SMichal Kazior 	cmn->dwell_time_active  = __cpu_to_le32(arg->dwell_time_active);
6848a6aa5da3SMichal Kazior 	cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive);
6849a6aa5da3SMichal Kazior 	cmn->min_rest_time      = __cpu_to_le32(arg->min_rest_time);
6850a6aa5da3SMichal Kazior 	cmn->max_rest_time      = __cpu_to_le32(arg->max_rest_time);
6851a6aa5da3SMichal Kazior 	cmn->repeat_probe_time  = __cpu_to_le32(arg->repeat_probe_time);
6852a6aa5da3SMichal Kazior 	cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time);
6853a6aa5da3SMichal Kazior 	cmn->idle_time          = __cpu_to_le32(arg->idle_time);
6854a6aa5da3SMichal Kazior 	cmn->max_scan_time      = __cpu_to_le32(arg->max_scan_time);
6855a6aa5da3SMichal Kazior 	cmn->probe_delay        = __cpu_to_le32(arg->probe_delay);
6856a6aa5da3SMichal Kazior 	cmn->scan_ctrl_flags    = __cpu_to_le32(arg->scan_ctrl_flags);
6857a6aa5da3SMichal Kazior }
68585e3dd157SKalle Valo 
6859a6aa5da3SMichal Kazior static void
6860a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs,
6861a6aa5da3SMichal Kazior 			       const struct wmi_start_scan_arg *arg)
6862a6aa5da3SMichal Kazior {
6863a6aa5da3SMichal Kazior 	struct wmi_ie_data *ie;
6864a6aa5da3SMichal Kazior 	struct wmi_chan_list *channels;
6865a6aa5da3SMichal Kazior 	struct wmi_ssid_list *ssids;
6866a6aa5da3SMichal Kazior 	struct wmi_bssid_list *bssids;
6867a6aa5da3SMichal Kazior 	void *ptr = tlvs->tlvs;
6868a6aa5da3SMichal Kazior 	int i;
68695e3dd157SKalle Valo 
68705e3dd157SKalle Valo 	if (arg->n_channels) {
6871a6aa5da3SMichal Kazior 		channels = ptr;
68725e3dd157SKalle Valo 		channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG);
68735e3dd157SKalle Valo 		channels->num_chan = __cpu_to_le32(arg->n_channels);
68745e3dd157SKalle Valo 
68755e3dd157SKalle Valo 		for (i = 0; i < arg->n_channels; i++)
687624c88f78SMichal Kazior 			channels->channel_list[i].freq =
687724c88f78SMichal Kazior 				__cpu_to_le16(arg->channels[i]);
68785e3dd157SKalle Valo 
6879a6aa5da3SMichal Kazior 		ptr += sizeof(*channels);
6880a6aa5da3SMichal Kazior 		ptr += sizeof(__le32) * arg->n_channels;
68815e3dd157SKalle Valo 	}
68825e3dd157SKalle Valo 
68835e3dd157SKalle Valo 	if (arg->n_ssids) {
6884a6aa5da3SMichal Kazior 		ssids = ptr;
68855e3dd157SKalle Valo 		ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG);
68865e3dd157SKalle Valo 		ssids->num_ssids = __cpu_to_le32(arg->n_ssids);
68875e3dd157SKalle Valo 
68885e3dd157SKalle Valo 		for (i = 0; i < arg->n_ssids; i++) {
68895e3dd157SKalle Valo 			ssids->ssids[i].ssid_len =
68905e3dd157SKalle Valo 				__cpu_to_le32(arg->ssids[i].len);
68915e3dd157SKalle Valo 			memcpy(&ssids->ssids[i].ssid,
68925e3dd157SKalle Valo 			       arg->ssids[i].ssid,
68935e3dd157SKalle Valo 			       arg->ssids[i].len);
68945e3dd157SKalle Valo 		}
68955e3dd157SKalle Valo 
6896a6aa5da3SMichal Kazior 		ptr += sizeof(*ssids);
6897a6aa5da3SMichal Kazior 		ptr += sizeof(struct wmi_ssid) * arg->n_ssids;
68985e3dd157SKalle Valo 	}
68995e3dd157SKalle Valo 
69005e3dd157SKalle Valo 	if (arg->n_bssids) {
6901a6aa5da3SMichal Kazior 		bssids = ptr;
69025e3dd157SKalle Valo 		bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG);
69035e3dd157SKalle Valo 		bssids->num_bssid = __cpu_to_le32(arg->n_bssids);
69045e3dd157SKalle Valo 
69055e3dd157SKalle Valo 		for (i = 0; i < arg->n_bssids; i++)
69068f4ffb7dSKalle Valo 			ether_addr_copy(bssids->bssid_list[i].addr,
69078f4ffb7dSKalle Valo 					arg->bssids[i].bssid);
69085e3dd157SKalle Valo 
6909a6aa5da3SMichal Kazior 		ptr += sizeof(*bssids);
6910a6aa5da3SMichal Kazior 		ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids;
69115e3dd157SKalle Valo 	}
69125e3dd157SKalle Valo 
69135e3dd157SKalle Valo 	if (arg->ie_len) {
6914a6aa5da3SMichal Kazior 		ie = ptr;
69155e3dd157SKalle Valo 		ie->tag = __cpu_to_le32(WMI_IE_TAG);
69165e3dd157SKalle Valo 		ie->ie_len = __cpu_to_le32(arg->ie_len);
69175e3dd157SKalle Valo 		memcpy(ie->ie_data, arg->ie, arg->ie_len);
69185e3dd157SKalle Valo 
6919a6aa5da3SMichal Kazior 		ptr += sizeof(*ie);
6920a6aa5da3SMichal Kazior 		ptr += roundup(arg->ie_len, 4);
6921a6aa5da3SMichal Kazior 	}
69225e3dd157SKalle Valo }
69235e3dd157SKalle Valo 
6924d7579d12SMichal Kazior static struct sk_buff *
6925d7579d12SMichal Kazior ath10k_wmi_op_gen_start_scan(struct ath10k *ar,
6926a6aa5da3SMichal Kazior 			     const struct wmi_start_scan_arg *arg)
6927a6aa5da3SMichal Kazior {
6928d7579d12SMichal Kazior 	struct wmi_start_scan_cmd *cmd;
6929a6aa5da3SMichal Kazior 	struct sk_buff *skb;
6930a6aa5da3SMichal Kazior 	size_t len;
6931a6aa5da3SMichal Kazior 	int ret;
6932a6aa5da3SMichal Kazior 
6933a6aa5da3SMichal Kazior 	ret = ath10k_wmi_start_scan_verify(arg);
6934a6aa5da3SMichal Kazior 	if (ret)
6935d7579d12SMichal Kazior 		return ERR_PTR(ret);
6936a6aa5da3SMichal Kazior 
6937d7579d12SMichal Kazior 	len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6938a6aa5da3SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
6939a6aa5da3SMichal Kazior 	if (!skb)
6940d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6941a6aa5da3SMichal Kazior 
6942a6aa5da3SMichal Kazior 	cmd = (struct wmi_start_scan_cmd *)skb->data;
6943a6aa5da3SMichal Kazior 
6944a6aa5da3SMichal Kazior 	ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6945a6aa5da3SMichal Kazior 	ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6946d7579d12SMichal Kazior 
6947d7579d12SMichal Kazior 	cmd->burst_duration_ms = __cpu_to_le32(0);
69485e3dd157SKalle Valo 
69497aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
6950d7579d12SMichal Kazior 	return skb;
6951d7579d12SMichal Kazior }
6952d7579d12SMichal Kazior 
6953d7579d12SMichal Kazior static struct sk_buff *
6954d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar,
6955d7579d12SMichal Kazior 				 const struct wmi_start_scan_arg *arg)
6956d7579d12SMichal Kazior {
6957d7579d12SMichal Kazior 	struct wmi_10x_start_scan_cmd *cmd;
6958d7579d12SMichal Kazior 	struct sk_buff *skb;
6959d7579d12SMichal Kazior 	size_t len;
6960d7579d12SMichal Kazior 	int ret;
6961d7579d12SMichal Kazior 
6962d7579d12SMichal Kazior 	ret = ath10k_wmi_start_scan_verify(arg);
6963d7579d12SMichal Kazior 	if (ret)
6964d7579d12SMichal Kazior 		return ERR_PTR(ret);
6965d7579d12SMichal Kazior 
6966d7579d12SMichal Kazior 	len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6967d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
6968d7579d12SMichal Kazior 	if (!skb)
6969d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
6970d7579d12SMichal Kazior 
6971d7579d12SMichal Kazior 	cmd = (struct wmi_10x_start_scan_cmd *)skb->data;
6972d7579d12SMichal Kazior 
6973d7579d12SMichal Kazior 	ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6974d7579d12SMichal Kazior 	ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6975d7579d12SMichal Kazior 
6976d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
6977d7579d12SMichal Kazior 	return skb;
69785e3dd157SKalle Valo }
69795e3dd157SKalle Valo 
69805e3dd157SKalle Valo void ath10k_wmi_start_scan_init(struct ath10k *ar,
69815e3dd157SKalle Valo 				struct wmi_start_scan_arg *arg)
69825e3dd157SKalle Valo {
69835e3dd157SKalle Valo 	/* setup commonly used values */
69845e3dd157SKalle Valo 	arg->scan_req_id = 1;
69855e3dd157SKalle Valo 	arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
69865e3dd157SKalle Valo 	arg->dwell_time_active = 50;
69875e3dd157SKalle Valo 	arg->dwell_time_passive = 150;
69885e3dd157SKalle Valo 	arg->min_rest_time = 50;
69895e3dd157SKalle Valo 	arg->max_rest_time = 500;
69905e3dd157SKalle Valo 	arg->repeat_probe_time = 0;
69915e3dd157SKalle Valo 	arg->probe_spacing_time = 0;
69925e3dd157SKalle Valo 	arg->idle_time = 0;
6993c322892fSBartosz Markowski 	arg->max_scan_time = 20000;
69945e3dd157SKalle Valo 	arg->probe_delay = 5;
69955e3dd157SKalle Valo 	arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
69965e3dd157SKalle Valo 		| WMI_SCAN_EVENT_COMPLETED
69975e3dd157SKalle Valo 		| WMI_SCAN_EVENT_BSS_CHANNEL
69985e3dd157SKalle Valo 		| WMI_SCAN_EVENT_FOREIGN_CHANNEL
6999ebee76f7SBenjamin Berg 		| WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT
70005e3dd157SKalle Valo 		| WMI_SCAN_EVENT_DEQUEUED;
70015e3dd157SKalle Valo 	arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
70025e3dd157SKalle Valo 	arg->n_bssids = 1;
70035e3dd157SKalle Valo 	arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF";
70045e3dd157SKalle Valo }
70055e3dd157SKalle Valo 
7006d7579d12SMichal Kazior static struct sk_buff *
7007d7579d12SMichal Kazior ath10k_wmi_op_gen_stop_scan(struct ath10k *ar,
7008d7579d12SMichal Kazior 			    const struct wmi_stop_scan_arg *arg)
70095e3dd157SKalle Valo {
70105e3dd157SKalle Valo 	struct wmi_stop_scan_cmd *cmd;
70115e3dd157SKalle Valo 	struct sk_buff *skb;
70125e3dd157SKalle Valo 	u32 scan_id;
70135e3dd157SKalle Valo 	u32 req_id;
70145e3dd157SKalle Valo 
70155e3dd157SKalle Valo 	if (arg->req_id > 0xFFF)
7016d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
70175e3dd157SKalle Valo 	if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF)
7018d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
70195e3dd157SKalle Valo 
70207aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
70215e3dd157SKalle Valo 	if (!skb)
7022d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
70235e3dd157SKalle Valo 
70245e3dd157SKalle Valo 	scan_id = arg->u.scan_id;
70255e3dd157SKalle Valo 	scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;
70265e3dd157SKalle Valo 
70275e3dd157SKalle Valo 	req_id = arg->req_id;
70285e3dd157SKalle Valo 	req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
70295e3dd157SKalle Valo 
70305e3dd157SKalle Valo 	cmd = (struct wmi_stop_scan_cmd *)skb->data;
70315e3dd157SKalle Valo 	cmd->req_type    = __cpu_to_le32(arg->req_type);
70325e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(arg->u.vdev_id);
70335e3dd157SKalle Valo 	cmd->scan_id     = __cpu_to_le32(scan_id);
70345e3dd157SKalle Valo 	cmd->scan_req_id = __cpu_to_le32(req_id);
70355e3dd157SKalle Valo 
70367aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
70375e3dd157SKalle Valo 		   "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
70385e3dd157SKalle Valo 		   arg->req_id, arg->req_type, arg->u.scan_id);
7039d7579d12SMichal Kazior 	return skb;
70405e3dd157SKalle Valo }
70415e3dd157SKalle Valo 
7042d7579d12SMichal Kazior static struct sk_buff *
7043d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id,
70445e3dd157SKalle Valo 			      enum wmi_vdev_type type,
70455e3dd157SKalle Valo 			      enum wmi_vdev_subtype subtype,
70465e3dd157SKalle Valo 			      const u8 macaddr[ETH_ALEN])
70475e3dd157SKalle Valo {
70485e3dd157SKalle Valo 	struct wmi_vdev_create_cmd *cmd;
70495e3dd157SKalle Valo 	struct sk_buff *skb;
70505e3dd157SKalle Valo 
70517aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
70525e3dd157SKalle Valo 	if (!skb)
7053d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
70545e3dd157SKalle Valo 
70555e3dd157SKalle Valo 	cmd = (struct wmi_vdev_create_cmd *)skb->data;
70565e3dd157SKalle Valo 	cmd->vdev_id      = __cpu_to_le32(vdev_id);
70575e3dd157SKalle Valo 	cmd->vdev_type    = __cpu_to_le32(type);
70585e3dd157SKalle Valo 	cmd->vdev_subtype = __cpu_to_le32(subtype);
7059b25f32cbSKalle Valo 	ether_addr_copy(cmd->vdev_macaddr.addr, macaddr);
70605e3dd157SKalle Valo 
70617aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
70625e3dd157SKalle Valo 		   "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
70635e3dd157SKalle Valo 		   vdev_id, type, subtype, macaddr);
7064d7579d12SMichal Kazior 	return skb;
70655e3dd157SKalle Valo }
70665e3dd157SKalle Valo 
7067d7579d12SMichal Kazior static struct sk_buff *
7068d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id)
70695e3dd157SKalle Valo {
70705e3dd157SKalle Valo 	struct wmi_vdev_delete_cmd *cmd;
70715e3dd157SKalle Valo 	struct sk_buff *skb;
70725e3dd157SKalle Valo 
70737aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
70745e3dd157SKalle Valo 	if (!skb)
7075d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
70765e3dd157SKalle Valo 
70775e3dd157SKalle Valo 	cmd = (struct wmi_vdev_delete_cmd *)skb->data;
70785e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
70795e3dd157SKalle Valo 
70807aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
70815e3dd157SKalle Valo 		   "WMI vdev delete id %d\n", vdev_id);
7082d7579d12SMichal Kazior 	return skb;
70835e3dd157SKalle Valo }
70845e3dd157SKalle Valo 
7085d7579d12SMichal Kazior static struct sk_buff *
7086d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_start(struct ath10k *ar,
70875e3dd157SKalle Valo 			     const struct wmi_vdev_start_request_arg *arg,
7088d7579d12SMichal Kazior 			     bool restart)
70895e3dd157SKalle Valo {
70905e3dd157SKalle Valo 	struct wmi_vdev_start_request_cmd *cmd;
70915e3dd157SKalle Valo 	struct sk_buff *skb;
70925e3dd157SKalle Valo 	const char *cmdname;
70935e3dd157SKalle Valo 	u32 flags = 0;
70945e3dd157SKalle Valo 
70955e3dd157SKalle Valo 	if (WARN_ON(arg->hidden_ssid && !arg->ssid))
7096d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
70975e3dd157SKalle Valo 	if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
7098d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
70995e3dd157SKalle Valo 
7100d7579d12SMichal Kazior 	if (restart)
71015e3dd157SKalle Valo 		cmdname = "restart";
71025e3dd157SKalle Valo 	else
7103d7579d12SMichal Kazior 		cmdname = "start";
71045e3dd157SKalle Valo 
71057aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
71065e3dd157SKalle Valo 	if (!skb)
7107d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
71085e3dd157SKalle Valo 
71095e3dd157SKalle Valo 	if (arg->hidden_ssid)
71105e3dd157SKalle Valo 		flags |= WMI_VDEV_START_HIDDEN_SSID;
71115e3dd157SKalle Valo 	if (arg->pmf_enabled)
71125e3dd157SKalle Valo 		flags |= WMI_VDEV_START_PMF_ENABLED;
71135e3dd157SKalle Valo 
71145e3dd157SKalle Valo 	cmd = (struct wmi_vdev_start_request_cmd *)skb->data;
71155e3dd157SKalle Valo 	cmd->vdev_id         = __cpu_to_le32(arg->vdev_id);
71165e3dd157SKalle Valo 	cmd->disable_hw_ack  = __cpu_to_le32(arg->disable_hw_ack);
71175e3dd157SKalle Valo 	cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval);
71185e3dd157SKalle Valo 	cmd->dtim_period     = __cpu_to_le32(arg->dtim_period);
71195e3dd157SKalle Valo 	cmd->flags           = __cpu_to_le32(flags);
71205e3dd157SKalle Valo 	cmd->bcn_tx_rate     = __cpu_to_le32(arg->bcn_tx_rate);
71215e3dd157SKalle Valo 	cmd->bcn_tx_power    = __cpu_to_le32(arg->bcn_tx_power);
71225e3dd157SKalle Valo 
71235e3dd157SKalle Valo 	if (arg->ssid) {
71245e3dd157SKalle Valo 		cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len);
71255e3dd157SKalle Valo 		memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
71265e3dd157SKalle Valo 	}
71275e3dd157SKalle Valo 
71282d66721cSMichal Kazior 	ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel);
71295e3dd157SKalle Valo 
71307aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
71318cc7f26cSKalle Valo 		   "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
71328cc7f26cSKalle Valo 		   cmdname, arg->vdev_id,
7133e8a50f8bSMarek Puzyniak 		   flags, arg->channel.freq, arg->channel.mode,
7134e8a50f8bSMarek Puzyniak 		   cmd->chan.flags, arg->channel.max_power);
71355e3dd157SKalle Valo 
7136d7579d12SMichal Kazior 	return skb;
71375e3dd157SKalle Valo }
71385e3dd157SKalle Valo 
7139d7579d12SMichal Kazior static struct sk_buff *
7140d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id)
71415e3dd157SKalle Valo {
71425e3dd157SKalle Valo 	struct wmi_vdev_stop_cmd *cmd;
71435e3dd157SKalle Valo 	struct sk_buff *skb;
71445e3dd157SKalle Valo 
71457aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
71465e3dd157SKalle Valo 	if (!skb)
7147d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
71485e3dd157SKalle Valo 
71495e3dd157SKalle Valo 	cmd = (struct wmi_vdev_stop_cmd *)skb->data;
71505e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
71515e3dd157SKalle Valo 
71527aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
7153d7579d12SMichal Kazior 	return skb;
71545e3dd157SKalle Valo }
71555e3dd157SKalle Valo 
7156d7579d12SMichal Kazior static struct sk_buff *
7157d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid,
7158d7579d12SMichal Kazior 			  const u8 *bssid)
71595e3dd157SKalle Valo {
71605e3dd157SKalle Valo 	struct wmi_vdev_up_cmd *cmd;
71615e3dd157SKalle Valo 	struct sk_buff *skb;
71625e3dd157SKalle Valo 
71637aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
71645e3dd157SKalle Valo 	if (!skb)
7165d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
71665e3dd157SKalle Valo 
71675e3dd157SKalle Valo 	cmd = (struct wmi_vdev_up_cmd *)skb->data;
71685e3dd157SKalle Valo 	cmd->vdev_id       = __cpu_to_le32(vdev_id);
71695e3dd157SKalle Valo 	cmd->vdev_assoc_id = __cpu_to_le32(aid);
7170b25f32cbSKalle Valo 	ether_addr_copy(cmd->vdev_bssid.addr, bssid);
71715e3dd157SKalle Valo 
71727aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
71735e3dd157SKalle Valo 		   "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
71745e3dd157SKalle Valo 		   vdev_id, aid, bssid);
7175d7579d12SMichal Kazior 	return skb;
71765e3dd157SKalle Valo }
71775e3dd157SKalle Valo 
7178d7579d12SMichal Kazior static struct sk_buff *
7179d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id)
71805e3dd157SKalle Valo {
71815e3dd157SKalle Valo 	struct wmi_vdev_down_cmd *cmd;
71825e3dd157SKalle Valo 	struct sk_buff *skb;
71835e3dd157SKalle Valo 
71847aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
71855e3dd157SKalle Valo 	if (!skb)
7186d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
71875e3dd157SKalle Valo 
71885e3dd157SKalle Valo 	cmd = (struct wmi_vdev_down_cmd *)skb->data;
71895e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
71905e3dd157SKalle Valo 
71917aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
71925e3dd157SKalle Valo 		   "wmi mgmt vdev down id 0x%x\n", vdev_id);
7193d7579d12SMichal Kazior 	return skb;
71945e3dd157SKalle Valo }
71955e3dd157SKalle Valo 
7196d7579d12SMichal Kazior static struct sk_buff *
7197d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id,
71986d1506e7SBartosz Markowski 				 u32 param_id, u32 param_value)
71995e3dd157SKalle Valo {
72005e3dd157SKalle Valo 	struct wmi_vdev_set_param_cmd *cmd;
72015e3dd157SKalle Valo 	struct sk_buff *skb;
72025e3dd157SKalle Valo 
72036d1506e7SBartosz Markowski 	if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
72047aa7a72aSMichal Kazior 		ath10k_dbg(ar, ATH10K_DBG_WMI,
72056d1506e7SBartosz Markowski 			   "vdev param %d not supported by firmware\n",
72066d1506e7SBartosz Markowski 			    param_id);
7207d7579d12SMichal Kazior 		return ERR_PTR(-EOPNOTSUPP);
72086d1506e7SBartosz Markowski 	}
72096d1506e7SBartosz Markowski 
72107aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
72115e3dd157SKalle Valo 	if (!skb)
7212d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
72135e3dd157SKalle Valo 
72145e3dd157SKalle Valo 	cmd = (struct wmi_vdev_set_param_cmd *)skb->data;
72155e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
72165e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(param_id);
72175e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(param_value);
72185e3dd157SKalle Valo 
72197aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
72205e3dd157SKalle Valo 		   "wmi vdev id 0x%x set param %d value %d\n",
72215e3dd157SKalle Valo 		   vdev_id, param_id, param_value);
7222d7579d12SMichal Kazior 	return skb;
72235e3dd157SKalle Valo }
72245e3dd157SKalle Valo 
7225d7579d12SMichal Kazior static struct sk_buff *
7226d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar,
72275e3dd157SKalle Valo 				   const struct wmi_vdev_install_key_arg *arg)
72285e3dd157SKalle Valo {
72295e3dd157SKalle Valo 	struct wmi_vdev_install_key_cmd *cmd;
72305e3dd157SKalle Valo 	struct sk_buff *skb;
72315e3dd157SKalle Valo 
72325e3dd157SKalle Valo 	if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
7233d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
72345e3dd157SKalle Valo 	if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
7235d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
72365e3dd157SKalle Valo 
72377aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
72385e3dd157SKalle Valo 	if (!skb)
7239d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
72405e3dd157SKalle Valo 
72415e3dd157SKalle Valo 	cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
72425e3dd157SKalle Valo 	cmd->vdev_id       = __cpu_to_le32(arg->vdev_id);
72435e3dd157SKalle Valo 	cmd->key_idx       = __cpu_to_le32(arg->key_idx);
72445e3dd157SKalle Valo 	cmd->key_flags     = __cpu_to_le32(arg->key_flags);
72455e3dd157SKalle Valo 	cmd->key_cipher    = __cpu_to_le32(arg->key_cipher);
72465e3dd157SKalle Valo 	cmd->key_len       = __cpu_to_le32(arg->key_len);
72475e3dd157SKalle Valo 	cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len);
72485e3dd157SKalle Valo 	cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
72495e3dd157SKalle Valo 
72505e3dd157SKalle Valo 	if (arg->macaddr)
7251b25f32cbSKalle Valo 		ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr);
72525e3dd157SKalle Valo 	if (arg->key_data)
72535e3dd157SKalle Valo 		memcpy(cmd->key_data, arg->key_data, arg->key_len);
72545e3dd157SKalle Valo 
72557aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7256e0c508abSMichal Kazior 		   "wmi vdev install key idx %d cipher %d len %d\n",
7257e0c508abSMichal Kazior 		   arg->key_idx, arg->key_cipher, arg->key_len);
7258d7579d12SMichal Kazior 	return skb;
72595e3dd157SKalle Valo }
72605e3dd157SKalle Valo 
7261d7579d12SMichal Kazior static struct sk_buff *
7262d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar,
7263855aed12SSimon Wunderlich 				     const struct wmi_vdev_spectral_conf_arg *arg)
7264855aed12SSimon Wunderlich {
7265855aed12SSimon Wunderlich 	struct wmi_vdev_spectral_conf_cmd *cmd;
7266855aed12SSimon Wunderlich 	struct sk_buff *skb;
7267855aed12SSimon Wunderlich 
72687aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7269855aed12SSimon Wunderlich 	if (!skb)
7270d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
7271855aed12SSimon Wunderlich 
7272855aed12SSimon Wunderlich 	cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data;
7273855aed12SSimon Wunderlich 	cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
7274855aed12SSimon Wunderlich 	cmd->scan_count = __cpu_to_le32(arg->scan_count);
7275855aed12SSimon Wunderlich 	cmd->scan_period = __cpu_to_le32(arg->scan_period);
7276855aed12SSimon Wunderlich 	cmd->scan_priority = __cpu_to_le32(arg->scan_priority);
7277855aed12SSimon Wunderlich 	cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size);
7278855aed12SSimon Wunderlich 	cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena);
7279855aed12SSimon Wunderlich 	cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena);
7280855aed12SSimon Wunderlich 	cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref);
7281855aed12SSimon Wunderlich 	cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay);
7282855aed12SSimon Wunderlich 	cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr);
7283855aed12SSimon Wunderlich 	cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr);
7284855aed12SSimon Wunderlich 	cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode);
7285855aed12SSimon Wunderlich 	cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode);
7286855aed12SSimon Wunderlich 	cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr);
7287855aed12SSimon Wunderlich 	cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format);
7288855aed12SSimon Wunderlich 	cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode);
7289855aed12SSimon Wunderlich 	cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale);
7290855aed12SSimon Wunderlich 	cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj);
7291855aed12SSimon Wunderlich 	cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask);
7292855aed12SSimon Wunderlich 
7293d7579d12SMichal Kazior 	return skb;
7294855aed12SSimon Wunderlich }
7295855aed12SSimon Wunderlich 
7296d7579d12SMichal Kazior static struct sk_buff *
7297d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id,
7298d7579d12SMichal Kazior 				       u32 trigger, u32 enable)
7299855aed12SSimon Wunderlich {
7300855aed12SSimon Wunderlich 	struct wmi_vdev_spectral_enable_cmd *cmd;
7301855aed12SSimon Wunderlich 	struct sk_buff *skb;
7302855aed12SSimon Wunderlich 
73037aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7304855aed12SSimon Wunderlich 	if (!skb)
7305d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
7306855aed12SSimon Wunderlich 
7307855aed12SSimon Wunderlich 	cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data;
7308855aed12SSimon Wunderlich 	cmd->vdev_id = __cpu_to_le32(vdev_id);
7309855aed12SSimon Wunderlich 	cmd->trigger_cmd = __cpu_to_le32(trigger);
7310855aed12SSimon Wunderlich 	cmd->enable_cmd = __cpu_to_le32(enable);
7311855aed12SSimon Wunderlich 
7312d7579d12SMichal Kazior 	return skb;
7313855aed12SSimon Wunderlich }
7314855aed12SSimon Wunderlich 
7315d7579d12SMichal Kazior static struct sk_buff *
7316d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
73177390ed34SMarek Puzyniak 			      const u8 peer_addr[ETH_ALEN],
73187390ed34SMarek Puzyniak 			      enum wmi_peer_type peer_type)
73195e3dd157SKalle Valo {
73205e3dd157SKalle Valo 	struct wmi_peer_create_cmd *cmd;
73215e3dd157SKalle Valo 	struct sk_buff *skb;
73225e3dd157SKalle Valo 
73237aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
73245e3dd157SKalle Valo 	if (!skb)
7325d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
73265e3dd157SKalle Valo 
73275e3dd157SKalle Valo 	cmd = (struct wmi_peer_create_cmd *)skb->data;
73285e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
7329b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
7330be5b4f40SManikanta Pubbisetty 	cmd->peer_type = __cpu_to_le32(peer_type);
73315e3dd157SKalle Valo 
73327aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
73335e3dd157SKalle Valo 		   "wmi peer create vdev_id %d peer_addr %pM\n",
73345e3dd157SKalle Valo 		   vdev_id, peer_addr);
7335d7579d12SMichal Kazior 	return skb;
73365e3dd157SKalle Valo }
73375e3dd157SKalle Valo 
7338d7579d12SMichal Kazior static struct sk_buff *
7339d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id,
73405e3dd157SKalle Valo 			      const u8 peer_addr[ETH_ALEN])
73415e3dd157SKalle Valo {
73425e3dd157SKalle Valo 	struct wmi_peer_delete_cmd *cmd;
73435e3dd157SKalle Valo 	struct sk_buff *skb;
73445e3dd157SKalle Valo 
73457aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
73465e3dd157SKalle Valo 	if (!skb)
7347d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
73485e3dd157SKalle Valo 
73495e3dd157SKalle Valo 	cmd = (struct wmi_peer_delete_cmd *)skb->data;
73505e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
7351b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
73525e3dd157SKalle Valo 
73537aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
73545e3dd157SKalle Valo 		   "wmi peer delete vdev_id %d peer_addr %pM\n",
73555e3dd157SKalle Valo 		   vdev_id, peer_addr);
7356d7579d12SMichal Kazior 	return skb;
73575e3dd157SKalle Valo }
73585e3dd157SKalle Valo 
7359d7579d12SMichal Kazior static struct sk_buff *
7360d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id,
73615e3dd157SKalle Valo 			     const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
73625e3dd157SKalle Valo {
73635e3dd157SKalle Valo 	struct wmi_peer_flush_tids_cmd *cmd;
73645e3dd157SKalle Valo 	struct sk_buff *skb;
73655e3dd157SKalle Valo 
73667aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
73675e3dd157SKalle Valo 	if (!skb)
7368d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
73695e3dd157SKalle Valo 
73705e3dd157SKalle Valo 	cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
73715e3dd157SKalle Valo 	cmd->vdev_id         = __cpu_to_le32(vdev_id);
73725e3dd157SKalle Valo 	cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
7373b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
73745e3dd157SKalle Valo 
73757aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
73765e3dd157SKalle Valo 		   "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
73775e3dd157SKalle Valo 		   vdev_id, peer_addr, tid_bitmap);
7378d7579d12SMichal Kazior 	return skb;
73795e3dd157SKalle Valo }
73805e3dd157SKalle Valo 
7381d7579d12SMichal Kazior static struct sk_buff *
7382d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id,
7383d7579d12SMichal Kazior 				 const u8 *peer_addr,
7384d7579d12SMichal Kazior 				 enum wmi_peer_param param_id,
73855e3dd157SKalle Valo 				 u32 param_value)
73865e3dd157SKalle Valo {
73875e3dd157SKalle Valo 	struct wmi_peer_set_param_cmd *cmd;
73885e3dd157SKalle Valo 	struct sk_buff *skb;
73895e3dd157SKalle Valo 
73907aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
73915e3dd157SKalle Valo 	if (!skb)
7392d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
73935e3dd157SKalle Valo 
73945e3dd157SKalle Valo 	cmd = (struct wmi_peer_set_param_cmd *)skb->data;
73955e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
73965e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(param_id);
73975e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(param_value);
7398b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
73995e3dd157SKalle Valo 
74007aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
74015e3dd157SKalle Valo 		   "wmi vdev %d peer 0x%pM set param %d value %d\n",
74025e3dd157SKalle Valo 		   vdev_id, peer_addr, param_id, param_value);
7403d7579d12SMichal Kazior 	return skb;
74045e3dd157SKalle Valo }
74055e3dd157SKalle Valo 
7406d7579d12SMichal Kazior static struct sk_buff *
7407d7579d12SMichal Kazior ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
74085e3dd157SKalle Valo 			     enum wmi_sta_ps_mode psmode)
74095e3dd157SKalle Valo {
74105e3dd157SKalle Valo 	struct wmi_sta_powersave_mode_cmd *cmd;
74115e3dd157SKalle Valo 	struct sk_buff *skb;
74125e3dd157SKalle Valo 
74137aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
74145e3dd157SKalle Valo 	if (!skb)
7415d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
74165e3dd157SKalle Valo 
74175e3dd157SKalle Valo 	cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data;
74185e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
74195e3dd157SKalle Valo 	cmd->sta_ps_mode = __cpu_to_le32(psmode);
74205e3dd157SKalle Valo 
74217aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
74225e3dd157SKalle Valo 		   "wmi set powersave id 0x%x mode %d\n",
74235e3dd157SKalle Valo 		   vdev_id, psmode);
7424d7579d12SMichal Kazior 	return skb;
74255e3dd157SKalle Valo }
74265e3dd157SKalle Valo 
7427d7579d12SMichal Kazior static struct sk_buff *
7428d7579d12SMichal Kazior ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id,
74295e3dd157SKalle Valo 			     enum wmi_sta_powersave_param param_id,
74305e3dd157SKalle Valo 			     u32 value)
74315e3dd157SKalle Valo {
74325e3dd157SKalle Valo 	struct wmi_sta_powersave_param_cmd *cmd;
74335e3dd157SKalle Valo 	struct sk_buff *skb;
74345e3dd157SKalle Valo 
74357aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
74365e3dd157SKalle Valo 	if (!skb)
7437d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
74385e3dd157SKalle Valo 
74395e3dd157SKalle Valo 	cmd = (struct wmi_sta_powersave_param_cmd *)skb->data;
74405e3dd157SKalle Valo 	cmd->vdev_id     = __cpu_to_le32(vdev_id);
74415e3dd157SKalle Valo 	cmd->param_id    = __cpu_to_le32(param_id);
74425e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(value);
74435e3dd157SKalle Valo 
74447aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
74455e3dd157SKalle Valo 		   "wmi sta ps param vdev_id 0x%x param %d value %d\n",
74465e3dd157SKalle Valo 		   vdev_id, param_id, value);
7447d7579d12SMichal Kazior 	return skb;
74485e3dd157SKalle Valo }
74495e3dd157SKalle Valo 
7450d7579d12SMichal Kazior static struct sk_buff *
7451d7579d12SMichal Kazior ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac,
74525e3dd157SKalle Valo 			    enum wmi_ap_ps_peer_param param_id, u32 value)
74535e3dd157SKalle Valo {
74545e3dd157SKalle Valo 	struct wmi_ap_ps_peer_cmd *cmd;
74555e3dd157SKalle Valo 	struct sk_buff *skb;
74565e3dd157SKalle Valo 
74575e3dd157SKalle Valo 	if (!mac)
7458d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
74595e3dd157SKalle Valo 
74607aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
74615e3dd157SKalle Valo 	if (!skb)
7462d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
74635e3dd157SKalle Valo 
74645e3dd157SKalle Valo 	cmd = (struct wmi_ap_ps_peer_cmd *)skb->data;
74655e3dd157SKalle Valo 	cmd->vdev_id = __cpu_to_le32(vdev_id);
74665e3dd157SKalle Valo 	cmd->param_id = __cpu_to_le32(param_id);
74675e3dd157SKalle Valo 	cmd->param_value = __cpu_to_le32(value);
7468b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
74695e3dd157SKalle Valo 
74707aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
74715e3dd157SKalle Valo 		   "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
74725e3dd157SKalle Valo 		   vdev_id, param_id, value, mac);
7473d7579d12SMichal Kazior 	return skb;
74745e3dd157SKalle Valo }
74755e3dd157SKalle Valo 
7476d7579d12SMichal Kazior static struct sk_buff *
7477d7579d12SMichal Kazior ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar,
74785e3dd157SKalle Valo 				 const struct wmi_scan_chan_list_arg *arg)
74795e3dd157SKalle Valo {
74805e3dd157SKalle Valo 	struct wmi_scan_chan_list_cmd *cmd;
74815e3dd157SKalle Valo 	struct sk_buff *skb;
74825e3dd157SKalle Valo 	struct wmi_channel_arg *ch;
74835e3dd157SKalle Valo 	struct wmi_channel *ci;
74845e3dd157SKalle Valo 	int len;
74855e3dd157SKalle Valo 	int i;
74865e3dd157SKalle Valo 
74875e3dd157SKalle Valo 	len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);
74885e3dd157SKalle Valo 
74897aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
74905e3dd157SKalle Valo 	if (!skb)
7491d7579d12SMichal Kazior 		return ERR_PTR(-EINVAL);
74925e3dd157SKalle Valo 
74935e3dd157SKalle Valo 	cmd = (struct wmi_scan_chan_list_cmd *)skb->data;
74945e3dd157SKalle Valo 	cmd->num_scan_chans = __cpu_to_le32(arg->n_channels);
74955e3dd157SKalle Valo 
74965e3dd157SKalle Valo 	for (i = 0; i < arg->n_channels; i++) {
74975e3dd157SKalle Valo 		ch = &arg->channels[i];
74985e3dd157SKalle Valo 		ci = &cmd->chan_info[i];
74995e3dd157SKalle Valo 
75002d66721cSMichal Kazior 		ath10k_wmi_put_wmi_channel(ci, ch);
75015e3dd157SKalle Valo 	}
75025e3dd157SKalle Valo 
7503d7579d12SMichal Kazior 	return skb;
75045e3dd157SKalle Valo }
75055e3dd157SKalle Valo 
750624c88f78SMichal Kazior static void
750724c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
75085e3dd157SKalle Valo 			   const struct wmi_peer_assoc_complete_arg *arg)
75095e3dd157SKalle Valo {
751024c88f78SMichal Kazior 	struct wmi_common_peer_assoc_complete_cmd *cmd = buf;
75115e3dd157SKalle Valo 
75125e3dd157SKalle Valo 	cmd->vdev_id            = __cpu_to_le32(arg->vdev_id);
75135e3dd157SKalle Valo 	cmd->peer_new_assoc     = __cpu_to_le32(arg->peer_reassoc ? 0 : 1);
75145e3dd157SKalle Valo 	cmd->peer_associd       = __cpu_to_le32(arg->peer_aid);
75155e3dd157SKalle Valo 	cmd->peer_flags         = __cpu_to_le32(arg->peer_flags);
75165e3dd157SKalle Valo 	cmd->peer_caps          = __cpu_to_le32(arg->peer_caps);
75175e3dd157SKalle Valo 	cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval);
75185e3dd157SKalle Valo 	cmd->peer_ht_caps       = __cpu_to_le32(arg->peer_ht_caps);
75195e3dd157SKalle Valo 	cmd->peer_max_mpdu      = __cpu_to_le32(arg->peer_max_mpdu);
75205e3dd157SKalle Valo 	cmd->peer_mpdu_density  = __cpu_to_le32(arg->peer_mpdu_density);
75215e3dd157SKalle Valo 	cmd->peer_rate_caps     = __cpu_to_le32(arg->peer_rate_caps);
75225e3dd157SKalle Valo 	cmd->peer_nss           = __cpu_to_le32(arg->peer_num_spatial_streams);
75235e3dd157SKalle Valo 	cmd->peer_vht_caps      = __cpu_to_le32(arg->peer_vht_caps);
75245e3dd157SKalle Valo 	cmd->peer_phymode       = __cpu_to_le32(arg->peer_phymode);
75255e3dd157SKalle Valo 
7526b25f32cbSKalle Valo 	ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
75275e3dd157SKalle Valo 
75285e3dd157SKalle Valo 	cmd->peer_legacy_rates.num_rates =
75295e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_legacy_rates.num_rates);
75305e3dd157SKalle Valo 	memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
75315e3dd157SKalle Valo 	       arg->peer_legacy_rates.num_rates);
75325e3dd157SKalle Valo 
75335e3dd157SKalle Valo 	cmd->peer_ht_rates.num_rates =
75345e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_ht_rates.num_rates);
75355e3dd157SKalle Valo 	memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
75365e3dd157SKalle Valo 	       arg->peer_ht_rates.num_rates);
75375e3dd157SKalle Valo 
75385e3dd157SKalle Valo 	cmd->peer_vht_rates.rx_max_rate =
75395e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
75405e3dd157SKalle Valo 	cmd->peer_vht_rates.rx_mcs_set =
75415e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
75425e3dd157SKalle Valo 	cmd->peer_vht_rates.tx_max_rate =
75435e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
75445e3dd157SKalle Valo 	cmd->peer_vht_rates.tx_mcs_set =
75455e3dd157SKalle Valo 		__cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
754624c88f78SMichal Kazior }
754724c88f78SMichal Kazior 
754824c88f78SMichal Kazior static void
754924c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf,
755024c88f78SMichal Kazior 				const struct wmi_peer_assoc_complete_arg *arg)
755124c88f78SMichal Kazior {
755224c88f78SMichal Kazior 	struct wmi_main_peer_assoc_complete_cmd *cmd = buf;
755324c88f78SMichal Kazior 
755424c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
755524c88f78SMichal Kazior 	memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info));
755624c88f78SMichal Kazior }
755724c88f78SMichal Kazior 
755824c88f78SMichal Kazior static void
755924c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf,
756024c88f78SMichal Kazior 				const struct wmi_peer_assoc_complete_arg *arg)
756124c88f78SMichal Kazior {
756224c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
756324c88f78SMichal Kazior }
756424c88f78SMichal Kazior 
756524c88f78SMichal Kazior static void
756624c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf,
756724c88f78SMichal Kazior 				const struct wmi_peer_assoc_complete_arg *arg)
756824c88f78SMichal Kazior {
756924c88f78SMichal Kazior 	struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf;
757024c88f78SMichal Kazior 	int max_mcs, max_nss;
757124c88f78SMichal Kazior 	u32 info0;
757224c88f78SMichal Kazior 
757324c88f78SMichal Kazior 	/* TODO: Is using max values okay with firmware? */
757424c88f78SMichal Kazior 	max_mcs = 0xf;
757524c88f78SMichal Kazior 	max_nss = 0xf;
757624c88f78SMichal Kazior 
757724c88f78SMichal Kazior 	info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) |
757824c88f78SMichal Kazior 		SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS);
757924c88f78SMichal Kazior 
758024c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill(ar, buf, arg);
758124c88f78SMichal Kazior 	cmd->info0 = __cpu_to_le32(info0);
758224c88f78SMichal Kazior }
758324c88f78SMichal Kazior 
7584b54e16f1SVasanthakumar Thiagarajan static void
7585b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf,
7586b54e16f1SVasanthakumar Thiagarajan 				const struct wmi_peer_assoc_complete_arg *arg)
7587b54e16f1SVasanthakumar Thiagarajan {
7588b54e16f1SVasanthakumar Thiagarajan 	struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf;
7589b54e16f1SVasanthakumar Thiagarajan 
7590b54e16f1SVasanthakumar Thiagarajan 	ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
7591cc914a55SBen Greear 	if (arg->peer_bw_rxnss_override)
7592cc914a55SBen Greear 		cmd->peer_bw_rxnss_override =
7593cc914a55SBen Greear 			__cpu_to_le32((arg->peer_bw_rxnss_override - 1) |
7594cc914a55SBen Greear 				      BIT(PEER_BW_RXNSS_OVERRIDE_OFFSET));
7595cc914a55SBen Greear 	else
7596b54e16f1SVasanthakumar Thiagarajan 		cmd->peer_bw_rxnss_override = 0;
7597b54e16f1SVasanthakumar Thiagarajan }
7598b54e16f1SVasanthakumar Thiagarajan 
7599d7579d12SMichal Kazior static int
7600d7579d12SMichal Kazior ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg)
760124c88f78SMichal Kazior {
760224c88f78SMichal Kazior 	if (arg->peer_mpdu_density > 16)
760324c88f78SMichal Kazior 		return -EINVAL;
760424c88f78SMichal Kazior 	if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES)
760524c88f78SMichal Kazior 		return -EINVAL;
760624c88f78SMichal Kazior 	if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES)
760724c88f78SMichal Kazior 		return -EINVAL;
760824c88f78SMichal Kazior 
7609d7579d12SMichal Kazior 	return 0;
761024c88f78SMichal Kazior }
761124c88f78SMichal Kazior 
7612d7579d12SMichal Kazior static struct sk_buff *
7613d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar,
7614d7579d12SMichal Kazior 			     const struct wmi_peer_assoc_complete_arg *arg)
7615d7579d12SMichal Kazior {
7616d7579d12SMichal Kazior 	size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd);
7617d7579d12SMichal Kazior 	struct sk_buff *skb;
7618d7579d12SMichal Kazior 	int ret;
7619d7579d12SMichal Kazior 
7620d7579d12SMichal Kazior 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
7621d7579d12SMichal Kazior 	if (ret)
7622d7579d12SMichal Kazior 		return ERR_PTR(ret);
7623d7579d12SMichal Kazior 
76247aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
762524c88f78SMichal Kazior 	if (!skb)
7626d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
762724c88f78SMichal Kazior 
762824c88f78SMichal Kazior 	ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);
76295e3dd157SKalle Valo 
76307aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
763144d6fa90SChun-Yeow Yeoh 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
763244d6fa90SChun-Yeow Yeoh 		   arg->vdev_id, arg->addr,
763344d6fa90SChun-Yeow Yeoh 		   arg->peer_reassoc ? "reassociate" : "new");
7634d7579d12SMichal Kazior 	return skb;
7635d7579d12SMichal Kazior }
7636d7579d12SMichal Kazior 
7637d7579d12SMichal Kazior static struct sk_buff *
7638d7579d12SMichal Kazior ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar,
7639d7579d12SMichal Kazior 				  const struct wmi_peer_assoc_complete_arg *arg)
7640d7579d12SMichal Kazior {
7641d7579d12SMichal Kazior 	size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd);
7642d7579d12SMichal Kazior 	struct sk_buff *skb;
7643d7579d12SMichal Kazior 	int ret;
7644d7579d12SMichal Kazior 
7645d7579d12SMichal Kazior 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
7646d7579d12SMichal Kazior 	if (ret)
7647d7579d12SMichal Kazior 		return ERR_PTR(ret);
7648d7579d12SMichal Kazior 
7649d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
7650d7579d12SMichal Kazior 	if (!skb)
7651d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
7652d7579d12SMichal Kazior 
7653d7579d12SMichal Kazior 	ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);
7654d7579d12SMichal Kazior 
7655d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7656d7579d12SMichal Kazior 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
7657d7579d12SMichal Kazior 		   arg->vdev_id, arg->addr,
7658d7579d12SMichal Kazior 		   arg->peer_reassoc ? "reassociate" : "new");
7659d7579d12SMichal Kazior 	return skb;
7660d7579d12SMichal Kazior }
7661d7579d12SMichal Kazior 
7662d7579d12SMichal Kazior static struct sk_buff *
7663d7579d12SMichal Kazior ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar,
7664d7579d12SMichal Kazior 				  const struct wmi_peer_assoc_complete_arg *arg)
7665d7579d12SMichal Kazior {
7666d7579d12SMichal Kazior 	size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd);
7667d7579d12SMichal Kazior 	struct sk_buff *skb;
7668d7579d12SMichal Kazior 	int ret;
7669d7579d12SMichal Kazior 
7670d7579d12SMichal Kazior 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
7671d7579d12SMichal Kazior 	if (ret)
7672d7579d12SMichal Kazior 		return ERR_PTR(ret);
7673d7579d12SMichal Kazior 
7674d7579d12SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, len);
7675d7579d12SMichal Kazior 	if (!skb)
7676d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
7677d7579d12SMichal Kazior 
7678d7579d12SMichal Kazior 	ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);
7679d7579d12SMichal Kazior 
7680d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7681d7579d12SMichal Kazior 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
7682d7579d12SMichal Kazior 		   arg->vdev_id, arg->addr,
7683d7579d12SMichal Kazior 		   arg->peer_reassoc ? "reassociate" : "new");
7684d7579d12SMichal Kazior 	return skb;
76855e3dd157SKalle Valo }
76865e3dd157SKalle Valo 
7687a57a6a27SRajkumar Manoharan static struct sk_buff *
7688b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar,
7689b54e16f1SVasanthakumar Thiagarajan 				  const struct wmi_peer_assoc_complete_arg *arg)
7690b54e16f1SVasanthakumar Thiagarajan {
7691b54e16f1SVasanthakumar Thiagarajan 	size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd);
7692b54e16f1SVasanthakumar Thiagarajan 	struct sk_buff *skb;
7693b54e16f1SVasanthakumar Thiagarajan 	int ret;
7694b54e16f1SVasanthakumar Thiagarajan 
7695b54e16f1SVasanthakumar Thiagarajan 	ret = ath10k_wmi_peer_assoc_check_arg(arg);
7696b54e16f1SVasanthakumar Thiagarajan 	if (ret)
7697b54e16f1SVasanthakumar Thiagarajan 		return ERR_PTR(ret);
7698b54e16f1SVasanthakumar Thiagarajan 
7699b54e16f1SVasanthakumar Thiagarajan 	skb = ath10k_wmi_alloc_skb(ar, len);
7700b54e16f1SVasanthakumar Thiagarajan 	if (!skb)
7701b54e16f1SVasanthakumar Thiagarajan 		return ERR_PTR(-ENOMEM);
7702b54e16f1SVasanthakumar Thiagarajan 
7703b54e16f1SVasanthakumar Thiagarajan 	ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);
7704b54e16f1SVasanthakumar Thiagarajan 
7705b54e16f1SVasanthakumar Thiagarajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7706b54e16f1SVasanthakumar Thiagarajan 		   "wmi peer assoc vdev %d addr %pM (%s)\n",
7707b54e16f1SVasanthakumar Thiagarajan 		   arg->vdev_id, arg->addr,
7708b54e16f1SVasanthakumar Thiagarajan 		   arg->peer_reassoc ? "reassociate" : "new");
7709b54e16f1SVasanthakumar Thiagarajan 	return skb;
7710b54e16f1SVasanthakumar Thiagarajan }
7711b54e16f1SVasanthakumar Thiagarajan 
7712b54e16f1SVasanthakumar Thiagarajan static struct sk_buff *
7713a57a6a27SRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
7714a57a6a27SRajkumar Manoharan {
7715a57a6a27SRajkumar Manoharan 	struct sk_buff *skb;
7716a57a6a27SRajkumar Manoharan 
7717a57a6a27SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, 0);
7718a57a6a27SRajkumar Manoharan 	if (!skb)
7719a57a6a27SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
7720a57a6a27SRajkumar Manoharan 
7721a57a6a27SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
7722a57a6a27SRajkumar Manoharan 	return skb;
7723a57a6a27SRajkumar Manoharan }
7724a57a6a27SRajkumar Manoharan 
77258a0b459eSRajkumar Manoharan static struct sk_buff *
77268a0b459eSRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar,
77278a0b459eSRajkumar Manoharan 					  enum wmi_bss_survey_req_type type)
77288a0b459eSRajkumar Manoharan {
77298a0b459eSRajkumar Manoharan 	struct wmi_pdev_chan_info_req_cmd *cmd;
77308a0b459eSRajkumar Manoharan 	struct sk_buff *skb;
77318a0b459eSRajkumar Manoharan 
77328a0b459eSRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
77338a0b459eSRajkumar Manoharan 	if (!skb)
77348a0b459eSRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
77358a0b459eSRajkumar Manoharan 
77368a0b459eSRajkumar Manoharan 	cmd = (struct wmi_pdev_chan_info_req_cmd *)skb->data;
77378a0b459eSRajkumar Manoharan 	cmd->type = __cpu_to_le32(type);
77388a0b459eSRajkumar Manoharan 
77398a0b459eSRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
77408a0b459eSRajkumar Manoharan 		   "wmi pdev bss info request type %d\n", type);
77418a0b459eSRajkumar Manoharan 
77428a0b459eSRajkumar Manoharan 	return skb;
77438a0b459eSRajkumar Manoharan }
77448a0b459eSRajkumar Manoharan 
7745748afc47SMichal Kazior /* This function assumes the beacon is already DMA mapped */
7746d7579d12SMichal Kazior static struct sk_buff *
77479ad50182SMichal Kazior ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn,
77489ad50182SMichal Kazior 			     size_t bcn_len, u32 bcn_paddr, bool dtim_zero,
77499ad50182SMichal Kazior 			     bool deliver_cab)
77505e3dd157SKalle Valo {
7751748afc47SMichal Kazior 	struct wmi_bcn_tx_ref_cmd *cmd;
77525e3dd157SKalle Valo 	struct sk_buff *skb;
7753748afc47SMichal Kazior 	struct ieee80211_hdr *hdr;
7754748afc47SMichal Kazior 	u16 fc;
77555e3dd157SKalle Valo 
77567aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
77575e3dd157SKalle Valo 	if (!skb)
7758d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
77595e3dd157SKalle Valo 
77609ad50182SMichal Kazior 	hdr = (struct ieee80211_hdr *)bcn;
7761748afc47SMichal Kazior 	fc = le16_to_cpu(hdr->frame_control);
77625e3dd157SKalle Valo 
7763748afc47SMichal Kazior 	cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data;
77649ad50182SMichal Kazior 	cmd->vdev_id = __cpu_to_le32(vdev_id);
77659ad50182SMichal Kazior 	cmd->data_len = __cpu_to_le32(bcn_len);
77669ad50182SMichal Kazior 	cmd->data_ptr = __cpu_to_le32(bcn_paddr);
7767748afc47SMichal Kazior 	cmd->msdu_id = 0;
7768748afc47SMichal Kazior 	cmd->frame_control = __cpu_to_le32(fc);
7769748afc47SMichal Kazior 	cmd->flags = 0;
777024c88f78SMichal Kazior 	cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA);
7771748afc47SMichal Kazior 
77729ad50182SMichal Kazior 	if (dtim_zero)
7773748afc47SMichal Kazior 		cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO);
7774748afc47SMichal Kazior 
77759ad50182SMichal Kazior 	if (deliver_cab)
7776748afc47SMichal Kazior 		cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB);
7777748afc47SMichal Kazior 
7778d7579d12SMichal Kazior 	return skb;
77795e3dd157SKalle Valo }
77805e3dd157SKalle Valo 
77815e752e42SMichal Kazior void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
77825e3dd157SKalle Valo 			      const struct wmi_wmm_params_arg *arg)
77835e3dd157SKalle Valo {
77845e3dd157SKalle Valo 	params->cwmin  = __cpu_to_le32(arg->cwmin);
77855e3dd157SKalle Valo 	params->cwmax  = __cpu_to_le32(arg->cwmax);
77865e3dd157SKalle Valo 	params->aifs   = __cpu_to_le32(arg->aifs);
77875e3dd157SKalle Valo 	params->txop   = __cpu_to_le32(arg->txop);
77885e3dd157SKalle Valo 	params->acm    = __cpu_to_le32(arg->acm);
77895e3dd157SKalle Valo 	params->no_ack = __cpu_to_le32(arg->no_ack);
77905e3dd157SKalle Valo }
77915e3dd157SKalle Valo 
7792d7579d12SMichal Kazior static struct sk_buff *
7793d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
77945e752e42SMichal Kazior 			       const struct wmi_wmm_params_all_arg *arg)
77955e3dd157SKalle Valo {
77965e3dd157SKalle Valo 	struct wmi_pdev_set_wmm_params *cmd;
77975e3dd157SKalle Valo 	struct sk_buff *skb;
77985e3dd157SKalle Valo 
77997aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
78005e3dd157SKalle Valo 	if (!skb)
7801d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
78025e3dd157SKalle Valo 
78035e3dd157SKalle Valo 	cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
78045e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
78055e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
78065e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
78075e752e42SMichal Kazior 	ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
78085e3dd157SKalle Valo 
78097aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
7810d7579d12SMichal Kazior 	return skb;
78115e3dd157SKalle Valo }
78125e3dd157SKalle Valo 
7813d7579d12SMichal Kazior static struct sk_buff *
7814de23d3efSMichal Kazior ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
78155e3dd157SKalle Valo {
78165e3dd157SKalle Valo 	struct wmi_request_stats_cmd *cmd;
78175e3dd157SKalle Valo 	struct sk_buff *skb;
78185e3dd157SKalle Valo 
78197aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
78205e3dd157SKalle Valo 	if (!skb)
7821d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
78225e3dd157SKalle Valo 
78235e3dd157SKalle Valo 	cmd = (struct wmi_request_stats_cmd *)skb->data;
7824de23d3efSMichal Kazior 	cmd->stats_id = __cpu_to_le32(stats_mask);
78255e3dd157SKalle Valo 
7826de23d3efSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
7827de23d3efSMichal Kazior 		   stats_mask);
7828d7579d12SMichal Kazior 	return skb;
78295e3dd157SKalle Valo }
78309cfbce75SMichal Kazior 
7831d7579d12SMichal Kazior static struct sk_buff *
7832d7579d12SMichal Kazior ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
78339cfbce75SMichal Kazior 				enum wmi_force_fw_hang_type type, u32 delay_ms)
78349cfbce75SMichal Kazior {
78359cfbce75SMichal Kazior 	struct wmi_force_fw_hang_cmd *cmd;
78369cfbce75SMichal Kazior 	struct sk_buff *skb;
78379cfbce75SMichal Kazior 
78387aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
78399cfbce75SMichal Kazior 	if (!skb)
7840d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
78419cfbce75SMichal Kazior 
78429cfbce75SMichal Kazior 	cmd = (struct wmi_force_fw_hang_cmd *)skb->data;
78439cfbce75SMichal Kazior 	cmd->type = __cpu_to_le32(type);
78449cfbce75SMichal Kazior 	cmd->delay_ms = __cpu_to_le32(delay_ms);
78459cfbce75SMichal Kazior 
78467aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
78479cfbce75SMichal Kazior 		   type, delay_ms);
7848d7579d12SMichal Kazior 	return skb;
78499cfbce75SMichal Kazior }
7850f118a3e5SKalle Valo 
7851d7579d12SMichal Kazior static struct sk_buff *
7852afcbc82cSMaharaja Kennadyrajan ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7853467210a6SSenthilKumar Jegadeesan 			     u32 log_level)
7854f118a3e5SKalle Valo {
7855f118a3e5SKalle Valo 	struct wmi_dbglog_cfg_cmd *cmd;
7856f118a3e5SKalle Valo 	struct sk_buff *skb;
7857f118a3e5SKalle Valo 	u32 cfg;
7858f118a3e5SKalle Valo 
78597aa7a72aSMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7860f118a3e5SKalle Valo 	if (!skb)
7861d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
7862f118a3e5SKalle Valo 
7863f118a3e5SKalle Valo 	cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
7864f118a3e5SKalle Valo 
7865f118a3e5SKalle Valo 	if (module_enable) {
7866467210a6SSenthilKumar Jegadeesan 		cfg = SM(log_level,
7867f118a3e5SKalle Valo 			 ATH10K_DBGLOG_CFG_LOG_LVL);
7868f118a3e5SKalle Valo 	} else {
7869f118a3e5SKalle Valo 		/* set back defaults, all modules with WARN level */
7870f118a3e5SKalle Valo 		cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
7871f118a3e5SKalle Valo 			 ATH10K_DBGLOG_CFG_LOG_LVL);
7872f118a3e5SKalle Valo 		module_enable = ~0;
7873f118a3e5SKalle Valo 	}
7874f118a3e5SKalle Valo 
7875f118a3e5SKalle Valo 	cmd->module_enable = __cpu_to_le32(module_enable);
7876f118a3e5SKalle Valo 	cmd->module_valid = __cpu_to_le32(~0);
7877f118a3e5SKalle Valo 	cmd->config_enable = __cpu_to_le32(cfg);
7878f118a3e5SKalle Valo 	cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
7879f118a3e5SKalle Valo 
78807aa7a72aSMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7881f118a3e5SKalle Valo 		   "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
7882f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->module_enable),
7883f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->module_valid),
7884f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->config_enable),
7885f118a3e5SKalle Valo 		   __le32_to_cpu(cmd->config_valid));
7886d7579d12SMichal Kazior 	return skb;
7887f118a3e5SKalle Valo }
7888b79b9baaSMichal Kazior 
7889d7579d12SMichal Kazior static struct sk_buff *
7890afcbc82cSMaharaja Kennadyrajan ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7891afcbc82cSMaharaja Kennadyrajan 				  u32 log_level)
7892afcbc82cSMaharaja Kennadyrajan {
7893afcbc82cSMaharaja Kennadyrajan 	struct wmi_10_4_dbglog_cfg_cmd *cmd;
7894afcbc82cSMaharaja Kennadyrajan 	struct sk_buff *skb;
7895afcbc82cSMaharaja Kennadyrajan 	u32 cfg;
7896afcbc82cSMaharaja Kennadyrajan 
7897afcbc82cSMaharaja Kennadyrajan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7898afcbc82cSMaharaja Kennadyrajan 	if (!skb)
7899afcbc82cSMaharaja Kennadyrajan 		return ERR_PTR(-ENOMEM);
7900afcbc82cSMaharaja Kennadyrajan 
7901afcbc82cSMaharaja Kennadyrajan 	cmd = (struct wmi_10_4_dbglog_cfg_cmd *)skb->data;
7902afcbc82cSMaharaja Kennadyrajan 
7903afcbc82cSMaharaja Kennadyrajan 	if (module_enable) {
7904afcbc82cSMaharaja Kennadyrajan 		cfg = SM(log_level,
7905afcbc82cSMaharaja Kennadyrajan 			 ATH10K_DBGLOG_CFG_LOG_LVL);
7906afcbc82cSMaharaja Kennadyrajan 	} else {
7907afcbc82cSMaharaja Kennadyrajan 		/* set back defaults, all modules with WARN level */
7908afcbc82cSMaharaja Kennadyrajan 		cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
7909afcbc82cSMaharaja Kennadyrajan 			 ATH10K_DBGLOG_CFG_LOG_LVL);
7910afcbc82cSMaharaja Kennadyrajan 		module_enable = ~0;
7911afcbc82cSMaharaja Kennadyrajan 	}
7912afcbc82cSMaharaja Kennadyrajan 
7913afcbc82cSMaharaja Kennadyrajan 	cmd->module_enable = __cpu_to_le64(module_enable);
7914afcbc82cSMaharaja Kennadyrajan 	cmd->module_valid = __cpu_to_le64(~0);
7915afcbc82cSMaharaja Kennadyrajan 	cmd->config_enable = __cpu_to_le32(cfg);
7916afcbc82cSMaharaja Kennadyrajan 	cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
7917afcbc82cSMaharaja Kennadyrajan 
7918afcbc82cSMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7919afcbc82cSMaharaja Kennadyrajan 		   "wmi dbglog cfg modules 0x%016llx 0x%016llx config %08x %08x\n",
7920afcbc82cSMaharaja Kennadyrajan 		   __le64_to_cpu(cmd->module_enable),
7921afcbc82cSMaharaja Kennadyrajan 		   __le64_to_cpu(cmd->module_valid),
7922afcbc82cSMaharaja Kennadyrajan 		   __le32_to_cpu(cmd->config_enable),
7923afcbc82cSMaharaja Kennadyrajan 		   __le32_to_cpu(cmd->config_valid));
7924afcbc82cSMaharaja Kennadyrajan 	return skb;
7925afcbc82cSMaharaja Kennadyrajan }
7926afcbc82cSMaharaja Kennadyrajan 
7927afcbc82cSMaharaja Kennadyrajan static struct sk_buff *
7928d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap)
792990174455SRajkumar Manoharan {
793090174455SRajkumar Manoharan 	struct wmi_pdev_pktlog_enable_cmd *cmd;
793190174455SRajkumar Manoharan 	struct sk_buff *skb;
793290174455SRajkumar Manoharan 
793390174455SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
793490174455SRajkumar Manoharan 	if (!skb)
7935d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
793690174455SRajkumar Manoharan 
793790174455SRajkumar Manoharan 	ev_bitmap &= ATH10K_PKTLOG_ANY;
793890174455SRajkumar Manoharan 
793990174455SRajkumar Manoharan 	cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data;
794090174455SRajkumar Manoharan 	cmd->ev_bitmap = __cpu_to_le32(ev_bitmap);
7941d7579d12SMichal Kazior 
7942d7579d12SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
7943d7579d12SMichal Kazior 		   ev_bitmap);
7944d7579d12SMichal Kazior 	return skb;
794590174455SRajkumar Manoharan }
794690174455SRajkumar Manoharan 
7947d7579d12SMichal Kazior static struct sk_buff *
7948d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar)
794990174455SRajkumar Manoharan {
795090174455SRajkumar Manoharan 	struct sk_buff *skb;
795190174455SRajkumar Manoharan 
795290174455SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, 0);
795390174455SRajkumar Manoharan 	if (!skb)
7954d7579d12SMichal Kazior 		return ERR_PTR(-ENOMEM);
795590174455SRajkumar Manoharan 
795690174455SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
7957d7579d12SMichal Kazior 	return skb;
795890174455SRajkumar Manoharan }
795990174455SRajkumar Manoharan 
7960ffdd738dSRajkumar Manoharan static struct sk_buff *
7961ffdd738dSRajkumar Manoharan ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period,
7962ffdd738dSRajkumar Manoharan 				      u32 duration, u32 next_offset,
7963ffdd738dSRajkumar Manoharan 				      u32 enabled)
7964ffdd738dSRajkumar Manoharan {
7965ffdd738dSRajkumar Manoharan 	struct wmi_pdev_set_quiet_cmd *cmd;
7966ffdd738dSRajkumar Manoharan 	struct sk_buff *skb;
7967ffdd738dSRajkumar Manoharan 
7968ffdd738dSRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7969ffdd738dSRajkumar Manoharan 	if (!skb)
7970ffdd738dSRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
7971ffdd738dSRajkumar Manoharan 
7972ffdd738dSRajkumar Manoharan 	cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data;
7973ffdd738dSRajkumar Manoharan 	cmd->period = __cpu_to_le32(period);
7974ffdd738dSRajkumar Manoharan 	cmd->duration = __cpu_to_le32(duration);
7975ffdd738dSRajkumar Manoharan 	cmd->next_start = __cpu_to_le32(next_offset);
7976ffdd738dSRajkumar Manoharan 	cmd->enabled = __cpu_to_le32(enabled);
7977ffdd738dSRajkumar Manoharan 
7978ffdd738dSRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
7979ffdd738dSRajkumar Manoharan 		   "wmi quiet param: period %u duration %u enabled %d\n",
7980ffdd738dSRajkumar Manoharan 		   period, duration, enabled);
7981ffdd738dSRajkumar Manoharan 	return skb;
7982ffdd738dSRajkumar Manoharan }
7983ffdd738dSRajkumar Manoharan 
7984dc8ab278SRajkumar Manoharan static struct sk_buff *
7985dc8ab278SRajkumar Manoharan ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id,
7986dc8ab278SRajkumar Manoharan 				   const u8 *mac)
7987dc8ab278SRajkumar Manoharan {
7988dc8ab278SRajkumar Manoharan 	struct wmi_addba_clear_resp_cmd *cmd;
7989dc8ab278SRajkumar Manoharan 	struct sk_buff *skb;
7990dc8ab278SRajkumar Manoharan 
7991dc8ab278SRajkumar Manoharan 	if (!mac)
7992dc8ab278SRajkumar Manoharan 		return ERR_PTR(-EINVAL);
7993dc8ab278SRajkumar Manoharan 
7994dc8ab278SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7995dc8ab278SRajkumar Manoharan 	if (!skb)
7996dc8ab278SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
7997dc8ab278SRajkumar Manoharan 
7998dc8ab278SRajkumar Manoharan 	cmd = (struct wmi_addba_clear_resp_cmd *)skb->data;
7999dc8ab278SRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
8000dc8ab278SRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
8001dc8ab278SRajkumar Manoharan 
8002dc8ab278SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
8003dc8ab278SRajkumar Manoharan 		   "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n",
8004dc8ab278SRajkumar Manoharan 		   vdev_id, mac);
8005dc8ab278SRajkumar Manoharan 	return skb;
8006dc8ab278SRajkumar Manoharan }
8007dc8ab278SRajkumar Manoharan 
800865c0893dSRajkumar Manoharan static struct sk_buff *
800965c0893dSRajkumar Manoharan ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
801065c0893dSRajkumar Manoharan 			     u32 tid, u32 buf_size)
801165c0893dSRajkumar Manoharan {
801265c0893dSRajkumar Manoharan 	struct wmi_addba_send_cmd *cmd;
801365c0893dSRajkumar Manoharan 	struct sk_buff *skb;
801465c0893dSRajkumar Manoharan 
801565c0893dSRajkumar Manoharan 	if (!mac)
801665c0893dSRajkumar Manoharan 		return ERR_PTR(-EINVAL);
801765c0893dSRajkumar Manoharan 
801865c0893dSRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
801965c0893dSRajkumar Manoharan 	if (!skb)
802065c0893dSRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
802165c0893dSRajkumar Manoharan 
802265c0893dSRajkumar Manoharan 	cmd = (struct wmi_addba_send_cmd *)skb->data;
802365c0893dSRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
802465c0893dSRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
802565c0893dSRajkumar Manoharan 	cmd->tid = __cpu_to_le32(tid);
802665c0893dSRajkumar Manoharan 	cmd->buffersize = __cpu_to_le32(buf_size);
802765c0893dSRajkumar Manoharan 
802865c0893dSRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
802965c0893dSRajkumar Manoharan 		   "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n",
803065c0893dSRajkumar Manoharan 		   vdev_id, mac, tid, buf_size);
803165c0893dSRajkumar Manoharan 	return skb;
803265c0893dSRajkumar Manoharan }
803365c0893dSRajkumar Manoharan 
803411597413SRajkumar Manoharan static struct sk_buff *
803511597413SRajkumar Manoharan ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
803611597413SRajkumar Manoharan 				 u32 tid, u32 status)
803711597413SRajkumar Manoharan {
803811597413SRajkumar Manoharan 	struct wmi_addba_setresponse_cmd *cmd;
803911597413SRajkumar Manoharan 	struct sk_buff *skb;
804011597413SRajkumar Manoharan 
804111597413SRajkumar Manoharan 	if (!mac)
804211597413SRajkumar Manoharan 		return ERR_PTR(-EINVAL);
804311597413SRajkumar Manoharan 
804411597413SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
804511597413SRajkumar Manoharan 	if (!skb)
804611597413SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
804711597413SRajkumar Manoharan 
804811597413SRajkumar Manoharan 	cmd = (struct wmi_addba_setresponse_cmd *)skb->data;
804911597413SRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
805011597413SRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
805111597413SRajkumar Manoharan 	cmd->tid = __cpu_to_le32(tid);
805211597413SRajkumar Manoharan 	cmd->statuscode = __cpu_to_le32(status);
805311597413SRajkumar Manoharan 
805411597413SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
805511597413SRajkumar Manoharan 		   "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n",
805611597413SRajkumar Manoharan 		   vdev_id, mac, tid, status);
805711597413SRajkumar Manoharan 	return skb;
805811597413SRajkumar Manoharan }
805911597413SRajkumar Manoharan 
806050abef85SRajkumar Manoharan static struct sk_buff *
806150abef85SRajkumar Manoharan ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
806250abef85SRajkumar Manoharan 			     u32 tid, u32 initiator, u32 reason)
806350abef85SRajkumar Manoharan {
806450abef85SRajkumar Manoharan 	struct wmi_delba_send_cmd *cmd;
806550abef85SRajkumar Manoharan 	struct sk_buff *skb;
806650abef85SRajkumar Manoharan 
806750abef85SRajkumar Manoharan 	if (!mac)
806850abef85SRajkumar Manoharan 		return ERR_PTR(-EINVAL);
806950abef85SRajkumar Manoharan 
807050abef85SRajkumar Manoharan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
807150abef85SRajkumar Manoharan 	if (!skb)
807250abef85SRajkumar Manoharan 		return ERR_PTR(-ENOMEM);
807350abef85SRajkumar Manoharan 
807450abef85SRajkumar Manoharan 	cmd = (struct wmi_delba_send_cmd *)skb->data;
807550abef85SRajkumar Manoharan 	cmd->vdev_id = __cpu_to_le32(vdev_id);
807650abef85SRajkumar Manoharan 	ether_addr_copy(cmd->peer_macaddr.addr, mac);
807750abef85SRajkumar Manoharan 	cmd->tid = __cpu_to_le32(tid);
807850abef85SRajkumar Manoharan 	cmd->initiator = __cpu_to_le32(initiator);
807950abef85SRajkumar Manoharan 	cmd->reasoncode = __cpu_to_le32(reason);
808050abef85SRajkumar Manoharan 
808150abef85SRajkumar Manoharan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
808250abef85SRajkumar Manoharan 		   "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n",
808350abef85SRajkumar Manoharan 		   vdev_id, mac, tid, initiator, reason);
808450abef85SRajkumar Manoharan 	return skb;
808550abef85SRajkumar Manoharan }
808650abef85SRajkumar Manoharan 
808729542666SMaharaja Kennadyrajan static struct sk_buff *
808829542666SMaharaja Kennadyrajan ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param)
808929542666SMaharaja Kennadyrajan {
809029542666SMaharaja Kennadyrajan 	struct wmi_pdev_get_tpc_config_cmd *cmd;
809129542666SMaharaja Kennadyrajan 	struct sk_buff *skb;
809229542666SMaharaja Kennadyrajan 
809329542666SMaharaja Kennadyrajan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
809429542666SMaharaja Kennadyrajan 	if (!skb)
809529542666SMaharaja Kennadyrajan 		return ERR_PTR(-ENOMEM);
809629542666SMaharaja Kennadyrajan 
809729542666SMaharaja Kennadyrajan 	cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data;
809829542666SMaharaja Kennadyrajan 	cmd->param = __cpu_to_le32(param);
809929542666SMaharaja Kennadyrajan 
810029542666SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
8101b022ca25SMaharaja Kennadyrajan 		   "wmi pdev get tpc config param %d\n", param);
810229542666SMaharaja Kennadyrajan 	return skb;
810329542666SMaharaja Kennadyrajan }
810429542666SMaharaja Kennadyrajan 
8105bc6f9ae6SManikanta Pubbisetty size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head)
8106bc6f9ae6SManikanta Pubbisetty {
8107bc6f9ae6SManikanta Pubbisetty 	struct ath10k_fw_stats_peer *i;
8108bc6f9ae6SManikanta Pubbisetty 	size_t num = 0;
8109bc6f9ae6SManikanta Pubbisetty 
8110bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(i, head, list)
8111bc6f9ae6SManikanta Pubbisetty 		++num;
8112bc6f9ae6SManikanta Pubbisetty 
8113bc6f9ae6SManikanta Pubbisetty 	return num;
8114bc6f9ae6SManikanta Pubbisetty }
8115bc6f9ae6SManikanta Pubbisetty 
8116bc6f9ae6SManikanta Pubbisetty size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head)
8117bc6f9ae6SManikanta Pubbisetty {
8118bc6f9ae6SManikanta Pubbisetty 	struct ath10k_fw_stats_vdev *i;
8119bc6f9ae6SManikanta Pubbisetty 	size_t num = 0;
8120bc6f9ae6SManikanta Pubbisetty 
8121bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(i, head, list)
8122bc6f9ae6SManikanta Pubbisetty 		++num;
8123bc6f9ae6SManikanta Pubbisetty 
8124bc6f9ae6SManikanta Pubbisetty 	return num;
8125bc6f9ae6SManikanta Pubbisetty }
8126bc6f9ae6SManikanta Pubbisetty 
8127bc6f9ae6SManikanta Pubbisetty static void
8128bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8129bc6f9ae6SManikanta Pubbisetty 				   char *buf, u32 *length)
8130bc6f9ae6SManikanta Pubbisetty {
8131bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
8132bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8133bc6f9ae6SManikanta Pubbisetty 
8134bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8135bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n",
8136bc6f9ae6SManikanta Pubbisetty 			"ath10k PDEV stats");
8137bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8138bc6f9ae6SManikanta Pubbisetty 			"=================");
8139bc6f9ae6SManikanta Pubbisetty 
8140bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8141bc6f9ae6SManikanta Pubbisetty 			"Channel noise floor", pdev->ch_noise_floor);
8142bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8143bc6f9ae6SManikanta Pubbisetty 			"Channel TX power", pdev->chan_tx_power);
8144bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8145bc6f9ae6SManikanta Pubbisetty 			"TX frame count", pdev->tx_frame_count);
8146bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8147bc6f9ae6SManikanta Pubbisetty 			"RX frame count", pdev->rx_frame_count);
8148bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8149bc6f9ae6SManikanta Pubbisetty 			"RX clear count", pdev->rx_clear_count);
8150bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8151bc6f9ae6SManikanta Pubbisetty 			"Cycle count", pdev->cycle_count);
8152bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8153bc6f9ae6SManikanta Pubbisetty 			"PHY error count", pdev->phy_err_count);
8154bc6f9ae6SManikanta Pubbisetty 
8155bc6f9ae6SManikanta Pubbisetty 	*length = len;
8156bc6f9ae6SManikanta Pubbisetty }
8157bc6f9ae6SManikanta Pubbisetty 
8158bc6f9ae6SManikanta Pubbisetty static void
8159bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8160bc6f9ae6SManikanta Pubbisetty 				    char *buf, u32 *length)
8161bc6f9ae6SManikanta Pubbisetty {
8162bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
8163bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8164bc6f9ae6SManikanta Pubbisetty 
8165bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8166bc6f9ae6SManikanta Pubbisetty 			"RTS bad count", pdev->rts_bad);
8167bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8168bc6f9ae6SManikanta Pubbisetty 			"RTS good count", pdev->rts_good);
8169bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8170bc6f9ae6SManikanta Pubbisetty 			"FCS bad count", pdev->fcs_bad);
8171bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8172bc6f9ae6SManikanta Pubbisetty 			"No beacon count", pdev->no_beacons);
8173bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
8174bc6f9ae6SManikanta Pubbisetty 			"MIB int count", pdev->mib_int_count);
8175bc6f9ae6SManikanta Pubbisetty 
8176bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8177bc6f9ae6SManikanta Pubbisetty 	*length = len;
8178bc6f9ae6SManikanta Pubbisetty }
8179bc6f9ae6SManikanta Pubbisetty 
8180bc6f9ae6SManikanta Pubbisetty static void
8181bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8182bc6f9ae6SManikanta Pubbisetty 				 char *buf, u32 *length)
8183bc6f9ae6SManikanta Pubbisetty {
8184bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
8185bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8186bc6f9ae6SManikanta Pubbisetty 
8187bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
8188bc6f9ae6SManikanta Pubbisetty 			 "ath10k PDEV TX stats");
8189bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8190bc6f9ae6SManikanta Pubbisetty 				 "=================");
8191bc6f9ae6SManikanta Pubbisetty 
8192bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8193bc6f9ae6SManikanta Pubbisetty 			 "HTT cookies queued", pdev->comp_queued);
8194bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8195bc6f9ae6SManikanta Pubbisetty 			 "HTT cookies disp.", pdev->comp_delivered);
8196bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8197bc6f9ae6SManikanta Pubbisetty 			 "MSDU queued", pdev->msdu_enqued);
8198bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8199bc6f9ae6SManikanta Pubbisetty 			 "MPDU queued", pdev->mpdu_enqued);
8200bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8201bc6f9ae6SManikanta Pubbisetty 			 "MSDUs dropped", pdev->wmm_drop);
8202bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8203bc6f9ae6SManikanta Pubbisetty 			 "Local enqued", pdev->local_enqued);
8204bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8205bc6f9ae6SManikanta Pubbisetty 			 "Local freed", pdev->local_freed);
8206bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8207bc6f9ae6SManikanta Pubbisetty 			 "HW queued", pdev->hw_queued);
8208bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8209bc6f9ae6SManikanta Pubbisetty 			 "PPDUs reaped", pdev->hw_reaped);
8210bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8211bc6f9ae6SManikanta Pubbisetty 			 "Num underruns", pdev->underrun);
8212bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8213bc6f9ae6SManikanta Pubbisetty 			 "PPDUs cleaned", pdev->tx_abort);
8214bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8215bc6f9ae6SManikanta Pubbisetty 			 "MPDUs requed", pdev->mpdus_requed);
8216bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8217bc6f9ae6SManikanta Pubbisetty 			 "Excessive retries", pdev->tx_ko);
8218bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8219bc6f9ae6SManikanta Pubbisetty 			 "HW rate", pdev->data_rc);
8220bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
82216ce36faeSColin Ian King 			 "Sched self triggers", pdev->self_triggers);
8222bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8223bc6f9ae6SManikanta Pubbisetty 			 "Dropped due to SW retries",
8224bc6f9ae6SManikanta Pubbisetty 			 pdev->sw_retry_failure);
8225bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8226bc6f9ae6SManikanta Pubbisetty 			 "Illegal rate phy errors",
8227bc6f9ae6SManikanta Pubbisetty 			 pdev->illgl_rate_phy_err);
8228bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8229bc6f9ae6SManikanta Pubbisetty 			 "Pdev continuous xretry", pdev->pdev_cont_xretry);
8230bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8231bc6f9ae6SManikanta Pubbisetty 			 "TX timeout", pdev->pdev_tx_timeout);
8232bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8233bc6f9ae6SManikanta Pubbisetty 			 "PDEV resets", pdev->pdev_resets);
8234bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8235bc6f9ae6SManikanta Pubbisetty 			 "PHY underrun", pdev->phy_underrun);
8236bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8237bc6f9ae6SManikanta Pubbisetty 			 "MPDU is more than txop limit", pdev->txop_ovf);
8238bc6f9ae6SManikanta Pubbisetty 	*length = len;
8239bc6f9ae6SManikanta Pubbisetty }
8240bc6f9ae6SManikanta Pubbisetty 
8241bc6f9ae6SManikanta Pubbisetty static void
8242bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
8243bc6f9ae6SManikanta Pubbisetty 				 char *buf, u32 *length)
8244bc6f9ae6SManikanta Pubbisetty {
8245bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
8246bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8247bc6f9ae6SManikanta Pubbisetty 
8248bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
8249bc6f9ae6SManikanta Pubbisetty 			 "ath10k PDEV RX stats");
8250bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8251bc6f9ae6SManikanta Pubbisetty 				 "=================");
8252bc6f9ae6SManikanta Pubbisetty 
8253bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8254bc6f9ae6SManikanta Pubbisetty 			 "Mid PPDU route change",
8255bc6f9ae6SManikanta Pubbisetty 			 pdev->mid_ppdu_route_change);
8256bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8257bc6f9ae6SManikanta Pubbisetty 			 "Tot. number of statuses", pdev->status_rcvd);
8258bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8259bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 0", pdev->r0_frags);
8260bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8261bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 1", pdev->r1_frags);
8262bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8263bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 2", pdev->r2_frags);
8264bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8265bc6f9ae6SManikanta Pubbisetty 			 "Extra frags on rings 3", pdev->r3_frags);
8266bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8267bc6f9ae6SManikanta Pubbisetty 			 "MSDUs delivered to HTT", pdev->htt_msdus);
8268bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8269bc6f9ae6SManikanta Pubbisetty 			 "MPDUs delivered to HTT", pdev->htt_mpdus);
8270bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8271bc6f9ae6SManikanta Pubbisetty 			 "MSDUs delivered to stack", pdev->loc_msdus);
8272bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8273bc6f9ae6SManikanta Pubbisetty 			 "MPDUs delivered to stack", pdev->loc_mpdus);
8274bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8275bc6f9ae6SManikanta Pubbisetty 			 "Oversized AMSUs", pdev->oversize_amsdu);
8276bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8277bc6f9ae6SManikanta Pubbisetty 			 "PHY errors", pdev->phy_errs);
8278bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8279bc6f9ae6SManikanta Pubbisetty 			 "PHY errors drops", pdev->phy_err_drop);
8280bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8281bc6f9ae6SManikanta Pubbisetty 			 "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs);
8282bc6f9ae6SManikanta Pubbisetty 	*length = len;
8283bc6f9ae6SManikanta Pubbisetty }
8284bc6f9ae6SManikanta Pubbisetty 
8285bc6f9ae6SManikanta Pubbisetty static void
8286bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev,
8287bc6f9ae6SManikanta Pubbisetty 			      char *buf, u32 *length)
8288bc6f9ae6SManikanta Pubbisetty {
8289bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
8290bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8291bc6f9ae6SManikanta Pubbisetty 	int i;
8292bc6f9ae6SManikanta Pubbisetty 
8293bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8294bc6f9ae6SManikanta Pubbisetty 			"vdev id", vdev->vdev_id);
8295bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8296bc6f9ae6SManikanta Pubbisetty 			"beacon snr", vdev->beacon_snr);
8297bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8298bc6f9ae6SManikanta Pubbisetty 			"data snr", vdev->data_snr);
8299bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8300bc6f9ae6SManikanta Pubbisetty 			"num rx frames", vdev->num_rx_frames);
8301bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8302bc6f9ae6SManikanta Pubbisetty 			"num rts fail", vdev->num_rts_fail);
8303bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8304bc6f9ae6SManikanta Pubbisetty 			"num rts success", vdev->num_rts_success);
8305bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8306bc6f9ae6SManikanta Pubbisetty 			"num rx err", vdev->num_rx_err);
8307bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8308bc6f9ae6SManikanta Pubbisetty 			"num rx discard", vdev->num_rx_discard);
8309bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8310bc6f9ae6SManikanta Pubbisetty 			"num tx not acked", vdev->num_tx_not_acked);
8311bc6f9ae6SManikanta Pubbisetty 
8312bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++)
8313bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
8314bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
8315bc6f9ae6SManikanta Pubbisetty 				"num tx frames", i,
8316bc6f9ae6SManikanta Pubbisetty 				vdev->num_tx_frames[i]);
8317bc6f9ae6SManikanta Pubbisetty 
8318bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++)
8319bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
8320bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
8321bc6f9ae6SManikanta Pubbisetty 				"num tx frames retries", i,
8322bc6f9ae6SManikanta Pubbisetty 				vdev->num_tx_frames_retries[i]);
8323bc6f9ae6SManikanta Pubbisetty 
8324bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++)
8325bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
8326bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
8327bc6f9ae6SManikanta Pubbisetty 				"num tx frames failures", i,
8328bc6f9ae6SManikanta Pubbisetty 				vdev->num_tx_frames_failures[i]);
8329bc6f9ae6SManikanta Pubbisetty 
8330bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++)
8331bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
8332bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] 0x%08x\n",
8333bc6f9ae6SManikanta Pubbisetty 				"tx rate history", i,
8334bc6f9ae6SManikanta Pubbisetty 				vdev->tx_rate_history[i]);
8335bc6f9ae6SManikanta Pubbisetty 
8336bc6f9ae6SManikanta Pubbisetty 	for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++)
8337bc6f9ae6SManikanta Pubbisetty 		len += scnprintf(buf + len, buf_len - len,
8338bc6f9ae6SManikanta Pubbisetty 				"%25s [%02d] %u\n",
8339bc6f9ae6SManikanta Pubbisetty 				"beacon rssi history", i,
8340bc6f9ae6SManikanta Pubbisetty 				vdev->beacon_rssi_history[i]);
8341bc6f9ae6SManikanta Pubbisetty 
8342bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8343bc6f9ae6SManikanta Pubbisetty 	*length = len;
8344bc6f9ae6SManikanta Pubbisetty }
8345bc6f9ae6SManikanta Pubbisetty 
8346bc6f9ae6SManikanta Pubbisetty static void
8347bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer,
83485c51875cSBalaji Pothunoori 			      char *buf, u32 *length, bool extended_peer)
8349bc6f9ae6SManikanta Pubbisetty {
8350bc6f9ae6SManikanta Pubbisetty 	u32 len = *length;
8351bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8352bc6f9ae6SManikanta Pubbisetty 
8353bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
8354bc6f9ae6SManikanta Pubbisetty 			"Peer MAC address", peer->peer_macaddr);
8355bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8356bc6f9ae6SManikanta Pubbisetty 			"Peer RSSI", peer->peer_rssi);
8357bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8358bc6f9ae6SManikanta Pubbisetty 			"Peer TX rate", peer->peer_tx_rate);
8359bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8360bc6f9ae6SManikanta Pubbisetty 			"Peer RX rate", peer->peer_rx_rate);
83615c51875cSBalaji Pothunoori 	if (!extended_peer)
8362f40a307eSSurabhi Vishnoi 		len += scnprintf(buf + len, buf_len - len, "%30s %llu\n",
8363de46c015SMohammed Shafi Shajakhan 				"Peer RX duration", peer->rx_duration);
8364de46c015SMohammed Shafi Shajakhan 
8365bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8366bc6f9ae6SManikanta Pubbisetty 	*length = len;
8367bc6f9ae6SManikanta Pubbisetty }
8368bc6f9ae6SManikanta Pubbisetty 
83695c51875cSBalaji Pothunoori static void
83705c51875cSBalaji Pothunoori ath10k_wmi_fw_extd_peer_stats_fill(const struct ath10k_fw_extd_stats_peer *peer,
83715c51875cSBalaji Pothunoori 				   char *buf, u32 *length)
83725c51875cSBalaji Pothunoori {
83735c51875cSBalaji Pothunoori 	u32 len = *length;
83745c51875cSBalaji Pothunoori 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
83755c51875cSBalaji Pothunoori 
83765c51875cSBalaji Pothunoori 	len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
83775c51875cSBalaji Pothunoori 			"Peer MAC address", peer->peer_macaddr);
83785c51875cSBalaji Pothunoori 	len += scnprintf(buf + len, buf_len - len, "%30s %llu\n",
83795c51875cSBalaji Pothunoori 			"Peer RX duration", peer->rx_duration);
83805c51875cSBalaji Pothunoori }
83815c51875cSBalaji Pothunoori 
8382bc6f9ae6SManikanta Pubbisetty void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar,
8383bc6f9ae6SManikanta Pubbisetty 				      struct ath10k_fw_stats *fw_stats,
8384bc6f9ae6SManikanta Pubbisetty 				      char *buf)
8385bc6f9ae6SManikanta Pubbisetty {
8386bc6f9ae6SManikanta Pubbisetty 	u32 len = 0;
8387bc6f9ae6SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8388bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_pdev *pdev;
8389bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_vdev *vdev;
8390bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_peer *peer;
8391bc6f9ae6SManikanta Pubbisetty 	size_t num_peers;
8392bc6f9ae6SManikanta Pubbisetty 	size_t num_vdevs;
8393bc6f9ae6SManikanta Pubbisetty 
8394bc6f9ae6SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
8395bc6f9ae6SManikanta Pubbisetty 
8396bc6f9ae6SManikanta Pubbisetty 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
8397bc6f9ae6SManikanta Pubbisetty 					struct ath10k_fw_stats_pdev, list);
8398bc6f9ae6SManikanta Pubbisetty 	if (!pdev) {
8399bc6f9ae6SManikanta Pubbisetty 		ath10k_warn(ar, "failed to get pdev stats\n");
8400bc6f9ae6SManikanta Pubbisetty 		goto unlock;
8401bc6f9ae6SManikanta Pubbisetty 	}
8402bc6f9ae6SManikanta Pubbisetty 
8403bc6f9ae6SManikanta Pubbisetty 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8404bc6f9ae6SManikanta Pubbisetty 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8405bc6f9ae6SManikanta Pubbisetty 
8406bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8407bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8408bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8409bc6f9ae6SManikanta Pubbisetty 
8410bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8411bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8412bc6f9ae6SManikanta Pubbisetty 			 "ath10k VDEV stats", num_vdevs);
8413bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8414bc6f9ae6SManikanta Pubbisetty 				 "=================");
8415bc6f9ae6SManikanta Pubbisetty 
8416bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8417bc6f9ae6SManikanta Pubbisetty 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
8418bc6f9ae6SManikanta Pubbisetty 	}
8419bc6f9ae6SManikanta Pubbisetty 
8420bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8421bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8422bc6f9ae6SManikanta Pubbisetty 			 "ath10k PEER stats", num_peers);
8423bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8424bc6f9ae6SManikanta Pubbisetty 				 "=================");
8425bc6f9ae6SManikanta Pubbisetty 
8426bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(peer, &fw_stats->peers, list) {
84275c51875cSBalaji Pothunoori 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len,
84285c51875cSBalaji Pothunoori 					      fw_stats->extended);
8429bc6f9ae6SManikanta Pubbisetty 	}
8430bc6f9ae6SManikanta Pubbisetty 
8431bc6f9ae6SManikanta Pubbisetty unlock:
8432bc6f9ae6SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
8433bc6f9ae6SManikanta Pubbisetty 
8434bc6f9ae6SManikanta Pubbisetty 	if (len >= buf_len)
8435bc6f9ae6SManikanta Pubbisetty 		buf[len - 1] = 0;
8436bc6f9ae6SManikanta Pubbisetty 	else
8437bc6f9ae6SManikanta Pubbisetty 		buf[len] = 0;
8438bc6f9ae6SManikanta Pubbisetty }
8439bc6f9ae6SManikanta Pubbisetty 
8440bc6f9ae6SManikanta Pubbisetty void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar,
8441bc6f9ae6SManikanta Pubbisetty 				     struct ath10k_fw_stats *fw_stats,
8442bc6f9ae6SManikanta Pubbisetty 				     char *buf)
8443bc6f9ae6SManikanta Pubbisetty {
8444bc6f9ae6SManikanta Pubbisetty 	unsigned int len = 0;
8445bc6f9ae6SManikanta Pubbisetty 	unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
8446bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_pdev *pdev;
8447bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_vdev *vdev;
8448bc6f9ae6SManikanta Pubbisetty 	const struct ath10k_fw_stats_peer *peer;
8449bc6f9ae6SManikanta Pubbisetty 	size_t num_peers;
8450bc6f9ae6SManikanta Pubbisetty 	size_t num_vdevs;
8451bc6f9ae6SManikanta Pubbisetty 
8452bc6f9ae6SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
8453bc6f9ae6SManikanta Pubbisetty 
8454bc6f9ae6SManikanta Pubbisetty 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
8455bc6f9ae6SManikanta Pubbisetty 					struct ath10k_fw_stats_pdev, list);
8456bc6f9ae6SManikanta Pubbisetty 	if (!pdev) {
8457bc6f9ae6SManikanta Pubbisetty 		ath10k_warn(ar, "failed to get pdev stats\n");
8458bc6f9ae6SManikanta Pubbisetty 		goto unlock;
8459bc6f9ae6SManikanta Pubbisetty 	}
8460bc6f9ae6SManikanta Pubbisetty 
8461bc6f9ae6SManikanta Pubbisetty 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8462bc6f9ae6SManikanta Pubbisetty 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8463bc6f9ae6SManikanta Pubbisetty 
8464bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8465bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
8466bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8467bc6f9ae6SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8468bc6f9ae6SManikanta Pubbisetty 
8469bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8470bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8471bc6f9ae6SManikanta Pubbisetty 			 "ath10k VDEV stats", num_vdevs);
8472bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8473bc6f9ae6SManikanta Pubbisetty 				 "=================");
8474bc6f9ae6SManikanta Pubbisetty 
8475bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8476bc6f9ae6SManikanta Pubbisetty 		ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
8477bc6f9ae6SManikanta Pubbisetty 	}
8478bc6f9ae6SManikanta Pubbisetty 
8479bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
8480bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8481bc6f9ae6SManikanta Pubbisetty 			 "ath10k PEER stats", num_peers);
8482bc6f9ae6SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8483bc6f9ae6SManikanta Pubbisetty 				 "=================");
8484bc6f9ae6SManikanta Pubbisetty 
8485bc6f9ae6SManikanta Pubbisetty 	list_for_each_entry(peer, &fw_stats->peers, list) {
84865c51875cSBalaji Pothunoori 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len,
84875c51875cSBalaji Pothunoori 					      fw_stats->extended);
8488bc6f9ae6SManikanta Pubbisetty 	}
8489bc6f9ae6SManikanta Pubbisetty 
8490bc6f9ae6SManikanta Pubbisetty unlock:
8491bc6f9ae6SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
8492bc6f9ae6SManikanta Pubbisetty 
8493bc6f9ae6SManikanta Pubbisetty 	if (len >= buf_len)
8494bc6f9ae6SManikanta Pubbisetty 		buf[len - 1] = 0;
8495bc6f9ae6SManikanta Pubbisetty 	else
8496bc6f9ae6SManikanta Pubbisetty 		buf[len] = 0;
8497bc6f9ae6SManikanta Pubbisetty }
8498bc6f9ae6SManikanta Pubbisetty 
849962f77f09SMaharaja static struct sk_buff *
850062f77f09SMaharaja ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
850162f77f09SMaharaja 					   u32 detect_level, u32 detect_margin)
850262f77f09SMaharaja {
850362f77f09SMaharaja 	struct wmi_pdev_set_adaptive_cca_params *cmd;
850462f77f09SMaharaja 	struct sk_buff *skb;
850562f77f09SMaharaja 
850662f77f09SMaharaja 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
850762f77f09SMaharaja 	if (!skb)
850862f77f09SMaharaja 		return ERR_PTR(-ENOMEM);
850962f77f09SMaharaja 
851062f77f09SMaharaja 	cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data;
851162f77f09SMaharaja 	cmd->enable = __cpu_to_le32(enable);
851262f77f09SMaharaja 	cmd->cca_detect_level = __cpu_to_le32(detect_level);
851362f77f09SMaharaja 	cmd->cca_detect_margin = __cpu_to_le32(detect_margin);
851462f77f09SMaharaja 
851562f77f09SMaharaja 	ath10k_dbg(ar, ATH10K_DBG_WMI,
851662f77f09SMaharaja 		   "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
851762f77f09SMaharaja 		   enable, detect_level, detect_margin);
851862f77f09SMaharaja 	return skb;
851962f77f09SMaharaja }
852062f77f09SMaharaja 
85211b3fdb50SRajkumar Manoharan static void
85221b3fdb50SRajkumar Manoharan ath10k_wmi_fw_vdev_stats_extd_fill(const struct ath10k_fw_stats_vdev_extd *vdev,
85231b3fdb50SRajkumar Manoharan 				   char *buf, u32 *length)
85241b3fdb50SRajkumar Manoharan {
85251b3fdb50SRajkumar Manoharan 	u32 len = *length;
85261b3fdb50SRajkumar Manoharan 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
85271b3fdb50SRajkumar Manoharan 	u32 val;
85281b3fdb50SRajkumar Manoharan 
85291b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85301b3fdb50SRajkumar Manoharan 			 "vdev id", vdev->vdev_id);
85311b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85321b3fdb50SRajkumar Manoharan 			 "ppdu aggr count", vdev->ppdu_aggr_cnt);
85331b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85341b3fdb50SRajkumar Manoharan 			 "ppdu noack", vdev->ppdu_noack);
85351b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85361b3fdb50SRajkumar Manoharan 			 "mpdu queued", vdev->mpdu_queued);
85371b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85381b3fdb50SRajkumar Manoharan 			 "ppdu nonaggr count", vdev->ppdu_nonaggr_cnt);
85391b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85401b3fdb50SRajkumar Manoharan 			 "mpdu sw requeued", vdev->mpdu_sw_requeued);
85411b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85421b3fdb50SRajkumar Manoharan 			 "mpdu success retry", vdev->mpdu_suc_retry);
85431b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85441b3fdb50SRajkumar Manoharan 			 "mpdu success multitry", vdev->mpdu_suc_multitry);
85451b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85461b3fdb50SRajkumar Manoharan 			 "mpdu fail retry", vdev->mpdu_fail_retry);
85471b3fdb50SRajkumar Manoharan 	val = vdev->tx_ftm_suc;
85481b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85491b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85501b3fdb50SRajkumar Manoharan 				 "tx ftm success",
85511b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85521b3fdb50SRajkumar Manoharan 	val = vdev->tx_ftm_suc_retry;
85531b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85541b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85551b3fdb50SRajkumar Manoharan 				 "tx ftm success retry",
85561b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85571b3fdb50SRajkumar Manoharan 	val = vdev->tx_ftm_fail;
85581b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85591b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85601b3fdb50SRajkumar Manoharan 				 "tx ftm fail",
85611b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85621b3fdb50SRajkumar Manoharan 	val = vdev->rx_ftmr_cnt;
85631b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85641b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85651b3fdb50SRajkumar Manoharan 				 "rx ftm request count",
85661b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85671b3fdb50SRajkumar Manoharan 	val = vdev->rx_ftmr_dup_cnt;
85681b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85691b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85701b3fdb50SRajkumar Manoharan 				 "rx ftm request dup count",
85711b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85721b3fdb50SRajkumar Manoharan 	val = vdev->rx_iftmr_cnt;
85731b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85741b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85751b3fdb50SRajkumar Manoharan 				 "rx initial ftm req count",
85761b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85771b3fdb50SRajkumar Manoharan 	val = vdev->rx_iftmr_dup_cnt;
85781b3fdb50SRajkumar Manoharan 	if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
85791b3fdb50SRajkumar Manoharan 		len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
85801b3fdb50SRajkumar Manoharan 				 "rx initial ftm req dup cnt",
85811b3fdb50SRajkumar Manoharan 				 MS(val, WMI_VDEV_STATS_FTM_COUNT));
85821b3fdb50SRajkumar Manoharan 	len += scnprintf(buf + len, buf_len - len, "\n");
85831b3fdb50SRajkumar Manoharan 
85841b3fdb50SRajkumar Manoharan 	*length = len;
85851b3fdb50SRajkumar Manoharan }
85861b3fdb50SRajkumar Manoharan 
858798dd2b92SManikanta Pubbisetty void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar,
858898dd2b92SManikanta Pubbisetty 				      struct ath10k_fw_stats *fw_stats,
858998dd2b92SManikanta Pubbisetty 				      char *buf)
859098dd2b92SManikanta Pubbisetty {
859198dd2b92SManikanta Pubbisetty 	u32 len = 0;
859298dd2b92SManikanta Pubbisetty 	u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
859398dd2b92SManikanta Pubbisetty 	const struct ath10k_fw_stats_pdev *pdev;
85941b3fdb50SRajkumar Manoharan 	const struct ath10k_fw_stats_vdev_extd *vdev;
859598dd2b92SManikanta Pubbisetty 	const struct ath10k_fw_stats_peer *peer;
85965c51875cSBalaji Pothunoori 	const struct ath10k_fw_extd_stats_peer *extd_peer;
859798dd2b92SManikanta Pubbisetty 	size_t num_peers;
859898dd2b92SManikanta Pubbisetty 	size_t num_vdevs;
859998dd2b92SManikanta Pubbisetty 
860098dd2b92SManikanta Pubbisetty 	spin_lock_bh(&ar->data_lock);
860198dd2b92SManikanta Pubbisetty 
860298dd2b92SManikanta Pubbisetty 	pdev = list_first_entry_or_null(&fw_stats->pdevs,
860398dd2b92SManikanta Pubbisetty 					struct ath10k_fw_stats_pdev, list);
860498dd2b92SManikanta Pubbisetty 	if (!pdev) {
860598dd2b92SManikanta Pubbisetty 		ath10k_warn(ar, "failed to get pdev stats\n");
860698dd2b92SManikanta Pubbisetty 		goto unlock;
860798dd2b92SManikanta Pubbisetty 	}
860898dd2b92SManikanta Pubbisetty 
860998dd2b92SManikanta Pubbisetty 	num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
861098dd2b92SManikanta Pubbisetty 	num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
861198dd2b92SManikanta Pubbisetty 
861298dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
861398dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
861498dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
861598dd2b92SManikanta Pubbisetty 
861698dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
861798dd2b92SManikanta Pubbisetty 			"HW paused", pdev->hw_paused);
861898dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
861998dd2b92SManikanta Pubbisetty 			"Seqs posted", pdev->seq_posted);
862098dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
862198dd2b92SManikanta Pubbisetty 			"Seqs failed queueing", pdev->seq_failed_queueing);
862298dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
862398dd2b92SManikanta Pubbisetty 			"Seqs completed", pdev->seq_completed);
862498dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
862598dd2b92SManikanta Pubbisetty 			"Seqs restarted", pdev->seq_restarted);
862698dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
862798dd2b92SManikanta Pubbisetty 			"MU Seqs posted", pdev->mu_seq_posted);
862898dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
862998dd2b92SManikanta Pubbisetty 			"MPDUs SW flushed", pdev->mpdus_sw_flush);
863098dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
863198dd2b92SManikanta Pubbisetty 			"MPDUs HW filtered", pdev->mpdus_hw_filter);
863298dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
863398dd2b92SManikanta Pubbisetty 			"MPDUs truncated", pdev->mpdus_truncated);
863498dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
863598dd2b92SManikanta Pubbisetty 			"MPDUs receive no ACK", pdev->mpdus_ack_failed);
863698dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
863798dd2b92SManikanta Pubbisetty 			"MPDUs expired", pdev->mpdus_expired);
863898dd2b92SManikanta Pubbisetty 
863998dd2b92SManikanta Pubbisetty 	ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
864098dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
864198dd2b92SManikanta Pubbisetty 			"Num Rx Overflow errors", pdev->rx_ovfl_errs);
864298dd2b92SManikanta Pubbisetty 
864398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
864498dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
864598dd2b92SManikanta Pubbisetty 			"ath10k VDEV stats", num_vdevs);
864698dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
864798dd2b92SManikanta Pubbisetty 				"=================");
864898dd2b92SManikanta Pubbisetty 	list_for_each_entry(vdev, &fw_stats->vdevs, list) {
86491b3fdb50SRajkumar Manoharan 		ath10k_wmi_fw_vdev_stats_extd_fill(vdev, buf, &len);
865098dd2b92SManikanta Pubbisetty 	}
865198dd2b92SManikanta Pubbisetty 
865298dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "\n");
865398dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
865498dd2b92SManikanta Pubbisetty 			"ath10k PEER stats", num_peers);
865598dd2b92SManikanta Pubbisetty 	len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
865698dd2b92SManikanta Pubbisetty 				"=================");
865798dd2b92SManikanta Pubbisetty 
865898dd2b92SManikanta Pubbisetty 	list_for_each_entry(peer, &fw_stats->peers, list) {
86595c51875cSBalaji Pothunoori 		ath10k_wmi_fw_peer_stats_fill(peer, buf, &len,
86605c51875cSBalaji Pothunoori 					      fw_stats->extended);
86615c51875cSBalaji Pothunoori 	}
86625c51875cSBalaji Pothunoori 
86635c51875cSBalaji Pothunoori 	if (fw_stats->extended) {
86645c51875cSBalaji Pothunoori 		list_for_each_entry(extd_peer, &fw_stats->peers_extd, list) {
86655c51875cSBalaji Pothunoori 			ath10k_wmi_fw_extd_peer_stats_fill(extd_peer, buf,
86665c51875cSBalaji Pothunoori 							   &len);
86675c51875cSBalaji Pothunoori 		}
866898dd2b92SManikanta Pubbisetty 	}
866998dd2b92SManikanta Pubbisetty 
867098dd2b92SManikanta Pubbisetty unlock:
867198dd2b92SManikanta Pubbisetty 	spin_unlock_bh(&ar->data_lock);
867298dd2b92SManikanta Pubbisetty 
867398dd2b92SManikanta Pubbisetty 	if (len >= buf_len)
867498dd2b92SManikanta Pubbisetty 		buf[len - 1] = 0;
867598dd2b92SManikanta Pubbisetty 	else
867698dd2b92SManikanta Pubbisetty 		buf[len] = 0;
867798dd2b92SManikanta Pubbisetty }
867898dd2b92SManikanta Pubbisetty 
86796e4de1a4SPeter Oh int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar,
86806e4de1a4SPeter Oh 				   enum wmi_vdev_subtype subtype)
86816e4de1a4SPeter Oh {
86826e4de1a4SPeter Oh 	switch (subtype) {
86836e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_NONE:
86846e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_NONE;
86856e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_DEVICE:
86866e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV;
86876e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_CLIENT:
86886e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI;
86896e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_GO:
86906e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO;
86916e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_PROXY_STA:
86926e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA;
86936e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_11S:
86946e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_NON_11S:
86956e4de1a4SPeter Oh 		return -ENOTSUPP;
86966e4de1a4SPeter Oh 	}
86976e4de1a4SPeter Oh 	return -ENOTSUPP;
86986e4de1a4SPeter Oh }
86996e4de1a4SPeter Oh 
87006e4de1a4SPeter Oh static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar,
87016e4de1a4SPeter Oh 						 enum wmi_vdev_subtype subtype)
87026e4de1a4SPeter Oh {
87036e4de1a4SPeter Oh 	switch (subtype) {
87046e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_NONE:
87056e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_NONE;
87066e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_DEVICE:
87076e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV;
87086e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_CLIENT:
87096e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI;
87106e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_GO:
87116e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO;
87126e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_PROXY_STA:
87136e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA;
87146e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_11S:
87156e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S;
87166e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_NON_11S:
87176e4de1a4SPeter Oh 		return -ENOTSUPP;
87186e4de1a4SPeter Oh 	}
87196e4de1a4SPeter Oh 	return -ENOTSUPP;
87206e4de1a4SPeter Oh }
87216e4de1a4SPeter Oh 
87226e4de1a4SPeter Oh static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar,
87236e4de1a4SPeter Oh 					       enum wmi_vdev_subtype subtype)
87246e4de1a4SPeter Oh {
87256e4de1a4SPeter Oh 	switch (subtype) {
87266e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_NONE:
87276e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_NONE;
87286e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_DEVICE:
87296e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_P2P_DEV;
87306e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_CLIENT:
87316e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_P2P_CLI;
87326e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_P2P_GO:
87336e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_P2P_GO;
87346e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_PROXY_STA:
87356e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_PROXY_STA;
87366e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_11S:
87376e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_MESH_11S;
87386e4de1a4SPeter Oh 	case WMI_VDEV_SUBTYPE_MESH_NON_11S:
87396e4de1a4SPeter Oh 		return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S;
87406e4de1a4SPeter Oh 	}
87416e4de1a4SPeter Oh 	return -ENOTSUPP;
87426e4de1a4SPeter Oh }
87436e4de1a4SPeter Oh 
874447771902SRaja Mani static struct sk_buff *
874547771902SRaja Mani ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar,
874647771902SRaja Mani 				    enum wmi_host_platform_type type,
874747771902SRaja Mani 				    u32 fw_feature_bitmap)
874847771902SRaja Mani {
874947771902SRaja Mani 	struct wmi_ext_resource_config_10_4_cmd *cmd;
875047771902SRaja Mani 	struct sk_buff *skb;
8751add6cd8dSManikanta Pubbisetty 	u32 num_tdls_sleep_sta = 0;
875247771902SRaja Mani 
875347771902SRaja Mani 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
875447771902SRaja Mani 	if (!skb)
875547771902SRaja Mani 		return ERR_PTR(-ENOMEM);
875647771902SRaja Mani 
8757add6cd8dSManikanta Pubbisetty 	if (test_bit(WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, ar->wmi.svc_map))
8758add6cd8dSManikanta Pubbisetty 		num_tdls_sleep_sta = TARGET_10_4_NUM_TDLS_SLEEP_STA;
8759add6cd8dSManikanta Pubbisetty 
876047771902SRaja Mani 	cmd = (struct wmi_ext_resource_config_10_4_cmd *)skb->data;
876147771902SRaja Mani 	cmd->host_platform_config = __cpu_to_le32(type);
876247771902SRaja Mani 	cmd->fw_feature_bitmap = __cpu_to_le32(fw_feature_bitmap);
8763add6cd8dSManikanta Pubbisetty 	cmd->wlan_gpio_priority = __cpu_to_le32(-1);
8764add6cd8dSManikanta Pubbisetty 	cmd->coex_version = __cpu_to_le32(WMI_NO_COEX_VERSION_SUPPORT);
8765add6cd8dSManikanta Pubbisetty 	cmd->coex_gpio_pin1 = __cpu_to_le32(-1);
8766add6cd8dSManikanta Pubbisetty 	cmd->coex_gpio_pin2 = __cpu_to_le32(-1);
8767add6cd8dSManikanta Pubbisetty 	cmd->coex_gpio_pin3 = __cpu_to_le32(-1);
8768add6cd8dSManikanta Pubbisetty 	cmd->num_tdls_vdevs = __cpu_to_le32(TARGET_10_4_NUM_TDLS_VDEVS);
8769add6cd8dSManikanta Pubbisetty 	cmd->num_tdls_conn_table_entries = __cpu_to_le32(20);
8770add6cd8dSManikanta Pubbisetty 	cmd->max_tdls_concurrent_sleep_sta = __cpu_to_le32(num_tdls_sleep_sta);
8771add6cd8dSManikanta Pubbisetty 	cmd->max_tdls_concurrent_buffer_sta =
8772add6cd8dSManikanta Pubbisetty 			__cpu_to_le32(TARGET_10_4_NUM_TDLS_BUFFER_STA);
877347771902SRaja Mani 
877447771902SRaja Mani 	ath10k_dbg(ar, ATH10K_DBG_WMI,
877547771902SRaja Mani 		   "wmi ext resource config host type %d firmware feature bitmap %08x\n",
877647771902SRaja Mani 		   type, fw_feature_bitmap);
877747771902SRaja Mani 	return skb;
877847771902SRaja Mani }
877947771902SRaja Mani 
8780e25854f2SMichal Kazior static struct sk_buff *
8781add6cd8dSManikanta Pubbisetty ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
8782add6cd8dSManikanta Pubbisetty 					 enum wmi_tdls_state state)
8783add6cd8dSManikanta Pubbisetty {
8784add6cd8dSManikanta Pubbisetty 	struct wmi_10_4_tdls_set_state_cmd *cmd;
8785add6cd8dSManikanta Pubbisetty 	struct sk_buff *skb;
8786add6cd8dSManikanta Pubbisetty 	u32 options = 0;
8787add6cd8dSManikanta Pubbisetty 
8788add6cd8dSManikanta Pubbisetty 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8789add6cd8dSManikanta Pubbisetty 	if (!skb)
8790add6cd8dSManikanta Pubbisetty 		return ERR_PTR(-ENOMEM);
8791add6cd8dSManikanta Pubbisetty 
8792e5b6853eSAnilkumar Kolli 	if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) &&
8793e5b6853eSAnilkumar Kolli 	    state == WMI_TDLS_ENABLE_ACTIVE)
8794add6cd8dSManikanta Pubbisetty 		state = WMI_TDLS_ENABLE_PASSIVE;
8795add6cd8dSManikanta Pubbisetty 
8796add6cd8dSManikanta Pubbisetty 	if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
8797add6cd8dSManikanta Pubbisetty 		options |= WMI_TDLS_BUFFER_STA_EN;
8798add6cd8dSManikanta Pubbisetty 
8799add6cd8dSManikanta Pubbisetty 	cmd = (struct wmi_10_4_tdls_set_state_cmd *)skb->data;
8800add6cd8dSManikanta Pubbisetty 	cmd->vdev_id = __cpu_to_le32(vdev_id);
8801add6cd8dSManikanta Pubbisetty 	cmd->state = __cpu_to_le32(state);
8802add6cd8dSManikanta Pubbisetty 	cmd->notification_interval_ms = __cpu_to_le32(5000);
8803add6cd8dSManikanta Pubbisetty 	cmd->tx_discovery_threshold = __cpu_to_le32(100);
8804add6cd8dSManikanta Pubbisetty 	cmd->tx_teardown_threshold = __cpu_to_le32(5);
8805add6cd8dSManikanta Pubbisetty 	cmd->rssi_teardown_threshold = __cpu_to_le32(-75);
8806add6cd8dSManikanta Pubbisetty 	cmd->rssi_delta = __cpu_to_le32(-20);
8807add6cd8dSManikanta Pubbisetty 	cmd->tdls_options = __cpu_to_le32(options);
8808add6cd8dSManikanta Pubbisetty 	cmd->tdls_peer_traffic_ind_window = __cpu_to_le32(2);
8809add6cd8dSManikanta Pubbisetty 	cmd->tdls_peer_traffic_response_timeout_ms = __cpu_to_le32(5000);
8810add6cd8dSManikanta Pubbisetty 	cmd->tdls_puapsd_mask = __cpu_to_le32(0xf);
8811add6cd8dSManikanta Pubbisetty 	cmd->tdls_puapsd_inactivity_time_ms = __cpu_to_le32(0);
8812add6cd8dSManikanta Pubbisetty 	cmd->tdls_puapsd_rx_frame_threshold = __cpu_to_le32(10);
8813add6cd8dSManikanta Pubbisetty 	cmd->teardown_notification_ms = __cpu_to_le32(10);
8814add6cd8dSManikanta Pubbisetty 	cmd->tdls_peer_kickout_threshold = __cpu_to_le32(96);
8815add6cd8dSManikanta Pubbisetty 
8816add6cd8dSManikanta Pubbisetty 	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi update fw tdls state %d for vdev %i\n",
8817add6cd8dSManikanta Pubbisetty 		   state, vdev_id);
8818add6cd8dSManikanta Pubbisetty 	return skb;
8819add6cd8dSManikanta Pubbisetty }
8820add6cd8dSManikanta Pubbisetty 
8821add6cd8dSManikanta Pubbisetty static u32 ath10k_wmi_prepare_peer_qos(u8 uapsd_queues, u8 sp)
8822add6cd8dSManikanta Pubbisetty {
8823add6cd8dSManikanta Pubbisetty 	u32 peer_qos = 0;
8824add6cd8dSManikanta Pubbisetty 
8825add6cd8dSManikanta Pubbisetty 	if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
8826add6cd8dSManikanta Pubbisetty 		peer_qos |= WMI_TDLS_PEER_QOS_AC_VO;
8827add6cd8dSManikanta Pubbisetty 	if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
8828add6cd8dSManikanta Pubbisetty 		peer_qos |= WMI_TDLS_PEER_QOS_AC_VI;
8829add6cd8dSManikanta Pubbisetty 	if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
8830add6cd8dSManikanta Pubbisetty 		peer_qos |= WMI_TDLS_PEER_QOS_AC_BK;
8831add6cd8dSManikanta Pubbisetty 	if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
8832add6cd8dSManikanta Pubbisetty 		peer_qos |= WMI_TDLS_PEER_QOS_AC_BE;
8833add6cd8dSManikanta Pubbisetty 
8834add6cd8dSManikanta Pubbisetty 	peer_qos |= SM(sp, WMI_TDLS_PEER_SP);
8835add6cd8dSManikanta Pubbisetty 
8836add6cd8dSManikanta Pubbisetty 	return peer_qos;
8837add6cd8dSManikanta Pubbisetty }
8838add6cd8dSManikanta Pubbisetty 
8839add6cd8dSManikanta Pubbisetty static struct sk_buff *
8840bc64d052SMaharaja Kennadyrajan ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param)
8841bc64d052SMaharaja Kennadyrajan {
8842bc64d052SMaharaja Kennadyrajan 	struct wmi_pdev_get_tpc_table_cmd *cmd;
8843bc64d052SMaharaja Kennadyrajan 	struct sk_buff *skb;
8844bc64d052SMaharaja Kennadyrajan 
8845bc64d052SMaharaja Kennadyrajan 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8846bc64d052SMaharaja Kennadyrajan 	if (!skb)
8847bc64d052SMaharaja Kennadyrajan 		return ERR_PTR(-ENOMEM);
8848bc64d052SMaharaja Kennadyrajan 
8849bc64d052SMaharaja Kennadyrajan 	cmd = (struct wmi_pdev_get_tpc_table_cmd *)skb->data;
8850bc64d052SMaharaja Kennadyrajan 	cmd->param = __cpu_to_le32(param);
8851bc64d052SMaharaja Kennadyrajan 
8852bc64d052SMaharaja Kennadyrajan 	ath10k_dbg(ar, ATH10K_DBG_WMI,
8853bc64d052SMaharaja Kennadyrajan 		   "wmi pdev get tpc table param:%d\n", param);
8854bc64d052SMaharaja Kennadyrajan 	return skb;
8855bc64d052SMaharaja Kennadyrajan }
8856bc64d052SMaharaja Kennadyrajan 
8857bc64d052SMaharaja Kennadyrajan static struct sk_buff *
8858add6cd8dSManikanta Pubbisetty ath10k_wmi_10_4_gen_tdls_peer_update(struct ath10k *ar,
8859add6cd8dSManikanta Pubbisetty 				     const struct wmi_tdls_peer_update_cmd_arg *arg,
8860add6cd8dSManikanta Pubbisetty 				     const struct wmi_tdls_peer_capab_arg *cap,
8861add6cd8dSManikanta Pubbisetty 				     const struct wmi_channel_arg *chan_arg)
8862add6cd8dSManikanta Pubbisetty {
8863add6cd8dSManikanta Pubbisetty 	struct wmi_10_4_tdls_peer_update_cmd *cmd;
8864add6cd8dSManikanta Pubbisetty 	struct wmi_tdls_peer_capabilities *peer_cap;
8865add6cd8dSManikanta Pubbisetty 	struct wmi_channel *chan;
8866add6cd8dSManikanta Pubbisetty 	struct sk_buff *skb;
8867add6cd8dSManikanta Pubbisetty 	u32 peer_qos;
8868add6cd8dSManikanta Pubbisetty 	int len, chan_len;
8869add6cd8dSManikanta Pubbisetty 	int i;
8870add6cd8dSManikanta Pubbisetty 
8871add6cd8dSManikanta Pubbisetty 	/* tdls peer update cmd has place holder for one channel*/
8872add6cd8dSManikanta Pubbisetty 	chan_len = cap->peer_chan_len ? (cap->peer_chan_len - 1) : 0;
8873add6cd8dSManikanta Pubbisetty 
8874add6cd8dSManikanta Pubbisetty 	len = sizeof(*cmd) + chan_len * sizeof(*chan);
8875add6cd8dSManikanta Pubbisetty 
8876add6cd8dSManikanta Pubbisetty 	skb = ath10k_wmi_alloc_skb(ar, len);
8877add6cd8dSManikanta Pubbisetty 	if (!skb)
8878add6cd8dSManikanta Pubbisetty 		return ERR_PTR(-ENOMEM);
8879add6cd8dSManikanta Pubbisetty 
8880add6cd8dSManikanta Pubbisetty 	memset(skb->data, 0, sizeof(*cmd));
8881add6cd8dSManikanta Pubbisetty 
8882add6cd8dSManikanta Pubbisetty 	cmd = (struct wmi_10_4_tdls_peer_update_cmd *)skb->data;
8883add6cd8dSManikanta Pubbisetty 	cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
8884add6cd8dSManikanta Pubbisetty 	ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
8885add6cd8dSManikanta Pubbisetty 	cmd->peer_state = __cpu_to_le32(arg->peer_state);
8886add6cd8dSManikanta Pubbisetty 
8887add6cd8dSManikanta Pubbisetty 	peer_qos = ath10k_wmi_prepare_peer_qos(cap->peer_uapsd_queues,
8888add6cd8dSManikanta Pubbisetty 					       cap->peer_max_sp);
8889add6cd8dSManikanta Pubbisetty 
8890add6cd8dSManikanta Pubbisetty 	peer_cap = &cmd->peer_capab;
8891add6cd8dSManikanta Pubbisetty 	peer_cap->peer_qos = __cpu_to_le32(peer_qos);
8892add6cd8dSManikanta Pubbisetty 	peer_cap->buff_sta_support = __cpu_to_le32(cap->buff_sta_support);
8893add6cd8dSManikanta Pubbisetty 	peer_cap->off_chan_support = __cpu_to_le32(cap->off_chan_support);
8894add6cd8dSManikanta Pubbisetty 	peer_cap->peer_curr_operclass = __cpu_to_le32(cap->peer_curr_operclass);
8895add6cd8dSManikanta Pubbisetty 	peer_cap->self_curr_operclass = __cpu_to_le32(cap->self_curr_operclass);
8896add6cd8dSManikanta Pubbisetty 	peer_cap->peer_chan_len = __cpu_to_le32(cap->peer_chan_len);
8897add6cd8dSManikanta Pubbisetty 	peer_cap->peer_operclass_len = __cpu_to_le32(cap->peer_operclass_len);
8898add6cd8dSManikanta Pubbisetty 
8899add6cd8dSManikanta Pubbisetty 	for (i = 0; i < WMI_TDLS_MAX_SUPP_OPER_CLASSES; i++)
8900add6cd8dSManikanta Pubbisetty 		peer_cap->peer_operclass[i] = cap->peer_operclass[i];
8901add6cd8dSManikanta Pubbisetty 
8902add6cd8dSManikanta Pubbisetty 	peer_cap->is_peer_responder = __cpu_to_le32(cap->is_peer_responder);
8903add6cd8dSManikanta Pubbisetty 	peer_cap->pref_offchan_num = __cpu_to_le32(cap->pref_offchan_num);
8904add6cd8dSManikanta Pubbisetty 	peer_cap->pref_offchan_bw = __cpu_to_le32(cap->pref_offchan_bw);
8905add6cd8dSManikanta Pubbisetty 
8906add6cd8dSManikanta Pubbisetty 	for (i = 0; i < cap->peer_chan_len; i++) {
8907add6cd8dSManikanta Pubbisetty 		chan = (struct wmi_channel *)&peer_cap->peer_chan_list[i];
8908add6cd8dSManikanta Pubbisetty 		ath10k_wmi_put_wmi_channel(chan, &chan_arg[i]);
8909add6cd8dSManikanta Pubbisetty 	}
8910add6cd8dSManikanta Pubbisetty 
8911add6cd8dSManikanta Pubbisetty 	ath10k_dbg(ar, ATH10K_DBG_WMI,
8912add6cd8dSManikanta Pubbisetty 		   "wmi tdls peer update vdev %i state %d n_chans %u\n",
8913add6cd8dSManikanta Pubbisetty 		   arg->vdev_id, arg->peer_state, cap->peer_chan_len);
8914add6cd8dSManikanta Pubbisetty 	return skb;
8915add6cd8dSManikanta Pubbisetty }
8916add6cd8dSManikanta Pubbisetty 
8917add6cd8dSManikanta Pubbisetty static struct sk_buff *
89186f6eb1bcSSriram R ath10k_wmi_10_4_gen_radar_found(struct ath10k *ar,
89196f6eb1bcSSriram R 				const struct ath10k_radar_found_info *arg)
89206f6eb1bcSSriram R {
89216f6eb1bcSSriram R 	struct wmi_radar_found_info *cmd;
89226f6eb1bcSSriram R 	struct sk_buff *skb;
89236f6eb1bcSSriram R 
89246f6eb1bcSSriram R 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
89256f6eb1bcSSriram R 	if (!skb)
89266f6eb1bcSSriram R 		return ERR_PTR(-ENOMEM);
89276f6eb1bcSSriram R 
89286f6eb1bcSSriram R 	cmd = (struct wmi_radar_found_info *)skb->data;
89296f6eb1bcSSriram R 	cmd->pri_min   = __cpu_to_le32(arg->pri_min);
89306f6eb1bcSSriram R 	cmd->pri_max   = __cpu_to_le32(arg->pri_max);
89316f6eb1bcSSriram R 	cmd->width_min = __cpu_to_le32(arg->width_min);
89326f6eb1bcSSriram R 	cmd->width_max = __cpu_to_le32(arg->width_max);
89336f6eb1bcSSriram R 	cmd->sidx_min  = __cpu_to_le32(arg->sidx_min);
89346f6eb1bcSSriram R 	cmd->sidx_max  = __cpu_to_le32(arg->sidx_max);
89356f6eb1bcSSriram R 
89366f6eb1bcSSriram R 	ath10k_dbg(ar, ATH10K_DBG_WMI,
89376f6eb1bcSSriram R 		   "wmi radar found pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n",
89386f6eb1bcSSriram R 		   arg->pri_min, arg->pri_max, arg->width_min,
89396f6eb1bcSSriram R 		   arg->width_max, arg->sidx_min, arg->sidx_max);
89406f6eb1bcSSriram R 	return skb;
89416f6eb1bcSSriram R }
89426f6eb1bcSSriram R 
89436f6eb1bcSSriram R static struct sk_buff *
8944e25854f2SMichal Kazior ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value)
8945e25854f2SMichal Kazior {
8946e25854f2SMichal Kazior 	struct wmi_echo_cmd *cmd;
8947e25854f2SMichal Kazior 	struct sk_buff *skb;
8948e25854f2SMichal Kazior 
8949e25854f2SMichal Kazior 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8950e25854f2SMichal Kazior 	if (!skb)
8951e25854f2SMichal Kazior 		return ERR_PTR(-ENOMEM);
8952e25854f2SMichal Kazior 
8953e25854f2SMichal Kazior 	cmd = (struct wmi_echo_cmd *)skb->data;
8954e25854f2SMichal Kazior 	cmd->value = cpu_to_le32(value);
8955e25854f2SMichal Kazior 
8956e25854f2SMichal Kazior 	ath10k_dbg(ar, ATH10K_DBG_WMI,
8957e25854f2SMichal Kazior 		   "wmi echo value 0x%08x\n", value);
8958e25854f2SMichal Kazior 	return skb;
8959e25854f2SMichal Kazior }
8960e25854f2SMichal Kazior 
896120ddca21SMichal Kazior int
896220ddca21SMichal Kazior ath10k_wmi_barrier(struct ath10k *ar)
896320ddca21SMichal Kazior {
896420ddca21SMichal Kazior 	int ret;
896520ddca21SMichal Kazior 	int time_left;
896620ddca21SMichal Kazior 
896720ddca21SMichal Kazior 	spin_lock_bh(&ar->data_lock);
896820ddca21SMichal Kazior 	reinit_completion(&ar->wmi.barrier);
896920ddca21SMichal Kazior 	spin_unlock_bh(&ar->data_lock);
897020ddca21SMichal Kazior 
897120ddca21SMichal Kazior 	ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID);
897220ddca21SMichal Kazior 	if (ret) {
897320ddca21SMichal Kazior 		ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret);
897420ddca21SMichal Kazior 		return ret;
897520ddca21SMichal Kazior 	}
897620ddca21SMichal Kazior 
897720ddca21SMichal Kazior 	time_left = wait_for_completion_timeout(&ar->wmi.barrier,
897820ddca21SMichal Kazior 						ATH10K_WMI_BARRIER_TIMEOUT_HZ);
897920ddca21SMichal Kazior 	if (!time_left)
898020ddca21SMichal Kazior 		return -ETIMEDOUT;
898120ddca21SMichal Kazior 
898220ddca21SMichal Kazior 	return 0;
898320ddca21SMichal Kazior }
898420ddca21SMichal Kazior 
898584758d4dSBhagavathi Perumal S static struct sk_buff *
898684758d4dSBhagavathi Perumal S ath10k_wmi_10_2_4_op_gen_bb_timing(struct ath10k *ar,
898784758d4dSBhagavathi Perumal S 				   const struct wmi_bb_timing_cfg_arg *arg)
898884758d4dSBhagavathi Perumal S {
898984758d4dSBhagavathi Perumal S 	struct wmi_pdev_bb_timing_cfg_cmd *cmd;
899084758d4dSBhagavathi Perumal S 	struct sk_buff *skb;
899184758d4dSBhagavathi Perumal S 
899284758d4dSBhagavathi Perumal S 	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
899384758d4dSBhagavathi Perumal S 	if (!skb)
899484758d4dSBhagavathi Perumal S 		return ERR_PTR(-ENOMEM);
899584758d4dSBhagavathi Perumal S 
899684758d4dSBhagavathi Perumal S 	cmd = (struct wmi_pdev_bb_timing_cfg_cmd *)skb->data;
899784758d4dSBhagavathi Perumal S 	cmd->bb_tx_timing = __cpu_to_le32(arg->bb_tx_timing);
899884758d4dSBhagavathi Perumal S 	cmd->bb_xpa_timing = __cpu_to_le32(arg->bb_xpa_timing);
899984758d4dSBhagavathi Perumal S 
900084758d4dSBhagavathi Perumal S 	ath10k_dbg(ar, ATH10K_DBG_WMI,
900184758d4dSBhagavathi Perumal S 		   "wmi pdev bb_tx_timing 0x%x bb_xpa_timing 0x%x\n",
900284758d4dSBhagavathi Perumal S 		   arg->bb_tx_timing, arg->bb_xpa_timing);
900384758d4dSBhagavathi Perumal S 	return skb;
900484758d4dSBhagavathi Perumal S }
900584758d4dSBhagavathi Perumal S 
9006d7579d12SMichal Kazior static const struct wmi_ops wmi_ops = {
9007d7579d12SMichal Kazior 	.rx = ath10k_wmi_op_rx,
9008d7579d12SMichal Kazior 	.map_svc = wmi_main_svc_map,
9009d7579d12SMichal Kazior 
9010d7579d12SMichal Kazior 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
9011d7579d12SMichal Kazior 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
9012d7579d12SMichal Kazior 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
9013d7579d12SMichal Kazior 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9014d7579d12SMichal Kazior 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
9015d7579d12SMichal Kazior 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
9016991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
9017d7579d12SMichal Kazior 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
9018d7579d12SMichal Kazior 	.pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
9019d7579d12SMichal Kazior 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9020d7579d12SMichal Kazior 	.pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats,
9021c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
902284d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
9023d7579d12SMichal Kazior 
9024d7579d12SMichal Kazior 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9025d7579d12SMichal Kazior 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
9026d7579d12SMichal Kazior 	.gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd,
9027d7579d12SMichal Kazior 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9028d7579d12SMichal Kazior 	.gen_init = ath10k_wmi_op_gen_init,
9029d7579d12SMichal Kazior 	.gen_start_scan = ath10k_wmi_op_gen_start_scan,
9030d7579d12SMichal Kazior 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9031d7579d12SMichal Kazior 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9032d7579d12SMichal Kazior 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9033d7579d12SMichal Kazior 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9034d7579d12SMichal Kazior 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9035d7579d12SMichal Kazior 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9036d7579d12SMichal Kazior 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9037d7579d12SMichal Kazior 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9038d7579d12SMichal Kazior 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
9039d7579d12SMichal Kazior 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
9040d7579d12SMichal Kazior 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
90416d492fe2SMichal Kazior 	/* .gen_vdev_wmm_conf not implemented */
9042d7579d12SMichal Kazior 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
9043d7579d12SMichal Kazior 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9044d7579d12SMichal Kazior 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
9045d7579d12SMichal Kazior 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9046d7579d12SMichal Kazior 	.gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc,
9047d7579d12SMichal Kazior 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9048d7579d12SMichal Kazior 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9049d7579d12SMichal Kazior 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9050d7579d12SMichal Kazior 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9051d7579d12SMichal Kazior 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9052d7579d12SMichal Kazior 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9053d7579d12SMichal Kazior 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
9054d7579d12SMichal Kazior 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9055d7579d12SMichal Kazior 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9056d7579d12SMichal Kazior 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
9057d7579d12SMichal Kazior 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9058d7579d12SMichal Kazior 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9059ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9060a57a6a27SRajkumar Manoharan 	/* .gen_pdev_get_temperature not implemented */
9061dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
906265c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
906311597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
906450abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
9065bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
90666e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
9067e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
9068be9ce9d8SMichal Kazior 	/* .gen_bcn_tmpl not implemented */
90694c4955feSMichal Kazior 	/* .gen_prb_tmpl not implemented */
9070369242b4SMichal Kazior 	/* .gen_p2p_go_bcn_ie not implemented */
90715b272e30SMichal Kazior 	/* .gen_adaptive_qcs not implemented */
907262f77f09SMaharaja 	/* .gen_pdev_enable_adaptive_cca not implemented */
9073d7579d12SMichal Kazior };
9074d7579d12SMichal Kazior 
9075d7579d12SMichal Kazior static const struct wmi_ops wmi_10_1_ops = {
9076d7579d12SMichal Kazior 	.rx = ath10k_wmi_10_1_op_rx,
9077d7579d12SMichal Kazior 	.map_svc = wmi_10x_svc_map,
9078d7579d12SMichal Kazior 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
9079d7579d12SMichal Kazior 	.pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats,
9080d7579d12SMichal Kazior 	.gen_init = ath10k_wmi_10_1_op_gen_init,
9081d7579d12SMichal Kazior 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
9082d7579d12SMichal Kazior 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
9083d7579d12SMichal Kazior 	.gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc,
9084a57a6a27SRajkumar Manoharan 	/* .gen_pdev_get_temperature not implemented */
9085d7579d12SMichal Kazior 
9086d7579d12SMichal Kazior 	/* shared with main branch */
9087d7579d12SMichal Kazior 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
9088d7579d12SMichal Kazior 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
9089d7579d12SMichal Kazior 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
9090d7579d12SMichal Kazior 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9091d7579d12SMichal Kazior 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
9092d7579d12SMichal Kazior 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
9093991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
9094d7579d12SMichal Kazior 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
9095d7579d12SMichal Kazior 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9096c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
909784d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
9098d7579d12SMichal Kazior 
9099d7579d12SMichal Kazior 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9100d7579d12SMichal Kazior 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
9101d7579d12SMichal Kazior 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9102d7579d12SMichal Kazior 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9103d7579d12SMichal Kazior 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9104d7579d12SMichal Kazior 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9105d7579d12SMichal Kazior 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9106d7579d12SMichal Kazior 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9107d7579d12SMichal Kazior 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9108d7579d12SMichal Kazior 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9109d7579d12SMichal Kazior 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9110d7579d12SMichal Kazior 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
9111d7579d12SMichal Kazior 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
9112d7579d12SMichal Kazior 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
91136d492fe2SMichal Kazior 	/* .gen_vdev_wmm_conf not implemented */
9114d7579d12SMichal Kazior 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
9115d7579d12SMichal Kazior 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9116d7579d12SMichal Kazior 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
9117d7579d12SMichal Kazior 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9118d7579d12SMichal Kazior 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9119d7579d12SMichal Kazior 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9120d7579d12SMichal Kazior 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9121d7579d12SMichal Kazior 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9122d7579d12SMichal Kazior 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9123d7579d12SMichal Kazior 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9124d7579d12SMichal Kazior 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
9125d7579d12SMichal Kazior 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9126d7579d12SMichal Kazior 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9127d7579d12SMichal Kazior 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
9128d7579d12SMichal Kazior 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9129d7579d12SMichal Kazior 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9130ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9131dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
913265c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
913311597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
913450abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
9135bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
91366e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
9137e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
9138be9ce9d8SMichal Kazior 	/* .gen_bcn_tmpl not implemented */
91394c4955feSMichal Kazior 	/* .gen_prb_tmpl not implemented */
9140369242b4SMichal Kazior 	/* .gen_p2p_go_bcn_ie not implemented */
91415b272e30SMichal Kazior 	/* .gen_adaptive_qcs not implemented */
914262f77f09SMaharaja 	/* .gen_pdev_enable_adaptive_cca not implemented */
9143d7579d12SMichal Kazior };
9144d7579d12SMichal Kazior 
9145d7579d12SMichal Kazior static const struct wmi_ops wmi_10_2_ops = {
9146d7579d12SMichal Kazior 	.rx = ath10k_wmi_10_2_op_rx,
914720de2229SMichal Kazior 	.pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats,
9148d7579d12SMichal Kazior 	.gen_init = ath10k_wmi_10_2_op_gen_init,
9149d7579d12SMichal Kazior 	.gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
9150a57a6a27SRajkumar Manoharan 	/* .gen_pdev_get_temperature not implemented */
9151d7579d12SMichal Kazior 
9152d7579d12SMichal Kazior 	/* shared with 10.1 */
9153d7579d12SMichal Kazior 	.map_svc = wmi_10x_svc_map,
9154d7579d12SMichal Kazior 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
9155d7579d12SMichal Kazior 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
9156d7579d12SMichal Kazior 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
9157e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
9158d7579d12SMichal Kazior 
9159d7579d12SMichal Kazior 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
9160d7579d12SMichal Kazior 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
9161d7579d12SMichal Kazior 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
9162d7579d12SMichal Kazior 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9163d7579d12SMichal Kazior 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
9164d7579d12SMichal Kazior 	.pull_swba = ath10k_wmi_op_pull_swba_ev,
9165991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
9166d7579d12SMichal Kazior 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
9167d7579d12SMichal Kazior 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9168c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
916984d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
9170d7579d12SMichal Kazior 
9171d7579d12SMichal Kazior 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9172d7579d12SMichal Kazior 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
9173d7579d12SMichal Kazior 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9174d7579d12SMichal Kazior 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9175d7579d12SMichal Kazior 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9176d7579d12SMichal Kazior 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9177d7579d12SMichal Kazior 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9178d7579d12SMichal Kazior 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9179d7579d12SMichal Kazior 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9180d7579d12SMichal Kazior 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9181d7579d12SMichal Kazior 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9182d7579d12SMichal Kazior 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
9183d7579d12SMichal Kazior 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
9184d7579d12SMichal Kazior 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
91856d492fe2SMichal Kazior 	/* .gen_vdev_wmm_conf not implemented */
9186d7579d12SMichal Kazior 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
9187d7579d12SMichal Kazior 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9188d7579d12SMichal Kazior 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
918905e7ba24SChristian Lamparter 	.gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr,
9190d7579d12SMichal Kazior 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9191d7579d12SMichal Kazior 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9192d7579d12SMichal Kazior 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9193d7579d12SMichal Kazior 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9194d7579d12SMichal Kazior 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9195d7579d12SMichal Kazior 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9196d7579d12SMichal Kazior 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9197d7579d12SMichal Kazior 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
9198d7579d12SMichal Kazior 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9199d7579d12SMichal Kazior 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9200d7579d12SMichal Kazior 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
9201d7579d12SMichal Kazior 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9202d7579d12SMichal Kazior 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9203ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9204dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
920565c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
920611597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
920750abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
9208bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
92096e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
921062f77f09SMaharaja 	/* .gen_pdev_enable_adaptive_cca not implemented */
9211d7579d12SMichal Kazior };
9212d7579d12SMichal Kazior 
92134a16fbecSRajkumar Manoharan static const struct wmi_ops wmi_10_2_4_ops = {
92144a16fbecSRajkumar Manoharan 	.rx = ath10k_wmi_10_2_op_rx,
921520de2229SMichal Kazior 	.pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats,
92164a16fbecSRajkumar Manoharan 	.gen_init = ath10k_wmi_10_2_op_gen_init,
92174a16fbecSRajkumar Manoharan 	.gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
9218a57a6a27SRajkumar Manoharan 	.gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
92198a0b459eSRajkumar Manoharan 	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
92204a16fbecSRajkumar Manoharan 
92214a16fbecSRajkumar Manoharan 	/* shared with 10.1 */
92224a16fbecSRajkumar Manoharan 	.map_svc = wmi_10x_svc_map,
92234a16fbecSRajkumar Manoharan 	.pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
92244a16fbecSRajkumar Manoharan 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
92254a16fbecSRajkumar Manoharan 	.gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
9226e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
92274a16fbecSRajkumar Manoharan 
92284a16fbecSRajkumar Manoharan 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
92294a16fbecSRajkumar Manoharan 	.pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
92304a16fbecSRajkumar Manoharan 	.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
92314a16fbecSRajkumar Manoharan 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
92324a16fbecSRajkumar Manoharan 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
92338b019fb0SYanbo Li 	.pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev,
9234991adf71SRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
92354a16fbecSRajkumar Manoharan 	.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
92364a16fbecSRajkumar Manoharan 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9237c1a4654aSMichal Kazior 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
923884d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
92394a16fbecSRajkumar Manoharan 
92404a16fbecSRajkumar Manoharan 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
92414a16fbecSRajkumar Manoharan 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
92424a16fbecSRajkumar Manoharan 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
92434a16fbecSRajkumar Manoharan 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
92444a16fbecSRajkumar Manoharan 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
92454a16fbecSRajkumar Manoharan 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
92464a16fbecSRajkumar Manoharan 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
92474a16fbecSRajkumar Manoharan 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
92484a16fbecSRajkumar Manoharan 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
92494a16fbecSRajkumar Manoharan 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
92504a16fbecSRajkumar Manoharan 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
92514a16fbecSRajkumar Manoharan 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
92524a16fbecSRajkumar Manoharan 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
92534a16fbecSRajkumar Manoharan 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
92544a16fbecSRajkumar Manoharan 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
92554a16fbecSRajkumar Manoharan 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
92564a16fbecSRajkumar Manoharan 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
92574a16fbecSRajkumar Manoharan 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
92584a16fbecSRajkumar Manoharan 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
92594a16fbecSRajkumar Manoharan 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
92604a16fbecSRajkumar Manoharan 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
92614a16fbecSRajkumar Manoharan 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
92624a16fbecSRajkumar Manoharan 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
92634a16fbecSRajkumar Manoharan 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
92644a16fbecSRajkumar Manoharan 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
92654a16fbecSRajkumar Manoharan 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
92664a16fbecSRajkumar Manoharan 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
92674a16fbecSRajkumar Manoharan 	.gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
92684a16fbecSRajkumar Manoharan 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
92694a16fbecSRajkumar Manoharan 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9270ffdd738dSRajkumar Manoharan 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9271dc8ab278SRajkumar Manoharan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
927265c0893dSRajkumar Manoharan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
927311597413SRajkumar Manoharan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
927450abef85SRajkumar Manoharan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
927529542666SMaharaja Kennadyrajan 	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
9276bc6f9ae6SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
927762f77f09SMaharaja 	.gen_pdev_enable_adaptive_cca =
927862f77f09SMaharaja 		ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
92796e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
928084758d4dSBhagavathi Perumal S 	.gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing,
9281be9ce9d8SMichal Kazior 	/* .gen_bcn_tmpl not implemented */
92824c4955feSMichal Kazior 	/* .gen_prb_tmpl not implemented */
9283369242b4SMichal Kazior 	/* .gen_p2p_go_bcn_ie not implemented */
92845b272e30SMichal Kazior 	/* .gen_adaptive_qcs not implemented */
92854a16fbecSRajkumar Manoharan };
92864a16fbecSRajkumar Manoharan 
9287840357ccSRaja Mani static const struct wmi_ops wmi_10_4_ops = {
92881c092961SRaja Mani 	.rx = ath10k_wmi_10_4_op_rx,
9289840357ccSRaja Mani 	.map_svc = wmi_10_4_svc_map,
9290b2297baaSRaja Mani 
929198dd2b92SManikanta Pubbisetty 	.pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats,
9292b2297baaSRaja Mani 	.pull_scan = ath10k_wmi_op_pull_scan_ev,
92931c092961SRaja Mani 	.pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev,
9294b2297baaSRaja Mani 	.pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev,
9295373b48cfSRaja Mani 	.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
9296373b48cfSRaja Mani 	.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
92973cec3be3SRaja Mani 	.pull_swba = ath10k_wmi_10_4_op_pull_swba_ev,
92982b0a2e0dSRaja Mani 	.pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr,
92992b0a2e0dSRaja Mani 	.pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
93001c092961SRaja Mani 	.pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
9301d02e752fSRaja Mani 	.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
9302343bf960SMohammed Shafi Shajakhan 	.pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
93036f6eb1bcSSriram R 	.pull_dfs_status_ev = ath10k_wmi_10_4_op_pull_dfs_status_ev,
930408e75ea8SVivek Natarajan 	.get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,
9305373b48cfSRaja Mani 
9306373b48cfSRaja Mani 	.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
9307373b48cfSRaja Mani 	.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
930805e7ba24SChristian Lamparter 	.gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr,
9309373b48cfSRaja Mani 	.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
9310373b48cfSRaja Mani 	.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
9311d1e52a8eSRaja Mani 	.gen_init = ath10k_wmi_10_4_op_gen_init,
9312b2297baaSRaja Mani 	.gen_start_scan = ath10k_wmi_op_gen_start_scan,
9313b2297baaSRaja Mani 	.gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
9314373b48cfSRaja Mani 	.gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
9315373b48cfSRaja Mani 	.gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
9316373b48cfSRaja Mani 	.gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
9317373b48cfSRaja Mani 	.gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
9318373b48cfSRaja Mani 	.gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
9319373b48cfSRaja Mani 	.gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
9320373b48cfSRaja Mani 	.gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
9321373b48cfSRaja Mani 	.gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
93224535edbdSRaja Mani 	.gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
93234535edbdSRaja Mani 	.gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
9324373b48cfSRaja Mani 	.gen_peer_create = ath10k_wmi_op_gen_peer_create,
9325373b48cfSRaja Mani 	.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
9326373b48cfSRaja Mani 	.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
9327373b48cfSRaja Mani 	.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
9328b54e16f1SVasanthakumar Thiagarajan 	.gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc,
9329373b48cfSRaja Mani 	.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
9330373b48cfSRaja Mani 	.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
9331373b48cfSRaja Mani 	.gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
9332373b48cfSRaja Mani 	.gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
9333373b48cfSRaja Mani 	.gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
9334373b48cfSRaja Mani 	.gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
9335373b48cfSRaja Mani 	.gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
9336373b48cfSRaja Mani 	.gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
9337afcbc82cSMaharaja Kennadyrajan 	.gen_dbglog_cfg = ath10k_wmi_10_4_op_gen_dbglog_cfg,
9338373b48cfSRaja Mani 	.gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
9339373b48cfSRaja Mani 	.gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
9340373b48cfSRaja Mani 	.gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
9341b2887410SVasanthakumar Thiagarajan 	.gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
9342b2887410SVasanthakumar Thiagarajan 	.gen_addba_send = ath10k_wmi_op_gen_addba_send,
9343b2887410SVasanthakumar Thiagarajan 	.gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
9344b2887410SVasanthakumar Thiagarajan 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
934598dd2b92SManikanta Pubbisetty 	.fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill,
934647771902SRaja Mani 	.ext_resource_config = ath10k_wmi_10_4_ext_resource_config,
9347add6cd8dSManikanta Pubbisetty 	.gen_update_fw_tdls_state = ath10k_wmi_10_4_gen_update_fw_tdls_state,
9348add6cd8dSManikanta Pubbisetty 	.gen_tdls_peer_update = ath10k_wmi_10_4_gen_tdls_peer_update,
9349bc64d052SMaharaja Kennadyrajan 	.gen_pdev_get_tpc_table_cmdid =
9350bc64d052SMaharaja Kennadyrajan 			ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid,
93516f6eb1bcSSriram R 	.gen_radar_found = ath10k_wmi_10_4_gen_radar_found,
9352373b48cfSRaja Mani 
9353373b48cfSRaja Mani 	/* shared with 10.2 */
935484d4911bSMichal Kazior 	.pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
935598dd2b92SManikanta Pubbisetty 	.gen_request_stats = ath10k_wmi_op_gen_request_stats,
93566dd46348STamizh chelvam 	.gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
93576e4de1a4SPeter Oh 	.get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype,
93588a0b459eSRajkumar Manoharan 	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
9359e25854f2SMichal Kazior 	.gen_echo = ath10k_wmi_op_gen_echo,
9360ac86aa57SMaharaja Kennadyrajan 	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
9361840357ccSRaja Mani };
9362840357ccSRaja Mani 
9363b79b9baaSMichal Kazior int ath10k_wmi_attach(struct ath10k *ar)
9364b79b9baaSMichal Kazior {
9365bf3c13abSKalle Valo 	switch (ar->running_fw->fw_file.wmi_op_version) {
93669bd21322SRaja Mani 	case ATH10K_FW_WMI_OP_VERSION_10_4:
9367840357ccSRaja Mani 		ar->wmi.ops = &wmi_10_4_ops;
93682d491e69SRaja Mani 		ar->wmi.cmd = &wmi_10_4_cmd_map;
936993841a15SRaja Mani 		ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
9370d86561ffSRaja Mani 		ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
9371c0e33fe6SRakesh Pillai 		ar->wmi.peer_param = &wmi_peer_param_map;
93723fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
93737d94f862SAbhishek Ambure 		ar->wmi_key_cipher = wmi_key_cipher_suites;
93749bd21322SRaja Mani 		break;
93754a16fbecSRajkumar Manoharan 	case ATH10K_FW_WMI_OP_VERSION_10_2_4:
93764a16fbecSRajkumar Manoharan 		ar->wmi.cmd = &wmi_10_2_4_cmd_map;
93774a16fbecSRajkumar Manoharan 		ar->wmi.ops = &wmi_10_2_4_ops;
93784a16fbecSRajkumar Manoharan 		ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
93794a16fbecSRajkumar Manoharan 		ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
9380c0e33fe6SRakesh Pillai 		ar->wmi.peer_param = &wmi_peer_param_map;
93813fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
93827d94f862SAbhishek Ambure 		ar->wmi_key_cipher = wmi_key_cipher_suites;
93834a16fbecSRajkumar Manoharan 		break;
9384d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_10_2:
9385b79b9baaSMichal Kazior 		ar->wmi.cmd = &wmi_10_2_cmd_map;
9386d7579d12SMichal Kazior 		ar->wmi.ops = &wmi_10_2_ops;
9387b79b9baaSMichal Kazior 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
9388b79b9baaSMichal Kazior 		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
9389c0e33fe6SRakesh Pillai 		ar->wmi.peer_param = &wmi_peer_param_map;
93903fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
93917d94f862SAbhishek Ambure 		ar->wmi_key_cipher = wmi_key_cipher_suites;
9392d7579d12SMichal Kazior 		break;
9393d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_10_1:
9394d7579d12SMichal Kazior 		ar->wmi.cmd = &wmi_10x_cmd_map;
9395d7579d12SMichal Kazior 		ar->wmi.ops = &wmi_10_1_ops;
9396d7579d12SMichal Kazior 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
9397d7579d12SMichal Kazior 		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
9398c0e33fe6SRakesh Pillai 		ar->wmi.peer_param = &wmi_peer_param_map;
93993fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
94007d94f862SAbhishek Ambure 		ar->wmi_key_cipher = wmi_key_cipher_suites;
9401d7579d12SMichal Kazior 		break;
9402d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_MAIN:
9403b79b9baaSMichal Kazior 		ar->wmi.cmd = &wmi_cmd_map;
9404d7579d12SMichal Kazior 		ar->wmi.ops = &wmi_ops;
9405b79b9baaSMichal Kazior 		ar->wmi.vdev_param = &wmi_vdev_param_map;
9406b79b9baaSMichal Kazior 		ar->wmi.pdev_param = &wmi_pdev_param_map;
9407c0e33fe6SRakesh Pillai 		ar->wmi.peer_param = &wmi_peer_param_map;
94083fab30f7STamizh chelvam 		ar->wmi.peer_flags = &wmi_peer_flags_map;
94097d94f862SAbhishek Ambure 		ar->wmi_key_cipher = wmi_key_cipher_suites;
9410d7579d12SMichal Kazior 		break;
9411ca996ec5SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_TLV:
9412ca996ec5SMichal Kazior 		ath10k_wmi_tlv_attach(ar);
94137d94f862SAbhishek Ambure 		ar->wmi_key_cipher = wmi_tlv_key_cipher_suites;
9414ca996ec5SMichal Kazior 		break;
9415d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_UNSET:
9416d7579d12SMichal Kazior 	case ATH10K_FW_WMI_OP_VERSION_MAX:
9417d7579d12SMichal Kazior 		ath10k_err(ar, "unsupported WMI op version: %d\n",
9418bf3c13abSKalle Valo 			   ar->running_fw->fw_file.wmi_op_version);
9419d7579d12SMichal Kazior 		return -EINVAL;
9420b79b9baaSMichal Kazior 	}
9421b79b9baaSMichal Kazior 
9422b79b9baaSMichal Kazior 	init_completion(&ar->wmi.service_ready);
9423b79b9baaSMichal Kazior 	init_completion(&ar->wmi.unified_ready);
942420ddca21SMichal Kazior 	init_completion(&ar->wmi.barrier);
94256f6eb1bcSSriram R 	init_completion(&ar->wmi.radar_confirm);
9426b79b9baaSMichal Kazior 
9427c8ecfc1cSRaja Mani 	INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work);
94286f6eb1bcSSriram R 	INIT_WORK(&ar->radar_confirmation_work,
94296f6eb1bcSSriram R 		  ath10k_radar_confirmation_work);
9430c8ecfc1cSRaja Mani 
9431dc405152SRakesh Pillai 	if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
9432dc405152SRakesh Pillai 		     ar->running_fw->fw_file.fw_features)) {
9433dc405152SRakesh Pillai 		idr_init(&ar->wmi.mgmt_pending_tx);
9434dc405152SRakesh Pillai 	}
9435dc405152SRakesh Pillai 
9436b79b9baaSMichal Kazior 	return 0;
9437b79b9baaSMichal Kazior }
9438b79b9baaSMichal Kazior 
9439a925a376SVasanthakumar Thiagarajan void ath10k_wmi_free_host_mem(struct ath10k *ar)
9440b79b9baaSMichal Kazior {
9441b79b9baaSMichal Kazior 	int i;
9442b79b9baaSMichal Kazior 
9443b79b9baaSMichal Kazior 	/* free the host memory chunks requested by firmware */
9444b79b9baaSMichal Kazior 	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
944579e68821SAdrian Chadd 		dma_free_coherent(ar->dev,
9446b79b9baaSMichal Kazior 				  ar->wmi.mem_chunks[i].len,
944779e68821SAdrian Chadd 				  ar->wmi.mem_chunks[i].vaddr,
944879e68821SAdrian Chadd 				  ar->wmi.mem_chunks[i].paddr);
9449b79b9baaSMichal Kazior 	}
9450b79b9baaSMichal Kazior 
9451b79b9baaSMichal Kazior 	ar->wmi.num_mem_chunks = 0;
9452b79b9baaSMichal Kazior }
9453a925a376SVasanthakumar Thiagarajan 
9454dc405152SRakesh Pillai static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr,
9455dc405152SRakesh Pillai 					       void *ctx)
9456dc405152SRakesh Pillai {
9457dc405152SRakesh Pillai 	struct ath10k_mgmt_tx_pkt_addr *pkt_addr = ptr;
9458dc405152SRakesh Pillai 	struct ath10k *ar = ctx;
9459dc405152SRakesh Pillai 	struct sk_buff *msdu;
9460dc405152SRakesh Pillai 
9461dc405152SRakesh Pillai 	ath10k_dbg(ar, ATH10K_DBG_WMI,
9462dc405152SRakesh Pillai 		   "force cleanup mgmt msdu_id %hu\n", msdu_id);
9463dc405152SRakesh Pillai 
9464dc405152SRakesh Pillai 	msdu = pkt_addr->vaddr;
9465dc405152SRakesh Pillai 	dma_unmap_single(ar->dev, pkt_addr->paddr,
9466dc405152SRakesh Pillai 			 msdu->len, DMA_FROM_DEVICE);
9467dc405152SRakesh Pillai 	ieee80211_free_txskb(ar->hw, msdu);
9468dc405152SRakesh Pillai 
9469dc405152SRakesh Pillai 	return 0;
9470dc405152SRakesh Pillai }
9471dc405152SRakesh Pillai 
9472a925a376SVasanthakumar Thiagarajan void ath10k_wmi_detach(struct ath10k *ar)
9473a925a376SVasanthakumar Thiagarajan {
9474dc405152SRakesh Pillai 	if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
9475dc405152SRakesh Pillai 		     ar->running_fw->fw_file.fw_features)) {
9476dc405152SRakesh Pillai 		spin_lock_bh(&ar->data_lock);
9477dc405152SRakesh Pillai 		idr_for_each(&ar->wmi.mgmt_pending_tx,
9478dc405152SRakesh Pillai 			     ath10k_wmi_mgmt_tx_clean_up_pending, ar);
9479dc405152SRakesh Pillai 		idr_destroy(&ar->wmi.mgmt_pending_tx);
9480dc405152SRakesh Pillai 		spin_unlock_bh(&ar->data_lock);
9481dc405152SRakesh Pillai 	}
9482dc405152SRakesh Pillai 
9483a925a376SVasanthakumar Thiagarajan 	cancel_work_sync(&ar->svc_rdy_work);
9484a925a376SVasanthakumar Thiagarajan 
9485a925a376SVasanthakumar Thiagarajan 	if (ar->svc_rdy_skb)
9486a925a376SVasanthakumar Thiagarajan 		dev_kfree_skb(ar->svc_rdy_skb);
9487a925a376SVasanthakumar Thiagarajan }
9488