/*
 * Copyright (c) 2005-2011 Atheros Communications Inc.
 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <ddk/driver.h>

#include "core.h"
#include "htc.h"
#include "debug.h"
#include "wmi.h"
#include "wmi-tlv.h"
#include "mac.h"
#include "testmode.h"
#include "wmi-ops.h"
#include "p2p.h"
#include "hw.h"
#include "hif.h"
#include "ieee80211.h"

#define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9
#define ATH10K_WMI_BARRIER_TIMEOUT (ZX_SEC(3))

/* MAIN WMI cmd track */
static struct wmi_cmd_map wmi_cmd_map = {
    .init_cmdid = WMI_INIT_CMDID,
    .start_scan_cmdid = WMI_START_SCAN_CMDID,
    .stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
    .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
    .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
    .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
    .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
    .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
    .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
    .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
    .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
    .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
    .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
    .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
    .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
    .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
    .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
    .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
    .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
    .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
    .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
    .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
    .vdev_up_cmdid = WMI_VDEV_UP_CMDID,
    .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
    .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
    .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
    .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
    .peer_create_cmdid = WMI_PEER_CREATE_CMDID,
    .peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
    .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
    .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
    .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
    .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
    .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
    .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
    .bcn_tx_cmdid = WMI_BCN_TX_CMDID,
    .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
    .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
    .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
    .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
    .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
    .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
    .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
    .addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
    .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
    .delba_send_cmdid = WMI_DELBA_SEND_CMDID,
    .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
    .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
    .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
    .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
    .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
    .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
    .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
    .roam_scan_mode = WMI_ROAM_SCAN_MODE,
    .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
    .roam_scan_period = WMI_ROAM_SCAN_PERIOD,
    .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
    .roam_ap_profile = WMI_ROAM_AP_PROFILE,
    .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
    .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
    .ofl_scan_period = WMI_OFL_SCAN_PERIOD,
    .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
    .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
    .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
    .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
    .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
    .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
    .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
    .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
    .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
    .wlan_profile_set_hist_intvl_cmdid =
    WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
    .wlan_profile_get_profile_data_cmdid =
    WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
    .wlan_profile_enable_profile_id_cmdid =
    WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
    .wlan_profile_list_profile_id_cmdid =
    WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
    .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
    .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
    .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
    .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
    .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
    .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
    .wow_enable_disable_wake_event_cmdid =
    WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
    .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
    .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
    .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
    .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
    .vdev_spectral_scan_configure_cmdid =
    WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
    .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
    .request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
    .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
    .network_list_offload_config_cmdid =
    WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
    .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
    .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
    .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
    .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
    .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
    .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
    .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
    .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
    .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
    .echo_cmdid = WMI_ECHO_CMDID,
    .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
    .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
    .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
    .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
    .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
    .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
    .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
    .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
    .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
    .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
    .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
    .nan_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
    .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
    .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
    .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
    .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
    .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
};

/* 10.X WMI cmd track */
static struct wmi_cmd_map wmi_10x_cmd_map = {
    .init_cmdid = WMI_10X_INIT_CMDID,
    .start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
    .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
    .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
    .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
    .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
    .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
    .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
    .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
    .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
    .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
    .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
    .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
    .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
    .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
    .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
    .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
    .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
    .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
    .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
    .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
    .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
    .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
    .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
    .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
    .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
    .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
    .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
    .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
    .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
    .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
    .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
    .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
    .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
    .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
    .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
    .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
    .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
    .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
    .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
    .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
    .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
    .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
    .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
    .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
    .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
    .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
    .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
    .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
    .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
    .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
    .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
    .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
    .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
    .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
    .roam_scan_rssi_change_threshold =
    WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
    .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
    .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
    .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
    .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
    .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
    .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
    .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
    .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
    .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
    .ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID,
    .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
    .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
    .wlan_profile_set_hist_intvl_cmdid =
    WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
    .wlan_profile_get_profile_data_cmdid =
    WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
    .wlan_profile_enable_profile_id_cmdid =
    WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
    .wlan_profile_list_profile_id_cmdid =
    WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
    .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
    .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
    .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
    .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
    .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
    .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
    .wow_enable_disable_wake_event_cmdid =
    WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
    .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
    .wow_hostwakeup_from_sleep_cmdid =
    WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
    .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
    .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
    .vdev_spectral_scan_configure_cmdid =
    WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
    .vdev_spectral_scan_enable_cmdid =
    WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
    .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
    .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
    .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
    .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
    .echo_cmdid = WMI_10X_ECHO_CMDID,
    .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
    .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
    .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
    .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
    .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
    .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
    .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
    .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
    .nan_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
    .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
    .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
    .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
    .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
    .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED,
};

/* 10.2.4 WMI cmd track */
static struct wmi_cmd_map wmi_10_2_4_cmd_map = {
    .init_cmdid = WMI_10_2_INIT_CMDID,
    .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
    .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
    .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
    .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
    .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
    .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
    .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
    .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
    .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
    .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
    .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
    .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
    .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
    .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
    .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
    .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
    .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
    .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
    .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
    .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
    .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
    .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
    .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
    .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
    .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
    .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
    .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
    .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
    .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
    .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
    .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
    .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
    .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
    .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
    .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
    .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
    .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
    .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
    .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
    .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
    .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
    .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
    .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
    .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
    .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
    .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
    .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
    .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
    .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
    .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
    .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
    .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
    .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
    .roam_scan_rssi_change_threshold =
    WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
    .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
    .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
    .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
    .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
    .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
    .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
    .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
    .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
    .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
    .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
    .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
    .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
    .wlan_profile_set_hist_intvl_cmdid =
    WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
    .wlan_profile_get_profile_data_cmdid =
    WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
    .wlan_profile_enable_profile_id_cmdid =
    WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
    .wlan_profile_list_profile_id_cmdid =
    WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
    .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
    .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
    .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
    .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
    .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
    .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
    .wow_enable_disable_wake_event_cmdid =
    WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
    .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
    .wow_hostwakeup_from_sleep_cmdid =
    WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
    .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
    .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
    .vdev_spectral_scan_configure_cmdid =
    WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
    .vdev_spectral_scan_enable_cmdid =
    WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
    .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
    .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
    .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
    .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
    .echo_cmdid = WMI_10_2_ECHO_CMDID,
    .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
    .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
    .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
    .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
    .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
    .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
    .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID,
    .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS,
    .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
    .nan_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
    .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
    .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
    .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED,
    .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED,
    .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_bss_chan_info_request_cmdid =
    WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
};

/* 10.4 WMI cmd track */
static struct wmi_cmd_map wmi_10_4_cmd_map = {
    .init_cmdid = WMI_10_4_INIT_CMDID,
    .start_scan_cmdid = WMI_10_4_START_SCAN_CMDID,
    .stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID,
    .scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID,
    .scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID,
    .pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID,
    .pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID,
    .pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID,
    .pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID,
    .pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID,
    .pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID,
    .pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID,
    .pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID,
    .pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID,
    .pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID,
    .pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID,
    .pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID,
    .pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID,
    .vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID,
    .vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID,
    .vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID,
    .vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID,
    .vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID,
    .vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID,
    .vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID,
    .vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID,
    .vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID,
    .peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID,
    .peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID,
    .peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID,
    .peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID,
    .peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID,
    .peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID,
    .peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID,
    .peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID,
    .bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID,
    .pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID,
    .bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID,
    .bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID,
    .prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID,
    .mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID,
    .prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID,
    .addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID,
    .addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID,
    .addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID,
    .delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID,
    .addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID,
    .send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID,
    .sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID,
    .sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID,
    .sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID,
    .pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID,
    .pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID,
    .roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE,
    .roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD,
    .roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD,
    .roam_scan_rssi_change_threshold =
    WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
    .roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE,
    .ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE,
    .ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE,
    .ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD,
    .p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO,
    .p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY,
    .p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE,
    .p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE,
    .p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID,
    .ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID,
    .ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID,
    .peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID,
    .wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID,
    .wlan_profile_set_hist_intvl_cmdid =
    WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
    .wlan_profile_get_profile_data_cmdid =
    WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
    .wlan_profile_enable_profile_id_cmdid =
    WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
    .wlan_profile_list_profile_id_cmdid =
    WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
    .pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID,
    .pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID,
    .add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID,
    .rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID,
    .wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID,
    .wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID,
    .wow_enable_disable_wake_event_cmdid =
    WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
    .wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID,
    .wow_hostwakeup_from_sleep_cmdid =
    WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
    .rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID,
    .rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID,
    .vdev_spectral_scan_configure_cmdid =
    WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
    .vdev_spectral_scan_enable_cmdid =
    WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
    .request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID,
    .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
    .gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID,
    .csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID,
    .csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID,
    .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
    .echo_cmdid = WMI_10_4_ECHO_CMDID,
    .pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID,
    .dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID,
    .pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID,
    .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID,
    .vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID,
    .force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID,
    .gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID,
    .gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID,
    .pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID,
    .vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED,
    .tdls_set_state_cmdid = WMI_CMD_UNSUPPORTED,
    .tdls_peer_update_cmdid = WMI_CMD_UNSUPPORTED,
    .adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED,
    .scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID,
    .vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID,
    .vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID,
    .wlan_peer_caching_add_peer_cmdid =
    WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID,
    .wlan_peer_caching_evict_peer_cmdid =
    WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID,
    .wlan_peer_caching_restore_peer_cmdid =
    WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID,
    .wlan_peer_caching_print_all_peers_info_cmdid =
    WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID,
    .peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID,
    .peer_add_proxy_sta_entry_cmdid =
    WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID,
    .rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID,
    .oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID,
    .nan_cmdid = WMI_10_4_NAN_CMDID,
    .vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID,
    .qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID,
    .pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID,
    .pdev_smart_ant_set_rx_antenna_cmdid =
    WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID,
    .peer_smart_ant_set_tx_antenna_cmdid =
    WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID,
    .peer_smart_ant_set_train_info_cmdid =
    WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID,
    .peer_smart_ant_set_node_config_ops_cmdid =
    WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID,
    .pdev_set_antenna_switch_table_cmdid =
    WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID,
    .pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID,
    .pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID,
    .pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID,
    .pdev_ratepwr_chainmsk_table_cmdid =
    WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID,
    .pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID,
    .tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID,
    .fwtest_cmdid = WMI_10_4_FWTEST_CMDID,
    .vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID,
    .peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID,
    .pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID,
    .pdev_get_ani_ofdm_config_cmdid =
    WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID,
    .pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID,
    .pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID,
    .pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID,
    .pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID,
    .vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID,
    .pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID,
    .vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID,
    .vdev_filter_neighbor_rx_packets_cmdid =
    WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID,
    .mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID,
    .set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID,
    .pdev_bss_chan_info_request_cmdid =
    WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID,
    .ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID,
};

/* MAIN WMI VDEV param map */
static struct wmi_vdev_param_map wmi_vdev_param_map = {
    .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
    .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
    .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL,
    .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL,
    .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE,
    .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE,
    .slot_time = WMI_VDEV_PARAM_SLOT_TIME,
    .preamble = WMI_VDEV_PARAM_PREAMBLE,
    .swba_time = WMI_VDEV_PARAM_SWBA_TIME,
    .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD,
    .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME,
    .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL,
    .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD,
    .wmi_vdev_oc_scheduler_air_time_limit =
    WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
    .wds = WMI_VDEV_PARAM_WDS,
    .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW,
    .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX,
    .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
    .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
    .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM,
    .chwidth = WMI_VDEV_PARAM_CHWIDTH,
    .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET,
    .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION,
    .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT,
    .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE,
    .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE,
    .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE,
    .sgi = WMI_VDEV_PARAM_SGI,
    .ldpc = WMI_VDEV_PARAM_LDPC,
    .tx_stbc = WMI_VDEV_PARAM_TX_STBC,
    .rx_stbc = WMI_VDEV_PARAM_RX_STBC,
    .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD,
    .def_keyid = WMI_VDEV_PARAM_DEF_KEYID,
    .nss = WMI_VDEV_PARAM_NSS,
    .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE,
    .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE,
    .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE,
    .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE,
    .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
    .ap_keepalive_min_idle_inactive_time_secs =
    WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_idle_inactive_time_secs =
    WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_unresponsive_time_secs =
    WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
    .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS,
    .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED,
    .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS,
    .txbf = WMI_VDEV_PARAM_TXBF,
    .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE,
    .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY,
    .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE,
    .ap_detect_out_of_sync_sleeping_sta_time_secs =
    WMI_VDEV_PARAM_UNSUPPORTED,
    .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
    .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
    .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
    .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
    .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
    .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
    .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
    .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
    .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
    .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
};

/* 10.X WMI VDEV param map */
static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
    .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
    .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
    .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
    .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
    .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
    .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
    .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
    .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
    .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
    .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
    .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
    .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
    .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
    .wmi_vdev_oc_scheduler_air_time_limit =
    WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
    .wds = WMI_10X_VDEV_PARAM_WDS,
    .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
    .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
    .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
    .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
    .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
    .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
    .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
    .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
    .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
    .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
    .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
    .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
    .sgi = WMI_10X_VDEV_PARAM_SGI,
    .ldpc = WMI_10X_VDEV_PARAM_LDPC,
    .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
    .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
    .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
    .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
    .nss = WMI_10X_VDEV_PARAM_NSS,
    .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
    .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
    .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
    .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
    .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
    .ap_keepalive_min_idle_inactive_time_secs =
    WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_idle_inactive_time_secs =
    WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_unresponsive_time_secs =
    WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
    .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
    .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
    .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
    .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
    .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
    .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
    .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
    .ap_detect_out_of_sync_sleeping_sta_time_secs =
    WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
    .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
    .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
    .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
    .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
    .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
    .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
    .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
    .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
    .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
    .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
};

static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
    .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
    .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
    .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
    .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
    .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
    .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
    .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
    .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
    .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
    .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
    .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
    .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
    .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
    .wmi_vdev_oc_scheduler_air_time_limit =
    WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
    .wds = WMI_10X_VDEV_PARAM_WDS,
    .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
    .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
    .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
    .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
    .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
    .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
    .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
    .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
    .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
    .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
    .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
    .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
    .sgi = WMI_10X_VDEV_PARAM_SGI,
    .ldpc = WMI_10X_VDEV_PARAM_LDPC,
    .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
    .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
    .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
    .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
    .nss = WMI_10X_VDEV_PARAM_NSS,
    .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
    .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
    .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
    .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
    .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
    .ap_keepalive_min_idle_inactive_time_secs =
    WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_idle_inactive_time_secs =
    WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_unresponsive_time_secs =
    WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
    .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
    .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
    .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
    .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
    .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
    .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
    .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
    .ap_detect_out_of_sync_sleeping_sta_time_secs =
    WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
    .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED,
    .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED,
    .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED,
    .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED,
    .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED,
    .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED,
    .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED,
    .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED,
    .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED,
    .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
    .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
};

static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
    .rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD,
    .fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
    .beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL,
    .listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL,
    .multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE,
    .mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE,
    .slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME,
    .preamble = WMI_10_4_VDEV_PARAM_PREAMBLE,
    .swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME,
    .wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD,
    .wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME,
    .wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL,
    .dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD,
    .wmi_vdev_oc_scheduler_air_time_limit =
    WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
    .wds = WMI_10_4_VDEV_PARAM_WDS,
    .atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW,
    .bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX,
    .bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT,
    .bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT,
    .feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM,
    .chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH,
    .chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET,
    .disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION,
    .sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT,
    .mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE,
    .protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE,
    .fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE,
    .sgi = WMI_10_4_VDEV_PARAM_SGI,
    .ldpc = WMI_10_4_VDEV_PARAM_LDPC,
    .tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC,
    .rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC,
    .intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD,
    .def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID,
    .nss = WMI_10_4_VDEV_PARAM_NSS,
    .bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE,
    .mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE,
    .mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE,
    .dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE,
    .unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
    .ap_keepalive_min_idle_inactive_time_secs =
    WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_idle_inactive_time_secs =
    WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
    .ap_keepalive_max_unresponsive_time_secs =
    WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
    .ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS,
    .mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET,
    .enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS,
    .txbf = WMI_10_4_VDEV_PARAM_TXBF,
    .packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE,
    .drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY,
    .tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE,
    .ap_detect_out_of_sync_sleeping_sta_time_secs =
    WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
    .rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES,
    .cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR,
    .mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET,
    .rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE,
    .vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK,
    .vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK,
    .early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
    .early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
    .early_rx_bmiss_sample_cycle =
    WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
    .early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP,
    .early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP,
    .early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
    .proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA,
    .meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC,
    .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE,
    .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK,
    .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
    .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
};

static struct wmi_pdev_param_map wmi_pdev_param_map = {
    .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
    .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
    .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
    .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
    .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
    .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
    .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
    .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
    .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
    .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
    .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
    .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
    .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
    .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
    .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
    .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
    .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
    .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
    .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
    .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
    .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
    .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
    .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
    .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
    .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
    .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
    .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
    .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
    .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
    .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
    .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
    .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
    .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
    .pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
    .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
    .dcs = WMI_PDEV_PARAM_DCS,
    .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
    .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
    .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
    .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
    .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
    .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
    .proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
    .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
    .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
    .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
    .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
    .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
    .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
    .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
    .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
    .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
    .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
    .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
    .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
    .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
    .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
    .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
    .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
    .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
    .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
    .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
    .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
    .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
    .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
    .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
    .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
    .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
    .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
    .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
    .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
    .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
    .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
};

static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
    .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
    .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
    .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
    .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
    .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
    .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
    .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
    .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
    .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
    .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
    .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
    .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
    .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
    .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
    .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
    .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
    .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
    .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
    .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
    .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
    .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
    .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
    .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
    .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
    .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
    .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
    .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
    .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
    .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
    .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
    .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
    .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
    .bcnflt_stats_update_period =
    WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
    .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
    .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
    .dcs = WMI_10X_PDEV_PARAM_DCS,
    .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
    .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
    .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
    .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
    .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
    .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
    .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
    .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
    .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
    .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
    .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
    .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
    .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
    .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
    .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
    .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
    .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
    .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
    .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
    .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
    .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
    .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
    .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
    .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
    .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
    .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
    .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
    .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
    .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
    .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
    .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
    .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
    .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
    .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
    .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
    .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
    .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
    .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
};

static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = {
    .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
    .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
    .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
    .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
    .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
    .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
    .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
    .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
    .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
    .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
    .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
    .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
    .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
    .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
    .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
    .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
    .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
    .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
    .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
    .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
    .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
    .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
    .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
    .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
    .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
    .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
    .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
    .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
    .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
    .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
    .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
    .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
    .bcnflt_stats_update_period =
    WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
    .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
    .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
    .dcs = WMI_10X_PDEV_PARAM_DCS,
    .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
    .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
    .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
    .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
    .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
    .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
    .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
    .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
    .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
    .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
    .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
    .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
    .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
    .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED,
    .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED,
    .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED,
    .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED,
    .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
    .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED,
    .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
    .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED,
    .en_stats = WMI_PDEV_PARAM_UNSUPPORTED,
    .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED,
    .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED,
    .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
    .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED,
    .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED,
    .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED,
    .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED,
    .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED,
    .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED,
    .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED,
    .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED,
    .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED,
    .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED,
    .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED,
    .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED,
    .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED,
    .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED,
    .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
    .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED,
};

/* firmware 10.2 specific mappings */
static struct wmi_cmd_map wmi_10_2_cmd_map = {
    .init_cmdid = WMI_10_2_INIT_CMDID,
    .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID,
    .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID,
    .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID,
    .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID,
    .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID,
    .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID,
    .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID,
    .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID,
    .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID,
    .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID,
    .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID,
    .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID,
    .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID,
    .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID,
    .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID,
    .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID,
    .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID,
    .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID,
    .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID,
    .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID,
    .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID,
    .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID,
    .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID,
    .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID,
    .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID,
    .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID,
    .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID,
    .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID,
    .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID,
    .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID,
    .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID,
    .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID,
    .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID,
    .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID,
    .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
    .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID,
    .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID,
    .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID,
    .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
    .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID,
    .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID,
    .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID,
    .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID,
    .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID,
    .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID,
    .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID,
    .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID,
    .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID,
    .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID,
    .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID,
    .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE,
    .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD,
    .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD,
    .roam_scan_rssi_change_threshold =
    WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
    .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE,
    .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE,
    .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE,
    .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD,
    .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO,
    .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY,
    .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE,
    .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE,
    .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
    .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID,
    .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID,
    .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID,
    .wlan_profile_set_hist_intvl_cmdid =
    WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
    .wlan_profile_get_profile_data_cmdid =
    WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
    .wlan_profile_enable_profile_id_cmdid =
    WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
    .wlan_profile_list_profile_id_cmdid =
    WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
    .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID,
    .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID,
    .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID,
    .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID,
    .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID,
    .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID,
    .wow_enable_disable_wake_event_cmdid =
    WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
    .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID,
    .wow_hostwakeup_from_sleep_cmdid =
    WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
    .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID,
    .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID,
    .vdev_spectral_scan_configure_cmdid =
    WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
    .vdev_spectral_scan_enable_cmdid =
    WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
    .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID,
    .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
    .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
    .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
    .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
    .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
    .echo_cmdid = WMI_10_2_ECHO_CMDID,
    .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID,
    .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID,
    .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID,
    .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
    .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
    .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
    .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
    .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED,
    .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED,
    .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
    .oem_req_cmdid = WMI_CMD_UNSUPPORTED,
    .nan_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED,
    .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED,
    .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED,
    .fwtest_cmdid = WMI_CMD_UNSUPPORTED,
    .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED,
    .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED,
};

static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
    .tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK,
    .rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK,
    .txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G,
    .txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G,
    .txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE,
    .beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE,
    .beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE,
    .resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
    .protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE,
    .dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW,
    .non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
    .agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH,
    .sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH,
    .ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING,
    .ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE,
    .ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE,
    .ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK,
    .ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI,
    .ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO,
    .ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
    .ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
    .ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE,
    .ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
    .l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE,
    .dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE,
    .pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
    .pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK,
    .pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
    .pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
    .pdev_stats_update_period =
    WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
    .vdev_stats_update_period =
    WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
    .peer_stats_update_period =
    WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
    .bcnflt_stats_update_period =
    WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
    .pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS,
    .arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE,
    .dcs = WMI_10_4_PDEV_PARAM_DCS,
    .ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE,
    .ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD,
    .ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD,
    .ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL,
    .ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL,
    .dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN,
    .proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA,
    .idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG,
    .power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP,
    .fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET,
    .burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR,
    .burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE,
    .cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD,
    .aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST,
    .rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE,
    .smart_antenna_default_antenna =
    WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA,
    .igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE,
    .igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID,
    .antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN,
    .rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER,
    .set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID,
    .proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE,
    .set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE,
    .set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER,
    .remove_mcast2ucast_buffer =
    WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER,
    .peer_sta_ps_statechg_enable =
    WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE,
    .igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE,
    .block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS,
    .set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID,
    .set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID,
    .set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID,
    .txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID,
    .set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID,
    .set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID,
    .en_stats = WMI_10_4_PDEV_PARAM_EN_STATS,
    .mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY,
    .noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION,
    .noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD,
    .dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE,
    .set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO,
    .atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH,
    .atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION,
    .ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN,
    .mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT,
    .sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL,
    .signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G,
    .signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G,
    .enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU,
    .enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU,
    .cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD,
    .rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE,
    .pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET,
    .wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET,
    .arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR,
    .arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR,
    .enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
};

static const struct wmi_peer_flags_map wmi_peer_flags_map = {
    .auth = WMI_PEER_AUTH,
    .qos = WMI_PEER_QOS,
    .need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY,
    .need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY,
    .apsd = WMI_PEER_APSD,
    .ht = WMI_PEER_HT,
    .bw40 = WMI_PEER_40MHZ,
    .stbc = WMI_PEER_STBC,
    .ldbc = WMI_PEER_LDPC,
    .dyn_mimops = WMI_PEER_DYN_MIMOPS,
    .static_mimops = WMI_PEER_STATIC_MIMOPS,
    .spatial_mux = WMI_PEER_SPATIAL_MUX,
    .vht = WMI_PEER_VHT,
    .bw80 = WMI_PEER_80MHZ,
    .vht_2g = WMI_PEER_VHT_2G,
    .pmf = WMI_PEER_PMF,
    .bw160 = WMI_PEER_160MHZ,
};

static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = {
    .auth = WMI_10X_PEER_AUTH,
    .qos = WMI_10X_PEER_QOS,
    .need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY,
    .need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY,
    .apsd = WMI_10X_PEER_APSD,
    .ht = WMI_10X_PEER_HT,
    .bw40 = WMI_10X_PEER_40MHZ,
    .stbc = WMI_10X_PEER_STBC,
    .ldbc = WMI_10X_PEER_LDPC,
    .dyn_mimops = WMI_10X_PEER_DYN_MIMOPS,
    .static_mimops = WMI_10X_PEER_STATIC_MIMOPS,
    .spatial_mux = WMI_10X_PEER_SPATIAL_MUX,
    .vht = WMI_10X_PEER_VHT,
    .bw80 = WMI_10X_PEER_80MHZ,
    .bw160 = WMI_10X_PEER_160MHZ,
};

static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = {
    .auth = WMI_10_2_PEER_AUTH,
    .qos = WMI_10_2_PEER_QOS,
    .need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY,
    .need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY,
    .apsd = WMI_10_2_PEER_APSD,
    .ht = WMI_10_2_PEER_HT,
    .bw40 = WMI_10_2_PEER_40MHZ,
    .stbc = WMI_10_2_PEER_STBC,
    .ldbc = WMI_10_2_PEER_LDPC,
    .dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS,
    .static_mimops = WMI_10_2_PEER_STATIC_MIMOPS,
    .spatial_mux = WMI_10_2_PEER_SPATIAL_MUX,
    .vht = WMI_10_2_PEER_VHT,
    .bw80 = WMI_10_2_PEER_80MHZ,
    .vht_2g = WMI_10_2_PEER_VHT_2G,
    .pmf = WMI_10_2_PEER_PMF,
    .bw160 = WMI_10_2_PEER_160MHZ,
};

