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