2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
4 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <linux/skbuff.h>
20 #include <linux/ctype.h>
35 #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9
36 #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ)
38 /* MAIN WMI cmd track */
39 static struct wmi_cmd_map wmi_cmd_map = {
40 .init_cmdid = WMI_INIT_CMDID,
41 .start_scan_cmdid = WMI_START_SCAN_CMDID,
42 .stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
43 .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
44 .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
45 .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
46 .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
47 .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
48 .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
49 .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
50 .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
51 .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
52 .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
53 .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
54 .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
55 .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
56 .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
57 .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
58 .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
59 .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
60 .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
61 .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
62 .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
63 .vdev_up_cmdid = WMI_VDEV_UP_CMDID,
64 .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
65 .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
66 .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
67 .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
68 .peer_create_cmdid = WMI_PEER_CREATE_CMDID,
69 .peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
70 .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
71 .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
72 .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
73 .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
74 .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
75 .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
76 .bcn_tx_cmdid = WMI_BCN_TX_CMDID,
77 .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
78 .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
79 .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
80 .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
81 .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
82 .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
83 .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
84 .addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
85 .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
86 .delba_send_cmdid = WMI_DELBA_SEND_CMDID,
87 .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
88 .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
89 .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
90 .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
91 .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
92 .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
93 .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
94 .roam_scan_mode = WMI_ROAM_SCAN_MODE,
95 .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
96 .roam_scan_period = WMI_ROAM_SCAN_PERIOD,
97 .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
98 .roam_ap_profile = WMI_ROAM_AP_PROFILE,
99 .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
100 .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
101 .ofl_scan_period = WMI_OFL_SCAN_PERIOD,
102 .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
103 .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
104 .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
105 .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
106 .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
107 .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
108 .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
109 .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
110 .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
111 .wlan_profile_set_hist_intvl_cmdid =
112 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
113 .wlan_profile_get_profile_data_cmdid =
114 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
115 .wlan_profile_enable_profile_id_cmdid =
116 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
117 .wlan_profile_list_profile_id_cmdid =
118 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
119 .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
120 .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
121 .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
122 .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
123 .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
124 .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
125 .wow_enable_disable_wake_event_cmdid =
126 WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
127 .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
128 .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
129 .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
130 .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
131 .vdev_spectral_scan_configure_cmdid =
132 WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
133 .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
134 .request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
135 .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
136 .network_list_offload_config_cmdid =
137 WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
138 .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
139 .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
140 .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
141 .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
142 .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
143 .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
144 .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
145 .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
146 .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
147 .echo_cmdid = WMI_ECHO_CMDID,
148 .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
149 .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
150 .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
151 .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
152 .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
153 .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
154 .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
155 .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
156 .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
157 .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
158 .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
159 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
160 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
161 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
162 .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
163 .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
164 .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
165 .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
166 .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
167 .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
168 .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
169 .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
170 .nan_cmdid = WMI_CMD_UNSUPPORTED,
171 .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
172 .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
173 .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
174 .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
175 .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
176 .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
177 .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
178 .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
179 .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
180 .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
181 .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
182 .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
183 .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
184 .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
185 .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
186 .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
187 .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
188 .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
189 .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
190 .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
191 .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
192 .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
193 .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
194 .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
195 .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
196 .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
197 .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
198 .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
199 .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
200 .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
201 .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
204 /* 10.X WMI cmd track */
205 static struct wmi_cmd_map wmi_10x_cmd_map = {
206 .init_cmdid = WMI_10X_INIT_CMDID,
207 .start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
208 .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
209 .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
210 .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
211 .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
212 .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
213 .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
214 .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
215 .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
216 .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
217 .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
218 .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
219 .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
220 .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
221 .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
222 .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
223 .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
224 .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
225 .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
226 .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
227 .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
228 .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
229 .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
230 .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
231 .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
232 .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
233 .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
234 .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
235 .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
236 .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
237 .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
238 .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
239 .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
240 .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
241 .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
242 .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
243 .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
244 .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
245 .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
246 .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
247 .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
248 .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
249 .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
250 .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
251 .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
252 .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
253 .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
254 .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
255 .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
256 .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
257 .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
258 .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
259 .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
260 .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
261 .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
262 .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
263 .roam_scan_rssi_change_threshold =
264 WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
265 .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
266 .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
267 .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
268 .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
269 .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
270 .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
271 .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
272 .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
273 .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
274 .ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID,
275 .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
276 .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
277 .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
278 .wlan_profile_set_hist_intvl_cmdid =
279 WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
280 .wlan_profile_get_profile_data_cmdid =
281 WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
282 .wlan_profile_enable_profile_id_cmdid =
283 WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
284 .wlan_profile_list_profile_id_cmdid =
285 WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
286 .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
287 .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
288 .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
289 .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
290 .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
291 .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
292 .wow_enable_disable_wake_event_cmdid =
293 WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
294 .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
295 .wow_hostwakeup_from_sleep_cmdid =
296 WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
297 .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
298 .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
299 .vdev_spectral_scan_configure_cmdid =
300 WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
301 .vdev_spectral_scan_enable_cmdid =
302 WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
303 .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
304 .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
305 .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
306 .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
307 .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
308 .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
309 .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
310 .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
311 .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
312 .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
313 .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
314 .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
315 .echo_cmdid = WMI_10X_ECHO_CMDID,
316 .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
317 .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
318 .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
319 .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
320 .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
321 .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
322 .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
323 .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
324 .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
325 .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
326 .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
327 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
328 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
329 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
330 .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
331 .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
332 .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
333 .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
334 .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
335 .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
336 .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
337 .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
338 .nan_cmdid = WMI_CMD_UNSUPPORTED,
339 .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
340 .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
341 .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
342 .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
343 .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
344 .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
345 .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
346 .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
347 .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
348 .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
349 .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
350 .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
351 .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
352 .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
353 .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
354 .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
355 .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
356 .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
357 .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
358 .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
359 .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
360 .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
361 .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
362 .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
363 .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
364 .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
365 .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
366 .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
367 .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
368 .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
369 .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
372 /* 10.2.4 WMI cmd track */
373 static struct wmi_cmd_map wmi_10_2_4_cmd_map = {
374 .init_cmdid = WMI_10_2_INIT_CMDID,
375 .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
376 .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
377 .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
378 .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
379 .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
380 .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
381 .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
382 .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
383 .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
384 .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
385 .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
386 .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
387 .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
388 .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
389 .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
390 .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
391 .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
392 .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
393 .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
394 .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
395 .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
396 .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
397 .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
398 .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
399 .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
400 .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
401 .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
402 .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
403 .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
404 .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
405 .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
406 .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
407 .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
408 .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
409 .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
410 .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
411 .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
412 .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
413 .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
414 .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
415 .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
416 .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
417 .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
418 .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
419 .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
420 .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
421 .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
422 .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
423 .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
424 .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
425 .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
426 .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
427 .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
428 .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
429 .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
430 .roam_scan_rssi_change_threshold =
431 WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
432 .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
433 .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
434 .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
435 .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
436 .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
437 .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
438 .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
439 .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
440 .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
441 .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
442 .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
443 .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
444 .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
445 .wlan_profile_set_hist_intvl_cmdid =
446 WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
447 .wlan_profile_get_profile_data_cmdid =
448 WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
449 .wlan_profile_enable_profile_id_cmdid =
450 WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
451 .wlan_profile_list_profile_id_cmdid =
452 WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
453 .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
454 .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
455 .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
456 .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
457 .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
458 .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
459 .wow_enable_disable_wake_event_cmdid =
460 WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
461 .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
462 .wow_hostwakeup_from_sleep_cmdid =
463 WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
464 .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
465 .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
466 .vdev_spectral_scan_configure_cmdid =
467 WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
468 .vdev_spectral_scan_enable_cmdid =
469 WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
470 .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
471 .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
472 .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
473 .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
474 .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
475 .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
476 .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
477 .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
478 .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
479 .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
480 .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
481 .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
482 .echo_cmdid = WMI_10_2_ECHO_CMDID,
483 .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
484 .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
485 .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
486 .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
487 .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
488 .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
489 .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
490 .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
491 .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
492 .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID,
493 .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS,
494 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
495 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
496 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
497 .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
498 .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
499 .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
500 .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
501 .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
502 .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
503 .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
504 .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
505 .nan_cmdid = WMI_CMD_UNSUPPORTED,
506 .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
507 .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
508 .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
509 .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
510 .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
511 .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
512 .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
513 .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
514 .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
515 .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
516 .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
517 .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
518 .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
519 .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
520 .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
521 .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
522 .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
523 .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
524 .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
525 .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
526 .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
527 .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
528 .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
529 .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
530 .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
531 .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
532 .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
533 .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
534 .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
535 .pdev_bss_chan_info_request_cmdid =
536 WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
537 .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
540 /* 10.4 WMI cmd track */
541 static struct wmi_cmd_map wmi_10_4_cmd_map = {
542 .init_cmdid = WMI_10_4_INIT_CMDID,
543 .start_scan_cmdid = WMI_10_4_START_SCAN_CMDID,
544 .stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID,
545 .scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID,
546 .scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID,
547 .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
548 .pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID,
549 .pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID,
550 .pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID,
551 .pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID,
552 .pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID,
553 .pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID,
554 .pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID,
555 .pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID,
556 .pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID,
557 .pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID,
558 .pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID,
559 .pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID,
560 .pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID,
561 .vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID,
562 .vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID,
563 .vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID,
564 .vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID,
565 .vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID,
566 .vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID,
567 .vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID,
568 .vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID,
569 .vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID,
570 .peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID,
571 .peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID,
572 .peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID,
573 .peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID,
574 .peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID,
575 .peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID,
576 .peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID,
577 .peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID,
578 .bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID,
579 .pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID,
580 .bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID,
581 .bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID,
582 .prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID,
583 .mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID,
584 .prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID,
585 .addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID,
586 .addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID,
587 .addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID,
588 .delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID,
589 .addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID,
590 .send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID,
591 .sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID,
592 .sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID,
593 .sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID,
594 .pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID,
595 .pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID,
596 .roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE,
597 .roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD,
598 .roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD,
599 .roam_scan_rssi_change_threshold =
600 WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
601 .roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE,
602 .ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE,
603 .ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE,
604 .ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD,
605 .p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO,
606 .p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY,
607 .p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE,
608 .p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE,
609 .p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID,
610 .ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID,
611 .ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID,
612 .peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID,
613 .wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID,
614 .wlan_profile_set_hist_intvl_cmdid =
615 WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
616 .wlan_profile_get_profile_data_cmdid =
617 WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
618 .wlan_profile_enable_profile_id_cmdid =
619 WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
620 .wlan_profile_list_profile_id_cmdid =
621 WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
622 .pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID,
623 .pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID,
624 .add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID,
625 .rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID,
626 .wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID,
627 .wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID,
628 .wow_enable_disable_wake_event_cmdid =
629 WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
630 .wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID,
631 .wow_hostwakeup_from_sleep_cmdid =
632 WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
633 .rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID,
634 .rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID,
635 .vdev_spectral_scan_configure_cmdid =
636 WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
637 .vdev_spectral_scan_enable_cmdid =
638 WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
639 .request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID,
640 .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
641 .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
642 .gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID,
643 .csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID,
644 .csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID,
645 .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
646 .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
647 .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
648 .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
649 .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
650 .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
651 .echo_cmdid = WMI_10_4_ECHO_CMDID,
652 .pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID,
653 .dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID,
654 .pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID,
655 .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
656 .vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID,
657 .vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID,
658 .force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID,
659 .gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID,
660 .gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID,
661 .pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID,
662 .vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED,
663 .adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED,
664 .scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID,
665 .vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID,
666 .vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID,
667 .wlan_peer_caching_add_peer_cmdid =
668 WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID,
669 .wlan_peer_caching_evict_peer_cmdid =
670 WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID,
671 .wlan_peer_caching_restore_peer_cmdid =
672 WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID,
673 .wlan_peer_caching_print_all_peers_info_cmdid =
674 WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID,
675 .peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID,
676 .peer_add_proxy_sta_entry_cmdid =
677 WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID,
678 .rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID,
679 .oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID,
680 .nan_cmdid = WMI_10_4_NAN_CMDID,
681 .vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID,
682 .qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID,
683 .pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID,
684 .pdev_smart_ant_set_rx_antenna_cmdid =
685 WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID,
686 .peer_smart_ant_set_tx_antenna_cmdid =
687 WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID,
688 .peer_smart_ant_set_train_info_cmdid =
689 WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID,
690 .peer_smart_ant_set_node_config_ops_cmdid =
691 WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID,
692 .pdev_set_antenna_switch_table_cmdid =
693 WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID,
694 .pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID,
695 .pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID,
696 .pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID,
697 .pdev_ratepwr_chainmsk_table_cmdid =
698 WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID,
699 .pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID,
700 .tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID,
701 .fwtest_cmdid = WMI_10_4_FWTEST_CMDID,
702 .vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID,
703 .peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID,
704 .pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID,
705 .pdev_get_ani_ofdm_config_cmdid =
706 WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID,
707 .pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID,
708 .pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID,
709 .pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID,
710 .pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID,
711 .vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID,
712 .pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID,
713 .vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID,
714 .vdev_filter_neighbor_rx_packets_cmdid =
715 WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID,
716 .mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID,
717 .set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID,
718 .pdev_bss_chan_info_request_cmdid =
719 WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
720 .ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID,
721 .vdev_set_ie_cmdid = WMI_10_4_VDEV_SET_IE_CMDID,
722 .set_lteu_config_cmdid = WMI_10_4_SET_LTEU_CONFIG_CMDID,
723 .atf_ssid_grouping_request_cmdid =
724 WMI_10_4_ATF_SSID_GROUPING_REQUEST_CMDID,
725 .peer_atf_ext_request_cmdid = WMI_10_4_PEER_ATF_EXT_REQUEST_CMDID,
726 .set_periodic_channel_stats_cfg_cmdid =
727 WMI_10_4_SET_PERIODIC_CHANNEL_STATS_CONFIG,
728 .peer_bwf_request_cmdid = WMI_10_4_PEER_BWF_REQUEST_CMDID,
729 .btcoex_cfg_cmdid = WMI_10_4_BTCOEX_CFG_CMDID,
730 .peer_tx_mu_txmit_count_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_COUNT_CMDID,
731 .peer_tx_mu_txmit_rstcnt_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_RSTCNT_CMDID,
732 .peer_gid_userpos_list_cmdid = WMI_10_4_PEER_GID_USERPOS_LIST_CMDID,
733 .pdev_check_cal_version_cmdid = WMI_10_4_PDEV_CHECK_CAL_VERSION_CMDID,
734 .coex_version_cfg_cmid = WMI_10_4_COEX_VERSION_CFG_CMID,
735 .pdev_get_rx_filter_cmdid = WMI_10_4_PDEV_GET_RX_FILTER_CMDID,
736 .pdev_extended_nss_cfg_cmdid = WMI_10_4_PDEV_EXTENDED_NSS_CFG_CMDID,
737 .vdev_set_scan_nac_rssi_cmdid = WMI_10_4_VDEV_SET_SCAN_NAC_RSSI_CMDID,
738 .prog_gpio_band_select_cmdid = WMI_10_4_PROG_GPIO_BAND_SELECT_CMDID,
739 .config_smart_logging_cmdid = WMI_10_4_CONFIG_SMART_LOGGING_CMDID,
740 .debug_fatal_condition_cmdid = WMI_10_4_DEBUG_FATAL_CONDITION_CMDID,
741 .get_tsf_timer_cmdid = WMI_10_4_GET_TSF_TIMER_CMDID,
742 .pdev_get_tpc_table_cmdid = WMI_10_4_PDEV_GET_TPC_TABLE_CMDID,
743 .vdev_sifs_trigger_time_cmdid = WMI_10_4_VDEV_SIFS_TRIGGER_TIME_CMDID,
744 .pdev_wds_entry_list_cmdid = WMI_10_4_PDEV_WDS_ENTRY_LIST_CMDID,
745 .tdls_set_state_cmdid = WMI_10_4_TDLS_SET_STATE_CMDID,
746 .tdls_peer_update_cmdid = WMI_10_4_TDLS_PEER_UPDATE_CMDID,
747 .tdls_set_offchan_mode_cmdid = WMI_10_4_TDLS_SET_OFFCHAN_MODE_CMDID,
750 /* MAIN WMI VDEV param map */
751 static struct wmi_vdev_param_map wmi_vdev_param_map = {
752 .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
753 .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
754 .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL,
755 .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL,
756 .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE,
757 .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE,
758 .slot_time = WMI_VDEV_PARAM_SLOT_TIME,
759 .preamble = WMI_VDEV_PARAM_PREAMBLE,
760 .swba_time = WMI_VDEV_PARAM_SWBA_TIME,
761 .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD,
762 .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME,
763 .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL,
764 .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD,
765 .wmi_vdev_oc_scheduler_air_time_limit =
766 WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
767 .wds = WMI_VDEV_PARAM_WDS,
768 .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW,
769 .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX,
770 .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
771 .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
772 .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM,
773 .chwidth = WMI_VDEV_PARAM_CHWIDTH,
774 .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET,
775 .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION,
776 .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT,
777 .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE,
778 .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE,
779 .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE,
780 .sgi = WMI_VDEV_PARAM_SGI,
781 .ldpc = WMI_VDEV_PARAM_LDPC,
782 .tx_stbc = WMI_VDEV_PARAM_TX_STBC,
783 .rx_stbc = WMI_VDEV_PARAM_RX_STBC,
784 .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD,
785 .def_keyid = WMI_VDEV_PARAM_DEF_KEYID,
786 .nss = WMI_VDEV_PARAM_NSS,
787 .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE,
788 .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE,
789 .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE,
790 .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE,
791 .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
792 .ap_keepalive_min_idle_inactive_time_secs =
793 WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
794 .ap_keepalive_max_idle_inactive_time_secs =
795 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
796 .ap_keepalive_max_unresponsive_time_secs =
797 WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
798 .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS,
799 .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED,
800 .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS,
801 .txbf = WMI_VDEV_PARAM_TXBF,
802 .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE,
803 .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY,
804 .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE,
805 .ap_detect_out_of_sync_sleeping_sta_time_secs =
806 WMI_VDEV_PARAM_UNSUPPORTED,
807 .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
808 .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
809 .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
810 .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
811 .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
812 .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
813 .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
814 .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
815 .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
816 .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
817 .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
818 .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
819 .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
820 .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
821 .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
822 .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
825 /* 10.X WMI VDEV param map */
826 static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
827 .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
828 .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
829 .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
830 .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
831 .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
832 .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
833 .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
834 .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
835 .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
836 .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
837 .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
838 .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
839 .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
840 .wmi_vdev_oc_scheduler_air_time_limit =
841 WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
842 .wds = WMI_10X_VDEV_PARAM_WDS,
843 .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
844 .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
845 .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
846 .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
847 .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
848 .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
849 .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
850 .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
851 .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
852 .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
853 .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
854 .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
855 .sgi = WMI_10X_VDEV_PARAM_SGI,
856 .ldpc = WMI_10X_VDEV_PARAM_LDPC,
857 .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
858 .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
859 .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
860 .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
861 .nss = WMI_10X_VDEV_PARAM_NSS,
862 .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
863 .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
864 .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
865 .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
866 .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
867 .ap_keepalive_min_idle_inactive_time_secs =
868 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
869 .ap_keepalive_max_idle_inactive_time_secs =
870 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
871 .ap_keepalive_max_unresponsive_time_secs =
872 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
873 .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
874 .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
875 .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
876 .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
877 .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
878 .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
879 .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
880 .ap_detect_out_of_sync_sleeping_sta_time_secs =
881 WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
882 .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
883 .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
884 .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
885 .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
886 .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
887 .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
888 .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
889 .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
890 .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
891 .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
892 .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
893 .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
894 .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
895 .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
896 .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
897 .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
900 static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
901 .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
902 .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
903 .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
904 .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
905 .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
906 .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
907 .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
908 .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
909 .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
910 .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
911 .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
912 .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
913 .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
914 .wmi_vdev_oc_scheduler_air_time_limit =
915 WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
916 .wds = WMI_10X_VDEV_PARAM_WDS,
917 .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
918 .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
919 .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
920 .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
921 .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
922 .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
923 .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
924 .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
925 .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
926 .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
927 .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
928 .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
929 .sgi = WMI_10X_VDEV_PARAM_SGI,
930 .ldpc = WMI_10X_VDEV_PARAM_LDPC,
931 .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
932 .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
933 .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
934 .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
935 .nss = WMI_10X_VDEV_PARAM_NSS,
936 .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
937 .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
938 .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
939 .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
940 .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
941 .ap_keepalive_min_idle_inactive_time_secs =
942 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
943 .ap_keepalive_max_idle_inactive_time_secs =
944 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
945 .ap_keepalive_max_unresponsive_time_secs =
946 WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
947 .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
948 .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
949 .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
950 .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
951 .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
952 .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
953 .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
954 .ap_detect_out_of_sync_sleeping_sta_time_secs =
955 WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
956 .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
957 .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
958 .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
959 .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
960 .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
961 .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
962 .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
963 .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
964 .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
965 .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
966 .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
967 .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
968 .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
969 .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
970 .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
971 .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
974 static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
975 .rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD,
976 .fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
977 .beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL,
978 .listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL,
979 .multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE,
980 .mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE,
981 .slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME,
982 .preamble = WMI_10_4_VDEV_PARAM_PREAMBLE,
983 .swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME,
984 .wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD,
985 .wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME,
986 .wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL,
987 .dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD,
988 .wmi_vdev_oc_scheduler_air_time_limit =
989 WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
990 .wds = WMI_10_4_VDEV_PARAM_WDS,
991 .atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW,
992 .bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX,
993 .bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT,
994 .bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT,
995 .feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM,
996 .chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH,
997 .chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET,
998 .disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION,
999 .sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT,
1000 .mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE,
1001 .protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE,
1002 .fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE,
1003 .sgi = WMI_10_4_VDEV_PARAM_SGI,
1004 .ldpc = WMI_10_4_VDEV_PARAM_LDPC,
1005 .tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC,
1006 .rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC,
1007 .intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD,
1008 .def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID,
1009 .nss = WMI_10_4_VDEV_PARAM_NSS,
1010 .bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE,
1011 .mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE,
1012 .mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE,
1013 .dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE,
1014 .unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
1015 .ap_keepalive_min_idle_inactive_time_secs =
1016 WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
1017 .ap_keepalive_max_idle_inactive_time_secs =
1018 WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
1019 .ap_keepalive_max_unresponsive_time_secs =
1020 WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
1021 .ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS,
1022 .mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET,
1023 .enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS,
1024 .txbf = WMI_10_4_VDEV_PARAM_TXBF,
1025 .packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE,
1026 .drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY,
1027 .tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE,
1028 .ap_detect_out_of_sync_sleeping_sta_time_secs =
1029 WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
1030 .rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES,
1031 .cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR,
1032 .mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET,
1033 .rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE,
1034 .vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK,
1035 .vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK,
1036 .early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
1037 .early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
1038 .early_rx_bmiss_sample_cycle =
1039 WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
1040 .early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP,
1041 .early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP,
1042 .early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
1043 .proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA,
1044 .meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC,
1045 .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE,
1046 .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK,
1047 .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
1048 .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
1051 static struct wmi_pdev_param_map wmi_pdev_param_map = {
1052 .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
1053 .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
1054 .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
1055 .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
1056 .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
1057 .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
1058 .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
1059 .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1060 .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
1061 .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
1062 .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1063 .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
1064 .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
1065 .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1066 .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
1067 .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
1068 .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
1069 .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
1070 .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
1071 .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1072 .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1073 .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
1074 .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1075 .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
1076 .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
1077 .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1078 .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1079 .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1080 .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1081 .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1082 .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1083 .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1084 .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1085 .pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
1086 .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
1087 .dcs = WMI_PDEV_PARAM_DCS,
1088 .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
1089 .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
1090 .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
1091 .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
1092 .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
1093 .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
1094 .proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
1095 .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
1096 .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
1097 .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1098 .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
1099 .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1100 .cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
1101 .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1102 .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1103 .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1104 .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1105 .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1106 .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1107 .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1108 .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1109 .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1110 .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1111 .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1112 .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1113 .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1114 .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1115 .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1116 .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1117 .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1118 .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1119 .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1120 .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1121 .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1122 .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1123 .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1124 .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1125 .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1126 .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1127 .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1128 .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1129 .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1130 .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1131 .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1132 .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1133 .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1134 .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1135 .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1136 .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1137 .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1138 .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1139 .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1140 .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1141 .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1142 .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1143 .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1146 static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
1147 .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
1148 .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
1149 .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
1150 .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
1151 .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
1152 .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
1153 .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
1154 .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1155 .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
1156 .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
1157 .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1158 .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
1159 .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
1160 .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1161 .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
1162 .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
1163 .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
1164 .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
1165 .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
1166 .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1167 .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1168 .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
1169 .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1170 .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
1171 .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
1172 .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
1173 .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
1174 .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
1175 .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
1176 .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1177 .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1178 .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1179 .bcnflt_stats_update_period =
1180 WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1181 .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
1182 .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
1183 .dcs = WMI_10X_PDEV_PARAM_DCS,
1184 .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
1185 .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
1186 .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
1187 .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
1188 .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
1189 .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
1190 .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
1191 .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
1192 .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
1193 .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
1194 .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
1195 .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
1196 .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1197 .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1198 .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1199 .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1200 .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1201 .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1202 .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1203 .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1204 .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1205 .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1206 .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1207 .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1208 .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1209 .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1210 .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1211 .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1212 .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1213 .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1214 .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1215 .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1216 .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1217 .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1218 .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1219 .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1220 .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1221 .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1222 .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1223 .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1224 .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1225 .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1226 .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1227 .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1228 .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1229 .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1230 .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1231 .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1232 .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1233 .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1234 .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1235 .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1236 .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1237 .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1238 .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1239 .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1242 static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = {
1243 .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
1244 .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
1245 .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
1246 .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
1247 .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
1248 .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
1249 .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
1250 .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1251 .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
1252 .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
1253 .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1254 .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
1255 .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
1256 .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1257 .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
1258 .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
1259 .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
1260 .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
1261 .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
1262 .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1263 .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1264 .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
1265 .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1266 .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
1267 .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
1268 .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
1269 .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
1270 .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
1271 .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
1272 .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1273 .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1274 .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1275 .bcnflt_stats_update_period =
1276 WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1277 .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
1278 .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
1279 .dcs = WMI_10X_PDEV_PARAM_DCS,
1280 .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
1281 .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
1282 .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
1283 .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
1284 .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
1285 .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
1286 .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
1287 .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
1288 .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
1289 .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
1290 .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
1291 .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
1292 .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
1293 .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
1294 .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1295 .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
1296 .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
1297 .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1298 .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
1299 .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
1300 .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
1301 .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1302 .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
1303 .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1304 .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
1305 .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1306 .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
1307 .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
1308 .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1309 .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1310 .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1311 .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1312 .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1313 .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
1314 .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
1315 .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
1316 .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
1317 .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1318 .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
1319 .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
1320 .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
1321 .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
1322 .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
1323 .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
1324 .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
1325 .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
1326 .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
1327 .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
1328 .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
1329 .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
1330 .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
1331 .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
1332 .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
1333 .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1334 .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
1335 .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
1338 /* firmware 10.2 specific mappings */
1339 static struct wmi_cmd_map wmi_10_2_cmd_map = {
1340 .init_cmdid = WMI_10_2_INIT_CMDID,
1341 .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
1342 .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
1343 .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
1344 .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
1345 .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED,
1346 .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
1347 .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
1348 .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
1349 .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
1350 .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
1351 .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
1352 .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
1353 .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
1354 .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
1355 .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
1356 .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
1357 .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
1358 .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
1359 .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
1360 .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
1361 .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
1362 .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
1363 .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
1364 .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
1365 .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
1366 .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
1367 .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
1368 .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
1369 .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
1370 .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
1371 .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
1372 .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
1373 .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
1374 .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
1375 .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
1376 .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
1377 .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
1378 .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
1379 .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
1380 .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
1381 .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
1382 .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
1383 .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
1384 .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
1385 .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
1386 .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
1387 .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
1388 .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
1389 .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
1390 .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
1391 .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
1392 .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
1393 .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
1394 .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
1395 .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
1396 .roam_scan_rssi_change_threshold =
1397 WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
1398 .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
1399 .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
1400 .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
1401 .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
1402 .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
1403 .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
1404 .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
1405 .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
1406 .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
1407 .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
1408 .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
1409 .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
1410 .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
1411 .wlan_profile_set_hist_intvl_cmdid =
1412 WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
1413 .wlan_profile_get_profile_data_cmdid =
1414 WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
1415 .wlan_profile_enable_profile_id_cmdid =
1416 WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
1417 .wlan_profile_list_profile_id_cmdid =
1418 WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
1419 .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
1420 .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
1421 .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
1422 .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
1423 .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
1424 .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
1425 .wow_enable_disable_wake_event_cmdid =
1426 WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
1427 .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
1428 .wow_hostwakeup_from_sleep_cmdid =
1429 WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
1430 .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
1431 .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
1432 .vdev_spectral_scan_configure_cmdid =
1433 WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
1434 .vdev_spectral_scan_enable_cmdid =
1435 WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
1436 .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
1437 .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
1438 .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
1439 .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
1440 .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
1441 .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
1442 .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
1443 .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
1444 .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
1445 .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
1446 .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
1447 .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
1448 .echo_cmdid = WMI_10_2_ECHO_CMDID,
1449 .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
1450 .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
1451 .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
1452 .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
1453 .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1454 .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1455 .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
1456 .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
1457 .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
1458 .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
1459 .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
1460 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
1461 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
1462 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
1463 .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
1464 .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
1465 .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
1466 .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
1467 .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
1468 .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
1469 .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
1470 .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
1471 .nan_cmdid = WMI_CMD_UNSUPPORTED,
1472 .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
1473 .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
1474 .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
1475 .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1476 .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
1477 .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
1478 .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
1479 .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
1480 .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
1481 .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
1482 .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
1483 .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
1484 .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
1485 .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
1486 .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
1487 .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1488 .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
1489 .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
1490 .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
1491 .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
1492 .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED,
1495 static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
1496 .tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK,
1497 .rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK,
1498 .txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G,
1499 .txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G,
1500 .txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE,
1501 .beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE,
1502 .beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE,
1503 .resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
1504 .protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE,
1505 .dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW,
1506 .non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
1507 .agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH,
1508 .sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH,
1509 .ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING,
1510 .ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE,
1511 .ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE,
1512 .ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK,
1513 .ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI,
1514 .ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO,
1515 .ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
1516 .ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
1517 .ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE,
1518 .ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
1519 .l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE,
1520 .dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE,
1521 .pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
1522 .pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK,
1523 .pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
1524 .pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
1525 .pdev_stats_update_period =
1526 WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
1527 .vdev_stats_update_period =
1528 WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
1529 .peer_stats_update_period =
1530 WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
1531 .bcnflt_stats_update_period =
1532 WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
1533 .pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS,
1534 .arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE,
1535 .dcs = WMI_10_4_PDEV_PARAM_DCS,
1536 .ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE,
1537 .ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD,
1538 .ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD,
1539 .ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL,
1540 .ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL,
1541 .dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN,
1542 .proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA,
1543 .idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG,
1544 .power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP,
1545 .fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET,
1546 .burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR,
1547 .burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE,
1548 .cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD,
1549 .aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST,
1550 .rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE,
1551 .smart_antenna_default_antenna =
1552 WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA,
1553 .igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE,
1554 .igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID,
1555 .antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN,
1556 .rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER,
1557 .set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID,
1558 .proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE,
1559 .set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE,
1560 .set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER,
1561 .remove_mcast2ucast_buffer =
1562 WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER,
1563 .peer_sta_ps_statechg_enable =
1564 WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE,
1565 .igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE,
1566 .block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS,
1567 .set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID,
1568 .set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID,
1569 .set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID,
1570 .txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID,
1571 .set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID,
1572 .set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID,
1573 .en_stats = WMI_10_4_PDEV_PARAM_EN_STATS,
1574 .mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY,
1575 .noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION,
1576 .noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD,
1577 .dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE,
1578 .set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO,
1579 .atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH,
1580 .atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION,
1581 .ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN,
1582 .mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT,
1583 .sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL,
1584 .signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G,
1585 .signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G,
1586 .enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU,
1587 .enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU,
1588 .cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD,
1589 .rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE,
1590 .pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET,
1591 .wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET,
1592 .arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR,
1593 .arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR,
1594 .enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
1597 static const struct wmi_peer_flags_map wmi_peer_flags_map = {
1598 .auth = WMI_PEER_AUTH,
1599 .qos = WMI_PEER_QOS,
1600 .need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY,
1601 .need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY,
1602 .apsd = WMI_PEER_APSD,
1604 .bw40 = WMI_PEER_40MHZ,
1605 .stbc = WMI_PEER_STBC,
1606 .ldbc = WMI_PEER_LDPC,
1607 .dyn_mimops = WMI_PEER_DYN_MIMOPS,
1608 .static_mimops = WMI_PEER_STATIC_MIMOPS,
1609 .spatial_mux = WMI_PEER_SPATIAL_MUX,
1610 .vht = WMI_PEER_VHT,
1611 .bw80 = WMI_PEER_80MHZ,
1612 .vht_2g = WMI_PEER_VHT_2G,
1613 .pmf = WMI_PEER_PMF,
1614 .bw160 = WMI_PEER_160MHZ,
1617 static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = {
1618 .auth = WMI_10X_PEER_AUTH,
1619 .qos = WMI_10X_PEER_QOS,
1620 .need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY,
1621 .need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY,
1622 .apsd = WMI_10X_PEER_APSD,
1623 .ht = WMI_10X_PEER_HT,
1624 .bw40 = WMI_10X_PEER_40MHZ,
1625 .stbc = WMI_10X_PEER_STBC,
1626 .ldbc = WMI_10X_PEER_LDPC,
1627 .dyn_mimops = WMI_10X_PEER_DYN_MIMOPS,
1628 .static_mimops = WMI_10X_PEER_STATIC_MIMOPS,
1629 .spatial_mux = WMI_10X_PEER_SPATIAL_MUX,
1630 .vht = WMI_10X_PEER_VHT,
1631 .bw80 = WMI_10X_PEER_80MHZ,
1632 .bw160 = WMI_10X_PEER_160MHZ,
1635 static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = {
1636 .auth = WMI_10_2_PEER_AUTH,
1637 .qos = WMI_10_2_PEER_QOS,
1638 .need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY,
1639 .need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY,
1640 .apsd = WMI_10_2_PEER_APSD,
1641 .ht = WMI_10_2_PEER_HT,
1642 .bw40 = WMI_10_2_PEER_40MHZ,
1643 .stbc = WMI_10_2_PEER_STBC,
1644 .ldbc = WMI_10_2_PEER_LDPC,
1645 .dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS,
1646 .static_mimops = WMI_10_2_PEER_STATIC_MIMOPS,
1647 .spatial_mux = WMI_10_2_PEER_SPATIAL_MUX,
1648 .vht = WMI_10_2_PEER_VHT,
1649 .bw80 = WMI_10_2_PEER_80MHZ,
1650 .vht_2g = WMI_10_2_PEER_VHT_2G,
1651 .pmf = WMI_10_2_PEER_PMF,
1652 .bw160 = WMI_10_2_PEER_160MHZ,
1655 void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
1656 const struct wmi_channel_arg *arg)
1660 memset(ch, 0, sizeof(*ch));
1663 flags |= WMI_CHAN_FLAG_PASSIVE;
1664 if (arg->allow_ibss)
1665 flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
1667 flags |= WMI_CHAN_FLAG_ALLOW_HT;
1669 flags |= WMI_CHAN_FLAG_ALLOW_VHT;
1671 flags |= WMI_CHAN_FLAG_HT40_PLUS;
1672 if (arg->chan_radar)
1673 flags |= WMI_CHAN_FLAG_DFS;
1675 ch->mhz = __cpu_to_le32(arg->freq);
1676 ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1);
1677 if (arg->mode == MODE_11AC_VHT80_80)
1678 ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq2);
1680 ch->band_center_freq2 = 0;
1681 ch->min_power = arg->min_power;
1682 ch->max_power = arg->max_power;
1683 ch->reg_power = arg->max_reg_power;
1684 ch->antenna_max = arg->max_antenna_gain;
1685 ch->max_tx_power = arg->max_power;
1687 /* mode & flags share storage */
1688 ch->mode = arg->mode;
1689 ch->flags |= __cpu_to_le32(flags);
1692 int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
1694 unsigned long time_left;
1696 time_left = wait_for_completion_timeout(&ar->wmi.service_ready,
1697 WMI_SERVICE_READY_TIMEOUT_HZ);
1703 int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
1705 unsigned long time_left;
1707 time_left = wait_for_completion_timeout(&ar->wmi.unified_ready,
1708 WMI_UNIFIED_READY_TIMEOUT_HZ);
1714 struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len)
1716 struct sk_buff *skb;
1717 u32 round_len = roundup(len, 4);
1719 skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len);
1723 skb_reserve(skb, WMI_SKB_HEADROOM);
1724 if (!IS_ALIGNED((unsigned long)skb->data, 4))
1725 ath10k_warn(ar, "Unaligned WMI skb\n");
1727 skb_put(skb, round_len);
1728 memset(skb->data, 0, round_len);
1733 static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
1738 int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
1741 struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
1742 struct wmi_cmd_hdr *cmd_hdr;
1746 if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
1749 cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID);
1751 cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
1752 cmd_hdr->cmd_id = __cpu_to_le32(cmd);
1754 memset(skb_cb, 0, sizeof(*skb_cb));
1755 trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len);
1756 ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
1764 skb_pull(skb, sizeof(struct wmi_cmd_hdr));
1768 static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
1770 struct ath10k *ar = arvif->ar;
1771 struct ath10k_skb_cb *cb;
1772 struct sk_buff *bcn;
1777 spin_lock_bh(&ar->data_lock);
1779 bcn = arvif->beacon;
1784 cb = ATH10K_SKB_CB(bcn);
1786 switch (arvif->beacon_state) {
1787 case ATH10K_BEACON_SENDING:
1788 case ATH10K_BEACON_SENT:
1790 case ATH10K_BEACON_SCHEDULED:
1791 arvif->beacon_state = ATH10K_BEACON_SENDING;
1792 spin_unlock_bh(&ar->data_lock);
1794 dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO);
1795 deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB);
1796 ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar,
1798 bcn->data, bcn->len,
1803 spin_lock_bh(&ar->data_lock);
1806 arvif->beacon_state = ATH10K_BEACON_SENT;
1808 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
1812 spin_unlock_bh(&ar->data_lock);
1815 static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
1816 struct ieee80211_vif *vif)
1818 struct ath10k_vif *arvif = (void *)vif->drv_priv;
1820 ath10k_wmi_tx_beacon_nowait(arvif);
1823 static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar)
1825 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1826 IEEE80211_IFACE_ITER_NORMAL,
1827 ath10k_wmi_tx_beacons_iter,
1831 static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
1833 /* try to send pending beacons first. they take priority */
1834 ath10k_wmi_tx_beacons_nowait(ar);
1836 wake_up(&ar->wmi.tx_credits_wq);
1839 int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
1841 int ret = -EOPNOTSUPP;
1845 if (cmd_id == WMI_CMD_UNSUPPORTED) {
1846 ath10k_warn(ar, "wmi command %d is not supported by firmware\n",
1851 wait_event_timeout(ar->wmi.tx_credits_wq, ({
1852 /* try to send pending beacons first. they take priority */
1853 ath10k_wmi_tx_beacons_nowait(ar);
1855 ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
1857 if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
1864 dev_kfree_skb_any(skb);
1869 static struct sk_buff *
1870 ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
1872 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
1873 struct ath10k_vif *arvif;
1874 struct wmi_mgmt_tx_cmd *cmd;
1875 struct ieee80211_hdr *hdr;
1876 struct sk_buff *skb;
1879 u32 buf_len = msdu->len;
1882 hdr = (struct ieee80211_hdr *)msdu->data;
1883 fc = le16_to_cpu(hdr->frame_control);
1886 arvif = (void *)cb->vif->drv_priv;
1887 vdev_id = arvif->vdev_id;
1892 if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
1893 return ERR_PTR(-EINVAL);
1895 len = sizeof(cmd->hdr) + msdu->len;
1897 if ((ieee80211_is_action(hdr->frame_control) ||
1898 ieee80211_is_deauth(hdr->frame_control) ||
1899 ieee80211_is_disassoc(hdr->frame_control)) &&
1900 ieee80211_has_protected(hdr->frame_control)) {
1901 len += IEEE80211_CCMP_MIC_LEN;
1902 buf_len += IEEE80211_CCMP_MIC_LEN;
1905 len = round_up(len, 4);
1907 skb = ath10k_wmi_alloc_skb(ar, len);
1909 return ERR_PTR(-ENOMEM);
1911 cmd = (struct wmi_mgmt_tx_cmd *)skb->data;
1913 cmd->hdr.vdev_id = __cpu_to_le32(vdev_id);
1914 cmd->hdr.tx_rate = 0;
1915 cmd->hdr.tx_power = 0;
1916 cmd->hdr.buf_len = __cpu_to_le32(buf_len);
1918 ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr));
1919 memcpy(cmd->buf, msdu->data, msdu->len);
1921 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n",
1922 msdu, skb->len, fc & IEEE80211_FCTL_FTYPE,
1923 fc & IEEE80211_FCTL_STYPE);
1924 trace_ath10k_tx_hdr(ar, skb->data, skb->len);
1925 trace_ath10k_tx_payload(ar, skb->data, skb->len);
1930 static void ath10k_wmi_event_scan_started(struct ath10k *ar)
1932 lockdep_assert_held(&ar->data_lock);
1934 switch (ar->scan.state) {
1935 case ATH10K_SCAN_IDLE:
1936 case ATH10K_SCAN_RUNNING:
1937 case ATH10K_SCAN_ABORTING:
1938 ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n",
1939 ath10k_scan_state_str(ar->scan.state),
1942 case ATH10K_SCAN_STARTING:
1943 ar->scan.state = ATH10K_SCAN_RUNNING;
1945 if (ar->scan.is_roc)
1946 ieee80211_ready_on_channel(ar->hw);
1948 complete(&ar->scan.started);
1953 static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
1955 lockdep_assert_held(&ar->data_lock);
1957 switch (ar->scan.state) {
1958 case ATH10K_SCAN_IDLE:
1959 case ATH10K_SCAN_RUNNING:
1960 case ATH10K_SCAN_ABORTING:
1961 ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
1962 ath10k_scan_state_str(ar->scan.state),
1965 case ATH10K_SCAN_STARTING:
1966 complete(&ar->scan.started);
1967 __ath10k_scan_finish(ar);
1972 static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
1974 lockdep_assert_held(&ar->data_lock);
1976 switch (ar->scan.state) {
1977 case ATH10K_SCAN_IDLE:
1978 case ATH10K_SCAN_STARTING:
1979 /* One suspected reason scan can be completed while starting is
1980 * if firmware fails to deliver all scan events to the host,
1981 * e.g. when transport pipe is full. This has been observed
1982 * with spectral scan phyerr events starving wmi transport
1983 * pipe. In such case the "scan completed" event should be (and
1984 * is) ignored by the host as it may be just firmware's scan
1985 * state machine recovering.
1987 ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n",
1988 ath10k_scan_state_str(ar->scan.state),
1991 case ATH10K_SCAN_RUNNING:
1992 case ATH10K_SCAN_ABORTING:
1993 __ath10k_scan_finish(ar);
1998 static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar)
2000 lockdep_assert_held(&ar->data_lock);
2002 switch (ar->scan.state) {
2003 case ATH10K_SCAN_IDLE:
2004 case ATH10K_SCAN_STARTING:
2005 ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n",
2006 ath10k_scan_state_str(ar->scan.state),
2009 case ATH10K_SCAN_RUNNING:
2010 case ATH10K_SCAN_ABORTING:
2011 ar->scan_channel = NULL;
2016 static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq)
2018 lockdep_assert_held(&ar->data_lock);
2020 switch (ar->scan.state) {
2021 case ATH10K_SCAN_IDLE:
2022 case ATH10K_SCAN_STARTING:
2023 ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n",
2024 ath10k_scan_state_str(ar->scan.state),
2027 case ATH10K_SCAN_RUNNING:
2028 case ATH10K_SCAN_ABORTING:
2029 ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);
2031 if (ar->scan.is_roc && ar->scan.roc_freq == freq)
2032 complete(&ar->scan.on_channel);
2038 ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type,
2039 enum wmi_scan_completion_reason reason)
2042 case WMI_SCAN_EVENT_STARTED:
2044 case WMI_SCAN_EVENT_COMPLETED:
2046 case WMI_SCAN_REASON_COMPLETED:
2048 case WMI_SCAN_REASON_CANCELLED:
2049 return "completed [cancelled]";
2050 case WMI_SCAN_REASON_PREEMPTED:
2051 return "completed [preempted]";
2052 case WMI_SCAN_REASON_TIMEDOUT:
2053 return "completed [timedout]";
2054 case WMI_SCAN_REASON_INTERNAL_FAILURE:
2055 return "completed [internal err]";
2056 case WMI_SCAN_REASON_MAX:
2059 return "completed [unknown]";
2060 case WMI_SCAN_EVENT_BSS_CHANNEL:
2061 return "bss channel";
2062 case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
2063 return "foreign channel";
2064 case WMI_SCAN_EVENT_DEQUEUED:
2066 case WMI_SCAN_EVENT_PREEMPTED:
2068 case WMI_SCAN_EVENT_START_FAILED:
2069 return "start failed";
2070 case WMI_SCAN_EVENT_RESTARTED:
2072 case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
2073 return "foreign channel exit";
2079 static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb,
2080 struct wmi_scan_ev_arg *arg)
2082 struct wmi_scan_event *ev = (void *)skb->data;
2084 if (skb->len < sizeof(*ev))
2087 skb_pull(skb, sizeof(*ev));
2088 arg->event_type = ev->event_type;
2089 arg->reason = ev->reason;
2090 arg->channel_freq = ev->channel_freq;
2091 arg->scan_req_id = ev->scan_req_id;
2092 arg->scan_id = ev->scan_id;
2093 arg->vdev_id = ev->vdev_id;
2098 int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
2100 struct wmi_scan_ev_arg arg = {};
2101 enum wmi_scan_event_type event_type;
2102 enum wmi_scan_completion_reason reason;
2109 ret = ath10k_wmi_pull_scan(ar, skb, &arg);
2111 ath10k_warn(ar, "failed to parse scan event: %d\n", ret);
2115 event_type = __le32_to_cpu(arg.event_type);
2116 reason = __le32_to_cpu(arg.reason);
2117 freq = __le32_to_cpu(arg.channel_freq);
2118 req_id = __le32_to_cpu(arg.scan_req_id);
2119 scan_id = __le32_to_cpu(arg.scan_id);
2120 vdev_id = __le32_to_cpu(arg.vdev_id);
2122 spin_lock_bh(&ar->data_lock);
2124 ath10k_dbg(ar, ATH10K_DBG_WMI,
2125 "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n",
2126 ath10k_wmi_event_scan_type_str(event_type, reason),
2127 event_type, reason, freq, req_id, scan_id, vdev_id,
2128 ath10k_scan_state_str(ar->scan.state), ar->scan.state);
2130 switch (event_type) {
2131 case WMI_SCAN_EVENT_STARTED:
2132 ath10k_wmi_event_scan_started(ar);
2134 case WMI_SCAN_EVENT_COMPLETED:
2135 ath10k_wmi_event_scan_completed(ar);
2137 case WMI_SCAN_EVENT_BSS_CHANNEL:
2138 ath10k_wmi_event_scan_bss_chan(ar);
2140 case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
2141 ath10k_wmi_event_scan_foreign_chan(ar, freq);
2143 case WMI_SCAN_EVENT_START_FAILED:
2144 ath10k_warn(ar, "received scan start failure event\n");
2145 ath10k_wmi_event_scan_start_failed(ar);
2147 case WMI_SCAN_EVENT_DEQUEUED:
2148 case WMI_SCAN_EVENT_PREEMPTED:
2149 case WMI_SCAN_EVENT_RESTARTED:
2150 case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
2155 spin_unlock_bh(&ar->data_lock);
2159 /* If keys are configured, HW decrypts all frames
2160 * with protected bit set. Mark such frames as decrypted.
2162 static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar,
2163 struct sk_buff *skb,
2164 struct ieee80211_rx_status *status)
2166 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2167 unsigned int hdrlen;
2171 if (!ieee80211_is_auth(hdr->frame_control) ||
2172 !ieee80211_has_protected(hdr->frame_control))
2175 hdrlen = ieee80211_hdrlen(hdr->frame_control);
2176 if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN))
2179 keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT;
2180 addr = ieee80211_get_SA(hdr);
2182 spin_lock_bh(&ar->data_lock);
2183 peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx);
2184 spin_unlock_bh(&ar->data_lock);
2187 ath10k_dbg(ar, ATH10K_DBG_MAC,
2188 "mac wep key present for peer %pM\n", addr);
2189 status->flag |= RX_FLAG_DECRYPTED;
2193 static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
2194 struct wmi_mgmt_rx_ev_arg *arg)
2196 struct wmi_mgmt_rx_event_v1 *ev_v1;
2197 struct wmi_mgmt_rx_event_v2 *ev_v2;
2198 struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
2199 struct wmi_mgmt_rx_ext_info *ext_info;
2204 if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX,
2205 ar->running_fw->fw_file.fw_features)) {
2206 ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data;
2207 ev_hdr = &ev_v2->hdr.v1;
2208 pull_len = sizeof(*ev_v2);
2210 ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data;
2211 ev_hdr = &ev_v1->hdr;
2212 pull_len = sizeof(*ev_v1);
2215 if (skb->len < pull_len)
2218 skb_pull(skb, pull_len);
2219 arg->channel = ev_hdr->channel;
2220 arg->buf_len = ev_hdr->buf_len;
2221 arg->status = ev_hdr->status;
2222 arg->snr = ev_hdr->snr;
2223 arg->phy_mode = ev_hdr->phy_mode;
2224 arg->rate = ev_hdr->rate;
2226 msdu_len = __le32_to_cpu(arg->buf_len);
2227 if (skb->len < msdu_len)
2230 if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
2231 len = ALIGN(le32_to_cpu(arg->buf_len), 4);
2232 ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
2233 memcpy(&arg->ext_info, ext_info,
2234 sizeof(struct wmi_mgmt_rx_ext_info));
2236 /* the WMI buffer might've ended up being padded to 4 bytes due to HTC
2237 * trailer with credit update. Trim the excess garbage.
2239 skb_trim(skb, msdu_len);
2244 static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar,
2245 struct sk_buff *skb,
2246 struct wmi_mgmt_rx_ev_arg *arg)
2248 struct wmi_10_4_mgmt_rx_event *ev;
2249 struct wmi_10_4_mgmt_rx_hdr *ev_hdr;
2252 struct wmi_mgmt_rx_ext_info *ext_info;
2255 ev = (struct wmi_10_4_mgmt_rx_event *)skb->data;
2257 pull_len = sizeof(*ev);
2259 if (skb->len < pull_len)
2262 skb_pull(skb, pull_len);
2263 arg->channel = ev_hdr->channel;
2264 arg->buf_len = ev_hdr->buf_len;
2265 arg->status = ev_hdr->status;
2266 arg->snr = ev_hdr->snr;
2267 arg->phy_mode = ev_hdr->phy_mode;
2268 arg->rate = ev_hdr->rate;
2270 msdu_len = __le32_to_cpu(arg->buf_len);
2271 if (skb->len < msdu_len)
2274 if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) {
2275 len = ALIGN(le32_to_cpu(arg->buf_len), 4);
2276 ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len);
2277 memcpy(&arg->ext_info, ext_info,
2278 sizeof(struct wmi_mgmt_rx_ext_info));
2281 /* Make sure bytes added for padding are removed. */
2282 skb_trim(skb, msdu_len);
2287 static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar,
2288 struct ieee80211_hdr *hdr)
2290 if (!ieee80211_has_protected(hdr->frame_control))
2293 /* FW delivers WEP Shared Auth frame with Protected Bit set and
2294 * encrypted payload. However in case of PMF it delivers decrypted
2295 * frames with Protected Bit set.
2297 if (ieee80211_is_auth(hdr->frame_control))
2300 /* qca99x0 based FW delivers broadcast or multicast management frames
2301 * (ex: group privacy action frames in mesh) as encrypted payload.
2303 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) &&
2304 ar->hw_params.sw_decrypt_mcast_mgmt)
2310 int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
2312 struct wmi_mgmt_rx_ev_arg arg = {};
2313 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
2314 struct ieee80211_hdr *hdr;
2315 struct ieee80211_supported_band *sband;
2325 ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg);
2327 ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret);
2332 channel = __le32_to_cpu(arg.channel);
2333 buf_len = __le32_to_cpu(arg.buf_len);
2334 rx_status = __le32_to_cpu(arg.status);
2335 snr = __le32_to_cpu(arg.snr);
2336 phy_mode = __le32_to_cpu(arg.phy_mode);
2337 rate = __le32_to_cpu(arg.rate);
2339 memset(status, 0, sizeof(*status));
2341 ath10k_dbg(ar, ATH10K_DBG_MGMT,
2342 "event mgmt rx status %08x\n", rx_status);
2344 if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) ||
2345 (rx_status & (WMI_RX_STATUS_ERR_DECRYPT |
2346 WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) {
2351 if (rx_status & WMI_RX_STATUS_ERR_MIC)
2352 status->flag |= RX_FLAG_MMIC_ERROR;
2354 if (rx_status & WMI_RX_STATUS_EXT_INFO) {
2356 __le64_to_cpu(arg.ext_info.rx_mac_timestamp);
2357 status->flag |= RX_FLAG_MACTIME_END;
2359 /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to
2360 * MODE_11B. This means phy_mode is not a reliable source for the band
2363 if (channel >= 1 && channel <= 14) {
2364 status->band = NL80211_BAND_2GHZ;
2365 } else if (channel >= 36 && channel <= 169) {
2366 status->band = NL80211_BAND_5GHZ;
2368 /* Shouldn't happen unless list of advertised channels to
2369 * mac80211 has been changed.
2376 if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ)
2377 ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
2379 sband = &ar->mac.sbands[status->band];
2381 status->freq = ieee80211_channel_to_frequency(channel, status->band);
2382 status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
2383 status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100);
2385 hdr = (struct ieee80211_hdr *)skb->data;
2386 fc = le16_to_cpu(hdr->frame_control);
2388 /* Firmware is guaranteed to report all essential management frames via
2389 * WMI while it can deliver some extra via HTT. Since there can be
2390 * duplicates split the reporting wrt monitor/sniffing.
2392 status->flag |= RX_FLAG_SKIP_MONITOR;
2394 ath10k_wmi_handle_wep_reauth(ar, skb, status);
2396 if (ath10k_wmi_rx_is_decrypted(ar, hdr)) {
2397 status->flag |= RX_FLAG_DECRYPTED;
2399 if (!ieee80211_is_action(hdr->frame_control) &&
2400 !ieee80211_is_deauth(hdr->frame_control) &&
2401 !ieee80211_is_disassoc(hdr->frame_control)) {
2402 status->flag |= RX_FLAG_IV_STRIPPED |
2403 RX_FLAG_MMIC_STRIPPED;
2404 hdr->frame_control = __cpu_to_le16(fc &
2405 ~IEEE80211_FCTL_PROTECTED);
2409 if (ieee80211_is_beacon(hdr->frame_control))
2410 ath10k_mac_handle_beacon(ar, skb);
2412 ath10k_dbg(ar, ATH10K_DBG_MGMT,
2413 "event mgmt rx skb %pK len %d ftype %02x stype %02x\n",
2415 fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE);
2417 ath10k_dbg(ar, ATH10K_DBG_MGMT,
2418 "event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
2419 status->freq, status->band, status->signal,
2422 ieee80211_rx(ar->hw, skb);
2426 static int freq_to_idx(struct ath10k *ar, int freq)
2428 struct ieee80211_supported_band *sband;
2429 int band, ch, idx = 0;
2431 for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
2432 sband = ar->hw->wiphy->bands[band];
2436 for (ch = 0; ch < sband->n_channels; ch++, idx++)
2437 if (sband->channels[ch].center_freq == freq)
2445 static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb,
2446 struct wmi_ch_info_ev_arg *arg)
2448 struct wmi_chan_info_event *ev = (void *)skb->data;
2450 if (skb->len < sizeof(*ev))
2453 skb_pull(skb, sizeof(*ev));
2454 arg->err_code = ev->err_code;
2455 arg->freq = ev->freq;
2456 arg->cmd_flags = ev->cmd_flags;
2457 arg->noise_floor = ev->noise_floor;
2458 arg->rx_clear_count = ev->rx_clear_count;
2459 arg->cycle_count = ev->cycle_count;
2464 static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar,
2465 struct sk_buff *skb,
2466 struct wmi_ch_info_ev_arg *arg)
2468 struct wmi_10_4_chan_info_event *ev = (void *)skb->data;
2470 if (skb->len < sizeof(*ev))
2473 skb_pull(skb, sizeof(*ev));
2474 arg->err_code = ev->err_code;
2475 arg->freq = ev->freq;
2476 arg->cmd_flags = ev->cmd_flags;
2477 arg->noise_floor = ev->noise_floor;
2478 arg->rx_clear_count = ev->rx_clear_count;
2479 arg->cycle_count = ev->cycle_count;
2480 arg->chan_tx_pwr_range = ev->chan_tx_pwr_range;
2481 arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp;
2482 arg->rx_frame_count = ev->rx_frame_count;
2487 void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
2489 struct wmi_ch_info_ev_arg arg = {};
2490 struct survey_info *survey;
2491 u32 err_code, freq, cmd_flags, noise_floor, rx_clear_count, cycle_count;
2494 ret = ath10k_wmi_pull_ch_info(ar, skb, &arg);
2496 ath10k_warn(ar, "failed to parse chan info event: %d\n", ret);
2500 err_code = __le32_to_cpu(arg.err_code);
2501 freq = __le32_to_cpu(arg.freq);
2502 cmd_flags = __le32_to_cpu(arg.cmd_flags);
2503 noise_floor = __le32_to_cpu(arg.noise_floor);
2504 rx_clear_count = __le32_to_cpu(arg.rx_clear_count);
2505 cycle_count = __le32_to_cpu(arg.cycle_count);
2507 ath10k_dbg(ar, ATH10K_DBG_WMI,
2508 "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
2509 err_code, freq, cmd_flags, noise_floor, rx_clear_count,
2512 spin_lock_bh(&ar->data_lock);
2514 switch (ar->scan.state) {
2515 case ATH10K_SCAN_IDLE:
2516 case ATH10K_SCAN_STARTING:
2517 ath10k_warn(ar, "received chan info event without a scan request, ignoring\n");
2519 case ATH10K_SCAN_RUNNING:
2520 case ATH10K_SCAN_ABORTING:
2524 idx = freq_to_idx(ar, freq);
2525 if (idx >= ARRAY_SIZE(ar->survey)) {
2526 ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
2531 if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
2532 if (ar->ch_info_can_report_survey) {
2533 survey = &ar->survey[idx];
2534 survey->noise = noise_floor;
2535 survey->filled = SURVEY_INFO_NOISE_DBM;
2537 ath10k_hw_fill_survey_time(ar,
2541 ar->survey_last_cycle_count,
2542 ar->survey_last_rx_clear_count);
2545 ar->ch_info_can_report_survey = false;
2547 ar->ch_info_can_report_survey = true;
2550 if (!(cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) {
2551 ar->survey_last_rx_clear_count = rx_clear_count;
2552 ar->survey_last_cycle_count = cycle_count;
2556 spin_unlock_bh(&ar->data_lock);
2559 void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
2561 struct wmi_echo_ev_arg arg = {};
2564 ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg);
2566 ath10k_warn(ar, "failed to parse echo: %d\n", ret);
2570 ath10k_dbg(ar, ATH10K_DBG_WMI,
2571 "wmi event echo value 0x%08x\n",
2572 le32_to_cpu(arg.value));
2574 if (le32_to_cpu(arg.value) == ATH10K_WMI_BARRIER_ECHO_ID)
2575 complete(&ar->wmi.barrier);
2578 int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
2580 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
2583 trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);
2588 void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src,
2589 struct ath10k_fw_stats_pdev *dst)
2591 dst->ch_noise_floor = __le32_to_cpu(src->chan_nf);
2592 dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count);
2593 dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count);
2594 dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count);
2595 dst->cycle_count = __le32_to_cpu(src->cycle_count);
2596 dst->phy_err_count = __le32_to_cpu(src->phy_err_count);
2597 dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr);
2600 void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src,
2601 struct ath10k_fw_stats_pdev *dst)
2603 dst->comp_queued = __le32_to_cpu(src->comp_queued);
2604 dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
2605 dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
2606 dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
2607 dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
2608 dst->local_enqued = __le32_to_cpu(src->local_enqued);
2609 dst->local_freed = __le32_to_cpu(src->local_freed);
2610 dst->hw_queued = __le32_to_cpu(src->hw_queued);
2611 dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
2612 dst->underrun = __le32_to_cpu(src->underrun);
2613 dst->tx_abort = __le32_to_cpu(src->tx_abort);
2614 dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
2615 dst->tx_ko = __le32_to_cpu(src->tx_ko);
2616 dst->data_rc = __le32_to_cpu(src->data_rc);
2617 dst->self_triggers = __le32_to_cpu(src->self_triggers);
2618 dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
2619 dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
2620 dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
2621 dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
2622 dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
2623 dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
2624 dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
2628 ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src,
2629 struct ath10k_fw_stats_pdev *dst)
2631 dst->comp_queued = __le32_to_cpu(src->comp_queued);
2632 dst->comp_delivered = __le32_to_cpu(src->comp_delivered);
2633 dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued);
2634 dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued);
2635 dst->wmm_drop = __le32_to_cpu(src->wmm_drop);
2636 dst->local_enqued = __le32_to_cpu(src->local_enqued);
2637 dst->local_freed = __le32_to_cpu(src->local_freed);
2638 dst->hw_queued = __le32_to_cpu(src->hw_queued);
2639 dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
2640 dst->underrun = __le32_to_cpu(src->underrun);
2641 dst->tx_abort = __le32_to_cpu(src->tx_abort);
2642 dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
2643 dst->tx_ko = __le32_to_cpu(src->tx_ko);
2644 dst->data_rc = __le32_to_cpu(src->data_rc);
2645 dst->self_triggers = __le32_to_cpu(src->self_triggers);
2646 dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure);
2647 dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err);
2648 dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry);
2649 dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout);
2650 dst->pdev_resets = __le32_to_cpu(src->pdev_resets);
2651 dst->phy_underrun = __le32_to_cpu(src->phy_underrun);
2652 dst->txop_ovf = __le32_to_cpu(src->txop_ovf);
2653 dst->hw_paused = __le32_to_cpu(src->hw_paused);
2654 dst->seq_posted = __le32_to_cpu(src->seq_posted);
2655 dst->seq_failed_queueing =
2656 __le32_to_cpu(src->seq_failed_queueing);
2657 dst->seq_completed = __le32_to_cpu(src->seq_completed);
2658 dst->seq_restarted = __le32_to_cpu(src->seq_restarted);
2659 dst->mu_seq_posted = __le32_to_cpu(src->mu_seq_posted);
2660 dst->mpdus_sw_flush = __le32_to_cpu(src->mpdus_sw_flush);
2661 dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
2662 dst->mpdus_truncated = __le32_to_cpu(src->mpdus_truncated);
2663 dst->mpdus_ack_failed = __le32_to_cpu(src->mpdus_ack_failed);
2664 dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter);
2665 dst->mpdus_expired = __le32_to_cpu(src->mpdus_expired);
2668 void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src,
2669 struct ath10k_fw_stats_pdev *dst)
2671 dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change);
2672 dst->status_rcvd = __le32_to_cpu(src->status_rcvd);
2673 dst->r0_frags = __le32_to_cpu(src->r0_frags);
2674 dst->r1_frags = __le32_to_cpu(src->r1_frags);
2675 dst->r2_frags = __le32_to_cpu(src->r2_frags);
2676 dst->r3_frags = __le32_to_cpu(src->r3_frags);
2677 dst->htt_msdus = __le32_to_cpu(src->htt_msdus);
2678 dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus);
2679 dst->loc_msdus = __le32_to_cpu(src->loc_msdus);
2680 dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus);
2681 dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu);
2682 dst->phy_errs = __le32_to_cpu(src->phy_errs);
2683 dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop);
2684 dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs);
2687 void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src,
2688 struct ath10k_fw_stats_pdev *dst)
2690 dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad);
2691 dst->rts_bad = __le32_to_cpu(src->rts_bad);
2692 dst->rts_good = __le32_to_cpu(src->rts_good);
2693 dst->fcs_bad = __le32_to_cpu(src->fcs_bad);
2694 dst->no_beacons = __le32_to_cpu(src->no_beacons);
2695 dst->mib_int_count = __le32_to_cpu(src->mib_int_count);
2698 void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src,
2699 struct ath10k_fw_stats_peer *dst)
2701 ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2702 dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2703 dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2707 ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats *src,
2708 struct ath10k_fw_stats_peer *dst)
2710 ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
2711 dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
2712 dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
2713 dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2717 ath10k_wmi_10_4_pull_vdev_stats(const struct wmi_vdev_stats_extd *src,
2718 struct ath10k_fw_stats_vdev_extd *dst)
2720 dst->vdev_id = __le32_to_cpu(src->vdev_id);
2721 dst->ppdu_aggr_cnt = __le32_to_cpu(src->ppdu_aggr_cnt);
2722 dst->ppdu_noack = __le32_to_cpu(src->ppdu_noack);
2723 dst->mpdu_queued = __le32_to_cpu(src->mpdu_queued);
2724 dst->ppdu_nonaggr_cnt = __le32_to_cpu(src->ppdu_nonaggr_cnt);
2725 dst->mpdu_sw_requeued = __le32_to_cpu(src->mpdu_sw_requeued);
2726 dst->mpdu_suc_retry = __le32_to_cpu(src->mpdu_suc_retry);
2727 dst->mpdu_suc_multitry = __le32_to_cpu(src->mpdu_suc_multitry);
2728 dst->mpdu_fail_retry = __le32_to_cpu(src->mpdu_fail_retry);
2729 dst->tx_ftm_suc = __le32_to_cpu(src->tx_ftm_suc);
2730 dst->tx_ftm_suc_retry = __le32_to_cpu(src->tx_ftm_suc_retry);
2731 dst->tx_ftm_fail = __le32_to_cpu(src->tx_ftm_fail);
2732 dst->rx_ftmr_cnt = __le32_to_cpu(src->rx_ftmr_cnt);
2733 dst->rx_ftmr_dup_cnt = __le32_to_cpu(src->rx_ftmr_dup_cnt);
2734 dst->rx_iftmr_cnt = __le32_to_cpu(src->rx_iftmr_cnt);
2735 dst->rx_iftmr_dup_cnt = __le32_to_cpu(src->rx_iftmr_dup_cnt);
2738 static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar,
2739 struct sk_buff *skb,
2740 struct ath10k_fw_stats *stats)
2742 const struct wmi_stats_event *ev = (void *)skb->data;
2743 u32 num_pdev_stats, num_vdev_stats, num_peer_stats;
2746 if (!skb_pull(skb, sizeof(*ev)))
2749 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2750 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2751 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2753 for (i = 0; i < num_pdev_stats; i++) {
2754 const struct wmi_pdev_stats *src;
2755 struct ath10k_fw_stats_pdev *dst;
2757 src = (void *)skb->data;
2758 if (!skb_pull(skb, sizeof(*src)))
2761 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2765 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2766 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2767 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2769 list_add_tail(&dst->list, &stats->pdevs);
2772 /* fw doesn't implement vdev stats */
2774 for (i = 0; i < num_peer_stats; i++) {
2775 const struct wmi_peer_stats *src;
2776 struct ath10k_fw_stats_peer *dst;
2778 src = (void *)skb->data;
2779 if (!skb_pull(skb, sizeof(*src)))
2782 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2786 ath10k_wmi_pull_peer_stats(src, dst);
2787 list_add_tail(&dst->list, &stats->peers);
2793 static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar,
2794 struct sk_buff *skb,
2795 struct ath10k_fw_stats *stats)
2797 const struct wmi_stats_event *ev = (void *)skb->data;
2798 u32 num_pdev_stats, num_vdev_stats, num_peer_stats;
2801 if (!skb_pull(skb, sizeof(*ev)))
2804 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2805 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2806 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2808 for (i = 0; i < num_pdev_stats; i++) {
2809 const struct wmi_10x_pdev_stats *src;
2810 struct ath10k_fw_stats_pdev *dst;
2812 src = (void *)skb->data;
2813 if (!skb_pull(skb, sizeof(*src)))
2816 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2820 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2821 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2822 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2823 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
2825 list_add_tail(&dst->list, &stats->pdevs);
2828 /* fw doesn't implement vdev stats */
2830 for (i = 0; i < num_peer_stats; i++) {
2831 const struct wmi_10x_peer_stats *src;
2832 struct ath10k_fw_stats_peer *dst;
2834 src = (void *)skb->data;
2835 if (!skb_pull(skb, sizeof(*src)))
2838 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2842 ath10k_wmi_pull_peer_stats(&src->old, dst);
2844 dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2846 list_add_tail(&dst->list, &stats->peers);
2852 static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar,
2853 struct sk_buff *skb,
2854 struct ath10k_fw_stats *stats)
2856 const struct wmi_10_2_stats_event *ev = (void *)skb->data;
2858 u32 num_pdev_ext_stats;
2863 if (!skb_pull(skb, sizeof(*ev)))
2866 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2867 num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
2868 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2869 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2871 for (i = 0; i < num_pdev_stats; i++) {
2872 const struct wmi_10_2_pdev_stats *src;
2873 struct ath10k_fw_stats_pdev *dst;
2875 src = (void *)skb->data;
2876 if (!skb_pull(skb, sizeof(*src)))
2879 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2883 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2884 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2885 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2886 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
2887 /* FIXME: expose 10.2 specific values */
2889 list_add_tail(&dst->list, &stats->pdevs);
2892 for (i = 0; i < num_pdev_ext_stats; i++) {
2893 const struct wmi_10_2_pdev_ext_stats *src;
2895 src = (void *)skb->data;
2896 if (!skb_pull(skb, sizeof(*src)))
2899 /* FIXME: expose values to userspace
2901 * Note: Even though this loop seems to do nothing it is
2902 * required to parse following sub-structures properly.
2906 /* fw doesn't implement vdev stats */
2908 for (i = 0; i < num_peer_stats; i++) {
2909 const struct wmi_10_2_peer_stats *src;
2910 struct ath10k_fw_stats_peer *dst;
2912 src = (void *)skb->data;
2913 if (!skb_pull(skb, sizeof(*src)))
2916 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2920 ath10k_wmi_pull_peer_stats(&src->old, dst);
2922 dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
2923 /* FIXME: expose 10.2 specific values */
2925 list_add_tail(&dst->list, &stats->peers);
2931 static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar,
2932 struct sk_buff *skb,
2933 struct ath10k_fw_stats *stats)
2935 const struct wmi_10_2_stats_event *ev = (void *)skb->data;
2937 u32 num_pdev_ext_stats;
2942 if (!skb_pull(skb, sizeof(*ev)))
2945 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
2946 num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
2947 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2948 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2950 for (i = 0; i < num_pdev_stats; i++) {
2951 const struct wmi_10_2_pdev_stats *src;
2952 struct ath10k_fw_stats_pdev *dst;
2954 src = (void *)skb->data;
2955 if (!skb_pull(skb, sizeof(*src)))
2958 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2962 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
2963 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
2964 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
2965 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
2966 /* FIXME: expose 10.2 specific values */
2968 list_add_tail(&dst->list, &stats->pdevs);
2971 for (i = 0; i < num_pdev_ext_stats; i++) {
2972 const struct wmi_10_2_pdev_ext_stats *src;
2974 src = (void *)skb->data;
2975 if (!skb_pull(skb, sizeof(*src)))
2978 /* FIXME: expose values to userspace
2980 * Note: Even though this loop seems to do nothing it is
2981 * required to parse following sub-structures properly.
2985 /* fw doesn't implement vdev stats */
2987 for (i = 0; i < num_peer_stats; i++) {
2988 const struct wmi_10_2_4_ext_peer_stats *src;
2989 struct ath10k_fw_stats_peer *dst;
2992 if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
2993 stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats);
2995 stats_len = sizeof(struct wmi_10_2_4_peer_stats);
2997 src = (void *)skb->data;
2998 if (!skb_pull(skb, stats_len))
3001 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3005 ath10k_wmi_pull_peer_stats(&src->common.old, dst);
3007 dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate);
3009 if (ath10k_peer_stats_enabled(ar))
3010 dst->rx_duration = __le32_to_cpu(src->rx_duration);
3011 /* FIXME: expose 10.2 specific values */
3013 list_add_tail(&dst->list, &stats->peers);
3019 static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
3020 struct sk_buff *skb,
3021 struct ath10k_fw_stats *stats)
3023 const struct wmi_10_2_stats_event *ev = (void *)skb->data;
3025 u32 num_pdev_ext_stats;
3028 u32 num_bcnflt_stats;
3032 if (!skb_pull(skb, sizeof(*ev)))
3035 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
3036 num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
3037 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
3038 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
3039 num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats);
3040 stats_id = __le32_to_cpu(ev->stats_id);
3042 for (i = 0; i < num_pdev_stats; i++) {
3043 const struct wmi_10_4_pdev_stats *src;
3044 struct ath10k_fw_stats_pdev *dst;
3046 src = (void *)skb->data;
3047 if (!skb_pull(skb, sizeof(*src)))
3050 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3054 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
3055 ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst);
3056 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
3057 dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs);
3058 ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
3060 list_add_tail(&dst->list, &stats->pdevs);
3063 for (i = 0; i < num_pdev_ext_stats; i++) {
3064 const struct wmi_10_2_pdev_ext_stats *src;
3066 src = (void *)skb->data;
3067 if (!skb_pull(skb, sizeof(*src)))
3070 /* FIXME: expose values to userspace
3072 * Note: Even though this loop seems to do nothing it is
3073 * required to parse following sub-structures properly.
3077 for (i = 0; i < num_vdev_stats; i++) {
3078 const struct wmi_vdev_stats *src;
3080 /* Ignore vdev stats here as it has only vdev id. Actual vdev
3081 * stats will be retrieved from vdev extended stats.
3083 src = (void *)skb->data;
3084 if (!skb_pull(skb, sizeof(*src)))
3088 for (i = 0; i < num_peer_stats; i++) {
3089 const struct wmi_10_4_peer_stats *src;
3090 struct ath10k_fw_stats_peer *dst;
3092 src = (void *)skb->data;
3093 if (!skb_pull(skb, sizeof(*src)))
3096 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3100 ath10k_wmi_10_4_pull_peer_stats(src, dst);
3101 list_add_tail(&dst->list, &stats->peers);
3104 for (i = 0; i < num_bcnflt_stats; i++) {
3105 const struct wmi_10_4_bss_bcn_filter_stats *src;
3107 src = (void *)skb->data;
3108 if (!skb_pull(skb, sizeof(*src)))
3111 /* FIXME: expose values to userspace
3113 * Note: Even though this loop seems to do nothing it is
3114 * required to parse following sub-structures properly.
3118 if (stats_id & WMI_10_4_STAT_PEER_EXTD) {
3119 stats->extended = true;
3121 for (i = 0; i < num_peer_stats; i++) {
3122 const struct wmi_10_4_peer_extd_stats *src;
3123 struct ath10k_fw_extd_stats_peer *dst;
3125 src = (void *)skb->data;
3126 if (!skb_pull(skb, sizeof(*src)))
3129 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3133 ether_addr_copy(dst->peer_macaddr,
3134 src->peer_macaddr.addr);
3135 dst->rx_duration = __le32_to_cpu(src->rx_duration);
3136 list_add_tail(&dst->list, &stats->peers_extd);
3140 if (stats_id & WMI_10_4_STAT_VDEV_EXTD) {
3141 for (i = 0; i < num_vdev_stats; i++) {
3142 const struct wmi_vdev_stats_extd *src;
3143 struct ath10k_fw_stats_vdev_extd *dst;
3145 src = (void *)skb->data;
3146 if (!skb_pull(skb, sizeof(*src)))
3149 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3152 ath10k_wmi_10_4_pull_vdev_stats(src, dst);
3153 list_add_tail(&dst->list, &stats->vdevs);
3160 void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb)
3162 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
3163 ath10k_debug_fw_stats_process(ar, skb);
3167 ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb,
3168 struct wmi_vdev_start_ev_arg *arg)
3170 struct wmi_vdev_start_response_event *ev = (void *)skb->data;
3172 if (skb->len < sizeof(*ev))
3175 skb_pull(skb, sizeof(*ev));
3176 arg->vdev_id = ev->vdev_id;
3177 arg->req_id = ev->req_id;
3178 arg->resp_type = ev->resp_type;
3179 arg->status = ev->status;
3184 void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb)
3186 struct wmi_vdev_start_ev_arg arg = {};
3189 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
3191 ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg);
3193 ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret);
3197 if (WARN_ON(__le32_to_cpu(arg.status)))
3200 complete(&ar->vdev_setup_done);
3203 void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb)
3205 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
3206 complete(&ar->vdev_setup_done);
3210 ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb,
3211 struct wmi_peer_kick_ev_arg *arg)
3213 struct wmi_peer_sta_kickout_event *ev = (void *)skb->data;
3215 if (skb->len < sizeof(*ev))
3218 skb_pull(skb, sizeof(*ev));
3219 arg->mac_addr = ev->peer_macaddr.addr;
3224 void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb)
3226 struct wmi_peer_kick_ev_arg arg = {};
3227 struct ieee80211_sta *sta;
3230 ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
3232 ath10k_warn(ar, "failed to parse peer kickout event: %d\n",
3237 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n",
3242 sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
3244 ath10k_warn(ar, "Spurious quick kickout for STA %pM\n",
3249 ieee80211_report_low_ack(sta, 10);
3258 * We don't report to mac80211 sleep state of connected
3259 * stations. Due to this mac80211 can't fill in TIM IE
3262 * I know of no way of getting nullfunc frames that contain
3263 * sleep transition from connected stations - these do not
3264 * seem to be sent from the target to the host. There also
3265 * doesn't seem to be a dedicated event for that. So the
3266 * only way left to do this would be to read tim_bitmap
3269 * We could probably try using tim_bitmap from SWBA to tell
3270 * mac80211 which stations are asleep and which are not. The
3271 * problem here is calling mac80211 functions so many times
3272 * could take too long and make us miss the time to submit
3273 * the beacon to the target.
3275 * So as a workaround we try to extend the TIM IE if there
3276 * is unicast buffered for stations with aid > 7 and fill it
3279 static void ath10k_wmi_update_tim(struct ath10k *ar,
3280 struct ath10k_vif *arvif,
3281 struct sk_buff *bcn,
3282 const struct wmi_tim_info_arg *tim_info)
3284 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data;
3285 struct ieee80211_tim_ie *tim;
3291 /* When FW reports 0 in tim_len, ensure atleast first byte
3292 * in tim_bitmap is considered for pvm calculation.
3294 tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1;
3296 /* if next SWBA has no tim_changed the tim_bitmap is garbage.
3297 * we must copy the bitmap upon change and reuse it later
3299 if (__le32_to_cpu(tim_info->tim_changed)) {
3302 if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) {
3303 ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu",
3304 tim_len, sizeof(arvif->u.ap.tim_bitmap));
3305 tim_len = sizeof(arvif->u.ap.tim_bitmap);
3308 for (i = 0; i < tim_len; i++) {
3309 t = tim_info->tim_bitmap[i / 4];
3310 v = __le32_to_cpu(t);
3311 arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
3314 /* FW reports either length 0 or length based on max supported
3315 * station. so we calculate this on our own
3317 arvif->u.ap.tim_len = 0;
3318 for (i = 0; i < tim_len; i++)
3319 if (arvif->u.ap.tim_bitmap[i])
3320 arvif->u.ap.tim_len = i;
3322 arvif->u.ap.tim_len++;
3326 ies += ieee80211_hdrlen(hdr->frame_control);
3327 ies += 12; /* fixed parameters */
3329 ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies,
3330 (u8 *)skb_tail_pointer(bcn) - ies);
3332 if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3333 ath10k_warn(ar, "no tim ie found;\n");
3337 tim = (void *)ie + 2;
3339 pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */
3341 if (pvm_len < arvif->u.ap.tim_len) {
3342 int expand_size = tim_len - pvm_len;
3343 int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
3344 void *next_ie = ie + 2 + ie_len;
3346 if (skb_put(bcn, expand_size)) {
3347 memmove(next_ie + expand_size, next_ie, move_size);
3349 ie[1] += expand_size;
3350 ie_len += expand_size;
3351 pvm_len += expand_size;
3353 ath10k_warn(ar, "tim expansion failed\n");
3357 if (pvm_len > tim_len) {
3358 ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len);
3362 tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast);
3363 memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
3365 if (tim->dtim_count == 0) {
3366 ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO;
3368 if (__le32_to_cpu(tim_info->tim_mcast) == 1)
3369 ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB;
3372 ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
3373 tim->dtim_count, tim->dtim_period,
3374 tim->bitmap_ctrl, pvm_len);
3377 static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
3378 struct sk_buff *bcn,
3379 const struct wmi_p2p_noa_info *noa)
3381 if (!arvif->vif->p2p)
3384 ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
3386 if (noa->changed & WMI_P2P_NOA_CHANGED_BIT)
3387 ath10k_p2p_noa_update(arvif, noa);
3389 if (arvif->u.ap.noa_data)
3390 if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
3391 skb_put_data(bcn, arvif->u.ap.noa_data,
3392 arvif->u.ap.noa_len);
3395 static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
3396 struct wmi_swba_ev_arg *arg)
3398 struct wmi_host_swba_event *ev = (void *)skb->data;
3402 if (skb->len < sizeof(*ev))
3405 skb_pull(skb, sizeof(*ev));
3406 arg->vdev_map = ev->vdev_map;
3408 for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3409 if (!(map & BIT(0)))
3412 /* If this happens there were some changes in firmware and
3413 * ath10k should update the max size of tim_info array.
3415 if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3418 if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3419 sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3420 ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3424 arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3425 arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3426 arg->tim_info[i].tim_bitmap =
3427 ev->bcn_info[i].tim_info.tim_bitmap;
3428 arg->tim_info[i].tim_changed =
3429 ev->bcn_info[i].tim_info.tim_changed;
3430 arg->tim_info[i].tim_num_ps_pending =
3431 ev->bcn_info[i].tim_info.tim_num_ps_pending;
3433 arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info;
3440 static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar,
3441 struct sk_buff *skb,
3442 struct wmi_swba_ev_arg *arg)
3444 struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data;
3448 if (skb->len < sizeof(*ev))
3451 skb_pull(skb, sizeof(*ev));
3452 arg->vdev_map = ev->vdev_map;
3454 for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3455 if (!(map & BIT(0)))
3458 /* If this happens there were some changes in firmware and
3459 * ath10k should update the max size of tim_info array.
3461 if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3464 if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3465 sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3466 ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3470 arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
3471 arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3472 arg->tim_info[i].tim_bitmap =
3473 ev->bcn_info[i].tim_info.tim_bitmap;
3474 arg->tim_info[i].tim_changed =
3475 ev->bcn_info[i].tim_info.tim_changed;
3476 arg->tim_info[i].tim_num_ps_pending =
3477 ev->bcn_info[i].tim_info.tim_num_ps_pending;
3484 static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
3485 struct sk_buff *skb,
3486 struct wmi_swba_ev_arg *arg)
3488 struct wmi_10_4_host_swba_event *ev = (void *)skb->data;
3492 if (skb->len < sizeof(*ev))
3495 skb_pull(skb, sizeof(*ev));
3496 arg->vdev_map = ev->vdev_map;
3498 for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
3499 if (!(map & BIT(0)))
3502 /* If this happens there were some changes in firmware and
3503 * ath10k should update the max size of tim_info array.
3505 if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
3508 if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
3509 sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
3510 ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3514 tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len);
3516 /* Exclude 4 byte guard length */
3518 arg->tim_info[i].tim_len = __cpu_to_le32(tim_len);
3520 arg->tim_info[i].tim_len = 0;
3523 arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
3524 arg->tim_info[i].tim_bitmap =
3525 ev->bcn_info[i].tim_info.tim_bitmap;
3526 arg->tim_info[i].tim_changed =
3527 ev->bcn_info[i].tim_info.tim_changed;
3528 arg->tim_info[i].tim_num_ps_pending =
3529 ev->bcn_info[i].tim_info.tim_num_ps_pending;
3531 /* 10.4 firmware doesn't have p2p support. notice of absence
3532 * info can be ignored for now.
3541 static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar)
3543 return WMI_TXBF_CONF_BEFORE_ASSOC;
3546 void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
3548 struct wmi_swba_ev_arg arg = {};
3551 const struct wmi_tim_info_arg *tim_info;
3552 const struct wmi_p2p_noa_info *noa_info;
3553 struct ath10k_vif *arvif;
3554 struct sk_buff *bcn;
3556 int ret, vdev_id = 0;
3558 ret = ath10k_wmi_pull_swba(ar, skb, &arg);
3560 ath10k_warn(ar, "failed to parse swba event: %d\n", ret);
3564 map = __le32_to_cpu(arg.vdev_map);
3566 ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
3569 for (; map; map >>= 1, vdev_id++) {
3575 if (i >= WMI_MAX_AP_VDEV) {
3576 ath10k_warn(ar, "swba has corrupted vdev map\n");
3580 tim_info = &arg.tim_info[i];
3581 noa_info = arg.noa_info[i];
3583 ath10k_dbg(ar, ATH10K_DBG_MGMT,
3584 "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n",
3586 __le32_to_cpu(tim_info->tim_len),
3587 __le32_to_cpu(tim_info->tim_mcast),
3588 __le32_to_cpu(tim_info->tim_changed),
3589 __le32_to_cpu(tim_info->tim_num_ps_pending),
3590 __le32_to_cpu(tim_info->tim_bitmap[3]),
3591 __le32_to_cpu(tim_info->tim_bitmap[2]),
3592 __le32_to_cpu(tim_info->tim_bitmap[1]),
3593 __le32_to_cpu(tim_info->tim_bitmap[0]));
3595 /* TODO: Only first 4 word from tim_bitmap is dumped.
3596 * Extend debug code to dump full tim_bitmap.
3599 arvif = ath10k_get_arvif(ar, vdev_id);
3600 if (arvif == NULL) {
3601 ath10k_warn(ar, "no vif for vdev_id %d found\n",
3606 /* mac80211 would have already asked us to stop beaconing and
3607 * bring the vdev down, so continue in that case
3612 /* There are no completions for beacons so wait for next SWBA
3613 * before telling mac80211 to decrement CSA counter
3615 * Once CSA counter is completed stop sending beacons until
3616 * actual channel switch is done
3618 if (arvif->vif->csa_active &&
3619 ieee80211_csa_is_complete(arvif->vif)) {
3620 ieee80211_csa_finish(arvif->vif);
3624 bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
3626 ath10k_warn(ar, "could not get mac80211 beacon\n");
3630 ath10k_tx_h_seq_no(arvif->vif, bcn);
3631 ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
3632 ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);
3634 spin_lock_bh(&ar->data_lock);
3636 if (arvif->beacon) {
3637 switch (arvif->beacon_state) {
3638 case ATH10K_BEACON_SENT:
3640 case ATH10K_BEACON_SCHEDULED:
3641 ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n",
3644 case ATH10K_BEACON_SENDING:
3645 ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n",
3651 ath10k_mac_vif_beacon_free(arvif);
3654 if (!arvif->beacon_buf) {
3655 paddr = dma_map_single(arvif->ar->dev, bcn->data,
3656 bcn->len, DMA_TO_DEVICE);
3657 ret = dma_mapping_error(arvif->ar->dev, paddr);
3659 ath10k_warn(ar, "failed to map beacon: %d\n",
3661 dev_kfree_skb_any(bcn);
3665 ATH10K_SKB_CB(bcn)->paddr = paddr;
3667 if (bcn->len > IEEE80211_MAX_FRAME_LEN) {
3668 ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n",
3669 bcn->len, IEEE80211_MAX_FRAME_LEN);
3670 skb_trim(bcn, IEEE80211_MAX_FRAME_LEN);
3672 memcpy(arvif->beacon_buf, bcn->data, bcn->len);
3673 ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr;
3676 arvif->beacon = bcn;
3677 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
3679 trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
3680 trace_ath10k_tx_payload(ar, bcn->data, bcn->len);
3683 spin_unlock_bh(&ar->data_lock);
3686 ath10k_wmi_tx_beacons_nowait(ar);
3689 void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb)
3691 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
3694 static void ath10k_dfs_radar_report(struct ath10k *ar,
3695 struct wmi_phyerr_ev_arg *phyerr,
3696 const struct phyerr_radar_report *rr,
3699 u32 reg0, reg1, tsf32l;
3700 struct ieee80211_channel *ch;
3701 struct pulse_event pe;
3705 reg0 = __le32_to_cpu(rr->reg0);
3706 reg1 = __le32_to_cpu(rr->reg1);
3708 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3709 "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n",
3710 MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP),
3711 MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH),
3712 MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN),
3713 MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF));
3714 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3715 "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n",
3716 MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK),
3717 MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX),
3718 MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID),
3719 MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN),
3720 MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK));
3721 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3722 "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n",
3723 MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET),
3724 MS(reg1, RADAR_REPORT_REG1_PULSE_DUR));
3726 if (!ar->dfs_detector)
3729 spin_lock_bh(&ar->data_lock);
3730 ch = ar->rx_channel;
3732 /* fetch target operating channel during channel change */
3734 ch = ar->tgt_oper_chan;
3736 spin_unlock_bh(&ar->data_lock);
3739 ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n");
3740 goto radar_detected;
3743 /* report event to DFS pattern detector */
3744 tsf32l = phyerr->tsf_timestamp;
3745 tsf64 = tsf & (~0xFFFFFFFFULL);
3748 width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
3749 rssi = phyerr->rssi_combined;
3751 /* hardware store this as 8 bit signed value,
3752 * set to zero if negative number
3758 pe.freq = ch->center_freq;
3761 pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0);
3762 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3763 "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n",
3764 pe.freq, pe.width, pe.rssi, pe.ts);
3766 ATH10K_DFS_STAT_INC(ar, pulses_detected);
3768 if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe)) {
3769 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3770 "dfs no pulse pattern detected, yet\n");
3775 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
3776 ATH10K_DFS_STAT_INC(ar, radar_detected);
3778 /* Control radar events reporting in debugfs file
3779 * dfs_block_radar_events
3781 if (ar->dfs_block_radar_events) {
3782 ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
3786 ieee80211_radar_detected(ar->hw);
3789 static int ath10k_dfs_fft_report(struct ath10k *ar,
3790 struct wmi_phyerr_ev_arg *phyerr,
3791 const struct phyerr_fft_report *fftr,
3797 reg0 = __le32_to_cpu(fftr->reg0);
3798 reg1 = __le32_to_cpu(fftr->reg1);
3799 rssi = phyerr->rssi_combined;
3801 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3802 "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
3803 MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB),
3804 MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB),
3805 MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX),
3806 MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX));
3807 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3808 "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n",
3809 MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB),
3810 MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB),
3811 MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG),
3812 MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB));
3814 peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG);
3816 /* false event detection */
3817 if (rssi == DFS_RSSI_POSSIBLY_FALSE &&
3818 peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) {
3819 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
3820 ATH10K_DFS_STAT_INC(ar, pulses_discarded);
3827 void ath10k_wmi_event_dfs(struct ath10k *ar,
3828 struct wmi_phyerr_ev_arg *phyerr,
3831 int buf_len, tlv_len, res, i = 0;
3832 const struct phyerr_tlv *tlv;
3833 const struct phyerr_radar_report *rr;
3834 const struct phyerr_fft_report *fftr;
3837 buf_len = phyerr->buf_len;
3838 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3839 "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
3840 phyerr->phy_err_code, phyerr->rssi_combined,
3841 phyerr->tsf_timestamp, tsf, buf_len);
3843 /* Skip event if DFS disabled */
3844 if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED))
3847 ATH10K_DFS_STAT_INC(ar, pulses_total);
3849 while (i < buf_len) {
3850 if (i + sizeof(*tlv) > buf_len) {
3851 ath10k_warn(ar, "too short buf for tlv header (%d)\n",
3856 tlv = (struct phyerr_tlv *)&phyerr->buf[i];
3857 tlv_len = __le16_to_cpu(tlv->len);
3858 tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
3859 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
3860 "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
3861 tlv_len, tlv->tag, tlv->sig);
3864 case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY:
3865 if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) {
3866 ath10k_warn(ar, "too short radar pulse summary (%d)\n",
3871 rr = (struct phyerr_radar_report *)tlv_buf;
3872 ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
3874 case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
3875 if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
3876 ath10k_warn(ar, "too short fft report (%d)\n",
3881 fftr = (struct phyerr_fft_report *)tlv_buf;
3882 res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
3888 i += sizeof(*tlv) + tlv_len;
3892 void ath10k_wmi_event_spectral_scan(struct ath10k *ar,
3893 struct wmi_phyerr_ev_arg *phyerr,
3896 int buf_len, tlv_len, res, i = 0;
3897 struct phyerr_tlv *tlv;
3898 const void *tlv_buf;
3899 const struct phyerr_fft_report *fftr;
3902 buf_len = phyerr->buf_len;
3904 while (i < buf_len) {
3905 if (i + sizeof(*tlv) > buf_len) {
3906 ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n",
3911 tlv = (struct phyerr_tlv *)&phyerr->buf[i];
3912 tlv_len = __le16_to_cpu(tlv->len);
3913 tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
3915 if (i + sizeof(*tlv) + tlv_len > buf_len) {
3916 ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
3922 case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
3923 if (sizeof(*fftr) > tlv_len) {
3924 ath10k_warn(ar, "failed to parse fft report at byte %d\n",
3929 fftr_len = tlv_len - sizeof(*fftr);
3931 res = ath10k_spectral_process_fft(ar, phyerr,
3935 ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
3942 i += sizeof(*tlv) + tlv_len;
3946 static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar,
3947 struct sk_buff *skb,
3948 struct wmi_phyerr_hdr_arg *arg)
3950 struct wmi_phyerr_event *ev = (void *)skb->data;
3952 if (skb->len < sizeof(*ev))
3955 arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs);
3956 arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
3957 arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
3958 arg->buf_len = skb->len - sizeof(*ev);
3959 arg->phyerrs = ev->phyerrs;
3964 static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar,
3965 struct sk_buff *skb,
3966 struct wmi_phyerr_hdr_arg *arg)
3968 struct wmi_10_4_phyerr_event *ev = (void *)skb->data;
3970 if (skb->len < sizeof(*ev))
3973 /* 10.4 firmware always reports only one phyerr */
3974 arg->num_phyerrs = 1;
3976 arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32);
3977 arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32);
3978 arg->buf_len = skb->len;
3979 arg->phyerrs = skb->data;
3984 int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar,
3985 const void *phyerr_buf,
3987 struct wmi_phyerr_ev_arg *arg)
3989 const struct wmi_phyerr *phyerr = phyerr_buf;
3992 if (left_len < sizeof(*phyerr)) {
3993 ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
3994 left_len, sizeof(*phyerr));
3998 arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
3999 arg->freq1 = __le16_to_cpu(phyerr->freq1);
4000 arg->freq2 = __le16_to_cpu(phyerr->freq2);
4001 arg->rssi_combined = phyerr->rssi_combined;
4002 arg->chan_width_mhz = phyerr->chan_width_mhz;
4003 arg->buf_len = __le32_to_cpu(phyerr->buf_len);
4004 arg->buf = phyerr->buf;
4005 arg->hdr_len = sizeof(*phyerr);
4007 for (i = 0; i < 4; i++)
4008 arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
4010 switch (phyerr->phy_err_code) {
4011 case PHY_ERROR_GEN_SPECTRAL_SCAN:
4012 arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
4014 case PHY_ERROR_GEN_FALSE_RADAR_EXT:
4015 arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT;
4017 case PHY_ERROR_GEN_RADAR:
4018 arg->phy_err_code = PHY_ERROR_RADAR;
4021 arg->phy_err_code = PHY_ERROR_UNKNOWN;
4028 static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar,
4029 const void *phyerr_buf,
4031 struct wmi_phyerr_ev_arg *arg)
4033 const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf;
4037 if (left_len < sizeof(*phyerr)) {
4038 ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
4039 left_len, sizeof(*phyerr));
4043 arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp);
4044 arg->freq1 = __le16_to_cpu(phyerr->freq1);
4045 arg->freq2 = __le16_to_cpu(phyerr->freq2);
4046 arg->rssi_combined = phyerr->rssi_combined;
4047 arg->chan_width_mhz = phyerr->chan_width_mhz;
4048 arg->buf_len = __le32_to_cpu(phyerr->buf_len);
4049 arg->buf = phyerr->buf;
4050 arg->hdr_len = sizeof(*phyerr);
4052 for (i = 0; i < 4; i++)
4053 arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]);
4055 phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]);
4057 if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK)
4058 arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
4059 else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK)
4060 arg->phy_err_code = PHY_ERROR_RADAR;
4062 arg->phy_err_code = PHY_ERROR_UNKNOWN;
4067 void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
4069 struct wmi_phyerr_hdr_arg hdr_arg = {};
4070 struct wmi_phyerr_ev_arg phyerr_arg = {};
4072 u32 count, i, buf_len, phy_err_code;
4076 ATH10K_DFS_STAT_INC(ar, phy_errors);
4078 ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
4080 ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret);
4084 /* Check number of included events */
4085 count = hdr_arg.num_phyerrs;
4087 left_len = hdr_arg.buf_len;
4089 tsf = hdr_arg.tsf_u32;
4091 tsf |= hdr_arg.tsf_l32;
4093 ath10k_dbg(ar, ATH10K_DBG_WMI,
4094 "wmi event phyerr count %d tsf64 0x%llX\n",
4097 phyerr = hdr_arg.phyerrs;
4098 for (i = 0; i < count; i++) {
4099 ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
4101 ath10k_warn(ar, "failed to parse phyerr event (%d)\n",
4106 left_len -= phyerr_arg.hdr_len;
4107 buf_len = phyerr_arg.buf_len;
4108 phy_err_code = phyerr_arg.phy_err_code;
4110 if (left_len < buf_len) {
4111 ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
4115 left_len -= buf_len;
4117 switch (phy_err_code) {
4118 case PHY_ERROR_RADAR:
4119 ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4121 case PHY_ERROR_SPECTRAL_SCAN:
4122 ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
4124 case PHY_ERROR_FALSE_RADAR_EXT:
4125 ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4126 ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
4132 phyerr = phyerr + phyerr_arg.hdr_len + buf_len;
4136 void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
4138 struct wmi_roam_ev_arg arg = {};
4144 ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
4146 ath10k_warn(ar, "failed to parse roam event: %d\n", ret);
4150 vdev_id = __le32_to_cpu(arg.vdev_id);
4151 reason = __le32_to_cpu(arg.reason);
4152 rssi = __le32_to_cpu(arg.rssi);
4153 rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT;
4155 ath10k_dbg(ar, ATH10K_DBG_WMI,
4156 "wmi roam event vdev %u reason 0x%08x rssi %d\n",
4157 vdev_id, reason, rssi);
4159 if (reason >= WMI_ROAM_REASON_MAX)
4160 ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n",
4164 case WMI_ROAM_REASON_BEACON_MISS:
4165 ath10k_mac_handle_beacon_miss(ar, vdev_id);
4167 case WMI_ROAM_REASON_BETTER_AP:
4168 case WMI_ROAM_REASON_LOW_RSSI:
4169 case WMI_ROAM_REASON_SUITABLE_AP_FOUND:
4170 case WMI_ROAM_REASON_HO_FAILED:
4171 ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n",
4177 void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb)
4179 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
4182 void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb)
4187 for (i = 0; i < sizeof(buf) - 1; i++) {
4196 if (isascii(c) && isprint(c))
4202 if (i == sizeof(buf) - 1)
4203 ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len);
4205 /* for some reason the debug prints end with \n, remove that */
4206 if (skb->data[i - 1] == '\n')
4209 /* the last byte is always reserved for the null character */
4212 ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
4215 void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
4217 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
4220 void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb)
4222 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
4225 void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
4226 struct sk_buff *skb)
4228 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
4231 void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
4232 struct sk_buff *skb)
4234 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
4237 void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb)
4239 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
4242 void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb)
4244 struct wmi_wow_ev_arg ev = {};
4247 complete(&ar->wow.wakeup_completed);
4249 ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
4251 ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret);
4255 ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
4256 wow_reason(ev.wake_reason));
4259 void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb)
4261 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
4264 static u8 ath10k_tpc_config_get_rate(struct ath10k *ar,
4265 struct wmi_pdev_tpc_config_event *ev,
4266 u32 rate_idx, u32 num_chains,
4267 u32 rate_code, u8 type)
4269 u8 tpc, num_streams, preamble, ch, stm_idx;
4271 num_streams = ATH10K_HW_NSS(rate_code);
4272 preamble = ATH10K_HW_PREAMBLE(rate_code);
4273 ch = num_chains - 1;
4275 tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]);
4277 if (__le32_to_cpu(ev->num_tx_chain) <= 1)
4280 if (preamble == WMI_RATE_PREAMBLE_CCK)
4283 stm_idx = num_streams - 1;
4284 if (num_chains <= num_streams)
4288 case WMI_TPC_TABLE_TYPE_STBC:
4289 tpc = min_t(u8, tpc,
4290 ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]);
4292 case WMI_TPC_TABLE_TYPE_TXBF:
4293 tpc = min_t(u8, tpc,
4294 ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]);
4296 case WMI_TPC_TABLE_TYPE_CDD:
4297 tpc = min_t(u8, tpc,
4298 ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]);
4301 ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type);
4310 static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
4311 struct wmi_pdev_tpc_config_event *ev,
4312 struct ath10k_tpc_stats *tpc_stats,
4313 u8 *rate_code, u16 *pream_table, u8 type)
4315 u32 i, j, pream_idx, flags;
4316 u8 tpc[WMI_TPC_TX_N_CHAIN];
4317 char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
4318 char buff[WMI_TPC_BUF_SIZE];
4320 flags = __le32_to_cpu(ev->flags);
4323 case WMI_TPC_TABLE_TYPE_CDD:
4324 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
4325 ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
4326 tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4330 case WMI_TPC_TABLE_TYPE_STBC:
4331 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
4332 ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
4333 tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4337 case WMI_TPC_TABLE_TYPE_TXBF:
4338 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
4339 ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
4340 tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4345 ath10k_dbg(ar, ATH10K_DBG_WMI,
4346 "invalid table type in wmi tpc event: %d\n", type);
4351 for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
4352 memset(tpc_value, 0, sizeof(tpc_value));
4353 memset(buff, 0, sizeof(buff));
4354 if (i == pream_table[pream_idx])
4357 for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
4358 if (j >= __le32_to_cpu(ev->num_tx_chain))
4361 tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
4364 snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
4365 strlcat(tpc_value, buff, sizeof(tpc_value));
4367 tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
4368 tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
4369 memcpy(tpc_stats->tpc_table[type].tpc_value[i],
4370 tpc_value, sizeof(tpc_value));
4374 void ath10k_wmi_tpc_config_get_rate_code(u8 *rate_code, u16 *pream_table,
4377 u32 i, j, pream_idx;
4380 /* Create the rate code table based on the chains supported */
4384 /* Fill CCK rate code */
4385 for (i = 0; i < 4; i++) {
4386 rate_code[rate_idx] =
4387 ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK);
4390 pream_table[pream_idx] = rate_idx;
4393 /* Fill OFDM rate code */
4394 for (i = 0; i < 8; i++) {
4395 rate_code[rate_idx] =
4396 ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM);
4399 pream_table[pream_idx] = rate_idx;
4402 /* Fill HT20 rate code */
4403 for (i = 0; i < num_tx_chain; i++) {
4404 for (j = 0; j < 8; j++) {
4405 rate_code[rate_idx] =
4406 ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
4410 pream_table[pream_idx] = rate_idx;
4413 /* Fill HT40 rate code */
4414 for (i = 0; i < num_tx_chain; i++) {
4415 for (j = 0; j < 8; j++) {
4416 rate_code[rate_idx] =
4417 ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
4421 pream_table[pream_idx] = rate_idx;
4424 /* Fill VHT20 rate code */
4425 for (i = 0; i < num_tx_chain; i++) {
4426 for (j = 0; j < 10; j++) {
4427 rate_code[rate_idx] =
4428 ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4432 pream_table[pream_idx] = rate_idx;
4435 /* Fill VHT40 rate code */
4436 for (i = 0; i < num_tx_chain; i++) {
4437 for (j = 0; j < 10; j++) {
4438 rate_code[rate_idx] =
4439 ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4443 pream_table[pream_idx] = rate_idx;
4446 /* Fill VHT80 rate code */
4447 for (i = 0; i < num_tx_chain; i++) {
4448 for (j = 0; j < 10; j++) {
4449 rate_code[rate_idx] =
4450 ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
4454 pream_table[pream_idx] = rate_idx;
4457 rate_code[rate_idx++] =
4458 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
4459 rate_code[rate_idx++] =
4460 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4461 rate_code[rate_idx++] =
4462 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
4463 rate_code[rate_idx++] =
4464 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4465 rate_code[rate_idx++] =
4466 ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
4468 pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END;
4471 void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb)
4474 u8 rate_code[WMI_TPC_RATE_MAX];
4475 u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
4476 struct wmi_pdev_tpc_config_event *ev;
4477 struct ath10k_tpc_stats *tpc_stats;
4479 ev = (struct wmi_pdev_tpc_config_event *)skb->data;
4481 tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
4485 num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4487 ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table,
4490 tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
4491 tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
4492 tpc_stats->ctl = __le32_to_cpu(ev->ctl);
4493 tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
4494 tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
4495 tpc_stats->twice_antenna_reduction =
4496 __le32_to_cpu(ev->twice_antenna_reduction);
4497 tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
4498 tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
4499 tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4500 tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
4502 ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4503 rate_code, pream_table,
4504 WMI_TPC_TABLE_TYPE_CDD);
4505 ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4506 rate_code, pream_table,
4507 WMI_TPC_TABLE_TYPE_STBC);
4508 ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4509 rate_code, pream_table,
4510 WMI_TPC_TABLE_TYPE_TXBF);
4512 ath10k_debug_tpc_stats_process(ar, tpc_stats);
4514 ath10k_dbg(ar, ATH10K_DBG_WMI,
4515 "wmi event tpc config channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n",
4516 __le32_to_cpu(ev->chan_freq),
4517 __le32_to_cpu(ev->phy_mode),
4518 __le32_to_cpu(ev->ctl),
4519 __le32_to_cpu(ev->reg_domain),
4520 a_sle32_to_cpu(ev->twice_antenna_gain),
4521 __le32_to_cpu(ev->twice_antenna_reduction),
4522 __le32_to_cpu(ev->power_limit),
4523 __le32_to_cpu(ev->twice_max_rd_power) / 2,
4524 __le32_to_cpu(ev->num_tx_chain),
4525 __le32_to_cpu(ev->rate_max));
4529 ath10k_wmi_tpc_final_get_rate(struct ath10k *ar,
4530 struct wmi_pdev_tpc_final_table_event *ev,
4531 u32 rate_idx, u32 num_chains,
4532 u32 rate_code, u8 type, u32 pream_idx)
4534 u8 tpc, num_streams, preamble, ch, stm_idx;
4535 s8 pow_agcdd, pow_agstbc, pow_agtxbf;
4538 num_streams = ATH10K_HW_NSS(rate_code);
4539 preamble = ATH10K_HW_PREAMBLE(rate_code);
4540 ch = num_chains - 1;
4541 stm_idx = num_streams - 1;
4544 if (__le32_to_cpu(ev->chan_freq) <= 2483) {
4545 switch (pream_idx) {
4546 case WMI_TPC_PREAM_2GHZ_CCK:
4549 case WMI_TPC_PREAM_2GHZ_OFDM:
4552 case WMI_TPC_PREAM_2GHZ_HT20:
4553 case WMI_TPC_PREAM_2GHZ_VHT20:
4556 case WMI_TPC_PREAM_2GHZ_HT40:
4557 case WMI_TPC_PREAM_2GHZ_VHT40:
4560 case WMI_TPC_PREAM_2GHZ_VHT80:
4569 if (__le32_to_cpu(ev->chan_freq) >= 5180) {
4570 switch (pream_idx) {
4571 case WMI_TPC_PREAM_5GHZ_OFDM:
4574 case WMI_TPC_PREAM_5GHZ_HT20:
4575 case WMI_TPC_PREAM_5GHZ_VHT20:
4578 case WMI_TPC_PREAM_5GHZ_HT40:
4579 case WMI_TPC_PREAM_5GHZ_VHT40:
4582 case WMI_TPC_PREAM_5GHZ_VHT80:
4585 case WMI_TPC_PREAM_5GHZ_HTCUP:
4595 tpc = min_t(u8, ev->rates_array[rate_idx],
4596 ev->max_reg_allow_pow[ch]);
4598 tpc = min_t(u8, min_t(u8, ev->rates_array[rate_idx],
4599 ev->max_reg_allow_pow[ch]),
4600 ev->ctl_power_table[0][pream][stm_idx]);
4602 if (__le32_to_cpu(ev->num_tx_chain) <= 1)
4605 if (preamble == WMI_RATE_PREAMBLE_CCK)
4608 if (num_chains <= num_streams)
4612 case WMI_TPC_TABLE_TYPE_STBC:
4613 pow_agstbc = ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx];
4615 tpc = min_t(u8, tpc, pow_agstbc);
4617 tpc = min_t(u8, min_t(u8, tpc, pow_agstbc),
4618 ev->ctl_power_table[0][pream][stm_idx]);
4620 case WMI_TPC_TABLE_TYPE_TXBF:
4621 pow_agtxbf = ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx];
4623 tpc = min_t(u8, tpc, pow_agtxbf);
4625 tpc = min_t(u8, min_t(u8, tpc, pow_agtxbf),
4626 ev->ctl_power_table[1][pream][stm_idx]);
4628 case WMI_TPC_TABLE_TYPE_CDD:
4629 pow_agcdd = ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx];
4631 tpc = min_t(u8, tpc, pow_agcdd);
4633 tpc = min_t(u8, min_t(u8, tpc, pow_agcdd),
4634 ev->ctl_power_table[0][pream][stm_idx]);
4637 ath10k_warn(ar, "unknown wmi tpc final table type: %d\n", type);
4647 ath10k_wmi_tpc_stats_final_disp_tables(struct ath10k *ar,
4648 struct wmi_pdev_tpc_final_table_event *ev,
4649 struct ath10k_tpc_stats_final *tpc_stats,
4650 u8 *rate_code, u16 *pream_table, u8 type)
4652 u32 i, j, pream_idx, flags;
4653 u8 tpc[WMI_TPC_TX_N_CHAIN];
4654 char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
4655 char buff[WMI_TPC_BUF_SIZE];
4657 flags = __le32_to_cpu(ev->flags);
4660 case WMI_TPC_TABLE_TYPE_CDD:
4661 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
4662 ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
4663 tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4667 case WMI_TPC_TABLE_TYPE_STBC:
4668 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
4669 ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
4670 tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4674 case WMI_TPC_TABLE_TYPE_TXBF:
4675 if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
4676 ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
4677 tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
4682 ath10k_dbg(ar, ATH10K_DBG_WMI,
4683 "invalid table type in wmi tpc event: %d\n", type);
4688 for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) {
4689 memset(tpc_value, 0, sizeof(tpc_value));
4690 memset(buff, 0, sizeof(buff));
4691 if (i == pream_table[pream_idx])
4694 for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
4695 if (j >= __le32_to_cpu(ev->num_tx_chain))
4698 tpc[j] = ath10k_wmi_tpc_final_get_rate(ar, ev, i, j + 1,
4701 snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
4702 strlcat(tpc_value, buff, sizeof(tpc_value));
4704 tpc_stats->tpc_table_final[type].pream_idx[i] = pream_idx;
4705 tpc_stats->tpc_table_final[type].rate_code[i] = rate_code[i];
4706 memcpy(tpc_stats->tpc_table_final[type].tpc_value[i],
4707 tpc_value, sizeof(tpc_value));
4711 void ath10k_wmi_event_tpc_final_table(struct ath10k *ar, struct sk_buff *skb)
4714 u8 rate_code[WMI_TPC_FINAL_RATE_MAX];
4715 u16 pream_table[WMI_TPC_PREAM_TABLE_MAX];
4716 struct wmi_pdev_tpc_final_table_event *ev;
4717 struct ath10k_tpc_stats_final *tpc_stats;
4719 ev = (struct wmi_pdev_tpc_final_table_event *)skb->data;
4721 tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
4725 num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4727 ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table,
4730 tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq);
4731 tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode);
4732 tpc_stats->ctl = __le32_to_cpu(ev->ctl);
4733 tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain);
4734 tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain);
4735 tpc_stats->twice_antenna_reduction =
4736 __le32_to_cpu(ev->twice_antenna_reduction);
4737 tpc_stats->power_limit = __le32_to_cpu(ev->power_limit);
4738 tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power);
4739 tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain);
4740 tpc_stats->rate_max = __le32_to_cpu(ev->rate_max);
4742 ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
4743 rate_code, pream_table,
4744 WMI_TPC_TABLE_TYPE_CDD);
4745 ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
4746 rate_code, pream_table,
4747 WMI_TPC_TABLE_TYPE_STBC);
4748 ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
4749 rate_code, pream_table,
4750 WMI_TPC_TABLE_TYPE_TXBF);
4752 ath10k_debug_tpc_stats_final_process(ar, tpc_stats);
4754 ath10k_dbg(ar, ATH10K_DBG_WMI,
4755 "wmi event tpc final table channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n",
4756 __le32_to_cpu(ev->chan_freq),
4757 __le32_to_cpu(ev->phy_mode),
4758 __le32_to_cpu(ev->ctl),
4759 __le32_to_cpu(ev->reg_domain),
4760 a_sle32_to_cpu(ev->twice_antenna_gain),
4761 __le32_to_cpu(ev->twice_antenna_reduction),
4762 __le32_to_cpu(ev->power_limit),
4763 __le32_to_cpu(ev->twice_max_rd_power) / 2,
4764 __le32_to_cpu(ev->num_tx_chain),
4765 __le32_to_cpu(ev->rate_max));
4769 ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb)
4771 struct wmi_tdls_peer_event *ev;
4772 struct ath10k_peer *peer;
4773 struct ath10k_vif *arvif;
4779 if (skb->len < sizeof(*ev)) {
4780 ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n",
4785 ev = (struct wmi_tdls_peer_event *)skb->data;
4786 vdev_id = __le32_to_cpu(ev->vdev_id);
4787 peer_status = __le32_to_cpu(ev->peer_status);
4788 peer_reason = __le32_to_cpu(ev->peer_reason);
4790 spin_lock_bh(&ar->data_lock);
4791 peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr);
4792 spin_unlock_bh(&ar->data_lock);
4795 ath10k_warn(ar, "failed to find peer entry for %pM\n",
4796 ev->peer_macaddr.addr);
4800 switch (peer_status) {
4801 case WMI_TDLS_SHOULD_TEARDOWN:
4802 switch (peer_reason) {
4803 case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT:
4804 case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE:
4805 case WMI_TDLS_TEARDOWN_REASON_RSSI:
4806 reason = WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE;
4809 reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED;
4813 arvif = ath10k_get_arvif(ar, vdev_id);
4815 ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n",
4820 ieee80211_tdls_oper_request(arvif->vif, ev->peer_macaddr.addr,
4821 NL80211_TDLS_TEARDOWN, reason,
4824 ath10k_dbg(ar, ATH10K_DBG_WMI,
4825 "received tdls teardown event for peer %pM reason %u\n",
4826 ev->peer_macaddr.addr, peer_reason);
4829 ath10k_dbg(ar, ATH10K_DBG_WMI,
4830 "received unknown tdls peer event %u\n",
4836 void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
4838 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
4841 void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb)
4843 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
4846 void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb)
4848 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
4851 void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb)
4853 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
4856 void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb)
4858 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
4861 void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
4862 struct sk_buff *skb)
4864 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
4867 void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb)
4869 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
4872 void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb)
4874 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
4877 void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb)
4879 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
4882 static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
4883 u32 num_units, u32 unit_len)
4887 int idx = ar->wmi.num_mem_chunks;
4890 pool_size = num_units * round_up(unit_len, 4);
4891 vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL);
4896 memset(vaddr, 0, pool_size);
4898 ar->wmi.mem_chunks[idx].vaddr = vaddr;
4899 ar->wmi.mem_chunks[idx].paddr = paddr;
4900 ar->wmi.mem_chunks[idx].len = pool_size;
4901 ar->wmi.mem_chunks[idx].req_id = req_id;
4902 ar->wmi.num_mem_chunks++;
4907 static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
4908 u32 num_units, u32 unit_len)
4913 ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len);
4924 ath10k_wmi_is_host_mem_allocated(struct ath10k *ar,
4925 const struct wlan_host_mem_req **mem_reqs,
4928 u32 req_id, num_units, unit_size, num_unit_info;
4933 if (ar->wmi.num_mem_chunks != num_mem_reqs)
4936 for (i = 0; i < num_mem_reqs; ++i) {
4937 req_id = __le32_to_cpu(mem_reqs[i]->req_id);
4938 num_units = __le32_to_cpu(mem_reqs[i]->num_units);
4939 unit_size = __le32_to_cpu(mem_reqs[i]->unit_size);
4940 num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info);
4942 if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
4943 if (ar->num_active_peers)
4944 num_units = ar->num_active_peers + 1;
4946 num_units = ar->max_num_peers + 1;
4947 } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
4948 num_units = ar->max_num_peers + 1;
4949 } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
4950 num_units = ar->max_num_vdevs + 1;
4954 for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
4955 if (ar->wmi.mem_chunks[j].req_id == req_id) {
4956 pool_size = num_units * round_up(unit_size, 4);
4957 if (ar->wmi.mem_chunks[j].len == pool_size) {
4971 ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
4972 struct wmi_svc_rdy_ev_arg *arg)
4974 struct wmi_service_ready_event *ev;
4977 if (skb->len < sizeof(*ev))
4980 ev = (void *)skb->data;
4981 skb_pull(skb, sizeof(*ev));
4982 arg->min_tx_power = ev->hw_min_tx_power;
4983 arg->max_tx_power = ev->hw_max_tx_power;
4984 arg->ht_cap = ev->ht_cap_info;
4985 arg->vht_cap = ev->vht_cap_info;
4986 arg->sw_ver0 = ev->sw_version;
4987 arg->sw_ver1 = ev->sw_version_1;
4988 arg->phy_capab = ev->phy_capability;
4989 arg->num_rf_chains = ev->num_rf_chains;
4990 arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
4991 arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
4992 arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
4993 arg->num_mem_reqs = ev->num_mem_reqs;
4994 arg->service_map = ev->wmi_service_bitmap;
4995 arg->service_map_len = sizeof(ev->wmi_service_bitmap);
4997 n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
4998 ARRAY_SIZE(arg->mem_reqs));
4999 for (i = 0; i < n; i++)
5000 arg->mem_reqs[i] = &ev->mem_reqs[i];
5003 __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
5010 ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5011 struct wmi_svc_rdy_ev_arg *arg)
5013 struct wmi_10x_service_ready_event *ev;
5016 if (skb->len < sizeof(*ev))
5019 ev = (void *)skb->data;
5020 skb_pull(skb, sizeof(*ev));
5021 arg->min_tx_power = ev->hw_min_tx_power;
5022 arg->max_tx_power = ev->hw_max_tx_power;
5023 arg->ht_cap = ev->ht_cap_info;
5024 arg->vht_cap = ev->vht_cap_info;
5025 arg->sw_ver0 = ev->sw_version;
5026 arg->phy_capab = ev->phy_capability;
5027 arg->num_rf_chains = ev->num_rf_chains;
5028 arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
5029 arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
5030 arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
5031 arg->num_mem_reqs = ev->num_mem_reqs;
5032 arg->service_map = ev->wmi_service_bitmap;
5033 arg->service_map_len = sizeof(ev->wmi_service_bitmap);
5035 n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs),
5036 ARRAY_SIZE(arg->mem_reqs));
5037 for (i = 0; i < n; i++)
5038 arg->mem_reqs[i] = &ev->mem_reqs[i];
5041 __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0]))
5047 static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
5049 struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work);
5050 struct sk_buff *skb = ar->svc_rdy_skb;
5051 struct wmi_svc_rdy_ev_arg arg = {};
5052 u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
5057 ath10k_warn(ar, "invalid service ready event skb\n");
5061 ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg);
5063 ath10k_warn(ar, "failed to parse service ready: %d\n", ret);
5067 ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
5068 arg.service_map_len);
5070 ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power);
5071 ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power);
5072 ar->ht_cap_info = __le32_to_cpu(arg.ht_cap);
5073 ar->vht_cap_info = __le32_to_cpu(arg.vht_cap);
5074 ar->fw_version_major =
5075 (__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24;
5076 ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff);
5077 ar->fw_version_release =
5078 (__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16;
5079 ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff);
5080 ar->phy_capability = __le32_to_cpu(arg.phy_capab);
5081 ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains);
5082 ar->hw_eeprom_rd = __le32_to_cpu(arg.eeprom_rd);
5083 ar->low_5ghz_chan = __le32_to_cpu(arg.low_5ghz_chan);
5084 ar->high_5ghz_chan = __le32_to_cpu(arg.high_5ghz_chan);
5086 ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
5087 arg.service_map, arg.service_map_len);
5089 if (ar->num_rf_chains > ar->max_spatial_stream) {
5090 ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n",
5091 ar->num_rf_chains, ar->max_spatial_stream);
5092 ar->num_rf_chains = ar->max_spatial_stream;
5095 if (!ar->cfg_tx_chainmask) {
5096 ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
5097 ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
5100 if (strlen(ar->hw->wiphy->fw_version) == 0) {
5101 snprintf(ar->hw->wiphy->fw_version,
5102 sizeof(ar->hw->wiphy->fw_version),
5104 ar->fw_version_major,
5105 ar->fw_version_minor,
5106 ar->fw_version_release,
5107 ar->fw_version_build);
5110 num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs);
5111 if (num_mem_reqs > WMI_MAX_MEM_REQS) {
5112 ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n",
5117 if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) {
5118 if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
5119 ar->running_fw->fw_file.fw_features))
5120 ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC +
5123 ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
5126 ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
5128 ar->num_tids = ar->num_active_peers * 2;
5129 ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
5132 /* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE
5133 * and WMI_SERVICE_IRAM_TIDS, etc.
5136 allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
5139 goto skip_mem_alloc;
5141 /* Either this event is received during boot time or there is a change
5142 * in memory requirement from firmware when compared to last request.
5143 * Free any old memory and do a fresh allocation based on the current
5144 * memory requirement.
5146 ath10k_wmi_free_host_mem(ar);
5148 for (i = 0; i < num_mem_reqs; ++i) {
5149 req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id);
5150 num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units);
5151 unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size);
5152 num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info);
5154 if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
5155 if (ar->num_active_peers)
5156 num_units = ar->num_active_peers + 1;
5158 num_units = ar->max_num_peers + 1;
5159 } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
5160 /* number of units to allocate is number of
5161 * peers, 1 extra for self peer on target
5162 * this needs to be tied, host and target
5163 * can get out of sync
5165 num_units = ar->max_num_peers + 1;
5166 } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
5167 num_units = ar->max_num_vdevs + 1;
5170 ath10k_dbg(ar, ATH10K_DBG_WMI,
5171 "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
5173 __le32_to_cpu(arg.mem_reqs[i]->num_units),
5178 ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
5185 ath10k_dbg(ar, ATH10K_DBG_WMI,
5186 "wmi event service ready min_tx_power 0x%08x max_tx_power 0x%08x ht_cap 0x%08x vht_cap 0x%08x sw_ver0 0x%08x sw_ver1 0x%08x fw_build 0x%08x phy_capab 0x%08x num_rf_chains 0x%08x eeprom_rd 0x%08x num_mem_reqs 0x%08x\n",
5187 __le32_to_cpu(arg.min_tx_power),
5188 __le32_to_cpu(arg.max_tx_power),
5189 __le32_to_cpu(arg.ht_cap),
5190 __le32_to_cpu(arg.vht_cap),
5191 __le32_to_cpu(arg.sw_ver0),
5192 __le32_to_cpu(arg.sw_ver1),
5193 __le32_to_cpu(arg.fw_build),
5194 __le32_to_cpu(arg.phy_capab),
5195 __le32_to_cpu(arg.num_rf_chains),
5196 __le32_to_cpu(arg.eeprom_rd),
5197 __le32_to_cpu(arg.num_mem_reqs));
5200 ar->svc_rdy_skb = NULL;
5201 complete(&ar->wmi.service_ready);
5204 void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb)
5206 ar->svc_rdy_skb = skb;
5207 queue_work(ar->workqueue_aux, &ar->svc_rdy_work);
5210 static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5211 struct wmi_rdy_ev_arg *arg)
5213 struct wmi_ready_event *ev = (void *)skb->data;
5215 if (skb->len < sizeof(*ev))
5218 skb_pull(skb, sizeof(*ev));
5219 arg->sw_version = ev->sw_version;
5220 arg->abi_version = ev->abi_version;
5221 arg->status = ev->status;
5222 arg->mac_addr = ev->mac_addr.addr;
5227 static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
5228 struct wmi_roam_ev_arg *arg)
5230 struct wmi_roam_ev *ev = (void *)skb->data;
5232 if (skb->len < sizeof(*ev))
5235 skb_pull(skb, sizeof(*ev));
5236 arg->vdev_id = ev->vdev_id;
5237 arg->reason = ev->reason;
5242 static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar,
5243 struct sk_buff *skb,
5244 struct wmi_echo_ev_arg *arg)
5246 struct wmi_echo_event *ev = (void *)skb->data;
5248 arg->value = ev->value;
5253 int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb)
5255 struct wmi_rdy_ev_arg arg = {};
5258 ret = ath10k_wmi_pull_rdy(ar, skb, &arg);
5260 ath10k_warn(ar, "failed to parse ready event: %d\n", ret);
5264 ath10k_dbg(ar, ATH10K_DBG_WMI,
5265 "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
5266 __le32_to_cpu(arg.sw_version),
5267 __le32_to_cpu(arg.abi_version),
5269 __le32_to_cpu(arg.status));
5271 ether_addr_copy(ar->mac_addr, arg.mac_addr);
5272 complete(&ar->wmi.unified_ready);
5276 void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb)
5279 struct wmi_svc_avail_ev_arg arg = {};
5281 ret = ath10k_wmi_pull_svc_avail(ar, skb, &arg);
5283 ath10k_warn(ar, "failed to parse servive available event: %d\n",
5287 ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
5288 __le32_to_cpu(arg.service_map_ext_len));
5291 static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
5293 const struct wmi_pdev_temperature_event *ev;
5295 ev = (struct wmi_pdev_temperature_event *)skb->data;
5296 if (WARN_ON(skb->len < sizeof(*ev)))
5299 ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature));
5303 static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar,
5304 struct sk_buff *skb)
5306 struct wmi_pdev_bss_chan_info_event *ev;
5307 struct survey_info *survey;
5308 u64 busy, total, tx, rx, rx_bss;
5309 u32 freq, noise_floor;
5310 u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz;
5313 ev = (struct wmi_pdev_bss_chan_info_event *)skb->data;
5314 if (WARN_ON(skb->len < sizeof(*ev)))
5317 freq = __le32_to_cpu(ev->freq);
5318 noise_floor = __le32_to_cpu(ev->noise_floor);
5319 busy = __le64_to_cpu(ev->cycle_busy);
5320 total = __le64_to_cpu(ev->cycle_total);
5321 tx = __le64_to_cpu(ev->cycle_tx);
5322 rx = __le64_to_cpu(ev->cycle_rx);
5323 rx_bss = __le64_to_cpu(ev->cycle_rx_bss);
5325 ath10k_dbg(ar, ATH10K_DBG_WMI,
5326 "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n",
5327 freq, noise_floor, busy, total, tx, rx, rx_bss);
5329 spin_lock_bh(&ar->data_lock);
5330 idx = freq_to_idx(ar, freq);
5331 if (idx >= ARRAY_SIZE(ar->survey)) {
5332 ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n",
5337 survey = &ar->survey[idx];
5339 survey->noise = noise_floor;
5340 survey->time = div_u64(total, cc_freq_hz);
5341 survey->time_busy = div_u64(busy, cc_freq_hz);
5342 survey->time_rx = div_u64(rx_bss, cc_freq_hz);
5343 survey->time_tx = div_u64(tx, cc_freq_hz);
5344 survey->filled |= (SURVEY_INFO_NOISE_DBM |
5346 SURVEY_INFO_TIME_BUSY |
5347 SURVEY_INFO_TIME_RX |
5348 SURVEY_INFO_TIME_TX);
5350 spin_unlock_bh(&ar->data_lock);
5351 complete(&ar->bss_survey_done);
5355 static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k *ar)
5357 if (ar->hw_params.hw_ops->set_coverage_class) {
5358 spin_lock_bh(&ar->data_lock);
5360 /* This call only ensures that the modified coverage class
5361 * persists in case the firmware sets the registers back to
5362 * their default value. So calling it is only necessary if the
5363 * coverage class has a non-zero value.
5365 if (ar->fw_coverage.coverage_class)
5366 queue_work(ar->workqueue, &ar->set_coverage_class_work);
5368 spin_unlock_bh(&ar->data_lock);
5372 static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb)
5374 struct wmi_cmd_hdr *cmd_hdr;
5375 enum wmi_event_id id;
5377 cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5378 id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5380 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5383 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5386 case WMI_MGMT_RX_EVENTID:
5387 ath10k_wmi_event_mgmt_rx(ar, skb);
5388 /* mgmt_rx() owns the skb now! */
5390 case WMI_SCAN_EVENTID:
5391 ath10k_wmi_event_scan(ar, skb);
5392 ath10k_wmi_queue_set_coverage_class_work(ar);
5394 case WMI_CHAN_INFO_EVENTID:
5395 ath10k_wmi_event_chan_info(ar, skb);
5397 case WMI_ECHO_EVENTID:
5398 ath10k_wmi_event_echo(ar, skb);
5400 case WMI_DEBUG_MESG_EVENTID:
5401 ath10k_wmi_event_debug_mesg(ar, skb);
5402 ath10k_wmi_queue_set_coverage_class_work(ar);
5404 case WMI_UPDATE_STATS_EVENTID:
5405 ath10k_wmi_event_update_stats(ar, skb);
5407 case WMI_VDEV_START_RESP_EVENTID:
5408 ath10k_wmi_event_vdev_start_resp(ar, skb);
5409 ath10k_wmi_queue_set_coverage_class_work(ar);
5411 case WMI_VDEV_STOPPED_EVENTID:
5412 ath10k_wmi_event_vdev_stopped(ar, skb);
5413 ath10k_wmi_queue_set_coverage_class_work(ar);
5415 case WMI_PEER_STA_KICKOUT_EVENTID:
5416 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5418 case WMI_HOST_SWBA_EVENTID:
5419 ath10k_wmi_event_host_swba(ar, skb);
5421 case WMI_TBTTOFFSET_UPDATE_EVENTID:
5422 ath10k_wmi_event_tbttoffset_update(ar, skb);
5424 case WMI_PHYERR_EVENTID:
5425 ath10k_wmi_event_phyerr(ar, skb);
5427 case WMI_ROAM_EVENTID:
5428 ath10k_wmi_event_roam(ar, skb);
5429 ath10k_wmi_queue_set_coverage_class_work(ar);
5431 case WMI_PROFILE_MATCH:
5432 ath10k_wmi_event_profile_match(ar, skb);
5434 case WMI_DEBUG_PRINT_EVENTID:
5435 ath10k_wmi_event_debug_print(ar, skb);
5436 ath10k_wmi_queue_set_coverage_class_work(ar);
5438 case WMI_PDEV_QVIT_EVENTID:
5439 ath10k_wmi_event_pdev_qvit(ar, skb);
5441 case WMI_WLAN_PROFILE_DATA_EVENTID:
5442 ath10k_wmi_event_wlan_profile_data(ar, skb);
5444 case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
5445 ath10k_wmi_event_rtt_measurement_report(ar, skb);
5447 case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
5448 ath10k_wmi_event_tsf_measurement_report(ar, skb);
5450 case WMI_RTT_ERROR_REPORT_EVENTID:
5451 ath10k_wmi_event_rtt_error_report(ar, skb);
5453 case WMI_WOW_WAKEUP_HOST_EVENTID:
5454 ath10k_wmi_event_wow_wakeup_host(ar, skb);
5456 case WMI_DCS_INTERFERENCE_EVENTID:
5457 ath10k_wmi_event_dcs_interference(ar, skb);
5459 case WMI_PDEV_TPC_CONFIG_EVENTID:
5460 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5462 case WMI_PDEV_FTM_INTG_EVENTID:
5463 ath10k_wmi_event_pdev_ftm_intg(ar, skb);
5465 case WMI_GTK_OFFLOAD_STATUS_EVENTID:
5466 ath10k_wmi_event_gtk_offload_status(ar, skb);
5468 case WMI_GTK_REKEY_FAIL_EVENTID:
5469 ath10k_wmi_event_gtk_rekey_fail(ar, skb);
5471 case WMI_TX_DELBA_COMPLETE_EVENTID:
5472 ath10k_wmi_event_delba_complete(ar, skb);
5474 case WMI_TX_ADDBA_COMPLETE_EVENTID:
5475 ath10k_wmi_event_addba_complete(ar, skb);
5477 case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
5478 ath10k_wmi_event_vdev_install_key_complete(ar, skb);
5480 case WMI_SERVICE_READY_EVENTID:
5481 ath10k_wmi_event_service_ready(ar, skb);
5483 case WMI_READY_EVENTID:
5484 ath10k_wmi_event_ready(ar, skb);
5485 ath10k_wmi_queue_set_coverage_class_work(ar);
5487 case WMI_SERVICE_AVAILABLE_EVENTID:
5488 ath10k_wmi_event_service_available(ar, skb);
5491 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5499 static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb)
5501 struct wmi_cmd_hdr *cmd_hdr;
5502 enum wmi_10x_event_id id;
5505 cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5506 id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5508 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5511 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5513 consumed = ath10k_tm_event_wmi(ar, id, skb);
5515 /* Ready event must be handled normally also in UTF mode so that we
5516 * know the UTF firmware has booted, others we are just bypass WMI
5517 * events to testmode.
5519 if (consumed && id != WMI_10X_READY_EVENTID) {
5520 ath10k_dbg(ar, ATH10K_DBG_WMI,
5521 "wmi testmode consumed 0x%x\n", id);
5526 case WMI_10X_MGMT_RX_EVENTID:
5527 ath10k_wmi_event_mgmt_rx(ar, skb);
5528 /* mgmt_rx() owns the skb now! */
5530 case WMI_10X_SCAN_EVENTID:
5531 ath10k_wmi_event_scan(ar, skb);
5532 ath10k_wmi_queue_set_coverage_class_work(ar);
5534 case WMI_10X_CHAN_INFO_EVENTID:
5535 ath10k_wmi_event_chan_info(ar, skb);
5537 case WMI_10X_ECHO_EVENTID:
5538 ath10k_wmi_event_echo(ar, skb);
5540 case WMI_10X_DEBUG_MESG_EVENTID:
5541 ath10k_wmi_event_debug_mesg(ar, skb);
5542 ath10k_wmi_queue_set_coverage_class_work(ar);
5544 case WMI_10X_UPDATE_STATS_EVENTID:
5545 ath10k_wmi_event_update_stats(ar, skb);
5547 case WMI_10X_VDEV_START_RESP_EVENTID:
5548 ath10k_wmi_event_vdev_start_resp(ar, skb);
5549 ath10k_wmi_queue_set_coverage_class_work(ar);
5551 case WMI_10X_VDEV_STOPPED_EVENTID:
5552 ath10k_wmi_event_vdev_stopped(ar, skb);
5553 ath10k_wmi_queue_set_coverage_class_work(ar);
5555 case WMI_10X_PEER_STA_KICKOUT_EVENTID:
5556 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5558 case WMI_10X_HOST_SWBA_EVENTID:
5559 ath10k_wmi_event_host_swba(ar, skb);
5561 case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
5562 ath10k_wmi_event_tbttoffset_update(ar, skb);
5564 case WMI_10X_PHYERR_EVENTID:
5565 ath10k_wmi_event_phyerr(ar, skb);
5567 case WMI_10X_ROAM_EVENTID:
5568 ath10k_wmi_event_roam(ar, skb);
5569 ath10k_wmi_queue_set_coverage_class_work(ar);
5571 case WMI_10X_PROFILE_MATCH:
5572 ath10k_wmi_event_profile_match(ar, skb);
5574 case WMI_10X_DEBUG_PRINT_EVENTID:
5575 ath10k_wmi_event_debug_print(ar, skb);
5576 ath10k_wmi_queue_set_coverage_class_work(ar);
5578 case WMI_10X_PDEV_QVIT_EVENTID:
5579 ath10k_wmi_event_pdev_qvit(ar, skb);
5581 case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
5582 ath10k_wmi_event_wlan_profile_data(ar, skb);
5584 case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
5585 ath10k_wmi_event_rtt_measurement_report(ar, skb);
5587 case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
5588 ath10k_wmi_event_tsf_measurement_report(ar, skb);
5590 case WMI_10X_RTT_ERROR_REPORT_EVENTID:
5591 ath10k_wmi_event_rtt_error_report(ar, skb);
5593 case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
5594 ath10k_wmi_event_wow_wakeup_host(ar, skb);
5596 case WMI_10X_DCS_INTERFERENCE_EVENTID:
5597 ath10k_wmi_event_dcs_interference(ar, skb);
5599 case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
5600 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5602 case WMI_10X_INST_RSSI_STATS_EVENTID:
5603 ath10k_wmi_event_inst_rssi_stats(ar, skb);
5605 case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
5606 ath10k_wmi_event_vdev_standby_req(ar, skb);
5608 case WMI_10X_VDEV_RESUME_REQ_EVENTID:
5609 ath10k_wmi_event_vdev_resume_req(ar, skb);
5611 case WMI_10X_SERVICE_READY_EVENTID:
5612 ath10k_wmi_event_service_ready(ar, skb);
5614 case WMI_10X_READY_EVENTID:
5615 ath10k_wmi_event_ready(ar, skb);
5616 ath10k_wmi_queue_set_coverage_class_work(ar);
5618 case WMI_10X_PDEV_UTF_EVENTID:
5619 /* ignore utf events */
5622 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5630 static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
5632 struct wmi_cmd_hdr *cmd_hdr;
5633 enum wmi_10_2_event_id id;
5636 cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5637 id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5639 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
5642 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5644 consumed = ath10k_tm_event_wmi(ar, id, skb);
5646 /* Ready event must be handled normally also in UTF mode so that we
5647 * know the UTF firmware has booted, others we are just bypass WMI
5648 * events to testmode.
5650 if (consumed && id != WMI_10_2_READY_EVENTID) {
5651 ath10k_dbg(ar, ATH10K_DBG_WMI,
5652 "wmi testmode consumed 0x%x\n", id);
5657 case WMI_10_2_MGMT_RX_EVENTID:
5658 ath10k_wmi_event_mgmt_rx(ar, skb);
5659 /* mgmt_rx() owns the skb now! */
5661 case WMI_10_2_SCAN_EVENTID:
5662 ath10k_wmi_event_scan(ar, skb);
5663 ath10k_wmi_queue_set_coverage_class_work(ar);
5665 case WMI_10_2_CHAN_INFO_EVENTID:
5666 ath10k_wmi_event_chan_info(ar, skb);
5668 case WMI_10_2_ECHO_EVENTID:
5669 ath10k_wmi_event_echo(ar, skb);
5671 case WMI_10_2_DEBUG_MESG_EVENTID:
5672 ath10k_wmi_event_debug_mesg(ar, skb);
5673 ath10k_wmi_queue_set_coverage_class_work(ar);
5675 case WMI_10_2_UPDATE_STATS_EVENTID:
5676 ath10k_wmi_event_update_stats(ar, skb);
5678 case WMI_10_2_VDEV_START_RESP_EVENTID:
5679 ath10k_wmi_event_vdev_start_resp(ar, skb);
5680 ath10k_wmi_queue_set_coverage_class_work(ar);
5682 case WMI_10_2_VDEV_STOPPED_EVENTID:
5683 ath10k_wmi_event_vdev_stopped(ar, skb);
5684 ath10k_wmi_queue_set_coverage_class_work(ar);
5686 case WMI_10_2_PEER_STA_KICKOUT_EVENTID:
5687 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5689 case WMI_10_2_HOST_SWBA_EVENTID:
5690 ath10k_wmi_event_host_swba(ar, skb);
5692 case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID:
5693 ath10k_wmi_event_tbttoffset_update(ar, skb);
5695 case WMI_10_2_PHYERR_EVENTID:
5696 ath10k_wmi_event_phyerr(ar, skb);
5698 case WMI_10_2_ROAM_EVENTID:
5699 ath10k_wmi_event_roam(ar, skb);
5700 ath10k_wmi_queue_set_coverage_class_work(ar);
5702 case WMI_10_2_PROFILE_MATCH:
5703 ath10k_wmi_event_profile_match(ar, skb);
5705 case WMI_10_2_DEBUG_PRINT_EVENTID:
5706 ath10k_wmi_event_debug_print(ar, skb);
5707 ath10k_wmi_queue_set_coverage_class_work(ar);
5709 case WMI_10_2_PDEV_QVIT_EVENTID:
5710 ath10k_wmi_event_pdev_qvit(ar, skb);
5712 case WMI_10_2_WLAN_PROFILE_DATA_EVENTID:
5713 ath10k_wmi_event_wlan_profile_data(ar, skb);
5715 case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID:
5716 ath10k_wmi_event_rtt_measurement_report(ar, skb);
5718 case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID:
5719 ath10k_wmi_event_tsf_measurement_report(ar, skb);
5721 case WMI_10_2_RTT_ERROR_REPORT_EVENTID:
5722 ath10k_wmi_event_rtt_error_report(ar, skb);
5724 case WMI_10_2_WOW_WAKEUP_HOST_EVENTID:
5725 ath10k_wmi_event_wow_wakeup_host(ar, skb);
5727 case WMI_10_2_DCS_INTERFERENCE_EVENTID:
5728 ath10k_wmi_event_dcs_interference(ar, skb);
5730 case WMI_10_2_PDEV_TPC_CONFIG_EVENTID:
5731 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5733 case WMI_10_2_INST_RSSI_STATS_EVENTID:
5734 ath10k_wmi_event_inst_rssi_stats(ar, skb);
5736 case WMI_10_2_VDEV_STANDBY_REQ_EVENTID:
5737 ath10k_wmi_event_vdev_standby_req(ar, skb);
5738 ath10k_wmi_queue_set_coverage_class_work(ar);
5740 case WMI_10_2_VDEV_RESUME_REQ_EVENTID:
5741 ath10k_wmi_event_vdev_resume_req(ar, skb);
5742 ath10k_wmi_queue_set_coverage_class_work(ar);
5744 case WMI_10_2_SERVICE_READY_EVENTID:
5745 ath10k_wmi_event_service_ready(ar, skb);
5747 case WMI_10_2_READY_EVENTID:
5748 ath10k_wmi_event_ready(ar, skb);
5749 ath10k_wmi_queue_set_coverage_class_work(ar);
5751 case WMI_10_2_PDEV_TEMPERATURE_EVENTID:
5752 ath10k_wmi_event_temperature(ar, skb);
5754 case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID:
5755 ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
5757 case WMI_10_2_RTT_KEEPALIVE_EVENTID:
5758 case WMI_10_2_GPIO_INPUT_EVENTID:
5759 case WMI_10_2_PEER_RATECODE_LIST_EVENTID:
5760 case WMI_10_2_GENERIC_BUFFER_EVENTID:
5761 case WMI_10_2_MCAST_BUF_RELEASE_EVENTID:
5762 case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID:
5763 case WMI_10_2_WDS_PEER_EVENTID:
5764 ath10k_dbg(ar, ATH10K_DBG_WMI,
5765 "received event id %d not implemented\n", id);
5768 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5776 static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
5778 struct wmi_cmd_hdr *cmd_hdr;
5779 enum wmi_10_4_event_id id;
5782 cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
5783 id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
5785 if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr)))
5788 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5790 consumed = ath10k_tm_event_wmi(ar, id, skb);
5792 /* Ready event must be handled normally also in UTF mode so that we
5793 * know the UTF firmware has booted, others we are just bypass WMI
5794 * events to testmode.
5796 if (consumed && id != WMI_10_4_READY_EVENTID) {
5797 ath10k_dbg(ar, ATH10K_DBG_WMI,
5798 "wmi testmode consumed 0x%x\n", id);
5803 case WMI_10_4_MGMT_RX_EVENTID:
5804 ath10k_wmi_event_mgmt_rx(ar, skb);
5805 /* mgmt_rx() owns the skb now! */
5807 case WMI_10_4_ECHO_EVENTID:
5808 ath10k_wmi_event_echo(ar, skb);
5810 case WMI_10_4_DEBUG_MESG_EVENTID:
5811 ath10k_wmi_event_debug_mesg(ar, skb);
5812 ath10k_wmi_queue_set_coverage_class_work(ar);
5814 case WMI_10_4_SERVICE_READY_EVENTID:
5815 ath10k_wmi_event_service_ready(ar, skb);
5817 case WMI_10_4_SCAN_EVENTID:
5818 ath10k_wmi_event_scan(ar, skb);
5819 ath10k_wmi_queue_set_coverage_class_work(ar);
5821 case WMI_10_4_CHAN_INFO_EVENTID:
5822 ath10k_wmi_event_chan_info(ar, skb);
5824 case WMI_10_4_PHYERR_EVENTID:
5825 ath10k_wmi_event_phyerr(ar, skb);
5827 case WMI_10_4_READY_EVENTID:
5828 ath10k_wmi_event_ready(ar, skb);
5829 ath10k_wmi_queue_set_coverage_class_work(ar);
5831 case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
5832 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5834 case WMI_10_4_ROAM_EVENTID:
5835 ath10k_wmi_event_roam(ar, skb);
5836 ath10k_wmi_queue_set_coverage_class_work(ar);
5838 case WMI_10_4_HOST_SWBA_EVENTID:
5839 ath10k_wmi_event_host_swba(ar, skb);
5841 case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID:
5842 ath10k_wmi_event_tbttoffset_update(ar, skb);
5844 case WMI_10_4_DEBUG_PRINT_EVENTID:
5845 ath10k_wmi_event_debug_print(ar, skb);
5846 ath10k_wmi_queue_set_coverage_class_work(ar);
5848 case WMI_10_4_VDEV_START_RESP_EVENTID:
5849 ath10k_wmi_event_vdev_start_resp(ar, skb);
5850 ath10k_wmi_queue_set_coverage_class_work(ar);
5852 case WMI_10_4_VDEV_STOPPED_EVENTID:
5853 ath10k_wmi_event_vdev_stopped(ar, skb);
5854 ath10k_wmi_queue_set_coverage_class_work(ar);
5856 case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
5857 case WMI_10_4_PEER_RATECODE_LIST_EVENTID:
5858 case WMI_10_4_WDS_PEER_EVENTID:
5859 case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID:
5860 ath10k_dbg(ar, ATH10K_DBG_WMI,
5861 "received event id %d not implemented\n", id);
5863 case WMI_10_4_UPDATE_STATS_EVENTID:
5864 ath10k_wmi_event_update_stats(ar, skb);
5866 case WMI_10_4_PDEV_TEMPERATURE_EVENTID:
5867 ath10k_wmi_event_temperature(ar, skb);
5869 case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID:
5870 ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
5872 case WMI_10_4_PDEV_TPC_CONFIG_EVENTID:
5873 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5875 case WMI_10_4_TDLS_PEER_EVENTID:
5876 ath10k_wmi_handle_tdls_peer_event(ar, skb);
5878 case WMI_10_4_PDEV_TPC_TABLE_EVENTID:
5879 ath10k_wmi_event_tpc_final_table(ar, skb);
5882 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5890 static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
5894 ret = ath10k_wmi_rx(ar, skb);
5896 ath10k_warn(ar, "failed to process wmi rx: %d\n", ret);
5899 int ath10k_wmi_connect(struct ath10k *ar)
5902 struct ath10k_htc_svc_conn_req conn_req;
5903 struct ath10k_htc_svc_conn_resp conn_resp;
5905 memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
5907 memset(&conn_req, 0, sizeof(conn_req));
5908 memset(&conn_resp, 0, sizeof(conn_resp));
5910 /* these fields are the same for all service endpoints */
5911 conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
5912 conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
5913 conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;
5915 /* connect to control service */
5916 conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;
5918 status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
5920 ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n",
5925 ar->wmi.eid = conn_resp.eid;
5929 static struct sk_buff *
5930 ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
5931 u16 ctl2g, u16 ctl5g,
5932 enum wmi_dfs_region dfs_reg)
5934 struct wmi_pdev_set_regdomain_cmd *cmd;
5935 struct sk_buff *skb;
5937 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5939 return ERR_PTR(-ENOMEM);
5941 cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data;
5942 cmd->reg_domain = __cpu_to_le32(rd);
5943 cmd->reg_domain_2G = __cpu_to_le32(rd2g);
5944 cmd->reg_domain_5G = __cpu_to_le32(rd5g);
5945 cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
5946 cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
5948 ath10k_dbg(ar, ATH10K_DBG_WMI,
5949 "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
5950 rd, rd2g, rd5g, ctl2g, ctl5g);
5954 static struct sk_buff *
5955 ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16
5956 rd5g, u16 ctl2g, u16 ctl5g,
5957 enum wmi_dfs_region dfs_reg)
5959 struct wmi_pdev_set_regdomain_cmd_10x *cmd;
5960 struct sk_buff *skb;
5962 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5964 return ERR_PTR(-ENOMEM);
5966 cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data;
5967 cmd->reg_domain = __cpu_to_le32(rd);
5968 cmd->reg_domain_2G = __cpu_to_le32(rd2g);
5969 cmd->reg_domain_5G = __cpu_to_le32(rd5g);
5970 cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
5971 cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
5972 cmd->dfs_domain = __cpu_to_le32(dfs_reg);
5974 ath10k_dbg(ar, ATH10K_DBG_WMI,
5975 "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
5976 rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
5980 static struct sk_buff *
5981 ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt)
5983 struct wmi_pdev_suspend_cmd *cmd;
5984 struct sk_buff *skb;
5986 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
5988 return ERR_PTR(-ENOMEM);
5990 cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
5991 cmd->suspend_opt = __cpu_to_le32(suspend_opt);
5996 static struct sk_buff *
5997 ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar)
5999 struct sk_buff *skb;
6001 skb = ath10k_wmi_alloc_skb(ar, 0);
6003 return ERR_PTR(-ENOMEM);
6008 static struct sk_buff *
6009 ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
6011 struct wmi_pdev_set_param_cmd *cmd;
6012 struct sk_buff *skb;
6014 if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
6015 ath10k_warn(ar, "pdev param %d not supported by firmware\n",
6017 return ERR_PTR(-EOPNOTSUPP);
6020 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6022 return ERR_PTR(-ENOMEM);
6024 cmd = (struct wmi_pdev_set_param_cmd *)skb->data;
6025 cmd->param_id = __cpu_to_le32(id);
6026 cmd->param_value = __cpu_to_le32(value);
6028 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
6033 void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
6034 struct wmi_host_mem_chunks *chunks)
6036 struct host_memory_chunk *chunk;
6039 chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks);
6041 for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
6042 chunk = &chunks->items[i];
6043 chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
6044 chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len);
6045 chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
6047 ath10k_dbg(ar, ATH10K_DBG_WMI,
6048 "wmi chunk %d len %d requested, addr 0x%llx\n",
6050 ar->wmi.mem_chunks[i].len,
6051 (unsigned long long)ar->wmi.mem_chunks[i].paddr);
6055 static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar)
6057 struct wmi_init_cmd *cmd;
6058 struct sk_buff *buf;
6059 struct wmi_resource_config config = {};
6062 config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
6063 config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS);
6064 config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS);
6066 config.num_offload_reorder_bufs =
6067 __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS);
6069 config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS);
6070 config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS);
6071 config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT);
6072 config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK);
6073 config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK);
6074 config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
6075 config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
6076 config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
6077 config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI);
6078 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6079 config.scan_max_pending_reqs =
6080 __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS);
6082 config.bmiss_offload_max_vdev =
6083 __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV);
6085 config.roam_offload_max_vdev =
6086 __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV);
6088 config.roam_offload_max_ap_profiles =
6089 __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES);
6091 config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS);
6092 config.num_mcast_table_elems =
6093 __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS);
6095 config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE);
6096 config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE);
6097 config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES);
6098 config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE);
6099 config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM);
6101 val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
6102 config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
6104 config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG);
6106 config.gtk_offload_max_vdev =
6107 __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV);
6109 config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
6110 config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
6112 len = sizeof(*cmd) +
6113 (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6115 buf = ath10k_wmi_alloc_skb(ar, len);
6117 return ERR_PTR(-ENOMEM);
6119 cmd = (struct wmi_init_cmd *)buf->data;
6121 memcpy(&cmd->resource_config, &config, sizeof(config));
6122 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6124 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
6128 static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar)
6130 struct wmi_init_cmd_10x *cmd;
6131 struct sk_buff *buf;
6132 struct wmi_resource_config_10x config = {};
6135 config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
6136 config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
6137 config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
6138 config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
6139 config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
6140 config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
6141 config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
6142 config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6143 config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6144 config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6145 config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
6146 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6147 config.scan_max_pending_reqs =
6148 __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
6150 config.bmiss_offload_max_vdev =
6151 __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
6153 config.roam_offload_max_vdev =
6154 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
6156 config.roam_offload_max_ap_profiles =
6157 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
6159 config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
6160 config.num_mcast_table_elems =
6161 __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
6163 config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
6164 config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
6165 config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
6166 config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE);
6167 config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
6169 val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
6170 config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
6172 config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
6174 config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
6175 config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
6177 len = sizeof(*cmd) +
6178 (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6180 buf = ath10k_wmi_alloc_skb(ar, len);
6182 return ERR_PTR(-ENOMEM);
6184 cmd = (struct wmi_init_cmd_10x *)buf->data;
6186 memcpy(&cmd->resource_config, &config, sizeof(config));
6187 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6189 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
6193 static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
6195 struct wmi_init_cmd_10_2 *cmd;
6196 struct sk_buff *buf;
6197 struct wmi_resource_config_10x config = {};
6198 u32 len, val, features;
6200 config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
6201 config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
6203 if (ath10k_peer_stats_enabled(ar)) {
6204 config.num_peers = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_PEERS);
6205 config.num_tids = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_TIDS);
6207 config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
6208 config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
6211 config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
6212 config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
6213 config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
6214 config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6215 config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6216 config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
6217 config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
6218 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6220 config.scan_max_pending_reqs =
6221 __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
6223 config.bmiss_offload_max_vdev =
6224 __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
6226 config.roam_offload_max_vdev =
6227 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
6229 config.roam_offload_max_ap_profiles =
6230 __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
6232 config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
6233 config.num_mcast_table_elems =
6234 __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
6236 config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
6237 config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
6238 config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
6239 config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE);
6240 config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
6242 val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
6243 config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
6245 config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
6247 config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
6248 config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
6250 len = sizeof(*cmd) +
6251 (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6253 buf = ath10k_wmi_alloc_skb(ar, len);
6255 return ERR_PTR(-ENOMEM);
6257 cmd = (struct wmi_init_cmd_10_2 *)buf->data;
6259 features = WMI_10_2_RX_BATCH_MODE;
6261 if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) &&
6262 test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
6263 features |= WMI_10_2_COEX_GPIO;
6265 if (ath10k_peer_stats_enabled(ar))
6266 features |= WMI_10_2_PEER_STATS;
6268 if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map))
6269 features |= WMI_10_2_BSS_CHAN_INFO;
6271 cmd->resource_config.feature_mask = __cpu_to_le32(features);
6273 memcpy(&cmd->resource_config.common, &config, sizeof(config));
6274 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6276 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
6280 static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
6282 struct wmi_init_cmd_10_4 *cmd;
6283 struct sk_buff *buf;
6284 struct wmi_resource_config_10_4 config = {};
6287 config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
6288 config.num_peers = __cpu_to_le32(ar->max_num_peers);
6289 config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
6290 config.num_tids = __cpu_to_le32(ar->num_tids);
6292 config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS);
6293 config.num_offload_reorder_buffs =
6294 __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS);
6295 config.num_peer_keys = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS);
6296 config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT);
6297 config.tx_chain_mask = __cpu_to_le32(ar->hw_params.tx_chain_mask);
6298 config.rx_chain_mask = __cpu_to_le32(ar->hw_params.rx_chain_mask);
6300 config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6301 config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6302 config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
6303 config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI);
6305 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6306 config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS);
6307 config.bmiss_offload_max_vdev =
6308 __cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV);
6309 config.roam_offload_max_vdev =
6310 __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV);
6311 config.roam_offload_max_ap_profiles =
6312 __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES);
6313 config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS);
6314 config.num_mcast_table_elems =
6315 __cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS);
6317 config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE);
6318 config.tx_dbg_log_size = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE);
6319 config.num_wds_entries = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES);
6320 config.dma_burst_size = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE);
6321 config.mac_aggr_delim = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM);
6323 config.rx_skip_defrag_timeout_dup_detection_check =
6324 __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK);
6326 config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG);
6327 config.gtk_offload_max_vdev =
6328 __cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV);
6329 config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx);
6330 config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS);
6331 config.max_peer_ext_stats =
6332 __cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS);
6333 config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP);
6335 config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE);
6336 config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE);
6337 config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE);
6338 config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE);
6340 config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE);
6342 __cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG);
6343 config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG);
6344 config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG);
6345 config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG);
6347 len = sizeof(*cmd) +
6348 (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
6350 buf = ath10k_wmi_alloc_skb(ar, len);
6352 return ERR_PTR(-ENOMEM);
6354 cmd = (struct wmi_init_cmd_10_4 *)buf->data;
6355 memcpy(&cmd->resource_config, &config, sizeof(config));
6356 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6358 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
6362 int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg)
6364 if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN)
6366 if (arg->n_channels > ARRAY_SIZE(arg->channels))
6368 if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID)
6370 if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID)
6377 ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg)
6382 len += sizeof(struct wmi_ie_data);
6383 len += roundup(arg->ie_len, 4);
6386 if (arg->n_channels) {
6387 len += sizeof(struct wmi_chan_list);
6388 len += sizeof(__le32) * arg->n_channels;
6392 len += sizeof(struct wmi_ssid_list);
6393 len += sizeof(struct wmi_ssid) * arg->n_ssids;
6396 if (arg->n_bssids) {
6397 len += sizeof(struct wmi_bssid_list);
6398 len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
6404 void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn,
6405 const struct wmi_start_scan_arg *arg)
6410 scan_id = WMI_HOST_SCAN_REQ_ID_PREFIX;
6411 scan_id |= arg->scan_id;
6413 scan_req_id = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
6414 scan_req_id |= arg->scan_req_id;
6416 cmn->scan_id = __cpu_to_le32(scan_id);
6417 cmn->scan_req_id = __cpu_to_le32(scan_req_id);
6418 cmn->vdev_id = __cpu_to_le32(arg->vdev_id);
6419 cmn->scan_priority = __cpu_to_le32(arg->scan_priority);
6420 cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events);
6421 cmn->dwell_time_active = __cpu_to_le32(arg->dwell_time_active);
6422 cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive);
6423 cmn->min_rest_time = __cpu_to_le32(arg->min_rest_time);
6424 cmn->max_rest_time = __cpu_to_le32(arg->max_rest_time);
6425 cmn->repeat_probe_time = __cpu_to_le32(arg->repeat_probe_time);
6426 cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time);
6427 cmn->idle_time = __cpu_to_le32(arg->idle_time);
6428 cmn->max_scan_time = __cpu_to_le32(arg->max_scan_time);
6429 cmn->probe_delay = __cpu_to_le32(arg->probe_delay);
6430 cmn->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags);
6434 ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs,
6435 const struct wmi_start_scan_arg *arg)
6437 struct wmi_ie_data *ie;
6438 struct wmi_chan_list *channels;
6439 struct wmi_ssid_list *ssids;
6440 struct wmi_bssid_list *bssids;
6441 void *ptr = tlvs->tlvs;
6444 if (arg->n_channels) {
6446 channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG);
6447 channels->num_chan = __cpu_to_le32(arg->n_channels);
6449 for (i = 0; i < arg->n_channels; i++)
6450 channels->channel_list[i].freq =
6451 __cpu_to_le16(arg->channels[i]);
6453 ptr += sizeof(*channels);
6454 ptr += sizeof(__le32) * arg->n_channels;
6459 ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG);
6460 ssids->num_ssids = __cpu_to_le32(arg->n_ssids);
6462 for (i = 0; i < arg->n_ssids; i++) {
6463 ssids->ssids[i].ssid_len =
6464 __cpu_to_le32(arg->ssids[i].len);
6465 memcpy(&ssids->ssids[i].ssid,
6470 ptr += sizeof(*ssids);
6471 ptr += sizeof(struct wmi_ssid) * arg->n_ssids;
6474 if (arg->n_bssids) {
6476 bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG);
6477 bssids->num_bssid = __cpu_to_le32(arg->n_bssids);
6479 for (i = 0; i < arg->n_bssids; i++)
6480 ether_addr_copy(bssids->bssid_list[i].addr,
6481 arg->bssids[i].bssid);
6483 ptr += sizeof(*bssids);
6484 ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids;
6489 ie->tag = __cpu_to_le32(WMI_IE_TAG);
6490 ie->ie_len = __cpu_to_le32(arg->ie_len);
6491 memcpy(ie->ie_data, arg->ie, arg->ie_len);
6494 ptr += roundup(arg->ie_len, 4);
6498 static struct sk_buff *
6499 ath10k_wmi_op_gen_start_scan(struct ath10k *ar,
6500 const struct wmi_start_scan_arg *arg)
6502 struct wmi_start_scan_cmd *cmd;
6503 struct sk_buff *skb;
6507 ret = ath10k_wmi_start_scan_verify(arg);
6509 return ERR_PTR(ret);
6511 len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6512 skb = ath10k_wmi_alloc_skb(ar, len);
6514 return ERR_PTR(-ENOMEM);
6516 cmd = (struct wmi_start_scan_cmd *)skb->data;
6518 ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6519 ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6521 cmd->burst_duration_ms = __cpu_to_le32(0);
6523 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
6527 static struct sk_buff *
6528 ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar,
6529 const struct wmi_start_scan_arg *arg)
6531 struct wmi_10x_start_scan_cmd *cmd;
6532 struct sk_buff *skb;
6536 ret = ath10k_wmi_start_scan_verify(arg);
6538 return ERR_PTR(ret);
6540 len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
6541 skb = ath10k_wmi_alloc_skb(ar, len);
6543 return ERR_PTR(-ENOMEM);
6545 cmd = (struct wmi_10x_start_scan_cmd *)skb->data;
6547 ath10k_wmi_put_start_scan_common(&cmd->common, arg);
6548 ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);
6550 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
6554 void ath10k_wmi_start_scan_init(struct ath10k *ar,
6555 struct wmi_start_scan_arg *arg)
6557 /* setup commonly used values */
6558 arg->scan_req_id = 1;
6559 arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
6560 arg->dwell_time_active = 50;
6561 arg->dwell_time_passive = 150;
6562 arg->min_rest_time = 50;
6563 arg->max_rest_time = 500;
6564 arg->repeat_probe_time = 0;
6565 arg->probe_spacing_time = 0;
6567 arg->max_scan_time = 20000;
6568 arg->probe_delay = 5;
6569 arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
6570 | WMI_SCAN_EVENT_COMPLETED
6571 | WMI_SCAN_EVENT_BSS_CHANNEL
6572 | WMI_SCAN_EVENT_FOREIGN_CHANNEL
6573 | WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT
6574 | WMI_SCAN_EVENT_DEQUEUED;
6575 arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
6577 arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF";
6580 static struct sk_buff *
6581 ath10k_wmi_op_gen_stop_scan(struct ath10k *ar,
6582 const struct wmi_stop_scan_arg *arg)
6584 struct wmi_stop_scan_cmd *cmd;
6585 struct sk_buff *skb;
6589 if (arg->req_id > 0xFFF)
6590 return ERR_PTR(-EINVAL);
6591 if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF)
6592 return ERR_PTR(-EINVAL);
6594 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6596 return ERR_PTR(-ENOMEM);
6598 scan_id = arg->u.scan_id;
6599 scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;
6601 req_id = arg->req_id;
6602 req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
6604 cmd = (struct wmi_stop_scan_cmd *)skb->data;
6605 cmd->req_type = __cpu_to_le32(arg->req_type);
6606 cmd->vdev_id = __cpu_to_le32(arg->u.vdev_id);
6607 cmd->scan_id = __cpu_to_le32(scan_id);
6608 cmd->scan_req_id = __cpu_to_le32(req_id);
6610 ath10k_dbg(ar, ATH10K_DBG_WMI,
6611 "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
6612 arg->req_id, arg->req_type, arg->u.scan_id);
6616 static struct sk_buff *
6617 ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id,
6618 enum wmi_vdev_type type,
6619 enum wmi_vdev_subtype subtype,
6620 const u8 macaddr[ETH_ALEN])
6622 struct wmi_vdev_create_cmd *cmd;
6623 struct sk_buff *skb;
6625 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6627 return ERR_PTR(-ENOMEM);
6629 cmd = (struct wmi_vdev_create_cmd *)skb->data;
6630 cmd->vdev_id = __cpu_to_le32(vdev_id);
6631 cmd->vdev_type = __cpu_to_le32(type);
6632 cmd->vdev_subtype = __cpu_to_le32(subtype);
6633 ether_addr_copy(cmd->vdev_macaddr.addr, macaddr);
6635 ath10k_dbg(ar, ATH10K_DBG_WMI,
6636 "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
6637 vdev_id, type, subtype, macaddr);
6641 static struct sk_buff *
6642 ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id)
6644 struct wmi_vdev_delete_cmd *cmd;
6645 struct sk_buff *skb;
6647 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6649 return ERR_PTR(-ENOMEM);
6651 cmd = (struct wmi_vdev_delete_cmd *)skb->data;
6652 cmd->vdev_id = __cpu_to_le32(vdev_id);
6654 ath10k_dbg(ar, ATH10K_DBG_WMI,
6655 "WMI vdev delete id %d\n", vdev_id);
6659 static struct sk_buff *
6660 ath10k_wmi_op_gen_vdev_start(struct ath10k *ar,
6661 const struct wmi_vdev_start_request_arg *arg,
6664 struct wmi_vdev_start_request_cmd *cmd;
6665 struct sk_buff *skb;
6666 const char *cmdname;
6669 if (WARN_ON(arg->hidden_ssid && !arg->ssid))
6670 return ERR_PTR(-EINVAL);
6671 if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
6672 return ERR_PTR(-EINVAL);
6675 cmdname = "restart";
6679 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6681 return ERR_PTR(-ENOMEM);
6683 if (arg->hidden_ssid)
6684 flags |= WMI_VDEV_START_HIDDEN_SSID;
6685 if (arg->pmf_enabled)
6686 flags |= WMI_VDEV_START_PMF_ENABLED;
6688 cmd = (struct wmi_vdev_start_request_cmd *)skb->data;
6689 cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
6690 cmd->disable_hw_ack = __cpu_to_le32(arg->disable_hw_ack);
6691 cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval);
6692 cmd->dtim_period = __cpu_to_le32(arg->dtim_period);
6693 cmd->flags = __cpu_to_le32(flags);
6694 cmd->bcn_tx_rate = __cpu_to_le32(arg->bcn_tx_rate);
6695 cmd->bcn_tx_power = __cpu_to_le32(arg->bcn_tx_power);
6698 cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len);
6699 memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
6702 ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel);
6704 ath10k_dbg(ar, ATH10K_DBG_WMI,
6705 "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
6706 cmdname, arg->vdev_id,
6707 flags, arg->channel.freq, arg->channel.mode,
6708 cmd->chan.flags, arg->channel.max_power);
6713 static struct sk_buff *
6714 ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id)
6716 struct wmi_vdev_stop_cmd *cmd;
6717 struct sk_buff *skb;
6719 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6721 return ERR_PTR(-ENOMEM);
6723 cmd = (struct wmi_vdev_stop_cmd *)skb->data;
6724 cmd->vdev_id = __cpu_to_le32(vdev_id);
6726 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
6730 static struct sk_buff *
6731 ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid,
6734 struct wmi_vdev_up_cmd *cmd;
6735 struct sk_buff *skb;
6737 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6739 return ERR_PTR(-ENOMEM);
6741 cmd = (struct wmi_vdev_up_cmd *)skb->data;
6742 cmd->vdev_id = __cpu_to_le32(vdev_id);
6743 cmd->vdev_assoc_id = __cpu_to_le32(aid);
6744 ether_addr_copy(cmd->vdev_bssid.addr, bssid);
6746 ath10k_dbg(ar, ATH10K_DBG_WMI,
6747 "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
6748 vdev_id, aid, bssid);
6752 static struct sk_buff *
6753 ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id)
6755 struct wmi_vdev_down_cmd *cmd;
6756 struct sk_buff *skb;
6758 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6760 return ERR_PTR(-ENOMEM);
6762 cmd = (struct wmi_vdev_down_cmd *)skb->data;
6763 cmd->vdev_id = __cpu_to_le32(vdev_id);
6765 ath10k_dbg(ar, ATH10K_DBG_WMI,
6766 "wmi mgmt vdev down id 0x%x\n", vdev_id);
6770 static struct sk_buff *
6771 ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id,
6772 u32 param_id, u32 param_value)
6774 struct wmi_vdev_set_param_cmd *cmd;
6775 struct sk_buff *skb;
6777 if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
6778 ath10k_dbg(ar, ATH10K_DBG_WMI,
6779 "vdev param %d not supported by firmware\n",
6781 return ERR_PTR(-EOPNOTSUPP);
6784 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6786 return ERR_PTR(-ENOMEM);
6788 cmd = (struct wmi_vdev_set_param_cmd *)skb->data;
6789 cmd->vdev_id = __cpu_to_le32(vdev_id);
6790 cmd->param_id = __cpu_to_le32(param_id);
6791 cmd->param_value = __cpu_to_le32(param_value);
6793 ath10k_dbg(ar, ATH10K_DBG_WMI,
6794 "wmi vdev id 0x%x set param %d value %d\n",
6795 vdev_id, param_id, param_value);
6799 static struct sk_buff *
6800 ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar,
6801 const struct wmi_vdev_install_key_arg *arg)
6803 struct wmi_vdev_install_key_cmd *cmd;
6804 struct sk_buff *skb;
6806 if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
6807 return ERR_PTR(-EINVAL);
6808 if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
6809 return ERR_PTR(-EINVAL);
6811 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
6813 return ERR_PTR(-ENOMEM);
6815 cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
6816 cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
6817 cmd->key_idx = __cpu_to_le32(arg->key_idx);
6818 cmd->key_flags = __cpu_to_le32(arg->key_flags);
6819 cmd->key_cipher = __cpu_to_le32(arg->key_cipher);
6820 cmd->key_len = __cpu_to_le32(arg->key_len);
6821 cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len);
6822 cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
6825 ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr);
6827 memcpy(cmd->key_data, arg->key_data, arg->key_len);
6829 ath10k_dbg(ar, ATH10K_DBG_WMI,
6830 "wmi vdev install key idx %d cipher %d len %d\n",
6831 arg->key_idx, arg->key_cipher, arg->key_len);
6835 static struct sk_buff *
6836 ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar,
6837 const struct wmi_vdev_spectral_conf_arg *arg)
6839 struct wmi_vdev_spectral_conf_cmd *cmd;
6840 struct sk_buff *skb;
6842 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6844 return ERR_PTR(-ENOMEM);
6846 cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data;
6847 cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
6848 cmd->scan_count = __cpu_to_le32(arg->scan_count);
6849 cmd->scan_period = __cpu_to_le32(arg->scan_period);
6850 cmd->scan_priority = __cpu_to_le32(arg->scan_priority);
6851 cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size);
6852 cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena);
6853 cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena);
6854 cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref);
6855 cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay);
6856 cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr);
6857 cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr);
6858 cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode);
6859 cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode);
6860 cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr);
6861 cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format);
6862 cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode);
6863 cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale);
6864 cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj);
6865 cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask);
6870 static struct sk_buff *
6871 ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id,
6872 u32 trigger, u32 enable)
6874 struct wmi_vdev_spectral_enable_cmd *cmd;
6875 struct sk_buff *skb;
6877 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6879 return ERR_PTR(-ENOMEM);
6881 cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data;
6882 cmd->vdev_id = __cpu_to_le32(vdev_id);
6883 cmd->trigger_cmd = __cpu_to_le32(trigger);
6884 cmd->enable_cmd = __cpu_to_le32(enable);
6889 static struct sk_buff *
6890 ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
6891 const u8 peer_addr[ETH_ALEN],
6892 enum wmi_peer_type peer_type)
6894 struct wmi_peer_create_cmd *cmd;
6895 struct sk_buff *skb;
6897 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6899 return ERR_PTR(-ENOMEM);
6901 cmd = (struct wmi_peer_create_cmd *)skb->data;
6902 cmd->vdev_id = __cpu_to_le32(vdev_id);
6903 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6904 cmd->peer_type = __cpu_to_le32(peer_type);
6906 ath10k_dbg(ar, ATH10K_DBG_WMI,
6907 "wmi peer create vdev_id %d peer_addr %pM\n",
6908 vdev_id, peer_addr);
6912 static struct sk_buff *
6913 ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id,
6914 const u8 peer_addr[ETH_ALEN])
6916 struct wmi_peer_delete_cmd *cmd;
6917 struct sk_buff *skb;
6919 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6921 return ERR_PTR(-ENOMEM);
6923 cmd = (struct wmi_peer_delete_cmd *)skb->data;
6924 cmd->vdev_id = __cpu_to_le32(vdev_id);
6925 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6927 ath10k_dbg(ar, ATH10K_DBG_WMI,
6928 "wmi peer delete vdev_id %d peer_addr %pM\n",
6929 vdev_id, peer_addr);
6933 static struct sk_buff *
6934 ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id,
6935 const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
6937 struct wmi_peer_flush_tids_cmd *cmd;
6938 struct sk_buff *skb;
6940 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6942 return ERR_PTR(-ENOMEM);
6944 cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
6945 cmd->vdev_id = __cpu_to_le32(vdev_id);
6946 cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
6947 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6949 ath10k_dbg(ar, ATH10K_DBG_WMI,
6950 "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
6951 vdev_id, peer_addr, tid_bitmap);
6955 static struct sk_buff *
6956 ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id,
6957 const u8 *peer_addr,
6958 enum wmi_peer_param param_id,
6961 struct wmi_peer_set_param_cmd *cmd;
6962 struct sk_buff *skb;
6964 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6966 return ERR_PTR(-ENOMEM);
6968 cmd = (struct wmi_peer_set_param_cmd *)skb->data;
6969 cmd->vdev_id = __cpu_to_le32(vdev_id);
6970 cmd->param_id = __cpu_to_le32(param_id);
6971 cmd->param_value = __cpu_to_le32(param_value);
6972 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
6974 ath10k_dbg(ar, ATH10K_DBG_WMI,
6975 "wmi vdev %d peer 0x%pM set param %d value %d\n",
6976 vdev_id, peer_addr, param_id, param_value);
6980 static struct sk_buff *
6981 ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
6982 enum wmi_sta_ps_mode psmode)
6984 struct wmi_sta_powersave_mode_cmd *cmd;
6985 struct sk_buff *skb;
6987 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6989 return ERR_PTR(-ENOMEM);
6991 cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data;
6992 cmd->vdev_id = __cpu_to_le32(vdev_id);
6993 cmd->sta_ps_mode = __cpu_to_le32(psmode);
6995 ath10k_dbg(ar, ATH10K_DBG_WMI,
6996 "wmi set powersave id 0x%x mode %d\n",
7001 static struct sk_buff *
7002 ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id,
7003 enum wmi_sta_powersave_param param_id,
7006 struct wmi_sta_powersave_param_cmd *cmd;
7007 struct sk_buff *skb;
7009 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7011 return ERR_PTR(-ENOMEM);
7013 cmd = (struct wmi_sta_powersave_param_cmd *)skb->data;
7014 cmd->vdev_id = __cpu_to_le32(vdev_id);
7015 cmd->param_id = __cpu_to_le32(param_id);
7016 cmd->param_value = __cpu_to_le32(value);
7018 ath10k_dbg(ar, ATH10K_DBG_WMI,
7019 "wmi sta ps param vdev_id 0x%x param %d value %d\n",
7020 vdev_id, param_id, value);
7024 static struct sk_buff *
7025 ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7026 enum wmi_ap_ps_peer_param param_id, u32 value)
7028 struct wmi_ap_ps_peer_cmd *cmd;
7029 struct sk_buff *skb;
7032 return ERR_PTR(-EINVAL);
7034 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7036 return ERR_PTR(-ENOMEM);
7038 cmd = (struct wmi_ap_ps_peer_cmd *)skb->data;
7039 cmd->vdev_id = __cpu_to_le32(vdev_id);
7040 cmd->param_id = __cpu_to_le32(param_id);
7041 cmd->param_value = __cpu_to_le32(value);
7042 ether_addr_copy(cmd->peer_macaddr.addr, mac);
7044 ath10k_dbg(ar, ATH10K_DBG_WMI,
7045 "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
7046 vdev_id, param_id, value, mac);
7050 static struct sk_buff *
7051 ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar,
7052 const struct wmi_scan_chan_list_arg *arg)
7054 struct wmi_scan_chan_list_cmd *cmd;
7055 struct sk_buff *skb;
7056 struct wmi_channel_arg *ch;
7057 struct wmi_channel *ci;
7061 len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);
7063 skb = ath10k_wmi_alloc_skb(ar, len);
7065 return ERR_PTR(-EINVAL);
7067 cmd = (struct wmi_scan_chan_list_cmd *)skb->data;
7068 cmd->num_scan_chans = __cpu_to_le32(arg->n_channels);
7070 for (i = 0; i < arg->n_channels; i++) {
7071 ch = &arg->channels[i];
7072 ci = &cmd->chan_info[i];
7074 ath10k_wmi_put_wmi_channel(ci, ch);
7081 ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
7082 const struct wmi_peer_assoc_complete_arg *arg)
7084 struct wmi_common_peer_assoc_complete_cmd *cmd = buf;
7086 cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
7087 cmd->peer_new_assoc = __cpu_to_le32(arg->peer_reassoc ? 0 : 1);
7088 cmd->peer_associd = __cpu_to_le32(arg->peer_aid);
7089 cmd->peer_flags = __cpu_to_le32(arg->peer_flags);
7090 cmd->peer_caps = __cpu_to_le32(arg->peer_caps);
7091 cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval);
7092 cmd->peer_ht_caps = __cpu_to_le32(arg->peer_ht_caps);
7093 cmd->peer_max_mpdu = __cpu_to_le32(arg->peer_max_mpdu);
7094 cmd->peer_mpdu_density = __cpu_to_le32(arg->peer_mpdu_density);
7095 cmd->peer_rate_caps = __cpu_to_le32(arg->peer_rate_caps);
7096 cmd->peer_nss = __cpu_to_le32(arg->peer_num_spatial_streams);
7097 cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps);
7098 cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode);
7100 ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
7102 cmd->peer_legacy_rates.num_rates =
7103 __cpu_to_le32(arg->peer_legacy_rates.num_rates);
7104 memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
7105 arg->peer_legacy_rates.num_rates);
7107 cmd->peer_ht_rates.num_rates =
7108 __cpu_to_le32(arg->peer_ht_rates.num_rates);
7109 memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
7110 arg->peer_ht_rates.num_rates);
7112 cmd->peer_vht_rates.rx_max_rate =
7113 __cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
7114 cmd->peer_vht_rates.rx_mcs_set =
7115 __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
7116 cmd->peer_vht_rates.tx_max_rate =
7117 __cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
7118 cmd->peer_vht_rates.tx_mcs_set =
7119 __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
7123 ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf,
7124 const struct wmi_peer_assoc_complete_arg *arg)
7126 struct wmi_main_peer_assoc_complete_cmd *cmd = buf;
7128 ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7129 memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info));
7133 ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf,
7134 const struct wmi_peer_assoc_complete_arg *arg)
7136 ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7140 ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf,
7141 const struct wmi_peer_assoc_complete_arg *arg)
7143 struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf;
7144 int max_mcs, max_nss;
7147 /* TODO: Is using max values okay with firmware? */
7151 info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) |
7152 SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS);
7154 ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7155 cmd->info0 = __cpu_to_le32(info0);
7159 ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf,
7160 const struct wmi_peer_assoc_complete_arg *arg)
7162 struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf;
7164 ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
7165 if (arg->peer_bw_rxnss_override)
7166 cmd->peer_bw_rxnss_override =
7167 __cpu_to_le32((arg->peer_bw_rxnss_override - 1) |
7168 BIT(PEER_BW_RXNSS_OVERRIDE_OFFSET));
7170 cmd->peer_bw_rxnss_override = 0;
7174 ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg)
7176 if (arg->peer_mpdu_density > 16)
7178 if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES)
7180 if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES)
7186 static struct sk_buff *
7187 ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar,
7188 const struct wmi_peer_assoc_complete_arg *arg)
7190 size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd);
7191 struct sk_buff *skb;
7194 ret = ath10k_wmi_peer_assoc_check_arg(arg);
7196 return ERR_PTR(ret);
7198 skb = ath10k_wmi_alloc_skb(ar, len);
7200 return ERR_PTR(-ENOMEM);
7202 ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);
7204 ath10k_dbg(ar, ATH10K_DBG_WMI,
7205 "wmi peer assoc vdev %d addr %pM (%s)\n",
7206 arg->vdev_id, arg->addr,
7207 arg->peer_reassoc ? "reassociate" : "new");
7211 static struct sk_buff *
7212 ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar,
7213 const struct wmi_peer_assoc_complete_arg *arg)
7215 size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd);
7216 struct sk_buff *skb;
7219 ret = ath10k_wmi_peer_assoc_check_arg(arg);
7221 return ERR_PTR(ret);
7223 skb = ath10k_wmi_alloc_skb(ar, len);
7225 return ERR_PTR(-ENOMEM);
7227 ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);
7229 ath10k_dbg(ar, ATH10K_DBG_WMI,
7230 "wmi peer assoc vdev %d addr %pM (%s)\n",
7231 arg->vdev_id, arg->addr,
7232 arg->peer_reassoc ? "reassociate" : "new");
7236 static struct sk_buff *
7237 ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar,
7238 const struct wmi_peer_assoc_complete_arg *arg)
7240 size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd);
7241 struct sk_buff *skb;
7244 ret = ath10k_wmi_peer_assoc_check_arg(arg);
7246 return ERR_PTR(ret);
7248 skb = ath10k_wmi_alloc_skb(ar, len);
7250 return ERR_PTR(-ENOMEM);
7252 ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);
7254 ath10k_dbg(ar, ATH10K_DBG_WMI,
7255 "wmi peer assoc vdev %d addr %pM (%s)\n",
7256 arg->vdev_id, arg->addr,
7257 arg->peer_reassoc ? "reassociate" : "new");
7261 static struct sk_buff *
7262 ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar,
7263 const struct wmi_peer_assoc_complete_arg *arg)
7265 size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd);
7266 struct sk_buff *skb;
7269 ret = ath10k_wmi_peer_assoc_check_arg(arg);
7271 return ERR_PTR(ret);
7273 skb = ath10k_wmi_alloc_skb(ar, len);
7275 return ERR_PTR(-ENOMEM);
7277 ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);
7279 ath10k_dbg(ar, ATH10K_DBG_WMI,
7280 "wmi peer assoc vdev %d addr %pM (%s)\n",
7281 arg->vdev_id, arg->addr,
7282 arg->peer_reassoc ? "reassociate" : "new");
7286 static struct sk_buff *
7287 ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
7289 struct sk_buff *skb;
7291 skb = ath10k_wmi_alloc_skb(ar, 0);
7293 return ERR_PTR(-ENOMEM);
7295 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
7299 static struct sk_buff *
7300 ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar,
7301 enum wmi_bss_survey_req_type type)
7303 struct wmi_pdev_chan_info_req_cmd *cmd;
7304 struct sk_buff *skb;
7306 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7308 return ERR_PTR(-ENOMEM);
7310 cmd = (struct wmi_pdev_chan_info_req_cmd *)skb->data;
7311 cmd->type = __cpu_to_le32(type);
7313 ath10k_dbg(ar, ATH10K_DBG_WMI,
7314 "wmi pdev bss info request type %d\n", type);
7319 /* This function assumes the beacon is already DMA mapped */
7320 static struct sk_buff *
7321 ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn,
7322 size_t bcn_len, u32 bcn_paddr, bool dtim_zero,
7325 struct wmi_bcn_tx_ref_cmd *cmd;
7326 struct sk_buff *skb;
7327 struct ieee80211_hdr *hdr;
7330 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7332 return ERR_PTR(-ENOMEM);
7334 hdr = (struct ieee80211_hdr *)bcn;
7335 fc = le16_to_cpu(hdr->frame_control);
7337 cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data;
7338 cmd->vdev_id = __cpu_to_le32(vdev_id);
7339 cmd->data_len = __cpu_to_le32(bcn_len);
7340 cmd->data_ptr = __cpu_to_le32(bcn_paddr);
7342 cmd->frame_control = __cpu_to_le32(fc);
7344 cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA);
7347 cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO);
7350 cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB);
7355 void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
7356 const struct wmi_wmm_params_arg *arg)
7358 params->cwmin = __cpu_to_le32(arg->cwmin);
7359 params->cwmax = __cpu_to_le32(arg->cwmax);
7360 params->aifs = __cpu_to_le32(arg->aifs);
7361 params->txop = __cpu_to_le32(arg->txop);
7362 params->acm = __cpu_to_le32(arg->acm);
7363 params->no_ack = __cpu_to_le32(arg->no_ack);
7366 static struct sk_buff *
7367 ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
7368 const struct wmi_wmm_params_all_arg *arg)
7370 struct wmi_pdev_set_wmm_params *cmd;
7371 struct sk_buff *skb;
7373 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7375 return ERR_PTR(-ENOMEM);
7377 cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
7378 ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
7379 ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
7380 ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
7381 ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
7383 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
7387 static struct sk_buff *
7388 ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
7390 struct wmi_request_stats_cmd *cmd;
7391 struct sk_buff *skb;
7393 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7395 return ERR_PTR(-ENOMEM);
7397 cmd = (struct wmi_request_stats_cmd *)skb->data;
7398 cmd->stats_id = __cpu_to_le32(stats_mask);
7400 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
7405 static struct sk_buff *
7406 ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
7407 enum wmi_force_fw_hang_type type, u32 delay_ms)
7409 struct wmi_force_fw_hang_cmd *cmd;
7410 struct sk_buff *skb;
7412 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7414 return ERR_PTR(-ENOMEM);
7416 cmd = (struct wmi_force_fw_hang_cmd *)skb->data;
7417 cmd->type = __cpu_to_le32(type);
7418 cmd->delay_ms = __cpu_to_le32(delay_ms);
7420 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
7425 static struct sk_buff *
7426 ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7429 struct wmi_dbglog_cfg_cmd *cmd;
7430 struct sk_buff *skb;
7433 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7435 return ERR_PTR(-ENOMEM);
7437 cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
7439 if (module_enable) {
7441 ATH10K_DBGLOG_CFG_LOG_LVL);
7443 /* set back defaults, all modules with WARN level */
7444 cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
7445 ATH10K_DBGLOG_CFG_LOG_LVL);
7449 cmd->module_enable = __cpu_to_le32(module_enable);
7450 cmd->module_valid = __cpu_to_le32(~0);
7451 cmd->config_enable = __cpu_to_le32(cfg);
7452 cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
7454 ath10k_dbg(ar, ATH10K_DBG_WMI,
7455 "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
7456 __le32_to_cpu(cmd->module_enable),
7457 __le32_to_cpu(cmd->module_valid),
7458 __le32_to_cpu(cmd->config_enable),
7459 __le32_to_cpu(cmd->config_valid));
7463 static struct sk_buff *
7464 ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7467 struct wmi_10_4_dbglog_cfg_cmd *cmd;
7468 struct sk_buff *skb;
7471 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7473 return ERR_PTR(-ENOMEM);
7475 cmd = (struct wmi_10_4_dbglog_cfg_cmd *)skb->data;
7477 if (module_enable) {
7479 ATH10K_DBGLOG_CFG_LOG_LVL);
7481 /* set back defaults, all modules with WARN level */
7482 cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
7483 ATH10K_DBGLOG_CFG_LOG_LVL);
7487 cmd->module_enable = __cpu_to_le64(module_enable);
7488 cmd->module_valid = __cpu_to_le64(~0);
7489 cmd->config_enable = __cpu_to_le32(cfg);
7490 cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
7492 ath10k_dbg(ar, ATH10K_DBG_WMI,
7493 "wmi dbglog cfg modules 0x%016llx 0x%016llx config %08x %08x\n",
7494 __le64_to_cpu(cmd->module_enable),
7495 __le64_to_cpu(cmd->module_valid),
7496 __le32_to_cpu(cmd->config_enable),
7497 __le32_to_cpu(cmd->config_valid));
7501 static struct sk_buff *
7502 ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap)
7504 struct wmi_pdev_pktlog_enable_cmd *cmd;
7505 struct sk_buff *skb;
7507 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7509 return ERR_PTR(-ENOMEM);
7511 ev_bitmap &= ATH10K_PKTLOG_ANY;
7513 cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data;
7514 cmd->ev_bitmap = __cpu_to_le32(ev_bitmap);
7516 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
7521 static struct sk_buff *
7522 ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar)
7524 struct sk_buff *skb;
7526 skb = ath10k_wmi_alloc_skb(ar, 0);
7528 return ERR_PTR(-ENOMEM);
7530 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
7534 static struct sk_buff *
7535 ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period,
7536 u32 duration, u32 next_offset,
7539 struct wmi_pdev_set_quiet_cmd *cmd;
7540 struct sk_buff *skb;
7542 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7544 return ERR_PTR(-ENOMEM);
7546 cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data;
7547 cmd->period = __cpu_to_le32(period);
7548 cmd->duration = __cpu_to_le32(duration);
7549 cmd->next_start = __cpu_to_le32(next_offset);
7550 cmd->enabled = __cpu_to_le32(enabled);
7552 ath10k_dbg(ar, ATH10K_DBG_WMI,
7553 "wmi quiet param: period %u duration %u enabled %d\n",
7554 period, duration, enabled);
7558 static struct sk_buff *
7559 ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id,
7562 struct wmi_addba_clear_resp_cmd *cmd;
7563 struct sk_buff *skb;
7566 return ERR_PTR(-EINVAL);
7568 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7570 return ERR_PTR(-ENOMEM);
7572 cmd = (struct wmi_addba_clear_resp_cmd *)skb->data;
7573 cmd->vdev_id = __cpu_to_le32(vdev_id);
7574 ether_addr_copy(cmd->peer_macaddr.addr, mac);
7576 ath10k_dbg(ar, ATH10K_DBG_WMI,
7577 "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n",
7582 static struct sk_buff *
7583 ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7584 u32 tid, u32 buf_size)
7586 struct wmi_addba_send_cmd *cmd;
7587 struct sk_buff *skb;
7590 return ERR_PTR(-EINVAL);
7592 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7594 return ERR_PTR(-ENOMEM);
7596 cmd = (struct wmi_addba_send_cmd *)skb->data;
7597 cmd->vdev_id = __cpu_to_le32(vdev_id);
7598 ether_addr_copy(cmd->peer_macaddr.addr, mac);
7599 cmd->tid = __cpu_to_le32(tid);
7600 cmd->buffersize = __cpu_to_le32(buf_size);
7602 ath10k_dbg(ar, ATH10K_DBG_WMI,
7603 "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n",
7604 vdev_id, mac, tid, buf_size);
7608 static struct sk_buff *
7609 ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7610 u32 tid, u32 status)
7612 struct wmi_addba_setresponse_cmd *cmd;
7613 struct sk_buff *skb;
7616 return ERR_PTR(-EINVAL);
7618 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7620 return ERR_PTR(-ENOMEM);
7622 cmd = (struct wmi_addba_setresponse_cmd *)skb->data;
7623 cmd->vdev_id = __cpu_to_le32(vdev_id);
7624 ether_addr_copy(cmd->peer_macaddr.addr, mac);
7625 cmd->tid = __cpu_to_le32(tid);
7626 cmd->statuscode = __cpu_to_le32(status);
7628 ath10k_dbg(ar, ATH10K_DBG_WMI,
7629 "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n",
7630 vdev_id, mac, tid, status);
7634 static struct sk_buff *
7635 ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7636 u32 tid, u32 initiator, u32 reason)
7638 struct wmi_delba_send_cmd *cmd;
7639 struct sk_buff *skb;
7642 return ERR_PTR(-EINVAL);
7644 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7646 return ERR_PTR(-ENOMEM);
7648 cmd = (struct wmi_delba_send_cmd *)skb->data;
7649 cmd->vdev_id = __cpu_to_le32(vdev_id);
7650 ether_addr_copy(cmd->peer_macaddr.addr, mac);
7651 cmd->tid = __cpu_to_le32(tid);
7652 cmd->initiator = __cpu_to_le32(initiator);
7653 cmd->reasoncode = __cpu_to_le32(reason);
7655 ath10k_dbg(ar, ATH10K_DBG_WMI,
7656 "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n",
7657 vdev_id, mac, tid, initiator, reason);
7661 static struct sk_buff *
7662 ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param)
7664 struct wmi_pdev_get_tpc_config_cmd *cmd;
7665 struct sk_buff *skb;
7667 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7669 return ERR_PTR(-ENOMEM);
7671 cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data;
7672 cmd->param = __cpu_to_le32(param);
7674 ath10k_dbg(ar, ATH10K_DBG_WMI,
7675 "wmi pdev get tpc config param %d\n", param);
7679 size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head)
7681 struct ath10k_fw_stats_peer *i;
7684 list_for_each_entry(i, head, list)
7690 size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head)
7692 struct ath10k_fw_stats_vdev *i;
7695 list_for_each_entry(i, head, list)
7702 ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7703 char *buf, u32 *length)
7706 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7708 len += scnprintf(buf + len, buf_len - len, "\n");
7709 len += scnprintf(buf + len, buf_len - len, "%30s\n",
7710 "ath10k PDEV stats");
7711 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7712 "=================");
7714 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7715 "Channel noise floor", pdev->ch_noise_floor);
7716 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7717 "Channel TX power", pdev->chan_tx_power);
7718 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7719 "TX frame count", pdev->tx_frame_count);
7720 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7721 "RX frame count", pdev->rx_frame_count);
7722 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7723 "RX clear count", pdev->rx_clear_count);
7724 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7725 "Cycle count", pdev->cycle_count);
7726 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7727 "PHY error count", pdev->phy_err_count);
7733 ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7734 char *buf, u32 *length)
7737 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7739 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7740 "RTS bad count", pdev->rts_bad);
7741 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7742 "RTS good count", pdev->rts_good);
7743 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7744 "FCS bad count", pdev->fcs_bad);
7745 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7746 "No beacon count", pdev->no_beacons);
7747 len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
7748 "MIB int count", pdev->mib_int_count);
7750 len += scnprintf(buf + len, buf_len - len, "\n");
7755 ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7756 char *buf, u32 *length)
7759 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7761 len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
7762 "ath10k PDEV TX stats");
7763 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7764 "=================");
7766 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7767 "HTT cookies queued", pdev->comp_queued);
7768 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7769 "HTT cookies disp.", pdev->comp_delivered);
7770 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7771 "MSDU queued", pdev->msdu_enqued);
7772 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7773 "MPDU queued", pdev->mpdu_enqued);
7774 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7775 "MSDUs dropped", pdev->wmm_drop);
7776 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7777 "Local enqued", pdev->local_enqued);
7778 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7779 "Local freed", pdev->local_freed);
7780 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7781 "HW queued", pdev->hw_queued);
7782 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7783 "PPDUs reaped", pdev->hw_reaped);
7784 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7785 "Num underruns", pdev->underrun);
7786 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7787 "PPDUs cleaned", pdev->tx_abort);
7788 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7789 "MPDUs requed", pdev->mpdus_requed);
7790 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7791 "Excessive retries", pdev->tx_ko);
7792 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7793 "HW rate", pdev->data_rc);
7794 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7795 "Sched self triggers", pdev->self_triggers);
7796 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7797 "Dropped due to SW retries",
7798 pdev->sw_retry_failure);
7799 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7800 "Illegal rate phy errors",
7801 pdev->illgl_rate_phy_err);
7802 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7803 "Pdev continuous xretry", pdev->pdev_cont_xretry);
7804 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7805 "TX timeout", pdev->pdev_tx_timeout);
7806 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7807 "PDEV resets", pdev->pdev_resets);
7808 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7809 "PHY underrun", pdev->phy_underrun);
7810 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7811 "MPDU is more than txop limit", pdev->txop_ovf);
7816 ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
7817 char *buf, u32 *length)
7820 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7822 len += scnprintf(buf + len, buf_len - len, "\n%30s\n",
7823 "ath10k PDEV RX stats");
7824 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7825 "=================");
7827 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7828 "Mid PPDU route change",
7829 pdev->mid_ppdu_route_change);
7830 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7831 "Tot. number of statuses", pdev->status_rcvd);
7832 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7833 "Extra frags on rings 0", pdev->r0_frags);
7834 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7835 "Extra frags on rings 1", pdev->r1_frags);
7836 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7837 "Extra frags on rings 2", pdev->r2_frags);
7838 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7839 "Extra frags on rings 3", pdev->r3_frags);
7840 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7841 "MSDUs delivered to HTT", pdev->htt_msdus);
7842 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7843 "MPDUs delivered to HTT", pdev->htt_mpdus);
7844 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7845 "MSDUs delivered to stack", pdev->loc_msdus);
7846 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7847 "MPDUs delivered to stack", pdev->loc_mpdus);
7848 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7849 "Oversized AMSUs", pdev->oversize_amsdu);
7850 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7851 "PHY errors", pdev->phy_errs);
7852 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7853 "PHY errors drops", pdev->phy_err_drop);
7854 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
7855 "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs);
7860 ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev,
7861 char *buf, u32 *length)
7864 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7867 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7868 "vdev id", vdev->vdev_id);
7869 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7870 "beacon snr", vdev->beacon_snr);
7871 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7872 "data snr", vdev->data_snr);
7873 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7874 "num rx frames", vdev->num_rx_frames);
7875 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7876 "num rts fail", vdev->num_rts_fail);
7877 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7878 "num rts success", vdev->num_rts_success);
7879 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7880 "num rx err", vdev->num_rx_err);
7881 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7882 "num rx discard", vdev->num_rx_discard);
7883 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7884 "num tx not acked", vdev->num_tx_not_acked);
7886 for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++)
7887 len += scnprintf(buf + len, buf_len - len,
7890 vdev->num_tx_frames[i]);
7892 for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++)
7893 len += scnprintf(buf + len, buf_len - len,
7895 "num tx frames retries", i,
7896 vdev->num_tx_frames_retries[i]);
7898 for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++)
7899 len += scnprintf(buf + len, buf_len - len,
7901 "num tx frames failures", i,
7902 vdev->num_tx_frames_failures[i]);
7904 for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++)
7905 len += scnprintf(buf + len, buf_len - len,
7906 "%25s [%02d] 0x%08x\n",
7907 "tx rate history", i,
7908 vdev->tx_rate_history[i]);
7910 for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++)
7911 len += scnprintf(buf + len, buf_len - len,
7913 "beacon rssi history", i,
7914 vdev->beacon_rssi_history[i]);
7916 len += scnprintf(buf + len, buf_len - len, "\n");
7921 ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer,
7922 char *buf, u32 *length)
7925 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7927 len += scnprintf(buf + len, buf_len - len, "%30s %pM\n",
7928 "Peer MAC address", peer->peer_macaddr);
7929 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7930 "Peer RSSI", peer->peer_rssi);
7931 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7932 "Peer TX rate", peer->peer_tx_rate);
7933 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7934 "Peer RX rate", peer->peer_rx_rate);
7935 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
7936 "Peer RX duration", peer->rx_duration);
7938 len += scnprintf(buf + len, buf_len - len, "\n");
7942 void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar,
7943 struct ath10k_fw_stats *fw_stats,
7947 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
7948 const struct ath10k_fw_stats_pdev *pdev;
7949 const struct ath10k_fw_stats_vdev *vdev;
7950 const struct ath10k_fw_stats_peer *peer;
7954 spin_lock_bh(&ar->data_lock);
7956 pdev = list_first_entry_or_null(&fw_stats->pdevs,
7957 struct ath10k_fw_stats_pdev, list);
7959 ath10k_warn(ar, "failed to get pdev stats\n");
7963 num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
7964 num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
7966 ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
7967 ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
7968 ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
7970 len += scnprintf(buf + len, buf_len - len, "\n");
7971 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7972 "ath10k VDEV stats", num_vdevs);
7973 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7974 "=================");
7976 list_for_each_entry(vdev, &fw_stats->vdevs, list) {
7977 ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
7980 len += scnprintf(buf + len, buf_len - len, "\n");
7981 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
7982 "ath10k PEER stats", num_peers);
7983 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
7984 "=================");
7986 list_for_each_entry(peer, &fw_stats->peers, list) {
7987 ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
7991 spin_unlock_bh(&ar->data_lock);
7999 void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar,
8000 struct ath10k_fw_stats *fw_stats,
8003 unsigned int len = 0;
8004 unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
8005 const struct ath10k_fw_stats_pdev *pdev;
8006 const struct ath10k_fw_stats_vdev *vdev;
8007 const struct ath10k_fw_stats_peer *peer;
8011 spin_lock_bh(&ar->data_lock);
8013 pdev = list_first_entry_or_null(&fw_stats->pdevs,
8014 struct ath10k_fw_stats_pdev, list);
8016 ath10k_warn(ar, "failed to get pdev stats\n");
8020 num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8021 num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8023 ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8024 ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
8025 ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8026 ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8028 len += scnprintf(buf + len, buf_len - len, "\n");
8029 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8030 "ath10k VDEV stats", num_vdevs);
8031 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8032 "=================");
8034 list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8035 ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
8038 len += scnprintf(buf + len, buf_len - len, "\n");
8039 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8040 "ath10k PEER stats", num_peers);
8041 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8042 "=================");
8044 list_for_each_entry(peer, &fw_stats->peers, list) {
8045 ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
8049 spin_unlock_bh(&ar->data_lock);
8057 static struct sk_buff *
8058 ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
8059 u32 detect_level, u32 detect_margin)
8061 struct wmi_pdev_set_adaptive_cca_params *cmd;
8062 struct sk_buff *skb;
8064 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8066 return ERR_PTR(-ENOMEM);
8068 cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data;
8069 cmd->enable = __cpu_to_le32(enable);
8070 cmd->cca_detect_level = __cpu_to_le32(detect_level);
8071 cmd->cca_detect_margin = __cpu_to_le32(detect_margin);
8073 ath10k_dbg(ar, ATH10K_DBG_WMI,
8074 "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
8075 enable, detect_level, detect_margin);
8080 ath10k_wmi_fw_vdev_stats_extd_fill(const struct ath10k_fw_stats_vdev_extd *vdev,
8081 char *buf, u32 *length)
8084 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8087 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8088 "vdev id", vdev->vdev_id);
8089 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8090 "ppdu aggr count", vdev->ppdu_aggr_cnt);
8091 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8092 "ppdu noack", vdev->ppdu_noack);
8093 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8094 "mpdu queued", vdev->mpdu_queued);
8095 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8096 "ppdu nonaggr count", vdev->ppdu_nonaggr_cnt);
8097 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8098 "mpdu sw requeued", vdev->mpdu_sw_requeued);
8099 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8100 "mpdu success retry", vdev->mpdu_suc_retry);
8101 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8102 "mpdu success multitry", vdev->mpdu_suc_multitry);
8103 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8104 "mpdu fail retry", vdev->mpdu_fail_retry);
8105 val = vdev->tx_ftm_suc;
8106 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8107 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8109 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8110 val = vdev->tx_ftm_suc_retry;
8111 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8112 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8113 "tx ftm success retry",
8114 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8115 val = vdev->tx_ftm_fail;
8116 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8117 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8119 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8120 val = vdev->rx_ftmr_cnt;
8121 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8122 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8123 "rx ftm request count",
8124 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8125 val = vdev->rx_ftmr_dup_cnt;
8126 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8127 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8128 "rx ftm request dup count",
8129 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8130 val = vdev->rx_iftmr_cnt;
8131 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8132 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8133 "rx initial ftm req count",
8134 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8135 val = vdev->rx_iftmr_dup_cnt;
8136 if (val & WMI_VDEV_STATS_FTM_COUNT_VALID)
8137 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
8138 "rx initial ftm req dup cnt",
8139 MS(val, WMI_VDEV_STATS_FTM_COUNT));
8140 len += scnprintf(buf + len, buf_len - len, "\n");
8145 void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar,
8146 struct ath10k_fw_stats *fw_stats,
8150 u32 buf_len = ATH10K_FW_STATS_BUF_SIZE;
8151 const struct ath10k_fw_stats_pdev *pdev;
8152 const struct ath10k_fw_stats_vdev_extd *vdev;
8153 const struct ath10k_fw_stats_peer *peer;
8157 spin_lock_bh(&ar->data_lock);
8159 pdev = list_first_entry_or_null(&fw_stats->pdevs,
8160 struct ath10k_fw_stats_pdev, list);
8162 ath10k_warn(ar, "failed to get pdev stats\n");
8166 num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
8167 num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);
8169 ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
8170 ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
8171 ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
8173 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8174 "HW paused", pdev->hw_paused);
8175 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8176 "Seqs posted", pdev->seq_posted);
8177 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8178 "Seqs failed queueing", pdev->seq_failed_queueing);
8179 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8180 "Seqs completed", pdev->seq_completed);
8181 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8182 "Seqs restarted", pdev->seq_restarted);
8183 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8184 "MU Seqs posted", pdev->mu_seq_posted);
8185 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8186 "MPDUs SW flushed", pdev->mpdus_sw_flush);
8187 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8188 "MPDUs HW filtered", pdev->mpdus_hw_filter);
8189 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8190 "MPDUs truncated", pdev->mpdus_truncated);
8191 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8192 "MPDUs receive no ACK", pdev->mpdus_ack_failed);
8193 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8194 "MPDUs expired", pdev->mpdus_expired);
8196 ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
8197 len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
8198 "Num Rx Overflow errors", pdev->rx_ovfl_errs);
8200 len += scnprintf(buf + len, buf_len - len, "\n");
8201 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8202 "ath10k VDEV stats", num_vdevs);
8203 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8204 "=================");
8205 list_for_each_entry(vdev, &fw_stats->vdevs, list) {
8206 ath10k_wmi_fw_vdev_stats_extd_fill(vdev, buf, &len);
8209 len += scnprintf(buf + len, buf_len - len, "\n");
8210 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
8211 "ath10k PEER stats", num_peers);
8212 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
8213 "=================");
8215 list_for_each_entry(peer, &fw_stats->peers, list) {
8216 ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
8220 spin_unlock_bh(&ar->data_lock);
8228 int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar,
8229 enum wmi_vdev_subtype subtype)
8232 case WMI_VDEV_SUBTYPE_NONE:
8233 return WMI_VDEV_SUBTYPE_LEGACY_NONE;
8234 case WMI_VDEV_SUBTYPE_P2P_DEVICE:
8235 return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV;
8236 case WMI_VDEV_SUBTYPE_P2P_CLIENT:
8237 return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI;
8238 case WMI_VDEV_SUBTYPE_P2P_GO:
8239 return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO;
8240 case WMI_VDEV_SUBTYPE_PROXY_STA:
8241 return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA;
8242 case WMI_VDEV_SUBTYPE_MESH_11S:
8243 case WMI_VDEV_SUBTYPE_MESH_NON_11S:
8249 static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar,
8250 enum wmi_vdev_subtype subtype)
8253 case WMI_VDEV_SUBTYPE_NONE:
8254 return WMI_VDEV_SUBTYPE_10_2_4_NONE;
8255 case WMI_VDEV_SUBTYPE_P2P_DEVICE:
8256 return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV;
8257 case WMI_VDEV_SUBTYPE_P2P_CLIENT:
8258 return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI;
8259 case WMI_VDEV_SUBTYPE_P2P_GO:
8260 return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO;
8261 case WMI_VDEV_SUBTYPE_PROXY_STA:
8262 return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA;
8263 case WMI_VDEV_SUBTYPE_MESH_11S:
8264 return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S;
8265 case WMI_VDEV_SUBTYPE_MESH_NON_11S:
8271 static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar,
8272 enum wmi_vdev_subtype subtype)
8275 case WMI_VDEV_SUBTYPE_NONE:
8276 return WMI_VDEV_SUBTYPE_10_4_NONE;
8277 case WMI_VDEV_SUBTYPE_P2P_DEVICE:
8278 return WMI_VDEV_SUBTYPE_10_4_P2P_DEV;
8279 case WMI_VDEV_SUBTYPE_P2P_CLIENT:
8280 return WMI_VDEV_SUBTYPE_10_4_P2P_CLI;
8281 case WMI_VDEV_SUBTYPE_P2P_GO:
8282 return WMI_VDEV_SUBTYPE_10_4_P2P_GO;
8283 case WMI_VDEV_SUBTYPE_PROXY_STA:
8284 return WMI_VDEV_SUBTYPE_10_4_PROXY_STA;
8285 case WMI_VDEV_SUBTYPE_MESH_11S:
8286 return WMI_VDEV_SUBTYPE_10_4_MESH_11S;
8287 case WMI_VDEV_SUBTYPE_MESH_NON_11S:
8288 return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S;
8293 static struct sk_buff *
8294 ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar,
8295 enum wmi_host_platform_type type,
8296 u32 fw_feature_bitmap)
8298 struct wmi_ext_resource_config_10_4_cmd *cmd;
8299 struct sk_buff *skb;
8300 u32 num_tdls_sleep_sta = 0;
8302 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8304 return ERR_PTR(-ENOMEM);
8306 if (test_bit(WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, ar->wmi.svc_map))
8307 num_tdls_sleep_sta = TARGET_10_4_NUM_TDLS_SLEEP_STA;
8309 cmd = (struct wmi_ext_resource_config_10_4_cmd *)skb->data;
8310 cmd->host_platform_config = __cpu_to_le32(type);
8311 cmd->fw_feature_bitmap = __cpu_to_le32(fw_feature_bitmap);
8312 cmd->wlan_gpio_priority = __cpu_to_le32(-1);
8313 cmd->coex_version = __cpu_to_le32(WMI_NO_COEX_VERSION_SUPPORT);
8314 cmd->coex_gpio_pin1 = __cpu_to_le32(-1);
8315 cmd->coex_gpio_pin2 = __cpu_to_le32(-1);
8316 cmd->coex_gpio_pin3 = __cpu_to_le32(-1);
8317 cmd->num_tdls_vdevs = __cpu_to_le32(TARGET_10_4_NUM_TDLS_VDEVS);
8318 cmd->num_tdls_conn_table_entries = __cpu_to_le32(20);
8319 cmd->max_tdls_concurrent_sleep_sta = __cpu_to_le32(num_tdls_sleep_sta);
8320 cmd->max_tdls_concurrent_buffer_sta =
8321 __cpu_to_le32(TARGET_10_4_NUM_TDLS_BUFFER_STA);
8323 ath10k_dbg(ar, ATH10K_DBG_WMI,
8324 "wmi ext resource config host type %d firmware feature bitmap %08x\n",
8325 type, fw_feature_bitmap);
8329 static struct sk_buff *
8330 ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
8331 enum wmi_tdls_state state)
8333 struct wmi_10_4_tdls_set_state_cmd *cmd;
8334 struct sk_buff *skb;
8337 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8339 return ERR_PTR(-ENOMEM);
8341 if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) &&
8342 state == WMI_TDLS_ENABLE_ACTIVE)
8343 state = WMI_TDLS_ENABLE_PASSIVE;
8345 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
8346 options |= WMI_TDLS_BUFFER_STA_EN;
8348 cmd = (struct wmi_10_4_tdls_set_state_cmd *)skb->data;
8349 cmd->vdev_id = __cpu_to_le32(vdev_id);
8350 cmd->state = __cpu_to_le32(state);
8351 cmd->notification_interval_ms = __cpu_to_le32(5000);
8352 cmd->tx_discovery_threshold = __cpu_to_le32(100);
8353 cmd->tx_teardown_threshold = __cpu_to_le32(5);
8354 cmd->rssi_teardown_threshold = __cpu_to_le32(-75);
8355 cmd->rssi_delta = __cpu_to_le32(-20);
8356 cmd->tdls_options = __cpu_to_le32(options);
8357 cmd->tdls_peer_traffic_ind_window = __cpu_to_le32(2);
8358 cmd->tdls_peer_traffic_response_timeout_ms = __cpu_to_le32(5000);
8359 cmd->tdls_puapsd_mask = __cpu_to_le32(0xf);
8360 cmd->tdls_puapsd_inactivity_time_ms = __cpu_to_le32(0);
8361 cmd->tdls_puapsd_rx_frame_threshold = __cpu_to_le32(10);
8362 cmd->teardown_notification_ms = __cpu_to_le32(10);
8363 cmd->tdls_peer_kickout_threshold = __cpu_to_le32(96);
8365 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi update fw tdls state %d for vdev %i\n",
8370 static u32 ath10k_wmi_prepare_peer_qos(u8 uapsd_queues, u8 sp)
8374 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
8375 peer_qos |= WMI_TDLS_PEER_QOS_AC_VO;
8376 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
8377 peer_qos |= WMI_TDLS_PEER_QOS_AC_VI;
8378 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
8379 peer_qos |= WMI_TDLS_PEER_QOS_AC_BK;
8380 if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
8381 peer_qos |= WMI_TDLS_PEER_QOS_AC_BE;
8383 peer_qos |= SM(sp, WMI_TDLS_PEER_SP);
8388 static struct sk_buff *
8389 ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param)
8391 struct wmi_pdev_get_tpc_table_cmd *cmd;
8392 struct sk_buff *skb;
8394 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8396 return ERR_PTR(-ENOMEM);
8398 cmd = (struct wmi_pdev_get_tpc_table_cmd *)skb->data;
8399 cmd->param = __cpu_to_le32(param);
8401 ath10k_dbg(ar, ATH10K_DBG_WMI,
8402 "wmi pdev get tpc table param:%d\n", param);
8406 static struct sk_buff *
8407 ath10k_wmi_10_4_gen_tdls_peer_update(struct ath10k *ar,
8408 const struct wmi_tdls_peer_update_cmd_arg *arg,
8409 const struct wmi_tdls_peer_capab_arg *cap,
8410 const struct wmi_channel_arg *chan_arg)
8412 struct wmi_10_4_tdls_peer_update_cmd *cmd;
8413 struct wmi_tdls_peer_capabilities *peer_cap;
8414 struct wmi_channel *chan;
8415 struct sk_buff *skb;
8420 /* tdls peer update cmd has place holder for one channel*/
8421 chan_len = cap->peer_chan_len ? (cap->peer_chan_len - 1) : 0;
8423 len = sizeof(*cmd) + chan_len * sizeof(*chan);
8425 skb = ath10k_wmi_alloc_skb(ar, len);
8427 return ERR_PTR(-ENOMEM);
8429 memset(skb->data, 0, sizeof(*cmd));
8431 cmd = (struct wmi_10_4_tdls_peer_update_cmd *)skb->data;
8432 cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
8433 ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
8434 cmd->peer_state = __cpu_to_le32(arg->peer_state);
8436 peer_qos = ath10k_wmi_prepare_peer_qos(cap->peer_uapsd_queues,
8439 peer_cap = &cmd->peer_capab;
8440 peer_cap->peer_qos = __cpu_to_le32(peer_qos);
8441 peer_cap->buff_sta_support = __cpu_to_le32(cap->buff_sta_support);
8442 peer_cap->off_chan_support = __cpu_to_le32(cap->off_chan_support);
8443 peer_cap->peer_curr_operclass = __cpu_to_le32(cap->peer_curr_operclass);
8444 peer_cap->self_curr_operclass = __cpu_to_le32(cap->self_curr_operclass);
8445 peer_cap->peer_chan_len = __cpu_to_le32(cap->peer_chan_len);
8446 peer_cap->peer_operclass_len = __cpu_to_le32(cap->peer_operclass_len);
8448 for (i = 0; i < WMI_TDLS_MAX_SUPP_OPER_CLASSES; i++)
8449 peer_cap->peer_operclass[i] = cap->peer_operclass[i];
8451 peer_cap->is_peer_responder = __cpu_to_le32(cap->is_peer_responder);
8452 peer_cap->pref_offchan_num = __cpu_to_le32(cap->pref_offchan_num);
8453 peer_cap->pref_offchan_bw = __cpu_to_le32(cap->pref_offchan_bw);
8455 for (i = 0; i < cap->peer_chan_len; i++) {
8456 chan = (struct wmi_channel *)&peer_cap->peer_chan_list[i];
8457 ath10k_wmi_put_wmi_channel(chan, &chan_arg[i]);
8460 ath10k_dbg(ar, ATH10K_DBG_WMI,
8461 "wmi tdls peer update vdev %i state %d n_chans %u\n",
8462 arg->vdev_id, arg->peer_state, cap->peer_chan_len);
8466 static struct sk_buff *
8467 ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value)
8469 struct wmi_echo_cmd *cmd;
8470 struct sk_buff *skb;
8472 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8474 return ERR_PTR(-ENOMEM);
8476 cmd = (struct wmi_echo_cmd *)skb->data;
8477 cmd->value = cpu_to_le32(value);
8479 ath10k_dbg(ar, ATH10K_DBG_WMI,
8480 "wmi echo value 0x%08x\n", value);
8485 ath10k_wmi_barrier(struct ath10k *ar)
8490 spin_lock_bh(&ar->data_lock);
8491 reinit_completion(&ar->wmi.barrier);
8492 spin_unlock_bh(&ar->data_lock);
8494 ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID);
8496 ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret);
8500 time_left = wait_for_completion_timeout(&ar->wmi.barrier,
8501 ATH10K_WMI_BARRIER_TIMEOUT_HZ);
8508 static const struct wmi_ops wmi_ops = {
8509 .rx = ath10k_wmi_op_rx,
8510 .map_svc = wmi_main_svc_map,
8512 .pull_scan = ath10k_wmi_op_pull_scan_ev,
8513 .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
8514 .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
8515 .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8516 .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8517 .pull_swba = ath10k_wmi_op_pull_swba_ev,
8518 .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
8519 .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
8520 .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
8521 .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8522 .pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats,
8523 .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8524 .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8526 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8527 .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8528 .gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd,
8529 .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8530 .gen_init = ath10k_wmi_op_gen_init,
8531 .gen_start_scan = ath10k_wmi_op_gen_start_scan,
8532 .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8533 .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8534 .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8535 .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8536 .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8537 .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8538 .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8539 .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8540 .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8541 .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8542 .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8543 /* .gen_vdev_wmm_conf not implemented */
8544 .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8545 .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8546 .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8547 .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8548 .gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc,
8549 .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8550 .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8551 .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8552 .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8553 .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8554 .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8555 .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8556 .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8557 .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8558 .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8559 .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8560 .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8561 .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8562 /* .gen_pdev_get_temperature not implemented */
8563 .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8564 .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8565 .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8566 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8567 .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
8568 .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
8569 .gen_echo = ath10k_wmi_op_gen_echo,
8570 /* .gen_bcn_tmpl not implemented */
8571 /* .gen_prb_tmpl not implemented */
8572 /* .gen_p2p_go_bcn_ie not implemented */
8573 /* .gen_adaptive_qcs not implemented */
8574 /* .gen_pdev_enable_adaptive_cca not implemented */
8577 static const struct wmi_ops wmi_10_1_ops = {
8578 .rx = ath10k_wmi_10_1_op_rx,
8579 .map_svc = wmi_10x_svc_map,
8580 .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
8581 .pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats,
8582 .gen_init = ath10k_wmi_10_1_op_gen_init,
8583 .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
8584 .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
8585 .gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc,
8586 /* .gen_pdev_get_temperature not implemented */
8588 /* shared with main branch */
8589 .pull_scan = ath10k_wmi_op_pull_scan_ev,
8590 .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
8591 .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
8592 .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8593 .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8594 .pull_swba = ath10k_wmi_op_pull_swba_ev,
8595 .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
8596 .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
8597 .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8598 .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8599 .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8601 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8602 .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8603 .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8604 .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8605 .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8606 .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8607 .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8608 .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8609 .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8610 .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8611 .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8612 .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8613 .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8614 .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8615 /* .gen_vdev_wmm_conf not implemented */
8616 .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8617 .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8618 .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8619 .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8620 .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8621 .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8622 .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8623 .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8624 .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8625 .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8626 .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8627 .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8628 .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8629 .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8630 .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8631 .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8632 .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8633 .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8634 .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8635 .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8636 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8637 .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
8638 .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
8639 .gen_echo = ath10k_wmi_op_gen_echo,
8640 /* .gen_bcn_tmpl not implemented */
8641 /* .gen_prb_tmpl not implemented */
8642 /* .gen_p2p_go_bcn_ie not implemented */
8643 /* .gen_adaptive_qcs not implemented */
8644 /* .gen_pdev_enable_adaptive_cca not implemented */
8647 static const struct wmi_ops wmi_10_2_ops = {
8648 .rx = ath10k_wmi_10_2_op_rx,
8649 .pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats,
8650 .gen_init = ath10k_wmi_10_2_op_gen_init,
8651 .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
8652 /* .gen_pdev_get_temperature not implemented */
8654 /* shared with 10.1 */
8655 .map_svc = wmi_10x_svc_map,
8656 .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
8657 .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
8658 .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
8659 .gen_echo = ath10k_wmi_op_gen_echo,
8661 .pull_scan = ath10k_wmi_op_pull_scan_ev,
8662 .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
8663 .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
8664 .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8665 .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8666 .pull_swba = ath10k_wmi_op_pull_swba_ev,
8667 .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
8668 .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
8669 .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8670 .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8671 .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8673 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8674 .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8675 .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8676 .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8677 .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8678 .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8679 .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8680 .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8681 .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8682 .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8683 .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8684 .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8685 .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8686 .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8687 /* .gen_vdev_wmm_conf not implemented */
8688 .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8689 .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8690 .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8691 .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8692 .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8693 .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8694 .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8695 .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8696 .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8697 .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8698 .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8699 .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8700 .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8701 .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8702 .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8703 .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8704 .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8705 .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8706 .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8707 .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8708 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8709 .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
8710 .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
8711 /* .gen_pdev_enable_adaptive_cca not implemented */
8714 static const struct wmi_ops wmi_10_2_4_ops = {
8715 .rx = ath10k_wmi_10_2_op_rx,
8716 .pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats,
8717 .gen_init = ath10k_wmi_10_2_op_gen_init,
8718 .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
8719 .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
8720 .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
8722 /* shared with 10.1 */
8723 .map_svc = wmi_10x_svc_map,
8724 .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
8725 .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
8726 .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
8727 .gen_echo = ath10k_wmi_op_gen_echo,
8729 .pull_scan = ath10k_wmi_op_pull_scan_ev,
8730 .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
8731 .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
8732 .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8733 .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8734 .pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev,
8735 .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
8736 .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
8737 .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8738 .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8739 .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8741 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8742 .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8743 .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8744 .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8745 .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8746 .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8747 .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8748 .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8749 .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8750 .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8751 .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8752 .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8753 .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8754 .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8755 .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8756 .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8757 .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8758 .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8759 .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8760 .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8761 .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8762 .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8763 .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8764 .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8765 .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8766 .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8767 .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8768 .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
8769 .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8770 .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8771 .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8772 .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8773 .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8774 .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8775 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8776 .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
8777 .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
8778 .gen_pdev_enable_adaptive_cca =
8779 ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
8780 .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
8781 /* .gen_bcn_tmpl not implemented */
8782 /* .gen_prb_tmpl not implemented */
8783 /* .gen_p2p_go_bcn_ie not implemented */
8784 /* .gen_adaptive_qcs not implemented */
8787 static const struct wmi_ops wmi_10_4_ops = {
8788 .rx = ath10k_wmi_10_4_op_rx,
8789 .map_svc = wmi_10_4_svc_map,
8791 .pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats,
8792 .pull_scan = ath10k_wmi_op_pull_scan_ev,
8793 .pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev,
8794 .pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev,
8795 .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
8796 .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
8797 .pull_swba = ath10k_wmi_10_4_op_pull_swba_ev,
8798 .pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr,
8799 .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
8800 .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
8801 .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
8802 .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
8803 .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,
8805 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
8806 .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
8807 .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
8808 .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
8809 .gen_init = ath10k_wmi_10_4_op_gen_init,
8810 .gen_start_scan = ath10k_wmi_op_gen_start_scan,
8811 .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
8812 .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
8813 .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
8814 .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
8815 .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
8816 .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
8817 .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
8818 .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
8819 .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
8820 .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
8821 .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
8822 .gen_peer_create = ath10k_wmi_op_gen_peer_create,
8823 .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
8824 .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
8825 .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
8826 .gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc,
8827 .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
8828 .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
8829 .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
8830 .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
8831 .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
8832 .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
8833 .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
8834 .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
8835 .gen_dbglog_cfg = ath10k_wmi_10_4_op_gen_dbglog_cfg,
8836 .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
8837 .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
8838 .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
8839 .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
8840 .gen_addba_send = ath10k_wmi_op_gen_addba_send,
8841 .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
8842 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
8843 .fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill,
8844 .ext_resource_config = ath10k_wmi_10_4_ext_resource_config,
8845 .gen_update_fw_tdls_state = ath10k_wmi_10_4_gen_update_fw_tdls_state,
8846 .gen_tdls_peer_update = ath10k_wmi_10_4_gen_tdls_peer_update,
8847 .gen_pdev_get_tpc_table_cmdid =
8848 ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid,
8850 /* shared with 10.2 */
8851 .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
8852 .gen_request_stats = ath10k_wmi_op_gen_request_stats,
8853 .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
8854 .get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype,
8855 .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
8856 .gen_echo = ath10k_wmi_op_gen_echo,
8857 .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
8860 int ath10k_wmi_attach(struct ath10k *ar)
8862 switch (ar->running_fw->fw_file.wmi_op_version) {
8863 case ATH10K_FW_WMI_OP_VERSION_10_4:
8864 ar->wmi.ops = &wmi_10_4_ops;
8865 ar->wmi.cmd = &wmi_10_4_cmd_map;
8866 ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
8867 ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
8868 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
8870 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
8871 ar->wmi.cmd = &wmi_10_2_4_cmd_map;
8872 ar->wmi.ops = &wmi_10_2_4_ops;
8873 ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
8874 ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
8875 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
8877 case ATH10K_FW_WMI_OP_VERSION_10_2:
8878 ar->wmi.cmd = &wmi_10_2_cmd_map;
8879 ar->wmi.ops = &wmi_10_2_ops;
8880 ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
8881 ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
8882 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
8884 case ATH10K_FW_WMI_OP_VERSION_10_1:
8885 ar->wmi.cmd = &wmi_10x_cmd_map;
8886 ar->wmi.ops = &wmi_10_1_ops;
8887 ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
8888 ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
8889 ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
8891 case ATH10K_FW_WMI_OP_VERSION_MAIN:
8892 ar->wmi.cmd = &wmi_cmd_map;
8893 ar->wmi.ops = &wmi_ops;
8894 ar->wmi.vdev_param = &wmi_vdev_param_map;
8895 ar->wmi.pdev_param = &wmi_pdev_param_map;
8896 ar->wmi.peer_flags = &wmi_peer_flags_map;
8898 case ATH10K_FW_WMI_OP_VERSION_TLV:
8899 ath10k_wmi_tlv_attach(ar);
8901 case ATH10K_FW_WMI_OP_VERSION_UNSET:
8902 case ATH10K_FW_WMI_OP_VERSION_MAX:
8903 ath10k_err(ar, "unsupported WMI op version: %d\n",
8904 ar->running_fw->fw_file.wmi_op_version);
8908 init_completion(&ar->wmi.service_ready);
8909 init_completion(&ar->wmi.unified_ready);
8910 init_completion(&ar->wmi.barrier);
8912 INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work);
8917 void ath10k_wmi_free_host_mem(struct ath10k *ar)
8921 /* free the host memory chunks requested by firmware */
8922 for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
8923 dma_free_coherent(ar->dev,
8924 ar->wmi.mem_chunks[i].len,
8925 ar->wmi.mem_chunks[i].vaddr,
8926 ar->wmi.mem_chunks[i].paddr);
8929 ar->wmi.num_mem_chunks = 0;
8932 void ath10k_wmi_detach(struct ath10k *ar)
8934 cancel_work_sync(&ar->svc_rdy_work);
8936 if (ar->svc_rdy_skb)
8937 dev_kfree_skb(ar->svc_rdy_skb);