void ath10k_wmi_put_wmi_channel(struct wmi_channel* ch,
                                const struct wmi_channel_arg* arg) {
    uint32_t flags = 0;

    memset(ch, 0, sizeof(*ch));

    if (arg->passive) {
        flags |= WMI_CHAN_FLAG_PASSIVE;
    }
    if (arg->allow_ibss) {
        flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
    }
    if (arg->allow_ht) {
        flags |= WMI_CHAN_FLAG_ALLOW_HT;
    }
    if (arg->allow_vht) {
        flags |= WMI_CHAN_FLAG_ALLOW_VHT;
    }
    if (arg->ht40plus) {
        flags |= WMI_CHAN_FLAG_HT40_PLUS;
    }
    if (arg->chan_radar) {
        flags |= WMI_CHAN_FLAG_DFS;
    }

    ch->mhz = arg->freq;
    ch->band_center_freq1 = arg->band_center_freq1;
    if (arg->mode == MODE_11AC_VHT80_80) {
        ch->band_center_freq2 = arg->band_center_freq2;
    } else {
        ch->band_center_freq2 = 0;
    }
    ch->min_power = arg->min_power;
    ch->max_power = arg->max_power;
    ch->reg_power = arg->max_reg_power;
    ch->antenna_max = arg->max_antenna_gain;
    ch->max_tx_power = arg->max_power;

    /* mode & flags share storage */
    ch->mode = arg->mode;
    ch->flags |= flags;
}

zx_status_t ath10k_wmi_wait_for_service_ready(struct ath10k* ar) {
    if (completion_wait(&ar->wmi.service_ready, WMI_SERVICE_READY_TIMEOUT) == ZX_ERR_TIMED_OUT) {
        return ZX_ERR_TIMED_OUT;
    }
    return ZX_OK;
}

zx_status_t ath10k_wmi_wait_for_unified_ready(struct ath10k* ar) {
    if (completion_wait(&ar->wmi.unified_ready, WMI_UNIFIED_READY_TIMEOUT) == ZX_ERR_TIMED_OUT) {
        return ZX_ERR_TIMED_OUT;
    }
    return ZX_OK;
}

static void ath10k_wmi_htc_tx_complete(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    ath10k_msg_buf_free(buf);
}

zx_status_t ath10k_wmi_cmd_send_nowait(struct ath10k* ar, struct ath10k_msg_buf* buf,
                                       uint32_t cmd_id) {
    struct wmi_cmd_hdr* cmd_hdr;
    uint32_t cmd = 0;

    cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID);

    cmd_hdr = ath10k_msg_buf_get_header(buf, ATH10K_MSG_TYPE_WMI);
    cmd_hdr->cmd_id = cmd;

    return ath10k_htc_send(&ar->htc, ar->wmi.eid, buf);
}

#if 0 // NEEDS PORTING
static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif* arvif) {
    struct ath10k* ar = arvif->ar;
    struct ath10k_skb_cb* cb;
    struct sk_buff* bcn;
    bool dtim_zero;
    bool deliver_cab;
    int ret;

    mtx_lock(&ar->data_lock);

    bcn = arvif->beacon;

    if (!bcn) {
        goto unlock;
    }

    cb = ATH10K_SKB_CB(bcn);

    switch (arvif->beacon_state) {
    case ATH10K_BEACON_SENDING:
    case ATH10K_BEACON_SENT:
        break;
    case ATH10K_BEACON_SCHEDULED:
        arvif->beacon_state = ATH10K_BEACON_SENDING;
        mtx_unlock(&ar->data_lock);

        dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO);
        deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB);
        ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar,
                                                arvif->vdev_id,
                                                bcn->data, bcn->len,
                                                cb->paddr,
                                                dtim_zero,
                                                deliver_cab);

        mtx_lock(&ar->data_lock);

        if (ret == 0) {
            arvif->beacon_state = ATH10K_BEACON_SENT;
        } else {
            arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
        }
    }

unlock:
    mtx_unlock(&ar->data_lock);
}

static void ath10k_wmi_tx_beacons_iter(void* data, uint8_t* mac,
                                       struct ieee80211_vif* vif) {
    struct ath10k_vif* arvif = (void*)vif->drv_priv;

    ath10k_wmi_tx_beacon_nowait(arvif);
}
#endif // NEEDS PORTING

static void ath10k_wmi_tx_beacons_nowait(struct ath10k* ar) {
#if 0 // NEEDS PORTING
    ieee80211_iterate_active_interfaces_atomic(ar->hw,
            IEEE80211_IFACE_ITER_NORMAL,
            ath10k_wmi_tx_beacons_iter,
            NULL);
#endif // NEEDS PORTING
}

static void ath10k_wmi_op_ep_tx_credits(struct ath10k* ar) {
    /* try to send pending beacons first. they take priority */
    ath10k_wmi_tx_beacons_nowait(ar);

    zx_status_t status = zx_object_signal(ar->wmi.tx_credits_event, 0, WMI_TX_CREDITS_AVAILABLE);
    if (status != ZX_OK) {
        ZX_PANIC("unable to signal availability of tx credits: %s\n",
                 zx_status_get_string(status));
    }
}

zx_status_t ath10k_wmi_cmd_send(struct ath10k* ar, struct ath10k_msg_buf* buf, uint32_t cmd_id) {
    zx_status_t ret = ZX_ERR_NOT_SUPPORTED;

    if (cmd_id == WMI_CMD_UNSUPPORTED) {
        ath10k_warn("wmi command %d is not supported by firmware\n",
                    cmd_id);
        return ret;
    }

    zx_time_t send_timeout = zx_deadline_after(ZX_SEC(3));

    do {
        /* try to send pending beacons first. they take priority */
        ath10k_wmi_tx_beacons_nowait(ar);

        // Clear our tx_credits_event signal
        ret = zx_object_signal(ar->wmi.tx_credits_event, WMI_TX_CREDITS_AVAILABLE, 0);
        if (ret != ZX_OK) {
            ZX_PANIC("failed to signal availability of tx credits: %s\n",
                     zx_status_get_string(ret));
        }

        ret = ath10k_wmi_cmd_send_nowait(ar, buf, cmd_id);

        if (ret == ZX_OK) {
            break;
        }

        if (BITARR_TEST(ar->dev_flags, ATH10K_FLAG_CRASH_FLUSH)) {
            ret = ZX_ERR_IO_NOT_PRESENT;
            break;
        }

        if (ret != ZX_ERR_SHOULD_WAIT) {
            break;
        }

        ret = zx_object_wait_one(ar->wmi.tx_credits_event, WMI_TX_CREDITS_AVAILABLE,
                                 send_timeout, NULL);
    } while (ret == ZX_OK);

    if (ret != ZX_OK) {
        ath10k_info("failed to send wmi command: %s\n", zx_status_get_string(ret));
        ath10k_msg_buf_free(buf);
    }

    return ret;
}

#if 0 // NEEDS PORTING
static struct sk_buff*
ath10k_wmi_op_gen_mgmt_tx(struct ath10k* ar, struct sk_buff* msdu) {
    struct ath10k_skb_cb* cb = ATH10K_SKB_CB(msdu);
    struct ath10k_vif* arvif;
    struct wmi_mgmt_tx_cmd* cmd;
    struct ieee80211_hdr* hdr;
    struct sk_buff* skb;
    int len;
    uint32_t vdev_id;
    uint32_t buf_len = msdu->len;
    uint16_t fc;

    hdr = (struct ieee80211_hdr*)msdu->data;
    fc = hdr->frame_control;

    if (cb->vif) {
        arvif = (void*)cb->vif->drv_priv;
        vdev_id = arvif->vdev_id;
    } else {
        vdev_id = 0;
    }

    if (COND_WARN_ONCE(!ieee80211_is_mgmt(hdr->frame_control))) {
        return ERR_PTR(-EINVAL);
    }

    len = sizeof(cmd->hdr) + msdu->len;

    if ((ieee80211_is_action(hdr->frame_control) ||
            ieee80211_is_deauth(hdr->frame_control) ||
            ieee80211_is_disassoc(hdr->frame_control)) &&
            ieee80211_has_protected(hdr->frame_control)) {
        len += IEEE80211_CCMP_MIC_LEN;
        buf_len += IEEE80211_CCMP_MIC_LEN;
    }

    len = ROUNDUP(len, 4);

    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_mgmt_tx_cmd*)skb->data;

    cmd->hdr.vdev_id = vdev_id;
    cmd->hdr.tx_rate = 0;
    cmd->hdr.tx_power = 0;
    cmd->hdr.buf_len = buf_len;

    memcpy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr), ETH_ALEN);
    memcpy(cmd->buf, msdu->data, msdu->len);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n",
               msdu, skb->len, fc & IEEE80211_FCTL_FTYPE,
               fc & IEEE80211_FCTL_STYPE);
    trace_ath10k_tx_hdr(ar, skb->data, skb->len);
    trace_ath10k_tx_payload(ar, skb->data, skb->len);

    return skb;
}
#endif // NEEDS PORTING

static void ath10k_wmi_event_scan_started(struct ath10k* ar) {
    ASSERT_MTX_HELD(&ar->data_lock);

    switch (ar->scan.state) {
    case ATH10K_SCAN_IDLE:
    case ATH10K_SCAN_RUNNING:
    case ATH10K_SCAN_ABORTING:
        ath10k_warn("received scan started event in an invalid scan state: %s (%d)\n",
                    ath10k_scan_state_str(ar->scan.state),
                    ar->scan.state);
        break;
    case ATH10K_SCAN_STARTING:
        ar->scan.state = ATH10K_SCAN_RUNNING;

#if 0 // NEEDS PORTING
        if (ar->scan.is_roc) {
            ieee80211_ready_on_channel(ar->hw);
        }
#endif // NEEDS PORTING

        completion_signal(&ar->scan.started);
        break;
    }
}

static void ath10k_wmi_event_scan_start_failed(struct ath10k* ar) {
    ASSERT_MTX_HELD(&ar->data_lock);

    switch (ar->scan.state) {
    case ATH10K_SCAN_IDLE:
    case ATH10K_SCAN_RUNNING:
    case ATH10K_SCAN_ABORTING:
        ath10k_warn("received scan start failed event in an invalid scan state: %s (%d)\n",
                    ath10k_scan_state_str(ar->scan.state),
                    ar->scan.state);
        break;
    case ATH10K_SCAN_STARTING:
        completion_signal(&ar->scan.started);
        __ath10k_scan_finish(ar);
        break;
    }
}

static void ath10k_wmi_event_scan_completed(struct ath10k* ar) {
    ASSERT_MTX_HELD(&ar->data_lock);

    switch (ar->scan.state) {
    case ATH10K_SCAN_IDLE:
    case ATH10K_SCAN_STARTING:
        /* One suspected reason scan can be completed while starting is
         * if firmware fails to deliver all scan events to the host,
         * e.g. when transport pipe is full. This has been observed
         * with spectral scan phyerr events starving wmi transport
         * pipe. In such case the "scan completed" event should be (and
         * is) ignored by the host as it may be just firmware's scan
         * state machine recovering.
         */
        ath10k_warn("received scan completed event in an invalid scan state: %s (%d)\n",
                    ath10k_scan_state_str(ar->scan.state),
                    ar->scan.state);
        break;
    case ATH10K_SCAN_RUNNING:
    case ATH10K_SCAN_ABORTING:
        __ath10k_scan_finish(ar);
        break;
    }
}

static void ath10k_wmi_event_scan_bss_chan(struct ath10k* ar) {
    ASSERT_MTX_HELD(&ar->data_lock);

    switch (ar->scan.state) {
    case ATH10K_SCAN_IDLE:
    case ATH10K_SCAN_STARTING:
        ath10k_warn("received scan bss chan event in an invalid scan state: %s (%d)\n",
                    ath10k_scan_state_str(ar->scan.state),
                    ar->scan.state);
        break;
    case ATH10K_SCAN_RUNNING:
    case ATH10K_SCAN_ABORTING:
        memset(&ar->scan_channel, 0, sizeof(wlan_channel_t));
        break;
    }
}

static void ath10k_wmi_event_scan_foreign_chan(struct ath10k* ar, uint32_t freq) {
    ASSERT_MTX_HELD(&ar->data_lock);

    switch (ar->scan.state) {
    case ATH10K_SCAN_IDLE:
    case ATH10K_SCAN_STARTING:
        ath10k_warn("received scan foreign chan event in an invalid scan state: %s (%d)\n",
                    ath10k_scan_state_str(ar->scan.state),
                    ar->scan.state);
        break;
    case ATH10K_SCAN_RUNNING:
    case ATH10K_SCAN_ABORTING:
        ath10k_err("TODO: received foreign chan event\n");
#if 0 // NEEDS PORTING
        ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);

        if (ar->scan.is_roc && ar->scan.roc_freq == freq) {
            completion_signal(&ar->scan.on_channel);
        }
#endif // NEEDS PORTING
        break;
    }
}

static const char*
ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type,
                               enum wmi_scan_completion_reason reason) {
    switch (type) {
    case WMI_SCAN_EVENT_STARTED:
        return "started";
    case WMI_SCAN_EVENT_COMPLETED:
        switch (reason) {
        case WMI_SCAN_REASON_COMPLETED:
            return "completed";
        case WMI_SCAN_REASON_CANCELLED:
            return "completed [cancelled]";
        case WMI_SCAN_REASON_PREEMPTED:
            return "completed [preempted]";
        case WMI_SCAN_REASON_TIMEDOUT:
            return "completed [timedout]";
        case WMI_SCAN_REASON_INTERNAL_FAILURE:
            return "completed [internal err]";
        case WMI_SCAN_REASON_MAX:
            break;
        }
        return "completed [unknown]";
    case WMI_SCAN_EVENT_BSS_CHANNEL:
        return "bss channel";
    case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
        return "foreign channel";
    case WMI_SCAN_EVENT_DEQUEUED:
        return "dequeued";
    case WMI_SCAN_EVENT_PREEMPTED:
        return "preempted";
    case WMI_SCAN_EVENT_START_FAILED:
        return "start failed";
    case WMI_SCAN_EVENT_RESTARTED:
        return "restarted";
    case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
        return "foreign channel exit";
    default:
        return "unknown";
    }
}

#if 0 // NEEDS PORTING
static int ath10k_wmi_op_pull_scan_ev(struct ath10k* ar, struct sk_buff* skb,
                                      struct wmi_scan_ev_arg* arg) {
    struct wmi_scan_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->event_type = ev->event_type;
    arg->reason = ev->reason;
    arg->channel_freq = ev->channel_freq;
    arg->scan_req_id = ev->scan_req_id;
    arg->scan_id = ev->scan_id;
    arg->vdev_id = ev->vdev_id;

    return 0;
}
#endif // NEEDS PORTING

int ath10k_wmi_event_scan(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    struct wmi_scan_ev_arg arg = {};
    enum wmi_scan_event_type event_type;
    enum wmi_scan_completion_reason reason;
    uint32_t freq;
    uint32_t req_id;
    uint32_t scan_id;
    uint32_t vdev_id;
    int ret;

    ret = ath10k_wmi_pull_scan(ar, buf, &arg);
    if (ret != ZX_OK) {
        ath10k_warn("failed to parse scan event: %s\n", zx_status_get_string(ret));
        return ret;
    }

    event_type = arg.event_type;
    reason = arg.reason;
    freq = arg.channel_freq;
    req_id = arg.scan_req_id;
    scan_id = arg.scan_id;
    vdev_id = arg.vdev_id;

    mtx_lock(&ar->data_lock);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n",
               ath10k_wmi_event_scan_type_str(event_type, reason),
               event_type, reason, freq, req_id, scan_id, vdev_id,
               ath10k_scan_state_str(ar->scan.state), ar->scan.state);

    switch (event_type) {
    case WMI_SCAN_EVENT_STARTED:
        ath10k_wmi_event_scan_started(ar);
        break;
    case WMI_SCAN_EVENT_COMPLETED:
        ath10k_wmi_event_scan_completed(ar);
        break;
    case WMI_SCAN_EVENT_BSS_CHANNEL:
        ath10k_wmi_event_scan_bss_chan(ar);
        break;
    case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
        ath10k_wmi_event_scan_foreign_chan(ar, freq);
        break;
    case WMI_SCAN_EVENT_START_FAILED:
        ath10k_warn("received scan start failure event\n");
        ath10k_wmi_event_scan_start_failed(ar);
        break;
    case WMI_SCAN_EVENT_DEQUEUED:
    case WMI_SCAN_EVENT_PREEMPTED:
    case WMI_SCAN_EVENT_RESTARTED:
    case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT:
    default:
        break;
    }

    mtx_unlock(&ar->data_lock);
    return 0;
}

#if 0 // NEEDS PORTING
/* If keys are configured, HW decrypts all frames
 * with protected bit set. Mark such frames as decrypted.
 */
static void ath10k_wmi_handle_wep_reauth(struct ath10k* ar,
        struct sk_buff* skb,
        struct ieee80211_rx_status* status) {
    struct ieee80211_hdr* hdr = (struct ieee80211_hdr*)skb->data;
    unsigned int hdrlen;
    bool peer_key;
    uint8_t* addr, keyidx;

    if (!ieee80211_is_auth(hdr->frame_control) ||
            !ieee80211_has_protected(hdr->frame_control)) {
        return;
    }

    hdrlen = ieee80211_hdrlen(hdr->frame_control);
    if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN)) {
        return;
    }

    keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT;
    addr = ieee80211_get_SA(hdr);

    mtx_lock(&ar->data_lock);
    peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx);
    mtx_unlock(&ar->data_lock);

    if (peer_key) {
        ath10k_dbg(ar, ATH10K_DBG_MAC,
                   "mac wep key present for peer %pM\n", addr);
        status->flag |= RX_FLAG_DECRYPTED;
    }
}

static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k* ar, struct sk_buff* skb,
        struct wmi_mgmt_rx_ev_arg* arg) {
    struct wmi_mgmt_rx_event_v1* ev_v1;
    struct wmi_mgmt_rx_event_v2* ev_v2;
    struct wmi_mgmt_rx_hdr_v1* ev_hdr;
    struct wmi_mgmt_rx_ext_info* ext_info;
    size_t pull_len;
    uint32_t msdu_len;
    uint32_t len;

    if (BITARR_TEST(ar->running_fw->fw_file.fw_features, ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX)) {
        ev_v2 = (struct wmi_mgmt_rx_event_v2*)skb->data;
        ev_hdr = &ev_v2->hdr.v1;
        pull_len = sizeof(*ev_v2);
    } else {
        ev_v1 = (struct wmi_mgmt_rx_event_v1*)skb->data;
        ev_hdr = &ev_v1->hdr;
        pull_len = sizeof(*ev_v1);
    }

    if (skb->len < pull_len) {
        return -EPROTO;
    }

    skb_pull(skb, pull_len);
    arg->channel = ev_hdr->channel;
    arg->buf_len = ev_hdr->buf_len;
    arg->status = ev_hdr->status;
    arg->snr = ev_hdr->snr;
    arg->phy_mode = ev_hdr->phy_mode;
    arg->rate = ev_hdr->rate;

    msdu_len = arg->buf_len;
    if (skb->len < msdu_len) {
        return -EPROTO;
    }

    if (arg->status & WMI_RX_STATUS_EXT_INFO) {
        len = ALIGN(arg->buf_len, 4);
        ext_info = (struct wmi_mgmt_rx_ext_info*)(skb->data + len);
        memcpy(&arg->ext_info, ext_info,
               sizeof(struct wmi_mgmt_rx_ext_info));
    }
    /* the WMI buffer might've ended up being padded to 4 bytes due to HTC
     * trailer with credit update. Trim the excess garbage.
     */
    skb_trim(skb, msdu_len);

    return 0;
}

static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k* ar,
        struct sk_buff* skb,
        struct wmi_mgmt_rx_ev_arg* arg) {
    struct wmi_10_4_mgmt_rx_event* ev;
    struct wmi_10_4_mgmt_rx_hdr* ev_hdr;
    size_t pull_len;
    uint32_t msdu_len;
    struct wmi_mgmt_rx_ext_info* ext_info;
    uint32_t len;

    ev = (struct wmi_10_4_mgmt_rx_event*)skb->data;
    ev_hdr = &ev->hdr;
    pull_len = sizeof(*ev);

    if (skb->len < pull_len) {
        return -EPROTO;
    }

    skb_pull(skb, pull_len);
    arg->channel = ev_hdr->channel;
    arg->buf_len = ev_hdr->buf_len;
    arg->status = ev_hdr->status;
    arg->snr = ev_hdr->snr;
    arg->phy_mode = ev_hdr->phy_mode;
    arg->rate = ev_hdr->rate;

    msdu_len = arg->buf_len;
    if (skb->len < msdu_len) {
        return -EPROTO;
    }

    if (arg->status & WMI_RX_STATUS_EXT_INFO) {
        len = ALIGN(arg->buf_len, 4);
        ext_info = (struct wmi_mgmt_rx_ext_info*)(skb->data + len);
        memcpy(&arg->ext_info, ext_info,
               sizeof(struct wmi_mgmt_rx_ext_info));
    }

    /* Make sure bytes added for padding are removed. */
    skb_trim(skb, msdu_len);

    return 0;
}

static bool ath10k_wmi_rx_is_decrypted(struct ath10k* ar,
                                       struct ieee80211_hdr* hdr) {
    if (!ieee80211_has_protected(hdr->frame_control)) {
        return false;
    }

    /* FW delivers WEP Shared Auth frame with Protected Bit set and
     * encrypted payload. However in case of PMF it delivers decrypted
     * frames with Protected Bit set.
     */
    if (ieee80211_is_auth(hdr->frame_control)) {
        return false;
    }

    /* qca99x0 based FW delivers broadcast or multicast management frames
     * (ex: group privacy action frames in mesh) as encrypted payload.
     */
    if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) &&
            ar->hw_params.sw_decrypt_mcast_mgmt) {
        return false;
    }

    return true;
}
#endif // NEEDS PORTING

zx_status_t ath10k_wmi_event_mgmt_rx(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    struct wmi_mgmt_rx_ev_arg arg = {};
    uint32_t rx_status;
    bool free_buf = true;

    zx_status_t ret = ath10k_wmi_pull_mgmt_rx(ar, buf, &arg);
    if (ret != ZX_OK) {
        ath10k_warn("failed to parse mgmt rx event: %s\n", zx_status_get_string(ret));
        goto maybe_free_buf;
    }

    wlan_rx_info_t rx_info = {};

    rx_info.valid_fields |= WLAN_RX_INFO_VALID_PHY;
    rx_info.phy = arg.phy_mode;

    rx_info.valid_fields |= WLAN_RX_INFO_VALID_DATA_RATE;
    rx_info.data_rate = arg.rate;

    rx_info.valid_fields |= WLAN_RX_INFO_VALID_SNR;
    rx_info.snr_dbh = arg.snr;

    rx_info.chan.primary = arg.channel;
    // We have no information on bandwidth or secondary channel

    rx_status = arg.status;

    if ((BITARR_TEST(ar->dev_flags, ATH10K_CAC_RUNNING)) ||
            (rx_status & (WMI_RX_STATUS_ERR_DECRYPT |
                          WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) {
        goto maybe_free_buf;
    }

#if 0 // NEEDS PORTING
    if (rx_status & WMI_RX_STATUS_ERR_MIC) {
        status->flag |= RX_FLAG_MMIC_ERROR;
    }

    if (rx_status & WMI_RX_STATUS_EXT_INFO) {
        status->mactime =
            arg.ext_info.rx_mac_timestamp;
        status->flag |= RX_FLAG_MACTIME_END;
    }
    /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to
     * MODE_11B. This means phy_mode is not a reliable source for the band
     * of mgmt rx.
     */
    if (channel >= 1 && channel <= 14) {
        status->band = NL80211_BAND_2GHZ;
    } else if (channel >= 36 && channel <= 169) {
        status->band = NL80211_BAND_5GHZ;
    } else {
        /* Shouldn't happen unless list of advertised channels to
         * mac80211 has been changed.
         */
        WARN_ONCE();
        dev_kfree_skb(skb);
        return 0;
    }

    if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ) {
        ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
    }

    sband = &ar->mac.sbands[status->band];

    status->freq = ieee80211_channel_to_frequency(channel, status->band);
    status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
    status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100);
#endif // NEEDS PORTING

    struct ieee80211_frame_header* hdr = ath10k_msg_buf_get_payload(buf) + buf->rx.frame_offset;
    uint16_t fc = hdr->frame_ctrl;

#if 0 // NEEDS PORTING
    /* Firmware is guaranteed to report all essential management frames via
     * WMI while it can deliver some extra via HTT. Since there can be
     * duplicates split the reporting wrt monitor/sniffing.
     */
    status->flag |= RX_FLAG_SKIP_MONITOR;

    ath10k_wmi_handle_wep_reauth(ar, skb, status);

    if (ath10k_wmi_rx_is_decrypted(ar, hdr)) {
        status->flag |= RX_FLAG_DECRYPTED;

        if (!ieee80211_is_action(hdr->frame_control) &&
                !ieee80211_is_deauth(hdr->frame_control) &&
                !ieee80211_is_disassoc(hdr->frame_control)) {
            status->flag |= RX_FLAG_IV_STRIPPED |
                            RX_FLAG_MMIC_STRIPPED;
            hdr->frame_control = fc & ~IEEE80211_FCTL_PROTECTED;
        }
    }

    if (ieee80211_is_beacon(hdr->frame_control)) {
        ath10k_mac_handle_beacon(ar, skb);
    }
#endif // NEEDS PORTING

    ath10k_dbg(ar, ATH10K_DBG_MGMT,
               "event mgmt rx buf %pK len %d ftype %02x stype %02x\n",
               buf, buf->used,
               fc & IEEE80211_FRAME_TYPE_MASK, fc & IEEE80211_FRAME_SUBTYPE_MASK);

    void* frame_data = ath10k_msg_buf_get_payload(buf) + buf->rx.frame_offset;

    // There's no wlan event for assocation, so we have to look for the association
    // response ourselves and send the associate command to the firmware.
    // TODO: NET-821
    if ((ieee80211_get_frame_type(hdr) == IEEE80211_FRAME_TYPE_MGMT)
        && ieee80211_get_frame_subtype(hdr) == IEEE80211_FRAME_SUBTYPE_ASSOC_RESP) {
        mtx_lock(&ar->assoc_lock);
        // assoc_frame is reset to NULL by ath10k_mac_bss_assoc when it has finished
        // processing an association response.
        if (ar->assoc_frame == NULL) {
            ar->assoc_frame = buf;
            // This path is critical. If we don't tell the firmware to associate before
            // the first key packet is received, it will gladly deauthenticate us.
            completion_signal(&ar->assoc_complete);

            // mac_bss_assoc owns the buffer now
            free_buf = false;
        } else {
            // In general the lock should prevent us from getting here, but if by some
            // chance we get back-to-back packets and no progress has been made on the
            // assoc thread, drop this one.
            mtx_unlock(&ar->assoc_lock);
            goto maybe_free_buf;
        }
        mtx_unlock(&ar->assoc_lock);
    }

    ar->wlanmac.ifc->recv(ar->wlanmac.cookie, 0, frame_data, arg.buf_len, &rx_info);

maybe_free_buf:
    if (free_buf) {
        ath10k_msg_buf_free(buf);
    }
    return ret;
}

#if 0 // NEEDS PORTING
static int freq_to_idx(struct ath10k* ar, int freq) {
    struct ieee80211_supported_band* sband;
    int band, ch, idx = 0;

    for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
        sband = ar->hw->wiphy->bands[band];
        if (!sband) {
            continue;
        }

        for (ch = 0; ch < sband->n_channels; ch++, idx++)
            if (sband->channels[ch].center_freq == freq) {
                goto exit;
            }
    }

exit:
    return idx;
}

static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k* ar, struct sk_buff* skb,
        struct wmi_ch_info_ev_arg* arg) {
    struct wmi_chan_info_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->err_code = ev->err_code;
    arg->freq = ev->freq;
    arg->cmd_flags = ev->cmd_flags;
    arg->noise_floor = ev->noise_floor;
    arg->rx_clear_count = ev->rx_clear_count;
    arg->cycle_count = ev->cycle_count;

    return 0;
}

static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k* ar,
        struct sk_buff* skb,
        struct wmi_ch_info_ev_arg* arg) {
    struct wmi_10_4_chan_info_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->err_code = ev->err_code;
    arg->freq = ev->freq;
    arg->cmd_flags = ev->cmd_flags;
    arg->noise_floor = ev->noise_floor;
    arg->rx_clear_count = ev->rx_clear_count;
    arg->cycle_count = ev->cycle_count;
    arg->chan_tx_pwr_range = ev->chan_tx_pwr_range;
    arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp;
    arg->rx_frame_count = ev->rx_frame_count;

    return 0;
}

void ath10k_wmi_event_chan_info(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_ch_info_ev_arg arg = {};
    struct survey_info* survey;
    uint32_t err_code, freq, cmd_flags, noise_floor, rx_clear_count, cycle_count;
    int idx, ret;

    ret = ath10k_wmi_pull_ch_info(ar, skb, &arg);
    if (ret) {
        ath10k_warn("failed to parse chan info event: %d\n", ret);
        return;
    }

    err_code = arg.err_code;
    freq = arg.freq;
    cmd_flags = arg.cmd_flags;
    noise_floor = arg.noise_floor;
    rx_clear_count = arg.rx_clear_count;
    cycle_count = arg.cycle_count;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
               err_code, freq, cmd_flags, noise_floor, rx_clear_count,
               cycle_count);

    mtx_lock(&ar->data_lock);

    switch (ar->scan.state) {
    case ATH10K_SCAN_IDLE:
    case ATH10K_SCAN_STARTING:
        ath10k_warn("received chan info event without a scan request, ignoring\n");
        goto exit;
    case ATH10K_SCAN_RUNNING:
    case ATH10K_SCAN_ABORTING:
        break;
    }

    idx = freq_to_idx(ar, freq);
    if (idx >= countof(ar->survey)) {
        ath10k_warn("chan info: invalid frequency %d (idx %d out of bounds)\n",
                    freq, idx);
        goto exit;
    }

    if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
        if (ar->ch_info_can_report_survey) {
            survey = &ar->survey[idx];
            survey->noise = noise_floor;
            survey->filled = SURVEY_INFO_NOISE_DBM;

            ath10k_hw_fill_survey_time(ar,
                                       survey,
                                       cycle_count,
                                       rx_clear_count,
                                       ar->survey_last_cycle_count,
                                       ar->survey_last_rx_clear_count);
        }

        ar->ch_info_can_report_survey = false;
    } else {
        ar->ch_info_can_report_survey = true;
    }

    if (!(cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) {
        ar->survey_last_rx_clear_count = rx_clear_count;
        ar->survey_last_cycle_count = cycle_count;
    }

exit:
    mtx_unlock(&ar->data_lock);
}
#endif // NEEDS PORTING

void ath10k_wmi_event_echo(struct ath10k* ar, struct ath10k_msg_buf* msg_buf) {
    struct wmi_echo_ev_arg arg = {};
    int ret;

    ret = ath10k_wmi_pull_echo_ev(ar, msg_buf, &arg);
    if (ret) {
        ath10k_warn("failed to parse echo: %d\n", ret);
        return;
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi event echo value 0x%08x\n",
               arg.value);

    if (arg.value == ATH10K_WMI_BARRIER_ECHO_ID) {
        completion_signal(&ar->wmi.barrier);
    }
}

#if 0 // NEEDS PORTING
int ath10k_wmi_event_debug_mesg(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
               skb->len);

    trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);

    return 0;
}

void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base* src,
                                     struct ath10k_fw_stats_pdev* dst) {
    dst->ch_noise_floor = src->chan_nf;
    dst->tx_frame_count = src->tx_frame_count;
    dst->rx_frame_count = src->rx_frame_count;
    dst->rx_clear_count = src->rx_clear_count;
    dst->cycle_count = src->cycle_count;
    dst->phy_err_count = src->phy_err_count;
    dst->chan_tx_power = src->chan_tx_pwr;
}

void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx* src,
                                   struct ath10k_fw_stats_pdev* dst) {
    dst->comp_queued = src->comp_queued;
    dst->comp_delivered = src->comp_delivered;
    dst->msdu_enqued = src->msdu_enqued;
    dst->mpdu_enqued = src->mpdu_enqued;
    dst->wmm_drop = src->wmm_drop;
    dst->local_enqued = src->local_enqued;
    dst->local_freed = src->local_freed;
    dst->hw_queued = src->hw_queued;
    dst->hw_reaped = src->hw_reaped;
    dst->underrun = src->underrun;
    dst->tx_abort = src->tx_abort;
    dst->mpdus_requed = src->mpdus_requed;
    dst->tx_ko = src->tx_ko;
    dst->data_rc = src->data_rc;
    dst->self_triggers = src->self_triggers;
    dst->sw_retry_failure = src->sw_retry_failure;
    dst->illgl_rate_phy_err = src->illgl_rate_phy_err;
    dst->pdev_cont_xretry = src->pdev_cont_xretry;
    dst->pdev_tx_timeout = src->pdev_tx_timeout;
    dst->pdev_resets = src->pdev_resets;
    dst->phy_underrun = src->phy_underrun;
    dst->txop_ovf = src->txop_ovf;
}

static void
ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx* src,
                                   struct ath10k_fw_stats_pdev* dst) {
    dst->comp_queued = src->comp_queued;
    dst->comp_delivered = src->comp_delivered;
    dst->msdu_enqued = src->msdu_enqued;
    dst->mpdu_enqued = src->mpdu_enqued;
    dst->wmm_drop = src->wmm_drop;
    dst->local_enqued = src->local_enqued;
    dst->local_freed = src->local_freed;
    dst->hw_queued = src->hw_queued;
    dst->hw_reaped = src->hw_reaped;
    dst->underrun = src->underrun;
    dst->tx_abort = src->tx_abort;
    dst->mpdus_requed = src->mpdus_requed;
    dst->tx_ko = src->tx_ko;
    dst->data_rc = src->data_rc;
    dst->self_triggers = src->self_triggers;
    dst->sw_retry_failure = src->sw_retry_failure;
    dst->illgl_rate_phy_err = src->illgl_rate_phy_err;
    dst->pdev_cont_xretry = src->pdev_cont_xretry;
    dst->pdev_tx_timeout = src->pdev_tx_timeout;
    dst->pdev_resets = src->pdev_resets;
    dst->phy_underrun = src->phy_underrun;
    dst->txop_ovf = src->txop_ovf;
    dst->hw_paused = src->hw_paused;
    dst->seq_posted = src->seq_posted;
    dst->seq_failed_queueing =
        src->seq_failed_queueing;
    dst->seq_completed = src->seq_completed;
    dst->seq_restarted = src->seq_restarted;
    dst->mu_seq_posted = src->mu_seq_posted;
    dst->mpdus_sw_flush = src->mpdus_sw_flush;
    dst->mpdus_hw_filter = src->mpdus_hw_filter;
    dst->mpdus_truncated = src->mpdus_truncated;
    dst->mpdus_ack_failed = src->mpdus_ack_failed;
    dst->mpdus_hw_filter = src->mpdus_hw_filter;
    dst->mpdus_expired = src->mpdus_expired;
}

void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx* src,
                                   struct ath10k_fw_stats_pdev* dst) {
    dst->mid_ppdu_route_change = src->mid_ppdu_route_change;
    dst->status_rcvd = src->status_rcvd;
    dst->r0_frags = src->r0_frags;
    dst->r1_frags = src->r1_frags;
    dst->r2_frags = src->r2_frags;
    dst->r3_frags = src->r3_frags;
    dst->htt_msdus = src->htt_msdus;
    dst->htt_mpdus = src->htt_mpdus;
    dst->loc_msdus = src->loc_msdus;
    dst->loc_mpdus = src->loc_mpdus;
    dst->oversize_amsdu = src->oversize_amsdu;
    dst->phy_errs = src->phy_errs;
    dst->phy_err_drop = src->phy_err_drop;
    dst->mpdu_errs = src->mpdu_errs;
}

void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra* src,
                                      struct ath10k_fw_stats_pdev* dst) {
    dst->ack_rx_bad = src->ack_rx_bad;
    dst->rts_bad = src->rts_bad;
    dst->rts_good = src->rts_good;
    dst->fcs_bad = src->fcs_bad;
    dst->no_beacons = src->no_beacons;
    dst->mib_int_count = src->mib_int_count;
}

void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats* src,
                                struct ath10k_fw_stats_peer* dst) {
    memcpy(dst->peer_macaddr, src->peer_macaddr.addr, ETH_ALEN);
    dst->peer_rssi = src->peer_rssi;
    dst->peer_tx_rate = src->peer_tx_rate;
}

static void
ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats* src,
                                struct ath10k_fw_stats_peer* dst) {
    memcpy(dst->peer_macaddr, src->peer_macaddr.addr, ETH_ALEN);
    dst->peer_rssi = src->peer_rssi;
    dst->peer_tx_rate = src->peer_tx_rate;
    dst->peer_rx_rate = src->peer_rx_rate;
}

static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k* ar,
        struct sk_buff* skb,
        struct ath10k_fw_stats* stats) {
    const struct wmi_stats_event* ev = (void*)skb->data;
    uint32_t num_pdev_stats, num_vdev_stats, num_peer_stats;
    int i;

    if (!skb_pull(skb, sizeof(*ev))) {
        return -EPROTO;
    }

    num_pdev_stats = ev->num_pdev_stats;
    num_vdev_stats = ev->num_vdev_stats;
    num_peer_stats = ev->num_peer_stats;

    for (i = 0; i < num_pdev_stats; i++) {
        const struct wmi_pdev_stats* src;
        struct ath10k_fw_stats_pdev* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
        ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
        ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);

        list_add_tail(&dst->list, &stats->pdevs);
    }

    /* fw doesn't implement vdev stats */

    for (i = 0; i < num_peer_stats; i++) {
        const struct wmi_peer_stats* src;
        struct ath10k_fw_stats_peer* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_peer_stats(src, dst);
        list_add_tail(&dst->list, &stats->peers);
    }

    return 0;
}

static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k* ar,
        struct sk_buff* skb,
        struct ath10k_fw_stats* stats) {
    const struct wmi_stats_event* ev = (void*)skb->data;
    uint32_t num_pdev_stats, num_vdev_stats, num_peer_stats;
    int i;

    if (!skb_pull(skb, sizeof(*ev))) {
        return -EPROTO;
    }

    num_pdev_stats = ev->num_pdev_stats;
    num_vdev_stats = ev->num_vdev_stats;
    num_peer_stats = ev->num_peer_stats;

    for (i = 0; i < num_pdev_stats; i++) {
        const struct wmi_10x_pdev_stats* src;
        struct ath10k_fw_stats_pdev* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
        ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
        ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
        ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);

        list_add_tail(&dst->list, &stats->pdevs);
    }

    /* fw doesn't implement vdev stats */

    for (i = 0; i < num_peer_stats; i++) {
        const struct wmi_10x_peer_stats* src;
        struct ath10k_fw_stats_peer* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_peer_stats(&src->old, dst);

        dst->peer_rx_rate = src->peer_rx_rate;

        list_add_tail(&dst->list, &stats->peers);
    }

    return 0;
}

static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k* ar,
        struct sk_buff* skb,
        struct ath10k_fw_stats* stats) {
    const struct wmi_10_2_stats_event* ev = (void*)skb->data;
    uint32_t num_pdev_stats;
    uint32_t num_pdev_ext_stats;
    uint32_t num_vdev_stats;
    uint32_t num_peer_stats;
    int i;

    if (!skb_pull(skb, sizeof(*ev))) {
        return -EPROTO;
    }

    num_pdev_stats = ev->num_pdev_stats;
    num_pdev_ext_stats = ev->num_pdev_ext_stats;
    num_vdev_stats = ev->num_vdev_stats;
    num_peer_stats = ev->num_peer_stats;

    for (i = 0; i < num_pdev_stats; i++) {
        const struct wmi_10_2_pdev_stats* src;
        struct ath10k_fw_stats_pdev* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
        ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
        ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
        ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
        /* FIXME: expose 10.2 specific values */

        list_add_tail(&dst->list, &stats->pdevs);
    }

    for (i = 0; i < num_pdev_ext_stats; i++) {
        const struct wmi_10_2_pdev_ext_stats* src;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        /* FIXME: expose values to userspace
         *
         * Note: Even though this loop seems to do nothing it is
         * required to parse following sub-structures properly.
         */
    }

    /* fw doesn't implement vdev stats */

    for (i = 0; i < num_peer_stats; i++) {
        const struct wmi_10_2_peer_stats* src;
        struct ath10k_fw_stats_peer* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_peer_stats(&src->old, dst);

        dst->peer_rx_rate = src->peer_rx_rate;
        /* FIXME: expose 10.2 specific values */

        list_add_tail(&dst->list, &stats->peers);
    }

    return 0;
}

static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k* ar,
        struct sk_buff* skb,
        struct ath10k_fw_stats* stats) {
    const struct wmi_10_2_stats_event* ev = (void*)skb->data;
    uint32_t num_pdev_stats;
    uint32_t num_pdev_ext_stats;
    uint32_t num_vdev_stats;
    uint32_t num_peer_stats;
    int i;

    if (!skb_pull(skb, sizeof(*ev))) {
        return -EPROTO;
    }

    num_pdev_stats = ev->num_pdev_stats;
    num_pdev_ext_stats = ev->num_pdev_ext_stats;
    num_vdev_stats = ev->num_vdev_stats;
    num_peer_stats = ev->num_peer_stats;

    for (i = 0; i < num_pdev_stats; i++) {
        const struct wmi_10_2_pdev_stats* src;
        struct ath10k_fw_stats_pdev* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
        ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
        ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
        ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);
        /* FIXME: expose 10.2 specific values */

        list_add_tail(&dst->list, &stats->pdevs);
    }

    for (i = 0; i < num_pdev_ext_stats; i++) {
        const struct wmi_10_2_pdev_ext_stats* src;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        /* FIXME: expose values to userspace
         *
         * Note: Even though this loop seems to do nothing it is
         * required to parse following sub-structures properly.
         */
    }

    /* fw doesn't implement vdev stats */

    for (i = 0; i < num_peer_stats; i++) {
        const struct wmi_10_2_4_ext_peer_stats* src;
        struct ath10k_fw_stats_peer* dst;
        int stats_len;

        if (BITARR_TEST(ar->wmi.svc_map, WMI_SERVICE_PEER_STATS)) {
            stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats);
        } else {
            stats_len = sizeof(struct wmi_10_2_4_peer_stats);
        }

        src = (void*)skb->data;
        if (!skb_pull(skb, stats_len)) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_peer_stats(&src->common.old, dst);

        dst->peer_rx_rate = src->common.peer_rx_rate;

        if (ath10k_peer_stats_enabled(ar)) {
            dst->rx_duration = src->rx_duration;
        }
        /* FIXME: expose 10.2 specific values */

        list_add_tail(&dst->list, &stats->peers);
    }

    return 0;
}

static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k* ar,
        struct sk_buff* skb,
        struct ath10k_fw_stats* stats) {
    const struct wmi_10_2_stats_event* ev = (void*)skb->data;
    uint32_t num_pdev_stats;
    uint32_t num_pdev_ext_stats;
    uint32_t num_vdev_stats;
    uint32_t num_peer_stats;
    uint32_t num_bcnflt_stats;
    uint32_t stats_id;
    int i;

    if (!skb_pull(skb, sizeof(*ev))) {
        return -EPROTO;
    }

    num_pdev_stats = ev->num_pdev_stats;
    num_pdev_ext_stats = ev->num_pdev_ext_stats;
    num_vdev_stats = ev->num_vdev_stats;
    num_peer_stats = ev->num_peer_stats;
    num_bcnflt_stats = ev->num_bcnflt_stats;
    stats_id = ev->stats_id;

    for (i = 0; i < num_pdev_stats; i++) {
        const struct wmi_10_4_pdev_stats* src;
        struct ath10k_fw_stats_pdev* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
        ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst);
        ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
        dst->rx_ovfl_errs = src->rx_ovfl_errs;
        ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst);

        list_add_tail(&dst->list, &stats->pdevs);
    }

    for (i = 0; i < num_pdev_ext_stats; i++) {
        const struct wmi_10_2_pdev_ext_stats* src;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        /* FIXME: expose values to userspace
         *
         * Note: Even though this loop seems to do nothing it is
         * required to parse following sub-structures properly.
         */
    }

    /* fw doesn't implement vdev stats */

    for (i = 0; i < num_peer_stats; i++) {
        const struct wmi_10_4_peer_stats* src;
        struct ath10k_fw_stats_peer* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        ath10k_wmi_10_4_pull_peer_stats(src, dst);
        list_add_tail(&dst->list, &stats->peers);
    }

    for (i = 0; i < num_bcnflt_stats; i++) {
        const struct wmi_10_4_bss_bcn_filter_stats* src;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        /* FIXME: expose values to userspace
         *
         * Note: Even though this loop seems to do nothing it is
         * required to parse following sub-structures properly.
         */
    }

    if ((stats_id & WMI_10_4_STAT_PEER_EXTD) == 0) {
        return 0;
    }

    stats->extended = true;

    for (i = 0; i < num_peer_stats; i++) {
        const struct wmi_10_4_peer_extd_stats* src;
        struct ath10k_fw_extd_stats_peer* dst;

        src = (void*)skb->data;
        if (!skb_pull(skb, sizeof(*src))) {
            return -EPROTO;
        }

        dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
        if (!dst) {
            continue;
        }

        memcpy(dst->peer_macaddr, src->peer_macaddr.addr, ETH_ALEN);
        dst->rx_duration = src->rx_duration;
        list_add_tail(&dst->list, &stats->peers_extd);
    }

    return 0;
}

void ath10k_wmi_event_update_stats(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
    ath10k_debug_fw_stats_process(ar, skb);
}

static int
ath10k_wmi_op_pull_vdev_start_ev(struct ath10k* ar, struct sk_buff* skb,
                                 struct wmi_vdev_start_ev_arg* arg) {
    struct wmi_vdev_start_response_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->vdev_id = ev->vdev_id;
    arg->req_id = ev->req_id;
    arg->resp_type = ev->resp_type;
    arg->status = ev->status;

    return 0;
}
#endif // NEEDS PORTING

void ath10k_wmi_event_vdev_start_resp(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    struct wmi_vdev_start_ev_arg arg = {};
    zx_status_t ret;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");

    ret = ath10k_wmi_pull_vdev_start(ar, buf, &arg);
    if (ret != ZX_OK) {
        ath10k_warn("failed to parse vdev start event: %d\n", ret);
        return;
    }

    if (COND_WARN(arg.status)) {
        return;
    }

    completion_signal(&ar->vdev_setup_done);
}

#if 0 // NEEDS PORTING
void ath10k_wmi_event_vdev_stopped(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
    completion_signal(&ar->vdev_setup_done);
}

static int
ath10k_wmi_op_pull_peer_kick_ev(struct ath10k* ar, struct sk_buff* skb,
                                struct wmi_peer_kick_ev_arg* arg) {
    struct wmi_peer_sta_kickout_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->mac_addr = ev->peer_macaddr.addr;

    return 0;
}

void ath10k_wmi_event_peer_sta_kickout(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_peer_kick_ev_arg arg = {};
    struct ieee80211_sta* sta;
    int ret;

    ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
    if (ret) {
        ath10k_warn("failed to parse peer kickout event: %d\n",
                    ret);
        return;
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n",
               arg.mac_addr);

    rcu_read_lock();

    sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
    if (!sta) {
        ath10k_warn("Spurious quick kickout for STA %pM\n",
                    arg.mac_addr);
        goto exit;
    }

    ieee80211_report_low_ack(sta, 10);

exit:
    rcu_read_unlock();
}

/*
 * FIXME
 *
 * We don't report to mac80211 sleep state of connected
 * stations. Due to this mac80211 can't fill in TIM IE
 * correctly.
 *
 * I know of no way of getting nullfunc frames that contain
 * sleep transition from connected stations - these do not
 * seem to be sent from the target to the host. There also
 * doesn't seem to be a dedicated event for that. So the
 * only way left to do this would be to read tim_bitmap
 * during SWBA.
 *
 * We could probably try using tim_bitmap from SWBA to tell
 * mac80211 which stations are asleep and which are not. The
 * problem here is calling mac80211 functions so many times
 * could take too long and make us miss the time to submit
 * the beacon to the target.
 *
 * So as a workaround we try to extend the TIM IE if there
 * is unicast buffered for stations with aid > 7 and fill it
 * in ourselves.
 */
static void ath10k_wmi_update_tim(struct ath10k* ar,
                                  struct ath10k_vif* arvif,
                                  struct sk_buff* bcn,
                                  const struct wmi_tim_info_arg* tim_info) {
    struct ieee80211_hdr* hdr = (struct ieee80211_hdr*)bcn->data;
    struct ieee80211_tim_ie* tim;
    uint8_t* ies, *ie;
    uint8_t ie_len, pvm_len;
    uint32_t t;
    uint32_t v, tim_len;

    /* When FW reports 0 in tim_len, ensure atleast first byte
     * in tim_bitmap is considered for pvm calculation.
     */
    tim_len = tim_info->tim_len ? tim_info->tim_len : 1;

    /* if next SWBA has no tim_changed the tim_bitmap is garbage.
     * we must copy the bitmap upon change and reuse it later
     */
    if (tim_info->tim_changed) {
        int i;

        if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) {
            ath10k_warn("SWBA TIM field is too big (%u), truncated it to %zu",
                        tim_len, sizeof(arvif->u.ap.tim_bitmap));
            tim_len = sizeof(arvif->u.ap.tim_bitmap);
        }

        for (i = 0; i < tim_len; i++) {
            t = tim_info->tim_bitmap[i / 4];
            v = t;
            arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
        }

        /* FW reports either length 0 or length based on max supported
         * station. so we calculate this on our own
         */
        arvif->u.ap.tim_len = 0;
        for (i = 0; i < tim_len; i++)
            if (arvif->u.ap.tim_bitmap[i]) {
                arvif->u.ap.tim_len = i;
            }

        arvif->u.ap.tim_len++;
    }

    ies = bcn->data;
    ies += ieee80211_hdrlen(hdr->frame_control);
    ies += 12; /* fixed parameters */

    ie = (uint8_t*)cfg80211_find_ie(WLAN_EID_TIM, ies,
                               (uint8_t*)skb_tail_pointer(bcn) - ies);
    if (!ie) {
        if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS) {
            ath10k_warn("no tim ie found;\n");
        }
        return;
    }

    tim = (void*)ie + 2;
    ie_len = ie[1];
    pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */

    if (pvm_len < arvif->u.ap.tim_len) {
        int expand_size = tim_len - pvm_len;
        int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
        void* next_ie = ie + 2 + ie_len;

        if (skb_put(bcn, expand_size)) {
            memmove(next_ie + expand_size, next_ie, move_size);

            ie[1] += expand_size;
            ie_len += expand_size;
            pvm_len += expand_size;
        } else {
            ath10k_warn("tim expansion failed\n");
        }
    }

    if (pvm_len > tim_len) {
        ath10k_warn("tim pvm length is too great (%d)\n", pvm_len);
        return;
    }

    tim->bitmap_ctrl = !!tim_info->tim_mcast;
    memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);

    if (tim->dtim_count == 0) {
        ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO;

        if (tim_info->tim_mcast == 1) {
            ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB;
        }
    }

    ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
               tim->dtim_count, tim->dtim_period,
               tim->bitmap_ctrl, pvm_len);
}

static void ath10k_wmi_update_noa(struct ath10k* ar, struct ath10k_vif* arvif,
                                  struct sk_buff* bcn,
                                  const struct wmi_p2p_noa_info* noa) {
    if (!arvif->vif->p2p) {
        return;
    }

    ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);

    if (noa->changed & WMI_P2P_NOA_CHANGED_BIT) {
        ath10k_p2p_noa_update(arvif, noa);
    }

    if (arvif->u.ap.noa_data)
        if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
            skb_put_data(bcn, arvif->u.ap.noa_data,
                         arvif->u.ap.noa_len);
}

static int ath10k_wmi_op_pull_swba_ev(struct ath10k* ar, struct sk_buff* skb,
                                      struct wmi_swba_ev_arg* arg) {
    struct wmi_host_swba_event* ev = (void*)skb->data;
    uint32_t map;
    size_t i;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->vdev_map = ev->vdev_map;

    for (i = 0, map = ev->vdev_map; map; map >>= 1) {
        if (!(map & 0x1)) {
            continue;
        }

        /* If this happens there were some changes in firmware and
         * ath10k should update the max size of tim_info array.
         */
        if (COND_WARN_ONCE(i == countof(arg->tim_info))) {
            break;
        }

        if (ev->bcn_info[i].tim_info.tim_len >
                sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
            ath10k_warn("refusing to parse invalid swba structure\n");
            return -EPROTO;
        }

        arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
        arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
        arg->tim_info[i].tim_bitmap =
            ev->bcn_info[i].tim_info.tim_bitmap;
        arg->tim_info[i].tim_changed =
            ev->bcn_info[i].tim_info.tim_changed;
        arg->tim_info[i].tim_num_ps_pending =
            ev->bcn_info[i].tim_info.tim_num_ps_pending;

        arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info;
        i++;
    }

    return 0;
}

static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k* ar,
        struct sk_buff* skb,
        struct wmi_swba_ev_arg* arg) {
    struct wmi_10_2_4_host_swba_event* ev = (void*)skb->data;
    uint32_t map;
    size_t i;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->vdev_map = ev->vdev_map;

    for (i = 0, map = ev->vdev_map; map; map >>= 1) {
        if (!(map & 0x1)) {
            continue;
        }

        /* If this happens there were some changes in firmware and
         * ath10k should update the max size of tim_info array.
         */
        if (COND_WARN_ONCE(i == countof(arg->tim_info))) {
            break;
        }

        if (ev->bcn_info[i].tim_info.tim_len >
                sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
            ath10k_warn("refusing to parse invalid swba structure\n");
            return -EPROTO;
        }

        arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
        arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
        arg->tim_info[i].tim_bitmap =
            ev->bcn_info[i].tim_info.tim_bitmap;
        arg->tim_info[i].tim_changed =
            ev->bcn_info[i].tim_info.tim_changed;
        arg->tim_info[i].tim_num_ps_pending =
            ev->bcn_info[i].tim_info.tim_num_ps_pending;
        i++;
    }

    return 0;
}

static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k* ar,
        struct sk_buff* skb,
        struct wmi_swba_ev_arg* arg) {
    struct wmi_10_4_host_swba_event* ev = (void*)skb->data;
    uint32_t map, tim_len;
    size_t i;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->vdev_map = ev->vdev_map;

    for (i = 0, map = ev->vdev_map; map; map >>= 1) {
        if (!(map & 0x1)) {
            continue;
        }

        /* If this happens there were some changes in firmware and
         * ath10k should update the max size of tim_info array.
         */
        if (COND_WARN_ONCE(i == countof(arg->tim_info))) {
            break;
        }

        if (ev->bcn_info[i].tim_info.tim_len >
                sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
            ath10k_warn("refusing to parse invalid swba structure\n");
            return -EPROTO;
        }

        tim_len = ev->bcn_info[i].tim_info.tim_len;
        if (tim_len) {
            /* Exclude 4 byte guard length */
            tim_len -= 4;
            arg->tim_info[i].tim_len = tim_len;
        } else {
            arg->tim_info[i].tim_len = 0;
        }

        arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
        arg->tim_info[i].tim_bitmap =
            ev->bcn_info[i].tim_info.tim_bitmap;
        arg->tim_info[i].tim_changed =
            ev->bcn_info[i].tim_info.tim_changed;
        arg->tim_info[i].tim_num_ps_pending =
            ev->bcn_info[i].tim_info.tim_num_ps_pending;

        /* 10.4 firmware doesn't have p2p support. notice of absence
         * info can be ignored for now.
         */

        i++;
    }

    return 0;
}

static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k* ar) {
    return WMI_TXBF_CONF_BEFORE_ASSOC;
}

void ath10k_wmi_event_host_swba(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_swba_ev_arg arg = {};
    uint32_t map;
    int i = -1;
    const struct wmi_tim_info_arg* tim_info;
    const struct wmi_p2p_noa_info* noa_info;
    struct ath10k_vif* arvif;
    struct sk_buff* bcn;
    dma_addr_t paddr;
    int ret, vdev_id = 0;

    ret = ath10k_wmi_pull_swba(ar, skb, &arg);
    if (ret) {
        ath10k_warn("failed to parse swba event: %d\n", ret);
        return;
    }

    map = arg.vdev_map;

    ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
               map);

    for (; map; map >>= 1, vdev_id++) {
        if (!(map & 0x1)) {
            continue;
        }

        i++;

        if (i >= WMI_MAX_AP_VDEV) {
            ath10k_warn("swba has corrupted vdev map\n");
            break;
        }

        tim_info = &arg.tim_info[i];
        noa_info = arg.noa_info[i];

        ath10k_dbg(ar, ATH10K_DBG_MGMT,
                   "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n",
                   i,
                   tim_info->tim_len,
                   tim_info->tim_mcast,
                   tim_info->tim_changed,
                   tim_info->tim_num_ps_pending,
                   tim_info->tim_bitmap[3],
                   tim_info->tim_bitmap[2],
                   tim_info->tim_bitmap[1],
                   tim_info->tim_bitmap[0]);

        /* TODO: Only first 4 word from tim_bitmap is dumped.
         * Extend debug code to dump full tim_bitmap.
         */

        arvif = ath10k_get_arvif(ar, vdev_id);
        if (arvif == NULL) {
            ath10k_warn("no vif for vdev_id %d found\n",
                        vdev_id);
            continue;
        }

        /* mac80211 would have already asked us to stop beaconing and
         * bring the vdev down, so continue in that case
         */
        if (!arvif->is_up) {
            continue;
        }

        /* There are no completions for beacons so wait for next SWBA
         * before telling mac80211 to decrement CSA counter
         *
         * Once CSA counter is completed stop sending beacons until
         * actual channel switch is done
         */
        if (arvif->vif->csa_active &&
                ieee80211_csa_is_complete(arvif->vif)) {
            ieee80211_csa_finish(arvif->vif);
            continue;
        }

        bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
        if (!bcn) {
            ath10k_warn("could not get mac80211 beacon\n");
            continue;
        }

        ath10k_tx_h_seq_no(arvif->vif, bcn);
        ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
        ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);

        mtx_lock(&ar->data_lock);

        if (arvif->beacon) {
            switch (arvif->beacon_state) {
            case ATH10K_BEACON_SENT:
                break;
            case ATH10K_BEACON_SCHEDULED:
                ath10k_warn("SWBA overrun on vdev %d, skipped old beacon\n",
                            arvif->vdev_id);
                break;
            case ATH10K_BEACON_SENDING:
                ath10k_warn("SWBA overrun on vdev %d, skipped new beacon\n",
                            arvif->vdev_id);
                dev_kfree_skb(bcn);
                goto skip;
            }

            ath10k_mac_vif_beacon_free(arvif);
        }

        if (!arvif->beacon_buf) {
            paddr = dma_map_single(arvif->ar->dev, bcn->data,
                                   bcn->len, DMA_TO_DEVICE);
            ret = dma_mapping_error(arvif->ar->dev, paddr);
            if (ret) {
                ath10k_warn("failed to map beacon: %d\n",
                            ret);
                dev_kfree_skb_any(bcn);
                goto skip;
            }

            ATH10K_SKB_CB(bcn)->paddr = paddr;
        } else {
            if (bcn->len > IEEE80211_MAX_FRAME_LEN) {
                ath10k_warn("trimming beacon %d -> %d bytes!\n",
                            bcn->len, IEEE80211_MAX_FRAME_LEN);
                skb_trim(bcn, IEEE80211_MAX_FRAME_LEN);
            }
            memcpy(arvif->beacon_buf, bcn->data, bcn->len);
            ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr;
        }

        arvif->beacon = bcn;
        arvif->beacon_state = ATH10K_BEACON_SCHEDULED;

        trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
        trace_ath10k_tx_payload(ar, bcn->data, bcn->len);

skip:
        mtx_unlock(&ar->data_lock);
    }

    ath10k_wmi_tx_beacons_nowait(ar);
}

void ath10k_wmi_event_tbttoffset_update(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
}

static void ath10k_dfs_radar_report(struct ath10k* ar,
                                    struct wmi_phyerr_ev_arg* phyerr,
                                    const struct phyerr_radar_report* rr,
                                    uint64_t tsf) {
    uint32_t reg0, reg1, tsf32l;
    struct ieee80211_channel* ch;
    struct pulse_event pe;
    uint64_t tsf64;
    uint8_t rssi, width;

    reg0 = rr->reg0;
    reg1 = rr->reg1;

    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n",
               MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP),
               MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH),
               MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN),
               MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF));
    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n",
               MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK),
               MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX),
               MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID),
               MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN),
               MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK));
    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n",
               MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET),
               MS(reg1, RADAR_REPORT_REG1_PULSE_DUR));

    if (!ar->dfs_detector) {
        return;
    }

    mtx_lock(&ar->data_lock);
    ch = ar->rx_channel;

    /* fetch target operating channel during channel change */
    if (!ch) {
        ch = ar->tgt_oper_chan;
    }

    mtx_unlock(&ar->data_lock);

    if (!ch) {
        ath10k_warn("failed to derive channel for radar pulse, treating as radar\n");
        goto radar_detected;
    }

    /* report event to DFS pattern detector */
    tsf32l = phyerr->tsf_timestamp;
    tsf64 = tsf & (~0xFFFFFFFFULL);
    tsf64 |= tsf32l;

    width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
    rssi = phyerr->rssi_combined;

    /* hardware store this as 8 bit signed value,
     * set to zero if negative number
     */
    if (rssi & 0x80) {
        rssi = 0;
    }

    pe.ts = tsf64;
    pe.freq = ch->center_freq;
    pe.width = width;
    pe.rssi = rssi;
    pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0);
    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n",
               pe.freq, pe.width, pe.rssi, pe.ts);

    ATH10K_DFS_STAT_INC(ar, pulses_detected);

    if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe)) {
        ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
                   "dfs no pulse pattern detected, yet\n");
        return;
    }

radar_detected:
    ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
    ATH10K_DFS_STAT_INC(ar, radar_detected);

    /* Control radar events reporting in debugfs file
     * dfs_block_radar_events
     */
    if (ar->dfs_block_radar_events) {
        ath10k_trace("DFS Radar detected, but ignored as requested\n");
        return;
    }

    ieee80211_radar_detected(ar->hw);
}

static int ath10k_dfs_fft_report(struct ath10k* ar,
                                 struct wmi_phyerr_ev_arg* phyerr,
                                 const struct phyerr_fft_report* fftr,
                                 uint64_t tsf) {
    uint32_t reg0, reg1;
    uint8_t rssi, peak_mag;

    reg0 = fftr->reg0;
    reg1 = fftr->reg1;
    rssi = phyerr->rssi_combined;

    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
               MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB),
               MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB),
               MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX),
               MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX));
    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n",
               MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB),
               MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB),
               MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG),
               MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB));

    peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG);

    /* false event detection */
    if (rssi == DFS_RSSI_POSSIBLY_FALSE &&
            peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) {
        ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
        ATH10K_DFS_STAT_INC(ar, pulses_discarded);
        return -EINVAL;
    }

    return 0;
}

void ath10k_wmi_event_dfs(struct ath10k* ar,
                          struct wmi_phyerr_ev_arg* phyerr,
                          uint64_t tsf) {
    int buf_len, tlv_len, res, i = 0;
    const struct phyerr_tlv* tlv;
    const struct phyerr_radar_report* rr;
    const struct phyerr_fft_report* fftr;
    const uint8_t* tlv_buf;

    buf_len = phyerr->buf_len;
    ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
               "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
               phyerr->phy_err_code, phyerr->rssi_combined,
               phyerr->tsf_timestamp, tsf, buf_len);

    /* Skip event if DFS disabled */
    if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
        return;
    }

    ATH10K_DFS_STAT_INC(ar, pulses_total);

    while (i < buf_len) {
        if (i + sizeof(*tlv) > buf_len) {
            ath10k_warn("too short buf for tlv header (%d)\n",
                        i);
            return;
        }

        tlv = (struct phyerr_tlv*)&phyerr->buf[i];
        tlv_len = tlv->len;
        tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
        ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
                   "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
                   tlv_len, tlv->tag, tlv->sig);

        switch (tlv->tag) {
        case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY:
            if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) {
                ath10k_warn("too short radar pulse summary (%d)\n",
                            i);
                return;
            }

            rr = (struct phyerr_radar_report*)tlv_buf;
            ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
            break;
        case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
            if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
                ath10k_warn("too short fft report (%d)\n",
                            i);
                return;
            }

            fftr = (struct phyerr_fft_report*)tlv_buf;
            res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
            if (res) {
                return;
            }
            break;
        }

        i += sizeof(*tlv) + tlv_len;
    }
}

void ath10k_wmi_event_spectral_scan(struct ath10k* ar,
                                    struct wmi_phyerr_ev_arg* phyerr,
                                    uint64_t tsf) {
    int buf_len, tlv_len, res, i = 0;
    struct phyerr_tlv* tlv;
    const void* tlv_buf;
    const struct phyerr_fft_report* fftr;
    size_t fftr_len;

    buf_len = phyerr->buf_len;

    while (i < buf_len) {
        if (i + sizeof(*tlv) > buf_len) {
            ath10k_warn("failed to parse phyerr tlv header at byte %d\n",
                        i);
            return;
        }

        tlv = (struct phyerr_tlv*)&phyerr->buf[i];
        tlv_len = tlv->len;
        tlv_buf = &phyerr->buf[i + sizeof(*tlv)];

        if (i + sizeof(*tlv) + tlv_len > buf_len) {
            ath10k_warn("failed to parse phyerr tlv payload at byte %d\n",
                        i);
            return;
        }

        switch (tlv->tag) {
        case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
            if (sizeof(*fftr) > tlv_len) {
                ath10k_warn("failed to parse fft report at byte %d\n",
                            i);
                return;
            }

            fftr_len = tlv_len - sizeof(*fftr);
            fftr = tlv_buf;
            res = ath10k_spectral_process_fft(ar, phyerr,
                                              fftr, fftr_len,
                                              tsf);
            if (res < 0) {
                ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
                           res);
                return;
            }
            break;
        }

        i += sizeof(*tlv) + tlv_len;
    }
}

static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k* ar,
        struct sk_buff* skb,
        struct wmi_phyerr_hdr_arg* arg) {
    struct wmi_phyerr_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    arg->num_phyerrs = ev->num_phyerrs;
    arg->tsf_l32 = ev->tsf_l32;
    arg->tsf_u32 = ev->tsf_u32;
    arg->buf_len = skb->len - sizeof(*ev);
    arg->phyerrs = ev->phyerrs;

    return 0;
}

static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k* ar,
        struct sk_buff* skb,
        struct wmi_phyerr_hdr_arg* arg) {
    struct wmi_10_4_phyerr_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    /* 10.4 firmware always reports only one phyerr */
    arg->num_phyerrs = 1;

    arg->tsf_l32 = ev->tsf_l32;
    arg->tsf_u32 = ev->tsf_u32;
    arg->buf_len = skb->len;
    arg->phyerrs = skb->data;

    return 0;
}

int ath10k_wmi_op_pull_phyerr_ev(struct ath10k* ar,
                                 const void* phyerr_buf,
                                 int left_len,
                                 struct wmi_phyerr_ev_arg* arg) {
    const struct wmi_phyerr* phyerr = phyerr_buf;
    int i;

    if (left_len < sizeof(*phyerr)) {
        ath10k_warn("wrong phyerr event head len %d (need: >=%zd)\n",
                    left_len, sizeof(*phyerr));
        return -EINVAL;
    }

    arg->tsf_timestamp = phyerr->tsf_timestamp;
    arg->freq1 = phyerr->freq1;
    arg->freq2 = phyerr->freq2;
    arg->rssi_combined = phyerr->rssi_combined;
    arg->chan_width_mhz = phyerr->chan_width_mhz;
    arg->buf_len = phyerr->buf_len;
    arg->buf = phyerr->buf;
    arg->hdr_len = sizeof(*phyerr);

    for (i = 0; i < 4; i++) {
        arg->nf_chains[i] = phyerr->nf_chains[i];
    }

    switch (phyerr->phy_err_code) {
    case PHY_ERROR_GEN_SPECTRAL_SCAN:
        arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
        break;
    case PHY_ERROR_GEN_FALSE_RADAR_EXT:
        arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT;
        break;
    case PHY_ERROR_GEN_RADAR:
        arg->phy_err_code = PHY_ERROR_RADAR;
        break;
    default:
        arg->phy_err_code = PHY_ERROR_UNKNOWN;
        break;
    }

    return 0;
}

static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k* ar,
        const void* phyerr_buf,
        int left_len,
        struct wmi_phyerr_ev_arg* arg) {
    const struct wmi_10_4_phyerr_event* phyerr = phyerr_buf;
    uint32_t phy_err_mask;
    int i;

    if (left_len < sizeof(*phyerr)) {
        ath10k_warn("wrong phyerr event head len %d (need: >=%zd)\n",
                    left_len, sizeof(*phyerr));
        return -EINVAL;
    }

    arg->tsf_timestamp = phyerr->tsf_timestamp;
    arg->freq1 = phyerr->freq1;
    arg->freq2 = phyerr->freq2;
    arg->rssi_combined = phyerr->rssi_combined;
    arg->chan_width_mhz = phyerr->chan_width_mhz;
    arg->buf_len = phyerr->buf_len;
    arg->buf = phyerr->buf;
    arg->hdr_len = sizeof(*phyerr);

    for (i = 0; i < 4; i++) {
        arg->nf_chains[i] = phyerr->nf_chains[i];
    }

    phy_err_mask = phyerr->phy_err_mask[0];

    if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK) {
        arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN;
    } else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK) {
        arg->phy_err_code = PHY_ERROR_RADAR;
    } else {
        arg->phy_err_code = PHY_ERROR_UNKNOWN;
    }

    return 0;
}

void ath10k_wmi_event_phyerr(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_phyerr_hdr_arg hdr_arg = {};
    struct wmi_phyerr_ev_arg phyerr_arg = {};
    const void* phyerr;
    uint32_t count, i, buf_len, phy_err_code;
    uint64_t tsf;
    int left_len, ret;

    ATH10K_DFS_STAT_INC(ar, phy_errors);

    ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
    if (ret) {
        ath10k_warn("failed to parse phyerr event hdr: %d\n", ret);
        return;
    }

    /* Check number of included events */
    count = hdr_arg.num_phyerrs;

    left_len = hdr_arg.buf_len;

    tsf = hdr_arg.tsf_u32;
    tsf <<= 32;
    tsf |= hdr_arg.tsf_l32;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi event phyerr count %d tsf64 0x%llX\n",
               count, tsf);

    phyerr = hdr_arg.phyerrs;
    for (i = 0; i < count; i++) {
        ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
        if (ret) {
            ath10k_warn("failed to parse phyerr event (%d)\n",
                        i);
            return;
        }

        left_len -= phyerr_arg.hdr_len;
        buf_len = phyerr_arg.buf_len;
        phy_err_code = phyerr_arg.phy_err_code;

        if (left_len < buf_len) {
            ath10k_warn("single event (%d) wrong buf len\n", i);
            return;
        }

        left_len -= buf_len;

        switch (phy_err_code) {
        case PHY_ERROR_RADAR:
            ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
            break;
        case PHY_ERROR_SPECTRAL_SCAN:
            ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
            break;
        case PHY_ERROR_FALSE_RADAR_EXT:
            ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
            ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
            break;
        default:
            break;
        }

        phyerr = phyerr + phyerr_arg.hdr_len + buf_len;
    }
}

void ath10k_wmi_event_roam(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_roam_ev_arg arg = {};
    int ret;
    uint32_t vdev_id;
    uint32_t reason;
    int32_t rssi;

    ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
    if (ret) {
        ath10k_warn("failed to parse roam event: %d\n", ret);
        return;
    }

    vdev_id = arg.vdev_id;
    reason = arg.reason;
    rssi = arg.rssi;
    rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi roam event vdev %u reason 0x%08x rssi %d\n",
               vdev_id, reason, rssi);

    if (reason >= WMI_ROAM_REASON_MAX)
        ath10k_warn("ignoring unknown roam event reason %d on vdev %i\n",
                    reason, vdev_id);

    switch (reason) {
    case WMI_ROAM_REASON_BEACON_MISS:
        ath10k_mac_handle_beacon_miss(ar, vdev_id);
        break;
    case WMI_ROAM_REASON_BETTER_AP:
    case WMI_ROAM_REASON_LOW_RSSI:
    case WMI_ROAM_REASON_SUITABLE_AP_FOUND:
    case WMI_ROAM_REASON_HO_FAILED:
        ath10k_warn("ignoring not implemented roam event reason %d on vdev %i\n",
                    reason, vdev_id);
        break;
    }
}

void ath10k_wmi_event_profile_match(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
}

void ath10k_wmi_event_debug_print(struct ath10k* ar, struct sk_buff* skb) {
    char buf[101], c;
    int i;

    for (i = 0; i < sizeof(buf) - 1; i++) {
        if (i >= skb->len) {
            break;
        }

        c = skb->data[i];

        if (c == '\0') {
            break;
        }

        if (isascii(c) && isprint(c)) {
            buf[i] = c;
        } else {
            buf[i] = '.';
        }
    }

    if (i == sizeof(buf) - 1) {
        ath10k_warn("wmi debug print truncated: %d\n", skb->len);
    }

    /* for some reason the debug prints end with \n, remove that */
    if (skb->data[i - 1] == '\n') {
        i--;
    }

    /* the last byte is always reserved for the null character */
    buf[i] = '\0';

    ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
}

void ath10k_wmi_event_pdev_qvit(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
}

void ath10k_wmi_event_wlan_profile_data(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
}

void ath10k_wmi_event_rtt_measurement_report(struct ath10k* ar,
        struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
}

void ath10k_wmi_event_tsf_measurement_report(struct ath10k* ar,
        struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
}

void ath10k_wmi_event_rtt_error_report(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
}

void ath10k_wmi_event_wow_wakeup_host(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_wow_ev_arg ev = {};
    int ret;

    completion_signal(&ar->wow.wakeup_completed);

    ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
    if (ret) {
        ath10k_warn("failed to parse wow wakeup event: %d\n", ret);
        return;
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
               wow_reason(ev.wake_reason));
}

void ath10k_wmi_event_dcs_interference(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
}

static uint8_t ath10k_tpc_config_get_rate(struct ath10k* ar,
                                     struct wmi_pdev_tpc_config_event* ev,
                                     uint32_t rate_idx, uint32_t num_chains,
                                     uint32_t rate_code, uint8_t type) {
    uint8_t tpc, num_streams, preamble, ch, stm_idx;

    num_streams = ATH10K_HW_NSS(rate_code);
    preamble = ATH10K_HW_PREAMBLE(rate_code);
    ch = num_chains - 1;

    tpc = MIN_T(uint8_t, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]);

    if (ev->num_tx_chain <= 1) {
        goto out;
    }

    if (preamble == WMI_RATE_PREAMBLE_CCK) {
        goto out;
    }

    stm_idx = num_streams - 1;
    if (num_chains <= num_streams) {
        goto out;
    }

    switch (type) {
    case WMI_TPC_TABLE_TYPE_STBC:
        tpc = MIN_T(uint8_t, tpc,
                    ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]);
        break;
    case WMI_TPC_TABLE_TYPE_TXBF:
        tpc = MIN_T(uint8_t, tpc,
                    ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]);
        break;
    case WMI_TPC_TABLE_TYPE_CDD:
        tpc = MIN_T(uint8_t, tpc,
                    ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]);
        break;
    default:
        ath10k_warn("unknown wmi tpc table type: %d\n", type);
        tpc = 0;
        break;
    }

out:
    return tpc;
}

static void ath10k_tpc_config_disp_tables(struct ath10k* ar,
        struct wmi_pdev_tpc_config_event* ev,
        struct ath10k_tpc_stats* tpc_stats,
        uint8_t* rate_code, uint16_t* pream_table, uint8_t type) {
    uint32_t i, j, pream_idx, flags;
    uint8_t tpc[WMI_TPC_TX_N_CHAIN];
    char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
    char buff[WMI_TPC_BUF_SIZE];

    flags = ev->flags;

    switch (type) {
    case WMI_TPC_TABLE_TYPE_CDD:
        if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) {
            ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
            tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
            return;
        }
        break;
    case WMI_TPC_TABLE_TYPE_STBC:
        if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) {
            ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
            tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
            return;
        }
        break;
    case WMI_TPC_TABLE_TYPE_TXBF:
        if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) {
            ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
            tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG;
            return;
        }
        break;
    default:
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "invalid table type in wmi tpc event: %d\n", type);
        return;
    }

    pream_idx = 0;
    for (i = 0; i < ev->rate_max; i++) {
        memset(tpc_value, 0, sizeof(tpc_value));
        memset(buff, 0, sizeof(buff));
        if (i == pream_table[pream_idx]) {
            pream_idx++;
        }

        for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) {
            if (j >= ev->num_tx_chain) {
                break;
            }

            tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
                                                rate_code[i],
                                                type);
            snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
            strncat(tpc_value, buff, strlen(buff));
        }
        tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
        tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
        memcpy(tpc_stats->tpc_table[type].tpc_value[i],
               tpc_value, sizeof(tpc_value));
    }
}

void ath10k_wmi_event_pdev_tpc_config(struct ath10k* ar, struct sk_buff* skb) {
    uint32_t i, j, pream_idx, num_tx_chain;
    uint8_t rate_code[WMI_TPC_RATE_MAX], rate_idx;
    uint16_t pream_table[WMI_TPC_PREAM_TABLE_MAX];
    struct wmi_pdev_tpc_config_event* ev;
    struct ath10k_tpc_stats* tpc_stats;

    ev = (struct wmi_pdev_tpc_config_event*)skb->data;

    tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC);
    if (!tpc_stats) {
        return;
    }

    /* Create the rate code table based on the chains supported */
    rate_idx = 0;
    pream_idx = 0;

    /* Fill CCK rate code */
    for (i = 0; i < 4; i++) {
        rate_code[rate_idx] =
            ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK);
        rate_idx++;
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    /* Fill OFDM rate code */
    for (i = 0; i < 8; i++) {
        rate_code[rate_idx] =
            ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM);
        rate_idx++;
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    num_tx_chain = ev->num_tx_chain;

    /* Fill HT20 rate code */
    for (i = 0; i < num_tx_chain; i++) {
        for (j = 0; j < 8; j++) {
            rate_code[rate_idx] =
                ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
            rate_idx++;
        }
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    /* Fill HT40 rate code */
    for (i = 0; i < num_tx_chain; i++) {
        for (j = 0; j < 8; j++) {
            rate_code[rate_idx] =
                ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT);
            rate_idx++;
        }
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    /* Fill VHT20 rate code */
    for (i = 0; i < ev->num_tx_chain; i++) {
        for (j = 0; j < 10; j++) {
            rate_code[rate_idx] =
                ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
            rate_idx++;
        }
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    /* Fill VHT40 rate code */
    for (i = 0; i < num_tx_chain; i++) {
        for (j = 0; j < 10; j++) {
            rate_code[rate_idx] =
                ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
            rate_idx++;
        }
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    /* Fill VHT80 rate code */
    for (i = 0; i < num_tx_chain; i++) {
        for (j = 0; j < 10; j++) {
            rate_code[rate_idx] =
                ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT);
            rate_idx++;
        }
    }
    pream_table[pream_idx] = rate_idx;
    pream_idx++;

    rate_code[rate_idx++] =
        ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
    rate_code[rate_idx++] =
        ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
    rate_code[rate_idx++] =
        ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK);
    rate_code[rate_idx++] =
        ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);
    rate_code[rate_idx++] =
        ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM);

    pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END;

    tpc_stats->chan_freq = ev->chan_freq;
    tpc_stats->phy_mode = ev->phy_mode;
    tpc_stats->ctl = ev->ctl;
    tpc_stats->reg_domain = ev->reg_domain;
    tpc_stats->twice_antenna_gain = ev->twice_antenna_gain;
    tpc_stats->twice_antenna_reduction =
        ev->twice_antenna_reduction;
    tpc_stats->power_limit = ev->power_limit;
    tpc_stats->twice_max_rd_power = ev->twice_max_rd_power;
    tpc_stats->num_tx_chain = ev->num_tx_chain;
    tpc_stats->rate_max = ev->rate_max;

    ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
                                  rate_code, pream_table,
                                  WMI_TPC_TABLE_TYPE_CDD);
    ath10k_tpc_config_disp_tables(ar, ev,  tpc_stats,
                                  rate_code, pream_table,
                                  WMI_TPC_TABLE_TYPE_STBC);
    ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
                                  rate_code, pream_table,
                                  WMI_TPC_TABLE_TYPE_TXBF);

    ath10k_debug_tpc_stats_process(ar, tpc_stats);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "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",
               ev->chan_freq,
               ev->phy_mode,
               ev->ctl,
               ev->reg_domain,
               ev->twice_antenna_gain,
               ev->twice_antenna_reduction,
               ev->power_limit,
               ev->twice_max_rd_power / 2,
               ev->num_tx_chain,
               ev->rate_max);
}

void ath10k_wmi_event_pdev_ftm_intg(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
}

void ath10k_wmi_event_gtk_offload_status(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
}

void ath10k_wmi_event_gtk_rekey_fail(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
}

void ath10k_wmi_event_delba_complete(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
}

void ath10k_wmi_event_addba_complete(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
}
#endif // NEEDS PORTING

void ath10k_wmi_event_vdev_install_key_complete(struct ath10k* ar,
                                                struct ath10k_msg_buf* msg_buf) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
}

#if 0 // NEEDS PORTING
void ath10k_wmi_event_inst_rssi_stats(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
}

void ath10k_wmi_event_vdev_standby_req(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
}

void ath10k_wmi_event_vdev_resume_req(struct ath10k* ar, struct sk_buff* skb) {
    ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
}
#endif // NEEDS PORTING

static zx_status_t ath10k_wmi_alloc_host_mem(struct ath10k* ar, uint32_t req_id,
                                             uint32_t num_units, uint32_t unit_len) {
    uint32_t pool_size;
    zx_status_t ret;
    unsigned int idx = ar->wmi.num_mem_chunks;
    ZX_ASSERT(idx < countof(ar->wmi.mem_chunks));

    zx_handle_t bti_handle;
    ret = ath10k_hif_get_bti_handle(ar, &bti_handle);
    if (ret != ZX_OK) {
        return ret;
    }
    pool_size = num_units * ROUNDUP(unit_len, 4);
    ret = io_buffer_init(&ar->wmi.mem_chunks[idx].handle, bti_handle, pool_size,
                         IO_BUFFER_RW | IO_BUFFER_CONTIG);

    if (ret != ZX_OK) {
        return ret;
    }

    struct ath10k_mem_chunk* chunk = &ar->wmi.mem_chunks[idx];
    chunk->vaddr = io_buffer_virt(&chunk->handle);
    chunk->paddr = io_buffer_phys(&chunk->handle);
    chunk->len = pool_size;
    chunk->req_id = req_id;

    memset(chunk->vaddr, 0, pool_size);

    ar->wmi.num_mem_chunks++;

    return ZX_OK;
}

static bool
ath10k_wmi_is_host_mem_allocated(struct ath10k* ar,
                                 const struct wlan_host_mem_req** mem_reqs,
                                 uint32_t num_mem_reqs) {
    uint32_t req_id, num_units, unit_size, num_unit_info;
    uint32_t pool_size;
    unsigned int i, j;
    bool found;

    if (ar->wmi.num_mem_chunks != num_mem_reqs) {
        return false;
    }

    for (i = 0; i < num_mem_reqs; ++i) {
        req_id = mem_reqs[i]->req_id;
        num_units = mem_reqs[i]->num_units;
        unit_size = mem_reqs[i]->unit_size;
        num_unit_info = mem_reqs[i]->num_unit_info;

        if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
            if (ar->num_active_peers) {
                num_units = ar->num_active_peers + 1;
            } else {
                num_units = ar->max_num_peers + 1;
            }
        } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
            num_units = ar->max_num_peers + 1;
        } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
            num_units = ar->max_num_vdevs + 1;
        }

        found = false;
        for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
            if (ar->wmi.mem_chunks[j].req_id == req_id) {
                pool_size = num_units * ROUNDUP(unit_size, 4);
                if (ar->wmi.mem_chunks[j].len == pool_size) {
                    found = true;
                    break;
                }
            }
        }
        if (!found) {
            return false;
        }
    }

    return true;
}

#if 0 // NEEDS PORTING
static int
ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k* ar, struct sk_buff* skb,
                                   struct wmi_svc_rdy_ev_arg* arg) {
    struct wmi_service_ready_event* ev;
    size_t i, n;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    ev = (void*)skb->data;
    skb_pull(skb, sizeof(*ev));
    arg->min_tx_power = ev->hw_min_tx_power;
    arg->max_tx_power = ev->hw_max_tx_power;
    arg->ht_cap = ev->ht_cap_info;
    arg->vht_cap = ev->vht_cap_info;
    arg->sw_ver0 = ev->sw_version;
    arg->sw_ver1 = ev->sw_version_1;
    arg->phy_capab = ev->phy_capability;
    arg->num_rf_chains = ev->num_rf_chains;
    arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
    arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
    arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
    arg->num_mem_reqs = ev->num_mem_reqs;
    arg->service_map = ev->wmi_service_bitmap;
    arg->service_map_len = sizeof(ev->wmi_service_bitmap);

    n = MIN_T(size_t, arg->num_mem_reqs,
              countof(arg->mem_reqs));
    for (i = 0; i < n; i++) {
        arg->mem_reqs[i] = &ev->mem_reqs[i];
    }

    if (skb->len <
            arg->num_mem_reqs * sizeof(arg->mem_reqs[0])) {
        return -EPROTO;
    }

    return 0;
}

static int
ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k* ar, struct sk_buff* skb,
                                  struct wmi_svc_rdy_ev_arg* arg) {
    struct wmi_10x_service_ready_event* ev;
    int i, n;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    ev = (void*)skb->data;
    skb_pull(skb, sizeof(*ev));
    arg->min_tx_power = ev->hw_min_tx_power;
    arg->max_tx_power = ev->hw_max_tx_power;
    arg->ht_cap = ev->ht_cap_info;
    arg->vht_cap = ev->vht_cap_info;
    arg->sw_ver0 = ev->sw_version;
    arg->phy_capab = ev->phy_capability;
    arg->num_rf_chains = ev->num_rf_chains;
    arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd;
    arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan;
    arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan;
    arg->num_mem_reqs = ev->num_mem_reqs;
    arg->service_map = ev->wmi_service_bitmap;
    arg->service_map_len = sizeof(ev->wmi_service_bitmap);

    n = MIN_T(size_t, arg->num_mem_reqs,
              countof(arg->mem_reqs));
    for (i = 0; i < n; i++) {
        arg->mem_reqs[i] = &ev->mem_reqs[i];
    }

    if (skb->len <
            arg->num_mem_reqs * sizeof(arg->mem_reqs[0])) {
        return -EPROTO;
    }

    return 0;
}
#endif // NEEDS PORTING

static int ath10k_wmi_event_service_ready_work(void* thrd_init_param) {
    struct ath10k* ar = thrd_init_param;
    struct ath10k_msg_buf* buf = ar->svc_rdy_buf;
    struct wmi_svc_rdy_ev_arg arg = {};
    uint32_t num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
    int ret;
    bool allocated;

    if (!buf) {
        ath10k_warn("invalid service ready event msg buf\n");
        return -1;
    }

    struct ath10k_htc_hdr* htc_hdr = ath10k_msg_buf_get_header(buf, ATH10K_MSG_TYPE_HTC);
    buf->used = sizeof(struct ath10k_htc_hdr) + htc_hdr->len;
    ZX_DEBUG_ASSERT(buf->used <= buf->capacity);

    ret = ath10k_wmi_pull_svc_rdy(ar, buf, &arg);
    if (ret != ZX_OK) {
        ath10k_warn("failed to parse service ready: %d\n", ret);
        return -1;
    }

    memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
    ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
                       arg.service_map_len);

    ar->hw_min_tx_power = arg.min_tx_power;
    ar->hw_max_tx_power = arg.max_tx_power;
    ar->ht_cap_info = arg.ht_cap;
    ar->vht_cap_info = arg.vht_cap;
    ar->fw_version_major =
        (arg.sw_ver0 & 0xff000000) >> 24;
    ar->fw_version_minor = (arg.sw_ver0 & 0x00ffffff);
    ar->fw_version_release =
        (arg.sw_ver1 & 0xffff0000) >> 16;
    ar->fw_version_build = (arg.sw_ver1 & 0x0000ffff);
    ar->phy_capability = arg.phy_capab;
    ar->num_rf_chains = arg.num_rf_chains;
    ar->hw_eeprom_rd = arg.eeprom_rd;
    ar->low_5ghz_chan = arg.low_5ghz_chan;
    ar->high_5ghz_chan = arg.high_5ghz_chan;

    ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
                    arg.service_map, arg.service_map_len);

    if (ar->num_rf_chains > ar->max_spatial_stream) {
        ath10k_warn("hardware advertises support for more spatial streams than it should (%d > %d)\n",
                    ar->num_rf_chains, ar->max_spatial_stream);
        ar->num_rf_chains = ar->max_spatial_stream;
    }

    if (!ar->cfg_tx_chainmask) {
        ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
        ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
    }

    num_mem_reqs = arg.num_mem_reqs;
    if (num_mem_reqs > WMI_MAX_MEM_REQS) {
        ath10k_warn("requested memory chunks number (%d) exceeds the limit\n",
                    num_mem_reqs);
        return -1;
    }

    if (BITARR_TEST(ar->wmi.svc_map, WMI_SERVICE_PEER_CACHING)) {
        if (BITARR_TEST(ar->running_fw->fw_file.fw_features, ATH10K_FW_FEATURE_PEER_FLOW_CONTROL)) {
            ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC +
                                   ar->max_num_vdevs;
        } else {
            ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
                                   ar->max_num_vdevs;
        }

        ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
                            ar->max_num_vdevs;
        ar->num_tids = ar->num_active_peers * 2;
        ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
    }

    /* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE
     * and WMI_SERVICE_IRAM_TIDS, etc.
     */

    allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
                num_mem_reqs);
    if (allocated) {
        goto skip_mem_alloc;
    }

    /* Either this event is received during boot time or there is a change
     * in memory requirement from firmware when compared to last request.
     * Free any old memory and do a fresh allocation based on the current
     * memory requirement.
     */
    ath10k_wmi_free_host_mem(ar);

    for (i = 0; i < num_mem_reqs; ++i) {
        req_id = arg.mem_reqs[i]->req_id;
        num_units = arg.mem_reqs[i]->num_units;
        unit_size = arg.mem_reqs[i]->unit_size;
        num_unit_info = arg.mem_reqs[i]->num_unit_info;

        if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) {
            if (ar->num_active_peers) {
                num_units = ar->num_active_peers + 1;
            } else {
                num_units = ar->max_num_peers + 1;
            }
        } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
            /* number of units to allocate is number of
             * peers, 1 extra for self peer on target
             * this needs to be tied, host and target
             * can get out of sync
             */
            num_units = ar->max_num_peers + 1;
        } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
            num_units = ar->max_num_vdevs + 1;
        }

        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
                   req_id,
                   arg.mem_reqs[i]->num_units,
                   num_unit_info,
                   unit_size,
                   num_units);

        ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
                                        unit_size);
        if (ret != ZX_OK) {
            return -1;
        }
    }

skip_mem_alloc:
    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "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",
               arg.min_tx_power,
               arg.max_tx_power,
               arg.ht_cap,
               arg.vht_cap,
               arg.sw_ver0,
               arg.sw_ver1,
               arg.fw_build,
               arg.phy_capab,
               arg.num_rf_chains,
               arg.eeprom_rd,
               arg.num_mem_reqs);

    ath10k_msg_buf_free(buf);
    ar->svc_rdy_buf = NULL;
    completion_signal(&ar->wmi.service_ready);
    return 0;
}

void ath10k_wmi_event_service_ready(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    thrd_t wmi_rdy_thrd;
    ar->svc_rdy_buf = buf;
    // TODO: Optimize thread handling (NET-708)
    thrd_create_with_name(&wmi_rdy_thrd, ath10k_wmi_event_service_ready_work, ar,
                          "ath10k-wmi-ready");
    thrd_detach(wmi_rdy_thrd);
}

#if 0 // NEEDS PORTING
static int ath10k_wmi_op_pull_rdy_ev(struct ath10k* ar, struct sk_buff* skb,
                                     struct wmi_rdy_ev_arg* arg) {
    struct wmi_ready_event* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->sw_version = ev->sw_version;
    arg->abi_version = ev->abi_version;
    arg->status = ev->status;
    arg->mac_addr = ev->mac_addr.addr;

    return 0;
}

static int ath10k_wmi_op_pull_roam_ev(struct ath10k* ar, struct sk_buff* skb,
                                      struct wmi_roam_ev_arg* arg) {
    struct wmi_roam_ev* ev = (void*)skb->data;

    if (skb->len < sizeof(*ev)) {
        return -EPROTO;
    }

    skb_pull(skb, sizeof(*ev));
    arg->vdev_id = ev->vdev_id;
    arg->reason = ev->reason;

    return 0;
}

static int ath10k_wmi_op_pull_echo_ev(struct ath10k* ar,
                                      struct sk_buff* skb,
                                      struct wmi_echo_ev_arg* arg) {
    struct wmi_echo_event* ev = (void*)skb->data;

    arg->value = ev->value;

    return 0;
}
#endif // NEEDS PORTING

zx_status_t ath10k_wmi_event_ready(struct ath10k* ar, struct ath10k_msg_buf* msg_buf) {
    struct wmi_rdy_ev_arg arg = {};
    zx_status_t ret;

    ret = ath10k_wmi_pull_rdy(ar, msg_buf, &arg);
    if (ret != ZX_OK) {
        ath10k_warn("failed to parse ready event: %s\n", zx_status_get_string(ret));
        return ret;
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
               arg.sw_version,
               arg.abi_version,
               arg.mac_addr,
               arg.status);

    memcpy(ar->mac_addr, arg.mac_addr, ETH_ALEN);
    completion_signal(&ar->wmi.unified_ready);
    return 0;
}

#if 0 // NEEDS PORTING
static int ath10k_wmi_event_temperature(struct ath10k* ar, struct sk_buff* skb) {
    const struct wmi_pdev_temperature_event* ev;

    ev = (struct wmi_pdev_temperature_event*)skb->data;
    if (COND_WARN(skb->len < sizeof(*ev))) {
        return -EPROTO;
    }

    ath10k_thermal_event_temperature(ar, ev->temperature);
    return 0;
}

static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k* ar,
        struct sk_buff* skb) {
    struct wmi_pdev_bss_chan_info_event* ev;
    struct survey_info* survey;
    uint64_t busy, total, tx, rx, rx_bss;
    uint32_t freq, noise_floor;
    uint32_t cc_freq_hz = ar->hw_params.channel_counters_freq_hz;
    int idx;

    ev = (struct wmi_pdev_bss_chan_info_event*)skb->data;
    if (COND_WARN(skb->len < sizeof(*ev))) {
        return -EPROTO;
    }

    freq        = ev->freq;
    noise_floor = ev->noise_floor;
    busy        = ev->cycle_busy;
    total       = ev->cycle_total;
    tx          = ev->cycle_tx;
    rx          = ev->cycle_rx;
    rx_bss      = ev->cycle_rx_bss;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n",
               freq, noise_floor, busy, total, tx, rx, rx_bss);

    mtx_lock(&ar->data_lock);
    idx = freq_to_idx(ar, freq);
    if (idx >= countof(ar->survey)) {
        ath10k_warn("bss chan info: invalid frequency %d (idx %d out of bounds)\n",
                    freq, idx);
        goto exit;
    }

    survey = &ar->survey[idx];

    survey->noise     = noise_floor;
    survey->time      = div_u64(total, cc_freq_hz);
    survey->time_busy = div_u64(busy, cc_freq_hz);
    survey->time_rx   = div_u64(rx_bss, cc_freq_hz);
    survey->time_tx   = div_u64(tx, cc_freq_hz);
    survey->filled   |= (SURVEY_INFO_NOISE_DBM |
                         SURVEY_INFO_TIME |
                         SURVEY_INFO_TIME_BUSY |
                         SURVEY_INFO_TIME_RX |
                         SURVEY_INFO_TIME_TX);
exit:
    mtx_unlock(&ar->data_lock);
    completion_signal(&ar->bss_survey_done);
    return 0;
}

static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k* ar) {
    if (ar->hw_params.hw_ops->set_coverage_class) {
        mtx_lock(&ar->data_lock);

        /* This call only ensures that the modified coverage class
         * persists in case the firmware sets the registers back to
         * their default value. So calling it is only necessary if the
         * coverage class has a non-zero value.
         */
        if (ar->fw_coverage.coverage_class) {
            queue_work(ar->workqueue, &ar->set_coverage_class_work);
        }

        mtx_unlock(&ar->data_lock);
    }
}
#endif // NEEDS PORTING

static void ath10k_wmi_op_rx(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    struct wmi_cmd_hdr* cmd_hdr;
    enum wmi_event_id id;

    cmd_hdr = ath10k_msg_buf_get_header(buf, ATH10K_MSG_TYPE_WMI);
    id = MS(cmd_hdr->cmd_id, WMI_CMD_HDR_CMD_ID);

    if (ath10k_msg_buf_get_payload_offset(ATH10K_MSG_TYPE_WMI) > buf->used) {
        goto out;
    }

    buf->type = ATH10K_MSG_TYPE_WMI;

    switch (id) {
#if 0 // NEEDS PORTING
    case WMI_MGMT_RX_EVENTID:
        ath10k_wmi_event_mgmt_rx(ar, buf);
        /* mgmt_rx() owns the skb now! */
        return;
    case WMI_SCAN_EVENTID:
        ath10k_wmi_event_scan(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_CHAN_INFO_EVENTID:
        ath10k_wmi_event_chan_info(ar, buf);
        break;
    case WMI_ECHO_EVENTID:
        ath10k_wmi_event_echo(ar, buf);
        break;
    case WMI_DEBUG_MESG_EVENTID:
        ath10k_wmi_event_debug_mesg(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_UPDATE_STATS_EVENTID:
        ath10k_wmi_event_update_stats(ar, buf);
        break;
    case WMI_VDEV_START_RESP_EVENTID:
        ath10k_wmi_event_vdev_start_resp(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_VDEV_STOPPED_EVENTID:
        ath10k_wmi_event_vdev_stopped(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_PEER_STA_KICKOUT_EVENTID:
        ath10k_wmi_event_peer_sta_kickout(ar, buf);
        break;
    case WMI_HOST_SWBA_EVENTID:
        ath10k_wmi_event_host_swba(ar, buf);
        break;
    case WMI_TBTTOFFSET_UPDATE_EVENTID:
        ath10k_wmi_event_tbttoffset_update(ar, buf);
        break;
    case WMI_PHYERR_EVENTID:
        ath10k_wmi_event_phyerr(ar, buf);
        break;
    case WMI_ROAM_EVENTID:
        ath10k_wmi_event_roam(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_PROFILE_MATCH:
        ath10k_wmi_event_profile_match(ar, buf);
        break;
    case WMI_DEBUG_PRINT_EVENTID:
        ath10k_wmi_event_debug_print(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_PDEV_QVIT_EVENTID:
        ath10k_wmi_event_pdev_qvit(ar, buf);
        break;
    case WMI_WLAN_PROFILE_DATA_EVENTID:
        ath10k_wmi_event_wlan_profile_data(ar, buf);
        break;
    case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
        ath10k_wmi_event_rtt_measurement_report(ar, buf);
        break;
    case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
        ath10k_wmi_event_tsf_measurement_report(ar, buf);
        break;
    case WMI_RTT_ERROR_REPORT_EVENTID:
        ath10k_wmi_event_rtt_error_report(ar, buf);
        break;
    case WMI_WOW_WAKEUP_HOST_EVENTID:
        ath10k_wmi_event_wow_wakeup_host(ar, buf);
        break;
    case WMI_DCS_INTERFERENCE_EVENTID:
        ath10k_wmi_event_dcs_interference(ar, buf);
        break;
    case WMI_PDEV_TPC_CONFIG_EVENTID:
        ath10k_wmi_event_pdev_tpc_config(ar, buf);
        break;
    case WMI_PDEV_FTM_INTG_EVENTID:
        ath10k_wmi_event_pdev_ftm_intg(ar, buf);
        break;
    case WMI_GTK_OFFLOAD_STATUS_EVENTID:
        ath10k_wmi_event_gtk_offload_status(ar, buf);
        break;
    case WMI_GTK_REKEY_FAIL_EVENTID:
        ath10k_wmi_event_gtk_rekey_fail(ar, buf);
        break;
    case WMI_TX_DELBA_COMPLETE_EVENTID:
        ath10k_wmi_event_delba_complete(ar, buf);
        break;
    case WMI_TX_ADDBA_COMPLETE_EVENTID:
        ath10k_wmi_event_addba_complete(ar, buf);
        break;
    case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
        ath10k_wmi_event_vdev_install_key_complete(ar, buf);
        break;
#endif // NEEDS PORTING
    case WMI_SERVICE_READY_EVENTID:
        ath10k_wmi_event_service_ready(ar, buf);
        return;
#if 0 // NEEDS PORTING
    case WMI_READY_EVENTID:
        ath10k_wmi_event_ready(ar, buf);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
#endif // NEEDS PORTING
    default:
        ath10k_warn("Unknown eventid: %d\n", id);
        break;
    }

out:
    ath10k_msg_buf_free(buf);
}

#if 0 // NEEDS PORTING
static void ath10k_wmi_10_1_op_rx(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_cmd_hdr* cmd_hdr;
    enum wmi_10x_event_id id;
    bool consumed;

    cmd_hdr = (struct wmi_cmd_hdr*)skb->data;
    id = MS(cmd_hdr->cmd_id, WMI_CMD_HDR_CMD_ID);

    if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) {
        goto out;
    }

    trace_ath10k_wmi_event(ar, id, skb->data, skb->len);

    consumed = ath10k_tm_event_wmi(ar, id, skb);

    /* Ready event must be handled normally also in UTF mode so that we
     * know the UTF firmware has booted, others we are just bypass WMI
     * events to testmode.
     */
    if (consumed && id != WMI_10X_READY_EVENTID) {
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "wmi testmode consumed 0x%x\n", id);
        goto out;
    }

    switch (id) {
    case WMI_10X_MGMT_RX_EVENTID:
        ath10k_wmi_event_mgmt_rx(ar, skb);
        /* mgmt_rx() owns the skb now! */
        return;
    case WMI_10X_SCAN_EVENTID:
        ath10k_wmi_event_scan(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_CHAN_INFO_EVENTID:
        ath10k_wmi_event_chan_info(ar, skb);
        break;
    case WMI_10X_ECHO_EVENTID:
        ath10k_wmi_event_echo(ar, skb);
        break;
    case WMI_10X_DEBUG_MESG_EVENTID:
        ath10k_wmi_event_debug_mesg(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_UPDATE_STATS_EVENTID:
        ath10k_wmi_event_update_stats(ar, skb);
        break;
    case WMI_10X_VDEV_START_RESP_EVENTID:
        ath10k_wmi_event_vdev_start_resp(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_VDEV_STOPPED_EVENTID:
        ath10k_wmi_event_vdev_stopped(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_PEER_STA_KICKOUT_EVENTID:
        ath10k_wmi_event_peer_sta_kickout(ar, skb);
        break;
    case WMI_10X_HOST_SWBA_EVENTID:
        ath10k_wmi_event_host_swba(ar, skb);
        break;
    case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
        ath10k_wmi_event_tbttoffset_update(ar, skb);
        break;
    case WMI_10X_PHYERR_EVENTID:
        ath10k_wmi_event_phyerr(ar, skb);
        break;
    case WMI_10X_ROAM_EVENTID:
        ath10k_wmi_event_roam(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_PROFILE_MATCH:
        ath10k_wmi_event_profile_match(ar, skb);
        break;
    case WMI_10X_DEBUG_PRINT_EVENTID:
        ath10k_wmi_event_debug_print(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_PDEV_QVIT_EVENTID:
        ath10k_wmi_event_pdev_qvit(ar, skb);
        break;
    case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
        ath10k_wmi_event_wlan_profile_data(ar, skb);
        break;
    case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
        ath10k_wmi_event_rtt_measurement_report(ar, skb);
        break;
    case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
        ath10k_wmi_event_tsf_measurement_report(ar, skb);
        break;
    case WMI_10X_RTT_ERROR_REPORT_EVENTID:
        ath10k_wmi_event_rtt_error_report(ar, skb);
        break;
    case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
        ath10k_wmi_event_wow_wakeup_host(ar, skb);
        break;
    case WMI_10X_DCS_INTERFERENCE_EVENTID:
        ath10k_wmi_event_dcs_interference(ar, skb);
        break;
    case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
        ath10k_wmi_event_pdev_tpc_config(ar, skb);
        break;
    case WMI_10X_INST_RSSI_STATS_EVENTID:
        ath10k_wmi_event_inst_rssi_stats(ar, skb);
        break;
    case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
        ath10k_wmi_event_vdev_standby_req(ar, skb);
        break;
    case WMI_10X_VDEV_RESUME_REQ_EVENTID:
        ath10k_wmi_event_vdev_resume_req(ar, skb);
        break;
    case WMI_10X_SERVICE_READY_EVENTID:
        ath10k_wmi_event_service_ready(ar, skb);
        return;
    case WMI_10X_READY_EVENTID:
        ath10k_wmi_event_ready(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10X_PDEV_UTF_EVENTID:
        /* ignore utf events */
        break;
    default:
        ath10k_warn("Unknown eventid: %d\n", id);
        break;
    }

out:
    dev_kfree_skb(skb);
}

static void ath10k_wmi_10_2_op_rx(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_cmd_hdr* cmd_hdr;
    enum wmi_10_2_event_id id;
    bool consumed;

    cmd_hdr = (struct wmi_cmd_hdr*)skb->data;
    id = MS(cmd_hdr->cmd_id, WMI_CMD_HDR_CMD_ID);

    if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) {
        goto out;
    }

    trace_ath10k_wmi_event(ar, id, skb->data, skb->len);

    consumed = ath10k_tm_event_wmi(ar, id, skb);

    /* Ready event must be handled normally also in UTF mode so that we
     * know the UTF firmware has booted, others we are just bypass WMI
     * events to testmode.
     */
    if (consumed && id != WMI_10_2_READY_EVENTID) {
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "wmi testmode consumed 0x%x\n", id);
        goto out;
    }

    switch (id) {
    case WMI_10_2_MGMT_RX_EVENTID:
        ath10k_wmi_event_mgmt_rx(ar, skb);
        /* mgmt_rx() owns the skb now! */
        return;
    case WMI_10_2_SCAN_EVENTID:
        ath10k_wmi_event_scan(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_CHAN_INFO_EVENTID:
        ath10k_wmi_event_chan_info(ar, skb);
        break;
    case WMI_10_2_ECHO_EVENTID:
        ath10k_wmi_event_echo(ar, skb);
        break;
    case WMI_10_2_DEBUG_MESG_EVENTID:
        ath10k_wmi_event_debug_mesg(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_UPDATE_STATS_EVENTID:
        ath10k_wmi_event_update_stats(ar, skb);
        break;
    case WMI_10_2_VDEV_START_RESP_EVENTID:
        ath10k_wmi_event_vdev_start_resp(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_VDEV_STOPPED_EVENTID:
        ath10k_wmi_event_vdev_stopped(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_PEER_STA_KICKOUT_EVENTID:
        ath10k_wmi_event_peer_sta_kickout(ar, skb);
        break;
    case WMI_10_2_HOST_SWBA_EVENTID:
        ath10k_wmi_event_host_swba(ar, skb);
        break;
    case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID:
        ath10k_wmi_event_tbttoffset_update(ar, skb);
        break;
    case WMI_10_2_PHYERR_EVENTID:
        ath10k_wmi_event_phyerr(ar, skb);
        break;
    case WMI_10_2_ROAM_EVENTID:
        ath10k_wmi_event_roam(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_PROFILE_MATCH:
        ath10k_wmi_event_profile_match(ar, skb);
        break;
    case WMI_10_2_DEBUG_PRINT_EVENTID:
        ath10k_wmi_event_debug_print(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_PDEV_QVIT_EVENTID:
        ath10k_wmi_event_pdev_qvit(ar, skb);
        break;
    case WMI_10_2_WLAN_PROFILE_DATA_EVENTID:
        ath10k_wmi_event_wlan_profile_data(ar, skb);
        break;
    case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID:
        ath10k_wmi_event_rtt_measurement_report(ar, skb);
        break;
    case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID:
        ath10k_wmi_event_tsf_measurement_report(ar, skb);
        break;
    case WMI_10_2_RTT_ERROR_REPORT_EVENTID:
        ath10k_wmi_event_rtt_error_report(ar, skb);
        break;
    case WMI_10_2_WOW_WAKEUP_HOST_EVENTID:
        ath10k_wmi_event_wow_wakeup_host(ar, skb);
        break;
    case WMI_10_2_DCS_INTERFERENCE_EVENTID:
        ath10k_wmi_event_dcs_interference(ar, skb);
        break;
    case WMI_10_2_PDEV_TPC_CONFIG_EVENTID:
        ath10k_wmi_event_pdev_tpc_config(ar, skb);
        break;
    case WMI_10_2_INST_RSSI_STATS_EVENTID:
        ath10k_wmi_event_inst_rssi_stats(ar, skb);
        break;
    case WMI_10_2_VDEV_STANDBY_REQ_EVENTID:
        ath10k_wmi_event_vdev_standby_req(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_VDEV_RESUME_REQ_EVENTID:
        ath10k_wmi_event_vdev_resume_req(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_SERVICE_READY_EVENTID:
        ath10k_wmi_event_service_ready(ar, skb);
        return;
    case WMI_10_2_READY_EVENTID:
        ath10k_wmi_event_ready(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_2_PDEV_TEMPERATURE_EVENTID:
        ath10k_wmi_event_temperature(ar, skb);
        break;
    case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID:
        ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
        break;
    case WMI_10_2_RTT_KEEPALIVE_EVENTID:
    case WMI_10_2_GPIO_INPUT_EVENTID:
    case WMI_10_2_PEER_RATECODE_LIST_EVENTID:
    case WMI_10_2_GENERIC_BUFFER_EVENTID:
    case WMI_10_2_MCAST_BUF_RELEASE_EVENTID:
    case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID:
    case WMI_10_2_WDS_PEER_EVENTID:
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "received event id %d not implemented\n", id);
        break;
    default:
        ath10k_warn("Unknown eventid: %d\n", id);
        break;
    }

out:
    dev_kfree_skb(skb);
}

static void ath10k_wmi_10_4_op_rx(struct ath10k* ar, struct sk_buff* skb) {
    struct wmi_cmd_hdr* cmd_hdr;
    enum wmi_10_4_event_id id;
    bool consumed;

    cmd_hdr = (struct wmi_cmd_hdr*)skb->data;
    id = MS(cmd_hdr->cmd_id, WMI_CMD_HDR_CMD_ID);

    if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr))) {
        goto out;
    }

    trace_ath10k_wmi_event(ar, id, skb->data, skb->len);

    consumed = ath10k_tm_event_wmi(ar, id, skb);

    /* Ready event must be handled normally also in UTF mode so that we
     * know the UTF firmware has booted, others we are just bypass WMI
     * events to testmode.
     */
    if (consumed && id != WMI_10_4_READY_EVENTID) {
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "wmi testmode consumed 0x%x\n", id);
        goto out;
    }

    switch (id) {
    case WMI_10_4_MGMT_RX_EVENTID:
        ath10k_wmi_event_mgmt_rx(ar, skb);
        /* mgmt_rx() owns the skb now! */
        return;
    case WMI_10_4_ECHO_EVENTID:
        ath10k_wmi_event_echo(ar, skb);
        break;
    case WMI_10_4_DEBUG_MESG_EVENTID:
        ath10k_wmi_event_debug_mesg(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_SERVICE_READY_EVENTID:
        ath10k_wmi_event_service_ready(ar, skb);
        return;
    case WMI_10_4_SCAN_EVENTID:
        ath10k_wmi_event_scan(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_CHAN_INFO_EVENTID:
        ath10k_wmi_event_chan_info(ar, skb);
        break;
    case WMI_10_4_PHYERR_EVENTID:
        ath10k_wmi_event_phyerr(ar, skb);
        break;
    case WMI_10_4_READY_EVENTID:
        ath10k_wmi_event_ready(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
        ath10k_wmi_event_peer_sta_kickout(ar, skb);
        break;
    case WMI_10_4_ROAM_EVENTID:
        ath10k_wmi_event_roam(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_HOST_SWBA_EVENTID:
        ath10k_wmi_event_host_swba(ar, skb);
        break;
    case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID:
        ath10k_wmi_event_tbttoffset_update(ar, skb);
        break;
    case WMI_10_4_DEBUG_PRINT_EVENTID:
        ath10k_wmi_event_debug_print(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_VDEV_START_RESP_EVENTID:
        ath10k_wmi_event_vdev_start_resp(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_VDEV_STOPPED_EVENTID:
        ath10k_wmi_event_vdev_stopped(ar, skb);
        ath10k_wmi_queue_set_coverage_class_work(ar);
        break;
    case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
    case WMI_10_4_PEER_RATECODE_LIST_EVENTID:
    case WMI_10_4_WDS_PEER_EVENTID:
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "received event id %d not implemented\n", id);
        break;
    case WMI_10_4_UPDATE_STATS_EVENTID:
        ath10k_wmi_event_update_stats(ar, skb);
        break;
    case WMI_10_4_PDEV_TEMPERATURE_EVENTID:
        ath10k_wmi_event_temperature(ar, skb);
        break;
    case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID:
        ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
        break;
    case WMI_10_4_PDEV_TPC_CONFIG_EVENTID:
        ath10k_wmi_event_pdev_tpc_config(ar, skb);
        break;
    default:
        ath10k_warn("Unknown eventid: %d\n", id);
        break;
    }

out:
    dev_kfree_skb(skb);
}
#endif // NEEDS PORTING

static void ath10k_wmi_process_rx(struct ath10k* ar, struct ath10k_msg_buf* buf) {
    zx_status_t ret;

    ret = ath10k_wmi_rx(ar, buf);
    if (ret != ZX_OK) {
        ath10k_warn("failed to process wmi rx: %d\n", ret);
    }
}

zx_status_t ath10k_wmi_connect(struct ath10k* ar) {
    zx_status_t status;
    struct ath10k_htc_svc_conn_req conn_req;
    struct ath10k_htc_svc_conn_resp conn_resp;

    memset(&conn_req, 0, sizeof(conn_req));
    memset(&conn_resp, 0, sizeof(conn_resp));

    /* these fields are the same for all service endpoints */
    conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
    conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
    conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;

    /* connect to control service */
    conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;

    status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
    if (status) {
        ath10k_warn("failed to connect to WMI CONTROL service status: %d\n",
                    status);
        return status;
    }

    ar->wmi.eid = conn_resp.eid;
    return ZX_OK;
}

#if 0 // NEEDS PORTING
static struct sk_buff*
ath10k_wmi_op_gen_pdev_set_rd(struct ath10k* ar, uint16_t rd, uint16_t rd2g, uint16_t rd5g,
                              uint16_t ctl2g, uint16_t ctl5g,
                              enum wmi_dfs_region dfs_reg) {
    struct wmi_pdev_set_regdomain_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_set_regdomain_cmd*)skb->data;
    cmd->reg_domain = rd;
    cmd->reg_domain_2G = rd2g;
    cmd->reg_domain_5G = rd5g;
    cmd->conformance_test_limit_2G = ctl2g;
    cmd->conformance_test_limit_5G = ctl5g;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
               rd, rd2g, rd5g, ctl2g, ctl5g);
    return skb;
}

static struct sk_buff*
ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k* ar, uint16_t rd, uint16_t rd2g, uint16_t rd5g,
                                  uint16_t ctl2g, uint16_t ctl5g,
                                  enum wmi_dfs_region dfs_reg) {
    struct wmi_pdev_set_regdomain_cmd_10x* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_set_regdomain_cmd_10x*)skb->data;
    cmd->reg_domain = rd;
    cmd->reg_domain_2G = rd2g;
    cmd->reg_domain_5G = rd5g;
    cmd->conformance_test_limit_2G = ctl2g;
    cmd->conformance_test_limit_5G = ctl5g;
    cmd->dfs_domain = dfs_reg;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
               rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_pdev_suspend(struct ath10k* ar, uint32_t suspend_opt) {
    struct wmi_pdev_suspend_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_suspend_cmd*)skb->data;
    cmd->suspend_opt = suspend_opt;

    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_pdev_resume(struct ath10k* ar) {
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, 0);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_pdev_set_param(struct ath10k* ar, uint32_t id, uint32_t value) {
    struct wmi_pdev_set_param_cmd* cmd;
    struct sk_buff* skb;

    if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
        ath10k_warn("pdev param %d not supported by firmware\n",
                    id);
        return ERR_PTR(-EOPNOTSUPP);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_set_param_cmd*)skb->data;
    cmd->param_id    = id;
    cmd->param_value = value;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
               id, value);
    return skb;
}
#endif // NEEDS PORTING

void ath10k_wmi_put_host_mem_chunks(struct ath10k* ar,
                                    struct wmi_host_mem_chunks* chunks) {
    struct host_memory_chunk* chunk;
    unsigned int i;

    chunks->count = ar->wmi.num_mem_chunks;

    for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
        chunk = &chunks->items[i];
        chunk->ptr = ar->wmi.mem_chunks[i].paddr;
        chunk->size = ar->wmi.mem_chunks[i].len;
        chunk->req_id = ar->wmi.mem_chunks[i].req_id;

        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "wmi chunk %d len %d requested, addr 0x%llx\n",
                   i,
                   ar->wmi.mem_chunks[i].len,
                   (unsigned long long)ar->wmi.mem_chunks[i].paddr);
    }
}

#if 0 // NEEDS PORTING
static struct sk_buff* ath10k_wmi_op_gen_init(struct ath10k* ar) {
    struct wmi_init_cmd* cmd;
    struct sk_buff* buf;
    struct wmi_resource_config config = {};
    uint32_t len, val;

    config.num_vdevs = TARGET_NUM_VDEVS;
    config.num_peers = TARGET_NUM_PEERS;
    config.num_offload_peers = TARGET_NUM_OFFLOAD_PEERS;

    config.num_offload_reorder_bufs =
        TARGET_NUM_OFFLOAD_REORDER_BUFS;

    config.num_peer_keys = TARGET_NUM_PEER_KEYS;
    config.num_tids = TARGET_NUM_TIDS;
    config.ast_skid_limit = TARGET_AST_SKID_LIMIT;
    config.tx_chain_mask = TARGET_TX_CHAIN_MASK;
    config.rx_chain_mask = TARGET_RX_CHAIN_MASK;
    config.rx_timeout_pri_vo = TARGET_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_vi = TARGET_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_be = TARGET_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_bk = TARGET_RX_TIMEOUT_HI_PRI;
    config.rx_decap_mode = ar->wmi.rx_decap_mode;
    config.scan_max_pending_reqs =
        TARGET_SCAN_MAX_PENDING_REQS;

    config.bmiss_offload_max_vdev =
        TARGET_BMISS_OFFLOAD_MAX_VDEV;

    config.roam_offload_max_vdev =
        TARGET_ROAM_OFFLOAD_MAX_VDEV;

    config.roam_offload_max_ap_profiles =
        TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES;

    config.num_mcast_groups = TARGET_NUM_MCAST_GROUPS;
    config.num_mcast_table_elems =
        TARGET_NUM_MCAST_TABLE_ELEMS;

    config.mcast2ucast_mode = TARGET_MCAST2UCAST_MODE;
    config.tx_dbg_log_size = TARGET_TX_DBG_LOG_SIZE;
    config.num_wds_entries = TARGET_NUM_WDS_ENTRIES;
    config.dma_burst_size = TARGET_DMA_BURST_SIZE;
    config.mac_aggr_delim = TARGET_MAC_AGGR_DELIM;

    val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
    config.rx_skip_defrag_timeout_dup_detection_check = val;

    config.vow_config = TARGET_VOW_CONFIG;

    config.gtk_offload_max_vdev =
        TARGET_GTK_OFFLOAD_MAX_VDEV;

    config.num_msdu_desc = TARGET_NUM_MSDU_DESC;
    config.max_frag_entries = TARGET_MAX_FRAG_ENTRIES;

    len = sizeof(*cmd) +
          (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);

    buf = ath10k_wmi_alloc_skb(ar, len);
    if (!buf) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_init_cmd*)buf->data;

    memcpy(&cmd->resource_config, &config, sizeof(config));
    ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
    return buf;
}

static struct sk_buff* ath10k_wmi_10_1_op_gen_init(struct ath10k* ar) {
    struct wmi_init_cmd_10x* cmd;
    struct sk_buff* buf;
    struct wmi_resource_config_10x config = {};
    uint32_t len, val;

    config.num_vdevs = TARGET_10X_NUM_VDEVS;
    config.num_peers = TARGET_10X_NUM_PEERS;
    config.num_peer_keys = TARGET_10X_NUM_PEER_KEYS;
    config.num_tids = TARGET_10X_NUM_TIDS;
    config.ast_skid_limit = TARGET_10X_AST_SKID_LIMIT;
    config.tx_chain_mask = TARGET_10X_TX_CHAIN_MASK;
    config.rx_chain_mask = TARGET_10X_RX_CHAIN_MASK;
    config.rx_timeout_pri_vo = TARGET_10X_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_vi = TARGET_10X_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_be = TARGET_10X_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_bk = TARGET_10X_RX_TIMEOUT_HI_PRI;
    config.rx_decap_mode = ar->wmi.rx_decap_mode;
    config.scan_max_pending_reqs =
        TARGET_10X_SCAN_MAX_PENDING_REQS;

    config.bmiss_offload_max_vdev =
        TARGET_10X_BMISS_OFFLOAD_MAX_VDEV;

    config.roam_offload_max_vdev =
        TARGET_10X_ROAM_OFFLOAD_MAX_VDEV;

    config.roam_offload_max_ap_profiles =
        TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES;

    config.num_mcast_groups = TARGET_10X_NUM_MCAST_GROUPS;
    config.num_mcast_table_elems =
        TARGET_10X_NUM_MCAST_TABLE_ELEMS;

    config.mcast2ucast_mode = TARGET_10X_MCAST2UCAST_MODE;
    config.tx_dbg_log_size = TARGET_10X_TX_DBG_LOG_SIZE;
    config.num_wds_entries = TARGET_10X_NUM_WDS_ENTRIES;
    config.dma_burst_size = TARGET_10X_DMA_BURST_SIZE;
    config.mac_aggr_delim = TARGET_10X_MAC_AGGR_DELIM;

    val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
    config.rx_skip_defrag_timeout_dup_detection_check = val;

    config.vow_config = TARGET_10X_VOW_CONFIG;

    config.num_msdu_desc = TARGET_10X_NUM_MSDU_DESC;
    config.max_frag_entries = TARGET_10X_MAX_FRAG_ENTRIES;

    len = sizeof(*cmd) +
          (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);

    buf = ath10k_wmi_alloc_skb(ar, len);
    if (!buf) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_init_cmd_10x*)buf->data;

    memcpy(&cmd->resource_config, &config, sizeof(config));
    ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
    return buf;
}

static struct sk_buff* ath10k_wmi_10_2_op_gen_init(struct ath10k* ar) {
    struct wmi_init_cmd_10_2* cmd;
    struct sk_buff* buf;
    struct wmi_resource_config_10x config = {};
    uint32_t len, val, features;

    config.num_vdevs = TARGET_10X_NUM_VDEVS;
    config.num_peer_keys = TARGET_10X_NUM_PEER_KEYS;

    if (ath10k_peer_stats_enabled(ar)) {
        config.num_peers = TARGET_10X_TX_STATS_NUM_PEERS;
        config.num_tids = TARGET_10X_TX_STATS_NUM_TIDS;
    } else {
        config.num_peers = TARGET_10X_NUM_PEERS;
        config.num_tids = TARGET_10X_NUM_TIDS;
    }

    config.ast_skid_limit = TARGET_10X_AST_SKID_LIMIT;
    config.tx_chain_mask = TARGET_10X_TX_CHAIN_MASK;
    config.rx_chain_mask = TARGET_10X_RX_CHAIN_MASK;
    config.rx_timeout_pri_vo = TARGET_10X_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_vi = TARGET_10X_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_be = TARGET_10X_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri_bk = TARGET_10X_RX_TIMEOUT_HI_PRI;
    config.rx_decap_mode = ar->wmi.rx_decap_mode;

    config.scan_max_pending_reqs =
        TARGET_10X_SCAN_MAX_PENDING_REQS;

    config.bmiss_offload_max_vdev =
        TARGET_10X_BMISS_OFFLOAD_MAX_VDEV;

    config.roam_offload_max_vdev =
        TARGET_10X_ROAM_OFFLOAD_MAX_VDEV;

    config.roam_offload_max_ap_profiles =
        TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES;

    config.num_mcast_groups = TARGET_10X_NUM_MCAST_GROUPS;
    config.num_mcast_table_elems =
        TARGET_10X_NUM_MCAST_TABLE_ELEMS;

    config.mcast2ucast_mode = TARGET_10X_MCAST2UCAST_MODE;
    config.tx_dbg_log_size = TARGET_10X_TX_DBG_LOG_SIZE;
    config.num_wds_entries = TARGET_10X_NUM_WDS_ENTRIES;
    config.dma_burst_size = TARGET_10_2_DMA_BURST_SIZE;
    config.mac_aggr_delim = TARGET_10X_MAC_AGGR_DELIM;

    val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
    config.rx_skip_defrag_timeout_dup_detection_check = val;

    config.vow_config = TARGET_10X_VOW_CONFIG;

    config.num_msdu_desc = TARGET_10X_NUM_MSDU_DESC;
    config.max_frag_entries = TARGET_10X_MAX_FRAG_ENTRIES;

    len = sizeof(*cmd) +
          (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);

    buf = ath10k_wmi_alloc_skb(ar, len);
    if (!buf) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_init_cmd_10_2*)buf->data;

    features = WMI_10_2_RX_BATCH_MODE;

    if (BITARR_TEST(&ar->dev_flags, ATH10K_FLAG_BTCOEX) &&
        BITARR_TEST(ar->wmi.svc_map, WMI_SERVICE_COEX_GPIO)) {
        features |= WMI_10_2_COEX_GPIO;
    }

    if (ath10k_peer_stats_enabled(ar)) {
        features |= WMI_10_2_PEER_STATS;
    }

    if (BITARR_TEST(ar->wmi.svc_map, WMI_SERVICE_BSS_CHANNEL_INFO_64)) {
        features |= WMI_10_2_BSS_CHAN_INFO;
    }

    cmd->resource_config.feature_mask = features;

    memcpy(&cmd->resource_config.common, &config, sizeof(config));
    ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
    return buf;
}

static struct sk_buff* ath10k_wmi_10_4_op_gen_init(struct ath10k* ar) {
    struct wmi_init_cmd_10_4* cmd;
    struct sk_buff* buf;
    struct wmi_resource_config_10_4 config = {};
    uint32_t len;

    config.num_vdevs = ar->max_num_vdevs;
    config.num_peers = ar->max_num_peers;
    config.num_active_peers = ar->num_active_peers;
    config.num_tids = ar->num_tids;

    config.num_offload_peers = TARGET_10_4_NUM_OFFLOAD_PEERS;
    config.num_offload_reorder_buffs =
        TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS;
    config.num_peer_keys  = TARGET_10_4_NUM_PEER_KEYS;
    config.ast_skid_limit = TARGET_10_4_AST_SKID_LIMIT;
    config.tx_chain_mask  = ar->hw_params.tx_chain_mask;
    config.rx_chain_mask  = ar->hw_params.rx_chain_mask;

    config.rx_timeout_pri[0] = TARGET_10_4_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri[1] = TARGET_10_4_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri[2] = TARGET_10_4_RX_TIMEOUT_LO_PRI;
    config.rx_timeout_pri[3] = TARGET_10_4_RX_TIMEOUT_HI_PRI;

    config.rx_decap_mode        = ar->wmi.rx_decap_mode;
    config.scan_max_pending_req = TARGET_10_4_SCAN_MAX_REQS;
    config.bmiss_offload_max_vdev =
        TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV;
    config.roam_offload_max_vdev  =
        TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV;
    config.roam_offload_max_ap_profiles =
        TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES;
    config.num_mcast_groups = TARGET_10_4_NUM_MCAST_GROUPS;
    config.num_mcast_table_elems =
        TARGET_10_4_NUM_MCAST_TABLE_ELEMS;

    config.mcast2ucast_mode = TARGET_10_4_MCAST2UCAST_MODE;
    config.tx_dbg_log_size  = TARGET_10_4_TX_DBG_LOG_SIZE;
    config.num_wds_entries  = TARGET_10_4_NUM_WDS_ENTRIES;
    config.dma_burst_size   = TARGET_10_4_DMA_BURST_SIZE;
    config.mac_aggr_delim   = TARGET_10_4_MAC_AGGR_DELIM;

    config.rx_skip_defrag_timeout_dup_detection_check =
        TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;

    config.vow_config = TARGET_10_4_VOW_CONFIG;
    config.gtk_offload_max_vdev =
        TARGET_10_4_GTK_OFFLOAD_MAX_VDEV;
    config.num_msdu_desc = ar->htt.max_num_pending_tx;
    config.max_frag_entries = TARGET_10_4_11AC_TX_MAX_FRAGS;
    config.max_peer_ext_stats =
        TARGET_10_4_MAX_PEER_EXT_STATS;
    config.smart_ant_cap = TARGET_10_4_SMART_ANT_CAP;

    config.bk_minfree = TARGET_10_4_BK_MIN_FREE;
    config.be_minfree = TARGET_10_4_BE_MIN_FREE;
    config.vi_minfree = TARGET_10_4_VI_MIN_FREE;
    config.vo_minfree = TARGET_10_4_VO_MIN_FREE;

    config.rx_batchmode = TARGET_10_4_RX_BATCH_MODE;
    config.tt_support =
        TARGET_10_4_THERMAL_THROTTLING_CONFIG;
    config.atf_config = TARGET_10_4_ATF_CONFIG;
    config.iphdr_pad_config = TARGET_10_4_IPHDR_PAD_CONFIG;
    config.qwrap_config = TARGET_10_4_QWRAP_CONFIG;

    len = sizeof(*cmd) +
          (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);

    buf = ath10k_wmi_alloc_skb(ar, len);
    if (!buf) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_init_cmd_10_4*)buf->data;
    memcpy(&cmd->resource_config, &config, sizeof(config));
    ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
    return buf;
}
#endif // NEEDS PORTING

zx_status_t ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg* arg) {
    if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN) {
        return ZX_ERR_INVALID_ARGS;
    }
    if (arg->n_channels > countof(arg->channels)) {
        return ZX_ERR_INVALID_ARGS;
    }
    if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID) {
        return ZX_ERR_INVALID_ARGS;
    }
    if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID) {
        return ZX_ERR_INVALID_ARGS;
    }

    return ZX_OK;
}

#if 0 // NEEDS PORTING
static size_t
ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg* arg) {
    int len = 0;

    if (arg->ie_len) {
        len += sizeof(struct wmi_ie_data);
        len += ROUNDUP(arg->ie_len, 4);
    }

    if (arg->n_channels) {
        len += sizeof(struct wmi_chan_list);
        len += sizeof(uint32_t) * arg->n_channels;
    }

    if (arg->n_ssids) {
        len += sizeof(struct wmi_ssid_list);
        len += sizeof(struct wmi_ssid) * arg->n_ssids;
    }

    if (arg->n_bssids) {
        len += sizeof(struct wmi_bssid_list);
        len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
    }

    return len;
}
#endif // NEEDS PORTING

void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common* cmn,
                                      const struct wmi_start_scan_arg* arg) {
    uint32_t scan_id;
    uint32_t scan_req_id;

    scan_id  = WMI_HOST_SCAN_REQ_ID_PREFIX;
    scan_id |= arg->scan_id;

    scan_req_id  = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
    scan_req_id |= arg->scan_req_id;

    cmn->scan_id            = scan_id;
    cmn->scan_req_id        = scan_req_id;
    cmn->vdev_id            = arg->vdev_id;
    cmn->scan_priority      = arg->scan_priority;
    cmn->notify_scan_events = arg->notify_scan_events;
    cmn->dwell_time_active  = arg->dwell_time_active;
    cmn->dwell_time_passive = arg->dwell_time_passive;
    cmn->min_rest_time      = arg->min_rest_time;
    cmn->max_rest_time      = arg->max_rest_time;
    cmn->repeat_probe_time  = arg->repeat_probe_time;
    cmn->probe_spacing_time = arg->probe_spacing_time;
    cmn->idle_time          = arg->idle_time;
    cmn->max_scan_time      = arg->max_scan_time;
    cmn->probe_delay        = arg->probe_delay;
    cmn->scan_ctrl_flags    = arg->scan_ctrl_flags;
}

#if 0 // NEEDS PORTING
static void
ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs* tlvs,
                               const struct wmi_start_scan_arg* arg) {
    struct wmi_ie_data* ie;
    struct wmi_chan_list* channels;
    struct wmi_ssid_list* ssids;
    struct wmi_bssid_list* bssids;
    void* ptr = tlvs->tlvs;
    int i;

    if (arg->n_channels) {
        channels = ptr;
        channels->tag = WMI_CHAN_LIST_TAG;
        channels->num_chan = arg->n_channels;

        for (i = 0; i < arg->n_channels; i++)
            channels->channel_list[i].freq =
                arg->channels[i];

        ptr += sizeof(*channels);
        ptr += sizeof(uint32_t) * arg->n_channels;
    }

    if (arg->n_ssids) {
        ssids = ptr;
        ssids->tag = WMI_SSID_LIST_TAG;
        ssids->num_ssids = arg->n_ssids;

        for (i = 0; i < arg->n_ssids; i++) {
            ssids->ssids[i].ssid_len =
                arg->ssids[i].len;
            memcpy(&ssids->ssids[i].ssid,
                   arg->ssids[i].ssid,
                   arg->ssids[i].len);
        }

        ptr += sizeof(*ssids);
        ptr += sizeof(struct wmi_ssid) * arg->n_ssids;
    }

    if (arg->n_bssids) {
        bssids = ptr;
        bssids->tag = WMI_BSSID_LIST_TAG;
        bssids->num_bssid = arg->n_bssids;

        for (i = 0; i < arg->n_bssids; i++)
            memcpy(bssids->bssid_list[i].addr, arg->bssids[i].bssid, ETH_ALEN);

        ptr += sizeof(*bssids);
        ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids;
    }

    if (arg->ie_len) {
        ie = ptr;
        ie->tag = WMI_IE_TAG;
        ie->ie_len = arg->ie_len;
        memcpy(ie->ie_data, arg->ie, arg->ie_len);

        ptr += sizeof(*ie);
        ptr += ROUNDUP(arg->ie_len, 4);
    }
}

static struct sk_buff*
ath10k_wmi_op_gen_start_scan(struct ath10k* ar,
                             const struct wmi_start_scan_arg* arg) {
    struct wmi_start_scan_cmd* cmd;
    struct sk_buff* skb;
    size_t len;
    int ret;

    ret = ath10k_wmi_start_scan_verify(arg);
    if (ret) {
        return ERR_PTR(ret);
    }

    len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_start_scan_cmd*)skb->data;

    ath10k_wmi_put_start_scan_common(&cmd->common, arg);
    ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);

    cmd->burst_duration_ms = 0;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
    return skb;
}

static struct sk_buff*
ath10k_wmi_10x_op_gen_start_scan(struct ath10k* ar,
                                 const struct wmi_start_scan_arg* arg) {
    struct wmi_10x_start_scan_cmd* cmd;
    struct sk_buff* skb;
    size_t len;
    int ret;

    ret = ath10k_wmi_start_scan_verify(arg);
    if (ret) {
        return ERR_PTR(ret);
    }

    len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg);
    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_10x_start_scan_cmd*)skb->data;

    ath10k_wmi_put_start_scan_common(&cmd->common, arg);
    ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
    return skb;
}
#endif // NEEDS PORTING

void ath10k_wmi_start_scan_init(struct ath10k* ar,
                                struct wmi_start_scan_arg* arg) {
    /* setup commonly used values */
    arg->scan_req_id = 1;
    arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
    arg->dwell_time_active = 50;
    arg->dwell_time_passive = 150;
    arg->min_rest_time = 50;
    arg->max_rest_time = 500;
    arg->repeat_probe_time = 0;
    arg->probe_spacing_time = 0;
    arg->idle_time = 0;
    arg->max_scan_time = 20000;
    arg->probe_delay = 5;
    arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
                              | WMI_SCAN_EVENT_COMPLETED
                              | WMI_SCAN_EVENT_BSS_CHANNEL
                              | WMI_SCAN_EVENT_FOREIGN_CHANNEL
                              | WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT
                              | WMI_SCAN_EVENT_DEQUEUED;
    arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
    arg->n_bssids = 1;

    static uint8_t wildcard_bssid[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
    arg->bssids[0].bssid = wildcard_bssid;
}

#if 0 // NEEDS PORTING
static struct sk_buff*
ath10k_wmi_op_gen_stop_scan(struct ath10k* ar,
                            const struct wmi_stop_scan_arg* arg) {
    struct wmi_stop_scan_cmd* cmd;
    struct sk_buff* skb;
    uint32_t scan_id;
    uint32_t req_id;

    if (arg->req_id > 0xFFF) {
        return ERR_PTR(-EINVAL);
    }
    if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    scan_id = arg->u.scan_id;
    scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;

    req_id = arg->req_id;
    req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;

    cmd = (struct wmi_stop_scan_cmd*)skb->data;
    cmd->req_type    = arg->req_type;
    cmd->vdev_id     = arg->u.vdev_id;
    cmd->scan_id     = scan_id;
    cmd->scan_req_id = req_id;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
               arg->req_id, arg->req_type, arg->u.scan_id);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_create(struct ath10k* ar, uint32_t vdev_id,
                              enum wmi_vdev_type type,
                              enum wmi_vdev_subtype subtype,
                              const uint8_t macaddr[ETH_ALEN]) {
    struct wmi_vdev_create_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_create_cmd*)skb->data;
    cmd->vdev_id      = vdev_id;
    cmd->vdev_type    = type;
    cmd->vdev_subtype = subtype;
    memcpy(cmd->vdev_macaddr.addr, macaddr, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
               vdev_id, type, subtype, macaddr);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_delete(struct ath10k* ar, uint32_t vdev_id) {
    struct wmi_vdev_delete_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_delete_cmd*)skb->data;
    cmd->vdev_id = vdev_id;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "WMI vdev delete id %d\n", vdev_id);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_start(struct ath10k* ar,
                             const struct wmi_vdev_start_request_arg* arg,
                             bool restart) {
    struct wmi_vdev_start_request_cmd* cmd;
    struct sk_buff* skb;
    const char* cmdname;
    uint32_t flags = 0;

    if (COND_WARN(arg->hidden_ssid && !arg->ssid)) {
        return ERR_PTR(-EINVAL);
    }
    if (COND_WARN(arg->ssid_len > sizeof(cmd->ssid.ssid))) {
        return ERR_PTR(-EINVAL);
    }

    if (restart) {
        cmdname = "restart";
    } else {
        cmdname = "start";
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    if (arg->hidden_ssid) {
        flags |= WMI_VDEV_START_HIDDEN_SSID;
    }
    if (arg->pmf_enabled) {
        flags |= WMI_VDEV_START_PMF_ENABLED;
    }

    cmd = (struct wmi_vdev_start_request_cmd*)skb->data;
    cmd->vdev_id         = arg->vdev_id;
    cmd->disable_hw_ack  = arg->disable_hw_ack;
    cmd->beacon_interval = arg->bcn_intval;
    cmd->dtim_period     = arg->dtim_period;
    cmd->flags           = flags;
    cmd->bcn_tx_rate     = arg->bcn_tx_rate;
    cmd->bcn_tx_power    = arg->bcn_tx_power;

    if (arg->ssid) {
        cmd->ssid.ssid_len = arg->ssid_len;
        memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
    }

    ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
               cmdname, arg->vdev_id,
               flags, arg->channel.freq, arg->channel.mode,
               cmd->chan.flags, arg->channel.max_power);

    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_stop(struct ath10k* ar, uint32_t vdev_id) {
    struct wmi_vdev_stop_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_stop_cmd*)skb->data;
    cmd->vdev_id = vdev_id;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_up(struct ath10k* ar, uint32_t vdev_id, uint32_t aid,
                          const uint8_t* bssid) {
    struct wmi_vdev_up_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_up_cmd*)skb->data;
    cmd->vdev_id       = vdev_id;
    cmd->vdev_assoc_id = aid;
    memcpy(cmd->vdev_bssid.addr, bssid, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
               vdev_id, aid, bssid);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_down(struct ath10k* ar, uint32_t vdev_id) {
    struct wmi_vdev_down_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_down_cmd*)skb->data;
    cmd->vdev_id = vdev_id;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi mgmt vdev down id 0x%x\n", vdev_id);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_set_param(struct ath10k* ar, uint32_t vdev_id,
                                 uint32_t param_id, uint32_t param_value) {
    struct wmi_vdev_set_param_cmd* cmd;
    struct sk_buff* skb;

    if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
        ath10k_dbg(ar, ATH10K_DBG_WMI,
                   "vdev param %d not supported by firmware\n",
                   param_id);
        return ERR_PTR(-EOPNOTSUPP);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_set_param_cmd*)skb->data;
    cmd->vdev_id     = vdev_id;
    cmd->param_id    = param_id;
    cmd->param_value = param_value;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi vdev id 0x%x set param %d value %d\n",
               vdev_id, param_id, param_value);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_install_key(struct ath10k* ar,
                                   const struct wmi_vdev_install_key_arg* arg) {
    struct wmi_vdev_install_key_cmd* cmd;
    struct sk_buff* skb;

    if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL) {
        return ERR_PTR(-EINVAL);
    }
    if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_install_key_cmd*)skb->data;
    cmd->vdev_id       = arg->vdev_id;
    cmd->key_idx       = arg->key_idx;
    cmd->key_flags     = arg->key_flags;
    cmd->key_cipher    = arg->key_cipher;
    cmd->key_len       = arg->key_len;
    cmd->key_txmic_len = arg->key_txmic_len;
    cmd->key_rxmic_len = arg->key_rxmic_len;

    if (arg->macaddr) {
        memcpy(cmd->peer_macaddr.addr, arg->macaddr, ETH_ALEN);
    }
    if (arg->key_data) {
        memcpy(cmd->key_data, arg->key_data, arg->key_len);
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi vdev install key idx %d cipher %d len %d\n",
               arg->key_idx, arg->key_cipher, arg->key_len);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k* ar,
                                     const struct wmi_vdev_spectral_conf_arg* arg) {
    struct wmi_vdev_spectral_conf_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_spectral_conf_cmd*)skb->data;
    cmd->vdev_id = arg->vdev_id;
    cmd->scan_count = arg->scan_count;
    cmd->scan_period = arg->scan_period;
    cmd->scan_priority = arg->scan_priority;
    cmd->scan_fft_size = arg->scan_fft_size;
    cmd->scan_gc_ena = arg->scan_gc_ena;
    cmd->scan_restart_ena = arg->scan_restart_ena;
    cmd->scan_noise_floor_ref = arg->scan_noise_floor_ref;
    cmd->scan_init_delay = arg->scan_init_delay;
    cmd->scan_nb_tone_thr = arg->scan_nb_tone_thr;
    cmd->scan_str_bin_thr = arg->scan_str_bin_thr;
    cmd->scan_wb_rpt_mode = arg->scan_wb_rpt_mode;
    cmd->scan_rssi_rpt_mode = arg->scan_rssi_rpt_mode;
    cmd->scan_rssi_thr = arg->scan_rssi_thr;
    cmd->scan_pwr_format = arg->scan_pwr_format;
    cmd->scan_rpt_mode = arg->scan_rpt_mode;
    cmd->scan_bin_scale = arg->scan_bin_scale;
    cmd->scan_dbm_adj = arg->scan_dbm_adj;
    cmd->scan_chn_mask = arg->scan_chn_mask;

    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k* ar, uint32_t vdev_id,
                                       uint32_t trigger, uint32_t enable) {
    struct wmi_vdev_spectral_enable_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_vdev_spectral_enable_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    cmd->trigger_cmd = trigger;
    cmd->enable_cmd = enable;

    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_peer_create(struct ath10k* ar, uint32_t vdev_id,
                              const uint8_t peer_addr[ETH_ALEN],
                              enum wmi_peer_type peer_type) {
    struct wmi_peer_create_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_peer_create_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer create vdev_id %d peer_addr %pM\n",
               vdev_id, peer_addr);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_peer_delete(struct ath10k* ar, uint32_t vdev_id,
                              const uint8_t peer_addr[ETH_ALEN]) {
    struct wmi_peer_delete_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_peer_delete_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer delete vdev_id %d peer_addr %pM\n",
               vdev_id, peer_addr);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_peer_flush(struct ath10k* ar, uint32_t vdev_id,
                             const uint8_t peer_addr[ETH_ALEN], uint32_t tid_bitmap) {
    struct wmi_peer_flush_tids_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_peer_flush_tids_cmd*)skb->data;
    cmd->vdev_id         = vdev_id;
    cmd->peer_tid_bitmap = tid_bitmap;
    memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
               vdev_id, peer_addr, tid_bitmap);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_peer_set_param(struct ath10k* ar, uint32_t vdev_id,
                                 const uint8_t* peer_addr,
                                 enum wmi_peer_param param_id,
                                 uint32_t param_value) {
    struct wmi_peer_set_param_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_peer_set_param_cmd*)skb->data;
    cmd->vdev_id     = vdev_id;
    cmd->param_id    = param_id;
    cmd->param_value = param_value;
    memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi vdev %d peer 0x%pM set param %d value %d\n",
               vdev_id, peer_addr, param_id, param_value);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_set_psmode(struct ath10k* ar, uint32_t vdev_id,
                             enum wmi_sta_ps_mode psmode) {
    struct wmi_sta_powersave_mode_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_sta_powersave_mode_cmd*)skb->data;
    cmd->vdev_id     = vdev_id;
    cmd->sta_ps_mode = psmode;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi set powersave id 0x%x mode %d\n",
               vdev_id, psmode);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_set_sta_ps(struct ath10k* ar, uint32_t vdev_id,
                             enum wmi_sta_powersave_param param_id,
                             uint32_t value) {
    struct wmi_sta_powersave_param_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_sta_powersave_param_cmd*)skb->data;
    cmd->vdev_id     = vdev_id;
    cmd->param_id    = param_id;
    cmd->param_value = value;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi sta ps param vdev_id 0x%x param %d value %d\n",
               vdev_id, param_id, value);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_set_ap_ps(struct ath10k* ar, uint32_t vdev_id, const uint8_t* mac,
                            enum wmi_ap_ps_peer_param param_id, uint32_t value) {
    struct wmi_ap_ps_peer_cmd* cmd;
    struct sk_buff* skb;

    if (!mac) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_ap_ps_peer_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    cmd->param_id = param_id;
    cmd->param_value = value;
    memcpy(cmd->peer_macaddr.addr, mac, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
               vdev_id, param_id, value, mac);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_scan_chan_list(struct ath10k* ar,
                                 const struct wmi_scan_chan_list_arg* arg) {
    struct wmi_scan_chan_list_cmd* cmd;
    struct sk_buff* skb;
    struct wmi_channel_arg* ch;
    struct wmi_channel* ci;
    int len;
    int i;

    len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);

    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-EINVAL);
    }

    cmd = (struct wmi_scan_chan_list_cmd*)skb->data;
    cmd->num_scan_chans = arg->n_channels;

    for (i = 0; i < arg->n_channels; i++) {
        ch = &arg->channels[i];
        ci = &cmd->chan_info[i];

        ath10k_wmi_put_wmi_channel(ci, ch);
    }

    return skb;
}

static void
ath10k_wmi_peer_assoc_fill(struct ath10k* ar, void* buf,
                           const struct wmi_peer_assoc_complete_arg* arg) {
    struct wmi_common_peer_assoc_complete_cmd* cmd = buf;

    cmd->vdev_id            = arg->vdev_id;
    cmd->peer_new_assoc     = arg->peer_reassoc ? 0 : 1;
    cmd->peer_associd       = arg->peer_aid;
    cmd->peer_flags         = arg->peer_flags;
    cmd->peer_caps          = arg->peer_caps;
    cmd->peer_listen_intval = arg->peer_listen_intval;
    cmd->peer_ht_caps       = arg->peer_ht_caps;
    cmd->peer_max_mpdu      = arg->peer_max_mpdu;
    cmd->peer_mpdu_density  = arg->peer_mpdu_density;
    cmd->peer_rate_caps     = arg->peer_rate_caps;
    cmd->peer_nss           = arg->peer_num_spatial_streams;
    cmd->peer_vht_caps      = arg->peer_vht_caps;
    cmd->peer_phymode       = arg->peer_phymode;

    memcpy(cmd->peer_macaddr.addr, arg->addr, ETH_ALEN);

    cmd->peer_legacy_rates.num_rates =
        arg->peer_legacy_rates.num_rates;
    memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
           arg->peer_legacy_rates.num_rates);

    cmd->peer_ht_rates.num_rates =
        arg->peer_ht_rates.num_rates;
    memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
           arg->peer_ht_rates.num_rates);

    cmd->peer_vht_rates.rx_max_rate =
        arg->peer_vht_rates.rx_max_rate;
    cmd->peer_vht_rates.rx_mcs_set =
        arg->peer_vht_rates.rx_mcs_set;
    cmd->peer_vht_rates.tx_max_rate =
        arg->peer_vht_rates.tx_max_rate;
    cmd->peer_vht_rates.tx_mcs_set =
        arg->peer_vht_rates.tx_mcs_set;
}

static void
ath10k_wmi_peer_assoc_fill_main(struct ath10k* ar, void* buf,
                                const struct wmi_peer_assoc_complete_arg* arg) {
    struct wmi_main_peer_assoc_complete_cmd* cmd = buf;

    ath10k_wmi_peer_assoc_fill(ar, buf, arg);
    memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info));
}

static void
ath10k_wmi_peer_assoc_fill_10_1(struct ath10k* ar, void* buf,
                                const struct wmi_peer_assoc_complete_arg* arg) {
    ath10k_wmi_peer_assoc_fill(ar, buf, arg);
}

static void
ath10k_wmi_peer_assoc_fill_10_2(struct ath10k* ar, void* buf,
                                const struct wmi_peer_assoc_complete_arg* arg) {
    struct wmi_10_2_peer_assoc_complete_cmd* cmd = buf;
    int max_mcs, max_nss;
    uint32_t info0;

    /* TODO: Is using max values okay with firmware? */
    max_mcs = 0xf;
    max_nss = 0xf;

    info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) |
            SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS);

    ath10k_wmi_peer_assoc_fill(ar, buf, arg);
    cmd->info0 = info0;
}

static void
ath10k_wmi_peer_assoc_fill_10_4(struct ath10k* ar, void* buf,
                                const struct wmi_peer_assoc_complete_arg* arg) {
    struct wmi_10_4_peer_assoc_complete_cmd* cmd = buf;

    ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
    if (arg->peer_bw_rxnss_override)
        cmd->peer_bw_rxnss_override =
            (arg->peer_bw_rxnss_override - 1 |
                          BIT(PEER_BW_RXNSS_OVERRIDE_OFFSET));
    else {
        cmd->peer_bw_rxnss_override = 0;
    }
}

static int
ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg* arg) {
    if (arg->peer_mpdu_density > 16) {
        return -EINVAL;
    }
    if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES) {
        return -EINVAL;
    }
    if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES) {
        return -EINVAL;
    }

    return 0;
}

static struct sk_buff*
ath10k_wmi_op_gen_peer_assoc(struct ath10k* ar,
                             const struct wmi_peer_assoc_complete_arg* arg) {
    size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd);
    struct sk_buff* skb;
    int ret;

    ret = ath10k_wmi_peer_assoc_check_arg(arg);
    if (ret) {
        return ERR_PTR(ret);
    }

    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer assoc vdev %d addr %pM (%s)\n",
               arg->vdev_id, arg->addr,
               arg->peer_reassoc ? "reassociate" : "new");
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k* ar,
                                  const struct wmi_peer_assoc_complete_arg* arg) {
    size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd);
    struct sk_buff* skb;
    int ret;

    ret = ath10k_wmi_peer_assoc_check_arg(arg);
    if (ret) {
        return ERR_PTR(ret);
    }

    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer assoc vdev %d addr %pM (%s)\n",
               arg->vdev_id, arg->addr,
               arg->peer_reassoc ? "reassociate" : "new");
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k* ar,
                                  const struct wmi_peer_assoc_complete_arg* arg) {
    size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd);
    struct sk_buff* skb;
    int ret;

    ret = ath10k_wmi_peer_assoc_check_arg(arg);
    if (ret) {
        return ERR_PTR(ret);
    }

    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer assoc vdev %d addr %pM (%s)\n",
               arg->vdev_id, arg->addr,
               arg->peer_reassoc ? "reassociate" : "new");
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k* ar,
                                  const struct wmi_peer_assoc_complete_arg* arg) {
    size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd);
    struct sk_buff* skb;
    int ret;

    ret = ath10k_wmi_peer_assoc_check_arg(arg);
    if (ret) {
        return ERR_PTR(ret);
    }

    skb = ath10k_wmi_alloc_skb(ar, len);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi peer assoc vdev %d addr %pM (%s)\n",
               arg->vdev_id, arg->addr,
               arg->peer_reassoc ? "reassociate" : "new");
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k* ar) {
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, 0);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k* ar,
        enum wmi_bss_survey_req_type type) {
    struct wmi_pdev_chan_info_req_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_chan_info_req_cmd*)skb->data;
    cmd->type = type;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi pdev bss info request type %d\n", type);

    return skb;
}

/* This function assumes the beacon is already DMA mapped */
static struct sk_buff*
ath10k_wmi_op_gen_beacon_dma(struct ath10k* ar, uint32_t vdev_id, const void* bcn,
                             size_t bcn_len, uint32_t bcn_paddr, bool dtim_zero,
                             bool deliver_cab) {
    struct wmi_bcn_tx_ref_cmd* cmd;
    struct sk_buff* skb;
    struct ieee80211_hdr* hdr;
    uint16_t fc;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    hdr = (struct ieee80211_hdr*)bcn;
    fc = hdr->frame_control;

    cmd = (struct wmi_bcn_tx_ref_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    cmd->data_len = bcn_len;
    cmd->data_ptr = bcn_paddr;
    cmd->msdu_id = 0;
    cmd->frame_control = fc;
    cmd->flags = 0;
    cmd->antenna_mask = WMI_BCN_TX_REF_DEF_ANTENNA;

    if (dtim_zero) {
        cmd->flags |= WMI_BCN_TX_REF_FLAG_DTIM_ZERO;
    }

    if (deliver_cab) {
        cmd->flags |= WMI_BCN_TX_REF_FLAG_DELIVER_CAB;
    }

    return skb;
}
#endif // NEEDS PORTING

void ath10k_wmi_set_wmm_param(struct wmi_wmm_params* params,
                              const struct wmi_wmm_params_arg* arg) {
    params->cwmin  = arg->cwmin;
    params->cwmax  = arg->cwmax;
    params->aifs   = arg->aifs;
    params->txop   = arg->txop;
    params->acm    = arg->acm;
    params->no_ack = arg->no_ack;
}

#if 0 // NEEDS PORTING
static struct sk_buff*
ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k* ar,
                               const struct wmi_wmm_params_all_arg* arg) {
    struct wmi_pdev_set_wmm_params* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_set_wmm_params*)skb->data;
    ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
    ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
    ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
    ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_request_stats(struct ath10k* ar, uint32_t stats_mask) {
    struct wmi_request_stats_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_request_stats_cmd*)skb->data;
    cmd->stats_id = stats_mask;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
               stats_mask);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_force_fw_hang(struct ath10k* ar,
                                enum wmi_force_fw_hang_type type, uint32_t delay_ms) {
    struct wmi_force_fw_hang_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_force_fw_hang_cmd*)skb->data;
    cmd->type = type;
    cmd->delay_ms = delay_ms;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
               type, delay_ms);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_dbglog_cfg(struct ath10k* ar, uint64_t module_enable,
                             uint32_t log_level) {
    struct wmi_dbglog_cfg_cmd* cmd;
    struct sk_buff* skb;
    uint32_t cfg;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_dbglog_cfg_cmd*)skb->data;

    if (module_enable) {
        cfg = SM(log_level,
                 ATH10K_DBGLOG_CFG_LOG_LVL);
    } else {
        /* set back defaults, all modules with WARN level */
        cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
                 ATH10K_DBGLOG_CFG_LOG_LVL);
        module_enable = ~0;
    }

    cmd->module_enable = module_enable;
    cmd->module_valid = ~0;
    cmd->config_enable = cfg;
    cmd->config_valid = ATH10K_DBGLOG_CFG_LOG_LVL_MASK;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
               cmd->module_enable,
               cmd->module_valid,
               cmd->config_enable,
               cmd->config_valid);
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k* ar, uint64_t module_enable,
                                  uint32_t log_level) {
    struct wmi_10_4_dbglog_cfg_cmd* cmd;
    struct sk_buff* skb;
    uint32_t cfg;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_10_4_dbglog_cfg_cmd*)skb->data;

    if (module_enable) {
        cfg = SM(log_level,
                 ATH10K_DBGLOG_CFG_LOG_LVL);
    } else {
        /* set back defaults, all modules with WARN level */
        cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
                 ATH10K_DBGLOG_CFG_LOG_LVL);
        module_enable = ~0;
    }

    cmd->module_enable = module_enable;
    cmd->module_valid = ~0;
    cmd->config_enable = cfg;
    cmd->config_valid = ATH10K_DBGLOG_CFG_LOG_LVL_MASK;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi dbglog cfg modules 0x%016llx 0x%016llx config %08x %08x\n",
               cmd->module_enable,
               cmd->module_valid,
               cmd->config_enable,
               cmd->config_valid);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_pktlog_enable(struct ath10k* ar, uint32_t ev_bitmap) {
    struct wmi_pdev_pktlog_enable_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ev_bitmap &= ATH10K_PKTLOG_ANY;

    cmd = (struct wmi_pdev_pktlog_enable_cmd*)skb->data;
    cmd->ev_bitmap = ev_bitmap;

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
               ev_bitmap);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_pktlog_disable(struct ath10k* ar) {
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, 0);
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k* ar, uint32_t period,
                                      uint32_t duration, uint32_t next_offset,
                                      uint32_t enabled) {
    struct wmi_pdev_set_quiet_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_set_quiet_cmd*)skb->data;
    cmd->period = period;
    cmd->duration = duration;
    cmd->next_start = next_offset;
    cmd->enabled = enabled;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi quiet param: period %u duration %u enabled %d\n",
               period, duration, enabled);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_addba_clear_resp(struct ath10k* ar, uint32_t vdev_id,
                                   const uint8_t* mac) {
    struct wmi_addba_clear_resp_cmd* cmd;
    struct sk_buff* skb;

    if (!mac) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_addba_clear_resp_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    memcpy(cmd->peer_macaddr.addr, mac, ETH_ALEN);

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n",
               vdev_id, mac);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_addba_send(struct ath10k* ar, uint32_t vdev_id, const uint8_t* mac,
                             uint32_t tid, uint32_t buf_size) {
    struct wmi_addba_send_cmd* cmd;
    struct sk_buff* skb;

    if (!mac) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_addba_send_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    memcpy(cmd->peer_macaddr.addr, mac, ETH_ALEN);
    cmd->tid = tid;
    cmd->buffersize = buf_size;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n",
               vdev_id, mac, tid, buf_size);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_addba_set_resp(struct ath10k* ar, uint32_t vdev_id, const uint8_t* mac,
                                 uint32_t tid, uint32_t status) {
    struct wmi_addba_setresponse_cmd* cmd;
    struct sk_buff* skb;

    if (!mac) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_addba_setresponse_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    memcpy(cmd->peer_macaddr.addr, mac, ETH_ALEN);
    cmd->tid = tid;
    cmd->statuscode = status;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n",
               vdev_id, mac, tid, status);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_delba_send(struct ath10k* ar, uint32_t vdev_id, const uint8_t* mac,
                             uint32_t tid, uint32_t initiator, uint32_t reason) {
    struct wmi_delba_send_cmd* cmd;
    struct sk_buff* skb;

    if (!mac) {
        return ERR_PTR(-EINVAL);
    }

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_delba_send_cmd*)skb->data;
    cmd->vdev_id = vdev_id;
    memcpy(cmd->peer_macaddr.addr, mac, ETH_ALEN);
    cmd->tid = tid;
    cmd->initiator = initiator;
    cmd->reasoncode = reason;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n",
               vdev_id, mac, tid, initiator, reason);
    return skb;
}

static struct sk_buff*
ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k* ar, uint32_t param) {
    struct wmi_pdev_get_tpc_config_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_get_tpc_config_cmd*)skb->data;
    cmd->param = param;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi pdev get tcp config param:%d\n", param);
    return skb;
}

size_t ath10k_wmi_fw_stats_num_peers(struct list_head* head) {
    struct ath10k_fw_stats_peer* i;
    size_t num = 0;

    list_for_each_entry(i, head, list)
    ++num;

    return num;
}

size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head* head) {
    struct ath10k_fw_stats_vdev* i;
    size_t num = 0;

    list_for_each_entry(i, head, list)
    ++num;

    return num;
}

static void
ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev* pdev,
                                   char* buf, uint32_t* length) {
    uint32_t len = *length;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n",
                         "ath10k PDEV stats");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Channel noise floor", pdev->ch_noise_floor);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "Channel TX power", pdev->chan_tx_power);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "TX frame count", pdev->tx_frame_count);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "RX frame count", pdev->rx_frame_count);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "RX clear count", pdev->rx_clear_count);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "Cycle count", pdev->cycle_count);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "PHY error count", pdev->phy_err_count);

    *length = len;
}

static void
ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev* pdev,
                                    char* buf, uint32_t* length) {
    uint32_t len = *length;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "RTS bad count", pdev->rts_bad);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "RTS good count", pdev->rts_good);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "FCS bad count", pdev->fcs_bad);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "No beacon count", pdev->no_beacons);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10u\n",
                         "MIB int count", pdev->mib_int_count);

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    *length = len;
}

static void
ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev* pdev,
                                 char* buf, uint32_t* length) {
    uint32_t len = *length;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n%30s\n",
                         "ath10k PDEV TX stats");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "HTT cookies queued", pdev->comp_queued);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "HTT cookies disp.", pdev->comp_delivered);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MSDU queued", pdev->msdu_enqued);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDU queued", pdev->mpdu_enqued);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MSDUs dropped", pdev->wmm_drop);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Local enqued", pdev->local_enqued);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Local freed", pdev->local_freed);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "HW queued", pdev->hw_queued);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "PPDUs reaped", pdev->hw_reaped);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Num underruns", pdev->underrun);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "PPDUs cleaned", pdev->tx_abort);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs requed", pdev->mpdus_requed);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Excessive retries", pdev->tx_ko);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "HW rate", pdev->data_rc);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Sched self tiggers", pdev->self_triggers);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Dropped due to SW retries",
                         pdev->sw_retry_failure);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Illegal rate phy errors",
                         pdev->illgl_rate_phy_err);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Pdev continuous xretry", pdev->pdev_cont_xretry);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "TX timeout", pdev->pdev_tx_timeout);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "PDEV resets", pdev->pdev_resets);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "PHY underrun", pdev->phy_underrun);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDU is more than txop limit", pdev->txop_ovf);
    *length = len;
}

static void
ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev* pdev,
                                 char* buf, uint32_t* length) {
    uint32_t len = *length;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n%30s\n",
                         "ath10k PDEV RX stats");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Mid PPDU route change",
                         pdev->mid_ppdu_route_change);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Tot. number of statuses", pdev->status_rcvd);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Extra frags on rings 0", pdev->r0_frags);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Extra frags on rings 1", pdev->r1_frags);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Extra frags on rings 2", pdev->r2_frags);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Extra frags on rings 3", pdev->r3_frags);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MSDUs delivered to HTT", pdev->htt_msdus);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs delivered to HTT", pdev->htt_mpdus);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MSDUs delivered to stack", pdev->loc_msdus);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs delivered to stack", pdev->loc_mpdus);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Oversized AMSUs", pdev->oversize_amsdu);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "PHY errors", pdev->phy_errs);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "PHY errors drops", pdev->phy_err_drop);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs);
    *length = len;
}

static void
ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev* vdev,
                              char* buf, uint32_t* length) {
    uint32_t len = *length;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;
    int i;

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "vdev id", vdev->vdev_id);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "beacon snr", vdev->beacon_snr);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "data snr", vdev->data_snr);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "num rx frames", vdev->num_rx_frames);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "num rts fail", vdev->num_rts_fail);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "num rts success", vdev->num_rts_success);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "num rx err", vdev->num_rx_err);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "num rx discard", vdev->num_rx_discard);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "num tx not acked", vdev->num_tx_not_acked);

    for (i = 0 ; i < countof(vdev->num_tx_frames); i++)
        len += SNPRINTF_USED(buf + len, buf_len - len,
                             "%25s [%02d] %u\n",
                             "num tx frames", i,
                             vdev->num_tx_frames[i]);

    for (i = 0 ; i < countof(vdev->num_tx_frames_retries); i++)
        len += SNPRINTF_USED(buf + len, buf_len - len,
                             "%25s [%02d] %u\n",
                             "num tx frames retries", i,
                             vdev->num_tx_frames_retries[i]);

    for (i = 0 ; i < countof(vdev->num_tx_frames_failures); i++)
        len += SNPRINTF_USED(buf + len, buf_len - len,
                             "%25s [%02d] %u\n",
                             "num tx frames failures", i,
                             vdev->num_tx_frames_failures[i]);

    for (i = 0 ; i < countof(vdev->tx_rate_history); i++)
        len += SNPRINTF_USED(buf + len, buf_len - len,
                             "%25s [%02d] 0x%08x\n",
                             "tx rate history", i,
                             vdev->tx_rate_history[i]);

    for (i = 0 ; i < countof(vdev->beacon_rssi_history); i++)
        len += SNPRINTF_USED(buf + len, buf_len - len,
                             "%25s [%02d] %u\n",
                             "beacon rssi history", i,
                             vdev->beacon_rssi_history[i]);

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    *length = len;
}

static void
ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer* peer,
                              char* buf, uint32_t* length) {
    uint32_t len = *length;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %pM\n",
                         "Peer MAC address", peer->peer_macaddr);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "Peer RSSI", peer->peer_rssi);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "Peer TX rate", peer->peer_tx_rate);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "Peer RX rate", peer->peer_rx_rate);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %u\n",
                         "Peer RX duration", peer->rx_duration);

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    *length = len;
}

void ath10k_wmi_main_op_fw_stats_fill(struct ath10k* ar,
                                      struct ath10k_fw_stats* fw_stats,
                                      char* buf) {
    uint32_t len = 0;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;
    const struct ath10k_fw_stats_pdev* pdev;
    const struct ath10k_fw_stats_vdev* vdev;
    const struct ath10k_fw_stats_peer* peer;
    size_t num_peers;
    size_t num_vdevs;

    mtx_lock(&ar->data_lock);

    pdev = list_first_entry_or_null(&fw_stats->pdevs,
                                    struct ath10k_fw_stats_pdev, list);
    if (!pdev) {
        ath10k_warn("failed to get pdev stats\n");
        goto unlock;
    }

    num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
    num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);

    ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s (%zu)\n",
                         "ath10k VDEV stats", num_vdevs);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    list_for_each_entry(vdev, &fw_stats->vdevs, list) {
        ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
    }

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s (%zu)\n",
                         "ath10k PEER stats", num_peers);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    list_for_each_entry(peer, &fw_stats->peers, list) {
        ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
    }

unlock:
    mtx_unlock(&ar->data_lock);

    if (len >= buf_len) {
        buf[len - 1] = 0;
    } else {
        buf[len] = 0;
    }
}

void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k* ar,
                                     struct ath10k_fw_stats* fw_stats,
                                     char* buf) {
    unsigned int len = 0;
    unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
    const struct ath10k_fw_stats_pdev* pdev;
    const struct ath10k_fw_stats_vdev* vdev;
    const struct ath10k_fw_stats_peer* peer;
    size_t num_peers;
    size_t num_vdevs;

    mtx_lock(&ar->data_lock);

    pdev = list_first_entry_or_null(&fw_stats->pdevs,
                                    struct ath10k_fw_stats_pdev, list);
    if (!pdev) {
        ath10k_warn("failed to get pdev stats\n");
        goto unlock;
    }

    num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
    num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);

    ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s (%zu)\n",
                         "ath10k VDEV stats", num_vdevs);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    list_for_each_entry(vdev, &fw_stats->vdevs, list) {
        ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
    }

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s (%zu)\n",
                         "ath10k PEER stats", num_peers);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    list_for_each_entry(peer, &fw_stats->peers, list) {
        ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
    }

unlock:
    mtx_unlock(&ar->data_lock);

    if (len >= buf_len) {
        buf[len - 1] = 0;
    } else {
        buf[len] = 0;
    }
}

static struct sk_buff*
ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k* ar, uint8_t enable,
        uint32_t detect_level, uint32_t detect_margin) {
    struct wmi_pdev_set_adaptive_cca_params* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_pdev_set_adaptive_cca_params*)skb->data;
    cmd->enable = enable;
    cmd->cca_detect_level = detect_level;
    cmd->cca_detect_margin = detect_margin;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
               enable, detect_level, detect_margin);
    return skb;
}

void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k* ar,
                                      struct ath10k_fw_stats* fw_stats,
                                      char* buf) {
    uint32_t len = 0;
    uint32_t buf_len = ATH10K_FW_STATS_BUF_SIZE;
    const struct ath10k_fw_stats_pdev* pdev;
    const struct ath10k_fw_stats_vdev* vdev;
    const struct ath10k_fw_stats_peer* peer;
    size_t num_peers;
    size_t num_vdevs;

    mtx_lock(&ar->data_lock);

    pdev = list_first_entry_or_null(&fw_stats->pdevs,
                                    struct ath10k_fw_stats_pdev, list);
    if (!pdev) {
        ath10k_warn("failed to get pdev stats\n");
        goto unlock;
    }

    num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers);
    num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs);

    ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len);
    ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len);

    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "HW paused", pdev->hw_paused);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Seqs posted", pdev->seq_posted);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Seqs failed queueing", pdev->seq_failed_queueing);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Seqs completed", pdev->seq_completed);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Seqs restarted", pdev->seq_restarted);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MU Seqs posted", pdev->mu_seq_posted);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs SW flushed", pdev->mpdus_sw_flush);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs HW filtered", pdev->mpdus_hw_filter);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs truncated", pdev->mpdus_truncated);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs receive no ACK", pdev->mpdus_ack_failed);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "MPDUs expired", pdev->mpdus_expired);

    ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s %10d\n",
                         "Num Rx Overflow errors", pdev->rx_ovfl_errs);

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s (%zu)\n",
                         "ath10k VDEV stats", num_vdevs);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    list_for_each_entry(vdev, &fw_stats->vdevs, list) {
        ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len);
    }

    len += SNPRINTF_USED(buf + len, buf_len - len, "\n");
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s (%zu)\n",
                         "ath10k PEER stats", num_peers);
    len += SNPRINTF_USED(buf + len, buf_len - len, "%30s\n\n",
                         "=================");

    list_for_each_entry(peer, &fw_stats->peers, list) {
        ath10k_wmi_fw_peer_stats_fill(peer, buf, &len);
    }

unlock:
    mtx_unlock(&ar->data_lock);

    if (len >= buf_len) {
        buf[len - 1] = 0;
    } else {
        buf[len] = 0;
    }
}
#endif // NEEDS PORTING

int ath10k_wmi_op_get_vdev_subtype(struct ath10k* ar,
                                   enum wmi_vdev_subtype subtype) {
    switch (subtype) {
    case WMI_VDEV_SUBTYPE_NONE:
        return WMI_VDEV_SUBTYPE_LEGACY_NONE;
    case WMI_VDEV_SUBTYPE_P2P_DEVICE:
        return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV;
    case WMI_VDEV_SUBTYPE_P2P_CLIENT:
        return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI;
    case WMI_VDEV_SUBTYPE_P2P_GO:
        return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO;
    case WMI_VDEV_SUBTYPE_PROXY_STA:
        return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA;
    case WMI_VDEV_SUBTYPE_MESH_11S:
    case WMI_VDEV_SUBTYPE_MESH_NON_11S:
        return ZX_ERR_NOT_SUPPORTED;
    }
    return ZX_ERR_NOT_SUPPORTED;
}

#if 0 // NEEDS PORTING
static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k* ar,
        enum wmi_vdev_subtype subtype) {
    switch (subtype) {
    case WMI_VDEV_SUBTYPE_NONE:
        return WMI_VDEV_SUBTYPE_10_2_4_NONE;
    case WMI_VDEV_SUBTYPE_P2P_DEVICE:
        return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV;
    case WMI_VDEV_SUBTYPE_P2P_CLIENT:
        return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI;
    case WMI_VDEV_SUBTYPE_P2P_GO:
        return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO;
    case WMI_VDEV_SUBTYPE_PROXY_STA:
        return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA;
    case WMI_VDEV_SUBTYPE_MESH_11S:
        return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S;
    case WMI_VDEV_SUBTYPE_MESH_NON_11S:
        return -ENOTSUPP;
    }
    return -ENOTSUPP;
}

static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k* ar,
        enum wmi_vdev_subtype subtype) {
    switch (subtype) {
    case WMI_VDEV_SUBTYPE_NONE:
        return WMI_VDEV_SUBTYPE_10_4_NONE;
    case WMI_VDEV_SUBTYPE_P2P_DEVICE:
        return WMI_VDEV_SUBTYPE_10_4_P2P_DEV;
    case WMI_VDEV_SUBTYPE_P2P_CLIENT:
        return WMI_VDEV_SUBTYPE_10_4_P2P_CLI;
    case WMI_VDEV_SUBTYPE_P2P_GO:
        return WMI_VDEV_SUBTYPE_10_4_P2P_GO;
    case WMI_VDEV_SUBTYPE_PROXY_STA:
        return WMI_VDEV_SUBTYPE_10_4_PROXY_STA;
    case WMI_VDEV_SUBTYPE_MESH_11S:
        return WMI_VDEV_SUBTYPE_10_4_MESH_11S;
    case WMI_VDEV_SUBTYPE_MESH_NON_11S:
        return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S;
    }
    return -ENOTSUPP;
}

static struct sk_buff*
ath10k_wmi_10_4_ext_resource_config(struct ath10k* ar,
                                    enum wmi_host_platform_type type,
                                    uint32_t fw_feature_bitmap) {
    struct wmi_ext_resource_config_10_4_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_ext_resource_config_10_4_cmd*)skb->data;
    cmd->host_platform_config = type;
    cmd->fw_feature_bitmap = fw_feature_bitmap;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi ext resource config host type %d firmware feature bitmap %08x\n",
               type, fw_feature_bitmap);
    return skb;
}

static struct sk_buff*
ath10k_wmi_op_gen_echo(struct ath10k* ar, uint32_t value) {
    struct wmi_echo_cmd* cmd;
    struct sk_buff* skb;

    skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
    if (!skb) {
        return ERR_PTR(-ENOMEM);
    }

    cmd = (struct wmi_echo_cmd*)skb->data;
    cmd->value = value;

    ath10k_dbg(ar, ATH10K_DBG_WMI,
               "wmi echo value 0x%08x\n", value);
    return skb;
}
#endif // NEEDS PORTING

zx_status_t
ath10k_wmi_barrier(struct ath10k* ar) {
    zx_status_t ret;

    mtx_lock(&ar->data_lock);
    completion_reset(&ar->wmi.barrier);
    mtx_unlock(&ar->data_lock);

    ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID);
    if (ret != ZX_OK) {
        ath10k_warn("failed to submit wmi echo: %d\n", ret);
        return ret;
    }

    if (completion_wait(&ar->wmi.barrier, ATH10K_WMI_BARRIER_TIMEOUT) == ZX_ERR_TIMED_OUT) {
        return ZX_ERR_TIMED_OUT;
    }

    return ZX_OK;
}

static const struct wmi_ops wmi_ops = {
    .rx = ath10k_wmi_op_rx,
#if 0 // NEEDS PORTING
    .map_svc = wmi_main_svc_map,

    .pull_scan = ath10k_wmi_op_pull_scan_ev,
    .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
    .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
    .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
    .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
    .pull_swba = ath10k_wmi_op_pull_swba_ev,
    .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
    .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
    .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
    .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
    .pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats,
    .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
    .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,

    .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
    .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
    .gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd,
    .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
    .gen_init = ath10k_wmi_op_gen_init,
    .gen_start_scan = ath10k_wmi_op_gen_start_scan,
    .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
    .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
    .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
    .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
    .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
    .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
    .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
    .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
    .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
    .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
    .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
    /* .gen_vdev_wmm_conf not implemented */
    .gen_peer_create = ath10k_wmi_op_gen_peer_create,
    .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
    .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
    .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
    .gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc,
    .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
    .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
    .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
    .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
    .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
    .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
    .gen_request_stats = ath10k_wmi_op_gen_request_stats,
    .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
    .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
    .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
    .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
    .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
    .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
    /* .gen_pdev_get_temperature not implemented */
    .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
    .gen_addba_send = ath10k_wmi_op_gen_addba_send,
    .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
    .gen_delba_send = ath10k_wmi_op_gen_delba_send,
    .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
    .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
    .gen_echo = ath10k_wmi_op_gen_echo,
#endif // NEEDS PORTING
    /* .gen_bcn_tmpl not implemented */
    /* .gen_prb_tmpl not implemented */
    /* .gen_p2p_go_bcn_ie not implemented */
    /* .gen_adaptive_qcs not implemented */
    /* .gen_pdev_enable_adaptive_cca not implemented */
};

static const struct wmi_ops wmi_10_1_ops = {
#if 0 // NEEDS PORTING
    .rx = ath10k_wmi_10_1_op_rx,
    .map_svc = wmi_10x_svc_map,
    .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
    .pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats,
    .gen_init = ath10k_wmi_10_1_op_gen_init,
    .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
    .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
    .gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc,
    /* .gen_pdev_get_temperature not implemented */

    /* shared with main branch */
    .pull_scan = ath10k_wmi_op_pull_scan_ev,
    .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
    .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
    .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
    .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
    .pull_swba = ath10k_wmi_op_pull_swba_ev,
    .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
    .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
    .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
    .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
    .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,

    .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
    .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
    .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
    .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
    .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
    .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
    .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
    .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
    .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
    .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
    .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
    .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
    .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
    .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
    /* .gen_vdev_wmm_conf not implemented */
    .gen_peer_create = ath10k_wmi_op_gen_peer_create,
    .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
    .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
    .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
    .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
    .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
    .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
    .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
    .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
    .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
    .gen_request_stats = ath10k_wmi_op_gen_request_stats,
    .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
    .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
    .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
    .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
    .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
    .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
    .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
    .gen_addba_send = ath10k_wmi_op_gen_addba_send,
    .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
    .gen_delba_send = ath10k_wmi_op_gen_delba_send,
    .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
    .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
    .gen_echo = ath10k_wmi_op_gen_echo,
#endif // NEEDS PORTING
    /* .gen_bcn_tmpl not implemented */
    /* .gen_prb_tmpl not implemented */
    /* .gen_p2p_go_bcn_ie not implemented */
    /* .gen_adaptive_qcs not implemented */
    /* .gen_pdev_enable_adaptive_cca not implemented */
};

static const struct wmi_ops wmi_10_2_ops = {
#if 0 // NEEDS PORTING
    .rx = ath10k_wmi_10_2_op_rx,
    .pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats,
    .gen_init = ath10k_wmi_10_2_op_gen_init,
    .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
    /* .gen_pdev_get_temperature not implemented */

    /* shared with 10.1 */
    .map_svc = wmi_10x_svc_map,
    .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
    .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
    .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
    .gen_echo = ath10k_wmi_op_gen_echo,

    .pull_scan = ath10k_wmi_op_pull_scan_ev,
    .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
    .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
    .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
    .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
    .pull_swba = ath10k_wmi_op_pull_swba_ev,
    .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
    .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
    .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
    .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
    .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,

    .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
    .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
    .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
    .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
    .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
    .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
    .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
    .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
    .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
    .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
    .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
    .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
    .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
    .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
    /* .gen_vdev_wmm_conf not implemented */
    .gen_peer_create = ath10k_wmi_op_gen_peer_create,
    .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
    .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
    .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
    .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
    .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
    .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
    .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
    .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
    .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
    .gen_request_stats = ath10k_wmi_op_gen_request_stats,
    .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
    .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
    .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
    .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
    .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
    .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
    .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
    .gen_addba_send = ath10k_wmi_op_gen_addba_send,
    .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
    .gen_delba_send = ath10k_wmi_op_gen_delba_send,
    .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
    .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
#endif // NEEDS PORTING
    /* .gen_pdev_enable_adaptive_cca not implemented */
};

static const struct wmi_ops wmi_10_2_4_ops = {
#if 0 // NEEDS PORTING
    .rx = ath10k_wmi_10_2_op_rx,
    .pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats,
    .gen_init = ath10k_wmi_10_2_op_gen_init,
    .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc,
    .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
    .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,

    /* shared with 10.1 */
    .map_svc = wmi_10x_svc_map,
    .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev,
    .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
    .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan,
    .gen_echo = ath10k_wmi_op_gen_echo,

    .pull_scan = ath10k_wmi_op_pull_scan_ev,
    .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev,
    .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
    .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
    .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
    .pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev,
    .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
    .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
    .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
    .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
    .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,

    .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
    .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
    .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
    .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
    .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
    .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
    .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
    .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
    .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
    .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
    .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
    .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
    .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
    .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
    .gen_peer_create = ath10k_wmi_op_gen_peer_create,
    .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
    .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
    .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
    .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
    .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
    .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
    .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
    .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
    .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
    .gen_request_stats = ath10k_wmi_op_gen_request_stats,
    .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
    .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
    .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg,
    .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
    .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
    .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
    .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
    .gen_addba_send = ath10k_wmi_op_gen_addba_send,
    .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
    .gen_delba_send = ath10k_wmi_op_gen_delba_send,
    .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
    .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
    .gen_pdev_enable_adaptive_cca =
    ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
    .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
#endif // NEEDS PORTING
    /* .gen_bcn_tmpl not implemented */
    /* .gen_prb_tmpl not implemented */
    /* .gen_p2p_go_bcn_ie not implemented */
    /* .gen_adaptive_qcs not implemented */
};

static const struct wmi_ops wmi_10_4_ops = {
#if 0 // NEEDS PORTING
    .rx = ath10k_wmi_10_4_op_rx,
    .map_svc = wmi_10_4_svc_map,

    .pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats,
    .pull_scan = ath10k_wmi_op_pull_scan_ev,
    .pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev,
    .pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev,
    .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
    .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
    .pull_swba = ath10k_wmi_10_4_op_pull_swba_ev,
    .pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr,
    .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
    .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
    .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
    .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
    .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,

    .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
    .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
    .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
    .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
    .gen_init = ath10k_wmi_10_4_op_gen_init,
    .gen_start_scan = ath10k_wmi_op_gen_start_scan,
    .gen_stop_scan = ath10k_wmi_op_gen_stop_scan,
    .gen_vdev_create = ath10k_wmi_op_gen_vdev_create,
    .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete,
    .gen_vdev_start = ath10k_wmi_op_gen_vdev_start,
    .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop,
    .gen_vdev_up = ath10k_wmi_op_gen_vdev_up,
    .gen_vdev_down = ath10k_wmi_op_gen_vdev_down,
    .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param,
    .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key,
    .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf,
    .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable,
    .gen_peer_create = ath10k_wmi_op_gen_peer_create,
    .gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
    .gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
    .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
    .gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc,
    .gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
    .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
    .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps,
    .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list,
    .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma,
    .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm,
    .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang,
    .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx,
    .gen_dbglog_cfg = ath10k_wmi_10_4_op_gen_dbglog_cfg,
    .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable,
    .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable,
    .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode,
    .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp,
    .gen_addba_send = ath10k_wmi_op_gen_addba_send,
    .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
    .gen_delba_send = ath10k_wmi_op_gen_delba_send,
    .fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill,
    .ext_resource_config = ath10k_wmi_10_4_ext_resource_config,

    /* shared with 10.2 */
    .pull_echo_ev = ath10k_wmi_op_pull_echo_ev,
    .gen_request_stats = ath10k_wmi_op_gen_request_stats,
    .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature,
    .get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype,
    .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
    .gen_echo = ath10k_wmi_op_gen_echo,
    .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
#endif // NEEDS PORTING
};

zx_status_t ath10k_wmi_attach(struct ath10k* ar) {
    switch (ar->running_fw->fw_file.wmi_op_version) {
    case ATH10K_FW_WMI_OP_VERSION_10_4:
        ath10k_err("WMI v10.4 not supported\n");
        ar->wmi.ops = &wmi_10_4_ops;
        ar->wmi.cmd = &wmi_10_4_cmd_map;
        ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
        ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
        ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
        break;
    case ATH10K_FW_WMI_OP_VERSION_10_2_4:
        ath10k_err("WMI v10.2.4 not supported\n");
        ar->wmi.cmd = &wmi_10_2_4_cmd_map;
        ar->wmi.ops = &wmi_10_2_4_ops;
        ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
        ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
        ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
        break;
    case ATH10K_FW_WMI_OP_VERSION_10_2:
        ath10k_err("WMI v10.2 not supported\n");
        ar->wmi.cmd = &wmi_10_2_cmd_map;
        ar->wmi.ops = &wmi_10_2_ops;
        ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
        ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
        ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
        break;
    case ATH10K_FW_WMI_OP_VERSION_10_1:
        ath10k_err("WMI v10.1 not supported\n");
        ar->wmi.cmd = &wmi_10x_cmd_map;
        ar->wmi.ops = &wmi_10_1_ops;
        ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
        ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
        ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
        break;
    case ATH10K_FW_WMI_OP_VERSION_MAIN:
        ath10k_err("WMI main version not supported\n");
        ar->wmi.cmd = &wmi_cmd_map;
        ar->wmi.ops = &wmi_ops;
        ar->wmi.vdev_param = &wmi_vdev_param_map;
        ar->wmi.pdev_param = &wmi_pdev_param_map;
        ar->wmi.peer_flags = &wmi_peer_flags_map;
        break;
    case ATH10K_FW_WMI_OP_VERSION_TLV:
        ath10k_wmi_tlv_attach(ar);
        break;
    case ATH10K_FW_WMI_OP_VERSION_UNSET:
    case ATH10K_FW_WMI_OP_VERSION_MAX:
        ath10k_err("unsupported WMI op version: %d\n",
                   ar->running_fw->fw_file.wmi_op_version);
        return ZX_ERR_NOT_SUPPORTED;
    }

    ar->wmi.service_ready = COMPLETION_INIT;
    ar->wmi.unified_ready = COMPLETION_INIT;
    ar->wmi.barrier = COMPLETION_INIT;

    return ZX_OK;
}

void ath10k_wmi_free_host_mem(struct ath10k* ar) {
    unsigned int i;

    /* free the host memory chunks requested by firmware */
    for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
        io_buffer_release(&ar->wmi.mem_chunks[i].handle);
    }

    ar->wmi.num_mem_chunks = 0;
}

void ath10k_wmi_detach(struct ath10k* ar) {
#if 0 // NEEDS PORTING
    cancel_work_sync(&ar->svc_rdy_work);

    if (ar->svc_rdy_skb) {
        dev_kfree_skb(ar->svc_rdy_skb);
    }
#endif // NEEDS PORTING
}
