1da8fa4e3SBjoern A. Zeeb // SPDX-License-Identifier: ISC 2da8fa4e3SBjoern A. Zeeb /* 3da8fa4e3SBjoern A. Zeeb * Copyright (c) 2005-2011 Atheros Communications Inc. 4da8fa4e3SBjoern A. Zeeb * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. 5da8fa4e3SBjoern A. Zeeb * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. 6da8fa4e3SBjoern A. Zeeb */ 7da8fa4e3SBjoern A. Zeeb 8da8fa4e3SBjoern A. Zeeb #include <linux/skbuff.h> 9da8fa4e3SBjoern A. Zeeb #include <linux/ctype.h> 10da8fa4e3SBjoern A. Zeeb #if defined(__FreeBSD__) 11da8fa4e3SBjoern A. Zeeb #include <linux/ktime.h> 12da8fa4e3SBjoern A. Zeeb #include <linux/math64.h> 13da8fa4e3SBjoern A. Zeeb #endif 14da8fa4e3SBjoern A. Zeeb 15da8fa4e3SBjoern A. Zeeb #include "core.h" 16da8fa4e3SBjoern A. Zeeb #include "htc.h" 17da8fa4e3SBjoern A. Zeeb #include "debug.h" 18da8fa4e3SBjoern A. Zeeb #include "wmi.h" 19da8fa4e3SBjoern A. Zeeb #include "wmi-tlv.h" 20da8fa4e3SBjoern A. Zeeb #include "mac.h" 21da8fa4e3SBjoern A. Zeeb #include "testmode.h" 22da8fa4e3SBjoern A. Zeeb #include "wmi-ops.h" 23da8fa4e3SBjoern A. Zeeb #include "p2p.h" 24da8fa4e3SBjoern A. Zeeb #include "hw.h" 25da8fa4e3SBjoern A. Zeeb #include "hif.h" 26da8fa4e3SBjoern A. Zeeb #include "txrx.h" 27da8fa4e3SBjoern A. Zeeb #if defined(CONFIG_FWLOG) 28da8fa4e3SBjoern A. Zeeb #include "fwlog.h" 29da8fa4e3SBjoern A. Zeeb #endif 30da8fa4e3SBjoern A. Zeeb 31da8fa4e3SBjoern A. Zeeb #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9 32da8fa4e3SBjoern A. Zeeb #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ) 33da8fa4e3SBjoern A. Zeeb #define ATH10K_WMI_DFS_CONF_TIMEOUT_HZ (HZ / 6) 34da8fa4e3SBjoern A. Zeeb 35da8fa4e3SBjoern A. Zeeb /* MAIN WMI cmd track */ 36da8fa4e3SBjoern A. Zeeb static struct wmi_cmd_map wmi_cmd_map = { 37da8fa4e3SBjoern A. Zeeb .init_cmdid = WMI_INIT_CMDID, 38da8fa4e3SBjoern A. Zeeb .start_scan_cmdid = WMI_START_SCAN_CMDID, 39da8fa4e3SBjoern A. Zeeb .stop_scan_cmdid = WMI_STOP_SCAN_CMDID, 40da8fa4e3SBjoern A. Zeeb .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID, 41da8fa4e3SBjoern A. Zeeb .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID, 42da8fa4e3SBjoern A. Zeeb .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 43da8fa4e3SBjoern A. Zeeb .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID, 44da8fa4e3SBjoern A. Zeeb .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID, 45da8fa4e3SBjoern A. Zeeb .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID, 46da8fa4e3SBjoern A. Zeeb .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID, 47da8fa4e3SBjoern A. Zeeb .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID, 48da8fa4e3SBjoern A. Zeeb .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID, 49da8fa4e3SBjoern A. Zeeb .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID, 50da8fa4e3SBjoern A. Zeeb .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID, 51da8fa4e3SBjoern A. Zeeb .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID, 52da8fa4e3SBjoern A. Zeeb .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID, 53da8fa4e3SBjoern A. Zeeb .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID, 54da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID, 55da8fa4e3SBjoern A. Zeeb .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID, 56da8fa4e3SBjoern A. Zeeb .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID, 57da8fa4e3SBjoern A. Zeeb .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID, 58da8fa4e3SBjoern A. Zeeb .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID, 59da8fa4e3SBjoern A. Zeeb .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID, 60da8fa4e3SBjoern A. Zeeb .vdev_up_cmdid = WMI_VDEV_UP_CMDID, 61da8fa4e3SBjoern A. Zeeb .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID, 62da8fa4e3SBjoern A. Zeeb .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID, 63da8fa4e3SBjoern A. Zeeb .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID, 64da8fa4e3SBjoern A. Zeeb .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID, 65da8fa4e3SBjoern A. Zeeb .peer_create_cmdid = WMI_PEER_CREATE_CMDID, 66da8fa4e3SBjoern A. Zeeb .peer_delete_cmdid = WMI_PEER_DELETE_CMDID, 67da8fa4e3SBjoern A. Zeeb .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID, 68da8fa4e3SBjoern A. Zeeb .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID, 69da8fa4e3SBjoern A. Zeeb .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID, 70da8fa4e3SBjoern A. Zeeb .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID, 71da8fa4e3SBjoern A. Zeeb .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID, 72da8fa4e3SBjoern A. Zeeb .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID, 73da8fa4e3SBjoern A. Zeeb .bcn_tx_cmdid = WMI_BCN_TX_CMDID, 74da8fa4e3SBjoern A. Zeeb .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID, 75da8fa4e3SBjoern A. Zeeb .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID, 76da8fa4e3SBjoern A. Zeeb .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID, 77da8fa4e3SBjoern A. Zeeb .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID, 78da8fa4e3SBjoern A. Zeeb .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID, 79da8fa4e3SBjoern A. Zeeb .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID, 80da8fa4e3SBjoern A. Zeeb .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID, 81da8fa4e3SBjoern A. Zeeb .addba_send_cmdid = WMI_ADDBA_SEND_CMDID, 82da8fa4e3SBjoern A. Zeeb .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID, 83da8fa4e3SBjoern A. Zeeb .delba_send_cmdid = WMI_DELBA_SEND_CMDID, 84da8fa4e3SBjoern A. Zeeb .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID, 85da8fa4e3SBjoern A. Zeeb .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID, 86da8fa4e3SBjoern A. Zeeb .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID, 87da8fa4e3SBjoern A. Zeeb .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID, 88da8fa4e3SBjoern A. Zeeb .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID, 89da8fa4e3SBjoern A. Zeeb .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID, 90da8fa4e3SBjoern A. Zeeb .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID, 91da8fa4e3SBjoern A. Zeeb .roam_scan_mode = WMI_ROAM_SCAN_MODE, 92da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD, 93da8fa4e3SBjoern A. Zeeb .roam_scan_period = WMI_ROAM_SCAN_PERIOD, 94da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 95da8fa4e3SBjoern A. Zeeb .roam_ap_profile = WMI_ROAM_AP_PROFILE, 96da8fa4e3SBjoern A. Zeeb .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE, 97da8fa4e3SBjoern A. Zeeb .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE, 98da8fa4e3SBjoern A. Zeeb .ofl_scan_period = WMI_OFL_SCAN_PERIOD, 99da8fa4e3SBjoern A. Zeeb .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO, 100da8fa4e3SBjoern A. Zeeb .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY, 101da8fa4e3SBjoern A. Zeeb .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE, 102da8fa4e3SBjoern A. Zeeb .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE, 103da8fa4e3SBjoern A. Zeeb .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID, 104da8fa4e3SBjoern A. Zeeb .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID, 105da8fa4e3SBjoern A. Zeeb .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID, 106da8fa4e3SBjoern A. Zeeb .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID, 107da8fa4e3SBjoern A. Zeeb .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID, 108da8fa4e3SBjoern A. Zeeb .wlan_profile_set_hist_intvl_cmdid = 109da8fa4e3SBjoern A. Zeeb WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 110da8fa4e3SBjoern A. Zeeb .wlan_profile_get_profile_data_cmdid = 111da8fa4e3SBjoern A. Zeeb WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 112da8fa4e3SBjoern A. Zeeb .wlan_profile_enable_profile_id_cmdid = 113da8fa4e3SBjoern A. Zeeb WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 114da8fa4e3SBjoern A. Zeeb .wlan_profile_list_profile_id_cmdid = 115da8fa4e3SBjoern A. Zeeb WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 116da8fa4e3SBjoern A. Zeeb .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID, 117da8fa4e3SBjoern A. Zeeb .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID, 118da8fa4e3SBjoern A. Zeeb .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID, 119da8fa4e3SBjoern A. Zeeb .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID, 120da8fa4e3SBjoern A. Zeeb .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID, 121da8fa4e3SBjoern A. Zeeb .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID, 122da8fa4e3SBjoern A. Zeeb .wow_enable_disable_wake_event_cmdid = 123da8fa4e3SBjoern A. Zeeb WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 124da8fa4e3SBjoern A. Zeeb .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID, 125da8fa4e3SBjoern A. Zeeb .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 126da8fa4e3SBjoern A. Zeeb .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID, 127da8fa4e3SBjoern A. Zeeb .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID, 128da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_configure_cmdid = 129da8fa4e3SBjoern A. Zeeb WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 130da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 131da8fa4e3SBjoern A. Zeeb .request_stats_cmdid = WMI_REQUEST_STATS_CMDID, 132da8fa4e3SBjoern A. Zeeb .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID, 133da8fa4e3SBjoern A. Zeeb .network_list_offload_config_cmdid = 134da8fa4e3SBjoern A. Zeeb WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID, 135da8fa4e3SBjoern A. Zeeb .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID, 136da8fa4e3SBjoern A. Zeeb .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID, 137da8fa4e3SBjoern A. Zeeb .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID, 138da8fa4e3SBjoern A. Zeeb .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID, 139da8fa4e3SBjoern A. Zeeb .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID, 140da8fa4e3SBjoern A. Zeeb .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID, 141da8fa4e3SBjoern A. Zeeb .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID, 142da8fa4e3SBjoern A. Zeeb .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID, 143da8fa4e3SBjoern A. Zeeb .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD, 144da8fa4e3SBjoern A. Zeeb .echo_cmdid = WMI_ECHO_CMDID, 145da8fa4e3SBjoern A. Zeeb .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID, 146da8fa4e3SBjoern A. Zeeb .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID, 147da8fa4e3SBjoern A. Zeeb .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID, 148da8fa4e3SBjoern A. Zeeb .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID, 149da8fa4e3SBjoern A. Zeeb .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID, 150da8fa4e3SBjoern A. Zeeb .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID, 151da8fa4e3SBjoern A. Zeeb .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID, 152da8fa4e3SBjoern A. Zeeb .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID, 153da8fa4e3SBjoern A. Zeeb .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID, 154da8fa4e3SBjoern A. Zeeb .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 155da8fa4e3SBjoern A. Zeeb .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, 156da8fa4e3SBjoern A. Zeeb .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 157da8fa4e3SBjoern A. Zeeb .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 158da8fa4e3SBjoern A. Zeeb .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 159da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 160da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 161da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 162da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 163da8fa4e3SBjoern A. Zeeb .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 164da8fa4e3SBjoern A. Zeeb .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 165da8fa4e3SBjoern A. Zeeb .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 166da8fa4e3SBjoern A. Zeeb .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 167da8fa4e3SBjoern A. Zeeb .nan_cmdid = WMI_CMD_UNSUPPORTED, 168da8fa4e3SBjoern A. Zeeb .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 169da8fa4e3SBjoern A. Zeeb .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 170da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 171da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 172da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 173da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 174da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 175da8fa4e3SBjoern A. Zeeb .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 176da8fa4e3SBjoern A. Zeeb .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 177da8fa4e3SBjoern A. Zeeb .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 178da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 179da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 180da8fa4e3SBjoern A. Zeeb .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 181da8fa4e3SBjoern A. Zeeb .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 182da8fa4e3SBjoern A. Zeeb .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 183da8fa4e3SBjoern A. Zeeb .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 184da8fa4e3SBjoern A. Zeeb .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 185da8fa4e3SBjoern A. Zeeb .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 186da8fa4e3SBjoern A. Zeeb .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 187da8fa4e3SBjoern A. Zeeb .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 188da8fa4e3SBjoern A. Zeeb .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 189da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 190da8fa4e3SBjoern A. Zeeb .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 191da8fa4e3SBjoern A. Zeeb .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 192da8fa4e3SBjoern A. Zeeb .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 193da8fa4e3SBjoern A. Zeeb .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 194da8fa4e3SBjoern A. Zeeb .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 195da8fa4e3SBjoern A. Zeeb .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 196da8fa4e3SBjoern A. Zeeb .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 197da8fa4e3SBjoern A. Zeeb .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 198da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 199da8fa4e3SBjoern A. Zeeb .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 200da8fa4e3SBjoern A. Zeeb }; 201da8fa4e3SBjoern A. Zeeb 202da8fa4e3SBjoern A. Zeeb /* 10.X WMI cmd track */ 203da8fa4e3SBjoern A. Zeeb static struct wmi_cmd_map wmi_10x_cmd_map = { 204da8fa4e3SBjoern A. Zeeb .init_cmdid = WMI_10X_INIT_CMDID, 205da8fa4e3SBjoern A. Zeeb .start_scan_cmdid = WMI_10X_START_SCAN_CMDID, 206da8fa4e3SBjoern A. Zeeb .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID, 207da8fa4e3SBjoern A. Zeeb .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID, 208da8fa4e3SBjoern A. Zeeb .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 209da8fa4e3SBjoern A. Zeeb .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 210da8fa4e3SBjoern A. Zeeb .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID, 211da8fa4e3SBjoern A. Zeeb .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID, 212da8fa4e3SBjoern A. Zeeb .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID, 213da8fa4e3SBjoern A. Zeeb .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID, 214da8fa4e3SBjoern A. Zeeb .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID, 215da8fa4e3SBjoern A. Zeeb .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID, 216da8fa4e3SBjoern A. Zeeb .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID, 217da8fa4e3SBjoern A. Zeeb .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID, 218da8fa4e3SBjoern A. Zeeb .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID, 219da8fa4e3SBjoern A. Zeeb .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID, 220da8fa4e3SBjoern A. Zeeb .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID, 221da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID, 222da8fa4e3SBjoern A. Zeeb .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID, 223da8fa4e3SBjoern A. Zeeb .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID, 224da8fa4e3SBjoern A. Zeeb .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID, 225da8fa4e3SBjoern A. Zeeb .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID, 226da8fa4e3SBjoern A. Zeeb .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID, 227da8fa4e3SBjoern A. Zeeb .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID, 228da8fa4e3SBjoern A. Zeeb .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID, 229da8fa4e3SBjoern A. Zeeb .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID, 230da8fa4e3SBjoern A. Zeeb .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID, 231da8fa4e3SBjoern A. Zeeb .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID, 232da8fa4e3SBjoern A. Zeeb .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID, 233da8fa4e3SBjoern A. Zeeb .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID, 234da8fa4e3SBjoern A. Zeeb .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID, 235da8fa4e3SBjoern A. Zeeb .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID, 236da8fa4e3SBjoern A. Zeeb .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID, 237da8fa4e3SBjoern A. Zeeb .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID, 238da8fa4e3SBjoern A. Zeeb .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID, 239da8fa4e3SBjoern A. Zeeb .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID, 240da8fa4e3SBjoern A. Zeeb .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID, 241da8fa4e3SBjoern A. Zeeb .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID, 242da8fa4e3SBjoern A. Zeeb .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 243da8fa4e3SBjoern A. Zeeb .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID, 244da8fa4e3SBjoern A. Zeeb .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID, 245da8fa4e3SBjoern A. Zeeb .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID, 246da8fa4e3SBjoern A. Zeeb .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 247da8fa4e3SBjoern A. Zeeb .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID, 248da8fa4e3SBjoern A. Zeeb .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID, 249da8fa4e3SBjoern A. Zeeb .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID, 250da8fa4e3SBjoern A. Zeeb .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID, 251da8fa4e3SBjoern A. Zeeb .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID, 252da8fa4e3SBjoern A. Zeeb .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID, 253da8fa4e3SBjoern A. Zeeb .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID, 254da8fa4e3SBjoern A. Zeeb .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID, 255da8fa4e3SBjoern A. Zeeb .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID, 256da8fa4e3SBjoern A. Zeeb .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID, 257da8fa4e3SBjoern A. Zeeb .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID, 258da8fa4e3SBjoern A. Zeeb .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE, 259da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD, 260da8fa4e3SBjoern A. Zeeb .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD, 261da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_change_threshold = 262da8fa4e3SBjoern A. Zeeb WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 263da8fa4e3SBjoern A. Zeeb .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE, 264da8fa4e3SBjoern A. Zeeb .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE, 265da8fa4e3SBjoern A. Zeeb .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE, 266da8fa4e3SBjoern A. Zeeb .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD, 267da8fa4e3SBjoern A. Zeeb .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO, 268da8fa4e3SBjoern A. Zeeb .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY, 269da8fa4e3SBjoern A. Zeeb .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE, 270da8fa4e3SBjoern A. Zeeb .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE, 271da8fa4e3SBjoern A. Zeeb .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 272da8fa4e3SBjoern A. Zeeb .ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID, 273da8fa4e3SBjoern A. Zeeb .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 274da8fa4e3SBjoern A. Zeeb .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID, 275da8fa4e3SBjoern A. Zeeb .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID, 276da8fa4e3SBjoern A. Zeeb .wlan_profile_set_hist_intvl_cmdid = 277da8fa4e3SBjoern A. Zeeb WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 278da8fa4e3SBjoern A. Zeeb .wlan_profile_get_profile_data_cmdid = 279da8fa4e3SBjoern A. Zeeb WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 280da8fa4e3SBjoern A. Zeeb .wlan_profile_enable_profile_id_cmdid = 281da8fa4e3SBjoern A. Zeeb WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 282da8fa4e3SBjoern A. Zeeb .wlan_profile_list_profile_id_cmdid = 283da8fa4e3SBjoern A. Zeeb WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 284da8fa4e3SBjoern A. Zeeb .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID, 285da8fa4e3SBjoern A. Zeeb .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID, 286da8fa4e3SBjoern A. Zeeb .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID, 287da8fa4e3SBjoern A. Zeeb .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID, 288da8fa4e3SBjoern A. Zeeb .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID, 289da8fa4e3SBjoern A. Zeeb .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID, 290da8fa4e3SBjoern A. Zeeb .wow_enable_disable_wake_event_cmdid = 291da8fa4e3SBjoern A. Zeeb WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 292da8fa4e3SBjoern A. Zeeb .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID, 293da8fa4e3SBjoern A. Zeeb .wow_hostwakeup_from_sleep_cmdid = 294da8fa4e3SBjoern A. Zeeb WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 295da8fa4e3SBjoern A. Zeeb .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID, 296da8fa4e3SBjoern A. Zeeb .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID, 297da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_configure_cmdid = 298da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 299da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_enable_cmdid = 300da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 301da8fa4e3SBjoern A. Zeeb .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID, 302da8fa4e3SBjoern A. Zeeb .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 303da8fa4e3SBjoern A. Zeeb .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 304da8fa4e3SBjoern A. Zeeb .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 305da8fa4e3SBjoern A. Zeeb .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 306da8fa4e3SBjoern A. Zeeb .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 307da8fa4e3SBjoern A. Zeeb .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 308da8fa4e3SBjoern A. Zeeb .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 309da8fa4e3SBjoern A. Zeeb .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 310da8fa4e3SBjoern A. Zeeb .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 311da8fa4e3SBjoern A. Zeeb .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 312da8fa4e3SBjoern A. Zeeb .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 313da8fa4e3SBjoern A. Zeeb .echo_cmdid = WMI_10X_ECHO_CMDID, 314da8fa4e3SBjoern A. Zeeb .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID, 315da8fa4e3SBjoern A. Zeeb .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID, 316da8fa4e3SBjoern A. Zeeb .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID, 317da8fa4e3SBjoern A. Zeeb .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 318da8fa4e3SBjoern A. Zeeb .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 319da8fa4e3SBjoern A. Zeeb .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 320da8fa4e3SBjoern A. Zeeb .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 321da8fa4e3SBjoern A. Zeeb .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID, 322da8fa4e3SBjoern A. Zeeb .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID, 323da8fa4e3SBjoern A. Zeeb .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 324da8fa4e3SBjoern A. Zeeb .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, 325da8fa4e3SBjoern A. Zeeb .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 326da8fa4e3SBjoern A. Zeeb .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 327da8fa4e3SBjoern A. Zeeb .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 328da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 329da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 330da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 331da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 332da8fa4e3SBjoern A. Zeeb .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 333da8fa4e3SBjoern A. Zeeb .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 334da8fa4e3SBjoern A. Zeeb .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 335da8fa4e3SBjoern A. Zeeb .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 336da8fa4e3SBjoern A. Zeeb .nan_cmdid = WMI_CMD_UNSUPPORTED, 337da8fa4e3SBjoern A. Zeeb .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 338da8fa4e3SBjoern A. Zeeb .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 339da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 340da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 341da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 342da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 343da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 344da8fa4e3SBjoern A. Zeeb .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 345da8fa4e3SBjoern A. Zeeb .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 346da8fa4e3SBjoern A. Zeeb .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 347da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 348da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 349da8fa4e3SBjoern A. Zeeb .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 350da8fa4e3SBjoern A. Zeeb .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 351da8fa4e3SBjoern A. Zeeb .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 352da8fa4e3SBjoern A. Zeeb .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 353da8fa4e3SBjoern A. Zeeb .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 354da8fa4e3SBjoern A. Zeeb .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 355da8fa4e3SBjoern A. Zeeb .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 356da8fa4e3SBjoern A. Zeeb .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 357da8fa4e3SBjoern A. Zeeb .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 358da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 359da8fa4e3SBjoern A. Zeeb .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 360da8fa4e3SBjoern A. Zeeb .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 361da8fa4e3SBjoern A. Zeeb .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 362da8fa4e3SBjoern A. Zeeb .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 363da8fa4e3SBjoern A. Zeeb .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 364da8fa4e3SBjoern A. Zeeb .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 365da8fa4e3SBjoern A. Zeeb .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 366da8fa4e3SBjoern A. Zeeb .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 367da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 368da8fa4e3SBjoern A. Zeeb .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 369da8fa4e3SBjoern A. Zeeb }; 370da8fa4e3SBjoern A. Zeeb 371da8fa4e3SBjoern A. Zeeb /* 10.2.4 WMI cmd track */ 372da8fa4e3SBjoern A. Zeeb static struct wmi_cmd_map wmi_10_2_4_cmd_map = { 373da8fa4e3SBjoern A. Zeeb .init_cmdid = WMI_10_2_INIT_CMDID, 374da8fa4e3SBjoern A. Zeeb .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID, 375da8fa4e3SBjoern A. Zeeb .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID, 376da8fa4e3SBjoern A. Zeeb .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID, 377da8fa4e3SBjoern A. Zeeb .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 378da8fa4e3SBjoern A. Zeeb .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 379da8fa4e3SBjoern A. Zeeb .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID, 380da8fa4e3SBjoern A. Zeeb .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID, 381da8fa4e3SBjoern A. Zeeb .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID, 382da8fa4e3SBjoern A. Zeeb .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID, 383da8fa4e3SBjoern A. Zeeb .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID, 384da8fa4e3SBjoern A. Zeeb .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID, 385da8fa4e3SBjoern A. Zeeb .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID, 386da8fa4e3SBjoern A. Zeeb .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID, 387da8fa4e3SBjoern A. Zeeb .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID, 388da8fa4e3SBjoern A. Zeeb .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID, 389da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID, 390da8fa4e3SBjoern A. Zeeb .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID, 391da8fa4e3SBjoern A. Zeeb .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID, 392da8fa4e3SBjoern A. Zeeb .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID, 393da8fa4e3SBjoern A. Zeeb .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID, 394da8fa4e3SBjoern A. Zeeb .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID, 395da8fa4e3SBjoern A. Zeeb .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID, 396da8fa4e3SBjoern A. Zeeb .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID, 397da8fa4e3SBjoern A. Zeeb .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID, 398da8fa4e3SBjoern A. Zeeb .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID, 399da8fa4e3SBjoern A. Zeeb .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID, 400da8fa4e3SBjoern A. Zeeb .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID, 401da8fa4e3SBjoern A. Zeeb .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID, 402da8fa4e3SBjoern A. Zeeb .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID, 403da8fa4e3SBjoern A. Zeeb .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID, 404da8fa4e3SBjoern A. Zeeb .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID, 405da8fa4e3SBjoern A. Zeeb .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID, 406da8fa4e3SBjoern A. Zeeb .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID, 407da8fa4e3SBjoern A. Zeeb .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID, 408da8fa4e3SBjoern A. Zeeb .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID, 409da8fa4e3SBjoern A. Zeeb .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID, 410da8fa4e3SBjoern A. Zeeb .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 411da8fa4e3SBjoern A. Zeeb .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID, 412da8fa4e3SBjoern A. Zeeb .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID, 413da8fa4e3SBjoern A. Zeeb .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID, 414da8fa4e3SBjoern A. Zeeb .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 415da8fa4e3SBjoern A. Zeeb .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID, 416da8fa4e3SBjoern A. Zeeb .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID, 417da8fa4e3SBjoern A. Zeeb .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID, 418da8fa4e3SBjoern A. Zeeb .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID, 419da8fa4e3SBjoern A. Zeeb .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID, 420da8fa4e3SBjoern A. Zeeb .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID, 421da8fa4e3SBjoern A. Zeeb .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID, 422da8fa4e3SBjoern A. Zeeb .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID, 423da8fa4e3SBjoern A. Zeeb .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID, 424da8fa4e3SBjoern A. Zeeb .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID, 425da8fa4e3SBjoern A. Zeeb .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID, 426da8fa4e3SBjoern A. Zeeb .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE, 427da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD, 428da8fa4e3SBjoern A. Zeeb .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD, 429da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_change_threshold = 430da8fa4e3SBjoern A. Zeeb WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 431da8fa4e3SBjoern A. Zeeb .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE, 432da8fa4e3SBjoern A. Zeeb .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE, 433da8fa4e3SBjoern A. Zeeb .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE, 434da8fa4e3SBjoern A. Zeeb .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD, 435da8fa4e3SBjoern A. Zeeb .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO, 436da8fa4e3SBjoern A. Zeeb .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY, 437da8fa4e3SBjoern A. Zeeb .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE, 438da8fa4e3SBjoern A. Zeeb .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE, 439da8fa4e3SBjoern A. Zeeb .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 440da8fa4e3SBjoern A. Zeeb .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID, 441da8fa4e3SBjoern A. Zeeb .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 442da8fa4e3SBjoern A. Zeeb .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID, 443da8fa4e3SBjoern A. Zeeb .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID, 444da8fa4e3SBjoern A. Zeeb .wlan_profile_set_hist_intvl_cmdid = 445da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 446da8fa4e3SBjoern A. Zeeb .wlan_profile_get_profile_data_cmdid = 447da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 448da8fa4e3SBjoern A. Zeeb .wlan_profile_enable_profile_id_cmdid = 449da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 450da8fa4e3SBjoern A. Zeeb .wlan_profile_list_profile_id_cmdid = 451da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 452da8fa4e3SBjoern A. Zeeb .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID, 453da8fa4e3SBjoern A. Zeeb .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID, 454da8fa4e3SBjoern A. Zeeb .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID, 455da8fa4e3SBjoern A. Zeeb .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID, 456da8fa4e3SBjoern A. Zeeb .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID, 457da8fa4e3SBjoern A. Zeeb .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID, 458da8fa4e3SBjoern A. Zeeb .wow_enable_disable_wake_event_cmdid = 459da8fa4e3SBjoern A. Zeeb WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 460da8fa4e3SBjoern A. Zeeb .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID, 461da8fa4e3SBjoern A. Zeeb .wow_hostwakeup_from_sleep_cmdid = 462da8fa4e3SBjoern A. Zeeb WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 463da8fa4e3SBjoern A. Zeeb .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID, 464da8fa4e3SBjoern A. Zeeb .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID, 465da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_configure_cmdid = 466da8fa4e3SBjoern A. Zeeb WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 467da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_enable_cmdid = 468da8fa4e3SBjoern A. Zeeb WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 469da8fa4e3SBjoern A. Zeeb .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID, 470da8fa4e3SBjoern A. Zeeb .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 471da8fa4e3SBjoern A. Zeeb .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 472da8fa4e3SBjoern A. Zeeb .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 473da8fa4e3SBjoern A. Zeeb .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 474da8fa4e3SBjoern A. Zeeb .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 475da8fa4e3SBjoern A. Zeeb .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 476da8fa4e3SBjoern A. Zeeb .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 477da8fa4e3SBjoern A. Zeeb .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 478da8fa4e3SBjoern A. Zeeb .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 479da8fa4e3SBjoern A. Zeeb .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 480da8fa4e3SBjoern A. Zeeb .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 481da8fa4e3SBjoern A. Zeeb .echo_cmdid = WMI_10_2_ECHO_CMDID, 482da8fa4e3SBjoern A. Zeeb .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID, 483da8fa4e3SBjoern A. Zeeb .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID, 484da8fa4e3SBjoern A. Zeeb .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID, 485da8fa4e3SBjoern A. Zeeb .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 486da8fa4e3SBjoern A. Zeeb .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 487da8fa4e3SBjoern A. Zeeb .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 488da8fa4e3SBjoern A. Zeeb .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 489da8fa4e3SBjoern A. Zeeb .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, 490da8fa4e3SBjoern A. Zeeb .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, 491da8fa4e3SBjoern A. Zeeb .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID, 492da8fa4e3SBjoern A. Zeeb .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS, 493da8fa4e3SBjoern A. Zeeb .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 494da8fa4e3SBjoern A. Zeeb .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 495da8fa4e3SBjoern A. Zeeb .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 496da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 497da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 498da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 499da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 500da8fa4e3SBjoern A. Zeeb .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 501da8fa4e3SBjoern A. Zeeb .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 502da8fa4e3SBjoern A. Zeeb .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 503da8fa4e3SBjoern A. Zeeb .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 504da8fa4e3SBjoern A. Zeeb .nan_cmdid = WMI_CMD_UNSUPPORTED, 505da8fa4e3SBjoern A. Zeeb .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 506da8fa4e3SBjoern A. Zeeb .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 507da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 508da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 509da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 510da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 511da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 512da8fa4e3SBjoern A. Zeeb .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 513da8fa4e3SBjoern A. Zeeb .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 514da8fa4e3SBjoern A. Zeeb .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 515da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 516da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 517da8fa4e3SBjoern A. Zeeb .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 518da8fa4e3SBjoern A. Zeeb .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 519da8fa4e3SBjoern A. Zeeb .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 520da8fa4e3SBjoern A. Zeeb .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 521da8fa4e3SBjoern A. Zeeb .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 522da8fa4e3SBjoern A. Zeeb .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 523da8fa4e3SBjoern A. Zeeb .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 524da8fa4e3SBjoern A. Zeeb .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 525da8fa4e3SBjoern A. Zeeb .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 526da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 527da8fa4e3SBjoern A. Zeeb .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 528da8fa4e3SBjoern A. Zeeb .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 529da8fa4e3SBjoern A. Zeeb .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 530da8fa4e3SBjoern A. Zeeb .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 531da8fa4e3SBjoern A. Zeeb .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 532da8fa4e3SBjoern A. Zeeb .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 533da8fa4e3SBjoern A. Zeeb .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 534da8fa4e3SBjoern A. Zeeb .pdev_bss_chan_info_request_cmdid = 535da8fa4e3SBjoern A. Zeeb WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID, 536da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 537da8fa4e3SBjoern A. Zeeb .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 538da8fa4e3SBjoern A. Zeeb .set_bb_timing_cmdid = WMI_10_2_PDEV_SET_BB_TIMING_CONFIG_CMDID, 539da8fa4e3SBjoern A. Zeeb }; 540da8fa4e3SBjoern A. Zeeb 541da8fa4e3SBjoern A. Zeeb /* 10.4 WMI cmd track */ 542da8fa4e3SBjoern A. Zeeb static struct wmi_cmd_map wmi_10_4_cmd_map = { 543da8fa4e3SBjoern A. Zeeb .init_cmdid = WMI_10_4_INIT_CMDID, 544da8fa4e3SBjoern A. Zeeb .start_scan_cmdid = WMI_10_4_START_SCAN_CMDID, 545da8fa4e3SBjoern A. Zeeb .stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID, 546da8fa4e3SBjoern A. Zeeb .scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID, 547da8fa4e3SBjoern A. Zeeb .scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID, 548da8fa4e3SBjoern A. Zeeb .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 549da8fa4e3SBjoern A. Zeeb .pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID, 550da8fa4e3SBjoern A. Zeeb .pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID, 551da8fa4e3SBjoern A. Zeeb .pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID, 552da8fa4e3SBjoern A. Zeeb .pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID, 553da8fa4e3SBjoern A. Zeeb .pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID, 554da8fa4e3SBjoern A. Zeeb .pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID, 555da8fa4e3SBjoern A. Zeeb .pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID, 556da8fa4e3SBjoern A. Zeeb .pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID, 557da8fa4e3SBjoern A. Zeeb .pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID, 558da8fa4e3SBjoern A. Zeeb .pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID, 559da8fa4e3SBjoern A. Zeeb .pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID, 560da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID, 561da8fa4e3SBjoern A. Zeeb .pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID, 562da8fa4e3SBjoern A. Zeeb .vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID, 563da8fa4e3SBjoern A. Zeeb .vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID, 564da8fa4e3SBjoern A. Zeeb .vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID, 565da8fa4e3SBjoern A. Zeeb .vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID, 566da8fa4e3SBjoern A. Zeeb .vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID, 567da8fa4e3SBjoern A. Zeeb .vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID, 568da8fa4e3SBjoern A. Zeeb .vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID, 569da8fa4e3SBjoern A. Zeeb .vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID, 570da8fa4e3SBjoern A. Zeeb .vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID, 571da8fa4e3SBjoern A. Zeeb .peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID, 572da8fa4e3SBjoern A. Zeeb .peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID, 573da8fa4e3SBjoern A. Zeeb .peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID, 574da8fa4e3SBjoern A. Zeeb .peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID, 575da8fa4e3SBjoern A. Zeeb .peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID, 576da8fa4e3SBjoern A. Zeeb .peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID, 577da8fa4e3SBjoern A. Zeeb .peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID, 578da8fa4e3SBjoern A. Zeeb .peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID, 579da8fa4e3SBjoern A. Zeeb .bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID, 580da8fa4e3SBjoern A. Zeeb .pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID, 581da8fa4e3SBjoern A. Zeeb .bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID, 582da8fa4e3SBjoern A. Zeeb .bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID, 583da8fa4e3SBjoern A. Zeeb .prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID, 584da8fa4e3SBjoern A. Zeeb .mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID, 585da8fa4e3SBjoern A. Zeeb .prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID, 586da8fa4e3SBjoern A. Zeeb .addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID, 587da8fa4e3SBjoern A. Zeeb .addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID, 588da8fa4e3SBjoern A. Zeeb .addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID, 589da8fa4e3SBjoern A. Zeeb .delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID, 590da8fa4e3SBjoern A. Zeeb .addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID, 591da8fa4e3SBjoern A. Zeeb .send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID, 592da8fa4e3SBjoern A. Zeeb .sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID, 593da8fa4e3SBjoern A. Zeeb .sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID, 594da8fa4e3SBjoern A. Zeeb .sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID, 595da8fa4e3SBjoern A. Zeeb .pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID, 596da8fa4e3SBjoern A. Zeeb .pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID, 597da8fa4e3SBjoern A. Zeeb .roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE, 598da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD, 599da8fa4e3SBjoern A. Zeeb .roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD, 600da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_change_threshold = 601da8fa4e3SBjoern A. Zeeb WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 602da8fa4e3SBjoern A. Zeeb .roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE, 603da8fa4e3SBjoern A. Zeeb .ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE, 604da8fa4e3SBjoern A. Zeeb .ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE, 605da8fa4e3SBjoern A. Zeeb .ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD, 606da8fa4e3SBjoern A. Zeeb .p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO, 607da8fa4e3SBjoern A. Zeeb .p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY, 608da8fa4e3SBjoern A. Zeeb .p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE, 609da8fa4e3SBjoern A. Zeeb .p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE, 610da8fa4e3SBjoern A. Zeeb .p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID, 611da8fa4e3SBjoern A. Zeeb .ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID, 612da8fa4e3SBjoern A. Zeeb .ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID, 613da8fa4e3SBjoern A. Zeeb .peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID, 614da8fa4e3SBjoern A. Zeeb .wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID, 615da8fa4e3SBjoern A. Zeeb .wlan_profile_set_hist_intvl_cmdid = 616da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 617da8fa4e3SBjoern A. Zeeb .wlan_profile_get_profile_data_cmdid = 618da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 619da8fa4e3SBjoern A. Zeeb .wlan_profile_enable_profile_id_cmdid = 620da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 621da8fa4e3SBjoern A. Zeeb .wlan_profile_list_profile_id_cmdid = 622da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 623da8fa4e3SBjoern A. Zeeb .pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID, 624da8fa4e3SBjoern A. Zeeb .pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID, 625da8fa4e3SBjoern A. Zeeb .add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID, 626da8fa4e3SBjoern A. Zeeb .rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID, 627da8fa4e3SBjoern A. Zeeb .wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID, 628da8fa4e3SBjoern A. Zeeb .wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID, 629da8fa4e3SBjoern A. Zeeb .wow_enable_disable_wake_event_cmdid = 630da8fa4e3SBjoern A. Zeeb WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 631da8fa4e3SBjoern A. Zeeb .wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID, 632da8fa4e3SBjoern A. Zeeb .wow_hostwakeup_from_sleep_cmdid = 633da8fa4e3SBjoern A. Zeeb WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 634da8fa4e3SBjoern A. Zeeb .rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID, 635da8fa4e3SBjoern A. Zeeb .rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID, 636da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_configure_cmdid = 637da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 638da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_enable_cmdid = 639da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 640da8fa4e3SBjoern A. Zeeb .request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID, 641da8fa4e3SBjoern A. Zeeb .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 642da8fa4e3SBjoern A. Zeeb .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 643da8fa4e3SBjoern A. Zeeb .gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID, 644da8fa4e3SBjoern A. Zeeb .csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID, 645da8fa4e3SBjoern A. Zeeb .csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID, 646da8fa4e3SBjoern A. Zeeb .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 647da8fa4e3SBjoern A. Zeeb .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 648da8fa4e3SBjoern A. Zeeb .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 649da8fa4e3SBjoern A. Zeeb .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 650da8fa4e3SBjoern A. Zeeb .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 651da8fa4e3SBjoern A. Zeeb .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 652da8fa4e3SBjoern A. Zeeb .echo_cmdid = WMI_10_4_ECHO_CMDID, 653da8fa4e3SBjoern A. Zeeb .pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID, 654da8fa4e3SBjoern A. Zeeb .dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID, 655da8fa4e3SBjoern A. Zeeb .pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID, 656da8fa4e3SBjoern A. Zeeb .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 657da8fa4e3SBjoern A. Zeeb .vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID, 658da8fa4e3SBjoern A. Zeeb .vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID, 659da8fa4e3SBjoern A. Zeeb .force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID, 660da8fa4e3SBjoern A. Zeeb .gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID, 661da8fa4e3SBjoern A. Zeeb .gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID, 662da8fa4e3SBjoern A. Zeeb .pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID, 663da8fa4e3SBjoern A. Zeeb .vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED, 664da8fa4e3SBjoern A. Zeeb .adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED, 665da8fa4e3SBjoern A. Zeeb .scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID, 666da8fa4e3SBjoern A. Zeeb .vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID, 667da8fa4e3SBjoern A. Zeeb .vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID, 668da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_add_peer_cmdid = 669da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID, 670da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_evict_peer_cmdid = 671da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID, 672da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_restore_peer_cmdid = 673da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID, 674da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_print_all_peers_info_cmdid = 675da8fa4e3SBjoern A. Zeeb WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID, 676da8fa4e3SBjoern A. Zeeb .peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID, 677da8fa4e3SBjoern A. Zeeb .peer_add_proxy_sta_entry_cmdid = 678da8fa4e3SBjoern A. Zeeb WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID, 679da8fa4e3SBjoern A. Zeeb .rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID, 680da8fa4e3SBjoern A. Zeeb .oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID, 681da8fa4e3SBjoern A. Zeeb .nan_cmdid = WMI_10_4_NAN_CMDID, 682da8fa4e3SBjoern A. Zeeb .vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID, 683da8fa4e3SBjoern A. Zeeb .qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID, 684da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID, 685da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_set_rx_antenna_cmdid = 686da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID, 687da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_tx_antenna_cmdid = 688da8fa4e3SBjoern A. Zeeb WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID, 689da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_train_info_cmdid = 690da8fa4e3SBjoern A. Zeeb WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID, 691da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_node_config_ops_cmdid = 692da8fa4e3SBjoern A. Zeeb WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID, 693da8fa4e3SBjoern A. Zeeb .pdev_set_antenna_switch_table_cmdid = 694da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID, 695da8fa4e3SBjoern A. Zeeb .pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID, 696da8fa4e3SBjoern A. Zeeb .pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID, 697da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID, 698da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_chainmsk_table_cmdid = 699da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID, 700da8fa4e3SBjoern A. Zeeb .pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID, 701da8fa4e3SBjoern A. Zeeb .tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID, 702da8fa4e3SBjoern A. Zeeb .fwtest_cmdid = WMI_10_4_FWTEST_CMDID, 703da8fa4e3SBjoern A. Zeeb .vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID, 704da8fa4e3SBjoern A. Zeeb .peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID, 705da8fa4e3SBjoern A. Zeeb .pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID, 706da8fa4e3SBjoern A. Zeeb .pdev_get_ani_ofdm_config_cmdid = 707da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID, 708da8fa4e3SBjoern A. Zeeb .pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID, 709da8fa4e3SBjoern A. Zeeb .pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID, 710da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID, 711da8fa4e3SBjoern A. Zeeb .pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID, 712da8fa4e3SBjoern A. Zeeb .vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID, 713da8fa4e3SBjoern A. Zeeb .pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID, 714da8fa4e3SBjoern A. Zeeb .vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID, 715da8fa4e3SBjoern A. Zeeb .vdev_filter_neighbor_rx_packets_cmdid = 716da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID, 717da8fa4e3SBjoern A. Zeeb .mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID, 718da8fa4e3SBjoern A. Zeeb .set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID, 719da8fa4e3SBjoern A. Zeeb .pdev_bss_chan_info_request_cmdid = 720da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID, 721da8fa4e3SBjoern A. Zeeb .ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID, 722da8fa4e3SBjoern A. Zeeb .vdev_set_ie_cmdid = WMI_10_4_VDEV_SET_IE_CMDID, 723da8fa4e3SBjoern A. Zeeb .set_lteu_config_cmdid = WMI_10_4_SET_LTEU_CONFIG_CMDID, 724da8fa4e3SBjoern A. Zeeb .atf_ssid_grouping_request_cmdid = 725da8fa4e3SBjoern A. Zeeb WMI_10_4_ATF_SSID_GROUPING_REQUEST_CMDID, 726da8fa4e3SBjoern A. Zeeb .peer_atf_ext_request_cmdid = WMI_10_4_PEER_ATF_EXT_REQUEST_CMDID, 727da8fa4e3SBjoern A. Zeeb .set_periodic_channel_stats_cfg_cmdid = 728da8fa4e3SBjoern A. Zeeb WMI_10_4_SET_PERIODIC_CHANNEL_STATS_CONFIG, 729da8fa4e3SBjoern A. Zeeb .peer_bwf_request_cmdid = WMI_10_4_PEER_BWF_REQUEST_CMDID, 730da8fa4e3SBjoern A. Zeeb .btcoex_cfg_cmdid = WMI_10_4_BTCOEX_CFG_CMDID, 731da8fa4e3SBjoern A. Zeeb .peer_tx_mu_txmit_count_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_COUNT_CMDID, 732da8fa4e3SBjoern A. Zeeb .peer_tx_mu_txmit_rstcnt_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_RSTCNT_CMDID, 733da8fa4e3SBjoern A. Zeeb .peer_gid_userpos_list_cmdid = WMI_10_4_PEER_GID_USERPOS_LIST_CMDID, 734da8fa4e3SBjoern A. Zeeb .pdev_check_cal_version_cmdid = WMI_10_4_PDEV_CHECK_CAL_VERSION_CMDID, 735da8fa4e3SBjoern A. Zeeb .coex_version_cfg_cmid = WMI_10_4_COEX_VERSION_CFG_CMID, 736da8fa4e3SBjoern A. Zeeb .pdev_get_rx_filter_cmdid = WMI_10_4_PDEV_GET_RX_FILTER_CMDID, 737da8fa4e3SBjoern A. Zeeb .pdev_extended_nss_cfg_cmdid = WMI_10_4_PDEV_EXTENDED_NSS_CFG_CMDID, 738da8fa4e3SBjoern A. Zeeb .vdev_set_scan_nac_rssi_cmdid = WMI_10_4_VDEV_SET_SCAN_NAC_RSSI_CMDID, 739da8fa4e3SBjoern A. Zeeb .prog_gpio_band_select_cmdid = WMI_10_4_PROG_GPIO_BAND_SELECT_CMDID, 740da8fa4e3SBjoern A. Zeeb .config_smart_logging_cmdid = WMI_10_4_CONFIG_SMART_LOGGING_CMDID, 741da8fa4e3SBjoern A. Zeeb .debug_fatal_condition_cmdid = WMI_10_4_DEBUG_FATAL_CONDITION_CMDID, 742da8fa4e3SBjoern A. Zeeb .get_tsf_timer_cmdid = WMI_10_4_GET_TSF_TIMER_CMDID, 743da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_table_cmdid = WMI_10_4_PDEV_GET_TPC_TABLE_CMDID, 744da8fa4e3SBjoern A. Zeeb .vdev_sifs_trigger_time_cmdid = WMI_10_4_VDEV_SIFS_TRIGGER_TIME_CMDID, 745da8fa4e3SBjoern A. Zeeb .pdev_wds_entry_list_cmdid = WMI_10_4_PDEV_WDS_ENTRY_LIST_CMDID, 746da8fa4e3SBjoern A. Zeeb .tdls_set_state_cmdid = WMI_10_4_TDLS_SET_STATE_CMDID, 747da8fa4e3SBjoern A. Zeeb .tdls_peer_update_cmdid = WMI_10_4_TDLS_PEER_UPDATE_CMDID, 748da8fa4e3SBjoern A. Zeeb .tdls_set_offchan_mode_cmdid = WMI_10_4_TDLS_SET_OFFCHAN_MODE_CMDID, 749da8fa4e3SBjoern A. Zeeb .radar_found_cmdid = WMI_10_4_RADAR_FOUND_CMDID, 750da8fa4e3SBjoern A. Zeeb .per_peer_per_tid_config_cmdid = WMI_10_4_PER_PEER_PER_TID_CONFIG_CMDID, 751da8fa4e3SBjoern A. Zeeb }; 752da8fa4e3SBjoern A. Zeeb 753da8fa4e3SBjoern A. Zeeb static struct wmi_peer_param_map wmi_peer_param_map = { 754da8fa4e3SBjoern A. Zeeb .smps_state = WMI_PEER_SMPS_STATE, 755da8fa4e3SBjoern A. Zeeb .ampdu = WMI_PEER_AMPDU, 756da8fa4e3SBjoern A. Zeeb .authorize = WMI_PEER_AUTHORIZE, 757da8fa4e3SBjoern A. Zeeb .chan_width = WMI_PEER_CHAN_WIDTH, 758da8fa4e3SBjoern A. Zeeb .nss = WMI_PEER_NSS, 759da8fa4e3SBjoern A. Zeeb .use_4addr = WMI_PEER_USE_4ADDR, 760da8fa4e3SBjoern A. Zeeb .use_fixed_power = WMI_PEER_USE_FIXED_PWR, 761da8fa4e3SBjoern A. Zeeb .debug = WMI_PEER_DEBUG, 762da8fa4e3SBjoern A. Zeeb .phymode = WMI_PEER_PHYMODE, 763da8fa4e3SBjoern A. Zeeb .dummy_var = WMI_PEER_DUMMY_VAR, 764da8fa4e3SBjoern A. Zeeb }; 765da8fa4e3SBjoern A. Zeeb 766da8fa4e3SBjoern A. Zeeb /* MAIN WMI VDEV param map */ 767da8fa4e3SBjoern A. Zeeb static struct wmi_vdev_param_map wmi_vdev_param_map = { 768da8fa4e3SBjoern A. Zeeb .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD, 769da8fa4e3SBjoern A. Zeeb .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 770da8fa4e3SBjoern A. Zeeb .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL, 771da8fa4e3SBjoern A. Zeeb .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL, 772da8fa4e3SBjoern A. Zeeb .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE, 773da8fa4e3SBjoern A. Zeeb .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE, 774da8fa4e3SBjoern A. Zeeb .slot_time = WMI_VDEV_PARAM_SLOT_TIME, 775da8fa4e3SBjoern A. Zeeb .preamble = WMI_VDEV_PARAM_PREAMBLE, 776da8fa4e3SBjoern A. Zeeb .swba_time = WMI_VDEV_PARAM_SWBA_TIME, 777da8fa4e3SBjoern A. Zeeb .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD, 778da8fa4e3SBjoern A. Zeeb .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME, 779da8fa4e3SBjoern A. Zeeb .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL, 780da8fa4e3SBjoern A. Zeeb .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD, 781da8fa4e3SBjoern A. Zeeb .wmi_vdev_oc_scheduler_air_time_limit = 782da8fa4e3SBjoern A. Zeeb WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 783da8fa4e3SBjoern A. Zeeb .wds = WMI_VDEV_PARAM_WDS, 784da8fa4e3SBjoern A. Zeeb .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW, 785da8fa4e3SBjoern A. Zeeb .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX, 786da8fa4e3SBjoern A. Zeeb .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT, 787da8fa4e3SBjoern A. Zeeb .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT, 788da8fa4e3SBjoern A. Zeeb .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM, 789da8fa4e3SBjoern A. Zeeb .chwidth = WMI_VDEV_PARAM_CHWIDTH, 790da8fa4e3SBjoern A. Zeeb .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET, 791da8fa4e3SBjoern A. Zeeb .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION, 792da8fa4e3SBjoern A. Zeeb .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT, 793da8fa4e3SBjoern A. Zeeb .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE, 794da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE, 795da8fa4e3SBjoern A. Zeeb .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE, 796da8fa4e3SBjoern A. Zeeb .sgi = WMI_VDEV_PARAM_SGI, 797da8fa4e3SBjoern A. Zeeb .ldpc = WMI_VDEV_PARAM_LDPC, 798da8fa4e3SBjoern A. Zeeb .tx_stbc = WMI_VDEV_PARAM_TX_STBC, 799da8fa4e3SBjoern A. Zeeb .rx_stbc = WMI_VDEV_PARAM_RX_STBC, 800da8fa4e3SBjoern A. Zeeb .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD, 801da8fa4e3SBjoern A. Zeeb .def_keyid = WMI_VDEV_PARAM_DEF_KEYID, 802da8fa4e3SBjoern A. Zeeb .nss = WMI_VDEV_PARAM_NSS, 803da8fa4e3SBjoern A. Zeeb .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE, 804da8fa4e3SBjoern A. Zeeb .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE, 805da8fa4e3SBjoern A. Zeeb .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE, 806da8fa4e3SBjoern A. Zeeb .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE, 807da8fa4e3SBjoern A. Zeeb .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 808da8fa4e3SBjoern A. Zeeb .ap_keepalive_min_idle_inactive_time_secs = 809da8fa4e3SBjoern A. Zeeb WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 810da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_idle_inactive_time_secs = 811da8fa4e3SBjoern A. Zeeb WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 812da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_unresponsive_time_secs = 813da8fa4e3SBjoern A. Zeeb WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 814da8fa4e3SBjoern A. Zeeb .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS, 815da8fa4e3SBjoern A. Zeeb .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED, 816da8fa4e3SBjoern A. Zeeb .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS, 817da8fa4e3SBjoern A. Zeeb .txbf = WMI_VDEV_PARAM_TXBF, 818da8fa4e3SBjoern A. Zeeb .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE, 819da8fa4e3SBjoern A. Zeeb .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY, 820da8fa4e3SBjoern A. Zeeb .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE, 821da8fa4e3SBjoern A. Zeeb .ap_detect_out_of_sync_sleeping_sta_time_secs = 822da8fa4e3SBjoern A. Zeeb WMI_VDEV_PARAM_UNSUPPORTED, 823da8fa4e3SBjoern A. Zeeb .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 824da8fa4e3SBjoern A. Zeeb .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 825da8fa4e3SBjoern A. Zeeb .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 826da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 827da8fa4e3SBjoern A. Zeeb .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 828da8fa4e3SBjoern A. Zeeb .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 829da8fa4e3SBjoern A. Zeeb .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 830da8fa4e3SBjoern A. Zeeb .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 831da8fa4e3SBjoern A. Zeeb .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 832da8fa4e3SBjoern A. Zeeb .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 833da8fa4e3SBjoern A. Zeeb .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 834da8fa4e3SBjoern A. Zeeb .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 835da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 836da8fa4e3SBjoern A. Zeeb .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 837da8fa4e3SBjoern A. Zeeb .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 838da8fa4e3SBjoern A. Zeeb .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 839da8fa4e3SBjoern A. Zeeb .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED, 840da8fa4e3SBjoern A. Zeeb .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED, 841da8fa4e3SBjoern A. Zeeb }; 842da8fa4e3SBjoern A. Zeeb 843da8fa4e3SBjoern A. Zeeb /* 10.X WMI VDEV param map */ 844da8fa4e3SBjoern A. Zeeb static struct wmi_vdev_param_map wmi_10x_vdev_param_map = { 845da8fa4e3SBjoern A. Zeeb .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, 846da8fa4e3SBjoern A. Zeeb .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 847da8fa4e3SBjoern A. Zeeb .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, 848da8fa4e3SBjoern A. Zeeb .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, 849da8fa4e3SBjoern A. Zeeb .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, 850da8fa4e3SBjoern A. Zeeb .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, 851da8fa4e3SBjoern A. Zeeb .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, 852da8fa4e3SBjoern A. Zeeb .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, 853da8fa4e3SBjoern A. Zeeb .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, 854da8fa4e3SBjoern A. Zeeb .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, 855da8fa4e3SBjoern A. Zeeb .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, 856da8fa4e3SBjoern A. Zeeb .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, 857da8fa4e3SBjoern A. Zeeb .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, 858da8fa4e3SBjoern A. Zeeb .wmi_vdev_oc_scheduler_air_time_limit = 859da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 860da8fa4e3SBjoern A. Zeeb .wds = WMI_10X_VDEV_PARAM_WDS, 861da8fa4e3SBjoern A. Zeeb .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, 862da8fa4e3SBjoern A. Zeeb .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, 863da8fa4e3SBjoern A. Zeeb .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 864da8fa4e3SBjoern A. Zeeb .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 865da8fa4e3SBjoern A. Zeeb .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, 866da8fa4e3SBjoern A. Zeeb .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, 867da8fa4e3SBjoern A. Zeeb .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, 868da8fa4e3SBjoern A. Zeeb .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, 869da8fa4e3SBjoern A. Zeeb .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, 870da8fa4e3SBjoern A. Zeeb .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, 871da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, 872da8fa4e3SBjoern A. Zeeb .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, 873da8fa4e3SBjoern A. Zeeb .sgi = WMI_10X_VDEV_PARAM_SGI, 874da8fa4e3SBjoern A. Zeeb .ldpc = WMI_10X_VDEV_PARAM_LDPC, 875da8fa4e3SBjoern A. Zeeb .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, 876da8fa4e3SBjoern A. Zeeb .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, 877da8fa4e3SBjoern A. Zeeb .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, 878da8fa4e3SBjoern A. Zeeb .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, 879da8fa4e3SBjoern A. Zeeb .nss = WMI_10X_VDEV_PARAM_NSS, 880da8fa4e3SBjoern A. Zeeb .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, 881da8fa4e3SBjoern A. Zeeb .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, 882da8fa4e3SBjoern A. Zeeb .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, 883da8fa4e3SBjoern A. Zeeb .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, 884da8fa4e3SBjoern A. Zeeb .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 885da8fa4e3SBjoern A. Zeeb .ap_keepalive_min_idle_inactive_time_secs = 886da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 887da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_idle_inactive_time_secs = 888da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 889da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_unresponsive_time_secs = 890da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 891da8fa4e3SBjoern A. Zeeb .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, 892da8fa4e3SBjoern A. Zeeb .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, 893da8fa4e3SBjoern A. Zeeb .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, 894da8fa4e3SBjoern A. Zeeb .txbf = WMI_VDEV_PARAM_UNSUPPORTED, 895da8fa4e3SBjoern A. Zeeb .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, 896da8fa4e3SBjoern A. Zeeb .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, 897da8fa4e3SBjoern A. Zeeb .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, 898da8fa4e3SBjoern A. Zeeb .ap_detect_out_of_sync_sleeping_sta_time_secs = 899da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 900da8fa4e3SBjoern A. Zeeb .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 901da8fa4e3SBjoern A. Zeeb .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 902da8fa4e3SBjoern A. Zeeb .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 903da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 904da8fa4e3SBjoern A. Zeeb .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 905da8fa4e3SBjoern A. Zeeb .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 906da8fa4e3SBjoern A. Zeeb .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 907da8fa4e3SBjoern A. Zeeb .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 908da8fa4e3SBjoern A. Zeeb .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 909da8fa4e3SBjoern A. Zeeb .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 910da8fa4e3SBjoern A. Zeeb .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 911da8fa4e3SBjoern A. Zeeb .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 912da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 913da8fa4e3SBjoern A. Zeeb .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 914da8fa4e3SBjoern A. Zeeb .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 915da8fa4e3SBjoern A. Zeeb .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 916da8fa4e3SBjoern A. Zeeb .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED, 917da8fa4e3SBjoern A. Zeeb .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED, 918da8fa4e3SBjoern A. Zeeb }; 919da8fa4e3SBjoern A. Zeeb 920da8fa4e3SBjoern A. Zeeb static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = { 921da8fa4e3SBjoern A. Zeeb .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, 922da8fa4e3SBjoern A. Zeeb .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 923da8fa4e3SBjoern A. Zeeb .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, 924da8fa4e3SBjoern A. Zeeb .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, 925da8fa4e3SBjoern A. Zeeb .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, 926da8fa4e3SBjoern A. Zeeb .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, 927da8fa4e3SBjoern A. Zeeb .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, 928da8fa4e3SBjoern A. Zeeb .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, 929da8fa4e3SBjoern A. Zeeb .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, 930da8fa4e3SBjoern A. Zeeb .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, 931da8fa4e3SBjoern A. Zeeb .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, 932da8fa4e3SBjoern A. Zeeb .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, 933da8fa4e3SBjoern A. Zeeb .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, 934da8fa4e3SBjoern A. Zeeb .wmi_vdev_oc_scheduler_air_time_limit = 935da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 936da8fa4e3SBjoern A. Zeeb .wds = WMI_10X_VDEV_PARAM_WDS, 937da8fa4e3SBjoern A. Zeeb .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, 938da8fa4e3SBjoern A. Zeeb .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, 939da8fa4e3SBjoern A. Zeeb .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 940da8fa4e3SBjoern A. Zeeb .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 941da8fa4e3SBjoern A. Zeeb .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, 942da8fa4e3SBjoern A. Zeeb .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, 943da8fa4e3SBjoern A. Zeeb .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, 944da8fa4e3SBjoern A. Zeeb .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, 945da8fa4e3SBjoern A. Zeeb .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, 946da8fa4e3SBjoern A. Zeeb .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, 947da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, 948da8fa4e3SBjoern A. Zeeb .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, 949da8fa4e3SBjoern A. Zeeb .sgi = WMI_10X_VDEV_PARAM_SGI, 950da8fa4e3SBjoern A. Zeeb .ldpc = WMI_10X_VDEV_PARAM_LDPC, 951da8fa4e3SBjoern A. Zeeb .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, 952da8fa4e3SBjoern A. Zeeb .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, 953da8fa4e3SBjoern A. Zeeb .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, 954da8fa4e3SBjoern A. Zeeb .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, 955da8fa4e3SBjoern A. Zeeb .nss = WMI_10X_VDEV_PARAM_NSS, 956da8fa4e3SBjoern A. Zeeb .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, 957da8fa4e3SBjoern A. Zeeb .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, 958da8fa4e3SBjoern A. Zeeb .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, 959da8fa4e3SBjoern A. Zeeb .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, 960da8fa4e3SBjoern A. Zeeb .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 961da8fa4e3SBjoern A. Zeeb .ap_keepalive_min_idle_inactive_time_secs = 962da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 963da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_idle_inactive_time_secs = 964da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 965da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_unresponsive_time_secs = 966da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 967da8fa4e3SBjoern A. Zeeb .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, 968da8fa4e3SBjoern A. Zeeb .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, 969da8fa4e3SBjoern A. Zeeb .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, 970da8fa4e3SBjoern A. Zeeb .txbf = WMI_VDEV_PARAM_UNSUPPORTED, 971da8fa4e3SBjoern A. Zeeb .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, 972da8fa4e3SBjoern A. Zeeb .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, 973da8fa4e3SBjoern A. Zeeb .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, 974da8fa4e3SBjoern A. Zeeb .ap_detect_out_of_sync_sleeping_sta_time_secs = 975da8fa4e3SBjoern A. Zeeb WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 976da8fa4e3SBjoern A. Zeeb .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 977da8fa4e3SBjoern A. Zeeb .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 978da8fa4e3SBjoern A. Zeeb .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 979da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 980da8fa4e3SBjoern A. Zeeb .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 981da8fa4e3SBjoern A. Zeeb .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 982da8fa4e3SBjoern A. Zeeb .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 983da8fa4e3SBjoern A. Zeeb .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 984da8fa4e3SBjoern A. Zeeb .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 985da8fa4e3SBjoern A. Zeeb .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 986da8fa4e3SBjoern A. Zeeb .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 987da8fa4e3SBjoern A. Zeeb .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 988da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 989da8fa4e3SBjoern A. Zeeb .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 990da8fa4e3SBjoern A. Zeeb .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 991da8fa4e3SBjoern A. Zeeb .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 992da8fa4e3SBjoern A. Zeeb .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED, 993da8fa4e3SBjoern A. Zeeb .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED, 994da8fa4e3SBjoern A. Zeeb }; 995da8fa4e3SBjoern A. Zeeb 996da8fa4e3SBjoern A. Zeeb static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = { 997da8fa4e3SBjoern A. Zeeb .rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD, 998da8fa4e3SBjoern A. Zeeb .fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 999da8fa4e3SBjoern A. Zeeb .beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL, 1000da8fa4e3SBjoern A. Zeeb .listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL, 1001da8fa4e3SBjoern A. Zeeb .multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE, 1002da8fa4e3SBjoern A. Zeeb .mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE, 1003da8fa4e3SBjoern A. Zeeb .slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME, 1004da8fa4e3SBjoern A. Zeeb .preamble = WMI_10_4_VDEV_PARAM_PREAMBLE, 1005da8fa4e3SBjoern A. Zeeb .swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME, 1006da8fa4e3SBjoern A. Zeeb .wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD, 1007da8fa4e3SBjoern A. Zeeb .wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME, 1008da8fa4e3SBjoern A. Zeeb .wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL, 1009da8fa4e3SBjoern A. Zeeb .dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD, 1010da8fa4e3SBjoern A. Zeeb .wmi_vdev_oc_scheduler_air_time_limit = 1011da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 1012da8fa4e3SBjoern A. Zeeb .wds = WMI_10_4_VDEV_PARAM_WDS, 1013da8fa4e3SBjoern A. Zeeb .atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW, 1014da8fa4e3SBjoern A. Zeeb .bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX, 1015da8fa4e3SBjoern A. Zeeb .bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT, 1016da8fa4e3SBjoern A. Zeeb .bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT, 1017da8fa4e3SBjoern A. Zeeb .feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM, 1018da8fa4e3SBjoern A. Zeeb .chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH, 1019da8fa4e3SBjoern A. Zeeb .chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET, 1020da8fa4e3SBjoern A. Zeeb .disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION, 1021da8fa4e3SBjoern A. Zeeb .sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT, 1022da8fa4e3SBjoern A. Zeeb .mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE, 1023da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE, 1024da8fa4e3SBjoern A. Zeeb .fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE, 1025da8fa4e3SBjoern A. Zeeb .sgi = WMI_10_4_VDEV_PARAM_SGI, 1026da8fa4e3SBjoern A. Zeeb .ldpc = WMI_10_4_VDEV_PARAM_LDPC, 1027da8fa4e3SBjoern A. Zeeb .tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC, 1028da8fa4e3SBjoern A. Zeeb .rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC, 1029da8fa4e3SBjoern A. Zeeb .intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD, 1030da8fa4e3SBjoern A. Zeeb .def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID, 1031da8fa4e3SBjoern A. Zeeb .nss = WMI_10_4_VDEV_PARAM_NSS, 1032da8fa4e3SBjoern A. Zeeb .bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE, 1033da8fa4e3SBjoern A. Zeeb .mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE, 1034da8fa4e3SBjoern A. Zeeb .mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE, 1035da8fa4e3SBjoern A. Zeeb .dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE, 1036da8fa4e3SBjoern A. Zeeb .unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 1037da8fa4e3SBjoern A. Zeeb .ap_keepalive_min_idle_inactive_time_secs = 1038da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 1039da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_idle_inactive_time_secs = 1040da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 1041da8fa4e3SBjoern A. Zeeb .ap_keepalive_max_unresponsive_time_secs = 1042da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 1043da8fa4e3SBjoern A. Zeeb .ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS, 1044da8fa4e3SBjoern A. Zeeb .mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET, 1045da8fa4e3SBjoern A. Zeeb .enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS, 1046da8fa4e3SBjoern A. Zeeb .txbf = WMI_10_4_VDEV_PARAM_TXBF, 1047da8fa4e3SBjoern A. Zeeb .packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE, 1048da8fa4e3SBjoern A. Zeeb .drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY, 1049da8fa4e3SBjoern A. Zeeb .tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE, 1050da8fa4e3SBjoern A. Zeeb .ap_detect_out_of_sync_sleeping_sta_time_secs = 1051da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 1052da8fa4e3SBjoern A. Zeeb .rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES, 1053da8fa4e3SBjoern A. Zeeb .cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR, 1054da8fa4e3SBjoern A. Zeeb .mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET, 1055da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE, 1056da8fa4e3SBjoern A. Zeeb .vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK, 1057da8fa4e3SBjoern A. Zeeb .vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK, 1058da8fa4e3SBjoern A. Zeeb .early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE, 1059da8fa4e3SBjoern A. Zeeb .early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM, 1060da8fa4e3SBjoern A. Zeeb .early_rx_bmiss_sample_cycle = 1061da8fa4e3SBjoern A. Zeeb WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE, 1062da8fa4e3SBjoern A. Zeeb .early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP, 1063da8fa4e3SBjoern A. Zeeb .early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP, 1064da8fa4e3SBjoern A. Zeeb .early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE, 1065da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA, 1066da8fa4e3SBjoern A. Zeeb .meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC, 1067da8fa4e3SBjoern A. Zeeb .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE, 1068da8fa4e3SBjoern A. Zeeb .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK, 1069da8fa4e3SBjoern A. Zeeb .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT, 1070da8fa4e3SBjoern A. Zeeb .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT, 1071da8fa4e3SBjoern A. Zeeb .disable_4addr_src_lrn = WMI_10_4_VDEV_PARAM_DISABLE_4_ADDR_SRC_LRN, 1072da8fa4e3SBjoern A. Zeeb .rtt_responder_role = WMI_10_4_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE, 1073da8fa4e3SBjoern A. Zeeb }; 1074da8fa4e3SBjoern A. Zeeb 1075da8fa4e3SBjoern A. Zeeb static struct wmi_pdev_param_map wmi_pdev_param_map = { 1076da8fa4e3SBjoern A. Zeeb .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK, 1077da8fa4e3SBjoern A. Zeeb .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK, 1078da8fa4e3SBjoern A. Zeeb .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G, 1079da8fa4e3SBjoern A. Zeeb .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G, 1080da8fa4e3SBjoern A. Zeeb .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE, 1081da8fa4e3SBjoern A. Zeeb .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE, 1082da8fa4e3SBjoern A. Zeeb .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE, 1083da8fa4e3SBjoern A. Zeeb .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1084da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE, 1085da8fa4e3SBjoern A. Zeeb .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW, 1086da8fa4e3SBjoern A. Zeeb .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1087da8fa4e3SBjoern A. Zeeb .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH, 1088da8fa4e3SBjoern A. Zeeb .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH, 1089da8fa4e3SBjoern A. Zeeb .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1090da8fa4e3SBjoern A. Zeeb .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE, 1091da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE, 1092da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK, 1093da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI, 1094da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO, 1095da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1096da8fa4e3SBjoern A. Zeeb .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1097da8fa4e3SBjoern A. Zeeb .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE, 1098da8fa4e3SBjoern A. Zeeb .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1099da8fa4e3SBjoern A. Zeeb .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE, 1100da8fa4e3SBjoern A. Zeeb .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE, 1101da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH, 1102da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1103da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1104da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE, 1105da8fa4e3SBjoern A. Zeeb .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1106da8fa4e3SBjoern A. Zeeb .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1107da8fa4e3SBjoern A. Zeeb .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1108da8fa4e3SBjoern A. Zeeb .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1109da8fa4e3SBjoern A. Zeeb .pmf_qos = WMI_PDEV_PARAM_PMF_QOS, 1110da8fa4e3SBjoern A. Zeeb .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 1111da8fa4e3SBjoern A. Zeeb .dcs = WMI_PDEV_PARAM_DCS, 1112da8fa4e3SBjoern A. Zeeb .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE, 1113da8fa4e3SBjoern A. Zeeb .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD, 1114da8fa4e3SBjoern A. Zeeb .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD, 1115da8fa4e3SBjoern A. Zeeb .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL, 1116da8fa4e3SBjoern A. Zeeb .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL, 1117da8fa4e3SBjoern A. Zeeb .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN, 1118da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_PDEV_PARAM_PROXY_STA, 1119da8fa4e3SBjoern A. Zeeb .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG, 1120da8fa4e3SBjoern A. Zeeb .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP, 1121da8fa4e3SBjoern A. Zeeb .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1122da8fa4e3SBjoern A. Zeeb .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED, 1123da8fa4e3SBjoern A. Zeeb .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1124da8fa4e3SBjoern A. Zeeb .cal_period = WMI_PDEV_PARAM_UNSUPPORTED, 1125da8fa4e3SBjoern A. Zeeb .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED, 1126da8fa4e3SBjoern A. Zeeb .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1127da8fa4e3SBjoern A. Zeeb .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED, 1128da8fa4e3SBjoern A. Zeeb .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED, 1129da8fa4e3SBjoern A. Zeeb .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1130da8fa4e3SBjoern A. Zeeb .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED, 1131da8fa4e3SBjoern A. Zeeb .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED, 1132da8fa4e3SBjoern A. Zeeb .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1133da8fa4e3SBjoern A. Zeeb .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1134da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1135da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1136da8fa4e3SBjoern A. Zeeb .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1137da8fa4e3SBjoern A. Zeeb .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1138da8fa4e3SBjoern A. Zeeb .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, 1139da8fa4e3SBjoern A. Zeeb .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED, 1140da8fa4e3SBjoern A. Zeeb .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1141da8fa4e3SBjoern A. Zeeb .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1142da8fa4e3SBjoern A. Zeeb .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1143da8fa4e3SBjoern A. Zeeb .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1144da8fa4e3SBjoern A. Zeeb .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1145da8fa4e3SBjoern A. Zeeb .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1146da8fa4e3SBjoern A. Zeeb .en_stats = WMI_PDEV_PARAM_UNSUPPORTED, 1147da8fa4e3SBjoern A. Zeeb .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED, 1148da8fa4e3SBjoern A. Zeeb .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED, 1149da8fa4e3SBjoern A. Zeeb .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1150da8fa4e3SBjoern A. Zeeb .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1151da8fa4e3SBjoern A. Zeeb .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED, 1152da8fa4e3SBjoern A. Zeeb .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED, 1153da8fa4e3SBjoern A. Zeeb .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED, 1154da8fa4e3SBjoern A. Zeeb .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED, 1155da8fa4e3SBjoern A. Zeeb .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED, 1156da8fa4e3SBjoern A. Zeeb .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED, 1157da8fa4e3SBjoern A. Zeeb .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED, 1158da8fa4e3SBjoern A. Zeeb .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED, 1159da8fa4e3SBjoern A. Zeeb .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED, 1160da8fa4e3SBjoern A. Zeeb .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED, 1161da8fa4e3SBjoern A. Zeeb .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1162da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED, 1163da8fa4e3SBjoern A. Zeeb .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1164da8fa4e3SBjoern A. Zeeb .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED, 1165da8fa4e3SBjoern A. Zeeb .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1166da8fa4e3SBjoern A. Zeeb .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1167da8fa4e3SBjoern A. Zeeb .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED, 1168da8fa4e3SBjoern A. Zeeb }; 1169da8fa4e3SBjoern A. Zeeb 1170da8fa4e3SBjoern A. Zeeb static struct wmi_pdev_param_map wmi_10x_pdev_param_map = { 1171da8fa4e3SBjoern A. Zeeb .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, 1172da8fa4e3SBjoern A. Zeeb .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, 1173da8fa4e3SBjoern A. Zeeb .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, 1174da8fa4e3SBjoern A. Zeeb .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, 1175da8fa4e3SBjoern A. Zeeb .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, 1176da8fa4e3SBjoern A. Zeeb .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, 1177da8fa4e3SBjoern A. Zeeb .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, 1178da8fa4e3SBjoern A. Zeeb .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1179da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, 1180da8fa4e3SBjoern A. Zeeb .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, 1181da8fa4e3SBjoern A. Zeeb .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1182da8fa4e3SBjoern A. Zeeb .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 1183da8fa4e3SBjoern A. Zeeb .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, 1184da8fa4e3SBjoern A. Zeeb .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1185da8fa4e3SBjoern A. Zeeb .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, 1186da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, 1187da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, 1188da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, 1189da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, 1190da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1191da8fa4e3SBjoern A. Zeeb .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1192da8fa4e3SBjoern A. Zeeb .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, 1193da8fa4e3SBjoern A. Zeeb .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1194da8fa4e3SBjoern A. Zeeb .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, 1195da8fa4e3SBjoern A. Zeeb .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, 1196da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, 1197da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, 1198da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, 1199da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, 1200da8fa4e3SBjoern A. Zeeb .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1201da8fa4e3SBjoern A. Zeeb .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1202da8fa4e3SBjoern A. Zeeb .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1203da8fa4e3SBjoern A. Zeeb .bcnflt_stats_update_period = 1204da8fa4e3SBjoern A. Zeeb WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1205da8fa4e3SBjoern A. Zeeb .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, 1206da8fa4e3SBjoern A. Zeeb .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, 1207da8fa4e3SBjoern A. Zeeb .dcs = WMI_10X_PDEV_PARAM_DCS, 1208da8fa4e3SBjoern A. Zeeb .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, 1209da8fa4e3SBjoern A. Zeeb .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, 1210da8fa4e3SBjoern A. Zeeb .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, 1211da8fa4e3SBjoern A. Zeeb .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, 1212da8fa4e3SBjoern A. Zeeb .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, 1213da8fa4e3SBjoern A. Zeeb .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, 1214da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, 1215da8fa4e3SBjoern A. Zeeb .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, 1216da8fa4e3SBjoern A. Zeeb .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, 1217da8fa4e3SBjoern A. Zeeb .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, 1218da8fa4e3SBjoern A. Zeeb .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, 1219da8fa4e3SBjoern A. Zeeb .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, 1220da8fa4e3SBjoern A. Zeeb .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD, 1221da8fa4e3SBjoern A. Zeeb .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED, 1222da8fa4e3SBjoern A. Zeeb .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1223da8fa4e3SBjoern A. Zeeb .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED, 1224da8fa4e3SBjoern A. Zeeb .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED, 1225da8fa4e3SBjoern A. Zeeb .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1226da8fa4e3SBjoern A. Zeeb .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED, 1227da8fa4e3SBjoern A. Zeeb .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED, 1228da8fa4e3SBjoern A. Zeeb .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1229da8fa4e3SBjoern A. Zeeb .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1230da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1231da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1232da8fa4e3SBjoern A. Zeeb .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1233da8fa4e3SBjoern A. Zeeb .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1234da8fa4e3SBjoern A. Zeeb .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, 1235da8fa4e3SBjoern A. Zeeb .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED, 1236da8fa4e3SBjoern A. Zeeb .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1237da8fa4e3SBjoern A. Zeeb .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1238da8fa4e3SBjoern A. Zeeb .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1239da8fa4e3SBjoern A. Zeeb .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1240da8fa4e3SBjoern A. Zeeb .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1241da8fa4e3SBjoern A. Zeeb .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1242da8fa4e3SBjoern A. Zeeb .en_stats = WMI_PDEV_PARAM_UNSUPPORTED, 1243da8fa4e3SBjoern A. Zeeb .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED, 1244da8fa4e3SBjoern A. Zeeb .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED, 1245da8fa4e3SBjoern A. Zeeb .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1246da8fa4e3SBjoern A. Zeeb .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1247da8fa4e3SBjoern A. Zeeb .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED, 1248da8fa4e3SBjoern A. Zeeb .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED, 1249da8fa4e3SBjoern A. Zeeb .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED, 1250da8fa4e3SBjoern A. Zeeb .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED, 1251da8fa4e3SBjoern A. Zeeb .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED, 1252da8fa4e3SBjoern A. Zeeb .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED, 1253da8fa4e3SBjoern A. Zeeb .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED, 1254da8fa4e3SBjoern A. Zeeb .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED, 1255da8fa4e3SBjoern A. Zeeb .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED, 1256da8fa4e3SBjoern A. Zeeb .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED, 1257da8fa4e3SBjoern A. Zeeb .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1258da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED, 1259da8fa4e3SBjoern A. Zeeb .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1260da8fa4e3SBjoern A. Zeeb .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED, 1261da8fa4e3SBjoern A. Zeeb .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1262da8fa4e3SBjoern A. Zeeb .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1263da8fa4e3SBjoern A. Zeeb .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED, 1264da8fa4e3SBjoern A. Zeeb }; 1265da8fa4e3SBjoern A. Zeeb 1266da8fa4e3SBjoern A. Zeeb static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = { 1267da8fa4e3SBjoern A. Zeeb .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, 1268da8fa4e3SBjoern A. Zeeb .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, 1269da8fa4e3SBjoern A. Zeeb .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, 1270da8fa4e3SBjoern A. Zeeb .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, 1271da8fa4e3SBjoern A. Zeeb .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, 1272da8fa4e3SBjoern A. Zeeb .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, 1273da8fa4e3SBjoern A. Zeeb .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, 1274da8fa4e3SBjoern A. Zeeb .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1275da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, 1276da8fa4e3SBjoern A. Zeeb .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, 1277da8fa4e3SBjoern A. Zeeb .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1278da8fa4e3SBjoern A. Zeeb .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 1279da8fa4e3SBjoern A. Zeeb .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, 1280da8fa4e3SBjoern A. Zeeb .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1281da8fa4e3SBjoern A. Zeeb .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, 1282da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, 1283da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, 1284da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, 1285da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, 1286da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1287da8fa4e3SBjoern A. Zeeb .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1288da8fa4e3SBjoern A. Zeeb .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, 1289da8fa4e3SBjoern A. Zeeb .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1290da8fa4e3SBjoern A. Zeeb .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, 1291da8fa4e3SBjoern A. Zeeb .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, 1292da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, 1293da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, 1294da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, 1295da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, 1296da8fa4e3SBjoern A. Zeeb .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1297da8fa4e3SBjoern A. Zeeb .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1298da8fa4e3SBjoern A. Zeeb .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1299da8fa4e3SBjoern A. Zeeb .bcnflt_stats_update_period = 1300da8fa4e3SBjoern A. Zeeb WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1301da8fa4e3SBjoern A. Zeeb .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, 1302da8fa4e3SBjoern A. Zeeb .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, 1303da8fa4e3SBjoern A. Zeeb .dcs = WMI_10X_PDEV_PARAM_DCS, 1304da8fa4e3SBjoern A. Zeeb .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, 1305da8fa4e3SBjoern A. Zeeb .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, 1306da8fa4e3SBjoern A. Zeeb .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, 1307da8fa4e3SBjoern A. Zeeb .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, 1308da8fa4e3SBjoern A. Zeeb .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, 1309da8fa4e3SBjoern A. Zeeb .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, 1310da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, 1311da8fa4e3SBjoern A. Zeeb .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, 1312da8fa4e3SBjoern A. Zeeb .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, 1313da8fa4e3SBjoern A. Zeeb .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, 1314da8fa4e3SBjoern A. Zeeb .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, 1315da8fa4e3SBjoern A. Zeeb .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, 1316da8fa4e3SBjoern A. Zeeb .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD, 1317da8fa4e3SBjoern A. Zeeb .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED, 1318da8fa4e3SBjoern A. Zeeb .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1319da8fa4e3SBjoern A. Zeeb .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED, 1320da8fa4e3SBjoern A. Zeeb .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED, 1321da8fa4e3SBjoern A. Zeeb .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1322da8fa4e3SBjoern A. Zeeb .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED, 1323da8fa4e3SBjoern A. Zeeb .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED, 1324da8fa4e3SBjoern A. Zeeb .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1325da8fa4e3SBjoern A. Zeeb .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1326da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1327da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1328da8fa4e3SBjoern A. Zeeb .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1329da8fa4e3SBjoern A. Zeeb .peer_sta_ps_statechg_enable = 1330da8fa4e3SBjoern A. Zeeb WMI_10X_PDEV_PARAM_PEER_STA_PS_STATECHG_ENABLE, 1331da8fa4e3SBjoern A. Zeeb .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, 1332da8fa4e3SBjoern A. Zeeb .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED, 1333da8fa4e3SBjoern A. Zeeb .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1334da8fa4e3SBjoern A. Zeeb .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1335da8fa4e3SBjoern A. Zeeb .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1336da8fa4e3SBjoern A. Zeeb .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1337da8fa4e3SBjoern A. Zeeb .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1338da8fa4e3SBjoern A. Zeeb .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1339da8fa4e3SBjoern A. Zeeb .en_stats = WMI_PDEV_PARAM_UNSUPPORTED, 1340da8fa4e3SBjoern A. Zeeb .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED, 1341da8fa4e3SBjoern A. Zeeb .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED, 1342da8fa4e3SBjoern A. Zeeb .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1343da8fa4e3SBjoern A. Zeeb .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1344da8fa4e3SBjoern A. Zeeb .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED, 1345da8fa4e3SBjoern A. Zeeb .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED, 1346da8fa4e3SBjoern A. Zeeb .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED, 1347da8fa4e3SBjoern A. Zeeb .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED, 1348da8fa4e3SBjoern A. Zeeb .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED, 1349da8fa4e3SBjoern A. Zeeb .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED, 1350da8fa4e3SBjoern A. Zeeb .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED, 1351da8fa4e3SBjoern A. Zeeb .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED, 1352da8fa4e3SBjoern A. Zeeb .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED, 1353da8fa4e3SBjoern A. Zeeb .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED, 1354da8fa4e3SBjoern A. Zeeb .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1355da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED, 1356da8fa4e3SBjoern A. Zeeb .pdev_reset = WMI_10X_PDEV_PARAM_PDEV_RESET, 1357da8fa4e3SBjoern A. Zeeb .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED, 1358da8fa4e3SBjoern A. Zeeb .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1359da8fa4e3SBjoern A. Zeeb .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1360da8fa4e3SBjoern A. Zeeb .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED, 1361da8fa4e3SBjoern A. Zeeb }; 1362da8fa4e3SBjoern A. Zeeb 1363da8fa4e3SBjoern A. Zeeb /* firmware 10.2 specific mappings */ 1364da8fa4e3SBjoern A. Zeeb static struct wmi_cmd_map wmi_10_2_cmd_map = { 1365da8fa4e3SBjoern A. Zeeb .init_cmdid = WMI_10_2_INIT_CMDID, 1366da8fa4e3SBjoern A. Zeeb .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID, 1367da8fa4e3SBjoern A. Zeeb .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID, 1368da8fa4e3SBjoern A. Zeeb .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID, 1369da8fa4e3SBjoern A. Zeeb .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 1370da8fa4e3SBjoern A. Zeeb .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 1371da8fa4e3SBjoern A. Zeeb .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID, 1372da8fa4e3SBjoern A. Zeeb .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID, 1373da8fa4e3SBjoern A. Zeeb .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID, 1374da8fa4e3SBjoern A. Zeeb .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID, 1375da8fa4e3SBjoern A. Zeeb .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID, 1376da8fa4e3SBjoern A. Zeeb .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID, 1377da8fa4e3SBjoern A. Zeeb .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID, 1378da8fa4e3SBjoern A. Zeeb .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID, 1379da8fa4e3SBjoern A. Zeeb .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID, 1380da8fa4e3SBjoern A. Zeeb .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID, 1381da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID, 1382da8fa4e3SBjoern A. Zeeb .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID, 1383da8fa4e3SBjoern A. Zeeb .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID, 1384da8fa4e3SBjoern A. Zeeb .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID, 1385da8fa4e3SBjoern A. Zeeb .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID, 1386da8fa4e3SBjoern A. Zeeb .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID, 1387da8fa4e3SBjoern A. Zeeb .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID, 1388da8fa4e3SBjoern A. Zeeb .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID, 1389da8fa4e3SBjoern A. Zeeb .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID, 1390da8fa4e3SBjoern A. Zeeb .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID, 1391da8fa4e3SBjoern A. Zeeb .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID, 1392da8fa4e3SBjoern A. Zeeb .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID, 1393da8fa4e3SBjoern A. Zeeb .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID, 1394da8fa4e3SBjoern A. Zeeb .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID, 1395da8fa4e3SBjoern A. Zeeb .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID, 1396da8fa4e3SBjoern A. Zeeb .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID, 1397da8fa4e3SBjoern A. Zeeb .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID, 1398da8fa4e3SBjoern A. Zeeb .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID, 1399da8fa4e3SBjoern A. Zeeb .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID, 1400da8fa4e3SBjoern A. Zeeb .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID, 1401da8fa4e3SBjoern A. Zeeb .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID, 1402da8fa4e3SBjoern A. Zeeb .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 1403da8fa4e3SBjoern A. Zeeb .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID, 1404da8fa4e3SBjoern A. Zeeb .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID, 1405da8fa4e3SBjoern A. Zeeb .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID, 1406da8fa4e3SBjoern A. Zeeb .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 1407da8fa4e3SBjoern A. Zeeb .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID, 1408da8fa4e3SBjoern A. Zeeb .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID, 1409da8fa4e3SBjoern A. Zeeb .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID, 1410da8fa4e3SBjoern A. Zeeb .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID, 1411da8fa4e3SBjoern A. Zeeb .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID, 1412da8fa4e3SBjoern A. Zeeb .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID, 1413da8fa4e3SBjoern A. Zeeb .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID, 1414da8fa4e3SBjoern A. Zeeb .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID, 1415da8fa4e3SBjoern A. Zeeb .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID, 1416da8fa4e3SBjoern A. Zeeb .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID, 1417da8fa4e3SBjoern A. Zeeb .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID, 1418da8fa4e3SBjoern A. Zeeb .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE, 1419da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD, 1420da8fa4e3SBjoern A. Zeeb .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD, 1421da8fa4e3SBjoern A. Zeeb .roam_scan_rssi_change_threshold = 1422da8fa4e3SBjoern A. Zeeb WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 1423da8fa4e3SBjoern A. Zeeb .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE, 1424da8fa4e3SBjoern A. Zeeb .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE, 1425da8fa4e3SBjoern A. Zeeb .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE, 1426da8fa4e3SBjoern A. Zeeb .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD, 1427da8fa4e3SBjoern A. Zeeb .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO, 1428da8fa4e3SBjoern A. Zeeb .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY, 1429da8fa4e3SBjoern A. Zeeb .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE, 1430da8fa4e3SBjoern A. Zeeb .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE, 1431da8fa4e3SBjoern A. Zeeb .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 1432da8fa4e3SBjoern A. Zeeb .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID, 1433da8fa4e3SBjoern A. Zeeb .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 1434da8fa4e3SBjoern A. Zeeb .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID, 1435da8fa4e3SBjoern A. Zeeb .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID, 1436da8fa4e3SBjoern A. Zeeb .wlan_profile_set_hist_intvl_cmdid = 1437da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 1438da8fa4e3SBjoern A. Zeeb .wlan_profile_get_profile_data_cmdid = 1439da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 1440da8fa4e3SBjoern A. Zeeb .wlan_profile_enable_profile_id_cmdid = 1441da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 1442da8fa4e3SBjoern A. Zeeb .wlan_profile_list_profile_id_cmdid = 1443da8fa4e3SBjoern A. Zeeb WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 1444da8fa4e3SBjoern A. Zeeb .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID, 1445da8fa4e3SBjoern A. Zeeb .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID, 1446da8fa4e3SBjoern A. Zeeb .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID, 1447da8fa4e3SBjoern A. Zeeb .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID, 1448da8fa4e3SBjoern A. Zeeb .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID, 1449da8fa4e3SBjoern A. Zeeb .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID, 1450da8fa4e3SBjoern A. Zeeb .wow_enable_disable_wake_event_cmdid = 1451da8fa4e3SBjoern A. Zeeb WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 1452da8fa4e3SBjoern A. Zeeb .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID, 1453da8fa4e3SBjoern A. Zeeb .wow_hostwakeup_from_sleep_cmdid = 1454da8fa4e3SBjoern A. Zeeb WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 1455da8fa4e3SBjoern A. Zeeb .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID, 1456da8fa4e3SBjoern A. Zeeb .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID, 1457da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_configure_cmdid = 1458da8fa4e3SBjoern A. Zeeb WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 1459da8fa4e3SBjoern A. Zeeb .vdev_spectral_scan_enable_cmdid = 1460da8fa4e3SBjoern A. Zeeb WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 1461da8fa4e3SBjoern A. Zeeb .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID, 1462da8fa4e3SBjoern A. Zeeb .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 1463da8fa4e3SBjoern A. Zeeb .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 1464da8fa4e3SBjoern A. Zeeb .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 1465da8fa4e3SBjoern A. Zeeb .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 1466da8fa4e3SBjoern A. Zeeb .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 1467da8fa4e3SBjoern A. Zeeb .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 1468da8fa4e3SBjoern A. Zeeb .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 1469da8fa4e3SBjoern A. Zeeb .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 1470da8fa4e3SBjoern A. Zeeb .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 1471da8fa4e3SBjoern A. Zeeb .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 1472da8fa4e3SBjoern A. Zeeb .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 1473da8fa4e3SBjoern A. Zeeb .echo_cmdid = WMI_10_2_ECHO_CMDID, 1474da8fa4e3SBjoern A. Zeeb .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID, 1475da8fa4e3SBjoern A. Zeeb .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID, 1476da8fa4e3SBjoern A. Zeeb .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID, 1477da8fa4e3SBjoern A. Zeeb .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 1478da8fa4e3SBjoern A. Zeeb .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 1479da8fa4e3SBjoern A. Zeeb .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 1480da8fa4e3SBjoern A. Zeeb .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 1481da8fa4e3SBjoern A. Zeeb .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, 1482da8fa4e3SBjoern A. Zeeb .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, 1483da8fa4e3SBjoern A. Zeeb .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 1484da8fa4e3SBjoern A. Zeeb .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, 1485da8fa4e3SBjoern A. Zeeb .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 1486da8fa4e3SBjoern A. Zeeb .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 1487da8fa4e3SBjoern A. Zeeb .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 1488da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 1489da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 1490da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 1491da8fa4e3SBjoern A. Zeeb .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 1492da8fa4e3SBjoern A. Zeeb .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 1493da8fa4e3SBjoern A. Zeeb .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 1494da8fa4e3SBjoern A. Zeeb .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 1495da8fa4e3SBjoern A. Zeeb .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 1496da8fa4e3SBjoern A. Zeeb .nan_cmdid = WMI_CMD_UNSUPPORTED, 1497da8fa4e3SBjoern A. Zeeb .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 1498da8fa4e3SBjoern A. Zeeb .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 1499da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 1500da8fa4e3SBjoern A. Zeeb .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 1501da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 1502da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 1503da8fa4e3SBjoern A. Zeeb .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 1504da8fa4e3SBjoern A. Zeeb .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 1505da8fa4e3SBjoern A. Zeeb .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 1506da8fa4e3SBjoern A. Zeeb .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 1507da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 1508da8fa4e3SBjoern A. Zeeb .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 1509da8fa4e3SBjoern A. Zeeb .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 1510da8fa4e3SBjoern A. Zeeb .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 1511da8fa4e3SBjoern A. Zeeb .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 1512da8fa4e3SBjoern A. Zeeb .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 1513da8fa4e3SBjoern A. Zeeb .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 1514da8fa4e3SBjoern A. Zeeb .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 1515da8fa4e3SBjoern A. Zeeb .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 1516da8fa4e3SBjoern A. Zeeb .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 1517da8fa4e3SBjoern A. Zeeb .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 1518da8fa4e3SBjoern A. Zeeb .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 1519da8fa4e3SBjoern A. Zeeb }; 1520da8fa4e3SBjoern A. Zeeb 1521da8fa4e3SBjoern A. Zeeb static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = { 1522da8fa4e3SBjoern A. Zeeb .tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK, 1523da8fa4e3SBjoern A. Zeeb .rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK, 1524da8fa4e3SBjoern A. Zeeb .txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G, 1525da8fa4e3SBjoern A. Zeeb .txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G, 1526da8fa4e3SBjoern A. Zeeb .txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE, 1527da8fa4e3SBjoern A. Zeeb .beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE, 1528da8fa4e3SBjoern A. Zeeb .beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE, 1529da8fa4e3SBjoern A. Zeeb .resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1530da8fa4e3SBjoern A. Zeeb .protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE, 1531da8fa4e3SBjoern A. Zeeb .dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW, 1532da8fa4e3SBjoern A. Zeeb .non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1533da8fa4e3SBjoern A. Zeeb .agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH, 1534da8fa4e3SBjoern A. Zeeb .sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH, 1535da8fa4e3SBjoern A. Zeeb .ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1536da8fa4e3SBjoern A. Zeeb .ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE, 1537da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE, 1538da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK, 1539da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI, 1540da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO, 1541da8fa4e3SBjoern A. Zeeb .ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1542da8fa4e3SBjoern A. Zeeb .ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1543da8fa4e3SBjoern A. Zeeb .ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE, 1544da8fa4e3SBjoern A. Zeeb .ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1545da8fa4e3SBjoern A. Zeeb .l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE, 1546da8fa4e3SBjoern A. Zeeb .dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE, 1547da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH, 1548da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK, 1549da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1550da8fa4e3SBjoern A. Zeeb .pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE, 1551da8fa4e3SBjoern A. Zeeb .pdev_stats_update_period = 1552da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1553da8fa4e3SBjoern A. Zeeb .vdev_stats_update_period = 1554da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1555da8fa4e3SBjoern A. Zeeb .peer_stats_update_period = 1556da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1557da8fa4e3SBjoern A. Zeeb .bcnflt_stats_update_period = 1558da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1559da8fa4e3SBjoern A. Zeeb .pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS, 1560da8fa4e3SBjoern A. Zeeb .arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE, 1561da8fa4e3SBjoern A. Zeeb .dcs = WMI_10_4_PDEV_PARAM_DCS, 1562da8fa4e3SBjoern A. Zeeb .ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE, 1563da8fa4e3SBjoern A. Zeeb .ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD, 1564da8fa4e3SBjoern A. Zeeb .ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD, 1565da8fa4e3SBjoern A. Zeeb .ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL, 1566da8fa4e3SBjoern A. Zeeb .ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL, 1567da8fa4e3SBjoern A. Zeeb .dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN, 1568da8fa4e3SBjoern A. Zeeb .proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA, 1569da8fa4e3SBjoern A. Zeeb .idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG, 1570da8fa4e3SBjoern A. Zeeb .power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP, 1571da8fa4e3SBjoern A. Zeeb .fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET, 1572da8fa4e3SBjoern A. Zeeb .burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR, 1573da8fa4e3SBjoern A. Zeeb .burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE, 1574da8fa4e3SBjoern A. Zeeb .cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD, 1575da8fa4e3SBjoern A. Zeeb .aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST, 1576da8fa4e3SBjoern A. Zeeb .rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE, 1577da8fa4e3SBjoern A. Zeeb .smart_antenna_default_antenna = 1578da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA, 1579da8fa4e3SBjoern A. Zeeb .igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE, 1580da8fa4e3SBjoern A. Zeeb .igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID, 1581da8fa4e3SBjoern A. Zeeb .antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN, 1582da8fa4e3SBjoern A. Zeeb .rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER, 1583da8fa4e3SBjoern A. Zeeb .set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID, 1584da8fa4e3SBjoern A. Zeeb .proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE, 1585da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE, 1586da8fa4e3SBjoern A. Zeeb .set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER, 1587da8fa4e3SBjoern A. Zeeb .remove_mcast2ucast_buffer = 1588da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER, 1589da8fa4e3SBjoern A. Zeeb .peer_sta_ps_statechg_enable = 1590da8fa4e3SBjoern A. Zeeb WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE, 1591da8fa4e3SBjoern A. Zeeb .igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE, 1592da8fa4e3SBjoern A. Zeeb .block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS, 1593da8fa4e3SBjoern A. Zeeb .set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID, 1594da8fa4e3SBjoern A. Zeeb .set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID, 1595da8fa4e3SBjoern A. Zeeb .set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID, 1596da8fa4e3SBjoern A. Zeeb .txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID, 1597da8fa4e3SBjoern A. Zeeb .set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID, 1598da8fa4e3SBjoern A. Zeeb .set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID, 1599da8fa4e3SBjoern A. Zeeb .en_stats = WMI_10_4_PDEV_PARAM_EN_STATS, 1600da8fa4e3SBjoern A. Zeeb .mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY, 1601da8fa4e3SBjoern A. Zeeb .noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION, 1602da8fa4e3SBjoern A. Zeeb .noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD, 1603da8fa4e3SBjoern A. Zeeb .dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE, 1604da8fa4e3SBjoern A. Zeeb .set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO, 1605da8fa4e3SBjoern A. Zeeb .atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH, 1606da8fa4e3SBjoern A. Zeeb .atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION, 1607da8fa4e3SBjoern A. Zeeb .ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN, 1608da8fa4e3SBjoern A. Zeeb .mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT, 1609da8fa4e3SBjoern A. Zeeb .sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL, 1610da8fa4e3SBjoern A. Zeeb .signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G, 1611da8fa4e3SBjoern A. Zeeb .signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G, 1612da8fa4e3SBjoern A. Zeeb .enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU, 1613da8fa4e3SBjoern A. Zeeb .enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU, 1614da8fa4e3SBjoern A. Zeeb .cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD, 1615da8fa4e3SBjoern A. Zeeb .rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE, 1616da8fa4e3SBjoern A. Zeeb .pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET, 1617da8fa4e3SBjoern A. Zeeb .wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET, 1618da8fa4e3SBjoern A. Zeeb .arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR, 1619da8fa4e3SBjoern A. Zeeb .arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR, 1620da8fa4e3SBjoern A. Zeeb .enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX, 1621da8fa4e3SBjoern A. Zeeb }; 1622da8fa4e3SBjoern A. Zeeb 1623da8fa4e3SBjoern A. Zeeb static const u8 wmi_key_cipher_suites[] = { 1624da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_NONE] = WMI_CIPHER_NONE, 1625da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_WEP] = WMI_CIPHER_WEP, 1626da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_TKIP] = WMI_CIPHER_TKIP, 1627da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_OCB] = WMI_CIPHER_AES_OCB, 1628da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_CCM] = WMI_CIPHER_AES_CCM, 1629da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_WAPI] = WMI_CIPHER_WAPI, 1630da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_CKIP] = WMI_CIPHER_CKIP, 1631da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_CMAC] = WMI_CIPHER_AES_CMAC, 1632da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_GCM] = WMI_CIPHER_AES_GCM, 1633da8fa4e3SBjoern A. Zeeb }; 1634da8fa4e3SBjoern A. Zeeb 1635da8fa4e3SBjoern A. Zeeb static const u8 wmi_tlv_key_cipher_suites[] = { 1636da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_NONE] = WMI_TLV_CIPHER_NONE, 1637da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_WEP] = WMI_TLV_CIPHER_WEP, 1638da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_TKIP] = WMI_TLV_CIPHER_TKIP, 1639da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_OCB] = WMI_TLV_CIPHER_AES_OCB, 1640da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_CCM] = WMI_TLV_CIPHER_AES_CCM, 1641da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_WAPI] = WMI_TLV_CIPHER_WAPI, 1642da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_CKIP] = WMI_TLV_CIPHER_CKIP, 1643da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_CMAC] = WMI_TLV_CIPHER_AES_CMAC, 1644da8fa4e3SBjoern A. Zeeb [WMI_CIPHER_AES_GCM] = WMI_TLV_CIPHER_AES_GCM, 1645da8fa4e3SBjoern A. Zeeb }; 1646da8fa4e3SBjoern A. Zeeb 1647da8fa4e3SBjoern A. Zeeb static const struct wmi_peer_flags_map wmi_peer_flags_map = { 1648da8fa4e3SBjoern A. Zeeb .auth = WMI_PEER_AUTH, 1649da8fa4e3SBjoern A. Zeeb .qos = WMI_PEER_QOS, 1650da8fa4e3SBjoern A. Zeeb .need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY, 1651da8fa4e3SBjoern A. Zeeb .need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY, 1652da8fa4e3SBjoern A. Zeeb .apsd = WMI_PEER_APSD, 1653da8fa4e3SBjoern A. Zeeb .ht = WMI_PEER_HT, 1654da8fa4e3SBjoern A. Zeeb .bw40 = WMI_PEER_40MHZ, 1655da8fa4e3SBjoern A. Zeeb .stbc = WMI_PEER_STBC, 1656da8fa4e3SBjoern A. Zeeb .ldbc = WMI_PEER_LDPC, 1657da8fa4e3SBjoern A. Zeeb .dyn_mimops = WMI_PEER_DYN_MIMOPS, 1658da8fa4e3SBjoern A. Zeeb .static_mimops = WMI_PEER_STATIC_MIMOPS, 1659da8fa4e3SBjoern A. Zeeb .spatial_mux = WMI_PEER_SPATIAL_MUX, 1660da8fa4e3SBjoern A. Zeeb .vht = WMI_PEER_VHT, 1661da8fa4e3SBjoern A. Zeeb .bw80 = WMI_PEER_80MHZ, 1662da8fa4e3SBjoern A. Zeeb .vht_2g = WMI_PEER_VHT_2G, 1663da8fa4e3SBjoern A. Zeeb .pmf = WMI_PEER_PMF, 1664da8fa4e3SBjoern A. Zeeb .bw160 = WMI_PEER_160MHZ, 1665da8fa4e3SBjoern A. Zeeb }; 1666da8fa4e3SBjoern A. Zeeb 1667da8fa4e3SBjoern A. Zeeb static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = { 1668da8fa4e3SBjoern A. Zeeb .auth = WMI_10X_PEER_AUTH, 1669da8fa4e3SBjoern A. Zeeb .qos = WMI_10X_PEER_QOS, 1670da8fa4e3SBjoern A. Zeeb .need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY, 1671da8fa4e3SBjoern A. Zeeb .need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY, 1672da8fa4e3SBjoern A. Zeeb .apsd = WMI_10X_PEER_APSD, 1673da8fa4e3SBjoern A. Zeeb .ht = WMI_10X_PEER_HT, 1674da8fa4e3SBjoern A. Zeeb .bw40 = WMI_10X_PEER_40MHZ, 1675da8fa4e3SBjoern A. Zeeb .stbc = WMI_10X_PEER_STBC, 1676da8fa4e3SBjoern A. Zeeb .ldbc = WMI_10X_PEER_LDPC, 1677da8fa4e3SBjoern A. Zeeb .dyn_mimops = WMI_10X_PEER_DYN_MIMOPS, 1678da8fa4e3SBjoern A. Zeeb .static_mimops = WMI_10X_PEER_STATIC_MIMOPS, 1679da8fa4e3SBjoern A. Zeeb .spatial_mux = WMI_10X_PEER_SPATIAL_MUX, 1680da8fa4e3SBjoern A. Zeeb .vht = WMI_10X_PEER_VHT, 1681da8fa4e3SBjoern A. Zeeb .bw80 = WMI_10X_PEER_80MHZ, 1682da8fa4e3SBjoern A. Zeeb .bw160 = WMI_10X_PEER_160MHZ, 1683da8fa4e3SBjoern A. Zeeb }; 1684da8fa4e3SBjoern A. Zeeb 1685da8fa4e3SBjoern A. Zeeb static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = { 1686da8fa4e3SBjoern A. Zeeb .auth = WMI_10_2_PEER_AUTH, 1687da8fa4e3SBjoern A. Zeeb .qos = WMI_10_2_PEER_QOS, 1688da8fa4e3SBjoern A. Zeeb .need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY, 1689da8fa4e3SBjoern A. Zeeb .need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY, 1690da8fa4e3SBjoern A. Zeeb .apsd = WMI_10_2_PEER_APSD, 1691da8fa4e3SBjoern A. Zeeb .ht = WMI_10_2_PEER_HT, 1692da8fa4e3SBjoern A. Zeeb .bw40 = WMI_10_2_PEER_40MHZ, 1693da8fa4e3SBjoern A. Zeeb .stbc = WMI_10_2_PEER_STBC, 1694da8fa4e3SBjoern A. Zeeb .ldbc = WMI_10_2_PEER_LDPC, 1695da8fa4e3SBjoern A. Zeeb .dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS, 1696da8fa4e3SBjoern A. Zeeb .static_mimops = WMI_10_2_PEER_STATIC_MIMOPS, 1697da8fa4e3SBjoern A. Zeeb .spatial_mux = WMI_10_2_PEER_SPATIAL_MUX, 1698da8fa4e3SBjoern A. Zeeb .vht = WMI_10_2_PEER_VHT, 1699da8fa4e3SBjoern A. Zeeb .bw80 = WMI_10_2_PEER_80MHZ, 1700da8fa4e3SBjoern A. Zeeb .vht_2g = WMI_10_2_PEER_VHT_2G, 1701da8fa4e3SBjoern A. Zeeb .pmf = WMI_10_2_PEER_PMF, 1702da8fa4e3SBjoern A. Zeeb .bw160 = WMI_10_2_PEER_160MHZ, 1703da8fa4e3SBjoern A. Zeeb }; 1704da8fa4e3SBjoern A. Zeeb 1705da8fa4e3SBjoern A. Zeeb void ath10k_wmi_put_wmi_channel(struct ath10k *ar, struct wmi_channel *ch, 1706da8fa4e3SBjoern A. Zeeb const struct wmi_channel_arg *arg) 1707da8fa4e3SBjoern A. Zeeb { 1708da8fa4e3SBjoern A. Zeeb u32 flags = 0; 1709da8fa4e3SBjoern A. Zeeb struct ieee80211_channel *chan = NULL; 1710da8fa4e3SBjoern A. Zeeb 1711da8fa4e3SBjoern A. Zeeb memset(ch, 0, sizeof(*ch)); 1712da8fa4e3SBjoern A. Zeeb 1713da8fa4e3SBjoern A. Zeeb if (arg->passive) 1714da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_PASSIVE; 1715da8fa4e3SBjoern A. Zeeb if (arg->allow_ibss) 1716da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED; 1717da8fa4e3SBjoern A. Zeeb if (arg->allow_ht) 1718da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_ALLOW_HT; 1719da8fa4e3SBjoern A. Zeeb if (arg->allow_vht) 1720da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_ALLOW_VHT; 1721da8fa4e3SBjoern A. Zeeb if (arg->ht40plus) 1722da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_HT40_PLUS; 1723da8fa4e3SBjoern A. Zeeb if (arg->chan_radar) 1724da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_DFS; 1725da8fa4e3SBjoern A. Zeeb 1726da8fa4e3SBjoern A. Zeeb ch->band_center_freq2 = 0; 1727da8fa4e3SBjoern A. Zeeb ch->mhz = __cpu_to_le32(arg->freq); 1728da8fa4e3SBjoern A. Zeeb ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1); 1729da8fa4e3SBjoern A. Zeeb if (arg->mode == MODE_11AC_VHT80_80) { 1730da8fa4e3SBjoern A. Zeeb ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq2); 1731da8fa4e3SBjoern A. Zeeb chan = ieee80211_get_channel(ar->hw->wiphy, 1732da8fa4e3SBjoern A. Zeeb arg->band_center_freq2 - 10); 1733da8fa4e3SBjoern A. Zeeb } 1734da8fa4e3SBjoern A. Zeeb 1735da8fa4e3SBjoern A. Zeeb if (arg->mode == MODE_11AC_VHT160) { 1736da8fa4e3SBjoern A. Zeeb u32 band_center_freq1; 1737da8fa4e3SBjoern A. Zeeb u32 band_center_freq2; 1738da8fa4e3SBjoern A. Zeeb 1739da8fa4e3SBjoern A. Zeeb if (arg->freq > arg->band_center_freq1) { 1740da8fa4e3SBjoern A. Zeeb band_center_freq1 = arg->band_center_freq1 + 40; 1741da8fa4e3SBjoern A. Zeeb band_center_freq2 = arg->band_center_freq1 - 40; 1742da8fa4e3SBjoern A. Zeeb } else { 1743da8fa4e3SBjoern A. Zeeb band_center_freq1 = arg->band_center_freq1 - 40; 1744da8fa4e3SBjoern A. Zeeb band_center_freq2 = arg->band_center_freq1 + 40; 1745da8fa4e3SBjoern A. Zeeb } 1746da8fa4e3SBjoern A. Zeeb 1747da8fa4e3SBjoern A. Zeeb ch->band_center_freq1 = 1748da8fa4e3SBjoern A. Zeeb __cpu_to_le32(band_center_freq1); 1749da8fa4e3SBjoern A. Zeeb /* Minus 10 to get a defined 5G channel frequency*/ 1750da8fa4e3SBjoern A. Zeeb chan = ieee80211_get_channel(ar->hw->wiphy, 1751da8fa4e3SBjoern A. Zeeb band_center_freq2 - 10); 1752da8fa4e3SBjoern A. Zeeb /* The center frequency of the entire VHT160 */ 1753da8fa4e3SBjoern A. Zeeb ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq1); 1754da8fa4e3SBjoern A. Zeeb } 1755da8fa4e3SBjoern A. Zeeb 1756da8fa4e3SBjoern A. Zeeb if (chan && chan->flags & IEEE80211_CHAN_RADAR) 1757da8fa4e3SBjoern A. Zeeb flags |= WMI_CHAN_FLAG_DFS_CFREQ2; 1758da8fa4e3SBjoern A. Zeeb 1759da8fa4e3SBjoern A. Zeeb ch->min_power = arg->min_power; 1760da8fa4e3SBjoern A. Zeeb ch->max_power = arg->max_power; 1761da8fa4e3SBjoern A. Zeeb ch->reg_power = arg->max_reg_power; 1762da8fa4e3SBjoern A. Zeeb ch->antenna_max = arg->max_antenna_gain; 1763da8fa4e3SBjoern A. Zeeb ch->max_tx_power = arg->max_power; 1764da8fa4e3SBjoern A. Zeeb 1765da8fa4e3SBjoern A. Zeeb /* mode & flags share storage */ 1766da8fa4e3SBjoern A. Zeeb ch->mode = arg->mode; 1767da8fa4e3SBjoern A. Zeeb ch->flags |= __cpu_to_le32(flags); 1768da8fa4e3SBjoern A. Zeeb } 1769da8fa4e3SBjoern A. Zeeb 1770da8fa4e3SBjoern A. Zeeb int ath10k_wmi_wait_for_service_ready(struct ath10k *ar) 1771da8fa4e3SBjoern A. Zeeb { 1772da8fa4e3SBjoern A. Zeeb unsigned long time_left; 1773da8fa4e3SBjoern A. Zeeb 1774da8fa4e3SBjoern A. Zeeb time_left = wait_for_completion_timeout(&ar->wmi.service_ready, 1775da8fa4e3SBjoern A. Zeeb WMI_SERVICE_READY_TIMEOUT_HZ); 1776da8fa4e3SBjoern A. Zeeb if (!time_left) 1777da8fa4e3SBjoern A. Zeeb return -ETIMEDOUT; 1778da8fa4e3SBjoern A. Zeeb return 0; 1779da8fa4e3SBjoern A. Zeeb } 1780da8fa4e3SBjoern A. Zeeb 1781da8fa4e3SBjoern A. Zeeb int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar) 1782da8fa4e3SBjoern A. Zeeb { 1783da8fa4e3SBjoern A. Zeeb unsigned long time_left; 1784da8fa4e3SBjoern A. Zeeb 1785da8fa4e3SBjoern A. Zeeb time_left = wait_for_completion_timeout(&ar->wmi.unified_ready, 1786da8fa4e3SBjoern A. Zeeb WMI_UNIFIED_READY_TIMEOUT_HZ); 1787da8fa4e3SBjoern A. Zeeb if (!time_left) 1788da8fa4e3SBjoern A. Zeeb return -ETIMEDOUT; 1789da8fa4e3SBjoern A. Zeeb return 0; 1790da8fa4e3SBjoern A. Zeeb } 1791da8fa4e3SBjoern A. Zeeb 1792da8fa4e3SBjoern A. Zeeb struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len) 1793da8fa4e3SBjoern A. Zeeb { 1794da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 1795da8fa4e3SBjoern A. Zeeb u32 round_len = roundup(len, 4); 1796da8fa4e3SBjoern A. Zeeb 1797da8fa4e3SBjoern A. Zeeb skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len); 1798da8fa4e3SBjoern A. Zeeb if (!skb) 1799da8fa4e3SBjoern A. Zeeb return NULL; 1800da8fa4e3SBjoern A. Zeeb 1801da8fa4e3SBjoern A. Zeeb skb_reserve(skb, WMI_SKB_HEADROOM); 1802da8fa4e3SBjoern A. Zeeb if (!IS_ALIGNED((unsigned long)skb->data, 4)) 1803da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "Unaligned WMI skb\n"); 1804da8fa4e3SBjoern A. Zeeb 1805da8fa4e3SBjoern A. Zeeb skb_put(skb, round_len); 1806da8fa4e3SBjoern A. Zeeb memset(skb->data, 0, round_len); 1807da8fa4e3SBjoern A. Zeeb 1808da8fa4e3SBjoern A. Zeeb return skb; 1809da8fa4e3SBjoern A. Zeeb } 1810da8fa4e3SBjoern A. Zeeb 1811da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb) 1812da8fa4e3SBjoern A. Zeeb { 1813da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 1814da8fa4e3SBjoern A. Zeeb } 1815da8fa4e3SBjoern A. Zeeb 1816da8fa4e3SBjoern A. Zeeb int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb, 1817da8fa4e3SBjoern A. Zeeb u32 cmd_id) 1818da8fa4e3SBjoern A. Zeeb { 1819da8fa4e3SBjoern A. Zeeb struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); 1820da8fa4e3SBjoern A. Zeeb struct wmi_cmd_hdr *cmd_hdr; 1821da8fa4e3SBjoern A. Zeeb int ret; 1822da8fa4e3SBjoern A. Zeeb u32 cmd = 0; 1823da8fa4e3SBjoern A. Zeeb 1824da8fa4e3SBjoern A. Zeeb if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 1825da8fa4e3SBjoern A. Zeeb return -ENOMEM; 1826da8fa4e3SBjoern A. Zeeb 1827da8fa4e3SBjoern A. Zeeb cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID); 1828da8fa4e3SBjoern A. Zeeb 1829da8fa4e3SBjoern A. Zeeb cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 1830da8fa4e3SBjoern A. Zeeb cmd_hdr->cmd_id = __cpu_to_le32(cmd); 1831da8fa4e3SBjoern A. Zeeb 1832da8fa4e3SBjoern A. Zeeb memset(skb_cb, 0, sizeof(*skb_cb)); 1833da8fa4e3SBjoern A. Zeeb trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len); 1834da8fa4e3SBjoern A. Zeeb ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb); 1835da8fa4e3SBjoern A. Zeeb 1836da8fa4e3SBjoern A. Zeeb if (ret) 1837da8fa4e3SBjoern A. Zeeb goto err_pull; 1838da8fa4e3SBjoern A. Zeeb 1839da8fa4e3SBjoern A. Zeeb return 0; 1840da8fa4e3SBjoern A. Zeeb 1841da8fa4e3SBjoern A. Zeeb err_pull: 1842da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(struct wmi_cmd_hdr)); 1843da8fa4e3SBjoern A. Zeeb return ret; 1844da8fa4e3SBjoern A. Zeeb } 1845da8fa4e3SBjoern A. Zeeb 1846da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif) 1847da8fa4e3SBjoern A. Zeeb { 1848da8fa4e3SBjoern A. Zeeb struct ath10k *ar = arvif->ar; 1849da8fa4e3SBjoern A. Zeeb struct ath10k_skb_cb *cb; 1850da8fa4e3SBjoern A. Zeeb struct sk_buff *bcn; 1851da8fa4e3SBjoern A. Zeeb bool dtim_zero; 1852da8fa4e3SBjoern A. Zeeb bool deliver_cab; 1853da8fa4e3SBjoern A. Zeeb int ret; 1854da8fa4e3SBjoern A. Zeeb 1855da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 1856da8fa4e3SBjoern A. Zeeb 1857da8fa4e3SBjoern A. Zeeb bcn = arvif->beacon; 1858da8fa4e3SBjoern A. Zeeb 1859da8fa4e3SBjoern A. Zeeb if (!bcn) 1860da8fa4e3SBjoern A. Zeeb goto unlock; 1861da8fa4e3SBjoern A. Zeeb 1862da8fa4e3SBjoern A. Zeeb cb = ATH10K_SKB_CB(bcn); 1863da8fa4e3SBjoern A. Zeeb 1864da8fa4e3SBjoern A. Zeeb switch (arvif->beacon_state) { 1865da8fa4e3SBjoern A. Zeeb case ATH10K_BEACON_SENDING: 1866da8fa4e3SBjoern A. Zeeb case ATH10K_BEACON_SENT: 1867da8fa4e3SBjoern A. Zeeb break; 1868da8fa4e3SBjoern A. Zeeb case ATH10K_BEACON_SCHEDULED: 1869da8fa4e3SBjoern A. Zeeb arvif->beacon_state = ATH10K_BEACON_SENDING; 1870da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 1871da8fa4e3SBjoern A. Zeeb 1872da8fa4e3SBjoern A. Zeeb dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO); 1873da8fa4e3SBjoern A. Zeeb deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB); 1874da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar, 1875da8fa4e3SBjoern A. Zeeb arvif->vdev_id, 1876da8fa4e3SBjoern A. Zeeb bcn->data, bcn->len, 1877da8fa4e3SBjoern A. Zeeb cb->paddr, 1878da8fa4e3SBjoern A. Zeeb dtim_zero, 1879da8fa4e3SBjoern A. Zeeb deliver_cab); 1880da8fa4e3SBjoern A. Zeeb 1881da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 1882da8fa4e3SBjoern A. Zeeb 1883da8fa4e3SBjoern A. Zeeb if (ret == 0) 1884da8fa4e3SBjoern A. Zeeb arvif->beacon_state = ATH10K_BEACON_SENT; 1885da8fa4e3SBjoern A. Zeeb else 1886da8fa4e3SBjoern A. Zeeb arvif->beacon_state = ATH10K_BEACON_SCHEDULED; 1887da8fa4e3SBjoern A. Zeeb } 1888da8fa4e3SBjoern A. Zeeb 1889da8fa4e3SBjoern A. Zeeb unlock: 1890da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 1891da8fa4e3SBjoern A. Zeeb } 1892da8fa4e3SBjoern A. Zeeb 1893da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac, 1894da8fa4e3SBjoern A. Zeeb struct ieee80211_vif *vif) 1895da8fa4e3SBjoern A. Zeeb { 1896da8fa4e3SBjoern A. Zeeb struct ath10k_vif *arvif = (void *)vif->drv_priv; 1897da8fa4e3SBjoern A. Zeeb 1898da8fa4e3SBjoern A. Zeeb ath10k_wmi_tx_beacon_nowait(arvif); 1899da8fa4e3SBjoern A. Zeeb } 1900da8fa4e3SBjoern A. Zeeb 1901da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar) 1902da8fa4e3SBjoern A. Zeeb { 1903da8fa4e3SBjoern A. Zeeb ieee80211_iterate_active_interfaces_atomic(ar->hw, 1904da8fa4e3SBjoern A. Zeeb ATH10K_ITER_NORMAL_FLAGS, 1905da8fa4e3SBjoern A. Zeeb ath10k_wmi_tx_beacons_iter, 1906da8fa4e3SBjoern A. Zeeb NULL); 1907da8fa4e3SBjoern A. Zeeb } 1908da8fa4e3SBjoern A. Zeeb 1909da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar) 1910da8fa4e3SBjoern A. Zeeb { 1911da8fa4e3SBjoern A. Zeeb /* try to send pending beacons first. they take priority */ 1912da8fa4e3SBjoern A. Zeeb ath10k_wmi_tx_beacons_nowait(ar); 1913da8fa4e3SBjoern A. Zeeb 1914da8fa4e3SBjoern A. Zeeb wake_up(&ar->wmi.tx_credits_wq); 1915da8fa4e3SBjoern A. Zeeb } 1916da8fa4e3SBjoern A. Zeeb 1917da8fa4e3SBjoern A. Zeeb int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id) 1918da8fa4e3SBjoern A. Zeeb { 1919da8fa4e3SBjoern A. Zeeb int ret = -EOPNOTSUPP; 1920da8fa4e3SBjoern A. Zeeb 1921da8fa4e3SBjoern A. Zeeb might_sleep(); 1922da8fa4e3SBjoern A. Zeeb 1923da8fa4e3SBjoern A. Zeeb if (cmd_id == WMI_CMD_UNSUPPORTED) { 1924da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "wmi command %d is not supported by firmware\n", 1925da8fa4e3SBjoern A. Zeeb cmd_id); 1926da8fa4e3SBjoern A. Zeeb return ret; 1927da8fa4e3SBjoern A. Zeeb } 1928da8fa4e3SBjoern A. Zeeb 1929da8fa4e3SBjoern A. Zeeb wait_event_timeout(ar->wmi.tx_credits_wq, ({ 1930da8fa4e3SBjoern A. Zeeb /* try to send pending beacons first. they take priority */ 1931da8fa4e3SBjoern A. Zeeb ath10k_wmi_tx_beacons_nowait(ar); 1932da8fa4e3SBjoern A. Zeeb 1933da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id); 1934da8fa4e3SBjoern A. Zeeb 1935da8fa4e3SBjoern A. Zeeb if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) 1936da8fa4e3SBjoern A. Zeeb ret = -ESHUTDOWN; 1937da8fa4e3SBjoern A. Zeeb 1938da8fa4e3SBjoern A. Zeeb (ret != -EAGAIN); 1939da8fa4e3SBjoern A. Zeeb }), 3 * HZ); 1940da8fa4e3SBjoern A. Zeeb 1941da8fa4e3SBjoern A. Zeeb if (ret) 1942da8fa4e3SBjoern A. Zeeb dev_kfree_skb_any(skb); 1943da8fa4e3SBjoern A. Zeeb 1944da8fa4e3SBjoern A. Zeeb if (ret == -EAGAIN) { 1945da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "wmi command %d timeout, restarting hardware\n", 1946da8fa4e3SBjoern A. Zeeb cmd_id); 1947da8fa4e3SBjoern A. Zeeb ath10k_core_start_recovery(ar); 1948da8fa4e3SBjoern A. Zeeb } 1949da8fa4e3SBjoern A. Zeeb 1950da8fa4e3SBjoern A. Zeeb return ret; 1951da8fa4e3SBjoern A. Zeeb } 1952da8fa4e3SBjoern A. Zeeb 1953da8fa4e3SBjoern A. Zeeb static struct sk_buff * 1954da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 1955da8fa4e3SBjoern A. Zeeb { 1956da8fa4e3SBjoern A. Zeeb struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu); 1957da8fa4e3SBjoern A. Zeeb struct ath10k_vif *arvif; 1958da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_tx_cmd *cmd; 1959da8fa4e3SBjoern A. Zeeb struct ieee80211_hdr *hdr; 1960da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 1961da8fa4e3SBjoern A. Zeeb int len; 1962da8fa4e3SBjoern A. Zeeb u32 vdev_id; 1963da8fa4e3SBjoern A. Zeeb u32 buf_len = msdu->len; 1964da8fa4e3SBjoern A. Zeeb u16 fc; 1965da8fa4e3SBjoern A. Zeeb const u8 *peer_addr; 1966da8fa4e3SBjoern A. Zeeb 1967da8fa4e3SBjoern A. Zeeb hdr = (struct ieee80211_hdr *)msdu->data; 1968da8fa4e3SBjoern A. Zeeb fc = le16_to_cpu(hdr->frame_control); 1969da8fa4e3SBjoern A. Zeeb 1970da8fa4e3SBjoern A. Zeeb if (cb->vif) { 1971da8fa4e3SBjoern A. Zeeb arvif = (void *)cb->vif->drv_priv; 1972da8fa4e3SBjoern A. Zeeb vdev_id = arvif->vdev_id; 1973da8fa4e3SBjoern A. Zeeb } else { 1974da8fa4e3SBjoern A. Zeeb vdev_id = 0; 1975da8fa4e3SBjoern A. Zeeb } 1976da8fa4e3SBjoern A. Zeeb 1977da8fa4e3SBjoern A. Zeeb if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control))) 1978da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 1979da8fa4e3SBjoern A. Zeeb 1980da8fa4e3SBjoern A. Zeeb len = sizeof(cmd->hdr) + msdu->len; 1981da8fa4e3SBjoern A. Zeeb 1982da8fa4e3SBjoern A. Zeeb if ((ieee80211_is_action(hdr->frame_control) || 1983da8fa4e3SBjoern A. Zeeb ieee80211_is_deauth(hdr->frame_control) || 1984da8fa4e3SBjoern A. Zeeb ieee80211_is_disassoc(hdr->frame_control)) && 1985da8fa4e3SBjoern A. Zeeb ieee80211_has_protected(hdr->frame_control)) { 1986da8fa4e3SBjoern A. Zeeb peer_addr = hdr->addr1; 1987da8fa4e3SBjoern A. Zeeb if (is_multicast_ether_addr(peer_addr)) { 1988da8fa4e3SBjoern A. Zeeb len += sizeof(struct ieee80211_mmie_16); 1989da8fa4e3SBjoern A. Zeeb buf_len += sizeof(struct ieee80211_mmie_16); 1990da8fa4e3SBjoern A. Zeeb } else { 1991da8fa4e3SBjoern A. Zeeb if (cb->ucast_cipher == WLAN_CIPHER_SUITE_GCMP || 1992da8fa4e3SBjoern A. Zeeb cb->ucast_cipher == WLAN_CIPHER_SUITE_GCMP_256) { 1993da8fa4e3SBjoern A. Zeeb len += IEEE80211_GCMP_MIC_LEN; 1994da8fa4e3SBjoern A. Zeeb buf_len += IEEE80211_GCMP_MIC_LEN; 1995da8fa4e3SBjoern A. Zeeb } else { 1996da8fa4e3SBjoern A. Zeeb len += IEEE80211_CCMP_MIC_LEN; 1997da8fa4e3SBjoern A. Zeeb buf_len += IEEE80211_CCMP_MIC_LEN; 1998da8fa4e3SBjoern A. Zeeb } 1999da8fa4e3SBjoern A. Zeeb } 2000da8fa4e3SBjoern A. Zeeb } 2001da8fa4e3SBjoern A. Zeeb 2002da8fa4e3SBjoern A. Zeeb len = round_up(len, 4); 2003da8fa4e3SBjoern A. Zeeb 2004da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 2005da8fa4e3SBjoern A. Zeeb if (!skb) 2006da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 2007da8fa4e3SBjoern A. Zeeb 2008da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_mgmt_tx_cmd *)skb->data; 2009da8fa4e3SBjoern A. Zeeb 2010da8fa4e3SBjoern A. Zeeb cmd->hdr.vdev_id = __cpu_to_le32(vdev_id); 2011da8fa4e3SBjoern A. Zeeb cmd->hdr.tx_rate = 0; 2012da8fa4e3SBjoern A. Zeeb cmd->hdr.tx_power = 0; 2013da8fa4e3SBjoern A. Zeeb cmd->hdr.buf_len = __cpu_to_le32(buf_len); 2014da8fa4e3SBjoern A. Zeeb 2015da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr)); 2016da8fa4e3SBjoern A. Zeeb memcpy(cmd->buf, msdu->data, msdu->len); 2017da8fa4e3SBjoern A. Zeeb 2018da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n", 2019da8fa4e3SBjoern A. Zeeb msdu, skb->len, fc & IEEE80211_FCTL_FTYPE, 2020da8fa4e3SBjoern A. Zeeb fc & IEEE80211_FCTL_STYPE); 2021da8fa4e3SBjoern A. Zeeb trace_ath10k_tx_hdr(ar, skb->data, skb->len); 2022da8fa4e3SBjoern A. Zeeb trace_ath10k_tx_payload(ar, skb->data, skb->len); 2023da8fa4e3SBjoern A. Zeeb 2024da8fa4e3SBjoern A. Zeeb return skb; 2025da8fa4e3SBjoern A. Zeeb } 2026da8fa4e3SBjoern A. Zeeb 2027da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_scan_started(struct ath10k *ar) 2028da8fa4e3SBjoern A. Zeeb { 2029da8fa4e3SBjoern A. Zeeb lockdep_assert_held(&ar->data_lock); 2030da8fa4e3SBjoern A. Zeeb 2031da8fa4e3SBjoern A. Zeeb switch (ar->scan.state) { 2032da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_IDLE: 2033da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_RUNNING: 2034da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_ABORTING: 2035da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n", 2036da8fa4e3SBjoern A. Zeeb ath10k_scan_state_str(ar->scan.state), 2037da8fa4e3SBjoern A. Zeeb ar->scan.state); 2038da8fa4e3SBjoern A. Zeeb break; 2039da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_STARTING: 2040da8fa4e3SBjoern A. Zeeb ar->scan.state = ATH10K_SCAN_RUNNING; 2041da8fa4e3SBjoern A. Zeeb 2042da8fa4e3SBjoern A. Zeeb if (ar->scan.is_roc) 2043da8fa4e3SBjoern A. Zeeb ieee80211_ready_on_channel(ar->hw); 2044da8fa4e3SBjoern A. Zeeb 2045da8fa4e3SBjoern A. Zeeb complete(&ar->scan.started); 2046da8fa4e3SBjoern A. Zeeb break; 2047da8fa4e3SBjoern A. Zeeb } 2048da8fa4e3SBjoern A. Zeeb } 2049da8fa4e3SBjoern A. Zeeb 2050da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar) 2051da8fa4e3SBjoern A. Zeeb { 2052da8fa4e3SBjoern A. Zeeb lockdep_assert_held(&ar->data_lock); 2053da8fa4e3SBjoern A. Zeeb 2054da8fa4e3SBjoern A. Zeeb switch (ar->scan.state) { 2055da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_IDLE: 2056da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_RUNNING: 2057da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_ABORTING: 2058da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n", 2059da8fa4e3SBjoern A. Zeeb ath10k_scan_state_str(ar->scan.state), 2060da8fa4e3SBjoern A. Zeeb ar->scan.state); 2061da8fa4e3SBjoern A. Zeeb break; 2062da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_STARTING: 2063da8fa4e3SBjoern A. Zeeb complete(&ar->scan.started); 2064da8fa4e3SBjoern A. Zeeb __ath10k_scan_finish(ar); 2065da8fa4e3SBjoern A. Zeeb break; 2066da8fa4e3SBjoern A. Zeeb } 2067da8fa4e3SBjoern A. Zeeb } 2068da8fa4e3SBjoern A. Zeeb 2069da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_scan_completed(struct ath10k *ar) 2070da8fa4e3SBjoern A. Zeeb { 2071da8fa4e3SBjoern A. Zeeb lockdep_assert_held(&ar->data_lock); 2072da8fa4e3SBjoern A. Zeeb 2073da8fa4e3SBjoern A. Zeeb switch (ar->scan.state) { 2074da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_IDLE: 2075da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_STARTING: 2076da8fa4e3SBjoern A. Zeeb /* One suspected reason scan can be completed while starting is 2077da8fa4e3SBjoern A. Zeeb * if firmware fails to deliver all scan events to the host, 2078da8fa4e3SBjoern A. Zeeb * e.g. when transport pipe is full. This has been observed 2079da8fa4e3SBjoern A. Zeeb * with spectral scan phyerr events starving wmi transport 2080da8fa4e3SBjoern A. Zeeb * pipe. In such case the "scan completed" event should be (and 2081da8fa4e3SBjoern A. Zeeb * is) ignored by the host as it may be just firmware's scan 2082da8fa4e3SBjoern A. Zeeb * state machine recovering. 2083da8fa4e3SBjoern A. Zeeb */ 2084da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n", 2085da8fa4e3SBjoern A. Zeeb ath10k_scan_state_str(ar->scan.state), 2086da8fa4e3SBjoern A. Zeeb ar->scan.state); 2087da8fa4e3SBjoern A. Zeeb break; 2088da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_RUNNING: 2089da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_ABORTING: 2090da8fa4e3SBjoern A. Zeeb __ath10k_scan_finish(ar); 2091da8fa4e3SBjoern A. Zeeb break; 2092da8fa4e3SBjoern A. Zeeb } 2093da8fa4e3SBjoern A. Zeeb } 2094da8fa4e3SBjoern A. Zeeb 2095da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar) 2096da8fa4e3SBjoern A. Zeeb { 2097da8fa4e3SBjoern A. Zeeb lockdep_assert_held(&ar->data_lock); 2098da8fa4e3SBjoern A. Zeeb 2099da8fa4e3SBjoern A. Zeeb switch (ar->scan.state) { 2100da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_IDLE: 2101da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_STARTING: 2102da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n", 2103da8fa4e3SBjoern A. Zeeb ath10k_scan_state_str(ar->scan.state), 2104da8fa4e3SBjoern A. Zeeb ar->scan.state); 2105da8fa4e3SBjoern A. Zeeb break; 2106da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_RUNNING: 2107da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_ABORTING: 2108da8fa4e3SBjoern A. Zeeb ar->scan_channel = NULL; 2109da8fa4e3SBjoern A. Zeeb break; 2110da8fa4e3SBjoern A. Zeeb } 2111da8fa4e3SBjoern A. Zeeb } 2112da8fa4e3SBjoern A. Zeeb 2113da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq) 2114da8fa4e3SBjoern A. Zeeb { 2115da8fa4e3SBjoern A. Zeeb lockdep_assert_held(&ar->data_lock); 2116da8fa4e3SBjoern A. Zeeb 2117da8fa4e3SBjoern A. Zeeb switch (ar->scan.state) { 2118da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_IDLE: 2119da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_STARTING: 2120da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n", 2121da8fa4e3SBjoern A. Zeeb ath10k_scan_state_str(ar->scan.state), 2122da8fa4e3SBjoern A. Zeeb ar->scan.state); 2123da8fa4e3SBjoern A. Zeeb break; 2124da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_RUNNING: 2125da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_ABORTING: 2126da8fa4e3SBjoern A. Zeeb ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq); 2127da8fa4e3SBjoern A. Zeeb 2128da8fa4e3SBjoern A. Zeeb if (ar->scan.is_roc && ar->scan.roc_freq == freq) 2129da8fa4e3SBjoern A. Zeeb complete(&ar->scan.on_channel); 2130da8fa4e3SBjoern A. Zeeb break; 2131da8fa4e3SBjoern A. Zeeb } 2132da8fa4e3SBjoern A. Zeeb } 2133da8fa4e3SBjoern A. Zeeb 2134da8fa4e3SBjoern A. Zeeb static const char * 2135da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type, 2136da8fa4e3SBjoern A. Zeeb enum wmi_scan_completion_reason reason) 2137da8fa4e3SBjoern A. Zeeb { 2138da8fa4e3SBjoern A. Zeeb switch (type) { 2139da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_STARTED: 2140da8fa4e3SBjoern A. Zeeb return "started"; 2141da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_COMPLETED: 2142da8fa4e3SBjoern A. Zeeb switch (reason) { 2143da8fa4e3SBjoern A. Zeeb case WMI_SCAN_REASON_COMPLETED: 2144da8fa4e3SBjoern A. Zeeb return "completed"; 2145da8fa4e3SBjoern A. Zeeb case WMI_SCAN_REASON_CANCELLED: 2146da8fa4e3SBjoern A. Zeeb return "completed [cancelled]"; 2147da8fa4e3SBjoern A. Zeeb case WMI_SCAN_REASON_PREEMPTED: 2148da8fa4e3SBjoern A. Zeeb return "completed [preempted]"; 2149da8fa4e3SBjoern A. Zeeb case WMI_SCAN_REASON_TIMEDOUT: 2150da8fa4e3SBjoern A. Zeeb return "completed [timedout]"; 2151da8fa4e3SBjoern A. Zeeb case WMI_SCAN_REASON_INTERNAL_FAILURE: 2152da8fa4e3SBjoern A. Zeeb return "completed [internal err]"; 2153da8fa4e3SBjoern A. Zeeb case WMI_SCAN_REASON_MAX: 2154da8fa4e3SBjoern A. Zeeb break; 2155da8fa4e3SBjoern A. Zeeb } 2156da8fa4e3SBjoern A. Zeeb return "completed [unknown]"; 2157da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_BSS_CHANNEL: 2158da8fa4e3SBjoern A. Zeeb return "bss channel"; 2159da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_FOREIGN_CHANNEL: 2160da8fa4e3SBjoern A. Zeeb return "foreign channel"; 2161da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_DEQUEUED: 2162da8fa4e3SBjoern A. Zeeb return "dequeued"; 2163da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_PREEMPTED: 2164da8fa4e3SBjoern A. Zeeb return "preempted"; 2165da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_START_FAILED: 2166da8fa4e3SBjoern A. Zeeb return "start failed"; 2167da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_RESTARTED: 2168da8fa4e3SBjoern A. Zeeb return "restarted"; 2169da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT: 2170da8fa4e3SBjoern A. Zeeb return "foreign channel exit"; 2171da8fa4e3SBjoern A. Zeeb default: 2172da8fa4e3SBjoern A. Zeeb return "unknown"; 2173da8fa4e3SBjoern A. Zeeb } 2174da8fa4e3SBjoern A. Zeeb } 2175da8fa4e3SBjoern A. Zeeb 2176da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb, 2177da8fa4e3SBjoern A. Zeeb struct wmi_scan_ev_arg *arg) 2178da8fa4e3SBjoern A. Zeeb { 2179da8fa4e3SBjoern A. Zeeb struct wmi_scan_event *ev = (void *)skb->data; 2180da8fa4e3SBjoern A. Zeeb 2181da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 2182da8fa4e3SBjoern A. Zeeb return -EPROTO; 2183da8fa4e3SBjoern A. Zeeb 2184da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 2185da8fa4e3SBjoern A. Zeeb arg->event_type = ev->event_type; 2186da8fa4e3SBjoern A. Zeeb arg->reason = ev->reason; 2187da8fa4e3SBjoern A. Zeeb arg->channel_freq = ev->channel_freq; 2188da8fa4e3SBjoern A. Zeeb arg->scan_req_id = ev->scan_req_id; 2189da8fa4e3SBjoern A. Zeeb arg->scan_id = ev->scan_id; 2190da8fa4e3SBjoern A. Zeeb arg->vdev_id = ev->vdev_id; 2191da8fa4e3SBjoern A. Zeeb 2192da8fa4e3SBjoern A. Zeeb return 0; 2193da8fa4e3SBjoern A. Zeeb } 2194da8fa4e3SBjoern A. Zeeb 2195da8fa4e3SBjoern A. Zeeb int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb) 2196da8fa4e3SBjoern A. Zeeb { 2197da8fa4e3SBjoern A. Zeeb struct wmi_scan_ev_arg arg = {}; 2198da8fa4e3SBjoern A. Zeeb enum wmi_scan_event_type event_type; 2199da8fa4e3SBjoern A. Zeeb enum wmi_scan_completion_reason reason; 2200da8fa4e3SBjoern A. Zeeb u32 freq; 2201da8fa4e3SBjoern A. Zeeb u32 req_id; 2202da8fa4e3SBjoern A. Zeeb u32 scan_id; 2203da8fa4e3SBjoern A. Zeeb u32 vdev_id; 2204da8fa4e3SBjoern A. Zeeb int ret; 2205da8fa4e3SBjoern A. Zeeb 2206da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_scan(ar, skb, &arg); 2207da8fa4e3SBjoern A. Zeeb if (ret) { 2208da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse scan event: %d\n", ret); 2209da8fa4e3SBjoern A. Zeeb return ret; 2210da8fa4e3SBjoern A. Zeeb } 2211da8fa4e3SBjoern A. Zeeb 2212da8fa4e3SBjoern A. Zeeb event_type = __le32_to_cpu(arg.event_type); 2213da8fa4e3SBjoern A. Zeeb reason = __le32_to_cpu(arg.reason); 2214da8fa4e3SBjoern A. Zeeb freq = __le32_to_cpu(arg.channel_freq); 2215da8fa4e3SBjoern A. Zeeb req_id = __le32_to_cpu(arg.scan_req_id); 2216da8fa4e3SBjoern A. Zeeb scan_id = __le32_to_cpu(arg.scan_id); 2217da8fa4e3SBjoern A. Zeeb vdev_id = __le32_to_cpu(arg.vdev_id); 2218da8fa4e3SBjoern A. Zeeb 2219da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 2220da8fa4e3SBjoern A. Zeeb 2221da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 2222da8fa4e3SBjoern A. Zeeb "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n", 2223da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_type_str(event_type, reason), 2224da8fa4e3SBjoern A. Zeeb event_type, reason, freq, req_id, scan_id, vdev_id, 2225da8fa4e3SBjoern A. Zeeb ath10k_scan_state_str(ar->scan.state), ar->scan.state); 2226da8fa4e3SBjoern A. Zeeb 2227da8fa4e3SBjoern A. Zeeb switch (event_type) { 2228da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_STARTED: 2229da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_started(ar); 2230da8fa4e3SBjoern A. Zeeb break; 2231da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_COMPLETED: 2232da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_completed(ar); 2233da8fa4e3SBjoern A. Zeeb break; 2234da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_BSS_CHANNEL: 2235da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_bss_chan(ar); 2236da8fa4e3SBjoern A. Zeeb break; 2237da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_FOREIGN_CHANNEL: 2238da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_foreign_chan(ar, freq); 2239da8fa4e3SBjoern A. Zeeb break; 2240da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_START_FAILED: 2241da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received scan start failure event\n"); 2242da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan_start_failed(ar); 2243da8fa4e3SBjoern A. Zeeb break; 2244da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_DEQUEUED: 2245da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_PREEMPTED: 2246da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_RESTARTED: 2247da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT: 2248da8fa4e3SBjoern A. Zeeb default: 2249da8fa4e3SBjoern A. Zeeb break; 2250da8fa4e3SBjoern A. Zeeb } 2251da8fa4e3SBjoern A. Zeeb 2252da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 2253da8fa4e3SBjoern A. Zeeb return 0; 2254da8fa4e3SBjoern A. Zeeb } 2255da8fa4e3SBjoern A. Zeeb 2256da8fa4e3SBjoern A. Zeeb /* If keys are configured, HW decrypts all frames 2257da8fa4e3SBjoern A. Zeeb * with protected bit set. Mark such frames as decrypted. 2258da8fa4e3SBjoern A. Zeeb */ 2259da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar, 2260da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 2261da8fa4e3SBjoern A. Zeeb struct ieee80211_rx_status *status) 2262da8fa4e3SBjoern A. Zeeb { 2263da8fa4e3SBjoern A. Zeeb struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 2264da8fa4e3SBjoern A. Zeeb unsigned int hdrlen; 2265da8fa4e3SBjoern A. Zeeb bool peer_key; 2266da8fa4e3SBjoern A. Zeeb u8 *addr, keyidx; 2267da8fa4e3SBjoern A. Zeeb 2268da8fa4e3SBjoern A. Zeeb if (!ieee80211_is_auth(hdr->frame_control) || 2269da8fa4e3SBjoern A. Zeeb !ieee80211_has_protected(hdr->frame_control)) 2270da8fa4e3SBjoern A. Zeeb return; 2271da8fa4e3SBjoern A. Zeeb 2272da8fa4e3SBjoern A. Zeeb hdrlen = ieee80211_hdrlen(hdr->frame_control); 2273da8fa4e3SBjoern A. Zeeb if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN)) 2274da8fa4e3SBjoern A. Zeeb return; 2275da8fa4e3SBjoern A. Zeeb 2276da8fa4e3SBjoern A. Zeeb keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT; 2277da8fa4e3SBjoern A. Zeeb addr = ieee80211_get_SA(hdr); 2278da8fa4e3SBjoern A. Zeeb 2279da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 2280da8fa4e3SBjoern A. Zeeb peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx); 2281da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 2282da8fa4e3SBjoern A. Zeeb 2283da8fa4e3SBjoern A. Zeeb if (peer_key) { 2284da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MAC, 2285da8fa4e3SBjoern A. Zeeb "mac wep key present for peer %pM\n", addr); 2286da8fa4e3SBjoern A. Zeeb status->flag |= RX_FLAG_DECRYPTED; 2287da8fa4e3SBjoern A. Zeeb } 2288da8fa4e3SBjoern A. Zeeb } 2289da8fa4e3SBjoern A. Zeeb 2290da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb, 2291da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_ev_arg *arg) 2292da8fa4e3SBjoern A. Zeeb { 2293da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_event_v1 *ev_v1; 2294da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_event_v2 *ev_v2; 2295da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_hdr_v1 *ev_hdr; 2296da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_ext_info *ext_info; 2297da8fa4e3SBjoern A. Zeeb size_t pull_len; 2298da8fa4e3SBjoern A. Zeeb u32 msdu_len; 2299da8fa4e3SBjoern A. Zeeb u32 len; 2300da8fa4e3SBjoern A. Zeeb 2301da8fa4e3SBjoern A. Zeeb if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, 2302da8fa4e3SBjoern A. Zeeb ar->running_fw->fw_file.fw_features)) { 2303da8fa4e3SBjoern A. Zeeb ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data; 2304da8fa4e3SBjoern A. Zeeb ev_hdr = &ev_v2->hdr.v1; 2305da8fa4e3SBjoern A. Zeeb pull_len = sizeof(*ev_v2); 2306da8fa4e3SBjoern A. Zeeb } else { 2307da8fa4e3SBjoern A. Zeeb ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data; 2308da8fa4e3SBjoern A. Zeeb ev_hdr = &ev_v1->hdr; 2309da8fa4e3SBjoern A. Zeeb pull_len = sizeof(*ev_v1); 2310da8fa4e3SBjoern A. Zeeb } 2311da8fa4e3SBjoern A. Zeeb 2312da8fa4e3SBjoern A. Zeeb if (skb->len < pull_len) 2313da8fa4e3SBjoern A. Zeeb return -EPROTO; 2314da8fa4e3SBjoern A. Zeeb 2315da8fa4e3SBjoern A. Zeeb skb_pull(skb, pull_len); 2316da8fa4e3SBjoern A. Zeeb arg->channel = ev_hdr->channel; 2317da8fa4e3SBjoern A. Zeeb arg->buf_len = ev_hdr->buf_len; 2318da8fa4e3SBjoern A. Zeeb arg->status = ev_hdr->status; 2319da8fa4e3SBjoern A. Zeeb arg->snr = ev_hdr->snr; 2320da8fa4e3SBjoern A. Zeeb arg->phy_mode = ev_hdr->phy_mode; 2321da8fa4e3SBjoern A. Zeeb arg->rate = ev_hdr->rate; 2322da8fa4e3SBjoern A. Zeeb 2323da8fa4e3SBjoern A. Zeeb msdu_len = __le32_to_cpu(arg->buf_len); 2324da8fa4e3SBjoern A. Zeeb if (skb->len < msdu_len) 2325da8fa4e3SBjoern A. Zeeb return -EPROTO; 2326da8fa4e3SBjoern A. Zeeb 2327da8fa4e3SBjoern A. Zeeb if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) { 2328da8fa4e3SBjoern A. Zeeb len = ALIGN(le32_to_cpu(arg->buf_len), 4); 2329da8fa4e3SBjoern A. Zeeb ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len); 2330da8fa4e3SBjoern A. Zeeb memcpy(&arg->ext_info, ext_info, 2331da8fa4e3SBjoern A. Zeeb sizeof(struct wmi_mgmt_rx_ext_info)); 2332da8fa4e3SBjoern A. Zeeb } 2333da8fa4e3SBjoern A. Zeeb /* the WMI buffer might've ended up being padded to 4 bytes due to HTC 2334da8fa4e3SBjoern A. Zeeb * trailer with credit update. Trim the excess garbage. 2335da8fa4e3SBjoern A. Zeeb */ 2336da8fa4e3SBjoern A. Zeeb skb_trim(skb, msdu_len); 2337da8fa4e3SBjoern A. Zeeb 2338da8fa4e3SBjoern A. Zeeb return 0; 2339da8fa4e3SBjoern A. Zeeb } 2340da8fa4e3SBjoern A. Zeeb 2341da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar, 2342da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 2343da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_ev_arg *arg) 2344da8fa4e3SBjoern A. Zeeb { 2345da8fa4e3SBjoern A. Zeeb struct wmi_10_4_mgmt_rx_event *ev; 2346da8fa4e3SBjoern A. Zeeb struct wmi_10_4_mgmt_rx_hdr *ev_hdr; 2347da8fa4e3SBjoern A. Zeeb size_t pull_len; 2348da8fa4e3SBjoern A. Zeeb u32 msdu_len; 2349da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_ext_info *ext_info; 2350da8fa4e3SBjoern A. Zeeb u32 len; 2351da8fa4e3SBjoern A. Zeeb 2352da8fa4e3SBjoern A. Zeeb ev = (struct wmi_10_4_mgmt_rx_event *)skb->data; 2353da8fa4e3SBjoern A. Zeeb ev_hdr = &ev->hdr; 2354da8fa4e3SBjoern A. Zeeb pull_len = sizeof(*ev); 2355da8fa4e3SBjoern A. Zeeb 2356da8fa4e3SBjoern A. Zeeb if (skb->len < pull_len) 2357da8fa4e3SBjoern A. Zeeb return -EPROTO; 2358da8fa4e3SBjoern A. Zeeb 2359da8fa4e3SBjoern A. Zeeb skb_pull(skb, pull_len); 2360da8fa4e3SBjoern A. Zeeb arg->channel = ev_hdr->channel; 2361da8fa4e3SBjoern A. Zeeb arg->buf_len = ev_hdr->buf_len; 2362da8fa4e3SBjoern A. Zeeb arg->status = ev_hdr->status; 2363da8fa4e3SBjoern A. Zeeb arg->snr = ev_hdr->snr; 2364da8fa4e3SBjoern A. Zeeb arg->phy_mode = ev_hdr->phy_mode; 2365da8fa4e3SBjoern A. Zeeb arg->rate = ev_hdr->rate; 2366da8fa4e3SBjoern A. Zeeb 2367da8fa4e3SBjoern A. Zeeb msdu_len = __le32_to_cpu(arg->buf_len); 2368da8fa4e3SBjoern A. Zeeb if (skb->len < msdu_len) 2369da8fa4e3SBjoern A. Zeeb return -EPROTO; 2370da8fa4e3SBjoern A. Zeeb 2371da8fa4e3SBjoern A. Zeeb if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) { 2372da8fa4e3SBjoern A. Zeeb len = ALIGN(le32_to_cpu(arg->buf_len), 4); 2373da8fa4e3SBjoern A. Zeeb ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len); 2374da8fa4e3SBjoern A. Zeeb memcpy(&arg->ext_info, ext_info, 2375da8fa4e3SBjoern A. Zeeb sizeof(struct wmi_mgmt_rx_ext_info)); 2376da8fa4e3SBjoern A. Zeeb } 2377da8fa4e3SBjoern A. Zeeb 2378da8fa4e3SBjoern A. Zeeb /* Make sure bytes added for padding are removed. */ 2379da8fa4e3SBjoern A. Zeeb skb_trim(skb, msdu_len); 2380da8fa4e3SBjoern A. Zeeb 2381da8fa4e3SBjoern A. Zeeb return 0; 2382da8fa4e3SBjoern A. Zeeb } 2383da8fa4e3SBjoern A. Zeeb 2384da8fa4e3SBjoern A. Zeeb static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar, 2385da8fa4e3SBjoern A. Zeeb struct ieee80211_hdr *hdr) 2386da8fa4e3SBjoern A. Zeeb { 2387da8fa4e3SBjoern A. Zeeb if (!ieee80211_has_protected(hdr->frame_control)) 2388da8fa4e3SBjoern A. Zeeb return false; 2389da8fa4e3SBjoern A. Zeeb 2390da8fa4e3SBjoern A. Zeeb /* FW delivers WEP Shared Auth frame with Protected Bit set and 2391da8fa4e3SBjoern A. Zeeb * encrypted payload. However in case of PMF it delivers decrypted 2392da8fa4e3SBjoern A. Zeeb * frames with Protected Bit set. 2393da8fa4e3SBjoern A. Zeeb */ 2394da8fa4e3SBjoern A. Zeeb if (ieee80211_is_auth(hdr->frame_control)) 2395da8fa4e3SBjoern A. Zeeb return false; 2396da8fa4e3SBjoern A. Zeeb 2397da8fa4e3SBjoern A. Zeeb /* qca99x0 based FW delivers broadcast or multicast management frames 2398da8fa4e3SBjoern A. Zeeb * (ex: group privacy action frames in mesh) as encrypted payload. 2399da8fa4e3SBjoern A. Zeeb */ 2400da8fa4e3SBjoern A. Zeeb if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) && 2401da8fa4e3SBjoern A. Zeeb ar->hw_params.sw_decrypt_mcast_mgmt) 2402da8fa4e3SBjoern A. Zeeb return false; 2403da8fa4e3SBjoern A. Zeeb 2404da8fa4e3SBjoern A. Zeeb return true; 2405da8fa4e3SBjoern A. Zeeb } 2406da8fa4e3SBjoern A. Zeeb 2407da8fa4e3SBjoern A. Zeeb static int 2408da8fa4e3SBjoern A. Zeeb wmi_process_mgmt_tx_comp(struct ath10k *ar, struct mgmt_tx_compl_params *param) 2409da8fa4e3SBjoern A. Zeeb { 2410da8fa4e3SBjoern A. Zeeb struct ath10k_mgmt_tx_pkt_addr *pkt_addr; 2411da8fa4e3SBjoern A. Zeeb struct ath10k_wmi *wmi = &ar->wmi; 2412da8fa4e3SBjoern A. Zeeb struct ieee80211_tx_info *info; 2413da8fa4e3SBjoern A. Zeeb struct sk_buff *msdu; 2414da8fa4e3SBjoern A. Zeeb int ret; 2415da8fa4e3SBjoern A. Zeeb 2416da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 2417da8fa4e3SBjoern A. Zeeb 2418da8fa4e3SBjoern A. Zeeb pkt_addr = idr_find(&wmi->mgmt_pending_tx, param->desc_id); 2419da8fa4e3SBjoern A. Zeeb if (!pkt_addr) { 2420da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received mgmt tx completion for invalid msdu_id: %d\n", 2421da8fa4e3SBjoern A. Zeeb param->desc_id); 2422da8fa4e3SBjoern A. Zeeb ret = -ENOENT; 2423da8fa4e3SBjoern A. Zeeb goto out; 2424da8fa4e3SBjoern A. Zeeb } 2425da8fa4e3SBjoern A. Zeeb 2426da8fa4e3SBjoern A. Zeeb msdu = pkt_addr->vaddr; 2427da8fa4e3SBjoern A. Zeeb dma_unmap_single(ar->dev, pkt_addr->paddr, 2428da8fa4e3SBjoern A. Zeeb msdu->len, DMA_TO_DEVICE); 2429da8fa4e3SBjoern A. Zeeb info = IEEE80211_SKB_CB(msdu); 2430da8fa4e3SBjoern A. Zeeb 2431da8fa4e3SBjoern A. Zeeb if (param->status) { 2432da8fa4e3SBjoern A. Zeeb info->flags &= ~IEEE80211_TX_STAT_ACK; 2433da8fa4e3SBjoern A. Zeeb } else { 2434da8fa4e3SBjoern A. Zeeb info->flags |= IEEE80211_TX_STAT_ACK; 2435da8fa4e3SBjoern A. Zeeb info->status.ack_signal = ATH10K_DEFAULT_NOISE_FLOOR + 2436da8fa4e3SBjoern A. Zeeb param->ack_rssi; 2437da8fa4e3SBjoern A. Zeeb info->status.is_valid_ack_signal = true; 2438da8fa4e3SBjoern A. Zeeb } 2439da8fa4e3SBjoern A. Zeeb 2440da8fa4e3SBjoern A. Zeeb ieee80211_tx_status_irqsafe(ar->hw, msdu); 2441da8fa4e3SBjoern A. Zeeb 2442da8fa4e3SBjoern A. Zeeb ret = 0; 2443da8fa4e3SBjoern A. Zeeb 2444da8fa4e3SBjoern A. Zeeb out: 2445da8fa4e3SBjoern A. Zeeb idr_remove(&wmi->mgmt_pending_tx, param->desc_id); 2446da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 2447da8fa4e3SBjoern A. Zeeb return ret; 2448da8fa4e3SBjoern A. Zeeb } 2449da8fa4e3SBjoern A. Zeeb 2450da8fa4e3SBjoern A. Zeeb int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb) 2451da8fa4e3SBjoern A. Zeeb { 2452da8fa4e3SBjoern A. Zeeb struct wmi_tlv_mgmt_tx_compl_ev_arg arg; 2453da8fa4e3SBjoern A. Zeeb struct mgmt_tx_compl_params param; 2454da8fa4e3SBjoern A. Zeeb int ret; 2455da8fa4e3SBjoern A. Zeeb 2456da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_mgmt_tx_compl(ar, skb, &arg); 2457da8fa4e3SBjoern A. Zeeb if (ret) { 2458da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse mgmt comp event: %d\n", ret); 2459da8fa4e3SBjoern A. Zeeb return ret; 2460da8fa4e3SBjoern A. Zeeb } 2461da8fa4e3SBjoern A. Zeeb 2462da8fa4e3SBjoern A. Zeeb memset(¶m, 0, sizeof(struct mgmt_tx_compl_params)); 2463da8fa4e3SBjoern A. Zeeb param.desc_id = __le32_to_cpu(arg.desc_id); 2464da8fa4e3SBjoern A. Zeeb param.status = __le32_to_cpu(arg.status); 2465da8fa4e3SBjoern A. Zeeb 2466da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map)) 2467da8fa4e3SBjoern A. Zeeb param.ack_rssi = __le32_to_cpu(arg.ack_rssi); 2468da8fa4e3SBjoern A. Zeeb 2469da8fa4e3SBjoern A. Zeeb wmi_process_mgmt_tx_comp(ar, ¶m); 2470da8fa4e3SBjoern A. Zeeb 2471da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv evnt mgmt tx completion\n"); 2472da8fa4e3SBjoern A. Zeeb 2473da8fa4e3SBjoern A. Zeeb return 0; 2474da8fa4e3SBjoern A. Zeeb } 2475da8fa4e3SBjoern A. Zeeb 2476da8fa4e3SBjoern A. Zeeb int ath10k_wmi_event_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb) 2477da8fa4e3SBjoern A. Zeeb { 2478da8fa4e3SBjoern A. Zeeb struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg arg; 2479da8fa4e3SBjoern A. Zeeb struct mgmt_tx_compl_params param; 2480da8fa4e3SBjoern A. Zeeb u32 num_reports; 2481da8fa4e3SBjoern A. Zeeb int i, ret; 2482da8fa4e3SBjoern A. Zeeb 2483da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_mgmt_tx_bundle_compl(ar, skb, &arg); 2484da8fa4e3SBjoern A. Zeeb if (ret) { 2485da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse bundle mgmt compl event: %d\n", ret); 2486da8fa4e3SBjoern A. Zeeb return ret; 2487da8fa4e3SBjoern A. Zeeb } 2488da8fa4e3SBjoern A. Zeeb 2489da8fa4e3SBjoern A. Zeeb num_reports = __le32_to_cpu(arg.num_reports); 2490da8fa4e3SBjoern A. Zeeb 2491da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_reports; i++) { 2492da8fa4e3SBjoern A. Zeeb memset(¶m, 0, sizeof(struct mgmt_tx_compl_params)); 2493da8fa4e3SBjoern A. Zeeb param.desc_id = __le32_to_cpu(arg.desc_ids[i]); 2494da8fa4e3SBjoern A. Zeeb param.status = __le32_to_cpu(arg.desc_ids[i]); 2495da8fa4e3SBjoern A. Zeeb 2496da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map)) 2497da8fa4e3SBjoern A. Zeeb param.ack_rssi = __le32_to_cpu(arg.ack_rssi[i]); 2498da8fa4e3SBjoern A. Zeeb wmi_process_mgmt_tx_comp(ar, ¶m); 2499da8fa4e3SBjoern A. Zeeb } 2500da8fa4e3SBjoern A. Zeeb 2501da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv event bundle mgmt tx completion\n"); 2502da8fa4e3SBjoern A. Zeeb 2503da8fa4e3SBjoern A. Zeeb return 0; 2504da8fa4e3SBjoern A. Zeeb } 2505da8fa4e3SBjoern A. Zeeb 2506da8fa4e3SBjoern A. Zeeb int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb) 2507da8fa4e3SBjoern A. Zeeb { 2508da8fa4e3SBjoern A. Zeeb struct wmi_mgmt_rx_ev_arg arg = {}; 2509da8fa4e3SBjoern A. Zeeb struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 2510da8fa4e3SBjoern A. Zeeb struct ieee80211_hdr *hdr; 2511da8fa4e3SBjoern A. Zeeb struct ieee80211_supported_band *sband; 2512da8fa4e3SBjoern A. Zeeb u32 rx_status; 2513da8fa4e3SBjoern A. Zeeb u32 channel; 2514da8fa4e3SBjoern A. Zeeb u32 phy_mode; 2515da8fa4e3SBjoern A. Zeeb u32 snr, rssi; 2516da8fa4e3SBjoern A. Zeeb u32 rate; 2517da8fa4e3SBjoern A. Zeeb u16 fc; 2518da8fa4e3SBjoern A. Zeeb int ret, i; 2519da8fa4e3SBjoern A. Zeeb 2520da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg); 2521da8fa4e3SBjoern A. Zeeb if (ret) { 2522da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret); 2523da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 2524da8fa4e3SBjoern A. Zeeb return ret; 2525da8fa4e3SBjoern A. Zeeb } 2526da8fa4e3SBjoern A. Zeeb 2527da8fa4e3SBjoern A. Zeeb channel = __le32_to_cpu(arg.channel); 2528da8fa4e3SBjoern A. Zeeb rx_status = __le32_to_cpu(arg.status); 2529da8fa4e3SBjoern A. Zeeb snr = __le32_to_cpu(arg.snr); 2530da8fa4e3SBjoern A. Zeeb phy_mode = __le32_to_cpu(arg.phy_mode); 2531da8fa4e3SBjoern A. Zeeb rate = __le32_to_cpu(arg.rate); 2532da8fa4e3SBjoern A. Zeeb 2533da8fa4e3SBjoern A. Zeeb memset(status, 0, sizeof(*status)); 2534da8fa4e3SBjoern A. Zeeb 2535da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, 2536da8fa4e3SBjoern A. Zeeb "event mgmt rx status %08x\n", rx_status); 2537da8fa4e3SBjoern A. Zeeb 2538da8fa4e3SBjoern A. Zeeb if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) || 2539da8fa4e3SBjoern A. Zeeb (rx_status & (WMI_RX_STATUS_ERR_DECRYPT | 2540da8fa4e3SBjoern A. Zeeb WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) { 2541da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 2542da8fa4e3SBjoern A. Zeeb return 0; 2543da8fa4e3SBjoern A. Zeeb } 2544da8fa4e3SBjoern A. Zeeb 2545da8fa4e3SBjoern A. Zeeb if (rx_status & WMI_RX_STATUS_ERR_MIC) 2546da8fa4e3SBjoern A. Zeeb status->flag |= RX_FLAG_MMIC_ERROR; 2547da8fa4e3SBjoern A. Zeeb 2548da8fa4e3SBjoern A. Zeeb if (rx_status & WMI_RX_STATUS_EXT_INFO) { 2549da8fa4e3SBjoern A. Zeeb status->mactime = 2550da8fa4e3SBjoern A. Zeeb __le64_to_cpu(arg.ext_info.rx_mac_timestamp); 2551da8fa4e3SBjoern A. Zeeb status->flag |= RX_FLAG_MACTIME_END; 2552da8fa4e3SBjoern A. Zeeb } 2553da8fa4e3SBjoern A. Zeeb /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to 2554da8fa4e3SBjoern A. Zeeb * MODE_11B. This means phy_mode is not a reliable source for the band 2555da8fa4e3SBjoern A. Zeeb * of mgmt rx. 2556da8fa4e3SBjoern A. Zeeb */ 2557da8fa4e3SBjoern A. Zeeb if (channel >= 1 && channel <= 14) { 2558da8fa4e3SBjoern A. Zeeb status->band = NL80211_BAND_2GHZ; 2559da8fa4e3SBjoern A. Zeeb } else if (channel >= 36 && channel <= ATH10K_MAX_5G_CHAN) { 2560da8fa4e3SBjoern A. Zeeb status->band = NL80211_BAND_5GHZ; 2561da8fa4e3SBjoern A. Zeeb } else { 2562da8fa4e3SBjoern A. Zeeb /* Shouldn't happen unless list of advertised channels to 2563da8fa4e3SBjoern A. Zeeb * mac80211 has been changed. 2564da8fa4e3SBjoern A. Zeeb */ 2565da8fa4e3SBjoern A. Zeeb WARN_ON_ONCE(1); 2566da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 2567da8fa4e3SBjoern A. Zeeb return 0; 2568da8fa4e3SBjoern A. Zeeb } 2569da8fa4e3SBjoern A. Zeeb 2570da8fa4e3SBjoern A. Zeeb if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ) 2571da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n"); 2572da8fa4e3SBjoern A. Zeeb 2573da8fa4e3SBjoern A. Zeeb sband = &ar->mac.sbands[status->band]; 2574da8fa4e3SBjoern A. Zeeb 2575da8fa4e3SBjoern A. Zeeb status->freq = ieee80211_channel_to_frequency(channel, status->band); 2576da8fa4e3SBjoern A. Zeeb status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR; 2577da8fa4e3SBjoern A. Zeeb 2578da8fa4e3SBjoern A. Zeeb BUILD_BUG_ON(ARRAY_SIZE(status->chain_signal) != ARRAY_SIZE(arg.rssi)); 2579da8fa4e3SBjoern A. Zeeb 2580da8fa4e3SBjoern A. Zeeb for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { 2581da8fa4e3SBjoern A. Zeeb status->chains &= ~BIT(i); 2582da8fa4e3SBjoern A. Zeeb rssi = __le32_to_cpu(arg.rssi[i]); 2583da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt rssi[%d]:%d\n", i, arg.rssi[i]); 2584da8fa4e3SBjoern A. Zeeb 2585da8fa4e3SBjoern A. Zeeb if (rssi != ATH10K_INVALID_RSSI && rssi != 0) { 2586da8fa4e3SBjoern A. Zeeb status->chain_signal[i] = ATH10K_DEFAULT_NOISE_FLOOR + rssi; 2587da8fa4e3SBjoern A. Zeeb status->chains |= BIT(i); 2588da8fa4e3SBjoern A. Zeeb } 2589da8fa4e3SBjoern A. Zeeb } 2590da8fa4e3SBjoern A. Zeeb 2591da8fa4e3SBjoern A. Zeeb status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100); 2592da8fa4e3SBjoern A. Zeeb 2593da8fa4e3SBjoern A. Zeeb hdr = (struct ieee80211_hdr *)skb->data; 2594da8fa4e3SBjoern A. Zeeb fc = le16_to_cpu(hdr->frame_control); 2595da8fa4e3SBjoern A. Zeeb 2596da8fa4e3SBjoern A. Zeeb /* Firmware is guaranteed to report all essential management frames via 2597da8fa4e3SBjoern A. Zeeb * WMI while it can deliver some extra via HTT. Since there can be 2598da8fa4e3SBjoern A. Zeeb * duplicates split the reporting wrt monitor/sniffing. 2599da8fa4e3SBjoern A. Zeeb */ 2600da8fa4e3SBjoern A. Zeeb status->flag |= RX_FLAG_SKIP_MONITOR; 2601da8fa4e3SBjoern A. Zeeb 2602da8fa4e3SBjoern A. Zeeb ath10k_wmi_handle_wep_reauth(ar, skb, status); 2603da8fa4e3SBjoern A. Zeeb 2604da8fa4e3SBjoern A. Zeeb if (ath10k_wmi_rx_is_decrypted(ar, hdr)) { 2605da8fa4e3SBjoern A. Zeeb status->flag |= RX_FLAG_DECRYPTED; 2606da8fa4e3SBjoern A. Zeeb 2607da8fa4e3SBjoern A. Zeeb if (!ieee80211_is_action(hdr->frame_control) && 2608da8fa4e3SBjoern A. Zeeb !ieee80211_is_deauth(hdr->frame_control) && 2609da8fa4e3SBjoern A. Zeeb !ieee80211_is_disassoc(hdr->frame_control)) { 2610da8fa4e3SBjoern A. Zeeb status->flag |= RX_FLAG_IV_STRIPPED | 2611da8fa4e3SBjoern A. Zeeb RX_FLAG_MMIC_STRIPPED; 2612da8fa4e3SBjoern A. Zeeb hdr->frame_control = __cpu_to_le16(fc & 2613da8fa4e3SBjoern A. Zeeb ~IEEE80211_FCTL_PROTECTED); 2614da8fa4e3SBjoern A. Zeeb } 2615da8fa4e3SBjoern A. Zeeb } 2616da8fa4e3SBjoern A. Zeeb 2617da8fa4e3SBjoern A. Zeeb if (ieee80211_is_beacon(hdr->frame_control)) 2618da8fa4e3SBjoern A. Zeeb ath10k_mac_handle_beacon(ar, skb); 2619da8fa4e3SBjoern A. Zeeb 2620da8fa4e3SBjoern A. Zeeb if (ieee80211_is_beacon(hdr->frame_control) || 2621da8fa4e3SBjoern A. Zeeb ieee80211_is_probe_resp(hdr->frame_control)) { 2622da8fa4e3SBjoern A. Zeeb struct ieee80211_mgmt *mgmt = (void *)skb->data; 2623da8fa4e3SBjoern A. Zeeb enum cfg80211_bss_frame_type ftype; 2624da8fa4e3SBjoern A. Zeeb u8 *ies; 2625da8fa4e3SBjoern A. Zeeb int ies_ch; 2626da8fa4e3SBjoern A. Zeeb 2627da8fa4e3SBjoern A. Zeeb status->boottime_ns = ktime_get_boottime_ns(); 2628da8fa4e3SBjoern A. Zeeb 2629da8fa4e3SBjoern A. Zeeb if (!ar->scan_channel) 2630da8fa4e3SBjoern A. Zeeb goto drop; 2631da8fa4e3SBjoern A. Zeeb 2632da8fa4e3SBjoern A. Zeeb ies = mgmt->u.beacon.variable; 2633da8fa4e3SBjoern A. Zeeb 2634da8fa4e3SBjoern A. Zeeb if (ieee80211_is_beacon(mgmt->frame_control)) 2635da8fa4e3SBjoern A. Zeeb ftype = CFG80211_BSS_FTYPE_BEACON; 2636da8fa4e3SBjoern A. Zeeb else 2637da8fa4e3SBjoern A. Zeeb ftype = CFG80211_BSS_FTYPE_PRESP; 2638da8fa4e3SBjoern A. Zeeb 2639da8fa4e3SBjoern A. Zeeb ies_ch = cfg80211_get_ies_channel_number(mgmt->u.beacon.variable, 2640da8fa4e3SBjoern A. Zeeb skb_tail_pointer(skb) - ies, 2641da8fa4e3SBjoern A. Zeeb sband->band, ftype); 2642da8fa4e3SBjoern A. Zeeb 2643da8fa4e3SBjoern A. Zeeb if (ies_ch > 0 && ies_ch != channel) { 2644da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, 2645da8fa4e3SBjoern A. Zeeb "channel mismatched ds channel %d scan channel %d\n", 2646da8fa4e3SBjoern A. Zeeb ies_ch, channel); 2647da8fa4e3SBjoern A. Zeeb goto drop; 2648da8fa4e3SBjoern A. Zeeb } 2649da8fa4e3SBjoern A. Zeeb } 2650da8fa4e3SBjoern A. Zeeb 2651da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, 2652da8fa4e3SBjoern A. Zeeb "event mgmt rx skb %pK len %d ftype %02x stype %02x\n", 2653da8fa4e3SBjoern A. Zeeb skb, skb->len, 2654da8fa4e3SBjoern A. Zeeb fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE); 2655da8fa4e3SBjoern A. Zeeb 2656da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, 2657da8fa4e3SBjoern A. Zeeb "event mgmt rx freq %d band %d snr %d, rate_idx %d\n", 2658da8fa4e3SBjoern A. Zeeb status->freq, status->band, status->signal, 2659da8fa4e3SBjoern A. Zeeb status->rate_idx); 2660da8fa4e3SBjoern A. Zeeb 2661da8fa4e3SBjoern A. Zeeb ieee80211_rx_ni(ar->hw, skb); 2662da8fa4e3SBjoern A. Zeeb 2663da8fa4e3SBjoern A. Zeeb return 0; 2664da8fa4e3SBjoern A. Zeeb 2665da8fa4e3SBjoern A. Zeeb drop: 2666da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 2667da8fa4e3SBjoern A. Zeeb return 0; 2668da8fa4e3SBjoern A. Zeeb } 2669da8fa4e3SBjoern A. Zeeb 2670da8fa4e3SBjoern A. Zeeb static int freq_to_idx(struct ath10k *ar, int freq) 2671da8fa4e3SBjoern A. Zeeb { 2672da8fa4e3SBjoern A. Zeeb struct ieee80211_supported_band *sband; 2673da8fa4e3SBjoern A. Zeeb int band, ch, idx = 0; 2674da8fa4e3SBjoern A. Zeeb 2675da8fa4e3SBjoern A. Zeeb for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) { 2676da8fa4e3SBjoern A. Zeeb sband = ar->hw->wiphy->bands[band]; 2677da8fa4e3SBjoern A. Zeeb if (!sband) 2678da8fa4e3SBjoern A. Zeeb continue; 2679da8fa4e3SBjoern A. Zeeb 2680da8fa4e3SBjoern A. Zeeb for (ch = 0; ch < sband->n_channels; ch++, idx++) 2681da8fa4e3SBjoern A. Zeeb if (sband->channels[ch].center_freq == freq) 2682da8fa4e3SBjoern A. Zeeb goto exit; 2683da8fa4e3SBjoern A. Zeeb } 2684da8fa4e3SBjoern A. Zeeb 2685da8fa4e3SBjoern A. Zeeb exit: 2686da8fa4e3SBjoern A. Zeeb return idx; 2687da8fa4e3SBjoern A. Zeeb } 2688da8fa4e3SBjoern A. Zeeb 2689da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb, 2690da8fa4e3SBjoern A. Zeeb struct wmi_ch_info_ev_arg *arg) 2691da8fa4e3SBjoern A. Zeeb { 2692da8fa4e3SBjoern A. Zeeb struct wmi_chan_info_event *ev = (void *)skb->data; 2693da8fa4e3SBjoern A. Zeeb 2694da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 2695da8fa4e3SBjoern A. Zeeb return -EPROTO; 2696da8fa4e3SBjoern A. Zeeb 2697da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 2698da8fa4e3SBjoern A. Zeeb arg->err_code = ev->err_code; 2699da8fa4e3SBjoern A. Zeeb arg->freq = ev->freq; 2700da8fa4e3SBjoern A. Zeeb arg->cmd_flags = ev->cmd_flags; 2701da8fa4e3SBjoern A. Zeeb arg->noise_floor = ev->noise_floor; 2702da8fa4e3SBjoern A. Zeeb arg->rx_clear_count = ev->rx_clear_count; 2703da8fa4e3SBjoern A. Zeeb arg->cycle_count = ev->cycle_count; 2704da8fa4e3SBjoern A. Zeeb 2705da8fa4e3SBjoern A. Zeeb return 0; 2706da8fa4e3SBjoern A. Zeeb } 2707da8fa4e3SBjoern A. Zeeb 2708da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar, 2709da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 2710da8fa4e3SBjoern A. Zeeb struct wmi_ch_info_ev_arg *arg) 2711da8fa4e3SBjoern A. Zeeb { 2712da8fa4e3SBjoern A. Zeeb struct wmi_10_4_chan_info_event *ev = (void *)skb->data; 2713da8fa4e3SBjoern A. Zeeb 2714da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 2715da8fa4e3SBjoern A. Zeeb return -EPROTO; 2716da8fa4e3SBjoern A. Zeeb 2717da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 2718da8fa4e3SBjoern A. Zeeb arg->err_code = ev->err_code; 2719da8fa4e3SBjoern A. Zeeb arg->freq = ev->freq; 2720da8fa4e3SBjoern A. Zeeb arg->cmd_flags = ev->cmd_flags; 2721da8fa4e3SBjoern A. Zeeb arg->noise_floor = ev->noise_floor; 2722da8fa4e3SBjoern A. Zeeb arg->rx_clear_count = ev->rx_clear_count; 2723da8fa4e3SBjoern A. Zeeb arg->cycle_count = ev->cycle_count; 2724da8fa4e3SBjoern A. Zeeb arg->chan_tx_pwr_range = ev->chan_tx_pwr_range; 2725da8fa4e3SBjoern A. Zeeb arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp; 2726da8fa4e3SBjoern A. Zeeb arg->rx_frame_count = ev->rx_frame_count; 2727da8fa4e3SBjoern A. Zeeb 2728da8fa4e3SBjoern A. Zeeb return 0; 2729da8fa4e3SBjoern A. Zeeb } 2730da8fa4e3SBjoern A. Zeeb 2731da8fa4e3SBjoern A. Zeeb /* 2732da8fa4e3SBjoern A. Zeeb * Handle the channel info event for firmware which only sends one 2733da8fa4e3SBjoern A. Zeeb * chan_info event per scanned channel. 2734da8fa4e3SBjoern A. Zeeb */ 2735da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_chan_info_unpaired(struct ath10k *ar, 2736da8fa4e3SBjoern A. Zeeb struct chan_info_params *params) 2737da8fa4e3SBjoern A. Zeeb { 2738da8fa4e3SBjoern A. Zeeb struct survey_info *survey; 2739da8fa4e3SBjoern A. Zeeb int idx; 2740da8fa4e3SBjoern A. Zeeb 2741da8fa4e3SBjoern A. Zeeb if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) { 2742da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "chan info report completed\n"); 2743da8fa4e3SBjoern A. Zeeb return; 2744da8fa4e3SBjoern A. Zeeb } 2745da8fa4e3SBjoern A. Zeeb 2746da8fa4e3SBjoern A. Zeeb idx = freq_to_idx(ar, params->freq); 2747da8fa4e3SBjoern A. Zeeb if (idx >= ARRAY_SIZE(ar->survey)) { 2748da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n", 2749da8fa4e3SBjoern A. Zeeb params->freq, idx); 2750da8fa4e3SBjoern A. Zeeb return; 2751da8fa4e3SBjoern A. Zeeb } 2752da8fa4e3SBjoern A. Zeeb 2753da8fa4e3SBjoern A. Zeeb survey = &ar->survey[idx]; 2754da8fa4e3SBjoern A. Zeeb 2755da8fa4e3SBjoern A. Zeeb if (!params->mac_clk_mhz) 2756da8fa4e3SBjoern A. Zeeb return; 2757da8fa4e3SBjoern A. Zeeb 2758da8fa4e3SBjoern A. Zeeb memset(survey, 0, sizeof(*survey)); 2759da8fa4e3SBjoern A. Zeeb 2760da8fa4e3SBjoern A. Zeeb survey->noise = params->noise_floor; 2761da8fa4e3SBjoern A. Zeeb survey->time = (params->cycle_count / params->mac_clk_mhz) / 1000; 2762da8fa4e3SBjoern A. Zeeb survey->time_busy = (params->rx_clear_count / params->mac_clk_mhz) / 1000; 2763da8fa4e3SBjoern A. Zeeb survey->filled |= SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME | 2764da8fa4e3SBjoern A. Zeeb SURVEY_INFO_TIME_BUSY; 2765da8fa4e3SBjoern A. Zeeb } 2766da8fa4e3SBjoern A. Zeeb 2767da8fa4e3SBjoern A. Zeeb /* 2768da8fa4e3SBjoern A. Zeeb * Handle the channel info event for firmware which sends chan_info 2769da8fa4e3SBjoern A. Zeeb * event in pairs(start and stop events) for every scanned channel. 2770da8fa4e3SBjoern A. Zeeb */ 2771da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_chan_info_paired(struct ath10k *ar, 2772da8fa4e3SBjoern A. Zeeb struct chan_info_params *params) 2773da8fa4e3SBjoern A. Zeeb { 2774da8fa4e3SBjoern A. Zeeb struct survey_info *survey; 2775da8fa4e3SBjoern A. Zeeb int idx; 2776da8fa4e3SBjoern A. Zeeb 2777da8fa4e3SBjoern A. Zeeb idx = freq_to_idx(ar, params->freq); 2778da8fa4e3SBjoern A. Zeeb if (idx >= ARRAY_SIZE(ar->survey)) { 2779da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n", 2780da8fa4e3SBjoern A. Zeeb params->freq, idx); 2781da8fa4e3SBjoern A. Zeeb return; 2782da8fa4e3SBjoern A. Zeeb } 2783da8fa4e3SBjoern A. Zeeb 2784da8fa4e3SBjoern A. Zeeb if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) { 2785da8fa4e3SBjoern A. Zeeb if (ar->ch_info_can_report_survey) { 2786da8fa4e3SBjoern A. Zeeb survey = &ar->survey[idx]; 2787da8fa4e3SBjoern A. Zeeb survey->noise = params->noise_floor; 2788da8fa4e3SBjoern A. Zeeb survey->filled = SURVEY_INFO_NOISE_DBM; 2789da8fa4e3SBjoern A. Zeeb 2790da8fa4e3SBjoern A. Zeeb ath10k_hw_fill_survey_time(ar, 2791da8fa4e3SBjoern A. Zeeb survey, 2792da8fa4e3SBjoern A. Zeeb params->cycle_count, 2793da8fa4e3SBjoern A. Zeeb params->rx_clear_count, 2794da8fa4e3SBjoern A. Zeeb ar->survey_last_cycle_count, 2795da8fa4e3SBjoern A. Zeeb ar->survey_last_rx_clear_count); 2796da8fa4e3SBjoern A. Zeeb } 2797da8fa4e3SBjoern A. Zeeb 2798da8fa4e3SBjoern A. Zeeb ar->ch_info_can_report_survey = false; 2799da8fa4e3SBjoern A. Zeeb } else { 2800da8fa4e3SBjoern A. Zeeb ar->ch_info_can_report_survey = true; 2801da8fa4e3SBjoern A. Zeeb } 2802da8fa4e3SBjoern A. Zeeb 2803da8fa4e3SBjoern A. Zeeb if (!(params->cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) { 2804da8fa4e3SBjoern A. Zeeb ar->survey_last_rx_clear_count = params->rx_clear_count; 2805da8fa4e3SBjoern A. Zeeb ar->survey_last_cycle_count = params->cycle_count; 2806da8fa4e3SBjoern A. Zeeb } 2807da8fa4e3SBjoern A. Zeeb } 2808da8fa4e3SBjoern A. Zeeb 2809da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb) 2810da8fa4e3SBjoern A. Zeeb { 2811da8fa4e3SBjoern A. Zeeb struct chan_info_params ch_info_param; 2812da8fa4e3SBjoern A. Zeeb struct wmi_ch_info_ev_arg arg = {}; 2813da8fa4e3SBjoern A. Zeeb int ret; 2814da8fa4e3SBjoern A. Zeeb 2815da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_ch_info(ar, skb, &arg); 2816da8fa4e3SBjoern A. Zeeb if (ret) { 2817da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse chan info event: %d\n", ret); 2818da8fa4e3SBjoern A. Zeeb return; 2819da8fa4e3SBjoern A. Zeeb } 2820da8fa4e3SBjoern A. Zeeb 2821da8fa4e3SBjoern A. Zeeb ch_info_param.err_code = __le32_to_cpu(arg.err_code); 2822da8fa4e3SBjoern A. Zeeb ch_info_param.freq = __le32_to_cpu(arg.freq); 2823da8fa4e3SBjoern A. Zeeb ch_info_param.cmd_flags = __le32_to_cpu(arg.cmd_flags); 2824da8fa4e3SBjoern A. Zeeb ch_info_param.noise_floor = __le32_to_cpu(arg.noise_floor); 2825da8fa4e3SBjoern A. Zeeb ch_info_param.rx_clear_count = __le32_to_cpu(arg.rx_clear_count); 2826da8fa4e3SBjoern A. Zeeb ch_info_param.cycle_count = __le32_to_cpu(arg.cycle_count); 2827da8fa4e3SBjoern A. Zeeb ch_info_param.mac_clk_mhz = __le32_to_cpu(arg.mac_clk_mhz); 2828da8fa4e3SBjoern A. Zeeb 2829da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 2830da8fa4e3SBjoern A. Zeeb "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n", 2831da8fa4e3SBjoern A. Zeeb ch_info_param.err_code, ch_info_param.freq, ch_info_param.cmd_flags, 2832da8fa4e3SBjoern A. Zeeb ch_info_param.noise_floor, ch_info_param.rx_clear_count, 2833da8fa4e3SBjoern A. Zeeb ch_info_param.cycle_count); 2834da8fa4e3SBjoern A. Zeeb 2835da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 2836da8fa4e3SBjoern A. Zeeb 2837da8fa4e3SBjoern A. Zeeb switch (ar->scan.state) { 2838da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_IDLE: 2839da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_STARTING: 2840da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "received chan info event without a scan request, ignoring\n"); 2841da8fa4e3SBjoern A. Zeeb goto exit; 2842da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_RUNNING: 2843da8fa4e3SBjoern A. Zeeb case ATH10K_SCAN_ABORTING: 2844da8fa4e3SBjoern A. Zeeb break; 2845da8fa4e3SBjoern A. Zeeb } 2846da8fa4e3SBjoern A. Zeeb 2847da8fa4e3SBjoern A. Zeeb if (test_bit(ATH10K_FW_FEATURE_SINGLE_CHAN_INFO_PER_CHANNEL, 2848da8fa4e3SBjoern A. Zeeb ar->running_fw->fw_file.fw_features)) 2849da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_chan_info_unpaired(ar, &ch_info_param); 2850da8fa4e3SBjoern A. Zeeb else 2851da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_chan_info_paired(ar, &ch_info_param); 2852da8fa4e3SBjoern A. Zeeb 2853da8fa4e3SBjoern A. Zeeb exit: 2854da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 2855da8fa4e3SBjoern A. Zeeb } 2856da8fa4e3SBjoern A. Zeeb 2857da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb) 2858da8fa4e3SBjoern A. Zeeb { 2859da8fa4e3SBjoern A. Zeeb struct wmi_echo_ev_arg arg = {}; 2860da8fa4e3SBjoern A. Zeeb int ret; 2861da8fa4e3SBjoern A. Zeeb 2862da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg); 2863da8fa4e3SBjoern A. Zeeb if (ret) { 2864da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse echo: %d\n", ret); 2865da8fa4e3SBjoern A. Zeeb return; 2866da8fa4e3SBjoern A. Zeeb } 2867da8fa4e3SBjoern A. Zeeb 2868da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 2869da8fa4e3SBjoern A. Zeeb "wmi event echo value 0x%08x\n", 2870da8fa4e3SBjoern A. Zeeb le32_to_cpu(arg.value)); 2871da8fa4e3SBjoern A. Zeeb 2872da8fa4e3SBjoern A. Zeeb if (le32_to_cpu(arg.value) == ATH10K_WMI_BARRIER_ECHO_ID) 2873da8fa4e3SBjoern A. Zeeb complete(&ar->wmi.barrier); 2874da8fa4e3SBjoern A. Zeeb } 2875da8fa4e3SBjoern A. Zeeb 2876da8fa4e3SBjoern A. Zeeb int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb) 2877da8fa4e3SBjoern A. Zeeb { 2878da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n", 2879da8fa4e3SBjoern A. Zeeb skb->len); 2880da8fa4e3SBjoern A. Zeeb 2881da8fa4e3SBjoern A. Zeeb trace_ath10k_wmi_dbglog(ar, skb->data, skb->len); 2882da8fa4e3SBjoern A. Zeeb #if defined(CONFIG_FWLOG) 2883da8fa4e3SBjoern A. Zeeb ath10k_handle_fwlog_msg(ar, skb); 2884da8fa4e3SBjoern A. Zeeb #endif 2885da8fa4e3SBjoern A. Zeeb 2886da8fa4e3SBjoern A. Zeeb return 0; 2887da8fa4e3SBjoern A. Zeeb } 2888da8fa4e3SBjoern A. Zeeb 2889da8fa4e3SBjoern A. Zeeb void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src, 2890da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst) 2891da8fa4e3SBjoern A. Zeeb { 2892da8fa4e3SBjoern A. Zeeb dst->ch_noise_floor = __le32_to_cpu(src->chan_nf); 2893da8fa4e3SBjoern A. Zeeb dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count); 2894da8fa4e3SBjoern A. Zeeb dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count); 2895da8fa4e3SBjoern A. Zeeb dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count); 2896da8fa4e3SBjoern A. Zeeb dst->cycle_count = __le32_to_cpu(src->cycle_count); 2897da8fa4e3SBjoern A. Zeeb dst->phy_err_count = __le32_to_cpu(src->phy_err_count); 2898da8fa4e3SBjoern A. Zeeb dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr); 2899da8fa4e3SBjoern A. Zeeb } 2900da8fa4e3SBjoern A. Zeeb 2901da8fa4e3SBjoern A. Zeeb void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src, 2902da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst) 2903da8fa4e3SBjoern A. Zeeb { 2904da8fa4e3SBjoern A. Zeeb dst->comp_queued = __le32_to_cpu(src->comp_queued); 2905da8fa4e3SBjoern A. Zeeb dst->comp_delivered = __le32_to_cpu(src->comp_delivered); 2906da8fa4e3SBjoern A. Zeeb dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued); 2907da8fa4e3SBjoern A. Zeeb dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued); 2908da8fa4e3SBjoern A. Zeeb dst->wmm_drop = __le32_to_cpu(src->wmm_drop); 2909da8fa4e3SBjoern A. Zeeb dst->local_enqued = __le32_to_cpu(src->local_enqued); 2910da8fa4e3SBjoern A. Zeeb dst->local_freed = __le32_to_cpu(src->local_freed); 2911da8fa4e3SBjoern A. Zeeb dst->hw_queued = __le32_to_cpu(src->hw_queued); 2912da8fa4e3SBjoern A. Zeeb dst->hw_reaped = __le32_to_cpu(src->hw_reaped); 2913da8fa4e3SBjoern A. Zeeb dst->underrun = __le32_to_cpu(src->underrun); 2914da8fa4e3SBjoern A. Zeeb dst->tx_abort = __le32_to_cpu(src->tx_abort); 2915da8fa4e3SBjoern A. Zeeb dst->mpdus_requeued = __le32_to_cpu(src->mpdus_requeued); 2916da8fa4e3SBjoern A. Zeeb dst->tx_ko = __le32_to_cpu(src->tx_ko); 2917da8fa4e3SBjoern A. Zeeb dst->data_rc = __le32_to_cpu(src->data_rc); 2918da8fa4e3SBjoern A. Zeeb dst->self_triggers = __le32_to_cpu(src->self_triggers); 2919da8fa4e3SBjoern A. Zeeb dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure); 2920da8fa4e3SBjoern A. Zeeb dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err); 2921da8fa4e3SBjoern A. Zeeb dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry); 2922da8fa4e3SBjoern A. Zeeb dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout); 2923da8fa4e3SBjoern A. Zeeb dst->pdev_resets = __le32_to_cpu(src->pdev_resets); 2924da8fa4e3SBjoern A. Zeeb dst->phy_underrun = __le32_to_cpu(src->phy_underrun); 2925da8fa4e3SBjoern A. Zeeb dst->txop_ovf = __le32_to_cpu(src->txop_ovf); 2926da8fa4e3SBjoern A. Zeeb } 2927da8fa4e3SBjoern A. Zeeb 2928da8fa4e3SBjoern A. Zeeb static void 2929da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src, 2930da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst) 2931da8fa4e3SBjoern A. Zeeb { 2932da8fa4e3SBjoern A. Zeeb dst->comp_queued = __le32_to_cpu(src->comp_queued); 2933da8fa4e3SBjoern A. Zeeb dst->comp_delivered = __le32_to_cpu(src->comp_delivered); 2934da8fa4e3SBjoern A. Zeeb dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued); 2935da8fa4e3SBjoern A. Zeeb dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued); 2936da8fa4e3SBjoern A. Zeeb dst->wmm_drop = __le32_to_cpu(src->wmm_drop); 2937da8fa4e3SBjoern A. Zeeb dst->local_enqued = __le32_to_cpu(src->local_enqued); 2938da8fa4e3SBjoern A. Zeeb dst->local_freed = __le32_to_cpu(src->local_freed); 2939da8fa4e3SBjoern A. Zeeb dst->hw_queued = __le32_to_cpu(src->hw_queued); 2940da8fa4e3SBjoern A. Zeeb dst->hw_reaped = __le32_to_cpu(src->hw_reaped); 2941da8fa4e3SBjoern A. Zeeb dst->underrun = __le32_to_cpu(src->underrun); 2942da8fa4e3SBjoern A. Zeeb dst->tx_abort = __le32_to_cpu(src->tx_abort); 2943da8fa4e3SBjoern A. Zeeb dst->mpdus_requeued = __le32_to_cpu(src->mpdus_requeued); 2944da8fa4e3SBjoern A. Zeeb dst->tx_ko = __le32_to_cpu(src->tx_ko); 2945da8fa4e3SBjoern A. Zeeb dst->data_rc = __le32_to_cpu(src->data_rc); 2946da8fa4e3SBjoern A. Zeeb dst->self_triggers = __le32_to_cpu(src->self_triggers); 2947da8fa4e3SBjoern A. Zeeb dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure); 2948da8fa4e3SBjoern A. Zeeb dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err); 2949da8fa4e3SBjoern A. Zeeb dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry); 2950da8fa4e3SBjoern A. Zeeb dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout); 2951da8fa4e3SBjoern A. Zeeb dst->pdev_resets = __le32_to_cpu(src->pdev_resets); 2952da8fa4e3SBjoern A. Zeeb dst->phy_underrun = __le32_to_cpu(src->phy_underrun); 2953da8fa4e3SBjoern A. Zeeb dst->txop_ovf = __le32_to_cpu(src->txop_ovf); 2954da8fa4e3SBjoern A. Zeeb dst->hw_paused = __le32_to_cpu(src->hw_paused); 2955da8fa4e3SBjoern A. Zeeb dst->seq_posted = __le32_to_cpu(src->seq_posted); 2956da8fa4e3SBjoern A. Zeeb dst->seq_failed_queueing = 2957da8fa4e3SBjoern A. Zeeb __le32_to_cpu(src->seq_failed_queueing); 2958da8fa4e3SBjoern A. Zeeb dst->seq_completed = __le32_to_cpu(src->seq_completed); 2959da8fa4e3SBjoern A. Zeeb dst->seq_restarted = __le32_to_cpu(src->seq_restarted); 2960da8fa4e3SBjoern A. Zeeb dst->mu_seq_posted = __le32_to_cpu(src->mu_seq_posted); 2961da8fa4e3SBjoern A. Zeeb dst->mpdus_sw_flush = __le32_to_cpu(src->mpdus_sw_flush); 2962da8fa4e3SBjoern A. Zeeb dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter); 2963da8fa4e3SBjoern A. Zeeb dst->mpdus_truncated = __le32_to_cpu(src->mpdus_truncated); 2964da8fa4e3SBjoern A. Zeeb dst->mpdus_ack_failed = __le32_to_cpu(src->mpdus_ack_failed); 2965da8fa4e3SBjoern A. Zeeb dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter); 2966da8fa4e3SBjoern A. Zeeb dst->mpdus_expired = __le32_to_cpu(src->mpdus_expired); 2967da8fa4e3SBjoern A. Zeeb } 2968da8fa4e3SBjoern A. Zeeb 2969da8fa4e3SBjoern A. Zeeb void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src, 2970da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst) 2971da8fa4e3SBjoern A. Zeeb { 2972da8fa4e3SBjoern A. Zeeb dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change); 2973da8fa4e3SBjoern A. Zeeb dst->status_rcvd = __le32_to_cpu(src->status_rcvd); 2974da8fa4e3SBjoern A. Zeeb dst->r0_frags = __le32_to_cpu(src->r0_frags); 2975da8fa4e3SBjoern A. Zeeb dst->r1_frags = __le32_to_cpu(src->r1_frags); 2976da8fa4e3SBjoern A. Zeeb dst->r2_frags = __le32_to_cpu(src->r2_frags); 2977da8fa4e3SBjoern A. Zeeb dst->r3_frags = __le32_to_cpu(src->r3_frags); 2978da8fa4e3SBjoern A. Zeeb dst->htt_msdus = __le32_to_cpu(src->htt_msdus); 2979da8fa4e3SBjoern A. Zeeb dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus); 2980da8fa4e3SBjoern A. Zeeb dst->loc_msdus = __le32_to_cpu(src->loc_msdus); 2981da8fa4e3SBjoern A. Zeeb dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus); 2982da8fa4e3SBjoern A. Zeeb dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu); 2983da8fa4e3SBjoern A. Zeeb dst->phy_errs = __le32_to_cpu(src->phy_errs); 2984da8fa4e3SBjoern A. Zeeb dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop); 2985da8fa4e3SBjoern A. Zeeb dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs); 2986da8fa4e3SBjoern A. Zeeb } 2987da8fa4e3SBjoern A. Zeeb 2988da8fa4e3SBjoern A. Zeeb void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src, 2989da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst) 2990da8fa4e3SBjoern A. Zeeb { 2991da8fa4e3SBjoern A. Zeeb dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad); 2992da8fa4e3SBjoern A. Zeeb dst->rts_bad = __le32_to_cpu(src->rts_bad); 2993da8fa4e3SBjoern A. Zeeb dst->rts_good = __le32_to_cpu(src->rts_good); 2994da8fa4e3SBjoern A. Zeeb dst->fcs_bad = __le32_to_cpu(src->fcs_bad); 2995da8fa4e3SBjoern A. Zeeb dst->no_beacons = __le32_to_cpu(src->no_beacons); 2996da8fa4e3SBjoern A. Zeeb dst->mib_int_count = __le32_to_cpu(src->mib_int_count); 2997da8fa4e3SBjoern A. Zeeb } 2998da8fa4e3SBjoern A. Zeeb 2999da8fa4e3SBjoern A. Zeeb void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src, 3000da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst) 3001da8fa4e3SBjoern A. Zeeb { 3002da8fa4e3SBjoern A. Zeeb ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr); 3003da8fa4e3SBjoern A. Zeeb dst->peer_rssi = __le32_to_cpu(src->peer_rssi); 3004da8fa4e3SBjoern A. Zeeb dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate); 3005da8fa4e3SBjoern A. Zeeb } 3006da8fa4e3SBjoern A. Zeeb 3007da8fa4e3SBjoern A. Zeeb static void 3008da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats *src, 3009da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst) 3010da8fa4e3SBjoern A. Zeeb { 3011da8fa4e3SBjoern A. Zeeb ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr); 3012da8fa4e3SBjoern A. Zeeb dst->peer_rssi = __le32_to_cpu(src->peer_rssi); 3013da8fa4e3SBjoern A. Zeeb dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate); 3014da8fa4e3SBjoern A. Zeeb dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 3015da8fa4e3SBjoern A. Zeeb } 3016da8fa4e3SBjoern A. Zeeb 3017da8fa4e3SBjoern A. Zeeb static void 3018da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_pull_vdev_stats(const struct wmi_vdev_stats_extd *src, 3019da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_vdev_extd *dst) 3020da8fa4e3SBjoern A. Zeeb { 3021da8fa4e3SBjoern A. Zeeb dst->vdev_id = __le32_to_cpu(src->vdev_id); 3022da8fa4e3SBjoern A. Zeeb dst->ppdu_aggr_cnt = __le32_to_cpu(src->ppdu_aggr_cnt); 3023da8fa4e3SBjoern A. Zeeb dst->ppdu_noack = __le32_to_cpu(src->ppdu_noack); 3024da8fa4e3SBjoern A. Zeeb dst->mpdu_queued = __le32_to_cpu(src->mpdu_queued); 3025da8fa4e3SBjoern A. Zeeb dst->ppdu_nonaggr_cnt = __le32_to_cpu(src->ppdu_nonaggr_cnt); 3026da8fa4e3SBjoern A. Zeeb dst->mpdu_sw_requeued = __le32_to_cpu(src->mpdu_sw_requeued); 3027da8fa4e3SBjoern A. Zeeb dst->mpdu_suc_retry = __le32_to_cpu(src->mpdu_suc_retry); 3028da8fa4e3SBjoern A. Zeeb dst->mpdu_suc_multitry = __le32_to_cpu(src->mpdu_suc_multitry); 3029da8fa4e3SBjoern A. Zeeb dst->mpdu_fail_retry = __le32_to_cpu(src->mpdu_fail_retry); 3030da8fa4e3SBjoern A. Zeeb dst->tx_ftm_suc = __le32_to_cpu(src->tx_ftm_suc); 3031da8fa4e3SBjoern A. Zeeb dst->tx_ftm_suc_retry = __le32_to_cpu(src->tx_ftm_suc_retry); 3032da8fa4e3SBjoern A. Zeeb dst->tx_ftm_fail = __le32_to_cpu(src->tx_ftm_fail); 3033da8fa4e3SBjoern A. Zeeb dst->rx_ftmr_cnt = __le32_to_cpu(src->rx_ftmr_cnt); 3034da8fa4e3SBjoern A. Zeeb dst->rx_ftmr_dup_cnt = __le32_to_cpu(src->rx_ftmr_dup_cnt); 3035da8fa4e3SBjoern A. Zeeb dst->rx_iftmr_cnt = __le32_to_cpu(src->rx_iftmr_cnt); 3036da8fa4e3SBjoern A. Zeeb dst->rx_iftmr_dup_cnt = __le32_to_cpu(src->rx_iftmr_dup_cnt); 3037da8fa4e3SBjoern A. Zeeb } 3038da8fa4e3SBjoern A. Zeeb 3039da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar, 3040da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3041da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *stats) 3042da8fa4e3SBjoern A. Zeeb { 3043da8fa4e3SBjoern A. Zeeb const struct wmi_stats_event *ev = (void *)skb->data; 3044da8fa4e3SBjoern A. Zeeb u32 num_pdev_stats, num_peer_stats; 3045da8fa4e3SBjoern A. Zeeb int i; 3046da8fa4e3SBjoern A. Zeeb 3047da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*ev))) 3048da8fa4e3SBjoern A. Zeeb return -EPROTO; 3049da8fa4e3SBjoern A. Zeeb 3050da8fa4e3SBjoern A. Zeeb num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 3051da8fa4e3SBjoern A. Zeeb num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 3052da8fa4e3SBjoern A. Zeeb 3053da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_stats; i++) { 3054da8fa4e3SBjoern A. Zeeb const struct wmi_pdev_stats *src; 3055da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst; 3056da8fa4e3SBjoern A. Zeeb 3057da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3058da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3059da8fa4e3SBjoern A. Zeeb return -EPROTO; 3060da8fa4e3SBjoern A. Zeeb 3061da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3062da8fa4e3SBjoern A. Zeeb if (!dst) 3063da8fa4e3SBjoern A. Zeeb continue; 3064da8fa4e3SBjoern A. Zeeb 3065da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 3066da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 3067da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 3068da8fa4e3SBjoern A. Zeeb 3069da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->pdevs); 3070da8fa4e3SBjoern A. Zeeb } 3071da8fa4e3SBjoern A. Zeeb 3072da8fa4e3SBjoern A. Zeeb /* fw doesn't implement vdev stats */ 3073da8fa4e3SBjoern A. Zeeb 3074da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_peer_stats; i++) { 3075da8fa4e3SBjoern A. Zeeb const struct wmi_peer_stats *src; 3076da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst; 3077da8fa4e3SBjoern A. Zeeb 3078da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3079da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3080da8fa4e3SBjoern A. Zeeb return -EPROTO; 3081da8fa4e3SBjoern A. Zeeb 3082da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3083da8fa4e3SBjoern A. Zeeb if (!dst) 3084da8fa4e3SBjoern A. Zeeb continue; 3085da8fa4e3SBjoern A. Zeeb 3086da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_peer_stats(src, dst); 3087da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->peers); 3088da8fa4e3SBjoern A. Zeeb } 3089da8fa4e3SBjoern A. Zeeb 3090da8fa4e3SBjoern A. Zeeb return 0; 3091da8fa4e3SBjoern A. Zeeb } 3092da8fa4e3SBjoern A. Zeeb 3093da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar, 3094da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3095da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *stats) 3096da8fa4e3SBjoern A. Zeeb { 3097da8fa4e3SBjoern A. Zeeb const struct wmi_stats_event *ev = (void *)skb->data; 3098da8fa4e3SBjoern A. Zeeb u32 num_pdev_stats, num_peer_stats; 3099da8fa4e3SBjoern A. Zeeb int i; 3100da8fa4e3SBjoern A. Zeeb 3101da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*ev))) 3102da8fa4e3SBjoern A. Zeeb return -EPROTO; 3103da8fa4e3SBjoern A. Zeeb 3104da8fa4e3SBjoern A. Zeeb num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 3105da8fa4e3SBjoern A. Zeeb num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 3106da8fa4e3SBjoern A. Zeeb 3107da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_stats; i++) { 3108da8fa4e3SBjoern A. Zeeb const struct wmi_10x_pdev_stats *src; 3109da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst; 3110da8fa4e3SBjoern A. Zeeb 3111da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3112da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3113da8fa4e3SBjoern A. Zeeb return -EPROTO; 3114da8fa4e3SBjoern A. Zeeb 3115da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3116da8fa4e3SBjoern A. Zeeb if (!dst) 3117da8fa4e3SBjoern A. Zeeb continue; 3118da8fa4e3SBjoern A. Zeeb 3119da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 3120da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 3121da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 3122da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 3123da8fa4e3SBjoern A. Zeeb 3124da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->pdevs); 3125da8fa4e3SBjoern A. Zeeb } 3126da8fa4e3SBjoern A. Zeeb 3127da8fa4e3SBjoern A. Zeeb /* fw doesn't implement vdev stats */ 3128da8fa4e3SBjoern A. Zeeb 3129da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_peer_stats; i++) { 3130da8fa4e3SBjoern A. Zeeb const struct wmi_10x_peer_stats *src; 3131da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst; 3132da8fa4e3SBjoern A. Zeeb 3133da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3134da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3135da8fa4e3SBjoern A. Zeeb return -EPROTO; 3136da8fa4e3SBjoern A. Zeeb 3137da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3138da8fa4e3SBjoern A. Zeeb if (!dst) 3139da8fa4e3SBjoern A. Zeeb continue; 3140da8fa4e3SBjoern A. Zeeb 3141da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_peer_stats(&src->old, dst); 3142da8fa4e3SBjoern A. Zeeb 3143da8fa4e3SBjoern A. Zeeb dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 3144da8fa4e3SBjoern A. Zeeb 3145da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->peers); 3146da8fa4e3SBjoern A. Zeeb } 3147da8fa4e3SBjoern A. Zeeb 3148da8fa4e3SBjoern A. Zeeb return 0; 3149da8fa4e3SBjoern A. Zeeb } 3150da8fa4e3SBjoern A. Zeeb 3151da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar, 3152da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3153da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *stats) 3154da8fa4e3SBjoern A. Zeeb { 3155da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_stats_event *ev = (void *)skb->data; 3156da8fa4e3SBjoern A. Zeeb u32 num_pdev_stats; 3157da8fa4e3SBjoern A. Zeeb u32 num_pdev_ext_stats; 3158da8fa4e3SBjoern A. Zeeb u32 num_peer_stats; 3159da8fa4e3SBjoern A. Zeeb int i; 3160da8fa4e3SBjoern A. Zeeb 3161da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*ev))) 3162da8fa4e3SBjoern A. Zeeb return -EPROTO; 3163da8fa4e3SBjoern A. Zeeb 3164da8fa4e3SBjoern A. Zeeb num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 3165da8fa4e3SBjoern A. Zeeb num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 3166da8fa4e3SBjoern A. Zeeb num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 3167da8fa4e3SBjoern A. Zeeb 3168da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_stats; i++) { 3169da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_pdev_stats *src; 3170da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst; 3171da8fa4e3SBjoern A. Zeeb 3172da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3173da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3174da8fa4e3SBjoern A. Zeeb return -EPROTO; 3175da8fa4e3SBjoern A. Zeeb 3176da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3177da8fa4e3SBjoern A. Zeeb if (!dst) 3178da8fa4e3SBjoern A. Zeeb continue; 3179da8fa4e3SBjoern A. Zeeb 3180da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 3181da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 3182da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 3183da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 3184da8fa4e3SBjoern A. Zeeb /* FIXME: expose 10.2 specific values */ 3185da8fa4e3SBjoern A. Zeeb 3186da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->pdevs); 3187da8fa4e3SBjoern A. Zeeb } 3188da8fa4e3SBjoern A. Zeeb 3189da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_ext_stats; i++) { 3190da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_pdev_ext_stats *src; 3191da8fa4e3SBjoern A. Zeeb 3192da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3193da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3194da8fa4e3SBjoern A. Zeeb return -EPROTO; 3195da8fa4e3SBjoern A. Zeeb 3196da8fa4e3SBjoern A. Zeeb /* FIXME: expose values to userspace 3197da8fa4e3SBjoern A. Zeeb * 3198da8fa4e3SBjoern A. Zeeb * Note: Even though this loop seems to do nothing it is 3199da8fa4e3SBjoern A. Zeeb * required to parse following sub-structures properly. 3200da8fa4e3SBjoern A. Zeeb */ 3201da8fa4e3SBjoern A. Zeeb } 3202da8fa4e3SBjoern A. Zeeb 3203da8fa4e3SBjoern A. Zeeb /* fw doesn't implement vdev stats */ 3204da8fa4e3SBjoern A. Zeeb 3205da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_peer_stats; i++) { 3206da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_peer_stats *src; 3207da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst; 3208da8fa4e3SBjoern A. Zeeb 3209da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3210da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3211da8fa4e3SBjoern A. Zeeb return -EPROTO; 3212da8fa4e3SBjoern A. Zeeb 3213da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3214da8fa4e3SBjoern A. Zeeb if (!dst) 3215da8fa4e3SBjoern A. Zeeb continue; 3216da8fa4e3SBjoern A. Zeeb 3217da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_peer_stats(&src->old, dst); 3218da8fa4e3SBjoern A. Zeeb 3219da8fa4e3SBjoern A. Zeeb dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 3220da8fa4e3SBjoern A. Zeeb /* FIXME: expose 10.2 specific values */ 3221da8fa4e3SBjoern A. Zeeb 3222da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->peers); 3223da8fa4e3SBjoern A. Zeeb } 3224da8fa4e3SBjoern A. Zeeb 3225da8fa4e3SBjoern A. Zeeb return 0; 3226da8fa4e3SBjoern A. Zeeb } 3227da8fa4e3SBjoern A. Zeeb 3228da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar, 3229da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3230da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *stats) 3231da8fa4e3SBjoern A. Zeeb { 3232da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_stats_event *ev = (void *)skb->data; 3233da8fa4e3SBjoern A. Zeeb u32 num_pdev_stats; 3234da8fa4e3SBjoern A. Zeeb u32 num_pdev_ext_stats; 3235da8fa4e3SBjoern A. Zeeb u32 num_peer_stats; 3236da8fa4e3SBjoern A. Zeeb int i; 3237da8fa4e3SBjoern A. Zeeb 3238da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*ev))) 3239da8fa4e3SBjoern A. Zeeb return -EPROTO; 3240da8fa4e3SBjoern A. Zeeb 3241da8fa4e3SBjoern A. Zeeb num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 3242da8fa4e3SBjoern A. Zeeb num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 3243da8fa4e3SBjoern A. Zeeb num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 3244da8fa4e3SBjoern A. Zeeb 3245da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_stats; i++) { 3246da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_pdev_stats *src; 3247da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst; 3248da8fa4e3SBjoern A. Zeeb 3249da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3250da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3251da8fa4e3SBjoern A. Zeeb return -EPROTO; 3252da8fa4e3SBjoern A. Zeeb 3253da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3254da8fa4e3SBjoern A. Zeeb if (!dst) 3255da8fa4e3SBjoern A. Zeeb continue; 3256da8fa4e3SBjoern A. Zeeb 3257da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 3258da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 3259da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 3260da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 3261da8fa4e3SBjoern A. Zeeb /* FIXME: expose 10.2 specific values */ 3262da8fa4e3SBjoern A. Zeeb 3263da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->pdevs); 3264da8fa4e3SBjoern A. Zeeb } 3265da8fa4e3SBjoern A. Zeeb 3266da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_ext_stats; i++) { 3267da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_pdev_ext_stats *src; 3268da8fa4e3SBjoern A. Zeeb 3269da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3270da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3271da8fa4e3SBjoern A. Zeeb return -EPROTO; 3272da8fa4e3SBjoern A. Zeeb 3273da8fa4e3SBjoern A. Zeeb /* FIXME: expose values to userspace 3274da8fa4e3SBjoern A. Zeeb * 3275da8fa4e3SBjoern A. Zeeb * Note: Even though this loop seems to do nothing it is 3276da8fa4e3SBjoern A. Zeeb * required to parse following sub-structures properly. 3277da8fa4e3SBjoern A. Zeeb */ 3278da8fa4e3SBjoern A. Zeeb } 3279da8fa4e3SBjoern A. Zeeb 3280da8fa4e3SBjoern A. Zeeb /* fw doesn't implement vdev stats */ 3281da8fa4e3SBjoern A. Zeeb 3282da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_peer_stats; i++) { 3283da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_4_ext_peer_stats *src; 3284da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst; 3285da8fa4e3SBjoern A. Zeeb int stats_len; 3286da8fa4e3SBjoern A. Zeeb 3287da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map)) 3288da8fa4e3SBjoern A. Zeeb stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats); 3289da8fa4e3SBjoern A. Zeeb else 3290da8fa4e3SBjoern A. Zeeb stats_len = sizeof(struct wmi_10_2_4_peer_stats); 3291da8fa4e3SBjoern A. Zeeb 3292da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3293da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, stats_len)) 3294da8fa4e3SBjoern A. Zeeb return -EPROTO; 3295da8fa4e3SBjoern A. Zeeb 3296da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3297da8fa4e3SBjoern A. Zeeb if (!dst) 3298da8fa4e3SBjoern A. Zeeb continue; 3299da8fa4e3SBjoern A. Zeeb 3300da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_peer_stats(&src->common.old, dst); 3301da8fa4e3SBjoern A. Zeeb 3302da8fa4e3SBjoern A. Zeeb dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate); 3303da8fa4e3SBjoern A. Zeeb 3304da8fa4e3SBjoern A. Zeeb if (ath10k_peer_stats_enabled(ar)) 3305da8fa4e3SBjoern A. Zeeb dst->rx_duration = __le32_to_cpu(src->rx_duration); 3306da8fa4e3SBjoern A. Zeeb /* FIXME: expose 10.2 specific values */ 3307da8fa4e3SBjoern A. Zeeb 3308da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->peers); 3309da8fa4e3SBjoern A. Zeeb } 3310da8fa4e3SBjoern A. Zeeb 3311da8fa4e3SBjoern A. Zeeb return 0; 3312da8fa4e3SBjoern A. Zeeb } 3313da8fa4e3SBjoern A. Zeeb 3314da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar, 3315da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3316da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *stats) 3317da8fa4e3SBjoern A. Zeeb { 3318da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_stats_event *ev = (void *)skb->data; 3319da8fa4e3SBjoern A. Zeeb u32 num_pdev_stats; 3320da8fa4e3SBjoern A. Zeeb u32 num_pdev_ext_stats; 3321da8fa4e3SBjoern A. Zeeb u32 num_vdev_stats; 3322da8fa4e3SBjoern A. Zeeb u32 num_peer_stats; 3323da8fa4e3SBjoern A. Zeeb u32 num_bcnflt_stats; 3324da8fa4e3SBjoern A. Zeeb u32 stats_id; 3325da8fa4e3SBjoern A. Zeeb int i; 3326da8fa4e3SBjoern A. Zeeb 3327da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*ev))) 3328da8fa4e3SBjoern A. Zeeb return -EPROTO; 3329da8fa4e3SBjoern A. Zeeb 3330da8fa4e3SBjoern A. Zeeb num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 3331da8fa4e3SBjoern A. Zeeb num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 3332da8fa4e3SBjoern A. Zeeb num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 3333da8fa4e3SBjoern A. Zeeb num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 3334da8fa4e3SBjoern A. Zeeb num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats); 3335da8fa4e3SBjoern A. Zeeb stats_id = __le32_to_cpu(ev->stats_id); 3336da8fa4e3SBjoern A. Zeeb 3337da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_stats; i++) { 3338da8fa4e3SBjoern A. Zeeb const struct wmi_10_4_pdev_stats *src; 3339da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev *dst; 3340da8fa4e3SBjoern A. Zeeb 3341da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3342da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3343da8fa4e3SBjoern A. Zeeb return -EPROTO; 3344da8fa4e3SBjoern A. Zeeb 3345da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3346da8fa4e3SBjoern A. Zeeb if (!dst) 3347da8fa4e3SBjoern A. Zeeb continue; 3348da8fa4e3SBjoern A. Zeeb 3349da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 3350da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst); 3351da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 3352da8fa4e3SBjoern A. Zeeb dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs); 3353da8fa4e3SBjoern A. Zeeb ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 3354da8fa4e3SBjoern A. Zeeb 3355da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->pdevs); 3356da8fa4e3SBjoern A. Zeeb } 3357da8fa4e3SBjoern A. Zeeb 3358da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_pdev_ext_stats; i++) { 3359da8fa4e3SBjoern A. Zeeb const struct wmi_10_2_pdev_ext_stats *src; 3360da8fa4e3SBjoern A. Zeeb 3361da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3362da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3363da8fa4e3SBjoern A. Zeeb return -EPROTO; 3364da8fa4e3SBjoern A. Zeeb 3365da8fa4e3SBjoern A. Zeeb /* FIXME: expose values to userspace 3366da8fa4e3SBjoern A. Zeeb * 3367da8fa4e3SBjoern A. Zeeb * Note: Even though this loop seems to do nothing it is 3368da8fa4e3SBjoern A. Zeeb * required to parse following sub-structures properly. 3369da8fa4e3SBjoern A. Zeeb */ 3370da8fa4e3SBjoern A. Zeeb } 3371da8fa4e3SBjoern A. Zeeb 3372da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_vdev_stats; i++) { 3373da8fa4e3SBjoern A. Zeeb const struct wmi_vdev_stats *src; 3374da8fa4e3SBjoern A. Zeeb 3375da8fa4e3SBjoern A. Zeeb /* Ignore vdev stats here as it has only vdev id. Actual vdev 3376da8fa4e3SBjoern A. Zeeb * stats will be retrieved from vdev extended stats. 3377da8fa4e3SBjoern A. Zeeb */ 3378da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3379da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3380da8fa4e3SBjoern A. Zeeb return -EPROTO; 3381da8fa4e3SBjoern A. Zeeb } 3382da8fa4e3SBjoern A. Zeeb 3383da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_peer_stats; i++) { 3384da8fa4e3SBjoern A. Zeeb const struct wmi_10_4_peer_stats *src; 3385da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *dst; 3386da8fa4e3SBjoern A. Zeeb 3387da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3388da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3389da8fa4e3SBjoern A. Zeeb return -EPROTO; 3390da8fa4e3SBjoern A. Zeeb 3391da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3392da8fa4e3SBjoern A. Zeeb if (!dst) 3393da8fa4e3SBjoern A. Zeeb continue; 3394da8fa4e3SBjoern A. Zeeb 3395da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_pull_peer_stats(src, dst); 3396da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->peers); 3397da8fa4e3SBjoern A. Zeeb } 3398da8fa4e3SBjoern A. Zeeb 3399da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_bcnflt_stats; i++) { 3400da8fa4e3SBjoern A. Zeeb const struct wmi_10_4_bss_bcn_filter_stats *src; 3401da8fa4e3SBjoern A. Zeeb 3402da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3403da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3404da8fa4e3SBjoern A. Zeeb return -EPROTO; 3405da8fa4e3SBjoern A. Zeeb 3406da8fa4e3SBjoern A. Zeeb /* FIXME: expose values to userspace 3407da8fa4e3SBjoern A. Zeeb * 3408da8fa4e3SBjoern A. Zeeb * Note: Even though this loop seems to do nothing it is 3409da8fa4e3SBjoern A. Zeeb * required to parse following sub-structures properly. 3410da8fa4e3SBjoern A. Zeeb */ 3411da8fa4e3SBjoern A. Zeeb } 3412da8fa4e3SBjoern A. Zeeb 3413da8fa4e3SBjoern A. Zeeb if (stats_id & WMI_10_4_STAT_PEER_EXTD) { 3414da8fa4e3SBjoern A. Zeeb stats->extended = true; 3415da8fa4e3SBjoern A. Zeeb 3416da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_peer_stats; i++) { 3417da8fa4e3SBjoern A. Zeeb const struct wmi_10_4_peer_extd_stats *src; 3418da8fa4e3SBjoern A. Zeeb struct ath10k_fw_extd_stats_peer *dst; 3419da8fa4e3SBjoern A. Zeeb 3420da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3421da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3422da8fa4e3SBjoern A. Zeeb return -EPROTO; 3423da8fa4e3SBjoern A. Zeeb 3424da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3425da8fa4e3SBjoern A. Zeeb if (!dst) 3426da8fa4e3SBjoern A. Zeeb continue; 3427da8fa4e3SBjoern A. Zeeb 3428da8fa4e3SBjoern A. Zeeb ether_addr_copy(dst->peer_macaddr, 3429da8fa4e3SBjoern A. Zeeb src->peer_macaddr.addr); 3430da8fa4e3SBjoern A. Zeeb dst->rx_duration = __le32_to_cpu(src->rx_duration); 3431da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->peers_extd); 3432da8fa4e3SBjoern A. Zeeb } 3433da8fa4e3SBjoern A. Zeeb } 3434da8fa4e3SBjoern A. Zeeb 3435da8fa4e3SBjoern A. Zeeb if (stats_id & WMI_10_4_STAT_VDEV_EXTD) { 3436da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_vdev_stats; i++) { 3437da8fa4e3SBjoern A. Zeeb const struct wmi_vdev_stats_extd *src; 3438da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_vdev_extd *dst; 3439da8fa4e3SBjoern A. Zeeb 3440da8fa4e3SBjoern A. Zeeb src = (void *)skb->data; 3441da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(*src))) 3442da8fa4e3SBjoern A. Zeeb return -EPROTO; 3443da8fa4e3SBjoern A. Zeeb 3444da8fa4e3SBjoern A. Zeeb dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 3445da8fa4e3SBjoern A. Zeeb if (!dst) 3446da8fa4e3SBjoern A. Zeeb continue; 3447da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_pull_vdev_stats(src, dst); 3448da8fa4e3SBjoern A. Zeeb list_add_tail(&dst->list, &stats->vdevs); 3449da8fa4e3SBjoern A. Zeeb } 3450da8fa4e3SBjoern A. Zeeb } 3451da8fa4e3SBjoern A. Zeeb 3452da8fa4e3SBjoern A. Zeeb return 0; 3453da8fa4e3SBjoern A. Zeeb } 3454da8fa4e3SBjoern A. Zeeb 3455da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb) 3456da8fa4e3SBjoern A. Zeeb { 3457da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n"); 3458da8fa4e3SBjoern A. Zeeb ath10k_debug_fw_stats_process(ar, skb); 3459da8fa4e3SBjoern A. Zeeb } 3460da8fa4e3SBjoern A. Zeeb 3461da8fa4e3SBjoern A. Zeeb static int 3462da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb, 3463da8fa4e3SBjoern A. Zeeb struct wmi_vdev_start_ev_arg *arg) 3464da8fa4e3SBjoern A. Zeeb { 3465da8fa4e3SBjoern A. Zeeb struct wmi_vdev_start_response_event *ev = (void *)skb->data; 3466da8fa4e3SBjoern A. Zeeb 3467da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 3468da8fa4e3SBjoern A. Zeeb return -EPROTO; 3469da8fa4e3SBjoern A. Zeeb 3470da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 3471da8fa4e3SBjoern A. Zeeb arg->vdev_id = ev->vdev_id; 3472da8fa4e3SBjoern A. Zeeb arg->req_id = ev->req_id; 3473da8fa4e3SBjoern A. Zeeb arg->resp_type = ev->resp_type; 3474da8fa4e3SBjoern A. Zeeb arg->status = ev->status; 3475da8fa4e3SBjoern A. Zeeb 3476da8fa4e3SBjoern A. Zeeb return 0; 3477da8fa4e3SBjoern A. Zeeb } 3478da8fa4e3SBjoern A. Zeeb 3479da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb) 3480da8fa4e3SBjoern A. Zeeb { 3481da8fa4e3SBjoern A. Zeeb struct wmi_vdev_start_ev_arg arg = {}; 3482da8fa4e3SBjoern A. Zeeb int ret; 3483da8fa4e3SBjoern A. Zeeb u32 status; 3484da8fa4e3SBjoern A. Zeeb 3485da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n"); 3486da8fa4e3SBjoern A. Zeeb 3487da8fa4e3SBjoern A. Zeeb ar->last_wmi_vdev_start_status = 0; 3488da8fa4e3SBjoern A. Zeeb 3489da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg); 3490da8fa4e3SBjoern A. Zeeb if (ret) { 3491da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret); 3492da8fa4e3SBjoern A. Zeeb ar->last_wmi_vdev_start_status = ret; 3493da8fa4e3SBjoern A. Zeeb goto out; 3494da8fa4e3SBjoern A. Zeeb } 3495da8fa4e3SBjoern A. Zeeb 3496da8fa4e3SBjoern A. Zeeb status = __le32_to_cpu(arg.status); 3497da8fa4e3SBjoern A. Zeeb if (WARN_ON_ONCE(status)) { 3498da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "vdev-start-response reports status error: %d (%s)\n", 3499da8fa4e3SBjoern A. Zeeb status, (status == WMI_VDEV_START_CHAN_INVALID) ? 3500da8fa4e3SBjoern A. Zeeb "chan-invalid" : "unknown"); 3501da8fa4e3SBjoern A. Zeeb /* Setup is done one way or another though, so we should still 3502da8fa4e3SBjoern A. Zeeb * do the completion, so don't return here. 3503da8fa4e3SBjoern A. Zeeb */ 3504da8fa4e3SBjoern A. Zeeb ar->last_wmi_vdev_start_status = -EINVAL; 3505da8fa4e3SBjoern A. Zeeb } 3506da8fa4e3SBjoern A. Zeeb 3507da8fa4e3SBjoern A. Zeeb out: 3508da8fa4e3SBjoern A. Zeeb complete(&ar->vdev_setup_done); 3509da8fa4e3SBjoern A. Zeeb } 3510da8fa4e3SBjoern A. Zeeb 3511da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb) 3512da8fa4e3SBjoern A. Zeeb { 3513da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n"); 3514da8fa4e3SBjoern A. Zeeb complete(&ar->vdev_setup_done); 3515da8fa4e3SBjoern A. Zeeb } 3516da8fa4e3SBjoern A. Zeeb 3517da8fa4e3SBjoern A. Zeeb static int 3518da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb, 3519da8fa4e3SBjoern A. Zeeb struct wmi_peer_kick_ev_arg *arg) 3520da8fa4e3SBjoern A. Zeeb { 3521da8fa4e3SBjoern A. Zeeb struct wmi_peer_sta_kickout_event *ev = (void *)skb->data; 3522da8fa4e3SBjoern A. Zeeb 3523da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 3524da8fa4e3SBjoern A. Zeeb return -EPROTO; 3525da8fa4e3SBjoern A. Zeeb 3526da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 3527da8fa4e3SBjoern A. Zeeb arg->mac_addr = ev->peer_macaddr.addr; 3528da8fa4e3SBjoern A. Zeeb 3529da8fa4e3SBjoern A. Zeeb return 0; 3530da8fa4e3SBjoern A. Zeeb } 3531da8fa4e3SBjoern A. Zeeb 3532da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb) 3533da8fa4e3SBjoern A. Zeeb { 3534da8fa4e3SBjoern A. Zeeb struct wmi_peer_kick_ev_arg arg = {}; 3535da8fa4e3SBjoern A. Zeeb struct ieee80211_sta *sta; 3536da8fa4e3SBjoern A. Zeeb int ret; 3537da8fa4e3SBjoern A. Zeeb 3538da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg); 3539da8fa4e3SBjoern A. Zeeb if (ret) { 3540da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse peer kickout event: %d\n", 3541da8fa4e3SBjoern A. Zeeb ret); 3542da8fa4e3SBjoern A. Zeeb return; 3543da8fa4e3SBjoern A. Zeeb } 3544da8fa4e3SBjoern A. Zeeb 3545da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_STA, "wmi event peer sta kickout %pM\n", 3546da8fa4e3SBjoern A. Zeeb arg.mac_addr); 3547da8fa4e3SBjoern A. Zeeb 3548da8fa4e3SBjoern A. Zeeb rcu_read_lock(); 3549da8fa4e3SBjoern A. Zeeb 3550da8fa4e3SBjoern A. Zeeb sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL); 3551da8fa4e3SBjoern A. Zeeb if (!sta) { 3552da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "Spurious quick kickout for STA %pM\n", 3553da8fa4e3SBjoern A. Zeeb arg.mac_addr); 3554da8fa4e3SBjoern A. Zeeb goto exit; 3555da8fa4e3SBjoern A. Zeeb } 3556da8fa4e3SBjoern A. Zeeb 3557da8fa4e3SBjoern A. Zeeb ieee80211_report_low_ack(sta, 10); 3558da8fa4e3SBjoern A. Zeeb 3559da8fa4e3SBjoern A. Zeeb exit: 3560da8fa4e3SBjoern A. Zeeb rcu_read_unlock(); 3561da8fa4e3SBjoern A. Zeeb } 3562da8fa4e3SBjoern A. Zeeb 3563da8fa4e3SBjoern A. Zeeb /* 3564da8fa4e3SBjoern A. Zeeb * FIXME 3565da8fa4e3SBjoern A. Zeeb * 3566da8fa4e3SBjoern A. Zeeb * We don't report to mac80211 sleep state of connected 3567da8fa4e3SBjoern A. Zeeb * stations. Due to this mac80211 can't fill in TIM IE 3568da8fa4e3SBjoern A. Zeeb * correctly. 3569da8fa4e3SBjoern A. Zeeb * 3570da8fa4e3SBjoern A. Zeeb * I know of no way of getting nullfunc frames that contain 3571da8fa4e3SBjoern A. Zeeb * sleep transition from connected stations - these do not 3572da8fa4e3SBjoern A. Zeeb * seem to be sent from the target to the host. There also 3573da8fa4e3SBjoern A. Zeeb * doesn't seem to be a dedicated event for that. So the 3574da8fa4e3SBjoern A. Zeeb * only way left to do this would be to read tim_bitmap 3575da8fa4e3SBjoern A. Zeeb * during SWBA. 3576da8fa4e3SBjoern A. Zeeb * 3577da8fa4e3SBjoern A. Zeeb * We could probably try using tim_bitmap from SWBA to tell 3578da8fa4e3SBjoern A. Zeeb * mac80211 which stations are asleep and which are not. The 3579da8fa4e3SBjoern A. Zeeb * problem here is calling mac80211 functions so many times 3580da8fa4e3SBjoern A. Zeeb * could take too long and make us miss the time to submit 3581da8fa4e3SBjoern A. Zeeb * the beacon to the target. 3582da8fa4e3SBjoern A. Zeeb * 3583da8fa4e3SBjoern A. Zeeb * So as a workaround we try to extend the TIM IE if there 3584da8fa4e3SBjoern A. Zeeb * is unicast buffered for stations with aid > 7 and fill it 3585da8fa4e3SBjoern A. Zeeb * in ourselves. 3586da8fa4e3SBjoern A. Zeeb */ 3587da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_update_tim(struct ath10k *ar, 3588da8fa4e3SBjoern A. Zeeb struct ath10k_vif *arvif, 3589da8fa4e3SBjoern A. Zeeb struct sk_buff *bcn, 3590da8fa4e3SBjoern A. Zeeb const struct wmi_tim_info_arg *tim_info) 3591da8fa4e3SBjoern A. Zeeb { 3592da8fa4e3SBjoern A. Zeeb struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data; 3593da8fa4e3SBjoern A. Zeeb struct ieee80211_tim_ie *tim; 3594da8fa4e3SBjoern A. Zeeb u8 *ies, *ie; 3595da8fa4e3SBjoern A. Zeeb u8 ie_len, pvm_len; 3596da8fa4e3SBjoern A. Zeeb __le32 t; 3597da8fa4e3SBjoern A. Zeeb u32 v, tim_len; 3598da8fa4e3SBjoern A. Zeeb 3599da8fa4e3SBjoern A. Zeeb /* When FW reports 0 in tim_len, ensure atleast first byte 3600da8fa4e3SBjoern A. Zeeb * in tim_bitmap is considered for pvm calculation. 3601da8fa4e3SBjoern A. Zeeb */ 3602da8fa4e3SBjoern A. Zeeb tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1; 3603da8fa4e3SBjoern A. Zeeb 3604da8fa4e3SBjoern A. Zeeb /* if next SWBA has no tim_changed the tim_bitmap is garbage. 3605da8fa4e3SBjoern A. Zeeb * we must copy the bitmap upon change and reuse it later 3606da8fa4e3SBjoern A. Zeeb */ 3607da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(tim_info->tim_changed)) { 3608da8fa4e3SBjoern A. Zeeb int i; 3609da8fa4e3SBjoern A. Zeeb 3610da8fa4e3SBjoern A. Zeeb if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) { 3611da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu", 3612da8fa4e3SBjoern A. Zeeb tim_len, sizeof(arvif->u.ap.tim_bitmap)); 3613da8fa4e3SBjoern A. Zeeb tim_len = sizeof(arvif->u.ap.tim_bitmap); 3614da8fa4e3SBjoern A. Zeeb } 3615da8fa4e3SBjoern A. Zeeb 3616da8fa4e3SBjoern A. Zeeb for (i = 0; i < tim_len; i++) { 3617da8fa4e3SBjoern A. Zeeb t = tim_info->tim_bitmap[i / 4]; 3618da8fa4e3SBjoern A. Zeeb v = __le32_to_cpu(t); 3619da8fa4e3SBjoern A. Zeeb arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF; 3620da8fa4e3SBjoern A. Zeeb } 3621da8fa4e3SBjoern A. Zeeb 3622da8fa4e3SBjoern A. Zeeb /* FW reports either length 0 or length based on max supported 3623da8fa4e3SBjoern A. Zeeb * station. so we calculate this on our own 3624da8fa4e3SBjoern A. Zeeb */ 3625da8fa4e3SBjoern A. Zeeb arvif->u.ap.tim_len = 0; 3626da8fa4e3SBjoern A. Zeeb for (i = 0; i < tim_len; i++) 3627da8fa4e3SBjoern A. Zeeb if (arvif->u.ap.tim_bitmap[i]) 3628da8fa4e3SBjoern A. Zeeb arvif->u.ap.tim_len = i; 3629da8fa4e3SBjoern A. Zeeb 3630da8fa4e3SBjoern A. Zeeb arvif->u.ap.tim_len++; 3631da8fa4e3SBjoern A. Zeeb } 3632da8fa4e3SBjoern A. Zeeb 3633da8fa4e3SBjoern A. Zeeb ies = bcn->data; 3634da8fa4e3SBjoern A. Zeeb ies += ieee80211_hdrlen(hdr->frame_control); 3635da8fa4e3SBjoern A. Zeeb ies += 12; /* fixed parameters */ 3636da8fa4e3SBjoern A. Zeeb 3637da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 3638da8fa4e3SBjoern A. Zeeb ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies, 3639da8fa4e3SBjoern A. Zeeb (u8 *)skb_tail_pointer(bcn) - ies); 3640da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 3641da8fa4e3SBjoern A. Zeeb ie = __DECONST(u8 *, cfg80211_find_ie(WLAN_EID_TIM, ies, 3642da8fa4e3SBjoern A. Zeeb (u8 *)skb_tail_pointer(bcn) - ies)); 3643da8fa4e3SBjoern A. Zeeb #endif 3644da8fa4e3SBjoern A. Zeeb if (!ie) { 3645da8fa4e3SBjoern A. Zeeb if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS) 3646da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "no tim ie found;\n"); 3647da8fa4e3SBjoern A. Zeeb return; 3648da8fa4e3SBjoern A. Zeeb } 3649da8fa4e3SBjoern A. Zeeb 3650da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 3651da8fa4e3SBjoern A. Zeeb tim = (void *)ie + 2; 3652da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 3653da8fa4e3SBjoern A. Zeeb tim = (void *)(ie + 2); 3654da8fa4e3SBjoern A. Zeeb #endif 3655da8fa4e3SBjoern A. Zeeb ie_len = ie[1]; 3656da8fa4e3SBjoern A. Zeeb pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */ 3657da8fa4e3SBjoern A. Zeeb 3658da8fa4e3SBjoern A. Zeeb if (pvm_len < arvif->u.ap.tim_len) { 3659da8fa4e3SBjoern A. Zeeb int expand_size = tim_len - pvm_len; 3660da8fa4e3SBjoern A. Zeeb int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len); 3661da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 3662da8fa4e3SBjoern A. Zeeb void *next_ie = ie + 2 + ie_len; 3663da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 3664da8fa4e3SBjoern A. Zeeb u8 *next_ie = ie + 2 + ie_len; 3665da8fa4e3SBjoern A. Zeeb #endif 3666da8fa4e3SBjoern A. Zeeb 3667da8fa4e3SBjoern A. Zeeb if (skb_put(bcn, expand_size)) { 3668da8fa4e3SBjoern A. Zeeb memmove(next_ie + expand_size, next_ie, move_size); 3669da8fa4e3SBjoern A. Zeeb 3670da8fa4e3SBjoern A. Zeeb #if defined(__FreeBSD__) 3671da8fa4e3SBjoern A. Zeeb /* XXX-BZ this seems to modify the skb data. */ 3672da8fa4e3SBjoern A. Zeeb #endif 3673da8fa4e3SBjoern A. Zeeb ie[1] += expand_size; 3674da8fa4e3SBjoern A. Zeeb ie_len += expand_size; 3675da8fa4e3SBjoern A. Zeeb pvm_len += expand_size; 3676da8fa4e3SBjoern A. Zeeb } else { 3677da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "tim expansion failed\n"); 3678da8fa4e3SBjoern A. Zeeb } 3679da8fa4e3SBjoern A. Zeeb } 3680da8fa4e3SBjoern A. Zeeb 3681da8fa4e3SBjoern A. Zeeb if (pvm_len > tim_len) { 3682da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len); 3683da8fa4e3SBjoern A. Zeeb return; 3684da8fa4e3SBjoern A. Zeeb } 3685da8fa4e3SBjoern A. Zeeb 3686da8fa4e3SBjoern A. Zeeb #if defined(__FreeBSD__) 3687da8fa4e3SBjoern A. Zeeb /* XXX-BZ this seems to modify the skb data. */ 3688da8fa4e3SBjoern A. Zeeb #endif 3689da8fa4e3SBjoern A. Zeeb tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast); 3690da8fa4e3SBjoern A. Zeeb memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len); 3691da8fa4e3SBjoern A. Zeeb 3692da8fa4e3SBjoern A. Zeeb if (tim->dtim_count == 0) { 3693da8fa4e3SBjoern A. Zeeb ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO; 3694da8fa4e3SBjoern A. Zeeb 3695da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(tim_info->tim_mcast) == 1) 3696da8fa4e3SBjoern A. Zeeb ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB; 3697da8fa4e3SBjoern A. Zeeb } 3698da8fa4e3SBjoern A. Zeeb 3699da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n", 3700da8fa4e3SBjoern A. Zeeb tim->dtim_count, tim->dtim_period, 3701da8fa4e3SBjoern A. Zeeb tim->bitmap_ctrl, pvm_len); 3702da8fa4e3SBjoern A. Zeeb } 3703da8fa4e3SBjoern A. Zeeb 3704da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif, 3705da8fa4e3SBjoern A. Zeeb struct sk_buff *bcn, 3706da8fa4e3SBjoern A. Zeeb const struct wmi_p2p_noa_info *noa) 3707da8fa4e3SBjoern A. Zeeb { 3708da8fa4e3SBjoern A. Zeeb if (!arvif->vif->p2p) 3709da8fa4e3SBjoern A. Zeeb return; 3710da8fa4e3SBjoern A. Zeeb 3711da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed); 3712da8fa4e3SBjoern A. Zeeb 3713da8fa4e3SBjoern A. Zeeb if (noa->changed & WMI_P2P_NOA_CHANGED_BIT) 3714da8fa4e3SBjoern A. Zeeb ath10k_p2p_noa_update(arvif, noa); 3715da8fa4e3SBjoern A. Zeeb 3716da8fa4e3SBjoern A. Zeeb if (arvif->u.ap.noa_data) 3717da8fa4e3SBjoern A. Zeeb if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC)) 3718da8fa4e3SBjoern A. Zeeb skb_put_data(bcn, arvif->u.ap.noa_data, 3719da8fa4e3SBjoern A. Zeeb arvif->u.ap.noa_len); 3720da8fa4e3SBjoern A. Zeeb } 3721da8fa4e3SBjoern A. Zeeb 3722da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb, 3723da8fa4e3SBjoern A. Zeeb struct wmi_swba_ev_arg *arg) 3724da8fa4e3SBjoern A. Zeeb { 3725da8fa4e3SBjoern A. Zeeb struct wmi_host_swba_event *ev = (void *)skb->data; 3726da8fa4e3SBjoern A. Zeeb u32 map; 3727da8fa4e3SBjoern A. Zeeb size_t i; 3728da8fa4e3SBjoern A. Zeeb 3729da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 3730da8fa4e3SBjoern A. Zeeb return -EPROTO; 3731da8fa4e3SBjoern A. Zeeb 3732da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 3733da8fa4e3SBjoern A. Zeeb arg->vdev_map = ev->vdev_map; 3734da8fa4e3SBjoern A. Zeeb 3735da8fa4e3SBjoern A. Zeeb for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 3736da8fa4e3SBjoern A. Zeeb if (!(map & BIT(0))) 3737da8fa4e3SBjoern A. Zeeb continue; 3738da8fa4e3SBjoern A. Zeeb 3739da8fa4e3SBjoern A. Zeeb /* If this happens there were some changes in firmware and 3740da8fa4e3SBjoern A. Zeeb * ath10k should update the max size of tim_info array. 3741da8fa4e3SBjoern A. Zeeb */ 3742da8fa4e3SBjoern A. Zeeb if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 3743da8fa4e3SBjoern A. Zeeb break; 3744da8fa4e3SBjoern A. Zeeb 3745da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) > 3746da8fa4e3SBjoern A. Zeeb sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) { 3747da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "refusing to parse invalid swba structure\n"); 3748da8fa4e3SBjoern A. Zeeb return -EPROTO; 3749da8fa4e3SBjoern A. Zeeb } 3750da8fa4e3SBjoern A. Zeeb 3751da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len; 3752da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast; 3753da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_bitmap = 3754da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_bitmap; 3755da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_changed = 3756da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_changed; 3757da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_num_ps_pending = 3758da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_num_ps_pending; 3759da8fa4e3SBjoern A. Zeeb 3760da8fa4e3SBjoern A. Zeeb arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info; 3761da8fa4e3SBjoern A. Zeeb i++; 3762da8fa4e3SBjoern A. Zeeb } 3763da8fa4e3SBjoern A. Zeeb 3764da8fa4e3SBjoern A. Zeeb return 0; 3765da8fa4e3SBjoern A. Zeeb } 3766da8fa4e3SBjoern A. Zeeb 3767da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar, 3768da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3769da8fa4e3SBjoern A. Zeeb struct wmi_swba_ev_arg *arg) 3770da8fa4e3SBjoern A. Zeeb { 3771da8fa4e3SBjoern A. Zeeb struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data; 3772da8fa4e3SBjoern A. Zeeb u32 map; 3773da8fa4e3SBjoern A. Zeeb size_t i; 3774da8fa4e3SBjoern A. Zeeb 3775da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 3776da8fa4e3SBjoern A. Zeeb return -EPROTO; 3777da8fa4e3SBjoern A. Zeeb 3778da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 3779da8fa4e3SBjoern A. Zeeb arg->vdev_map = ev->vdev_map; 3780da8fa4e3SBjoern A. Zeeb 3781da8fa4e3SBjoern A. Zeeb for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 3782da8fa4e3SBjoern A. Zeeb if (!(map & BIT(0))) 3783da8fa4e3SBjoern A. Zeeb continue; 3784da8fa4e3SBjoern A. Zeeb 3785da8fa4e3SBjoern A. Zeeb /* If this happens there were some changes in firmware and 3786da8fa4e3SBjoern A. Zeeb * ath10k should update the max size of tim_info array. 3787da8fa4e3SBjoern A. Zeeb */ 3788da8fa4e3SBjoern A. Zeeb if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 3789da8fa4e3SBjoern A. Zeeb break; 3790da8fa4e3SBjoern A. Zeeb 3791da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) > 3792da8fa4e3SBjoern A. Zeeb sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) { 3793da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "refusing to parse invalid swba structure\n"); 3794da8fa4e3SBjoern A. Zeeb return -EPROTO; 3795da8fa4e3SBjoern A. Zeeb } 3796da8fa4e3SBjoern A. Zeeb 3797da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len; 3798da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast; 3799da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_bitmap = 3800da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_bitmap; 3801da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_changed = 3802da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_changed; 3803da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_num_ps_pending = 3804da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_num_ps_pending; 3805da8fa4e3SBjoern A. Zeeb i++; 3806da8fa4e3SBjoern A. Zeeb } 3807da8fa4e3SBjoern A. Zeeb 3808da8fa4e3SBjoern A. Zeeb return 0; 3809da8fa4e3SBjoern A. Zeeb } 3810da8fa4e3SBjoern A. Zeeb 3811da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar, 3812da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 3813da8fa4e3SBjoern A. Zeeb struct wmi_swba_ev_arg *arg) 3814da8fa4e3SBjoern A. Zeeb { 3815da8fa4e3SBjoern A. Zeeb struct wmi_10_4_host_swba_event *ev = (void *)skb->data; 3816da8fa4e3SBjoern A. Zeeb u32 map, tim_len; 3817da8fa4e3SBjoern A. Zeeb size_t i; 3818da8fa4e3SBjoern A. Zeeb 3819da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 3820da8fa4e3SBjoern A. Zeeb return -EPROTO; 3821da8fa4e3SBjoern A. Zeeb 3822da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 3823da8fa4e3SBjoern A. Zeeb arg->vdev_map = ev->vdev_map; 3824da8fa4e3SBjoern A. Zeeb 3825da8fa4e3SBjoern A. Zeeb for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 3826da8fa4e3SBjoern A. Zeeb if (!(map & BIT(0))) 3827da8fa4e3SBjoern A. Zeeb continue; 3828da8fa4e3SBjoern A. Zeeb 3829da8fa4e3SBjoern A. Zeeb /* If this happens there were some changes in firmware and 3830da8fa4e3SBjoern A. Zeeb * ath10k should update the max size of tim_info array. 3831da8fa4e3SBjoern A. Zeeb */ 3832da8fa4e3SBjoern A. Zeeb if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 3833da8fa4e3SBjoern A. Zeeb break; 3834da8fa4e3SBjoern A. Zeeb 3835da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) > 3836da8fa4e3SBjoern A. Zeeb sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) { 3837da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "refusing to parse invalid swba structure\n"); 3838da8fa4e3SBjoern A. Zeeb return -EPROTO; 3839da8fa4e3SBjoern A. Zeeb } 3840da8fa4e3SBjoern A. Zeeb 3841da8fa4e3SBjoern A. Zeeb tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len); 3842da8fa4e3SBjoern A. Zeeb if (tim_len) { 3843da8fa4e3SBjoern A. Zeeb /* Exclude 4 byte guard length */ 3844da8fa4e3SBjoern A. Zeeb tim_len -= 4; 3845da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_len = __cpu_to_le32(tim_len); 3846da8fa4e3SBjoern A. Zeeb } else { 3847da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_len = 0; 3848da8fa4e3SBjoern A. Zeeb } 3849da8fa4e3SBjoern A. Zeeb 3850da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast; 3851da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_bitmap = 3852da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_bitmap; 3853da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_changed = 3854da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_changed; 3855da8fa4e3SBjoern A. Zeeb arg->tim_info[i].tim_num_ps_pending = 3856da8fa4e3SBjoern A. Zeeb ev->bcn_info[i].tim_info.tim_num_ps_pending; 3857da8fa4e3SBjoern A. Zeeb 3858da8fa4e3SBjoern A. Zeeb /* 10.4 firmware doesn't have p2p support. notice of absence 3859da8fa4e3SBjoern A. Zeeb * info can be ignored for now. 3860da8fa4e3SBjoern A. Zeeb */ 3861da8fa4e3SBjoern A. Zeeb 3862da8fa4e3SBjoern A. Zeeb i++; 3863da8fa4e3SBjoern A. Zeeb } 3864da8fa4e3SBjoern A. Zeeb 3865da8fa4e3SBjoern A. Zeeb return 0; 3866da8fa4e3SBjoern A. Zeeb } 3867da8fa4e3SBjoern A. Zeeb 3868da8fa4e3SBjoern A. Zeeb static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar) 3869da8fa4e3SBjoern A. Zeeb { 3870da8fa4e3SBjoern A. Zeeb return WMI_TXBF_CONF_BEFORE_ASSOC; 3871da8fa4e3SBjoern A. Zeeb } 3872da8fa4e3SBjoern A. Zeeb 3873da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb) 3874da8fa4e3SBjoern A. Zeeb { 3875da8fa4e3SBjoern A. Zeeb struct wmi_swba_ev_arg arg = {}; 3876da8fa4e3SBjoern A. Zeeb u32 map; 3877da8fa4e3SBjoern A. Zeeb int i = -1; 3878da8fa4e3SBjoern A. Zeeb const struct wmi_tim_info_arg *tim_info; 3879da8fa4e3SBjoern A. Zeeb const struct wmi_p2p_noa_info *noa_info; 3880da8fa4e3SBjoern A. Zeeb struct ath10k_vif *arvif; 3881da8fa4e3SBjoern A. Zeeb struct sk_buff *bcn; 3882da8fa4e3SBjoern A. Zeeb dma_addr_t paddr; 3883da8fa4e3SBjoern A. Zeeb int ret, vdev_id = 0; 3884da8fa4e3SBjoern A. Zeeb 3885da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_swba(ar, skb, &arg); 3886da8fa4e3SBjoern A. Zeeb if (ret) { 3887da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse swba event: %d\n", ret); 3888da8fa4e3SBjoern A. Zeeb return; 3889da8fa4e3SBjoern A. Zeeb } 3890da8fa4e3SBjoern A. Zeeb 3891da8fa4e3SBjoern A. Zeeb map = __le32_to_cpu(arg.vdev_map); 3892da8fa4e3SBjoern A. Zeeb 3893da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n", 3894da8fa4e3SBjoern A. Zeeb map); 3895da8fa4e3SBjoern A. Zeeb 3896da8fa4e3SBjoern A. Zeeb for (; map; map >>= 1, vdev_id++) { 3897da8fa4e3SBjoern A. Zeeb if (!(map & 0x1)) 3898da8fa4e3SBjoern A. Zeeb continue; 3899da8fa4e3SBjoern A. Zeeb 3900da8fa4e3SBjoern A. Zeeb i++; 3901da8fa4e3SBjoern A. Zeeb 3902da8fa4e3SBjoern A. Zeeb if (i >= WMI_MAX_AP_VDEV) { 3903da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "swba has corrupted vdev map\n"); 3904da8fa4e3SBjoern A. Zeeb break; 3905da8fa4e3SBjoern A. Zeeb } 3906da8fa4e3SBjoern A. Zeeb 3907da8fa4e3SBjoern A. Zeeb tim_info = &arg.tim_info[i]; 3908da8fa4e3SBjoern A. Zeeb noa_info = arg.noa_info[i]; 3909da8fa4e3SBjoern A. Zeeb 3910da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_MGMT, 3911da8fa4e3SBjoern A. Zeeb "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n", 3912da8fa4e3SBjoern A. Zeeb i, 3913da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_len), 3914da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_mcast), 3915da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_changed), 3916da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_num_ps_pending), 3917da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_bitmap[3]), 3918da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_bitmap[2]), 3919da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_bitmap[1]), 3920da8fa4e3SBjoern A. Zeeb __le32_to_cpu(tim_info->tim_bitmap[0])); 3921da8fa4e3SBjoern A. Zeeb 3922da8fa4e3SBjoern A. Zeeb /* TODO: Only first 4 word from tim_bitmap is dumped. 3923da8fa4e3SBjoern A. Zeeb * Extend debug code to dump full tim_bitmap. 3924da8fa4e3SBjoern A. Zeeb */ 3925da8fa4e3SBjoern A. Zeeb 3926da8fa4e3SBjoern A. Zeeb arvif = ath10k_get_arvif(ar, vdev_id); 3927da8fa4e3SBjoern A. Zeeb if (arvif == NULL) { 3928da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "no vif for vdev_id %d found\n", 3929da8fa4e3SBjoern A. Zeeb vdev_id); 3930da8fa4e3SBjoern A. Zeeb continue; 3931da8fa4e3SBjoern A. Zeeb } 3932da8fa4e3SBjoern A. Zeeb 3933da8fa4e3SBjoern A. Zeeb /* mac80211 would have already asked us to stop beaconing and 3934da8fa4e3SBjoern A. Zeeb * bring the vdev down, so continue in that case 3935da8fa4e3SBjoern A. Zeeb */ 3936da8fa4e3SBjoern A. Zeeb if (!arvif->is_up) 3937da8fa4e3SBjoern A. Zeeb continue; 3938da8fa4e3SBjoern A. Zeeb 3939da8fa4e3SBjoern A. Zeeb /* There are no completions for beacons so wait for next SWBA 3940da8fa4e3SBjoern A. Zeeb * before telling mac80211 to decrement CSA counter 3941da8fa4e3SBjoern A. Zeeb * 3942da8fa4e3SBjoern A. Zeeb * Once CSA counter is completed stop sending beacons until 3943da8fa4e3SBjoern A. Zeeb * actual channel switch is done 3944da8fa4e3SBjoern A. Zeeb */ 3945da8fa4e3SBjoern A. Zeeb if (arvif->vif->csa_active && 3946da8fa4e3SBjoern A. Zeeb ieee80211_beacon_cntdwn_is_complete(arvif->vif)) { 3947da8fa4e3SBjoern A. Zeeb ieee80211_csa_finish(arvif->vif); 3948da8fa4e3SBjoern A. Zeeb continue; 3949da8fa4e3SBjoern A. Zeeb } 3950da8fa4e3SBjoern A. Zeeb 3951da8fa4e3SBjoern A. Zeeb bcn = ieee80211_beacon_get(ar->hw, arvif->vif, 0); 3952da8fa4e3SBjoern A. Zeeb if (!bcn) { 3953da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "could not get mac80211 beacon\n"); 3954da8fa4e3SBjoern A. Zeeb continue; 3955da8fa4e3SBjoern A. Zeeb } 3956da8fa4e3SBjoern A. Zeeb 3957da8fa4e3SBjoern A. Zeeb ath10k_tx_h_seq_no(arvif->vif, bcn); 3958da8fa4e3SBjoern A. Zeeb ath10k_wmi_update_tim(ar, arvif, bcn, tim_info); 3959da8fa4e3SBjoern A. Zeeb ath10k_wmi_update_noa(ar, arvif, bcn, noa_info); 3960da8fa4e3SBjoern A. Zeeb 3961da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 3962da8fa4e3SBjoern A. Zeeb 3963da8fa4e3SBjoern A. Zeeb if (arvif->beacon) { 3964da8fa4e3SBjoern A. Zeeb switch (arvif->beacon_state) { 3965da8fa4e3SBjoern A. Zeeb case ATH10K_BEACON_SENT: 3966da8fa4e3SBjoern A. Zeeb break; 3967da8fa4e3SBjoern A. Zeeb case ATH10K_BEACON_SCHEDULED: 3968da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n", 3969da8fa4e3SBjoern A. Zeeb arvif->vdev_id); 3970da8fa4e3SBjoern A. Zeeb break; 3971da8fa4e3SBjoern A. Zeeb case ATH10K_BEACON_SENDING: 3972da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n", 3973da8fa4e3SBjoern A. Zeeb arvif->vdev_id); 3974da8fa4e3SBjoern A. Zeeb dev_kfree_skb(bcn); 3975da8fa4e3SBjoern A. Zeeb goto skip; 3976da8fa4e3SBjoern A. Zeeb } 3977da8fa4e3SBjoern A. Zeeb 3978da8fa4e3SBjoern A. Zeeb ath10k_mac_vif_beacon_free(arvif); 3979da8fa4e3SBjoern A. Zeeb } 3980da8fa4e3SBjoern A. Zeeb 3981da8fa4e3SBjoern A. Zeeb if (!arvif->beacon_buf) { 3982da8fa4e3SBjoern A. Zeeb paddr = dma_map_single(arvif->ar->dev, bcn->data, 3983da8fa4e3SBjoern A. Zeeb bcn->len, DMA_TO_DEVICE); 3984da8fa4e3SBjoern A. Zeeb ret = dma_mapping_error(arvif->ar->dev, paddr); 3985da8fa4e3SBjoern A. Zeeb if (ret) { 3986da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to map beacon: %d\n", 3987da8fa4e3SBjoern A. Zeeb ret); 3988da8fa4e3SBjoern A. Zeeb dev_kfree_skb_any(bcn); 3989da8fa4e3SBjoern A. Zeeb goto skip; 3990da8fa4e3SBjoern A. Zeeb } 3991da8fa4e3SBjoern A. Zeeb 3992da8fa4e3SBjoern A. Zeeb ATH10K_SKB_CB(bcn)->paddr = paddr; 3993da8fa4e3SBjoern A. Zeeb } else { 3994da8fa4e3SBjoern A. Zeeb if (bcn->len > IEEE80211_MAX_FRAME_LEN) { 3995da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n", 3996da8fa4e3SBjoern A. Zeeb bcn->len, IEEE80211_MAX_FRAME_LEN); 3997da8fa4e3SBjoern A. Zeeb skb_trim(bcn, IEEE80211_MAX_FRAME_LEN); 3998da8fa4e3SBjoern A. Zeeb } 3999da8fa4e3SBjoern A. Zeeb memcpy(arvif->beacon_buf, bcn->data, bcn->len); 4000da8fa4e3SBjoern A. Zeeb ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr; 4001da8fa4e3SBjoern A. Zeeb } 4002da8fa4e3SBjoern A. Zeeb 4003da8fa4e3SBjoern A. Zeeb arvif->beacon = bcn; 4004da8fa4e3SBjoern A. Zeeb arvif->beacon_state = ATH10K_BEACON_SCHEDULED; 4005da8fa4e3SBjoern A. Zeeb 4006da8fa4e3SBjoern A. Zeeb trace_ath10k_tx_hdr(ar, bcn->data, bcn->len); 4007da8fa4e3SBjoern A. Zeeb trace_ath10k_tx_payload(ar, bcn->data, bcn->len); 4008da8fa4e3SBjoern A. Zeeb 4009da8fa4e3SBjoern A. Zeeb skip: 4010da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 4011da8fa4e3SBjoern A. Zeeb } 4012da8fa4e3SBjoern A. Zeeb 4013da8fa4e3SBjoern A. Zeeb ath10k_wmi_tx_beacons_nowait(ar); 4014da8fa4e3SBjoern A. Zeeb } 4015da8fa4e3SBjoern A. Zeeb 4016da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb) 4017da8fa4e3SBjoern A. Zeeb { 4018da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n"); 4019da8fa4e3SBjoern A. Zeeb } 4020da8fa4e3SBjoern A. Zeeb 4021da8fa4e3SBjoern A. Zeeb static void ath10k_radar_detected(struct ath10k *ar) 4022da8fa4e3SBjoern A. Zeeb { 4023da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n"); 4024da8fa4e3SBjoern A. Zeeb ATH10K_DFS_STAT_INC(ar, radar_detected); 4025da8fa4e3SBjoern A. Zeeb 4026da8fa4e3SBjoern A. Zeeb /* Control radar events reporting in debugfs file 4027da8fa4e3SBjoern A. Zeeb * dfs_block_radar_events 4028da8fa4e3SBjoern A. Zeeb */ 4029da8fa4e3SBjoern A. Zeeb if (ar->dfs_block_radar_events) 4030da8fa4e3SBjoern A. Zeeb ath10k_info(ar, "DFS Radar detected, but ignored as requested\n"); 4031da8fa4e3SBjoern A. Zeeb else 4032da8fa4e3SBjoern A. Zeeb ieee80211_radar_detected(ar->hw); 4033da8fa4e3SBjoern A. Zeeb } 4034da8fa4e3SBjoern A. Zeeb 4035da8fa4e3SBjoern A. Zeeb static void ath10k_radar_confirmation_work(struct work_struct *work) 4036da8fa4e3SBjoern A. Zeeb { 4037da8fa4e3SBjoern A. Zeeb struct ath10k *ar = container_of(work, struct ath10k, 4038da8fa4e3SBjoern A. Zeeb radar_confirmation_work); 4039da8fa4e3SBjoern A. Zeeb struct ath10k_radar_found_info radar_info; 4040da8fa4e3SBjoern A. Zeeb int ret, time_left; 4041da8fa4e3SBjoern A. Zeeb 4042da8fa4e3SBjoern A. Zeeb reinit_completion(&ar->wmi.radar_confirm); 4043da8fa4e3SBjoern A. Zeeb 4044da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 4045da8fa4e3SBjoern A. Zeeb memcpy(&radar_info, &ar->last_radar_info, sizeof(radar_info)); 4046da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 4047da8fa4e3SBjoern A. Zeeb 4048da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_report_radar_found(ar, &radar_info); 4049da8fa4e3SBjoern A. Zeeb if (ret) { 4050da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to send radar found %d\n", ret); 4051da8fa4e3SBjoern A. Zeeb goto wait_complete; 4052da8fa4e3SBjoern A. Zeeb } 4053da8fa4e3SBjoern A. Zeeb 4054da8fa4e3SBjoern A. Zeeb time_left = wait_for_completion_timeout(&ar->wmi.radar_confirm, 4055da8fa4e3SBjoern A. Zeeb ATH10K_WMI_DFS_CONF_TIMEOUT_HZ); 4056da8fa4e3SBjoern A. Zeeb if (time_left) { 4057da8fa4e3SBjoern A. Zeeb /* DFS Confirmation status event received and 4058da8fa4e3SBjoern A. Zeeb * necessary action completed. 4059da8fa4e3SBjoern A. Zeeb */ 4060da8fa4e3SBjoern A. Zeeb goto wait_complete; 4061da8fa4e3SBjoern A. Zeeb } else { 4062da8fa4e3SBjoern A. Zeeb /* DFS Confirmation event not received from FW.Considering this 4063da8fa4e3SBjoern A. Zeeb * as real radar. 4064da8fa4e3SBjoern A. Zeeb */ 4065da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4066da8fa4e3SBjoern A. Zeeb "dfs confirmation not received from fw, considering as radar\n"); 4067da8fa4e3SBjoern A. Zeeb goto radar_detected; 4068da8fa4e3SBjoern A. Zeeb } 4069da8fa4e3SBjoern A. Zeeb 4070da8fa4e3SBjoern A. Zeeb radar_detected: 4071da8fa4e3SBjoern A. Zeeb ath10k_radar_detected(ar); 4072da8fa4e3SBjoern A. Zeeb 4073da8fa4e3SBjoern A. Zeeb /* Reset state to allow sending confirmation on consecutive radar 4074da8fa4e3SBjoern A. Zeeb * detections, unless radar confirmation is disabled/stopped. 4075da8fa4e3SBjoern A. Zeeb */ 4076da8fa4e3SBjoern A. Zeeb wait_complete: 4077da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 4078da8fa4e3SBjoern A. Zeeb if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_STOPPED) 4079da8fa4e3SBjoern A. Zeeb ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; 4080da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 4081da8fa4e3SBjoern A. Zeeb } 4082da8fa4e3SBjoern A. Zeeb 4083da8fa4e3SBjoern A. Zeeb static void ath10k_dfs_radar_report(struct ath10k *ar, 4084da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg *phyerr, 4085da8fa4e3SBjoern A. Zeeb const struct phyerr_radar_report *rr, 4086da8fa4e3SBjoern A. Zeeb u64 tsf) 4087da8fa4e3SBjoern A. Zeeb { 4088da8fa4e3SBjoern A. Zeeb u32 reg0, reg1, tsf32l; 4089da8fa4e3SBjoern A. Zeeb struct ieee80211_channel *ch; 4090da8fa4e3SBjoern A. Zeeb struct pulse_event pe; 4091da8fa4e3SBjoern A. Zeeb struct radar_detector_specs rs; 4092da8fa4e3SBjoern A. Zeeb u64 tsf64; 4093da8fa4e3SBjoern A. Zeeb u8 rssi, width; 4094da8fa4e3SBjoern A. Zeeb struct ath10k_radar_found_info *radar_info; 4095da8fa4e3SBjoern A. Zeeb 4096da8fa4e3SBjoern A. Zeeb reg0 = __le32_to_cpu(rr->reg0); 4097da8fa4e3SBjoern A. Zeeb reg1 = __le32_to_cpu(rr->reg1); 4098da8fa4e3SBjoern A. Zeeb 4099da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4100da8fa4e3SBjoern A. Zeeb "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n", 4101da8fa4e3SBjoern A. Zeeb MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP), 4102da8fa4e3SBjoern A. Zeeb MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH), 4103da8fa4e3SBjoern A. Zeeb MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN), 4104da8fa4e3SBjoern A. Zeeb MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF)); 4105da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4106da8fa4e3SBjoern A. Zeeb "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n", 4107da8fa4e3SBjoern A. Zeeb MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK), 4108da8fa4e3SBjoern A. Zeeb MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX), 4109da8fa4e3SBjoern A. Zeeb MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID), 4110da8fa4e3SBjoern A. Zeeb MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN), 4111da8fa4e3SBjoern A. Zeeb MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK)); 4112da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4113da8fa4e3SBjoern A. Zeeb "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n", 4114da8fa4e3SBjoern A. Zeeb MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET), 4115da8fa4e3SBjoern A. Zeeb MS(reg1, RADAR_REPORT_REG1_PULSE_DUR)); 4116da8fa4e3SBjoern A. Zeeb 4117da8fa4e3SBjoern A. Zeeb if (!ar->dfs_detector) 4118da8fa4e3SBjoern A. Zeeb return; 4119da8fa4e3SBjoern A. Zeeb 4120da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 4121da8fa4e3SBjoern A. Zeeb ch = ar->rx_channel; 4122da8fa4e3SBjoern A. Zeeb 4123da8fa4e3SBjoern A. Zeeb /* fetch target operating channel during channel change */ 4124da8fa4e3SBjoern A. Zeeb if (!ch) 4125da8fa4e3SBjoern A. Zeeb ch = ar->tgt_oper_chan; 4126da8fa4e3SBjoern A. Zeeb 4127da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 4128da8fa4e3SBjoern A. Zeeb 4129da8fa4e3SBjoern A. Zeeb if (!ch) { 4130da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n"); 4131da8fa4e3SBjoern A. Zeeb goto radar_detected; 4132da8fa4e3SBjoern A. Zeeb } 4133da8fa4e3SBjoern A. Zeeb 4134da8fa4e3SBjoern A. Zeeb /* report event to DFS pattern detector */ 4135da8fa4e3SBjoern A. Zeeb tsf32l = phyerr->tsf_timestamp; 4136da8fa4e3SBjoern A. Zeeb tsf64 = tsf & (~0xFFFFFFFFULL); 4137da8fa4e3SBjoern A. Zeeb tsf64 |= tsf32l; 4138da8fa4e3SBjoern A. Zeeb 4139da8fa4e3SBjoern A. Zeeb width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR); 4140da8fa4e3SBjoern A. Zeeb rssi = phyerr->rssi_combined; 4141da8fa4e3SBjoern A. Zeeb 4142da8fa4e3SBjoern A. Zeeb /* hardware store this as 8 bit signed value, 4143da8fa4e3SBjoern A. Zeeb * set to zero if negative number 4144da8fa4e3SBjoern A. Zeeb */ 4145da8fa4e3SBjoern A. Zeeb if (rssi & 0x80) 4146da8fa4e3SBjoern A. Zeeb rssi = 0; 4147da8fa4e3SBjoern A. Zeeb 4148da8fa4e3SBjoern A. Zeeb pe.ts = tsf64; 4149da8fa4e3SBjoern A. Zeeb pe.freq = ch->center_freq; 4150da8fa4e3SBjoern A. Zeeb pe.width = width; 4151da8fa4e3SBjoern A. Zeeb pe.rssi = rssi; 4152da8fa4e3SBjoern A. Zeeb pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0); 4153da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4154da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4155da8fa4e3SBjoern A. Zeeb "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n", 4156da8fa4e3SBjoern A. Zeeb pe.freq, pe.width, pe.rssi, pe.ts); 4157da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4158da8fa4e3SBjoern A. Zeeb "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %jX\n", 4159da8fa4e3SBjoern A. Zeeb pe.freq, pe.width, pe.rssi, (uintmax_t)pe.ts); 4160da8fa4e3SBjoern A. Zeeb #endif 4161da8fa4e3SBjoern A. Zeeb 4162da8fa4e3SBjoern A. Zeeb ATH10K_DFS_STAT_INC(ar, pulses_detected); 4163da8fa4e3SBjoern A. Zeeb 4164da8fa4e3SBjoern A. Zeeb if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe, &rs)) { 4165da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4166da8fa4e3SBjoern A. Zeeb "dfs no pulse pattern detected, yet\n"); 4167da8fa4e3SBjoern A. Zeeb return; 4168da8fa4e3SBjoern A. Zeeb } 4169da8fa4e3SBjoern A. Zeeb 4170da8fa4e3SBjoern A. Zeeb if ((test_bit(WMI_SERVICE_HOST_DFS_CHECK_SUPPORT, ar->wmi.svc_map)) && 4171da8fa4e3SBjoern A. Zeeb ar->dfs_detector->region == NL80211_DFS_FCC) { 4172da8fa4e3SBjoern A. Zeeb /* Consecutive radar indications need not be 4173da8fa4e3SBjoern A. Zeeb * sent to the firmware until we get confirmation 4174da8fa4e3SBjoern A. Zeeb * for the previous detected radar. 4175da8fa4e3SBjoern A. Zeeb */ 4176da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 4177da8fa4e3SBjoern A. Zeeb if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_IDLE) { 4178da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 4179da8fa4e3SBjoern A. Zeeb return; 4180da8fa4e3SBjoern A. Zeeb } 4181da8fa4e3SBjoern A. Zeeb ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_INPROGRESS; 4182da8fa4e3SBjoern A. Zeeb radar_info = &ar->last_radar_info; 4183da8fa4e3SBjoern A. Zeeb 4184da8fa4e3SBjoern A. Zeeb radar_info->pri_min = rs.pri_min; 4185da8fa4e3SBjoern A. Zeeb radar_info->pri_max = rs.pri_max; 4186da8fa4e3SBjoern A. Zeeb radar_info->width_min = rs.width_min; 4187da8fa4e3SBjoern A. Zeeb radar_info->width_max = rs.width_max; 4188da8fa4e3SBjoern A. Zeeb /*TODO Find sidx_min and sidx_max */ 4189da8fa4e3SBjoern A. Zeeb radar_info->sidx_min = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX); 4190da8fa4e3SBjoern A. Zeeb radar_info->sidx_max = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX); 4191da8fa4e3SBjoern A. Zeeb 4192da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4193da8fa4e3SBjoern A. Zeeb "sending wmi radar found cmd pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n", 4194da8fa4e3SBjoern A. Zeeb radar_info->pri_min, radar_info->pri_max, 4195da8fa4e3SBjoern A. Zeeb radar_info->width_min, radar_info->width_max, 4196da8fa4e3SBjoern A. Zeeb radar_info->sidx_min, radar_info->sidx_max); 4197da8fa4e3SBjoern A. Zeeb ieee80211_queue_work(ar->hw, &ar->radar_confirmation_work); 4198da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 4199da8fa4e3SBjoern A. Zeeb return; 4200da8fa4e3SBjoern A. Zeeb } 4201da8fa4e3SBjoern A. Zeeb 4202da8fa4e3SBjoern A. Zeeb radar_detected: 4203da8fa4e3SBjoern A. Zeeb ath10k_radar_detected(ar); 4204da8fa4e3SBjoern A. Zeeb } 4205da8fa4e3SBjoern A. Zeeb 4206da8fa4e3SBjoern A. Zeeb static int ath10k_dfs_fft_report(struct ath10k *ar, 4207da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg *phyerr, 4208da8fa4e3SBjoern A. Zeeb const struct phyerr_fft_report *fftr, 4209da8fa4e3SBjoern A. Zeeb u64 tsf) 4210da8fa4e3SBjoern A. Zeeb { 4211da8fa4e3SBjoern A. Zeeb u32 reg0, reg1; 4212da8fa4e3SBjoern A. Zeeb u8 rssi, peak_mag; 4213da8fa4e3SBjoern A. Zeeb 4214da8fa4e3SBjoern A. Zeeb reg0 = __le32_to_cpu(fftr->reg0); 4215da8fa4e3SBjoern A. Zeeb reg1 = __le32_to_cpu(fftr->reg1); 4216da8fa4e3SBjoern A. Zeeb rssi = phyerr->rssi_combined; 4217da8fa4e3SBjoern A. Zeeb 4218da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4219da8fa4e3SBjoern A. Zeeb "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n", 4220da8fa4e3SBjoern A. Zeeb MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB), 4221da8fa4e3SBjoern A. Zeeb MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB), 4222da8fa4e3SBjoern A. Zeeb MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX), 4223da8fa4e3SBjoern A. Zeeb MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX)); 4224da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4225da8fa4e3SBjoern A. Zeeb "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n", 4226da8fa4e3SBjoern A. Zeeb MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB), 4227da8fa4e3SBjoern A. Zeeb MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB), 4228da8fa4e3SBjoern A. Zeeb MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG), 4229da8fa4e3SBjoern A. Zeeb MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB)); 4230da8fa4e3SBjoern A. Zeeb 4231da8fa4e3SBjoern A. Zeeb peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG); 4232da8fa4e3SBjoern A. Zeeb 4233da8fa4e3SBjoern A. Zeeb /* false event detection */ 4234da8fa4e3SBjoern A. Zeeb if (rssi == DFS_RSSI_POSSIBLY_FALSE && 4235da8fa4e3SBjoern A. Zeeb peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) { 4236da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n"); 4237da8fa4e3SBjoern A. Zeeb ATH10K_DFS_STAT_INC(ar, pulses_discarded); 4238da8fa4e3SBjoern A. Zeeb return -EINVAL; 4239da8fa4e3SBjoern A. Zeeb } 4240da8fa4e3SBjoern A. Zeeb 4241da8fa4e3SBjoern A. Zeeb return 0; 4242da8fa4e3SBjoern A. Zeeb } 4243da8fa4e3SBjoern A. Zeeb 4244da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_dfs(struct ath10k *ar, 4245da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg *phyerr, 4246da8fa4e3SBjoern A. Zeeb u64 tsf) 4247da8fa4e3SBjoern A. Zeeb { 4248da8fa4e3SBjoern A. Zeeb int buf_len, tlv_len, res, i = 0; 4249da8fa4e3SBjoern A. Zeeb const struct phyerr_tlv *tlv; 4250da8fa4e3SBjoern A. Zeeb const struct phyerr_radar_report *rr; 4251da8fa4e3SBjoern A. Zeeb const struct phyerr_fft_report *fftr; 4252da8fa4e3SBjoern A. Zeeb const u8 *tlv_buf; 4253da8fa4e3SBjoern A. Zeeb 4254da8fa4e3SBjoern A. Zeeb buf_len = phyerr->buf_len; 4255da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4256da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4257da8fa4e3SBjoern A. Zeeb "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n", 4258da8fa4e3SBjoern A. Zeeb phyerr->phy_err_code, phyerr->rssi_combined, 4259da8fa4e3SBjoern A. Zeeb phyerr->tsf_timestamp, tsf, buf_len); 4260da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4261da8fa4e3SBjoern A. Zeeb "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%jX len %d\n", 4262da8fa4e3SBjoern A. Zeeb phyerr->phy_err_code, phyerr->rssi_combined, 4263da8fa4e3SBjoern A. Zeeb phyerr->tsf_timestamp, (uintmax_t)tsf, buf_len); 4264da8fa4e3SBjoern A. Zeeb #endif 4265da8fa4e3SBjoern A. Zeeb 4266da8fa4e3SBjoern A. Zeeb /* Skip event if DFS disabled */ 4267da8fa4e3SBjoern A. Zeeb if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) 4268da8fa4e3SBjoern A. Zeeb return; 4269da8fa4e3SBjoern A. Zeeb 4270da8fa4e3SBjoern A. Zeeb ATH10K_DFS_STAT_INC(ar, pulses_total); 4271da8fa4e3SBjoern A. Zeeb 4272da8fa4e3SBjoern A. Zeeb while (i < buf_len) { 4273da8fa4e3SBjoern A. Zeeb if (i + sizeof(*tlv) > buf_len) { 4274da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "too short buf for tlv header (%d)\n", 4275da8fa4e3SBjoern A. Zeeb i); 4276da8fa4e3SBjoern A. Zeeb return; 4277da8fa4e3SBjoern A. Zeeb } 4278da8fa4e3SBjoern A. Zeeb 4279da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4280da8fa4e3SBjoern A. Zeeb tlv = (struct phyerr_tlv *)&phyerr->buf[i]; 4281da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4282da8fa4e3SBjoern A. Zeeb tlv = (const struct phyerr_tlv *)&phyerr->buf[i]; 4283da8fa4e3SBjoern A. Zeeb #endif 4284da8fa4e3SBjoern A. Zeeb tlv_len = __le16_to_cpu(tlv->len); 4285da8fa4e3SBjoern A. Zeeb tlv_buf = &phyerr->buf[i + sizeof(*tlv)]; 4286da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4287da8fa4e3SBjoern A. Zeeb "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n", 4288da8fa4e3SBjoern A. Zeeb tlv_len, tlv->tag, tlv->sig); 4289da8fa4e3SBjoern A. Zeeb 4290da8fa4e3SBjoern A. Zeeb switch (tlv->tag) { 4291da8fa4e3SBjoern A. Zeeb case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY: 4292da8fa4e3SBjoern A. Zeeb if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) { 4293da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "too short radar pulse summary (%d)\n", 4294da8fa4e3SBjoern A. Zeeb i); 4295da8fa4e3SBjoern A. Zeeb return; 4296da8fa4e3SBjoern A. Zeeb } 4297da8fa4e3SBjoern A. Zeeb 4298da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4299da8fa4e3SBjoern A. Zeeb rr = (struct phyerr_radar_report *)tlv_buf; 4300da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4301da8fa4e3SBjoern A. Zeeb rr = (const struct phyerr_radar_report *)tlv_buf; 4302da8fa4e3SBjoern A. Zeeb #endif 4303da8fa4e3SBjoern A. Zeeb ath10k_dfs_radar_report(ar, phyerr, rr, tsf); 4304da8fa4e3SBjoern A. Zeeb break; 4305da8fa4e3SBjoern A. Zeeb case PHYERR_TLV_TAG_SEARCH_FFT_REPORT: 4306da8fa4e3SBjoern A. Zeeb if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) { 4307da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "too short fft report (%d)\n", 4308da8fa4e3SBjoern A. Zeeb i); 4309da8fa4e3SBjoern A. Zeeb return; 4310da8fa4e3SBjoern A. Zeeb } 4311da8fa4e3SBjoern A. Zeeb 4312da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4313da8fa4e3SBjoern A. Zeeb fftr = (struct phyerr_fft_report *)tlv_buf; 4314da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4315da8fa4e3SBjoern A. Zeeb fftr = (const struct phyerr_fft_report *)tlv_buf; 4316da8fa4e3SBjoern A. Zeeb #endif 4317da8fa4e3SBjoern A. Zeeb res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf); 4318da8fa4e3SBjoern A. Zeeb if (res) 4319da8fa4e3SBjoern A. Zeeb return; 4320da8fa4e3SBjoern A. Zeeb break; 4321da8fa4e3SBjoern A. Zeeb } 4322da8fa4e3SBjoern A. Zeeb 4323da8fa4e3SBjoern A. Zeeb i += sizeof(*tlv) + tlv_len; 4324da8fa4e3SBjoern A. Zeeb } 4325da8fa4e3SBjoern A. Zeeb } 4326da8fa4e3SBjoern A. Zeeb 4327da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_spectral_scan(struct ath10k *ar, 4328da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg *phyerr, 4329da8fa4e3SBjoern A. Zeeb u64 tsf) 4330da8fa4e3SBjoern A. Zeeb { 4331da8fa4e3SBjoern A. Zeeb int buf_len, tlv_len, res, i = 0; 4332da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4333da8fa4e3SBjoern A. Zeeb struct phyerr_tlv *tlv; 4334da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4335da8fa4e3SBjoern A. Zeeb const struct phyerr_tlv *tlv; 4336da8fa4e3SBjoern A. Zeeb #endif 4337da8fa4e3SBjoern A. Zeeb const void *tlv_buf; 4338da8fa4e3SBjoern A. Zeeb const struct phyerr_fft_report *fftr; 4339da8fa4e3SBjoern A. Zeeb size_t fftr_len; 4340da8fa4e3SBjoern A. Zeeb 4341da8fa4e3SBjoern A. Zeeb buf_len = phyerr->buf_len; 4342da8fa4e3SBjoern A. Zeeb 4343da8fa4e3SBjoern A. Zeeb while (i < buf_len) { 4344da8fa4e3SBjoern A. Zeeb if (i + sizeof(*tlv) > buf_len) { 4345da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n", 4346da8fa4e3SBjoern A. Zeeb i); 4347da8fa4e3SBjoern A. Zeeb return; 4348da8fa4e3SBjoern A. Zeeb } 4349da8fa4e3SBjoern A. Zeeb 4350da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4351da8fa4e3SBjoern A. Zeeb tlv = (struct phyerr_tlv *)&phyerr->buf[i]; 4352da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4353da8fa4e3SBjoern A. Zeeb tlv = (const struct phyerr_tlv *)&phyerr->buf[i]; 4354da8fa4e3SBjoern A. Zeeb #endif 4355da8fa4e3SBjoern A. Zeeb tlv_len = __le16_to_cpu(tlv->len); 4356da8fa4e3SBjoern A. Zeeb tlv_buf = &phyerr->buf[i + sizeof(*tlv)]; 4357da8fa4e3SBjoern A. Zeeb 4358da8fa4e3SBjoern A. Zeeb if (i + sizeof(*tlv) + tlv_len > buf_len) { 4359da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n", 4360da8fa4e3SBjoern A. Zeeb i); 4361da8fa4e3SBjoern A. Zeeb return; 4362da8fa4e3SBjoern A. Zeeb } 4363da8fa4e3SBjoern A. Zeeb 4364da8fa4e3SBjoern A. Zeeb switch (tlv->tag) { 4365da8fa4e3SBjoern A. Zeeb case PHYERR_TLV_TAG_SEARCH_FFT_REPORT: 4366da8fa4e3SBjoern A. Zeeb if (sizeof(*fftr) > tlv_len) { 4367da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse fft report at byte %d\n", 4368da8fa4e3SBjoern A. Zeeb i); 4369da8fa4e3SBjoern A. Zeeb return; 4370da8fa4e3SBjoern A. Zeeb } 4371da8fa4e3SBjoern A. Zeeb 4372da8fa4e3SBjoern A. Zeeb fftr_len = tlv_len - sizeof(*fftr); 4373da8fa4e3SBjoern A. Zeeb fftr = tlv_buf; 4374da8fa4e3SBjoern A. Zeeb res = ath10k_spectral_process_fft(ar, phyerr, 4375da8fa4e3SBjoern A. Zeeb fftr, fftr_len, 4376da8fa4e3SBjoern A. Zeeb tsf); 4377da8fa4e3SBjoern A. Zeeb if (res < 0) { 4378da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n", 4379da8fa4e3SBjoern A. Zeeb res); 4380da8fa4e3SBjoern A. Zeeb return; 4381da8fa4e3SBjoern A. Zeeb } 4382da8fa4e3SBjoern A. Zeeb break; 4383da8fa4e3SBjoern A. Zeeb } 4384da8fa4e3SBjoern A. Zeeb 4385da8fa4e3SBjoern A. Zeeb i += sizeof(*tlv) + tlv_len; 4386da8fa4e3SBjoern A. Zeeb } 4387da8fa4e3SBjoern A. Zeeb } 4388da8fa4e3SBjoern A. Zeeb 4389da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar, 4390da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 4391da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_hdr_arg *arg) 4392da8fa4e3SBjoern A. Zeeb { 4393da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_event *ev = (void *)skb->data; 4394da8fa4e3SBjoern A. Zeeb 4395da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 4396da8fa4e3SBjoern A. Zeeb return -EPROTO; 4397da8fa4e3SBjoern A. Zeeb 4398da8fa4e3SBjoern A. Zeeb arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs); 4399da8fa4e3SBjoern A. Zeeb arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32); 4400da8fa4e3SBjoern A. Zeeb arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32); 4401da8fa4e3SBjoern A. Zeeb arg->buf_len = skb->len - sizeof(*ev); 4402da8fa4e3SBjoern A. Zeeb arg->phyerrs = ev->phyerrs; 4403da8fa4e3SBjoern A. Zeeb 4404da8fa4e3SBjoern A. Zeeb return 0; 4405da8fa4e3SBjoern A. Zeeb } 4406da8fa4e3SBjoern A. Zeeb 4407da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar, 4408da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 4409da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_hdr_arg *arg) 4410da8fa4e3SBjoern A. Zeeb { 4411da8fa4e3SBjoern A. Zeeb struct wmi_10_4_phyerr_event *ev = (void *)skb->data; 4412da8fa4e3SBjoern A. Zeeb 4413da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 4414da8fa4e3SBjoern A. Zeeb return -EPROTO; 4415da8fa4e3SBjoern A. Zeeb 4416da8fa4e3SBjoern A. Zeeb /* 10.4 firmware always reports only one phyerr */ 4417da8fa4e3SBjoern A. Zeeb arg->num_phyerrs = 1; 4418da8fa4e3SBjoern A. Zeeb 4419da8fa4e3SBjoern A. Zeeb arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32); 4420da8fa4e3SBjoern A. Zeeb arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32); 4421da8fa4e3SBjoern A. Zeeb arg->buf_len = skb->len; 4422da8fa4e3SBjoern A. Zeeb arg->phyerrs = skb->data; 4423da8fa4e3SBjoern A. Zeeb 4424da8fa4e3SBjoern A. Zeeb return 0; 4425da8fa4e3SBjoern A. Zeeb } 4426da8fa4e3SBjoern A. Zeeb 4427da8fa4e3SBjoern A. Zeeb int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar, 4428da8fa4e3SBjoern A. Zeeb const void *phyerr_buf, 4429da8fa4e3SBjoern A. Zeeb int left_len, 4430da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg *arg) 4431da8fa4e3SBjoern A. Zeeb { 4432da8fa4e3SBjoern A. Zeeb const struct wmi_phyerr *phyerr = phyerr_buf; 4433da8fa4e3SBjoern A. Zeeb int i; 4434da8fa4e3SBjoern A. Zeeb 4435da8fa4e3SBjoern A. Zeeb if (left_len < sizeof(*phyerr)) { 4436da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n", 4437da8fa4e3SBjoern A. Zeeb left_len, sizeof(*phyerr)); 4438da8fa4e3SBjoern A. Zeeb return -EINVAL; 4439da8fa4e3SBjoern A. Zeeb } 4440da8fa4e3SBjoern A. Zeeb 4441da8fa4e3SBjoern A. Zeeb arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp); 4442da8fa4e3SBjoern A. Zeeb arg->freq1 = __le16_to_cpu(phyerr->freq1); 4443da8fa4e3SBjoern A. Zeeb arg->freq2 = __le16_to_cpu(phyerr->freq2); 4444da8fa4e3SBjoern A. Zeeb arg->rssi_combined = phyerr->rssi_combined; 4445da8fa4e3SBjoern A. Zeeb arg->chan_width_mhz = phyerr->chan_width_mhz; 4446da8fa4e3SBjoern A. Zeeb arg->buf_len = __le32_to_cpu(phyerr->buf_len); 4447da8fa4e3SBjoern A. Zeeb arg->buf = phyerr->buf; 4448da8fa4e3SBjoern A. Zeeb arg->hdr_len = sizeof(*phyerr); 4449da8fa4e3SBjoern A. Zeeb 4450da8fa4e3SBjoern A. Zeeb for (i = 0; i < 4; i++) 4451da8fa4e3SBjoern A. Zeeb arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]); 4452da8fa4e3SBjoern A. Zeeb 4453da8fa4e3SBjoern A. Zeeb switch (phyerr->phy_err_code) { 4454da8fa4e3SBjoern A. Zeeb case PHY_ERROR_GEN_SPECTRAL_SCAN: 4455da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN; 4456da8fa4e3SBjoern A. Zeeb break; 4457da8fa4e3SBjoern A. Zeeb case PHY_ERROR_GEN_FALSE_RADAR_EXT: 4458da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT; 4459da8fa4e3SBjoern A. Zeeb break; 4460da8fa4e3SBjoern A. Zeeb case PHY_ERROR_GEN_RADAR: 4461da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_RADAR; 4462da8fa4e3SBjoern A. Zeeb break; 4463da8fa4e3SBjoern A. Zeeb default: 4464da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_UNKNOWN; 4465da8fa4e3SBjoern A. Zeeb break; 4466da8fa4e3SBjoern A. Zeeb } 4467da8fa4e3SBjoern A. Zeeb 4468da8fa4e3SBjoern A. Zeeb return 0; 4469da8fa4e3SBjoern A. Zeeb } 4470da8fa4e3SBjoern A. Zeeb 4471da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar, 4472da8fa4e3SBjoern A. Zeeb const void *phyerr_buf, 4473da8fa4e3SBjoern A. Zeeb int left_len, 4474da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg *arg) 4475da8fa4e3SBjoern A. Zeeb { 4476da8fa4e3SBjoern A. Zeeb const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf; 4477da8fa4e3SBjoern A. Zeeb u32 phy_err_mask; 4478da8fa4e3SBjoern A. Zeeb int i; 4479da8fa4e3SBjoern A. Zeeb 4480da8fa4e3SBjoern A. Zeeb if (left_len < sizeof(*phyerr)) { 4481da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n", 4482da8fa4e3SBjoern A. Zeeb left_len, sizeof(*phyerr)); 4483da8fa4e3SBjoern A. Zeeb return -EINVAL; 4484da8fa4e3SBjoern A. Zeeb } 4485da8fa4e3SBjoern A. Zeeb 4486da8fa4e3SBjoern A. Zeeb arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp); 4487da8fa4e3SBjoern A. Zeeb arg->freq1 = __le16_to_cpu(phyerr->freq1); 4488da8fa4e3SBjoern A. Zeeb arg->freq2 = __le16_to_cpu(phyerr->freq2); 4489da8fa4e3SBjoern A. Zeeb arg->rssi_combined = phyerr->rssi_combined; 4490da8fa4e3SBjoern A. Zeeb arg->chan_width_mhz = phyerr->chan_width_mhz; 4491da8fa4e3SBjoern A. Zeeb arg->buf_len = __le32_to_cpu(phyerr->buf_len); 4492da8fa4e3SBjoern A. Zeeb arg->buf = phyerr->buf; 4493da8fa4e3SBjoern A. Zeeb arg->hdr_len = sizeof(*phyerr); 4494da8fa4e3SBjoern A. Zeeb 4495da8fa4e3SBjoern A. Zeeb for (i = 0; i < 4; i++) 4496da8fa4e3SBjoern A. Zeeb arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]); 4497da8fa4e3SBjoern A. Zeeb 4498da8fa4e3SBjoern A. Zeeb phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]); 4499da8fa4e3SBjoern A. Zeeb 4500da8fa4e3SBjoern A. Zeeb if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK) 4501da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN; 4502da8fa4e3SBjoern A. Zeeb else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK) 4503da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_RADAR; 4504da8fa4e3SBjoern A. Zeeb else 4505da8fa4e3SBjoern A. Zeeb arg->phy_err_code = PHY_ERROR_UNKNOWN; 4506da8fa4e3SBjoern A. Zeeb 4507da8fa4e3SBjoern A. Zeeb return 0; 4508da8fa4e3SBjoern A. Zeeb } 4509da8fa4e3SBjoern A. Zeeb 4510da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb) 4511da8fa4e3SBjoern A. Zeeb { 4512da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_hdr_arg hdr_arg = {}; 4513da8fa4e3SBjoern A. Zeeb struct wmi_phyerr_ev_arg phyerr_arg = {}; 4514da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4515da8fa4e3SBjoern A. Zeeb const void *phyerr; 4516da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4517da8fa4e3SBjoern A. Zeeb const u8 *phyerr; 4518da8fa4e3SBjoern A. Zeeb #endif 4519da8fa4e3SBjoern A. Zeeb u32 count, i, buf_len, phy_err_code; 4520da8fa4e3SBjoern A. Zeeb u64 tsf; 4521da8fa4e3SBjoern A. Zeeb int left_len, ret; 4522da8fa4e3SBjoern A. Zeeb 4523da8fa4e3SBjoern A. Zeeb ATH10K_DFS_STAT_INC(ar, phy_errors); 4524da8fa4e3SBjoern A. Zeeb 4525da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg); 4526da8fa4e3SBjoern A. Zeeb if (ret) { 4527da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret); 4528da8fa4e3SBjoern A. Zeeb return; 4529da8fa4e3SBjoern A. Zeeb } 4530da8fa4e3SBjoern A. Zeeb 4531da8fa4e3SBjoern A. Zeeb /* Check number of included events */ 4532da8fa4e3SBjoern A. Zeeb count = hdr_arg.num_phyerrs; 4533da8fa4e3SBjoern A. Zeeb 4534da8fa4e3SBjoern A. Zeeb left_len = hdr_arg.buf_len; 4535da8fa4e3SBjoern A. Zeeb 4536da8fa4e3SBjoern A. Zeeb tsf = hdr_arg.tsf_u32; 4537da8fa4e3SBjoern A. Zeeb tsf <<= 32; 4538da8fa4e3SBjoern A. Zeeb tsf |= hdr_arg.tsf_l32; 4539da8fa4e3SBjoern A. Zeeb 4540da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 4541da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 4542da8fa4e3SBjoern A. Zeeb "wmi event phyerr count %d tsf64 0x%llX\n", 4543da8fa4e3SBjoern A. Zeeb count, tsf); 4544da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 4545da8fa4e3SBjoern A. Zeeb "wmi event phyerr count %d tsf64 0x%jX\n", 4546da8fa4e3SBjoern A. Zeeb count, (uintmax_t)tsf); 4547da8fa4e3SBjoern A. Zeeb #endif 4548da8fa4e3SBjoern A. Zeeb 4549da8fa4e3SBjoern A. Zeeb phyerr = hdr_arg.phyerrs; 4550da8fa4e3SBjoern A. Zeeb for (i = 0; i < count; i++) { 4551da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg); 4552da8fa4e3SBjoern A. Zeeb if (ret) { 4553da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse phyerr event (%d)\n", 4554da8fa4e3SBjoern A. Zeeb i); 4555da8fa4e3SBjoern A. Zeeb return; 4556da8fa4e3SBjoern A. Zeeb } 4557da8fa4e3SBjoern A. Zeeb 4558da8fa4e3SBjoern A. Zeeb left_len -= phyerr_arg.hdr_len; 4559da8fa4e3SBjoern A. Zeeb buf_len = phyerr_arg.buf_len; 4560da8fa4e3SBjoern A. Zeeb phy_err_code = phyerr_arg.phy_err_code; 4561da8fa4e3SBjoern A. Zeeb 4562da8fa4e3SBjoern A. Zeeb if (left_len < buf_len) { 4563da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "single event (%d) wrong buf len\n", i); 4564da8fa4e3SBjoern A. Zeeb return; 4565da8fa4e3SBjoern A. Zeeb } 4566da8fa4e3SBjoern A. Zeeb 4567da8fa4e3SBjoern A. Zeeb left_len -= buf_len; 4568da8fa4e3SBjoern A. Zeeb 4569da8fa4e3SBjoern A. Zeeb switch (phy_err_code) { 4570da8fa4e3SBjoern A. Zeeb case PHY_ERROR_RADAR: 4571da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf); 4572da8fa4e3SBjoern A. Zeeb break; 4573da8fa4e3SBjoern A. Zeeb case PHY_ERROR_SPECTRAL_SCAN: 4574da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf); 4575da8fa4e3SBjoern A. Zeeb break; 4576da8fa4e3SBjoern A. Zeeb case PHY_ERROR_FALSE_RADAR_EXT: 4577da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf); 4578da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf); 4579da8fa4e3SBjoern A. Zeeb break; 4580da8fa4e3SBjoern A. Zeeb default: 4581da8fa4e3SBjoern A. Zeeb break; 4582da8fa4e3SBjoern A. Zeeb } 4583da8fa4e3SBjoern A. Zeeb 4584da8fa4e3SBjoern A. Zeeb phyerr = phyerr + phyerr_arg.hdr_len + buf_len; 4585da8fa4e3SBjoern A. Zeeb } 4586da8fa4e3SBjoern A. Zeeb } 4587da8fa4e3SBjoern A. Zeeb 4588da8fa4e3SBjoern A. Zeeb static int 4589da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_op_pull_dfs_status_ev(struct ath10k *ar, struct sk_buff *skb, 4590da8fa4e3SBjoern A. Zeeb struct wmi_dfs_status_ev_arg *arg) 4591da8fa4e3SBjoern A. Zeeb { 4592da8fa4e3SBjoern A. Zeeb struct wmi_dfs_status_ev_arg *ev = (void *)skb->data; 4593da8fa4e3SBjoern A. Zeeb 4594da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 4595da8fa4e3SBjoern A. Zeeb return -EPROTO; 4596da8fa4e3SBjoern A. Zeeb 4597da8fa4e3SBjoern A. Zeeb arg->status = ev->status; 4598da8fa4e3SBjoern A. Zeeb 4599da8fa4e3SBjoern A. Zeeb return 0; 4600da8fa4e3SBjoern A. Zeeb } 4601da8fa4e3SBjoern A. Zeeb 4602da8fa4e3SBjoern A. Zeeb static void 4603da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dfs_status_check(struct ath10k *ar, struct sk_buff *skb) 4604da8fa4e3SBjoern A. Zeeb { 4605da8fa4e3SBjoern A. Zeeb struct wmi_dfs_status_ev_arg status_arg = {}; 4606da8fa4e3SBjoern A. Zeeb int ret; 4607da8fa4e3SBjoern A. Zeeb 4608da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_dfs_status(ar, skb, &status_arg); 4609da8fa4e3SBjoern A. Zeeb 4610da8fa4e3SBjoern A. Zeeb if (ret) { 4611da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse dfs status event: %d\n", ret); 4612da8fa4e3SBjoern A. Zeeb return; 4613da8fa4e3SBjoern A. Zeeb } 4614da8fa4e3SBjoern A. Zeeb 4615da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 4616da8fa4e3SBjoern A. Zeeb "dfs status event received from fw: %d\n", 4617da8fa4e3SBjoern A. Zeeb status_arg.status); 4618da8fa4e3SBjoern A. Zeeb 4619da8fa4e3SBjoern A. Zeeb /* Even in case of radar detection failure we follow the same 4620da8fa4e3SBjoern A. Zeeb * behaviour as if radar is detected i.e to switch to a different 4621da8fa4e3SBjoern A. Zeeb * channel. 4622da8fa4e3SBjoern A. Zeeb */ 4623da8fa4e3SBjoern A. Zeeb if (status_arg.status == WMI_HW_RADAR_DETECTED || 4624da8fa4e3SBjoern A. Zeeb status_arg.status == WMI_RADAR_DETECTION_FAIL) 4625da8fa4e3SBjoern A. Zeeb ath10k_radar_detected(ar); 4626da8fa4e3SBjoern A. Zeeb complete(&ar->wmi.radar_confirm); 4627da8fa4e3SBjoern A. Zeeb } 4628da8fa4e3SBjoern A. Zeeb 4629da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb) 4630da8fa4e3SBjoern A. Zeeb { 4631da8fa4e3SBjoern A. Zeeb struct wmi_roam_ev_arg arg = {}; 4632da8fa4e3SBjoern A. Zeeb int ret; 4633da8fa4e3SBjoern A. Zeeb u32 vdev_id; 4634da8fa4e3SBjoern A. Zeeb u32 reason; 4635da8fa4e3SBjoern A. Zeeb s32 rssi; 4636da8fa4e3SBjoern A. Zeeb 4637da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg); 4638da8fa4e3SBjoern A. Zeeb if (ret) { 4639da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse roam event: %d\n", ret); 4640da8fa4e3SBjoern A. Zeeb return; 4641da8fa4e3SBjoern A. Zeeb } 4642da8fa4e3SBjoern A. Zeeb 4643da8fa4e3SBjoern A. Zeeb vdev_id = __le32_to_cpu(arg.vdev_id); 4644da8fa4e3SBjoern A. Zeeb reason = __le32_to_cpu(arg.reason); 4645da8fa4e3SBjoern A. Zeeb rssi = __le32_to_cpu(arg.rssi); 4646da8fa4e3SBjoern A. Zeeb rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT; 4647da8fa4e3SBjoern A. Zeeb 4648da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 4649da8fa4e3SBjoern A. Zeeb "wmi roam event vdev %u reason 0x%08x rssi %d\n", 4650da8fa4e3SBjoern A. Zeeb vdev_id, reason, rssi); 4651da8fa4e3SBjoern A. Zeeb 4652da8fa4e3SBjoern A. Zeeb if (reason >= WMI_ROAM_REASON_MAX) 4653da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n", 4654da8fa4e3SBjoern A. Zeeb reason, vdev_id); 4655da8fa4e3SBjoern A. Zeeb 4656da8fa4e3SBjoern A. Zeeb switch (reason) { 4657da8fa4e3SBjoern A. Zeeb case WMI_ROAM_REASON_BEACON_MISS: 4658da8fa4e3SBjoern A. Zeeb ath10k_mac_handle_beacon_miss(ar, vdev_id); 4659da8fa4e3SBjoern A. Zeeb break; 4660da8fa4e3SBjoern A. Zeeb case WMI_ROAM_REASON_BETTER_AP: 4661da8fa4e3SBjoern A. Zeeb case WMI_ROAM_REASON_LOW_RSSI: 4662da8fa4e3SBjoern A. Zeeb case WMI_ROAM_REASON_SUITABLE_AP_FOUND: 4663da8fa4e3SBjoern A. Zeeb case WMI_ROAM_REASON_HO_FAILED: 4664da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n", 4665da8fa4e3SBjoern A. Zeeb reason, vdev_id); 4666da8fa4e3SBjoern A. Zeeb break; 4667da8fa4e3SBjoern A. Zeeb } 4668da8fa4e3SBjoern A. Zeeb } 4669da8fa4e3SBjoern A. Zeeb 4670da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb) 4671da8fa4e3SBjoern A. Zeeb { 4672da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n"); 4673da8fa4e3SBjoern A. Zeeb } 4674da8fa4e3SBjoern A. Zeeb 4675da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb) 4676da8fa4e3SBjoern A. Zeeb { 4677da8fa4e3SBjoern A. Zeeb char buf[101], c; 4678da8fa4e3SBjoern A. Zeeb int i; 4679da8fa4e3SBjoern A. Zeeb 4680da8fa4e3SBjoern A. Zeeb for (i = 0; i < sizeof(buf) - 1; i++) { 4681da8fa4e3SBjoern A. Zeeb if (i >= skb->len) 4682da8fa4e3SBjoern A. Zeeb break; 4683da8fa4e3SBjoern A. Zeeb 4684da8fa4e3SBjoern A. Zeeb c = skb->data[i]; 4685da8fa4e3SBjoern A. Zeeb 4686da8fa4e3SBjoern A. Zeeb if (c == '\0') 4687da8fa4e3SBjoern A. Zeeb break; 4688da8fa4e3SBjoern A. Zeeb 4689da8fa4e3SBjoern A. Zeeb if (isascii(c) && isprint(c)) 4690da8fa4e3SBjoern A. Zeeb buf[i] = c; 4691da8fa4e3SBjoern A. Zeeb else 4692da8fa4e3SBjoern A. Zeeb buf[i] = '.'; 4693da8fa4e3SBjoern A. Zeeb } 4694da8fa4e3SBjoern A. Zeeb 4695da8fa4e3SBjoern A. Zeeb if (i == sizeof(buf) - 1) 4696da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len); 4697da8fa4e3SBjoern A. Zeeb 4698da8fa4e3SBjoern A. Zeeb /* for some reason the debug prints end with \n, remove that */ 4699da8fa4e3SBjoern A. Zeeb if (skb->data[i - 1] == '\n') 4700da8fa4e3SBjoern A. Zeeb i--; 4701da8fa4e3SBjoern A. Zeeb 4702da8fa4e3SBjoern A. Zeeb /* the last byte is always reserved for the null character */ 4703da8fa4e3SBjoern A. Zeeb buf[i] = '\0'; 4704da8fa4e3SBjoern A. Zeeb 4705da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf); 4706da8fa4e3SBjoern A. Zeeb } 4707da8fa4e3SBjoern A. Zeeb 4708da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb) 4709da8fa4e3SBjoern A. Zeeb { 4710da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n"); 4711da8fa4e3SBjoern A. Zeeb } 4712da8fa4e3SBjoern A. Zeeb 4713da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb) 4714da8fa4e3SBjoern A. Zeeb { 4715da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n"); 4716da8fa4e3SBjoern A. Zeeb } 4717da8fa4e3SBjoern A. Zeeb 4718da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar, 4719da8fa4e3SBjoern A. Zeeb struct sk_buff *skb) 4720da8fa4e3SBjoern A. Zeeb { 4721da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n"); 4722da8fa4e3SBjoern A. Zeeb } 4723da8fa4e3SBjoern A. Zeeb 4724da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar, 4725da8fa4e3SBjoern A. Zeeb struct sk_buff *skb) 4726da8fa4e3SBjoern A. Zeeb { 4727da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n"); 4728da8fa4e3SBjoern A. Zeeb } 4729da8fa4e3SBjoern A. Zeeb 4730da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb) 4731da8fa4e3SBjoern A. Zeeb { 4732da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n"); 4733da8fa4e3SBjoern A. Zeeb } 4734da8fa4e3SBjoern A. Zeeb 4735da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb) 4736da8fa4e3SBjoern A. Zeeb { 4737da8fa4e3SBjoern A. Zeeb struct wmi_wow_ev_arg ev = {}; 4738da8fa4e3SBjoern A. Zeeb int ret; 4739da8fa4e3SBjoern A. Zeeb 4740da8fa4e3SBjoern A. Zeeb complete(&ar->wow.wakeup_completed); 4741da8fa4e3SBjoern A. Zeeb 4742da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_wow_event(ar, skb, &ev); 4743da8fa4e3SBjoern A. Zeeb if (ret) { 4744da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret); 4745da8fa4e3SBjoern A. Zeeb return; 4746da8fa4e3SBjoern A. Zeeb } 4747da8fa4e3SBjoern A. Zeeb 4748da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n", 4749da8fa4e3SBjoern A. Zeeb wow_reason(ev.wake_reason)); 4750da8fa4e3SBjoern A. Zeeb } 4751da8fa4e3SBjoern A. Zeeb 4752da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb) 4753da8fa4e3SBjoern A. Zeeb { 4754da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n"); 4755da8fa4e3SBjoern A. Zeeb } 4756da8fa4e3SBjoern A. Zeeb 4757da8fa4e3SBjoern A. Zeeb static u8 ath10k_tpc_config_get_rate(struct ath10k *ar, 4758da8fa4e3SBjoern A. Zeeb struct wmi_pdev_tpc_config_event *ev, 4759da8fa4e3SBjoern A. Zeeb u32 rate_idx, u32 num_chains, 4760da8fa4e3SBjoern A. Zeeb u32 rate_code, u8 type) 4761da8fa4e3SBjoern A. Zeeb { 4762da8fa4e3SBjoern A. Zeeb u8 tpc, num_streams, preamble, ch, stm_idx; 4763da8fa4e3SBjoern A. Zeeb 4764da8fa4e3SBjoern A. Zeeb num_streams = ATH10K_HW_NSS(rate_code); 4765da8fa4e3SBjoern A. Zeeb preamble = ATH10K_HW_PREAMBLE(rate_code); 4766da8fa4e3SBjoern A. Zeeb ch = num_chains - 1; 4767da8fa4e3SBjoern A. Zeeb 4768da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]); 4769da8fa4e3SBjoern A. Zeeb 4770da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->num_tx_chain) <= 1) 4771da8fa4e3SBjoern A. Zeeb goto out; 4772da8fa4e3SBjoern A. Zeeb 4773da8fa4e3SBjoern A. Zeeb if (preamble == WMI_RATE_PREAMBLE_CCK) 4774da8fa4e3SBjoern A. Zeeb goto out; 4775da8fa4e3SBjoern A. Zeeb 4776da8fa4e3SBjoern A. Zeeb stm_idx = num_streams - 1; 4777da8fa4e3SBjoern A. Zeeb if (num_chains <= num_streams) 4778da8fa4e3SBjoern A. Zeeb goto out; 4779da8fa4e3SBjoern A. Zeeb 4780da8fa4e3SBjoern A. Zeeb switch (type) { 4781da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_STBC: 4782da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, tpc, 4783da8fa4e3SBjoern A. Zeeb ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]); 4784da8fa4e3SBjoern A. Zeeb break; 4785da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_TXBF: 4786da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, tpc, 4787da8fa4e3SBjoern A. Zeeb ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]); 4788da8fa4e3SBjoern A. Zeeb break; 4789da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_CDD: 4790da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, tpc, 4791da8fa4e3SBjoern A. Zeeb ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]); 4792da8fa4e3SBjoern A. Zeeb break; 4793da8fa4e3SBjoern A. Zeeb default: 4794da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type); 4795da8fa4e3SBjoern A. Zeeb tpc = 0; 4796da8fa4e3SBjoern A. Zeeb break; 4797da8fa4e3SBjoern A. Zeeb } 4798da8fa4e3SBjoern A. Zeeb 4799da8fa4e3SBjoern A. Zeeb out: 4800da8fa4e3SBjoern A. Zeeb return tpc; 4801da8fa4e3SBjoern A. Zeeb } 4802da8fa4e3SBjoern A. Zeeb 4803da8fa4e3SBjoern A. Zeeb static void ath10k_tpc_config_disp_tables(struct ath10k *ar, 4804da8fa4e3SBjoern A. Zeeb struct wmi_pdev_tpc_config_event *ev, 4805da8fa4e3SBjoern A. Zeeb struct ath10k_tpc_stats *tpc_stats, 4806da8fa4e3SBjoern A. Zeeb u8 *rate_code, u16 *pream_table, u8 type) 4807da8fa4e3SBjoern A. Zeeb { 4808da8fa4e3SBjoern A. Zeeb u32 i, j, pream_idx, flags; 4809da8fa4e3SBjoern A. Zeeb u8 tpc[WMI_TPC_TX_N_CHAIN]; 4810da8fa4e3SBjoern A. Zeeb char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE]; 4811da8fa4e3SBjoern A. Zeeb char buff[WMI_TPC_BUF_SIZE]; 4812da8fa4e3SBjoern A. Zeeb 4813da8fa4e3SBjoern A. Zeeb flags = __le32_to_cpu(ev->flags); 4814da8fa4e3SBjoern A. Zeeb 4815da8fa4e3SBjoern A. Zeeb switch (type) { 4816da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_CDD: 4817da8fa4e3SBjoern A. Zeeb if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) { 4818da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n"); 4819da8fa4e3SBjoern A. Zeeb tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 4820da8fa4e3SBjoern A. Zeeb return; 4821da8fa4e3SBjoern A. Zeeb } 4822da8fa4e3SBjoern A. Zeeb break; 4823da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_STBC: 4824da8fa4e3SBjoern A. Zeeb if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) { 4825da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n"); 4826da8fa4e3SBjoern A. Zeeb tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 4827da8fa4e3SBjoern A. Zeeb return; 4828da8fa4e3SBjoern A. Zeeb } 4829da8fa4e3SBjoern A. Zeeb break; 4830da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_TXBF: 4831da8fa4e3SBjoern A. Zeeb if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) { 4832da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n"); 4833da8fa4e3SBjoern A. Zeeb tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 4834da8fa4e3SBjoern A. Zeeb return; 4835da8fa4e3SBjoern A. Zeeb } 4836da8fa4e3SBjoern A. Zeeb break; 4837da8fa4e3SBjoern A. Zeeb default: 4838da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 4839da8fa4e3SBjoern A. Zeeb "invalid table type in wmi tpc event: %d\n", type); 4840da8fa4e3SBjoern A. Zeeb return; 4841da8fa4e3SBjoern A. Zeeb } 4842da8fa4e3SBjoern A. Zeeb 4843da8fa4e3SBjoern A. Zeeb pream_idx = 0; 4844da8fa4e3SBjoern A. Zeeb for (i = 0; i < tpc_stats->rate_max; i++) { 4845da8fa4e3SBjoern A. Zeeb memset(tpc_value, 0, sizeof(tpc_value)); 4846da8fa4e3SBjoern A. Zeeb memset(buff, 0, sizeof(buff)); 4847da8fa4e3SBjoern A. Zeeb if (i == pream_table[pream_idx]) 4848da8fa4e3SBjoern A. Zeeb pream_idx++; 4849da8fa4e3SBjoern A. Zeeb 4850da8fa4e3SBjoern A. Zeeb for (j = 0; j < tpc_stats->num_tx_chain; j++) { 4851da8fa4e3SBjoern A. Zeeb tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1, 4852da8fa4e3SBjoern A. Zeeb rate_code[i], 4853da8fa4e3SBjoern A. Zeeb type); 4854da8fa4e3SBjoern A. Zeeb snprintf(buff, sizeof(buff), "%8d ", tpc[j]); 4855da8fa4e3SBjoern A. Zeeb strlcat(tpc_value, buff, sizeof(tpc_value)); 4856da8fa4e3SBjoern A. Zeeb } 4857da8fa4e3SBjoern A. Zeeb tpc_stats->tpc_table[type].pream_idx[i] = pream_idx; 4858da8fa4e3SBjoern A. Zeeb tpc_stats->tpc_table[type].rate_code[i] = rate_code[i]; 4859da8fa4e3SBjoern A. Zeeb memcpy(tpc_stats->tpc_table[type].tpc_value[i], 4860da8fa4e3SBjoern A. Zeeb tpc_value, sizeof(tpc_value)); 4861da8fa4e3SBjoern A. Zeeb } 4862da8fa4e3SBjoern A. Zeeb } 4863da8fa4e3SBjoern A. Zeeb 4864da8fa4e3SBjoern A. Zeeb void ath10k_wmi_tpc_config_get_rate_code(u8 *rate_code, u16 *pream_table, 4865da8fa4e3SBjoern A. Zeeb u32 num_tx_chain) 4866da8fa4e3SBjoern A. Zeeb { 4867da8fa4e3SBjoern A. Zeeb u32 i, j, pream_idx; 4868da8fa4e3SBjoern A. Zeeb u8 rate_idx; 4869da8fa4e3SBjoern A. Zeeb 4870da8fa4e3SBjoern A. Zeeb /* Create the rate code table based on the chains supported */ 4871da8fa4e3SBjoern A. Zeeb rate_idx = 0; 4872da8fa4e3SBjoern A. Zeeb pream_idx = 0; 4873da8fa4e3SBjoern A. Zeeb 4874da8fa4e3SBjoern A. Zeeb /* Fill CCK rate code */ 4875da8fa4e3SBjoern A. Zeeb for (i = 0; i < 4; i++) { 4876da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4877da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK); 4878da8fa4e3SBjoern A. Zeeb rate_idx++; 4879da8fa4e3SBjoern A. Zeeb } 4880da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4881da8fa4e3SBjoern A. Zeeb pream_idx++; 4882da8fa4e3SBjoern A. Zeeb 4883da8fa4e3SBjoern A. Zeeb /* Fill OFDM rate code */ 4884da8fa4e3SBjoern A. Zeeb for (i = 0; i < 8; i++) { 4885da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4886da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM); 4887da8fa4e3SBjoern A. Zeeb rate_idx++; 4888da8fa4e3SBjoern A. Zeeb } 4889da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4890da8fa4e3SBjoern A. Zeeb pream_idx++; 4891da8fa4e3SBjoern A. Zeeb 4892da8fa4e3SBjoern A. Zeeb /* Fill HT20 rate code */ 4893da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_tx_chain; i++) { 4894da8fa4e3SBjoern A. Zeeb for (j = 0; j < 8; j++) { 4895da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4896da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT); 4897da8fa4e3SBjoern A. Zeeb rate_idx++; 4898da8fa4e3SBjoern A. Zeeb } 4899da8fa4e3SBjoern A. Zeeb } 4900da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4901da8fa4e3SBjoern A. Zeeb pream_idx++; 4902da8fa4e3SBjoern A. Zeeb 4903da8fa4e3SBjoern A. Zeeb /* Fill HT40 rate code */ 4904da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_tx_chain; i++) { 4905da8fa4e3SBjoern A. Zeeb for (j = 0; j < 8; j++) { 4906da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4907da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT); 4908da8fa4e3SBjoern A. Zeeb rate_idx++; 4909da8fa4e3SBjoern A. Zeeb } 4910da8fa4e3SBjoern A. Zeeb } 4911da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4912da8fa4e3SBjoern A. Zeeb pream_idx++; 4913da8fa4e3SBjoern A. Zeeb 4914da8fa4e3SBjoern A. Zeeb /* Fill VHT20 rate code */ 4915da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_tx_chain; i++) { 4916da8fa4e3SBjoern A. Zeeb for (j = 0; j < 10; j++) { 4917da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4918da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT); 4919da8fa4e3SBjoern A. Zeeb rate_idx++; 4920da8fa4e3SBjoern A. Zeeb } 4921da8fa4e3SBjoern A. Zeeb } 4922da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4923da8fa4e3SBjoern A. Zeeb pream_idx++; 4924da8fa4e3SBjoern A. Zeeb 4925da8fa4e3SBjoern A. Zeeb /* Fill VHT40 rate code */ 4926da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_tx_chain; i++) { 4927da8fa4e3SBjoern A. Zeeb for (j = 0; j < 10; j++) { 4928da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4929da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT); 4930da8fa4e3SBjoern A. Zeeb rate_idx++; 4931da8fa4e3SBjoern A. Zeeb } 4932da8fa4e3SBjoern A. Zeeb } 4933da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4934da8fa4e3SBjoern A. Zeeb pream_idx++; 4935da8fa4e3SBjoern A. Zeeb 4936da8fa4e3SBjoern A. Zeeb /* Fill VHT80 rate code */ 4937da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_tx_chain; i++) { 4938da8fa4e3SBjoern A. Zeeb for (j = 0; j < 10; j++) { 4939da8fa4e3SBjoern A. Zeeb rate_code[rate_idx] = 4940da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT); 4941da8fa4e3SBjoern A. Zeeb rate_idx++; 4942da8fa4e3SBjoern A. Zeeb } 4943da8fa4e3SBjoern A. Zeeb } 4944da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = rate_idx; 4945da8fa4e3SBjoern A. Zeeb pream_idx++; 4946da8fa4e3SBjoern A. Zeeb 4947da8fa4e3SBjoern A. Zeeb rate_code[rate_idx++] = 4948da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK); 4949da8fa4e3SBjoern A. Zeeb rate_code[rate_idx++] = 4950da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM); 4951da8fa4e3SBjoern A. Zeeb rate_code[rate_idx++] = 4952da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK); 4953da8fa4e3SBjoern A. Zeeb rate_code[rate_idx++] = 4954da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM); 4955da8fa4e3SBjoern A. Zeeb rate_code[rate_idx++] = 4956da8fa4e3SBjoern A. Zeeb ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM); 4957da8fa4e3SBjoern A. Zeeb 4958da8fa4e3SBjoern A. Zeeb pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END; 4959da8fa4e3SBjoern A. Zeeb } 4960da8fa4e3SBjoern A. Zeeb 4961da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb) 4962da8fa4e3SBjoern A. Zeeb { 4963da8fa4e3SBjoern A. Zeeb u32 num_tx_chain, rate_max; 4964da8fa4e3SBjoern A. Zeeb u8 rate_code[WMI_TPC_RATE_MAX]; 4965da8fa4e3SBjoern A. Zeeb u16 pream_table[WMI_TPC_PREAM_TABLE_MAX]; 4966da8fa4e3SBjoern A. Zeeb struct wmi_pdev_tpc_config_event *ev; 4967da8fa4e3SBjoern A. Zeeb struct ath10k_tpc_stats *tpc_stats; 4968da8fa4e3SBjoern A. Zeeb 4969da8fa4e3SBjoern A. Zeeb ev = (struct wmi_pdev_tpc_config_event *)skb->data; 4970da8fa4e3SBjoern A. Zeeb 4971da8fa4e3SBjoern A. Zeeb num_tx_chain = __le32_to_cpu(ev->num_tx_chain); 4972da8fa4e3SBjoern A. Zeeb 4973da8fa4e3SBjoern A. Zeeb if (num_tx_chain > WMI_TPC_TX_N_CHAIN) { 4974da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "number of tx chain is %d greater than TPC configured tx chain %d\n", 4975da8fa4e3SBjoern A. Zeeb num_tx_chain, WMI_TPC_TX_N_CHAIN); 4976da8fa4e3SBjoern A. Zeeb return; 4977da8fa4e3SBjoern A. Zeeb } 4978da8fa4e3SBjoern A. Zeeb 4979da8fa4e3SBjoern A. Zeeb rate_max = __le32_to_cpu(ev->rate_max); 4980da8fa4e3SBjoern A. Zeeb if (rate_max > WMI_TPC_RATE_MAX) { 4981da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "number of rate is %d greater than TPC configured rate %d\n", 4982da8fa4e3SBjoern A. Zeeb rate_max, WMI_TPC_RATE_MAX); 4983da8fa4e3SBjoern A. Zeeb rate_max = WMI_TPC_RATE_MAX; 4984da8fa4e3SBjoern A. Zeeb } 4985da8fa4e3SBjoern A. Zeeb 4986da8fa4e3SBjoern A. Zeeb tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC); 4987da8fa4e3SBjoern A. Zeeb if (!tpc_stats) 4988da8fa4e3SBjoern A. Zeeb return; 4989da8fa4e3SBjoern A. Zeeb 4990da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table, 4991da8fa4e3SBjoern A. Zeeb num_tx_chain); 4992da8fa4e3SBjoern A. Zeeb 4993da8fa4e3SBjoern A. Zeeb tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq); 4994da8fa4e3SBjoern A. Zeeb tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode); 4995da8fa4e3SBjoern A. Zeeb tpc_stats->ctl = __le32_to_cpu(ev->ctl); 4996da8fa4e3SBjoern A. Zeeb tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain); 4997da8fa4e3SBjoern A. Zeeb tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain); 4998da8fa4e3SBjoern A. Zeeb tpc_stats->twice_antenna_reduction = 4999da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->twice_antenna_reduction); 5000da8fa4e3SBjoern A. Zeeb tpc_stats->power_limit = __le32_to_cpu(ev->power_limit); 5001da8fa4e3SBjoern A. Zeeb tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power); 5002da8fa4e3SBjoern A. Zeeb tpc_stats->num_tx_chain = num_tx_chain; 5003da8fa4e3SBjoern A. Zeeb tpc_stats->rate_max = rate_max; 5004da8fa4e3SBjoern A. Zeeb 5005da8fa4e3SBjoern A. Zeeb ath10k_tpc_config_disp_tables(ar, ev, tpc_stats, 5006da8fa4e3SBjoern A. Zeeb rate_code, pream_table, 5007da8fa4e3SBjoern A. Zeeb WMI_TPC_TABLE_TYPE_CDD); 5008da8fa4e3SBjoern A. Zeeb ath10k_tpc_config_disp_tables(ar, ev, tpc_stats, 5009da8fa4e3SBjoern A. Zeeb rate_code, pream_table, 5010da8fa4e3SBjoern A. Zeeb WMI_TPC_TABLE_TYPE_STBC); 5011da8fa4e3SBjoern A. Zeeb ath10k_tpc_config_disp_tables(ar, ev, tpc_stats, 5012da8fa4e3SBjoern A. Zeeb rate_code, pream_table, 5013da8fa4e3SBjoern A. Zeeb WMI_TPC_TABLE_TYPE_TXBF); 5014da8fa4e3SBjoern A. Zeeb 5015da8fa4e3SBjoern A. Zeeb ath10k_debug_tpc_stats_process(ar, tpc_stats); 5016da8fa4e3SBjoern A. Zeeb 5017da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5018da8fa4e3SBjoern A. Zeeb "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", 5019da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->chan_freq), 5020da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->phy_mode), 5021da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->ctl), 5022da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->reg_domain), 5023da8fa4e3SBjoern A. Zeeb a_sle32_to_cpu(ev->twice_antenna_gain), 5024da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->twice_antenna_reduction), 5025da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->power_limit), 5026da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->twice_max_rd_power) / 2, 5027da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->num_tx_chain), 5028da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->rate_max)); 5029da8fa4e3SBjoern A. Zeeb } 5030da8fa4e3SBjoern A. Zeeb 5031da8fa4e3SBjoern A. Zeeb static u8 5032da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_final_get_rate(struct ath10k *ar, 5033da8fa4e3SBjoern A. Zeeb struct wmi_pdev_tpc_final_table_event *ev, 5034da8fa4e3SBjoern A. Zeeb u32 rate_idx, u32 num_chains, 5035da8fa4e3SBjoern A. Zeeb u32 rate_code, u8 type, u32 pream_idx) 5036da8fa4e3SBjoern A. Zeeb { 5037da8fa4e3SBjoern A. Zeeb u8 tpc, num_streams, preamble, ch, stm_idx; 5038da8fa4e3SBjoern A. Zeeb s8 pow_agcdd, pow_agstbc, pow_agtxbf; 5039da8fa4e3SBjoern A. Zeeb int pream; 5040da8fa4e3SBjoern A. Zeeb 5041da8fa4e3SBjoern A. Zeeb num_streams = ATH10K_HW_NSS(rate_code); 5042da8fa4e3SBjoern A. Zeeb preamble = ATH10K_HW_PREAMBLE(rate_code); 5043da8fa4e3SBjoern A. Zeeb ch = num_chains - 1; 5044da8fa4e3SBjoern A. Zeeb stm_idx = num_streams - 1; 5045da8fa4e3SBjoern A. Zeeb pream = -1; 5046da8fa4e3SBjoern A. Zeeb 5047da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->chan_freq) <= 2483) { 5048da8fa4e3SBjoern A. Zeeb switch (pream_idx) { 5049da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_CCK: 5050da8fa4e3SBjoern A. Zeeb pream = 0; 5051da8fa4e3SBjoern A. Zeeb break; 5052da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_OFDM: 5053da8fa4e3SBjoern A. Zeeb pream = 1; 5054da8fa4e3SBjoern A. Zeeb break; 5055da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_HT20: 5056da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_VHT20: 5057da8fa4e3SBjoern A. Zeeb pream = 2; 5058da8fa4e3SBjoern A. Zeeb break; 5059da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_HT40: 5060da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_VHT40: 5061da8fa4e3SBjoern A. Zeeb pream = 3; 5062da8fa4e3SBjoern A. Zeeb break; 5063da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_2GHZ_VHT80: 5064da8fa4e3SBjoern A. Zeeb pream = 4; 5065da8fa4e3SBjoern A. Zeeb break; 5066da8fa4e3SBjoern A. Zeeb default: 5067da8fa4e3SBjoern A. Zeeb pream = -1; 5068da8fa4e3SBjoern A. Zeeb break; 5069da8fa4e3SBjoern A. Zeeb } 5070da8fa4e3SBjoern A. Zeeb } 5071da8fa4e3SBjoern A. Zeeb 5072da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->chan_freq) >= 5180) { 5073da8fa4e3SBjoern A. Zeeb switch (pream_idx) { 5074da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_OFDM: 5075da8fa4e3SBjoern A. Zeeb pream = 0; 5076da8fa4e3SBjoern A. Zeeb break; 5077da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_HT20: 5078da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_VHT20: 5079da8fa4e3SBjoern A. Zeeb pream = 1; 5080da8fa4e3SBjoern A. Zeeb break; 5081da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_HT40: 5082da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_VHT40: 5083da8fa4e3SBjoern A. Zeeb pream = 2; 5084da8fa4e3SBjoern A. Zeeb break; 5085da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_VHT80: 5086da8fa4e3SBjoern A. Zeeb pream = 3; 5087da8fa4e3SBjoern A. Zeeb break; 5088da8fa4e3SBjoern A. Zeeb case WMI_TPC_PREAM_5GHZ_HTCUP: 5089da8fa4e3SBjoern A. Zeeb pream = 4; 5090da8fa4e3SBjoern A. Zeeb break; 5091da8fa4e3SBjoern A. Zeeb default: 5092da8fa4e3SBjoern A. Zeeb pream = -1; 5093da8fa4e3SBjoern A. Zeeb break; 5094da8fa4e3SBjoern A. Zeeb } 5095da8fa4e3SBjoern A. Zeeb } 5096da8fa4e3SBjoern A. Zeeb 5097da8fa4e3SBjoern A. Zeeb if (pream == -1) { 5098da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "unknown wmi tpc final index and frequency: %u, %u\n", 5099da8fa4e3SBjoern A. Zeeb pream_idx, __le32_to_cpu(ev->chan_freq)); 5100da8fa4e3SBjoern A. Zeeb tpc = 0; 5101da8fa4e3SBjoern A. Zeeb goto out; 5102da8fa4e3SBjoern A. Zeeb } 5103da8fa4e3SBjoern A. Zeeb 5104da8fa4e3SBjoern A. Zeeb if (pream == 4) 5105da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, ev->rates_array[rate_idx], 5106da8fa4e3SBjoern A. Zeeb ev->max_reg_allow_pow[ch]); 5107da8fa4e3SBjoern A. Zeeb else 5108da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, min_t(u8, ev->rates_array[rate_idx], 5109da8fa4e3SBjoern A. Zeeb ev->max_reg_allow_pow[ch]), 5110da8fa4e3SBjoern A. Zeeb ev->ctl_power_table[0][pream][stm_idx]); 5111da8fa4e3SBjoern A. Zeeb 5112da8fa4e3SBjoern A. Zeeb if (__le32_to_cpu(ev->num_tx_chain) <= 1) 5113da8fa4e3SBjoern A. Zeeb goto out; 5114da8fa4e3SBjoern A. Zeeb 5115da8fa4e3SBjoern A. Zeeb if (preamble == WMI_RATE_PREAMBLE_CCK) 5116da8fa4e3SBjoern A. Zeeb goto out; 5117da8fa4e3SBjoern A. Zeeb 5118da8fa4e3SBjoern A. Zeeb if (num_chains <= num_streams) 5119da8fa4e3SBjoern A. Zeeb goto out; 5120da8fa4e3SBjoern A. Zeeb 5121da8fa4e3SBjoern A. Zeeb switch (type) { 5122da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_STBC: 5123da8fa4e3SBjoern A. Zeeb pow_agstbc = ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]; 5124da8fa4e3SBjoern A. Zeeb if (pream == 4) 5125da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, tpc, pow_agstbc); 5126da8fa4e3SBjoern A. Zeeb else 5127da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, min_t(u8, tpc, pow_agstbc), 5128da8fa4e3SBjoern A. Zeeb ev->ctl_power_table[0][pream][stm_idx]); 5129da8fa4e3SBjoern A. Zeeb break; 5130da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_TXBF: 5131da8fa4e3SBjoern A. Zeeb pow_agtxbf = ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]; 5132da8fa4e3SBjoern A. Zeeb if (pream == 4) 5133da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, tpc, pow_agtxbf); 5134da8fa4e3SBjoern A. Zeeb else 5135da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, min_t(u8, tpc, pow_agtxbf), 5136da8fa4e3SBjoern A. Zeeb ev->ctl_power_table[1][pream][stm_idx]); 5137da8fa4e3SBjoern A. Zeeb break; 5138da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_CDD: 5139da8fa4e3SBjoern A. Zeeb pow_agcdd = ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]; 5140da8fa4e3SBjoern A. Zeeb if (pream == 4) 5141da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, tpc, pow_agcdd); 5142da8fa4e3SBjoern A. Zeeb else 5143da8fa4e3SBjoern A. Zeeb tpc = min_t(u8, min_t(u8, tpc, pow_agcdd), 5144da8fa4e3SBjoern A. Zeeb ev->ctl_power_table[0][pream][stm_idx]); 5145da8fa4e3SBjoern A. Zeeb break; 5146da8fa4e3SBjoern A. Zeeb default: 5147da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "unknown wmi tpc final table type: %d\n", type); 5148da8fa4e3SBjoern A. Zeeb tpc = 0; 5149da8fa4e3SBjoern A. Zeeb break; 5150da8fa4e3SBjoern A. Zeeb } 5151da8fa4e3SBjoern A. Zeeb 5152da8fa4e3SBjoern A. Zeeb out: 5153da8fa4e3SBjoern A. Zeeb return tpc; 5154da8fa4e3SBjoern A. Zeeb } 5155da8fa4e3SBjoern A. Zeeb 5156da8fa4e3SBjoern A. Zeeb static void 5157da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_stats_final_disp_tables(struct ath10k *ar, 5158da8fa4e3SBjoern A. Zeeb struct wmi_pdev_tpc_final_table_event *ev, 5159da8fa4e3SBjoern A. Zeeb struct ath10k_tpc_stats_final *tpc_stats, 5160da8fa4e3SBjoern A. Zeeb u8 *rate_code, u16 *pream_table, u8 type) 5161da8fa4e3SBjoern A. Zeeb { 5162da8fa4e3SBjoern A. Zeeb u32 i, j, pream_idx, flags; 5163da8fa4e3SBjoern A. Zeeb u8 tpc[WMI_TPC_TX_N_CHAIN]; 5164da8fa4e3SBjoern A. Zeeb char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE]; 5165da8fa4e3SBjoern A. Zeeb char buff[WMI_TPC_BUF_SIZE]; 5166da8fa4e3SBjoern A. Zeeb 5167da8fa4e3SBjoern A. Zeeb flags = __le32_to_cpu(ev->flags); 5168da8fa4e3SBjoern A. Zeeb 5169da8fa4e3SBjoern A. Zeeb switch (type) { 5170da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_CDD: 5171da8fa4e3SBjoern A. Zeeb if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) { 5172da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n"); 5173da8fa4e3SBjoern A. Zeeb tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 5174da8fa4e3SBjoern A. Zeeb return; 5175da8fa4e3SBjoern A. Zeeb } 5176da8fa4e3SBjoern A. Zeeb break; 5177da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_STBC: 5178da8fa4e3SBjoern A. Zeeb if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) { 5179da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n"); 5180da8fa4e3SBjoern A. Zeeb tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 5181da8fa4e3SBjoern A. Zeeb return; 5182da8fa4e3SBjoern A. Zeeb } 5183da8fa4e3SBjoern A. Zeeb break; 5184da8fa4e3SBjoern A. Zeeb case WMI_TPC_TABLE_TYPE_TXBF: 5185da8fa4e3SBjoern A. Zeeb if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) { 5186da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n"); 5187da8fa4e3SBjoern A. Zeeb tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 5188da8fa4e3SBjoern A. Zeeb return; 5189da8fa4e3SBjoern A. Zeeb } 5190da8fa4e3SBjoern A. Zeeb break; 5191da8fa4e3SBjoern A. Zeeb default: 5192da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5193da8fa4e3SBjoern A. Zeeb "invalid table type in wmi tpc event: %d\n", type); 5194da8fa4e3SBjoern A. Zeeb return; 5195da8fa4e3SBjoern A. Zeeb } 5196da8fa4e3SBjoern A. Zeeb 5197da8fa4e3SBjoern A. Zeeb pream_idx = 0; 5198da8fa4e3SBjoern A. Zeeb for (i = 0; i < tpc_stats->rate_max; i++) { 5199da8fa4e3SBjoern A. Zeeb memset(tpc_value, 0, sizeof(tpc_value)); 5200da8fa4e3SBjoern A. Zeeb memset(buff, 0, sizeof(buff)); 5201da8fa4e3SBjoern A. Zeeb if (i == pream_table[pream_idx]) 5202da8fa4e3SBjoern A. Zeeb pream_idx++; 5203da8fa4e3SBjoern A. Zeeb 5204da8fa4e3SBjoern A. Zeeb for (j = 0; j < tpc_stats->num_tx_chain; j++) { 5205da8fa4e3SBjoern A. Zeeb tpc[j] = ath10k_wmi_tpc_final_get_rate(ar, ev, i, j + 1, 5206da8fa4e3SBjoern A. Zeeb rate_code[i], 5207da8fa4e3SBjoern A. Zeeb type, pream_idx); 5208da8fa4e3SBjoern A. Zeeb snprintf(buff, sizeof(buff), "%8d ", tpc[j]); 5209da8fa4e3SBjoern A. Zeeb strlcat(tpc_value, buff, sizeof(tpc_value)); 5210da8fa4e3SBjoern A. Zeeb } 5211da8fa4e3SBjoern A. Zeeb tpc_stats->tpc_table_final[type].pream_idx[i] = pream_idx; 5212da8fa4e3SBjoern A. Zeeb tpc_stats->tpc_table_final[type].rate_code[i] = rate_code[i]; 5213da8fa4e3SBjoern A. Zeeb memcpy(tpc_stats->tpc_table_final[type].tpc_value[i], 5214da8fa4e3SBjoern A. Zeeb tpc_value, sizeof(tpc_value)); 5215da8fa4e3SBjoern A. Zeeb } 5216da8fa4e3SBjoern A. Zeeb } 5217da8fa4e3SBjoern A. Zeeb 5218da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_tpc_final_table(struct ath10k *ar, struct sk_buff *skb) 5219da8fa4e3SBjoern A. Zeeb { 5220da8fa4e3SBjoern A. Zeeb u32 num_tx_chain, rate_max; 5221da8fa4e3SBjoern A. Zeeb u8 rate_code[WMI_TPC_FINAL_RATE_MAX]; 5222da8fa4e3SBjoern A. Zeeb u16 pream_table[WMI_TPC_PREAM_TABLE_MAX]; 5223da8fa4e3SBjoern A. Zeeb struct wmi_pdev_tpc_final_table_event *ev; 5224da8fa4e3SBjoern A. Zeeb struct ath10k_tpc_stats_final *tpc_stats; 5225da8fa4e3SBjoern A. Zeeb 5226da8fa4e3SBjoern A. Zeeb ev = (struct wmi_pdev_tpc_final_table_event *)skb->data; 5227da8fa4e3SBjoern A. Zeeb 5228da8fa4e3SBjoern A. Zeeb num_tx_chain = __le32_to_cpu(ev->num_tx_chain); 5229da8fa4e3SBjoern A. Zeeb if (num_tx_chain > WMI_TPC_TX_N_CHAIN) { 5230da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "number of tx chain is %d greater than TPC final configured tx chain %d\n", 5231da8fa4e3SBjoern A. Zeeb num_tx_chain, WMI_TPC_TX_N_CHAIN); 5232da8fa4e3SBjoern A. Zeeb return; 5233da8fa4e3SBjoern A. Zeeb } 5234da8fa4e3SBjoern A. Zeeb 5235da8fa4e3SBjoern A. Zeeb rate_max = __le32_to_cpu(ev->rate_max); 5236da8fa4e3SBjoern A. Zeeb if (rate_max > WMI_TPC_FINAL_RATE_MAX) { 5237da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "number of rate is %d greater than TPC final configured rate %d\n", 5238da8fa4e3SBjoern A. Zeeb rate_max, WMI_TPC_FINAL_RATE_MAX); 5239da8fa4e3SBjoern A. Zeeb rate_max = WMI_TPC_FINAL_RATE_MAX; 5240da8fa4e3SBjoern A. Zeeb } 5241da8fa4e3SBjoern A. Zeeb 5242da8fa4e3SBjoern A. Zeeb tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC); 5243da8fa4e3SBjoern A. Zeeb if (!tpc_stats) 5244da8fa4e3SBjoern A. Zeeb return; 5245da8fa4e3SBjoern A. Zeeb 5246da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table, 5247da8fa4e3SBjoern A. Zeeb num_tx_chain); 5248da8fa4e3SBjoern A. Zeeb 5249da8fa4e3SBjoern A. Zeeb tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq); 5250da8fa4e3SBjoern A. Zeeb tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode); 5251da8fa4e3SBjoern A. Zeeb tpc_stats->ctl = __le32_to_cpu(ev->ctl); 5252da8fa4e3SBjoern A. Zeeb tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain); 5253da8fa4e3SBjoern A. Zeeb tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain); 5254da8fa4e3SBjoern A. Zeeb tpc_stats->twice_antenna_reduction = 5255da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->twice_antenna_reduction); 5256da8fa4e3SBjoern A. Zeeb tpc_stats->power_limit = __le32_to_cpu(ev->power_limit); 5257da8fa4e3SBjoern A. Zeeb tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power); 5258da8fa4e3SBjoern A. Zeeb tpc_stats->num_tx_chain = num_tx_chain; 5259da8fa4e3SBjoern A. Zeeb tpc_stats->rate_max = rate_max; 5260da8fa4e3SBjoern A. Zeeb 5261da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats, 5262da8fa4e3SBjoern A. Zeeb rate_code, pream_table, 5263da8fa4e3SBjoern A. Zeeb WMI_TPC_TABLE_TYPE_CDD); 5264da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats, 5265da8fa4e3SBjoern A. Zeeb rate_code, pream_table, 5266da8fa4e3SBjoern A. Zeeb WMI_TPC_TABLE_TYPE_STBC); 5267da8fa4e3SBjoern A. Zeeb ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats, 5268da8fa4e3SBjoern A. Zeeb rate_code, pream_table, 5269da8fa4e3SBjoern A. Zeeb WMI_TPC_TABLE_TYPE_TXBF); 5270da8fa4e3SBjoern A. Zeeb 5271da8fa4e3SBjoern A. Zeeb ath10k_debug_tpc_stats_final_process(ar, tpc_stats); 5272da8fa4e3SBjoern A. Zeeb 5273da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5274da8fa4e3SBjoern A. Zeeb "wmi event tpc final table channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n", 5275da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->chan_freq), 5276da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->phy_mode), 5277da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->ctl), 5278da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->reg_domain), 5279da8fa4e3SBjoern A. Zeeb a_sle32_to_cpu(ev->twice_antenna_gain), 5280da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->twice_antenna_reduction), 5281da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->power_limit), 5282da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->twice_max_rd_power) / 2, 5283da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->num_tx_chain), 5284da8fa4e3SBjoern A. Zeeb __le32_to_cpu(ev->rate_max)); 5285da8fa4e3SBjoern A. Zeeb } 5286da8fa4e3SBjoern A. Zeeb 5287da8fa4e3SBjoern A. Zeeb static void 5288da8fa4e3SBjoern A. Zeeb ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb) 5289da8fa4e3SBjoern A. Zeeb { 5290da8fa4e3SBjoern A. Zeeb struct wmi_tdls_peer_event *ev; 5291da8fa4e3SBjoern A. Zeeb struct ath10k_peer *peer; 5292da8fa4e3SBjoern A. Zeeb struct ath10k_vif *arvif; 5293da8fa4e3SBjoern A. Zeeb int vdev_id; 5294da8fa4e3SBjoern A. Zeeb int peer_status; 5295da8fa4e3SBjoern A. Zeeb int peer_reason; 5296da8fa4e3SBjoern A. Zeeb u8 reason; 5297da8fa4e3SBjoern A. Zeeb 5298da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) { 5299da8fa4e3SBjoern A. Zeeb ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n", 5300da8fa4e3SBjoern A. Zeeb skb->len); 5301da8fa4e3SBjoern A. Zeeb return; 5302da8fa4e3SBjoern A. Zeeb } 5303da8fa4e3SBjoern A. Zeeb 5304da8fa4e3SBjoern A. Zeeb ev = (struct wmi_tdls_peer_event *)skb->data; 5305da8fa4e3SBjoern A. Zeeb vdev_id = __le32_to_cpu(ev->vdev_id); 5306da8fa4e3SBjoern A. Zeeb peer_status = __le32_to_cpu(ev->peer_status); 5307da8fa4e3SBjoern A. Zeeb peer_reason = __le32_to_cpu(ev->peer_reason); 5308da8fa4e3SBjoern A. Zeeb 5309da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 5310da8fa4e3SBjoern A. Zeeb peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr); 5311da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 5312da8fa4e3SBjoern A. Zeeb 5313da8fa4e3SBjoern A. Zeeb if (!peer) { 5314da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to find peer entry for %pM\n", 5315da8fa4e3SBjoern A. Zeeb ev->peer_macaddr.addr); 5316da8fa4e3SBjoern A. Zeeb return; 5317da8fa4e3SBjoern A. Zeeb } 5318da8fa4e3SBjoern A. Zeeb 5319da8fa4e3SBjoern A. Zeeb switch (peer_status) { 5320da8fa4e3SBjoern A. Zeeb case WMI_TDLS_SHOULD_TEARDOWN: 5321da8fa4e3SBjoern A. Zeeb switch (peer_reason) { 5322da8fa4e3SBjoern A. Zeeb case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT: 5323da8fa4e3SBjoern A. Zeeb case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE: 5324da8fa4e3SBjoern A. Zeeb case WMI_TDLS_TEARDOWN_REASON_RSSI: 5325da8fa4e3SBjoern A. Zeeb reason = WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE; 5326da8fa4e3SBjoern A. Zeeb break; 5327da8fa4e3SBjoern A. Zeeb default: 5328da8fa4e3SBjoern A. Zeeb reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED; 5329da8fa4e3SBjoern A. Zeeb break; 5330da8fa4e3SBjoern A. Zeeb } 5331da8fa4e3SBjoern A. Zeeb 5332da8fa4e3SBjoern A. Zeeb arvif = ath10k_get_arvif(ar, vdev_id); 5333da8fa4e3SBjoern A. Zeeb if (!arvif) { 5334da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n", 5335da8fa4e3SBjoern A. Zeeb vdev_id); 5336da8fa4e3SBjoern A. Zeeb return; 5337da8fa4e3SBjoern A. Zeeb } 5338da8fa4e3SBjoern A. Zeeb 5339da8fa4e3SBjoern A. Zeeb ieee80211_tdls_oper_request(arvif->vif, ev->peer_macaddr.addr, 5340da8fa4e3SBjoern A. Zeeb NL80211_TDLS_TEARDOWN, reason, 5341da8fa4e3SBjoern A. Zeeb GFP_ATOMIC); 5342da8fa4e3SBjoern A. Zeeb 5343da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5344da8fa4e3SBjoern A. Zeeb "received tdls teardown event for peer %pM reason %u\n", 5345da8fa4e3SBjoern A. Zeeb ev->peer_macaddr.addr, peer_reason); 5346da8fa4e3SBjoern A. Zeeb break; 5347da8fa4e3SBjoern A. Zeeb default: 5348da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5349da8fa4e3SBjoern A. Zeeb "received unknown tdls peer event %u\n", 5350da8fa4e3SBjoern A. Zeeb peer_status); 5351da8fa4e3SBjoern A. Zeeb break; 5352da8fa4e3SBjoern A. Zeeb } 5353da8fa4e3SBjoern A. Zeeb } 5354da8fa4e3SBjoern A. Zeeb 5355da8fa4e3SBjoern A. Zeeb static void 5356da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_ps_state_chg(struct ath10k *ar, struct sk_buff *skb) 5357da8fa4e3SBjoern A. Zeeb { 5358da8fa4e3SBjoern A. Zeeb struct wmi_peer_sta_ps_state_chg_event *ev; 5359da8fa4e3SBjoern A. Zeeb struct ieee80211_sta *sta; 5360da8fa4e3SBjoern A. Zeeb struct ath10k_sta *arsta; 5361da8fa4e3SBjoern A. Zeeb u8 peer_addr[ETH_ALEN]; 5362da8fa4e3SBjoern A. Zeeb 5363da8fa4e3SBjoern A. Zeeb lockdep_assert_held(&ar->data_lock); 5364da8fa4e3SBjoern A. Zeeb 5365da8fa4e3SBjoern A. Zeeb ev = (struct wmi_peer_sta_ps_state_chg_event *)skb->data; 5366da8fa4e3SBjoern A. Zeeb ether_addr_copy(peer_addr, ev->peer_macaddr.addr); 5367da8fa4e3SBjoern A. Zeeb 5368da8fa4e3SBjoern A. Zeeb rcu_read_lock(); 5369da8fa4e3SBjoern A. Zeeb 5370da8fa4e3SBjoern A. Zeeb sta = ieee80211_find_sta_by_ifaddr(ar->hw, peer_addr, NULL); 5371da8fa4e3SBjoern A. Zeeb 5372da8fa4e3SBjoern A. Zeeb if (!sta) { 5373da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to find station entry %pM\n", 5374da8fa4e3SBjoern A. Zeeb peer_addr); 5375da8fa4e3SBjoern A. Zeeb goto exit; 5376da8fa4e3SBjoern A. Zeeb } 5377da8fa4e3SBjoern A. Zeeb 5378da8fa4e3SBjoern A. Zeeb arsta = (struct ath10k_sta *)sta->drv_priv; 5379da8fa4e3SBjoern A. Zeeb arsta->peer_ps_state = __le32_to_cpu(ev->peer_ps_state); 5380da8fa4e3SBjoern A. Zeeb 5381da8fa4e3SBjoern A. Zeeb exit: 5382da8fa4e3SBjoern A. Zeeb rcu_read_unlock(); 5383da8fa4e3SBjoern A. Zeeb } 5384da8fa4e3SBjoern A. Zeeb 5385da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb) 5386da8fa4e3SBjoern A. Zeeb { 5387da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n"); 5388da8fa4e3SBjoern A. Zeeb } 5389da8fa4e3SBjoern A. Zeeb 5390da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb) 5391da8fa4e3SBjoern A. Zeeb { 5392da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n"); 5393da8fa4e3SBjoern A. Zeeb } 5394da8fa4e3SBjoern A. Zeeb 5395da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb) 5396da8fa4e3SBjoern A. Zeeb { 5397da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n"); 5398da8fa4e3SBjoern A. Zeeb } 5399da8fa4e3SBjoern A. Zeeb 5400da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb) 5401da8fa4e3SBjoern A. Zeeb { 5402da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n"); 5403da8fa4e3SBjoern A. Zeeb } 5404da8fa4e3SBjoern A. Zeeb 5405da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb) 5406da8fa4e3SBjoern A. Zeeb { 5407da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n"); 5408da8fa4e3SBjoern A. Zeeb } 5409da8fa4e3SBjoern A. Zeeb 5410da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar, 5411da8fa4e3SBjoern A. Zeeb struct sk_buff *skb) 5412da8fa4e3SBjoern A. Zeeb { 5413da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n"); 5414da8fa4e3SBjoern A. Zeeb } 5415da8fa4e3SBjoern A. Zeeb 5416da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb) 5417da8fa4e3SBjoern A. Zeeb { 5418da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n"); 5419da8fa4e3SBjoern A. Zeeb } 5420da8fa4e3SBjoern A. Zeeb 5421da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb) 5422da8fa4e3SBjoern A. Zeeb { 5423da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n"); 5424da8fa4e3SBjoern A. Zeeb } 5425da8fa4e3SBjoern A. Zeeb 5426da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb) 5427da8fa4e3SBjoern A. Zeeb { 5428da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n"); 5429da8fa4e3SBjoern A. Zeeb } 5430da8fa4e3SBjoern A. Zeeb 5431da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id, 5432da8fa4e3SBjoern A. Zeeb u32 num_units, u32 unit_len) 5433da8fa4e3SBjoern A. Zeeb { 5434da8fa4e3SBjoern A. Zeeb dma_addr_t paddr; 5435da8fa4e3SBjoern A. Zeeb u32 pool_size; 5436da8fa4e3SBjoern A. Zeeb int idx = ar->wmi.num_mem_chunks; 5437da8fa4e3SBjoern A. Zeeb void *vaddr; 5438da8fa4e3SBjoern A. Zeeb 5439da8fa4e3SBjoern A. Zeeb pool_size = num_units * round_up(unit_len, 4); 5440da8fa4e3SBjoern A. Zeeb vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL); 5441da8fa4e3SBjoern A. Zeeb 5442da8fa4e3SBjoern A. Zeeb if (!vaddr) 5443da8fa4e3SBjoern A. Zeeb return -ENOMEM; 5444da8fa4e3SBjoern A. Zeeb 5445da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[idx].vaddr = vaddr; 5446da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[idx].paddr = paddr; 5447da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[idx].len = pool_size; 5448da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[idx].req_id = req_id; 5449da8fa4e3SBjoern A. Zeeb ar->wmi.num_mem_chunks++; 5450da8fa4e3SBjoern A. Zeeb 5451da8fa4e3SBjoern A. Zeeb return num_units; 5452da8fa4e3SBjoern A. Zeeb } 5453da8fa4e3SBjoern A. Zeeb 5454da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id, 5455da8fa4e3SBjoern A. Zeeb u32 num_units, u32 unit_len) 5456da8fa4e3SBjoern A. Zeeb { 5457da8fa4e3SBjoern A. Zeeb int ret; 5458da8fa4e3SBjoern A. Zeeb 5459da8fa4e3SBjoern A. Zeeb while (num_units) { 5460da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len); 5461da8fa4e3SBjoern A. Zeeb if (ret < 0) 5462da8fa4e3SBjoern A. Zeeb return ret; 5463da8fa4e3SBjoern A. Zeeb 5464da8fa4e3SBjoern A. Zeeb num_units -= ret; 5465da8fa4e3SBjoern A. Zeeb } 5466da8fa4e3SBjoern A. Zeeb 5467da8fa4e3SBjoern A. Zeeb return 0; 5468da8fa4e3SBjoern A. Zeeb } 5469da8fa4e3SBjoern A. Zeeb 5470da8fa4e3SBjoern A. Zeeb static bool 5471da8fa4e3SBjoern A. Zeeb ath10k_wmi_is_host_mem_allocated(struct ath10k *ar, 5472da8fa4e3SBjoern A. Zeeb const struct wlan_host_mem_req **mem_reqs, 5473da8fa4e3SBjoern A. Zeeb u32 num_mem_reqs) 5474da8fa4e3SBjoern A. Zeeb { 5475da8fa4e3SBjoern A. Zeeb u32 req_id, num_units, unit_size, num_unit_info; 5476da8fa4e3SBjoern A. Zeeb u32 pool_size; 5477da8fa4e3SBjoern A. Zeeb int i, j; 5478da8fa4e3SBjoern A. Zeeb bool found; 5479da8fa4e3SBjoern A. Zeeb 5480da8fa4e3SBjoern A. Zeeb if (ar->wmi.num_mem_chunks != num_mem_reqs) 5481da8fa4e3SBjoern A. Zeeb return false; 5482da8fa4e3SBjoern A. Zeeb 5483da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_mem_reqs; ++i) { 5484da8fa4e3SBjoern A. Zeeb req_id = __le32_to_cpu(mem_reqs[i]->req_id); 5485da8fa4e3SBjoern A. Zeeb num_units = __le32_to_cpu(mem_reqs[i]->num_units); 5486da8fa4e3SBjoern A. Zeeb unit_size = __le32_to_cpu(mem_reqs[i]->unit_size); 5487da8fa4e3SBjoern A. Zeeb num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info); 5488da8fa4e3SBjoern A. Zeeb 5489da8fa4e3SBjoern A. Zeeb if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) { 5490da8fa4e3SBjoern A. Zeeb if (ar->num_active_peers) 5491da8fa4e3SBjoern A. Zeeb num_units = ar->num_active_peers + 1; 5492da8fa4e3SBjoern A. Zeeb else 5493da8fa4e3SBjoern A. Zeeb num_units = ar->max_num_peers + 1; 5494da8fa4e3SBjoern A. Zeeb } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) { 5495da8fa4e3SBjoern A. Zeeb num_units = ar->max_num_peers + 1; 5496da8fa4e3SBjoern A. Zeeb } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) { 5497da8fa4e3SBjoern A. Zeeb num_units = ar->max_num_vdevs + 1; 5498da8fa4e3SBjoern A. Zeeb } 5499da8fa4e3SBjoern A. Zeeb 5500da8fa4e3SBjoern A. Zeeb found = false; 5501da8fa4e3SBjoern A. Zeeb for (j = 0; j < ar->wmi.num_mem_chunks; j++) { 5502da8fa4e3SBjoern A. Zeeb if (ar->wmi.mem_chunks[j].req_id == req_id) { 5503da8fa4e3SBjoern A. Zeeb pool_size = num_units * round_up(unit_size, 4); 5504da8fa4e3SBjoern A. Zeeb if (ar->wmi.mem_chunks[j].len == pool_size) { 5505da8fa4e3SBjoern A. Zeeb found = true; 5506da8fa4e3SBjoern A. Zeeb break; 5507da8fa4e3SBjoern A. Zeeb } 5508da8fa4e3SBjoern A. Zeeb } 5509da8fa4e3SBjoern A. Zeeb } 5510da8fa4e3SBjoern A. Zeeb if (!found) 5511da8fa4e3SBjoern A. Zeeb return false; 5512da8fa4e3SBjoern A. Zeeb } 5513da8fa4e3SBjoern A. Zeeb 5514da8fa4e3SBjoern A. Zeeb return true; 5515da8fa4e3SBjoern A. Zeeb } 5516da8fa4e3SBjoern A. Zeeb 5517da8fa4e3SBjoern A. Zeeb static int 5518da8fa4e3SBjoern A. Zeeb ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 5519da8fa4e3SBjoern A. Zeeb struct wmi_svc_rdy_ev_arg *arg) 5520da8fa4e3SBjoern A. Zeeb { 5521da8fa4e3SBjoern A. Zeeb struct wmi_service_ready_event *ev; 5522da8fa4e3SBjoern A. Zeeb size_t i, n; 5523da8fa4e3SBjoern A. Zeeb 5524da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 5525da8fa4e3SBjoern A. Zeeb return -EPROTO; 5526da8fa4e3SBjoern A. Zeeb 5527da8fa4e3SBjoern A. Zeeb ev = (void *)skb->data; 5528da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 5529da8fa4e3SBjoern A. Zeeb arg->min_tx_power = ev->hw_min_tx_power; 5530da8fa4e3SBjoern A. Zeeb arg->max_tx_power = ev->hw_max_tx_power; 5531da8fa4e3SBjoern A. Zeeb arg->ht_cap = ev->ht_cap_info; 5532da8fa4e3SBjoern A. Zeeb arg->vht_cap = ev->vht_cap_info; 5533da8fa4e3SBjoern A. Zeeb arg->vht_supp_mcs = ev->vht_supp_mcs; 5534da8fa4e3SBjoern A. Zeeb arg->sw_ver0 = ev->sw_version; 5535da8fa4e3SBjoern A. Zeeb arg->sw_ver1 = ev->sw_version_1; 5536da8fa4e3SBjoern A. Zeeb arg->phy_capab = ev->phy_capability; 5537da8fa4e3SBjoern A. Zeeb arg->num_rf_chains = ev->num_rf_chains; 5538da8fa4e3SBjoern A. Zeeb arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd; 5539da8fa4e3SBjoern A. Zeeb arg->low_2ghz_chan = ev->hal_reg_capabilities.low_2ghz_chan; 5540da8fa4e3SBjoern A. Zeeb arg->high_2ghz_chan = ev->hal_reg_capabilities.high_2ghz_chan; 5541da8fa4e3SBjoern A. Zeeb arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan; 5542da8fa4e3SBjoern A. Zeeb arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan; 5543da8fa4e3SBjoern A. Zeeb arg->num_mem_reqs = ev->num_mem_reqs; 5544da8fa4e3SBjoern A. Zeeb arg->service_map = ev->wmi_service_bitmap; 5545da8fa4e3SBjoern A. Zeeb arg->service_map_len = sizeof(ev->wmi_service_bitmap); 5546da8fa4e3SBjoern A. Zeeb 5547da8fa4e3SBjoern A. Zeeb n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs), 5548da8fa4e3SBjoern A. Zeeb ARRAY_SIZE(arg->mem_reqs)); 5549da8fa4e3SBjoern A. Zeeb for (i = 0; i < n; i++) 5550da8fa4e3SBjoern A. Zeeb arg->mem_reqs[i] = &ev->mem_reqs[i]; 5551da8fa4e3SBjoern A. Zeeb 5552da8fa4e3SBjoern A. Zeeb if (skb->len < 5553da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0])) 5554da8fa4e3SBjoern A. Zeeb return -EPROTO; 5555da8fa4e3SBjoern A. Zeeb 5556da8fa4e3SBjoern A. Zeeb return 0; 5557da8fa4e3SBjoern A. Zeeb } 5558da8fa4e3SBjoern A. Zeeb 5559da8fa4e3SBjoern A. Zeeb static int 5560da8fa4e3SBjoern A. Zeeb ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 5561da8fa4e3SBjoern A. Zeeb struct wmi_svc_rdy_ev_arg *arg) 5562da8fa4e3SBjoern A. Zeeb { 5563da8fa4e3SBjoern A. Zeeb struct wmi_10x_service_ready_event *ev; 5564da8fa4e3SBjoern A. Zeeb int i, n; 5565da8fa4e3SBjoern A. Zeeb 5566da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 5567da8fa4e3SBjoern A. Zeeb return -EPROTO; 5568da8fa4e3SBjoern A. Zeeb 5569da8fa4e3SBjoern A. Zeeb ev = (void *)skb->data; 5570da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 5571da8fa4e3SBjoern A. Zeeb arg->min_tx_power = ev->hw_min_tx_power; 5572da8fa4e3SBjoern A. Zeeb arg->max_tx_power = ev->hw_max_tx_power; 5573da8fa4e3SBjoern A. Zeeb arg->ht_cap = ev->ht_cap_info; 5574da8fa4e3SBjoern A. Zeeb arg->vht_cap = ev->vht_cap_info; 5575da8fa4e3SBjoern A. Zeeb arg->vht_supp_mcs = ev->vht_supp_mcs; 5576da8fa4e3SBjoern A. Zeeb arg->sw_ver0 = ev->sw_version; 5577da8fa4e3SBjoern A. Zeeb arg->phy_capab = ev->phy_capability; 5578da8fa4e3SBjoern A. Zeeb arg->num_rf_chains = ev->num_rf_chains; 5579da8fa4e3SBjoern A. Zeeb arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd; 5580da8fa4e3SBjoern A. Zeeb arg->low_2ghz_chan = ev->hal_reg_capabilities.low_2ghz_chan; 5581da8fa4e3SBjoern A. Zeeb arg->high_2ghz_chan = ev->hal_reg_capabilities.high_2ghz_chan; 5582da8fa4e3SBjoern A. Zeeb arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan; 5583da8fa4e3SBjoern A. Zeeb arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan; 5584da8fa4e3SBjoern A. Zeeb arg->num_mem_reqs = ev->num_mem_reqs; 5585da8fa4e3SBjoern A. Zeeb arg->service_map = ev->wmi_service_bitmap; 5586da8fa4e3SBjoern A. Zeeb arg->service_map_len = sizeof(ev->wmi_service_bitmap); 5587da8fa4e3SBjoern A. Zeeb 5588da8fa4e3SBjoern A. Zeeb /* Deliberately skipping ev->sys_cap_info as WMI and WMI-TLV have 5589da8fa4e3SBjoern A. Zeeb * different values. We would need a translation to handle that, 5590da8fa4e3SBjoern A. Zeeb * but as we don't currently need anything from sys_cap_info from 5591da8fa4e3SBjoern A. Zeeb * WMI interface (only from WMI-TLV) safest it to skip it. 5592da8fa4e3SBjoern A. Zeeb */ 5593da8fa4e3SBjoern A. Zeeb 5594da8fa4e3SBjoern A. Zeeb n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs), 5595da8fa4e3SBjoern A. Zeeb ARRAY_SIZE(arg->mem_reqs)); 5596da8fa4e3SBjoern A. Zeeb for (i = 0; i < n; i++) 5597da8fa4e3SBjoern A. Zeeb arg->mem_reqs[i] = &ev->mem_reqs[i]; 5598da8fa4e3SBjoern A. Zeeb 5599da8fa4e3SBjoern A. Zeeb if (skb->len < 5600da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0])) 5601da8fa4e3SBjoern A. Zeeb return -EPROTO; 5602da8fa4e3SBjoern A. Zeeb 5603da8fa4e3SBjoern A. Zeeb return 0; 5604da8fa4e3SBjoern A. Zeeb } 5605da8fa4e3SBjoern A. Zeeb 5606da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_event_service_ready_work(struct work_struct *work) 5607da8fa4e3SBjoern A. Zeeb { 5608da8fa4e3SBjoern A. Zeeb struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work); 5609da8fa4e3SBjoern A. Zeeb struct sk_buff *skb = ar->svc_rdy_skb; 5610da8fa4e3SBjoern A. Zeeb struct wmi_svc_rdy_ev_arg arg = {}; 5611da8fa4e3SBjoern A. Zeeb u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i; 5612da8fa4e3SBjoern A. Zeeb int ret; 5613da8fa4e3SBjoern A. Zeeb bool allocated; 5614da8fa4e3SBjoern A. Zeeb 5615da8fa4e3SBjoern A. Zeeb if (!skb) { 5616da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "invalid service ready event skb\n"); 5617da8fa4e3SBjoern A. Zeeb return; 5618da8fa4e3SBjoern A. Zeeb } 5619da8fa4e3SBjoern A. Zeeb 5620da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg); 5621da8fa4e3SBjoern A. Zeeb if (ret) { 5622da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse service ready: %d\n", ret); 5623da8fa4e3SBjoern A. Zeeb return; 5624da8fa4e3SBjoern A. Zeeb } 5625da8fa4e3SBjoern A. Zeeb 5626da8fa4e3SBjoern A. Zeeb ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map, 5627da8fa4e3SBjoern A. Zeeb arg.service_map_len); 5628da8fa4e3SBjoern A. Zeeb 5629da8fa4e3SBjoern A. Zeeb ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power); 5630da8fa4e3SBjoern A. Zeeb ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power); 5631da8fa4e3SBjoern A. Zeeb ar->ht_cap_info = __le32_to_cpu(arg.ht_cap); 5632da8fa4e3SBjoern A. Zeeb ar->vht_cap_info = __le32_to_cpu(arg.vht_cap); 5633da8fa4e3SBjoern A. Zeeb ar->vht_supp_mcs = __le32_to_cpu(arg.vht_supp_mcs); 5634da8fa4e3SBjoern A. Zeeb ar->fw_version_major = 5635da8fa4e3SBjoern A. Zeeb (__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24; 5636da8fa4e3SBjoern A. Zeeb ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff); 5637da8fa4e3SBjoern A. Zeeb ar->fw_version_release = 5638da8fa4e3SBjoern A. Zeeb (__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16; 5639da8fa4e3SBjoern A. Zeeb ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff); 5640da8fa4e3SBjoern A. Zeeb ar->phy_capability = __le32_to_cpu(arg.phy_capab); 5641da8fa4e3SBjoern A. Zeeb ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains); 5642da8fa4e3SBjoern A. Zeeb ar->hw_eeprom_rd = __le32_to_cpu(arg.eeprom_rd); 5643da8fa4e3SBjoern A. Zeeb ar->low_2ghz_chan = __le32_to_cpu(arg.low_2ghz_chan); 5644da8fa4e3SBjoern A. Zeeb ar->high_2ghz_chan = __le32_to_cpu(arg.high_2ghz_chan); 5645da8fa4e3SBjoern A. Zeeb ar->low_5ghz_chan = __le32_to_cpu(arg.low_5ghz_chan); 5646da8fa4e3SBjoern A. Zeeb ar->high_5ghz_chan = __le32_to_cpu(arg.high_5ghz_chan); 5647da8fa4e3SBjoern A. Zeeb ar->sys_cap_info = __le32_to_cpu(arg.sys_cap_info); 5648da8fa4e3SBjoern A. Zeeb 5649da8fa4e3SBjoern A. Zeeb ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ", 5650da8fa4e3SBjoern A. Zeeb arg.service_map, arg.service_map_len); 5651da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi sys_cap_info 0x%x\n", 5652da8fa4e3SBjoern A. Zeeb ar->sys_cap_info); 5653da8fa4e3SBjoern A. Zeeb 5654da8fa4e3SBjoern A. Zeeb if (ar->num_rf_chains > ar->max_spatial_stream) { 5655da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n", 5656da8fa4e3SBjoern A. Zeeb ar->num_rf_chains, ar->max_spatial_stream); 5657da8fa4e3SBjoern A. Zeeb ar->num_rf_chains = ar->max_spatial_stream; 5658da8fa4e3SBjoern A. Zeeb } 5659da8fa4e3SBjoern A. Zeeb 5660da8fa4e3SBjoern A. Zeeb if (!ar->cfg_tx_chainmask) { 5661da8fa4e3SBjoern A. Zeeb ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1; 5662da8fa4e3SBjoern A. Zeeb ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1; 5663da8fa4e3SBjoern A. Zeeb } 5664da8fa4e3SBjoern A. Zeeb 5665da8fa4e3SBjoern A. Zeeb if (strlen(ar->hw->wiphy->fw_version) == 0) { 5666da8fa4e3SBjoern A. Zeeb snprintf(ar->hw->wiphy->fw_version, 5667da8fa4e3SBjoern A. Zeeb sizeof(ar->hw->wiphy->fw_version), 5668da8fa4e3SBjoern A. Zeeb "%u.%u.%u.%u", 5669da8fa4e3SBjoern A. Zeeb ar->fw_version_major, 5670da8fa4e3SBjoern A. Zeeb ar->fw_version_minor, 5671da8fa4e3SBjoern A. Zeeb ar->fw_version_release, 5672da8fa4e3SBjoern A. Zeeb ar->fw_version_build); 5673da8fa4e3SBjoern A. Zeeb } 5674da8fa4e3SBjoern A. Zeeb 5675da8fa4e3SBjoern A. Zeeb num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs); 5676da8fa4e3SBjoern A. Zeeb if (num_mem_reqs > WMI_MAX_MEM_REQS) { 5677da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n", 5678da8fa4e3SBjoern A. Zeeb num_mem_reqs); 5679da8fa4e3SBjoern A. Zeeb return; 5680da8fa4e3SBjoern A. Zeeb } 5681da8fa4e3SBjoern A. Zeeb 5682da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) { 5683da8fa4e3SBjoern A. Zeeb if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL, 5684da8fa4e3SBjoern A. Zeeb ar->running_fw->fw_file.fw_features)) 5685da8fa4e3SBjoern A. Zeeb ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC + 5686da8fa4e3SBjoern A. Zeeb ar->max_num_vdevs; 5687da8fa4e3SBjoern A. Zeeb else 5688da8fa4e3SBjoern A. Zeeb ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS + 5689da8fa4e3SBjoern A. Zeeb ar->max_num_vdevs; 5690da8fa4e3SBjoern A. Zeeb 5691da8fa4e3SBjoern A. Zeeb ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX + 5692da8fa4e3SBjoern A. Zeeb ar->max_num_vdevs; 5693da8fa4e3SBjoern A. Zeeb ar->num_tids = ar->num_active_peers * 2; 5694da8fa4e3SBjoern A. Zeeb ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX; 5695da8fa4e3SBjoern A. Zeeb } 5696da8fa4e3SBjoern A. Zeeb 5697da8fa4e3SBjoern A. Zeeb /* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE 5698da8fa4e3SBjoern A. Zeeb * and WMI_SERVICE_IRAM_TIDS, etc. 5699da8fa4e3SBjoern A. Zeeb */ 5700da8fa4e3SBjoern A. Zeeb 5701da8fa4e3SBjoern A. Zeeb allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs, 5702da8fa4e3SBjoern A. Zeeb num_mem_reqs); 5703da8fa4e3SBjoern A. Zeeb if (allocated) 5704da8fa4e3SBjoern A. Zeeb goto skip_mem_alloc; 5705da8fa4e3SBjoern A. Zeeb 5706da8fa4e3SBjoern A. Zeeb /* Either this event is received during boot time or there is a change 5707da8fa4e3SBjoern A. Zeeb * in memory requirement from firmware when compared to last request. 5708da8fa4e3SBjoern A. Zeeb * Free any old memory and do a fresh allocation based on the current 5709da8fa4e3SBjoern A. Zeeb * memory requirement. 5710da8fa4e3SBjoern A. Zeeb */ 5711da8fa4e3SBjoern A. Zeeb ath10k_wmi_free_host_mem(ar); 5712da8fa4e3SBjoern A. Zeeb 5713da8fa4e3SBjoern A. Zeeb for (i = 0; i < num_mem_reqs; ++i) { 5714da8fa4e3SBjoern A. Zeeb req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id); 5715da8fa4e3SBjoern A. Zeeb num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units); 5716da8fa4e3SBjoern A. Zeeb unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size); 5717da8fa4e3SBjoern A. Zeeb num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info); 5718da8fa4e3SBjoern A. Zeeb 5719da8fa4e3SBjoern A. Zeeb if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) { 5720da8fa4e3SBjoern A. Zeeb if (ar->num_active_peers) 5721da8fa4e3SBjoern A. Zeeb num_units = ar->num_active_peers + 1; 5722da8fa4e3SBjoern A. Zeeb else 5723da8fa4e3SBjoern A. Zeeb num_units = ar->max_num_peers + 1; 5724da8fa4e3SBjoern A. Zeeb } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) { 5725da8fa4e3SBjoern A. Zeeb /* number of units to allocate is number of 5726da8fa4e3SBjoern A. Zeeb * peers, 1 extra for self peer on target 5727da8fa4e3SBjoern A. Zeeb * this needs to be tied, host and target 5728da8fa4e3SBjoern A. Zeeb * can get out of sync 5729da8fa4e3SBjoern A. Zeeb */ 5730da8fa4e3SBjoern A. Zeeb num_units = ar->max_num_peers + 1; 5731da8fa4e3SBjoern A. Zeeb } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) { 5732da8fa4e3SBjoern A. Zeeb num_units = ar->max_num_vdevs + 1; 5733da8fa4e3SBjoern A. Zeeb } 5734da8fa4e3SBjoern A. Zeeb 5735da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5736da8fa4e3SBjoern A. Zeeb "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n", 5737da8fa4e3SBjoern A. Zeeb req_id, 5738da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.mem_reqs[i]->num_units), 5739da8fa4e3SBjoern A. Zeeb num_unit_info, 5740da8fa4e3SBjoern A. Zeeb unit_size, 5741da8fa4e3SBjoern A. Zeeb num_units); 5742da8fa4e3SBjoern A. Zeeb 5743da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units, 5744da8fa4e3SBjoern A. Zeeb unit_size); 5745da8fa4e3SBjoern A. Zeeb if (ret) 5746da8fa4e3SBjoern A. Zeeb return; 5747da8fa4e3SBjoern A. Zeeb } 5748da8fa4e3SBjoern A. Zeeb 5749da8fa4e3SBjoern A. Zeeb skip_mem_alloc: 5750da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5751da8fa4e3SBjoern A. Zeeb "wmi event service ready min_tx_power 0x%08x max_tx_power 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_mcs 0x%08x sw_ver0 0x%08x sw_ver1 0x%08x fw_build 0x%08x phy_capab 0x%08x num_rf_chains 0x%08x eeprom_rd 0x%08x low_2ghz_chan %d high_2ghz_chan %d low_5ghz_chan %d high_5ghz_chan %d num_mem_reqs 0x%08x\n", 5752da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.min_tx_power), 5753da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.max_tx_power), 5754da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.ht_cap), 5755da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.vht_cap), 5756da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.vht_supp_mcs), 5757da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.sw_ver0), 5758da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.sw_ver1), 5759da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.fw_build), 5760da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.phy_capab), 5761da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.num_rf_chains), 5762da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.eeprom_rd), 5763da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.low_2ghz_chan), 5764da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.high_2ghz_chan), 5765da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.low_5ghz_chan), 5766da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.high_5ghz_chan), 5767da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.num_mem_reqs)); 5768da8fa4e3SBjoern A. Zeeb 5769da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 5770da8fa4e3SBjoern A. Zeeb ar->svc_rdy_skb = NULL; 5771da8fa4e3SBjoern A. Zeeb complete(&ar->wmi.service_ready); 5772da8fa4e3SBjoern A. Zeeb } 5773da8fa4e3SBjoern A. Zeeb 5774da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb) 5775da8fa4e3SBjoern A. Zeeb { 5776da8fa4e3SBjoern A. Zeeb ar->svc_rdy_skb = skb; 5777da8fa4e3SBjoern A. Zeeb queue_work(ar->workqueue_aux, &ar->svc_rdy_work); 5778da8fa4e3SBjoern A. Zeeb } 5779da8fa4e3SBjoern A. Zeeb 5780da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 5781da8fa4e3SBjoern A. Zeeb struct wmi_rdy_ev_arg *arg) 5782da8fa4e3SBjoern A. Zeeb { 5783da8fa4e3SBjoern A. Zeeb struct wmi_ready_event *ev = (void *)skb->data; 5784da8fa4e3SBjoern A. Zeeb 5785da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 5786da8fa4e3SBjoern A. Zeeb return -EPROTO; 5787da8fa4e3SBjoern A. Zeeb 5788da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 5789da8fa4e3SBjoern A. Zeeb arg->sw_version = ev->sw_version; 5790da8fa4e3SBjoern A. Zeeb arg->abi_version = ev->abi_version; 5791da8fa4e3SBjoern A. Zeeb arg->status = ev->status; 5792da8fa4e3SBjoern A. Zeeb arg->mac_addr = ev->mac_addr.addr; 5793da8fa4e3SBjoern A. Zeeb 5794da8fa4e3SBjoern A. Zeeb return 0; 5795da8fa4e3SBjoern A. Zeeb } 5796da8fa4e3SBjoern A. Zeeb 5797da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb, 5798da8fa4e3SBjoern A. Zeeb struct wmi_roam_ev_arg *arg) 5799da8fa4e3SBjoern A. Zeeb { 5800da8fa4e3SBjoern A. Zeeb struct wmi_roam_ev *ev = (void *)skb->data; 5801da8fa4e3SBjoern A. Zeeb 5802da8fa4e3SBjoern A. Zeeb if (skb->len < sizeof(*ev)) 5803da8fa4e3SBjoern A. Zeeb return -EPROTO; 5804da8fa4e3SBjoern A. Zeeb 5805da8fa4e3SBjoern A. Zeeb skb_pull(skb, sizeof(*ev)); 5806da8fa4e3SBjoern A. Zeeb arg->vdev_id = ev->vdev_id; 5807da8fa4e3SBjoern A. Zeeb arg->reason = ev->reason; 5808da8fa4e3SBjoern A. Zeeb 5809da8fa4e3SBjoern A. Zeeb return 0; 5810da8fa4e3SBjoern A. Zeeb } 5811da8fa4e3SBjoern A. Zeeb 5812da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar, 5813da8fa4e3SBjoern A. Zeeb struct sk_buff *skb, 5814da8fa4e3SBjoern A. Zeeb struct wmi_echo_ev_arg *arg) 5815da8fa4e3SBjoern A. Zeeb { 5816da8fa4e3SBjoern A. Zeeb struct wmi_echo_event *ev = (void *)skb->data; 5817da8fa4e3SBjoern A. Zeeb 5818da8fa4e3SBjoern A. Zeeb arg->value = ev->value; 5819da8fa4e3SBjoern A. Zeeb 5820da8fa4e3SBjoern A. Zeeb return 0; 5821da8fa4e3SBjoern A. Zeeb } 5822da8fa4e3SBjoern A. Zeeb 5823da8fa4e3SBjoern A. Zeeb int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb) 5824da8fa4e3SBjoern A. Zeeb { 5825da8fa4e3SBjoern A. Zeeb struct wmi_rdy_ev_arg arg = {}; 5826da8fa4e3SBjoern A. Zeeb int ret; 5827da8fa4e3SBjoern A. Zeeb 5828da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_rdy(ar, skb, &arg); 5829da8fa4e3SBjoern A. Zeeb if (ret) { 5830da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse ready event: %d\n", ret); 5831da8fa4e3SBjoern A. Zeeb return ret; 5832da8fa4e3SBjoern A. Zeeb } 5833da8fa4e3SBjoern A. Zeeb 5834da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5835da8fa4e3SBjoern A. Zeeb "wmi event ready sw_version 0x%08x abi_version %u mac_addr %pM status %d\n", 5836da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.sw_version), 5837da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.abi_version), 5838da8fa4e3SBjoern A. Zeeb arg.mac_addr, 5839da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.status)); 5840da8fa4e3SBjoern A. Zeeb 5841da8fa4e3SBjoern A. Zeeb if (is_zero_ether_addr(ar->mac_addr)) 5842da8fa4e3SBjoern A. Zeeb ether_addr_copy(ar->mac_addr, arg.mac_addr); 5843da8fa4e3SBjoern A. Zeeb complete(&ar->wmi.unified_ready); 5844da8fa4e3SBjoern A. Zeeb return 0; 5845da8fa4e3SBjoern A. Zeeb } 5846da8fa4e3SBjoern A. Zeeb 5847da8fa4e3SBjoern A. Zeeb void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb) 5848da8fa4e3SBjoern A. Zeeb { 5849da8fa4e3SBjoern A. Zeeb int ret; 5850da8fa4e3SBjoern A. Zeeb struct wmi_svc_avail_ev_arg arg = {}; 5851da8fa4e3SBjoern A. Zeeb 5852da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_pull_svc_avail(ar, skb, &arg); 5853da8fa4e3SBjoern A. Zeeb if (ret) { 5854da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to parse service available event: %d\n", 5855da8fa4e3SBjoern A. Zeeb ret); 5856da8fa4e3SBjoern A. Zeeb } 5857da8fa4e3SBjoern A. Zeeb 5858da8fa4e3SBjoern A. Zeeb /* 5859da8fa4e3SBjoern A. Zeeb * Initialization of "arg.service_map_ext_valid" to ZERO is necessary 5860da8fa4e3SBjoern A. Zeeb * for the below logic to work. 5861da8fa4e3SBjoern A. Zeeb */ 5862da8fa4e3SBjoern A. Zeeb if (arg.service_map_ext_valid) 5863da8fa4e3SBjoern A. Zeeb ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map, 5864da8fa4e3SBjoern A. Zeeb __le32_to_cpu(arg.service_map_ext_len)); 5865da8fa4e3SBjoern A. Zeeb } 5866da8fa4e3SBjoern A. Zeeb 5867da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb) 5868da8fa4e3SBjoern A. Zeeb { 5869da8fa4e3SBjoern A. Zeeb const struct wmi_pdev_temperature_event *ev; 5870da8fa4e3SBjoern A. Zeeb 5871da8fa4e3SBjoern A. Zeeb ev = (struct wmi_pdev_temperature_event *)skb->data; 5872da8fa4e3SBjoern A. Zeeb if (WARN_ON(skb->len < sizeof(*ev))) 5873da8fa4e3SBjoern A. Zeeb return -EPROTO; 5874da8fa4e3SBjoern A. Zeeb 5875da8fa4e3SBjoern A. Zeeb ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature)); 5876da8fa4e3SBjoern A. Zeeb return 0; 5877da8fa4e3SBjoern A. Zeeb } 5878da8fa4e3SBjoern A. Zeeb 5879da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar, 5880da8fa4e3SBjoern A. Zeeb struct sk_buff *skb) 5881da8fa4e3SBjoern A. Zeeb { 5882da8fa4e3SBjoern A. Zeeb struct wmi_pdev_bss_chan_info_event *ev; 5883da8fa4e3SBjoern A. Zeeb struct survey_info *survey; 5884da8fa4e3SBjoern A. Zeeb u64 busy, total, tx, rx, rx_bss; 5885da8fa4e3SBjoern A. Zeeb u32 freq, noise_floor; 5886da8fa4e3SBjoern A. Zeeb u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz; 5887da8fa4e3SBjoern A. Zeeb int idx; 5888da8fa4e3SBjoern A. Zeeb 5889da8fa4e3SBjoern A. Zeeb ev = (struct wmi_pdev_bss_chan_info_event *)skb->data; 5890da8fa4e3SBjoern A. Zeeb if (WARN_ON(skb->len < sizeof(*ev))) 5891da8fa4e3SBjoern A. Zeeb return -EPROTO; 5892da8fa4e3SBjoern A. Zeeb 5893da8fa4e3SBjoern A. Zeeb freq = __le32_to_cpu(ev->freq); 5894da8fa4e3SBjoern A. Zeeb noise_floor = __le32_to_cpu(ev->noise_floor); 5895da8fa4e3SBjoern A. Zeeb busy = __le64_to_cpu(ev->cycle_busy); 5896da8fa4e3SBjoern A. Zeeb total = __le64_to_cpu(ev->cycle_total); 5897da8fa4e3SBjoern A. Zeeb tx = __le64_to_cpu(ev->cycle_tx); 5898da8fa4e3SBjoern A. Zeeb rx = __le64_to_cpu(ev->cycle_rx); 5899da8fa4e3SBjoern A. Zeeb rx_bss = __le64_to_cpu(ev->cycle_rx_bss); 5900da8fa4e3SBjoern A. Zeeb 5901da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 5902da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 5903da8fa4e3SBjoern A. Zeeb "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n", 5904da8fa4e3SBjoern A. Zeeb freq, noise_floor, busy, total, tx, rx, rx_bss); 5905da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 5906da8fa4e3SBjoern A. Zeeb "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %ju total %ju tx %ju rx %ju rx_bss %ju\n", 5907da8fa4e3SBjoern A. Zeeb freq, noise_floor, (uintmax_t)busy, (uintmax_t)total, (uintmax_t)tx, (uintmax_t)rx, (uintmax_t)rx_bss); 5908da8fa4e3SBjoern A. Zeeb #endif 5909da8fa4e3SBjoern A. Zeeb 5910da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 5911da8fa4e3SBjoern A. Zeeb idx = freq_to_idx(ar, freq); 5912da8fa4e3SBjoern A. Zeeb if (idx >= ARRAY_SIZE(ar->survey)) { 5913da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n", 5914da8fa4e3SBjoern A. Zeeb freq, idx); 5915da8fa4e3SBjoern A. Zeeb goto exit; 5916da8fa4e3SBjoern A. Zeeb } 5917da8fa4e3SBjoern A. Zeeb 5918da8fa4e3SBjoern A. Zeeb survey = &ar->survey[idx]; 5919da8fa4e3SBjoern A. Zeeb 5920da8fa4e3SBjoern A. Zeeb survey->noise = noise_floor; 5921da8fa4e3SBjoern A. Zeeb survey->time = div_u64(total, cc_freq_hz); 5922da8fa4e3SBjoern A. Zeeb survey->time_busy = div_u64(busy, cc_freq_hz); 5923da8fa4e3SBjoern A. Zeeb survey->time_rx = div_u64(rx_bss, cc_freq_hz); 5924da8fa4e3SBjoern A. Zeeb survey->time_tx = div_u64(tx, cc_freq_hz); 5925da8fa4e3SBjoern A. Zeeb survey->filled |= (SURVEY_INFO_NOISE_DBM | 5926da8fa4e3SBjoern A. Zeeb SURVEY_INFO_TIME | 5927da8fa4e3SBjoern A. Zeeb SURVEY_INFO_TIME_BUSY | 5928da8fa4e3SBjoern A. Zeeb SURVEY_INFO_TIME_RX | 5929da8fa4e3SBjoern A. Zeeb SURVEY_INFO_TIME_TX); 5930da8fa4e3SBjoern A. Zeeb exit: 5931da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 5932da8fa4e3SBjoern A. Zeeb complete(&ar->bss_survey_done); 5933da8fa4e3SBjoern A. Zeeb return 0; 5934da8fa4e3SBjoern A. Zeeb } 5935da8fa4e3SBjoern A. Zeeb 5936da8fa4e3SBjoern A. Zeeb static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k *ar) 5937da8fa4e3SBjoern A. Zeeb { 5938da8fa4e3SBjoern A. Zeeb if (ar->hw_params.hw_ops->set_coverage_class) { 5939da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 5940da8fa4e3SBjoern A. Zeeb 5941da8fa4e3SBjoern A. Zeeb /* This call only ensures that the modified coverage class 5942da8fa4e3SBjoern A. Zeeb * persists in case the firmware sets the registers back to 5943da8fa4e3SBjoern A. Zeeb * their default value. So calling it is only necessary if the 5944da8fa4e3SBjoern A. Zeeb * coverage class has a non-zero value. 5945da8fa4e3SBjoern A. Zeeb */ 5946da8fa4e3SBjoern A. Zeeb if (ar->fw_coverage.coverage_class) 5947da8fa4e3SBjoern A. Zeeb queue_work(ar->workqueue, &ar->set_coverage_class_work); 5948da8fa4e3SBjoern A. Zeeb 5949da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 5950da8fa4e3SBjoern A. Zeeb } 5951da8fa4e3SBjoern A. Zeeb } 5952da8fa4e3SBjoern A. Zeeb 5953da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb) 5954da8fa4e3SBjoern A. Zeeb { 5955da8fa4e3SBjoern A. Zeeb struct wmi_cmd_hdr *cmd_hdr; 5956da8fa4e3SBjoern A. Zeeb enum wmi_event_id id; 5957da8fa4e3SBjoern A. Zeeb 5958da8fa4e3SBjoern A. Zeeb cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 5959da8fa4e3SBjoern A. Zeeb id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 5960da8fa4e3SBjoern A. Zeeb 5961da8fa4e3SBjoern A. Zeeb if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 5962da8fa4e3SBjoern A. Zeeb goto out; 5963da8fa4e3SBjoern A. Zeeb 5964da8fa4e3SBjoern A. Zeeb trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 5965da8fa4e3SBjoern A. Zeeb 5966da8fa4e3SBjoern A. Zeeb switch (id) { 5967da8fa4e3SBjoern A. Zeeb case WMI_MGMT_RX_EVENTID: 5968da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_mgmt_rx(ar, skb); 5969da8fa4e3SBjoern A. Zeeb /* mgmt_rx() owns the skb now! */ 5970da8fa4e3SBjoern A. Zeeb return; 5971da8fa4e3SBjoern A. Zeeb case WMI_SCAN_EVENTID: 5972da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan(ar, skb); 5973da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 5974da8fa4e3SBjoern A. Zeeb break; 5975da8fa4e3SBjoern A. Zeeb case WMI_CHAN_INFO_EVENTID: 5976da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_chan_info(ar, skb); 5977da8fa4e3SBjoern A. Zeeb break; 5978da8fa4e3SBjoern A. Zeeb case WMI_ECHO_EVENTID: 5979da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_echo(ar, skb); 5980da8fa4e3SBjoern A. Zeeb break; 5981da8fa4e3SBjoern A. Zeeb case WMI_DEBUG_MESG_EVENTID: 5982da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_mesg(ar, skb); 5983da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 5984da8fa4e3SBjoern A. Zeeb #if defined(CONFIG_FWLOG) 5985da8fa4e3SBjoern A. Zeeb return; 5986da8fa4e3SBjoern A. Zeeb #else 5987da8fa4e3SBjoern A. Zeeb break; 5988da8fa4e3SBjoern A. Zeeb #endif 5989da8fa4e3SBjoern A. Zeeb case WMI_UPDATE_STATS_EVENTID: 5990da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_update_stats(ar, skb); 5991da8fa4e3SBjoern A. Zeeb break; 5992da8fa4e3SBjoern A. Zeeb case WMI_VDEV_START_RESP_EVENTID: 5993da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_start_resp(ar, skb); 5994da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 5995da8fa4e3SBjoern A. Zeeb break; 5996da8fa4e3SBjoern A. Zeeb case WMI_VDEV_STOPPED_EVENTID: 5997da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_stopped(ar, skb); 5998da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 5999da8fa4e3SBjoern A. Zeeb break; 6000da8fa4e3SBjoern A. Zeeb case WMI_PEER_STA_KICKOUT_EVENTID: 6001da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_kickout(ar, skb); 6002da8fa4e3SBjoern A. Zeeb break; 6003da8fa4e3SBjoern A. Zeeb case WMI_HOST_SWBA_EVENTID: 6004da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_host_swba(ar, skb); 6005da8fa4e3SBjoern A. Zeeb break; 6006da8fa4e3SBjoern A. Zeeb case WMI_TBTTOFFSET_UPDATE_EVENTID: 6007da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tbttoffset_update(ar, skb); 6008da8fa4e3SBjoern A. Zeeb break; 6009da8fa4e3SBjoern A. Zeeb case WMI_PHYERR_EVENTID: 6010da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_phyerr(ar, skb); 6011da8fa4e3SBjoern A. Zeeb break; 6012da8fa4e3SBjoern A. Zeeb case WMI_ROAM_EVENTID: 6013da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_roam(ar, skb); 6014da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6015da8fa4e3SBjoern A. Zeeb break; 6016da8fa4e3SBjoern A. Zeeb case WMI_PROFILE_MATCH: 6017da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_profile_match(ar, skb); 6018da8fa4e3SBjoern A. Zeeb break; 6019da8fa4e3SBjoern A. Zeeb case WMI_DEBUG_PRINT_EVENTID: 6020da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_print(ar, skb); 6021da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6022da8fa4e3SBjoern A. Zeeb break; 6023da8fa4e3SBjoern A. Zeeb case WMI_PDEV_QVIT_EVENTID: 6024da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_qvit(ar, skb); 6025da8fa4e3SBjoern A. Zeeb break; 6026da8fa4e3SBjoern A. Zeeb case WMI_WLAN_PROFILE_DATA_EVENTID: 6027da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_wlan_profile_data(ar, skb); 6028da8fa4e3SBjoern A. Zeeb break; 6029da8fa4e3SBjoern A. Zeeb case WMI_RTT_MEASUREMENT_REPORT_EVENTID: 6030da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_rtt_measurement_report(ar, skb); 6031da8fa4e3SBjoern A. Zeeb break; 6032da8fa4e3SBjoern A. Zeeb case WMI_TSF_MEASUREMENT_REPORT_EVENTID: 6033da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tsf_measurement_report(ar, skb); 6034da8fa4e3SBjoern A. Zeeb break; 6035da8fa4e3SBjoern A. Zeeb case WMI_RTT_ERROR_REPORT_EVENTID: 6036da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_rtt_error_report(ar, skb); 6037da8fa4e3SBjoern A. Zeeb break; 6038da8fa4e3SBjoern A. Zeeb case WMI_WOW_WAKEUP_HOST_EVENTID: 6039da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_wow_wakeup_host(ar, skb); 6040da8fa4e3SBjoern A. Zeeb break; 6041da8fa4e3SBjoern A. Zeeb case WMI_DCS_INTERFERENCE_EVENTID: 6042da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dcs_interference(ar, skb); 6043da8fa4e3SBjoern A. Zeeb break; 6044da8fa4e3SBjoern A. Zeeb case WMI_PDEV_TPC_CONFIG_EVENTID: 6045da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_tpc_config(ar, skb); 6046da8fa4e3SBjoern A. Zeeb break; 6047da8fa4e3SBjoern A. Zeeb case WMI_PDEV_FTM_INTG_EVENTID: 6048da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_ftm_intg(ar, skb); 6049da8fa4e3SBjoern A. Zeeb break; 6050da8fa4e3SBjoern A. Zeeb case WMI_GTK_OFFLOAD_STATUS_EVENTID: 6051da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_gtk_offload_status(ar, skb); 6052da8fa4e3SBjoern A. Zeeb break; 6053da8fa4e3SBjoern A. Zeeb case WMI_GTK_REKEY_FAIL_EVENTID: 6054da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_gtk_rekey_fail(ar, skb); 6055da8fa4e3SBjoern A. Zeeb break; 6056da8fa4e3SBjoern A. Zeeb case WMI_TX_DELBA_COMPLETE_EVENTID: 6057da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_delba_complete(ar, skb); 6058da8fa4e3SBjoern A. Zeeb break; 6059da8fa4e3SBjoern A. Zeeb case WMI_TX_ADDBA_COMPLETE_EVENTID: 6060da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_addba_complete(ar, skb); 6061da8fa4e3SBjoern A. Zeeb break; 6062da8fa4e3SBjoern A. Zeeb case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID: 6063da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_install_key_complete(ar, skb); 6064da8fa4e3SBjoern A. Zeeb break; 6065da8fa4e3SBjoern A. Zeeb case WMI_SERVICE_READY_EVENTID: 6066da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_service_ready(ar, skb); 6067da8fa4e3SBjoern A. Zeeb return; 6068da8fa4e3SBjoern A. Zeeb case WMI_READY_EVENTID: 6069da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_ready(ar, skb); 6070da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6071da8fa4e3SBjoern A. Zeeb break; 6072da8fa4e3SBjoern A. Zeeb case WMI_SERVICE_AVAILABLE_EVENTID: 6073da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_service_available(ar, skb); 6074da8fa4e3SBjoern A. Zeeb break; 6075da8fa4e3SBjoern A. Zeeb default: 6076da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "Unknown eventid: %d\n", id); 6077da8fa4e3SBjoern A. Zeeb break; 6078da8fa4e3SBjoern A. Zeeb } 6079da8fa4e3SBjoern A. Zeeb 6080da8fa4e3SBjoern A. Zeeb out: 6081da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 6082da8fa4e3SBjoern A. Zeeb } 6083da8fa4e3SBjoern A. Zeeb 6084da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb) 6085da8fa4e3SBjoern A. Zeeb { 6086da8fa4e3SBjoern A. Zeeb struct wmi_cmd_hdr *cmd_hdr; 6087da8fa4e3SBjoern A. Zeeb enum wmi_10x_event_id id; 6088da8fa4e3SBjoern A. Zeeb bool consumed; 6089da8fa4e3SBjoern A. Zeeb 6090da8fa4e3SBjoern A. Zeeb cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 6091da8fa4e3SBjoern A. Zeeb id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 6092da8fa4e3SBjoern A. Zeeb 6093da8fa4e3SBjoern A. Zeeb if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 6094da8fa4e3SBjoern A. Zeeb goto out; 6095da8fa4e3SBjoern A. Zeeb 6096da8fa4e3SBjoern A. Zeeb trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 6097da8fa4e3SBjoern A. Zeeb 6098da8fa4e3SBjoern A. Zeeb consumed = ath10k_tm_event_wmi(ar, id, skb); 6099da8fa4e3SBjoern A. Zeeb 6100da8fa4e3SBjoern A. Zeeb /* Ready event must be handled normally also in UTF mode so that we 6101da8fa4e3SBjoern A. Zeeb * know the UTF firmware has booted, others we are just bypass WMI 6102da8fa4e3SBjoern A. Zeeb * events to testmode. 6103da8fa4e3SBjoern A. Zeeb */ 6104da8fa4e3SBjoern A. Zeeb if (consumed && id != WMI_10X_READY_EVENTID) { 6105da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6106da8fa4e3SBjoern A. Zeeb "wmi testmode consumed 0x%x\n", id); 6107da8fa4e3SBjoern A. Zeeb goto out; 6108da8fa4e3SBjoern A. Zeeb } 6109da8fa4e3SBjoern A. Zeeb 6110da8fa4e3SBjoern A. Zeeb switch (id) { 6111da8fa4e3SBjoern A. Zeeb case WMI_10X_MGMT_RX_EVENTID: 6112da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_mgmt_rx(ar, skb); 6113da8fa4e3SBjoern A. Zeeb /* mgmt_rx() owns the skb now! */ 6114da8fa4e3SBjoern A. Zeeb return; 6115da8fa4e3SBjoern A. Zeeb case WMI_10X_SCAN_EVENTID: 6116da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan(ar, skb); 6117da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6118da8fa4e3SBjoern A. Zeeb break; 6119da8fa4e3SBjoern A. Zeeb case WMI_10X_CHAN_INFO_EVENTID: 6120da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_chan_info(ar, skb); 6121da8fa4e3SBjoern A. Zeeb break; 6122da8fa4e3SBjoern A. Zeeb case WMI_10X_ECHO_EVENTID: 6123da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_echo(ar, skb); 6124da8fa4e3SBjoern A. Zeeb break; 6125da8fa4e3SBjoern A. Zeeb case WMI_10X_DEBUG_MESG_EVENTID: 6126da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_mesg(ar, skb); 6127da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6128da8fa4e3SBjoern A. Zeeb #if defined(CONFIG_FWLOG) 6129da8fa4e3SBjoern A. Zeeb return; 6130da8fa4e3SBjoern A. Zeeb #else 6131da8fa4e3SBjoern A. Zeeb break; 6132da8fa4e3SBjoern A. Zeeb #endif 6133da8fa4e3SBjoern A. Zeeb case WMI_10X_UPDATE_STATS_EVENTID: 6134da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_update_stats(ar, skb); 6135da8fa4e3SBjoern A. Zeeb break; 6136da8fa4e3SBjoern A. Zeeb case WMI_10X_VDEV_START_RESP_EVENTID: 6137da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_start_resp(ar, skb); 6138da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6139da8fa4e3SBjoern A. Zeeb break; 6140da8fa4e3SBjoern A. Zeeb case WMI_10X_VDEV_STOPPED_EVENTID: 6141da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_stopped(ar, skb); 6142da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6143da8fa4e3SBjoern A. Zeeb break; 6144da8fa4e3SBjoern A. Zeeb case WMI_10X_PEER_STA_KICKOUT_EVENTID: 6145da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_kickout(ar, skb); 6146da8fa4e3SBjoern A. Zeeb break; 6147da8fa4e3SBjoern A. Zeeb case WMI_10X_HOST_SWBA_EVENTID: 6148da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_host_swba(ar, skb); 6149da8fa4e3SBjoern A. Zeeb break; 6150da8fa4e3SBjoern A. Zeeb case WMI_10X_TBTTOFFSET_UPDATE_EVENTID: 6151da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tbttoffset_update(ar, skb); 6152da8fa4e3SBjoern A. Zeeb break; 6153da8fa4e3SBjoern A. Zeeb case WMI_10X_PHYERR_EVENTID: 6154da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_phyerr(ar, skb); 6155da8fa4e3SBjoern A. Zeeb break; 6156da8fa4e3SBjoern A. Zeeb case WMI_10X_ROAM_EVENTID: 6157da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_roam(ar, skb); 6158da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6159da8fa4e3SBjoern A. Zeeb break; 6160da8fa4e3SBjoern A. Zeeb case WMI_10X_PROFILE_MATCH: 6161da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_profile_match(ar, skb); 6162da8fa4e3SBjoern A. Zeeb break; 6163da8fa4e3SBjoern A. Zeeb case WMI_10X_DEBUG_PRINT_EVENTID: 6164da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_print(ar, skb); 6165da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6166da8fa4e3SBjoern A. Zeeb break; 6167da8fa4e3SBjoern A. Zeeb case WMI_10X_PDEV_QVIT_EVENTID: 6168da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_qvit(ar, skb); 6169da8fa4e3SBjoern A. Zeeb break; 6170da8fa4e3SBjoern A. Zeeb case WMI_10X_WLAN_PROFILE_DATA_EVENTID: 6171da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_wlan_profile_data(ar, skb); 6172da8fa4e3SBjoern A. Zeeb break; 6173da8fa4e3SBjoern A. Zeeb case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID: 6174da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_rtt_measurement_report(ar, skb); 6175da8fa4e3SBjoern A. Zeeb break; 6176da8fa4e3SBjoern A. Zeeb case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID: 6177da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tsf_measurement_report(ar, skb); 6178da8fa4e3SBjoern A. Zeeb break; 6179da8fa4e3SBjoern A. Zeeb case WMI_10X_RTT_ERROR_REPORT_EVENTID: 6180da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_rtt_error_report(ar, skb); 6181da8fa4e3SBjoern A. Zeeb break; 6182da8fa4e3SBjoern A. Zeeb case WMI_10X_WOW_WAKEUP_HOST_EVENTID: 6183da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_wow_wakeup_host(ar, skb); 6184da8fa4e3SBjoern A. Zeeb break; 6185da8fa4e3SBjoern A. Zeeb case WMI_10X_DCS_INTERFERENCE_EVENTID: 6186da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dcs_interference(ar, skb); 6187da8fa4e3SBjoern A. Zeeb break; 6188da8fa4e3SBjoern A. Zeeb case WMI_10X_PDEV_TPC_CONFIG_EVENTID: 6189da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_tpc_config(ar, skb); 6190da8fa4e3SBjoern A. Zeeb break; 6191da8fa4e3SBjoern A. Zeeb case WMI_10X_INST_RSSI_STATS_EVENTID: 6192da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_inst_rssi_stats(ar, skb); 6193da8fa4e3SBjoern A. Zeeb break; 6194da8fa4e3SBjoern A. Zeeb case WMI_10X_VDEV_STANDBY_REQ_EVENTID: 6195da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_standby_req(ar, skb); 6196da8fa4e3SBjoern A. Zeeb break; 6197da8fa4e3SBjoern A. Zeeb case WMI_10X_VDEV_RESUME_REQ_EVENTID: 6198da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_resume_req(ar, skb); 6199da8fa4e3SBjoern A. Zeeb break; 6200da8fa4e3SBjoern A. Zeeb case WMI_10X_SERVICE_READY_EVENTID: 6201da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_service_ready(ar, skb); 6202da8fa4e3SBjoern A. Zeeb return; 6203da8fa4e3SBjoern A. Zeeb case WMI_10X_READY_EVENTID: 6204da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_ready(ar, skb); 6205da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6206da8fa4e3SBjoern A. Zeeb break; 6207da8fa4e3SBjoern A. Zeeb case WMI_10X_PDEV_UTF_EVENTID: 6208da8fa4e3SBjoern A. Zeeb /* ignore utf events */ 6209da8fa4e3SBjoern A. Zeeb break; 6210da8fa4e3SBjoern A. Zeeb default: 6211da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "Unknown eventid: %d\n", id); 6212da8fa4e3SBjoern A. Zeeb break; 6213da8fa4e3SBjoern A. Zeeb } 6214da8fa4e3SBjoern A. Zeeb 6215da8fa4e3SBjoern A. Zeeb out: 6216da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 6217da8fa4e3SBjoern A. Zeeb } 6218da8fa4e3SBjoern A. Zeeb 6219da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb) 6220da8fa4e3SBjoern A. Zeeb { 6221da8fa4e3SBjoern A. Zeeb struct wmi_cmd_hdr *cmd_hdr; 6222da8fa4e3SBjoern A. Zeeb enum wmi_10_2_event_id id; 6223da8fa4e3SBjoern A. Zeeb bool consumed; 6224da8fa4e3SBjoern A. Zeeb 6225da8fa4e3SBjoern A. Zeeb cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 6226da8fa4e3SBjoern A. Zeeb id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 6227da8fa4e3SBjoern A. Zeeb 6228da8fa4e3SBjoern A. Zeeb if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 6229da8fa4e3SBjoern A. Zeeb goto out; 6230da8fa4e3SBjoern A. Zeeb 6231da8fa4e3SBjoern A. Zeeb trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 6232da8fa4e3SBjoern A. Zeeb 6233da8fa4e3SBjoern A. Zeeb consumed = ath10k_tm_event_wmi(ar, id, skb); 6234da8fa4e3SBjoern A. Zeeb 6235da8fa4e3SBjoern A. Zeeb /* Ready event must be handled normally also in UTF mode so that we 6236da8fa4e3SBjoern A. Zeeb * know the UTF firmware has booted, others we are just bypass WMI 6237da8fa4e3SBjoern A. Zeeb * events to testmode. 6238da8fa4e3SBjoern A. Zeeb */ 6239da8fa4e3SBjoern A. Zeeb if (consumed && id != WMI_10_2_READY_EVENTID) { 6240da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6241da8fa4e3SBjoern A. Zeeb "wmi testmode consumed 0x%x\n", id); 6242da8fa4e3SBjoern A. Zeeb goto out; 6243da8fa4e3SBjoern A. Zeeb } 6244da8fa4e3SBjoern A. Zeeb 6245da8fa4e3SBjoern A. Zeeb switch (id) { 6246da8fa4e3SBjoern A. Zeeb case WMI_10_2_MGMT_RX_EVENTID: 6247da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_mgmt_rx(ar, skb); 6248da8fa4e3SBjoern A. Zeeb /* mgmt_rx() owns the skb now! */ 6249da8fa4e3SBjoern A. Zeeb return; 6250da8fa4e3SBjoern A. Zeeb case WMI_10_2_SCAN_EVENTID: 6251da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan(ar, skb); 6252da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6253da8fa4e3SBjoern A. Zeeb break; 6254da8fa4e3SBjoern A. Zeeb case WMI_10_2_CHAN_INFO_EVENTID: 6255da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_chan_info(ar, skb); 6256da8fa4e3SBjoern A. Zeeb break; 6257da8fa4e3SBjoern A. Zeeb case WMI_10_2_ECHO_EVENTID: 6258da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_echo(ar, skb); 6259da8fa4e3SBjoern A. Zeeb break; 6260da8fa4e3SBjoern A. Zeeb case WMI_10_2_DEBUG_MESG_EVENTID: 6261da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_mesg(ar, skb); 6262da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6263da8fa4e3SBjoern A. Zeeb #if defined(CONFIG_FWLOG) 6264da8fa4e3SBjoern A. Zeeb return; 6265da8fa4e3SBjoern A. Zeeb #else 6266da8fa4e3SBjoern A. Zeeb break; 6267da8fa4e3SBjoern A. Zeeb #endif 6268da8fa4e3SBjoern A. Zeeb case WMI_10_2_UPDATE_STATS_EVENTID: 6269da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_update_stats(ar, skb); 6270da8fa4e3SBjoern A. Zeeb break; 6271da8fa4e3SBjoern A. Zeeb case WMI_10_2_VDEV_START_RESP_EVENTID: 6272da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_start_resp(ar, skb); 6273da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6274da8fa4e3SBjoern A. Zeeb break; 6275da8fa4e3SBjoern A. Zeeb case WMI_10_2_VDEV_STOPPED_EVENTID: 6276da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_stopped(ar, skb); 6277da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6278da8fa4e3SBjoern A. Zeeb break; 6279da8fa4e3SBjoern A. Zeeb case WMI_10_2_PEER_STA_KICKOUT_EVENTID: 6280da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_kickout(ar, skb); 6281da8fa4e3SBjoern A. Zeeb break; 6282da8fa4e3SBjoern A. Zeeb case WMI_10_2_HOST_SWBA_EVENTID: 6283da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_host_swba(ar, skb); 6284da8fa4e3SBjoern A. Zeeb break; 6285da8fa4e3SBjoern A. Zeeb case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID: 6286da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tbttoffset_update(ar, skb); 6287da8fa4e3SBjoern A. Zeeb break; 6288da8fa4e3SBjoern A. Zeeb case WMI_10_2_PHYERR_EVENTID: 6289da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_phyerr(ar, skb); 6290da8fa4e3SBjoern A. Zeeb break; 6291da8fa4e3SBjoern A. Zeeb case WMI_10_2_ROAM_EVENTID: 6292da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_roam(ar, skb); 6293da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6294da8fa4e3SBjoern A. Zeeb break; 6295da8fa4e3SBjoern A. Zeeb case WMI_10_2_PROFILE_MATCH: 6296da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_profile_match(ar, skb); 6297da8fa4e3SBjoern A. Zeeb break; 6298da8fa4e3SBjoern A. Zeeb case WMI_10_2_DEBUG_PRINT_EVENTID: 6299da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_print(ar, skb); 6300da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6301da8fa4e3SBjoern A. Zeeb break; 6302da8fa4e3SBjoern A. Zeeb case WMI_10_2_PDEV_QVIT_EVENTID: 6303da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_qvit(ar, skb); 6304da8fa4e3SBjoern A. Zeeb break; 6305da8fa4e3SBjoern A. Zeeb case WMI_10_2_WLAN_PROFILE_DATA_EVENTID: 6306da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_wlan_profile_data(ar, skb); 6307da8fa4e3SBjoern A. Zeeb break; 6308da8fa4e3SBjoern A. Zeeb case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID: 6309da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_rtt_measurement_report(ar, skb); 6310da8fa4e3SBjoern A. Zeeb break; 6311da8fa4e3SBjoern A. Zeeb case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID: 6312da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tsf_measurement_report(ar, skb); 6313da8fa4e3SBjoern A. Zeeb break; 6314da8fa4e3SBjoern A. Zeeb case WMI_10_2_RTT_ERROR_REPORT_EVENTID: 6315da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_rtt_error_report(ar, skb); 6316da8fa4e3SBjoern A. Zeeb break; 6317da8fa4e3SBjoern A. Zeeb case WMI_10_2_WOW_WAKEUP_HOST_EVENTID: 6318da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_wow_wakeup_host(ar, skb); 6319da8fa4e3SBjoern A. Zeeb break; 6320da8fa4e3SBjoern A. Zeeb case WMI_10_2_DCS_INTERFERENCE_EVENTID: 6321da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dcs_interference(ar, skb); 6322da8fa4e3SBjoern A. Zeeb break; 6323da8fa4e3SBjoern A. Zeeb case WMI_10_2_PDEV_TPC_CONFIG_EVENTID: 6324da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_tpc_config(ar, skb); 6325da8fa4e3SBjoern A. Zeeb break; 6326da8fa4e3SBjoern A. Zeeb case WMI_10_2_INST_RSSI_STATS_EVENTID: 6327da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_inst_rssi_stats(ar, skb); 6328da8fa4e3SBjoern A. Zeeb break; 6329da8fa4e3SBjoern A. Zeeb case WMI_10_2_VDEV_STANDBY_REQ_EVENTID: 6330da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_standby_req(ar, skb); 6331da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6332da8fa4e3SBjoern A. Zeeb break; 6333da8fa4e3SBjoern A. Zeeb case WMI_10_2_VDEV_RESUME_REQ_EVENTID: 6334da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_resume_req(ar, skb); 6335da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6336da8fa4e3SBjoern A. Zeeb break; 6337da8fa4e3SBjoern A. Zeeb case WMI_10_2_SERVICE_READY_EVENTID: 6338da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_service_ready(ar, skb); 6339da8fa4e3SBjoern A. Zeeb return; 6340da8fa4e3SBjoern A. Zeeb case WMI_10_2_READY_EVENTID: 6341da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_ready(ar, skb); 6342da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6343da8fa4e3SBjoern A. Zeeb break; 6344da8fa4e3SBjoern A. Zeeb case WMI_10_2_PDEV_TEMPERATURE_EVENTID: 6345da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_temperature(ar, skb); 6346da8fa4e3SBjoern A. Zeeb break; 6347da8fa4e3SBjoern A. Zeeb case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID: 6348da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_bss_chan_info(ar, skb); 6349da8fa4e3SBjoern A. Zeeb break; 6350da8fa4e3SBjoern A. Zeeb case WMI_10_2_RTT_KEEPALIVE_EVENTID: 6351da8fa4e3SBjoern A. Zeeb case WMI_10_2_GPIO_INPUT_EVENTID: 6352da8fa4e3SBjoern A. Zeeb case WMI_10_2_PEER_RATECODE_LIST_EVENTID: 6353da8fa4e3SBjoern A. Zeeb case WMI_10_2_GENERIC_BUFFER_EVENTID: 6354da8fa4e3SBjoern A. Zeeb case WMI_10_2_MCAST_BUF_RELEASE_EVENTID: 6355da8fa4e3SBjoern A. Zeeb case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID: 6356da8fa4e3SBjoern A. Zeeb case WMI_10_2_WDS_PEER_EVENTID: 6357da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6358da8fa4e3SBjoern A. Zeeb "received event id %d not implemented\n", id); 6359da8fa4e3SBjoern A. Zeeb break; 6360da8fa4e3SBjoern A. Zeeb case WMI_10_2_PEER_STA_PS_STATECHG_EVENTID: 6361da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb); 6362da8fa4e3SBjoern A. Zeeb break; 6363da8fa4e3SBjoern A. Zeeb default: 6364da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "Unknown eventid: %d\n", id); 6365da8fa4e3SBjoern A. Zeeb break; 6366da8fa4e3SBjoern A. Zeeb } 6367da8fa4e3SBjoern A. Zeeb 6368da8fa4e3SBjoern A. Zeeb out: 6369da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 6370da8fa4e3SBjoern A. Zeeb } 6371da8fa4e3SBjoern A. Zeeb 6372da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb) 6373da8fa4e3SBjoern A. Zeeb { 6374da8fa4e3SBjoern A. Zeeb struct wmi_cmd_hdr *cmd_hdr; 6375da8fa4e3SBjoern A. Zeeb enum wmi_10_4_event_id id; 6376da8fa4e3SBjoern A. Zeeb bool consumed; 6377da8fa4e3SBjoern A. Zeeb 6378da8fa4e3SBjoern A. Zeeb cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 6379da8fa4e3SBjoern A. Zeeb id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 6380da8fa4e3SBjoern A. Zeeb 6381da8fa4e3SBjoern A. Zeeb if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr))) 6382da8fa4e3SBjoern A. Zeeb goto out; 6383da8fa4e3SBjoern A. Zeeb 6384da8fa4e3SBjoern A. Zeeb trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 6385da8fa4e3SBjoern A. Zeeb 6386da8fa4e3SBjoern A. Zeeb consumed = ath10k_tm_event_wmi(ar, id, skb); 6387da8fa4e3SBjoern A. Zeeb 6388da8fa4e3SBjoern A. Zeeb /* Ready event must be handled normally also in UTF mode so that we 6389da8fa4e3SBjoern A. Zeeb * know the UTF firmware has booted, others we are just bypass WMI 6390da8fa4e3SBjoern A. Zeeb * events to testmode. 6391da8fa4e3SBjoern A. Zeeb */ 6392da8fa4e3SBjoern A. Zeeb if (consumed && id != WMI_10_4_READY_EVENTID) { 6393da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6394da8fa4e3SBjoern A. Zeeb "wmi testmode consumed 0x%x\n", id); 6395da8fa4e3SBjoern A. Zeeb goto out; 6396da8fa4e3SBjoern A. Zeeb } 6397da8fa4e3SBjoern A. Zeeb 6398da8fa4e3SBjoern A. Zeeb switch (id) { 6399da8fa4e3SBjoern A. Zeeb case WMI_10_4_MGMT_RX_EVENTID: 6400da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_mgmt_rx(ar, skb); 6401da8fa4e3SBjoern A. Zeeb /* mgmt_rx() owns the skb now! */ 6402da8fa4e3SBjoern A. Zeeb return; 6403da8fa4e3SBjoern A. Zeeb case WMI_10_4_ECHO_EVENTID: 6404da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_echo(ar, skb); 6405da8fa4e3SBjoern A. Zeeb break; 6406da8fa4e3SBjoern A. Zeeb case WMI_10_4_DEBUG_MESG_EVENTID: 6407da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_mesg(ar, skb); 6408da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6409da8fa4e3SBjoern A. Zeeb #if defined(CONFIG_FWLOG) 6410da8fa4e3SBjoern A. Zeeb return; 6411da8fa4e3SBjoern A. Zeeb #else 6412da8fa4e3SBjoern A. Zeeb break; 6413da8fa4e3SBjoern A. Zeeb #endif 6414da8fa4e3SBjoern A. Zeeb case WMI_10_4_SERVICE_READY_EVENTID: 6415da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_service_ready(ar, skb); 6416da8fa4e3SBjoern A. Zeeb return; 6417da8fa4e3SBjoern A. Zeeb case WMI_10_4_SCAN_EVENTID: 6418da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_scan(ar, skb); 6419da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6420da8fa4e3SBjoern A. Zeeb break; 6421da8fa4e3SBjoern A. Zeeb case WMI_10_4_CHAN_INFO_EVENTID: 6422da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_chan_info(ar, skb); 6423da8fa4e3SBjoern A. Zeeb break; 6424da8fa4e3SBjoern A. Zeeb case WMI_10_4_PHYERR_EVENTID: 6425da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_phyerr(ar, skb); 6426da8fa4e3SBjoern A. Zeeb break; 6427da8fa4e3SBjoern A. Zeeb case WMI_10_4_READY_EVENTID: 6428da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_ready(ar, skb); 6429da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6430da8fa4e3SBjoern A. Zeeb break; 6431da8fa4e3SBjoern A. Zeeb case WMI_10_4_PEER_STA_KICKOUT_EVENTID: 6432da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_kickout(ar, skb); 6433da8fa4e3SBjoern A. Zeeb break; 6434da8fa4e3SBjoern A. Zeeb case WMI_10_4_ROAM_EVENTID: 6435da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_roam(ar, skb); 6436da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6437da8fa4e3SBjoern A. Zeeb break; 6438da8fa4e3SBjoern A. Zeeb case WMI_10_4_HOST_SWBA_EVENTID: 6439da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_host_swba(ar, skb); 6440da8fa4e3SBjoern A. Zeeb break; 6441da8fa4e3SBjoern A. Zeeb case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID: 6442da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tbttoffset_update(ar, skb); 6443da8fa4e3SBjoern A. Zeeb break; 6444da8fa4e3SBjoern A. Zeeb case WMI_10_4_DEBUG_PRINT_EVENTID: 6445da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_debug_print(ar, skb); 6446da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6447da8fa4e3SBjoern A. Zeeb break; 6448da8fa4e3SBjoern A. Zeeb case WMI_10_4_VDEV_START_RESP_EVENTID: 6449da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_start_resp(ar, skb); 6450da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6451da8fa4e3SBjoern A. Zeeb break; 6452da8fa4e3SBjoern A. Zeeb case WMI_10_4_VDEV_STOPPED_EVENTID: 6453da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_vdev_stopped(ar, skb); 6454da8fa4e3SBjoern A. Zeeb ath10k_wmi_queue_set_coverage_class_work(ar); 6455da8fa4e3SBjoern A. Zeeb break; 6456da8fa4e3SBjoern A. Zeeb case WMI_10_4_WOW_WAKEUP_HOST_EVENTID: 6457da8fa4e3SBjoern A. Zeeb case WMI_10_4_PEER_RATECODE_LIST_EVENTID: 6458da8fa4e3SBjoern A. Zeeb case WMI_10_4_WDS_PEER_EVENTID: 6459da8fa4e3SBjoern A. Zeeb case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID: 6460da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6461da8fa4e3SBjoern A. Zeeb "received event id %d not implemented\n", id); 6462da8fa4e3SBjoern A. Zeeb break; 6463da8fa4e3SBjoern A. Zeeb case WMI_10_4_UPDATE_STATS_EVENTID: 6464da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_update_stats(ar, skb); 6465da8fa4e3SBjoern A. Zeeb break; 6466da8fa4e3SBjoern A. Zeeb case WMI_10_4_PDEV_TEMPERATURE_EVENTID: 6467da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_temperature(ar, skb); 6468da8fa4e3SBjoern A. Zeeb break; 6469da8fa4e3SBjoern A. Zeeb case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID: 6470da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_bss_chan_info(ar, skb); 6471da8fa4e3SBjoern A. Zeeb break; 6472da8fa4e3SBjoern A. Zeeb case WMI_10_4_PDEV_TPC_CONFIG_EVENTID: 6473da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_pdev_tpc_config(ar, skb); 6474da8fa4e3SBjoern A. Zeeb break; 6475da8fa4e3SBjoern A. Zeeb case WMI_10_4_TDLS_PEER_EVENTID: 6476da8fa4e3SBjoern A. Zeeb ath10k_wmi_handle_tdls_peer_event(ar, skb); 6477da8fa4e3SBjoern A. Zeeb break; 6478da8fa4e3SBjoern A. Zeeb case WMI_10_4_PDEV_TPC_TABLE_EVENTID: 6479da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_tpc_final_table(ar, skb); 6480da8fa4e3SBjoern A. Zeeb break; 6481da8fa4e3SBjoern A. Zeeb case WMI_10_4_DFS_STATUS_CHECK_EVENTID: 6482da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_dfs_status_check(ar, skb); 6483da8fa4e3SBjoern A. Zeeb break; 6484da8fa4e3SBjoern A. Zeeb case WMI_10_4_PEER_STA_PS_STATECHG_EVENTID: 6485da8fa4e3SBjoern A. Zeeb ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb); 6486da8fa4e3SBjoern A. Zeeb break; 6487da8fa4e3SBjoern A. Zeeb default: 6488da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "Unknown eventid: %d\n", id); 6489da8fa4e3SBjoern A. Zeeb break; 6490da8fa4e3SBjoern A. Zeeb } 6491da8fa4e3SBjoern A. Zeeb 6492da8fa4e3SBjoern A. Zeeb out: 6493da8fa4e3SBjoern A. Zeeb dev_kfree_skb(skb); 6494da8fa4e3SBjoern A. Zeeb } 6495da8fa4e3SBjoern A. Zeeb 6496da8fa4e3SBjoern A. Zeeb static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb) 6497da8fa4e3SBjoern A. Zeeb { 6498da8fa4e3SBjoern A. Zeeb int ret; 6499da8fa4e3SBjoern A. Zeeb 6500da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_rx(ar, skb); 6501da8fa4e3SBjoern A. Zeeb if (ret) 6502da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to process wmi rx: %d\n", ret); 6503da8fa4e3SBjoern A. Zeeb } 6504da8fa4e3SBjoern A. Zeeb 6505da8fa4e3SBjoern A. Zeeb int ath10k_wmi_connect(struct ath10k *ar) 6506da8fa4e3SBjoern A. Zeeb { 6507da8fa4e3SBjoern A. Zeeb int status; 6508da8fa4e3SBjoern A. Zeeb struct ath10k_htc_svc_conn_req conn_req; 6509da8fa4e3SBjoern A. Zeeb struct ath10k_htc_svc_conn_resp conn_resp; 6510da8fa4e3SBjoern A. Zeeb 6511da8fa4e3SBjoern A. Zeeb memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map)); 6512da8fa4e3SBjoern A. Zeeb 6513da8fa4e3SBjoern A. Zeeb memset(&conn_req, 0, sizeof(conn_req)); 6514da8fa4e3SBjoern A. Zeeb memset(&conn_resp, 0, sizeof(conn_resp)); 6515da8fa4e3SBjoern A. Zeeb 6516da8fa4e3SBjoern A. Zeeb /* these fields are the same for all service endpoints */ 6517da8fa4e3SBjoern A. Zeeb conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete; 6518da8fa4e3SBjoern A. Zeeb conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx; 6519da8fa4e3SBjoern A. Zeeb conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits; 6520da8fa4e3SBjoern A. Zeeb 6521da8fa4e3SBjoern A. Zeeb /* connect to control service */ 6522da8fa4e3SBjoern A. Zeeb conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL; 6523da8fa4e3SBjoern A. Zeeb 6524da8fa4e3SBjoern A. Zeeb status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp); 6525da8fa4e3SBjoern A. Zeeb if (status) { 6526da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n", 6527da8fa4e3SBjoern A. Zeeb status); 6528da8fa4e3SBjoern A. Zeeb return status; 6529da8fa4e3SBjoern A. Zeeb } 6530da8fa4e3SBjoern A. Zeeb 6531da8fa4e3SBjoern A. Zeeb ar->wmi.eid = conn_resp.eid; 6532da8fa4e3SBjoern A. Zeeb return 0; 6533da8fa4e3SBjoern A. Zeeb } 6534da8fa4e3SBjoern A. Zeeb 6535da8fa4e3SBjoern A. Zeeb static struct sk_buff * 6536da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_set_base_macaddr(struct ath10k *ar, 6537da8fa4e3SBjoern A. Zeeb const u8 macaddr[ETH_ALEN]) 6538da8fa4e3SBjoern A. Zeeb { 6539da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_base_macaddr_cmd *cmd; 6540da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 6541da8fa4e3SBjoern A. Zeeb 6542da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 6543da8fa4e3SBjoern A. Zeeb if (!skb) 6544da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6545da8fa4e3SBjoern A. Zeeb 6546da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_base_macaddr_cmd *)skb->data; 6547da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->mac_addr.addr, macaddr); 6548da8fa4e3SBjoern A. Zeeb 6549da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6550da8fa4e3SBjoern A. Zeeb "wmi pdev basemac %pM\n", macaddr); 6551da8fa4e3SBjoern A. Zeeb return skb; 6552da8fa4e3SBjoern A. Zeeb } 6553da8fa4e3SBjoern A. Zeeb 6554da8fa4e3SBjoern A. Zeeb static struct sk_buff * 6555da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g, 6556da8fa4e3SBjoern A. Zeeb u16 ctl2g, u16 ctl5g, 6557da8fa4e3SBjoern A. Zeeb enum wmi_dfs_region dfs_reg) 6558da8fa4e3SBjoern A. Zeeb { 6559da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_regdomain_cmd *cmd; 6560da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 6561da8fa4e3SBjoern A. Zeeb 6562da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 6563da8fa4e3SBjoern A. Zeeb if (!skb) 6564da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6565da8fa4e3SBjoern A. Zeeb 6566da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data; 6567da8fa4e3SBjoern A. Zeeb cmd->reg_domain = __cpu_to_le32(rd); 6568da8fa4e3SBjoern A. Zeeb cmd->reg_domain_2G = __cpu_to_le32(rd2g); 6569da8fa4e3SBjoern A. Zeeb cmd->reg_domain_5G = __cpu_to_le32(rd5g); 6570da8fa4e3SBjoern A. Zeeb cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g); 6571da8fa4e3SBjoern A. Zeeb cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g); 6572da8fa4e3SBjoern A. Zeeb 6573da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6574da8fa4e3SBjoern A. Zeeb "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n", 6575da8fa4e3SBjoern A. Zeeb rd, rd2g, rd5g, ctl2g, ctl5g); 6576da8fa4e3SBjoern A. Zeeb return skb; 6577da8fa4e3SBjoern A. Zeeb } 6578da8fa4e3SBjoern A. Zeeb 6579da8fa4e3SBjoern A. Zeeb static struct sk_buff * 6580da8fa4e3SBjoern A. Zeeb ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 6581da8fa4e3SBjoern A. Zeeb rd5g, u16 ctl2g, u16 ctl5g, 6582da8fa4e3SBjoern A. Zeeb enum wmi_dfs_region dfs_reg) 6583da8fa4e3SBjoern A. Zeeb { 6584da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_regdomain_cmd_10x *cmd; 6585da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 6586da8fa4e3SBjoern A. Zeeb 6587da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 6588da8fa4e3SBjoern A. Zeeb if (!skb) 6589da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6590da8fa4e3SBjoern A. Zeeb 6591da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data; 6592da8fa4e3SBjoern A. Zeeb cmd->reg_domain = __cpu_to_le32(rd); 6593da8fa4e3SBjoern A. Zeeb cmd->reg_domain_2G = __cpu_to_le32(rd2g); 6594da8fa4e3SBjoern A. Zeeb cmd->reg_domain_5G = __cpu_to_le32(rd5g); 6595da8fa4e3SBjoern A. Zeeb cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g); 6596da8fa4e3SBjoern A. Zeeb cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g); 6597da8fa4e3SBjoern A. Zeeb cmd->dfs_domain = __cpu_to_le32(dfs_reg); 6598da8fa4e3SBjoern A. Zeeb 6599da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6600da8fa4e3SBjoern A. Zeeb "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n", 6601da8fa4e3SBjoern A. Zeeb rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg); 6602da8fa4e3SBjoern A. Zeeb return skb; 6603da8fa4e3SBjoern A. Zeeb } 6604da8fa4e3SBjoern A. Zeeb 6605da8fa4e3SBjoern A. Zeeb static struct sk_buff * 6606da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt) 6607da8fa4e3SBjoern A. Zeeb { 6608da8fa4e3SBjoern A. Zeeb struct wmi_pdev_suspend_cmd *cmd; 6609da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 6610da8fa4e3SBjoern A. Zeeb 6611da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 6612da8fa4e3SBjoern A. Zeeb if (!skb) 6613da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6614da8fa4e3SBjoern A. Zeeb 6615da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_suspend_cmd *)skb->data; 6616da8fa4e3SBjoern A. Zeeb cmd->suspend_opt = __cpu_to_le32(suspend_opt); 6617da8fa4e3SBjoern A. Zeeb 6618da8fa4e3SBjoern A. Zeeb return skb; 6619da8fa4e3SBjoern A. Zeeb } 6620da8fa4e3SBjoern A. Zeeb 6621da8fa4e3SBjoern A. Zeeb static struct sk_buff * 6622da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar) 6623da8fa4e3SBjoern A. Zeeb { 6624da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 6625da8fa4e3SBjoern A. Zeeb 6626da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, 0); 6627da8fa4e3SBjoern A. Zeeb if (!skb) 6628da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6629da8fa4e3SBjoern A. Zeeb 6630da8fa4e3SBjoern A. Zeeb return skb; 6631da8fa4e3SBjoern A. Zeeb } 6632da8fa4e3SBjoern A. Zeeb 6633da8fa4e3SBjoern A. Zeeb static struct sk_buff * 6634da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value) 6635da8fa4e3SBjoern A. Zeeb { 6636da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_param_cmd *cmd; 6637da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 6638da8fa4e3SBjoern A. Zeeb 6639da8fa4e3SBjoern A. Zeeb if (id == WMI_PDEV_PARAM_UNSUPPORTED) { 6640da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "pdev param %d not supported by firmware\n", 6641da8fa4e3SBjoern A. Zeeb id); 6642da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EOPNOTSUPP); 6643da8fa4e3SBjoern A. Zeeb } 6644da8fa4e3SBjoern A. Zeeb 6645da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 6646da8fa4e3SBjoern A. Zeeb if (!skb) 6647da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6648da8fa4e3SBjoern A. Zeeb 6649da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_param_cmd *)skb->data; 6650da8fa4e3SBjoern A. Zeeb cmd->param_id = __cpu_to_le32(id); 6651da8fa4e3SBjoern A. Zeeb cmd->param_value = __cpu_to_le32(value); 6652da8fa4e3SBjoern A. Zeeb 6653da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n", 6654da8fa4e3SBjoern A. Zeeb id, value); 6655da8fa4e3SBjoern A. Zeeb return skb; 6656da8fa4e3SBjoern A. Zeeb } 6657da8fa4e3SBjoern A. Zeeb 6658da8fa4e3SBjoern A. Zeeb void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar, 6659da8fa4e3SBjoern A. Zeeb struct wmi_host_mem_chunks *chunks) 6660da8fa4e3SBjoern A. Zeeb { 6661da8fa4e3SBjoern A. Zeeb struct host_memory_chunk *chunk; 6662da8fa4e3SBjoern A. Zeeb int i; 6663da8fa4e3SBjoern A. Zeeb 6664da8fa4e3SBjoern A. Zeeb chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks); 6665da8fa4e3SBjoern A. Zeeb 6666da8fa4e3SBjoern A. Zeeb for (i = 0; i < ar->wmi.num_mem_chunks; i++) { 6667da8fa4e3SBjoern A. Zeeb chunk = &chunks->items[i]; 6668da8fa4e3SBjoern A. Zeeb chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr); 6669da8fa4e3SBjoern A. Zeeb chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len); 6670da8fa4e3SBjoern A. Zeeb chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id); 6671da8fa4e3SBjoern A. Zeeb 6672da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 6673da8fa4e3SBjoern A. Zeeb "wmi chunk %d len %d requested, addr 0x%llx\n", 6674da8fa4e3SBjoern A. Zeeb i, 6675da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[i].len, 6676da8fa4e3SBjoern A. Zeeb (unsigned long long)ar->wmi.mem_chunks[i].paddr); 6677da8fa4e3SBjoern A. Zeeb } 6678da8fa4e3SBjoern A. Zeeb } 6679da8fa4e3SBjoern A. Zeeb 6680da8fa4e3SBjoern A. Zeeb static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar) 6681da8fa4e3SBjoern A. Zeeb { 6682da8fa4e3SBjoern A. Zeeb struct wmi_init_cmd *cmd; 6683da8fa4e3SBjoern A. Zeeb struct sk_buff *buf; 6684da8fa4e3SBjoern A. Zeeb struct wmi_resource_config config = {}; 6685da8fa4e3SBjoern A. Zeeb u32 val; 6686da8fa4e3SBjoern A. Zeeb 6687da8fa4e3SBjoern A. Zeeb config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS); 6688da8fa4e3SBjoern A. Zeeb config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS); 6689da8fa4e3SBjoern A. Zeeb config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS); 6690da8fa4e3SBjoern A. Zeeb 6691da8fa4e3SBjoern A. Zeeb config.num_offload_reorder_bufs = 6692da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS); 6693da8fa4e3SBjoern A. Zeeb 6694da8fa4e3SBjoern A. Zeeb config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS); 6695da8fa4e3SBjoern A. Zeeb config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS); 6696da8fa4e3SBjoern A. Zeeb config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT); 6697da8fa4e3SBjoern A. Zeeb config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK); 6698da8fa4e3SBjoern A. Zeeb config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK); 6699da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 6700da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 6701da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 6702da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI); 6703da8fa4e3SBjoern A. Zeeb config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 6704da8fa4e3SBjoern A. Zeeb config.scan_max_pending_reqs = 6705da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS); 6706da8fa4e3SBjoern A. Zeeb 6707da8fa4e3SBjoern A. Zeeb config.bmiss_offload_max_vdev = 6708da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV); 6709da8fa4e3SBjoern A. Zeeb 6710da8fa4e3SBjoern A. Zeeb config.roam_offload_max_vdev = 6711da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV); 6712da8fa4e3SBjoern A. Zeeb 6713da8fa4e3SBjoern A. Zeeb config.roam_offload_max_ap_profiles = 6714da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES); 6715da8fa4e3SBjoern A. Zeeb 6716da8fa4e3SBjoern A. Zeeb config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS); 6717da8fa4e3SBjoern A. Zeeb config.num_mcast_table_elems = 6718da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS); 6719da8fa4e3SBjoern A. Zeeb 6720da8fa4e3SBjoern A. Zeeb config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE); 6721da8fa4e3SBjoern A. Zeeb config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE); 6722da8fa4e3SBjoern A. Zeeb config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES); 6723da8fa4e3SBjoern A. Zeeb config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE); 6724da8fa4e3SBjoern A. Zeeb config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM); 6725da8fa4e3SBjoern A. Zeeb 6726da8fa4e3SBjoern A. Zeeb val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 6727da8fa4e3SBjoern A. Zeeb config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 6728da8fa4e3SBjoern A. Zeeb 6729da8fa4e3SBjoern A. Zeeb config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG); 6730da8fa4e3SBjoern A. Zeeb 6731da8fa4e3SBjoern A. Zeeb config.gtk_offload_max_vdev = 6732da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV); 6733da8fa4e3SBjoern A. Zeeb 6734da8fa4e3SBjoern A. Zeeb config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC); 6735da8fa4e3SBjoern A. Zeeb config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES); 6736da8fa4e3SBjoern A. Zeeb 6737da8fa4e3SBjoern A. Zeeb buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items, 6738da8fa4e3SBjoern A. Zeeb ar->wmi.num_mem_chunks)); 6739da8fa4e3SBjoern A. Zeeb if (!buf) 6740da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6741da8fa4e3SBjoern A. Zeeb 6742da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_init_cmd *)buf->data; 6743da8fa4e3SBjoern A. Zeeb 6744da8fa4e3SBjoern A. Zeeb memcpy(&cmd->resource_config, &config, sizeof(config)); 6745da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 6746da8fa4e3SBjoern A. Zeeb 6747da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n"); 6748da8fa4e3SBjoern A. Zeeb return buf; 6749da8fa4e3SBjoern A. Zeeb } 6750da8fa4e3SBjoern A. Zeeb 6751da8fa4e3SBjoern A. Zeeb static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar) 6752da8fa4e3SBjoern A. Zeeb { 6753da8fa4e3SBjoern A. Zeeb struct wmi_init_cmd_10x *cmd; 6754da8fa4e3SBjoern A. Zeeb struct sk_buff *buf; 6755da8fa4e3SBjoern A. Zeeb struct wmi_resource_config_10x config = {}; 6756da8fa4e3SBjoern A. Zeeb u32 val; 6757da8fa4e3SBjoern A. Zeeb 6758da8fa4e3SBjoern A. Zeeb config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); 6759da8fa4e3SBjoern A. Zeeb config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); 6760da8fa4e3SBjoern A. Zeeb config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); 6761da8fa4e3SBjoern A. Zeeb config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); 6762da8fa4e3SBjoern A. Zeeb config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); 6763da8fa4e3SBjoern A. Zeeb config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); 6764da8fa4e3SBjoern A. Zeeb config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); 6765da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6766da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6767da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6768da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); 6769da8fa4e3SBjoern A. Zeeb config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 6770da8fa4e3SBjoern A. Zeeb config.scan_max_pending_reqs = 6771da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); 6772da8fa4e3SBjoern A. Zeeb 6773da8fa4e3SBjoern A. Zeeb config.bmiss_offload_max_vdev = 6774da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); 6775da8fa4e3SBjoern A. Zeeb 6776da8fa4e3SBjoern A. Zeeb config.roam_offload_max_vdev = 6777da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); 6778da8fa4e3SBjoern A. Zeeb 6779da8fa4e3SBjoern A. Zeeb config.roam_offload_max_ap_profiles = 6780da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); 6781da8fa4e3SBjoern A. Zeeb 6782da8fa4e3SBjoern A. Zeeb config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); 6783da8fa4e3SBjoern A. Zeeb config.num_mcast_table_elems = 6784da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); 6785da8fa4e3SBjoern A. Zeeb 6786da8fa4e3SBjoern A. Zeeb config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); 6787da8fa4e3SBjoern A. Zeeb config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); 6788da8fa4e3SBjoern A. Zeeb config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); 6789da8fa4e3SBjoern A. Zeeb config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE); 6790da8fa4e3SBjoern A. Zeeb config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); 6791da8fa4e3SBjoern A. Zeeb 6792da8fa4e3SBjoern A. Zeeb val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 6793da8fa4e3SBjoern A. Zeeb config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 6794da8fa4e3SBjoern A. Zeeb 6795da8fa4e3SBjoern A. Zeeb config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); 6796da8fa4e3SBjoern A. Zeeb 6797da8fa4e3SBjoern A. Zeeb config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); 6798da8fa4e3SBjoern A. Zeeb config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); 6799da8fa4e3SBjoern A. Zeeb 6800da8fa4e3SBjoern A. Zeeb buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items, 6801da8fa4e3SBjoern A. Zeeb ar->wmi.num_mem_chunks)); 6802da8fa4e3SBjoern A. Zeeb if (!buf) 6803da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6804da8fa4e3SBjoern A. Zeeb 6805da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_init_cmd_10x *)buf->data; 6806da8fa4e3SBjoern A. Zeeb 6807da8fa4e3SBjoern A. Zeeb memcpy(&cmd->resource_config, &config, sizeof(config)); 6808da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 6809da8fa4e3SBjoern A. Zeeb 6810da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n"); 6811da8fa4e3SBjoern A. Zeeb return buf; 6812da8fa4e3SBjoern A. Zeeb } 6813da8fa4e3SBjoern A. Zeeb 6814da8fa4e3SBjoern A. Zeeb static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar) 6815da8fa4e3SBjoern A. Zeeb { 6816da8fa4e3SBjoern A. Zeeb struct wmi_init_cmd_10_2 *cmd; 6817da8fa4e3SBjoern A. Zeeb struct sk_buff *buf; 6818da8fa4e3SBjoern A. Zeeb struct wmi_resource_config_10x config = {}; 6819da8fa4e3SBjoern A. Zeeb u32 val, features; 6820da8fa4e3SBjoern A. Zeeb 6821da8fa4e3SBjoern A. Zeeb config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); 6822da8fa4e3SBjoern A. Zeeb config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); 6823da8fa4e3SBjoern A. Zeeb 6824da8fa4e3SBjoern A. Zeeb if (ath10k_peer_stats_enabled(ar)) { 6825da8fa4e3SBjoern A. Zeeb config.num_peers = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_PEERS); 6826da8fa4e3SBjoern A. Zeeb config.num_tids = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_TIDS); 6827da8fa4e3SBjoern A. Zeeb } else { 6828da8fa4e3SBjoern A. Zeeb config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); 6829da8fa4e3SBjoern A. Zeeb config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); 6830da8fa4e3SBjoern A. Zeeb } 6831da8fa4e3SBjoern A. Zeeb 6832da8fa4e3SBjoern A. Zeeb config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); 6833da8fa4e3SBjoern A. Zeeb config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); 6834da8fa4e3SBjoern A. Zeeb config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); 6835da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6836da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6837da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6838da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); 6839da8fa4e3SBjoern A. Zeeb config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 6840da8fa4e3SBjoern A. Zeeb 6841da8fa4e3SBjoern A. Zeeb config.scan_max_pending_reqs = 6842da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); 6843da8fa4e3SBjoern A. Zeeb 6844da8fa4e3SBjoern A. Zeeb config.bmiss_offload_max_vdev = 6845da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); 6846da8fa4e3SBjoern A. Zeeb 6847da8fa4e3SBjoern A. Zeeb config.roam_offload_max_vdev = 6848da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); 6849da8fa4e3SBjoern A. Zeeb 6850da8fa4e3SBjoern A. Zeeb config.roam_offload_max_ap_profiles = 6851da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); 6852da8fa4e3SBjoern A. Zeeb 6853da8fa4e3SBjoern A. Zeeb config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); 6854da8fa4e3SBjoern A. Zeeb config.num_mcast_table_elems = 6855da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); 6856da8fa4e3SBjoern A. Zeeb 6857da8fa4e3SBjoern A. Zeeb config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); 6858da8fa4e3SBjoern A. Zeeb config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); 6859da8fa4e3SBjoern A. Zeeb config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); 6860da8fa4e3SBjoern A. Zeeb config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE); 6861da8fa4e3SBjoern A. Zeeb config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); 6862da8fa4e3SBjoern A. Zeeb 6863da8fa4e3SBjoern A. Zeeb val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 6864da8fa4e3SBjoern A. Zeeb config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 6865da8fa4e3SBjoern A. Zeeb 6866da8fa4e3SBjoern A. Zeeb config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); 6867da8fa4e3SBjoern A. Zeeb 6868da8fa4e3SBjoern A. Zeeb config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); 6869da8fa4e3SBjoern A. Zeeb config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); 6870da8fa4e3SBjoern A. Zeeb 6871da8fa4e3SBjoern A. Zeeb buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items, 6872da8fa4e3SBjoern A. Zeeb ar->wmi.num_mem_chunks)); 6873da8fa4e3SBjoern A. Zeeb if (!buf) 6874da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6875da8fa4e3SBjoern A. Zeeb 6876da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_init_cmd_10_2 *)buf->data; 6877da8fa4e3SBjoern A. Zeeb 6878da8fa4e3SBjoern A. Zeeb features = WMI_10_2_RX_BATCH_MODE; 6879da8fa4e3SBjoern A. Zeeb 6880da8fa4e3SBjoern A. Zeeb if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) && 6881da8fa4e3SBjoern A. Zeeb test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map)) 6882da8fa4e3SBjoern A. Zeeb features |= WMI_10_2_COEX_GPIO; 6883da8fa4e3SBjoern A. Zeeb 6884da8fa4e3SBjoern A. Zeeb if (ath10k_peer_stats_enabled(ar)) 6885da8fa4e3SBjoern A. Zeeb features |= WMI_10_2_PEER_STATS; 6886da8fa4e3SBjoern A. Zeeb 6887da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map)) 6888da8fa4e3SBjoern A. Zeeb features |= WMI_10_2_BSS_CHAN_INFO; 6889da8fa4e3SBjoern A. Zeeb 6890da8fa4e3SBjoern A. Zeeb cmd->resource_config.feature_mask = __cpu_to_le32(features); 6891da8fa4e3SBjoern A. Zeeb 6892da8fa4e3SBjoern A. Zeeb memcpy(&cmd->resource_config.common, &config, sizeof(config)); 6893da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 6894da8fa4e3SBjoern A. Zeeb 6895da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n"); 6896da8fa4e3SBjoern A. Zeeb return buf; 6897da8fa4e3SBjoern A. Zeeb } 6898da8fa4e3SBjoern A. Zeeb 6899da8fa4e3SBjoern A. Zeeb static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar) 6900da8fa4e3SBjoern A. Zeeb { 6901da8fa4e3SBjoern A. Zeeb struct wmi_init_cmd_10_4 *cmd; 6902da8fa4e3SBjoern A. Zeeb struct sk_buff *buf; 6903da8fa4e3SBjoern A. Zeeb struct wmi_resource_config_10_4 config = {}; 6904da8fa4e3SBjoern A. Zeeb 6905da8fa4e3SBjoern A. Zeeb config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs); 6906da8fa4e3SBjoern A. Zeeb config.num_peers = __cpu_to_le32(ar->max_num_peers); 6907da8fa4e3SBjoern A. Zeeb config.num_active_peers = __cpu_to_le32(ar->num_active_peers); 6908da8fa4e3SBjoern A. Zeeb config.num_tids = __cpu_to_le32(ar->num_tids); 6909da8fa4e3SBjoern A. Zeeb 6910da8fa4e3SBjoern A. Zeeb config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS); 6911da8fa4e3SBjoern A. Zeeb config.num_offload_reorder_buffs = 6912da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS); 6913da8fa4e3SBjoern A. Zeeb config.num_peer_keys = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS); 6914da8fa4e3SBjoern A. Zeeb config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT); 6915da8fa4e3SBjoern A. Zeeb config.tx_chain_mask = __cpu_to_le32(ar->hw_params.tx_chain_mask); 6916da8fa4e3SBjoern A. Zeeb config.rx_chain_mask = __cpu_to_le32(ar->hw_params.rx_chain_mask); 6917da8fa4e3SBjoern A. Zeeb 6918da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI); 6919da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI); 6920da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI); 6921da8fa4e3SBjoern A. Zeeb config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI); 6922da8fa4e3SBjoern A. Zeeb 6923da8fa4e3SBjoern A. Zeeb config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 6924da8fa4e3SBjoern A. Zeeb config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS); 6925da8fa4e3SBjoern A. Zeeb config.bmiss_offload_max_vdev = 6926da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV); 6927da8fa4e3SBjoern A. Zeeb config.roam_offload_max_vdev = 6928da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV); 6929da8fa4e3SBjoern A. Zeeb config.roam_offload_max_ap_profiles = 6930da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES); 6931da8fa4e3SBjoern A. Zeeb config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS); 6932da8fa4e3SBjoern A. Zeeb config.num_mcast_table_elems = 6933da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS); 6934da8fa4e3SBjoern A. Zeeb 6935da8fa4e3SBjoern A. Zeeb config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE); 6936da8fa4e3SBjoern A. Zeeb config.tx_dbg_log_size = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE); 6937da8fa4e3SBjoern A. Zeeb config.num_wds_entries = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES); 6938da8fa4e3SBjoern A. Zeeb config.dma_burst_size = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE); 6939da8fa4e3SBjoern A. Zeeb config.mac_aggr_delim = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM); 6940da8fa4e3SBjoern A. Zeeb 6941da8fa4e3SBjoern A. Zeeb config.rx_skip_defrag_timeout_dup_detection_check = 6942da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK); 6943da8fa4e3SBjoern A. Zeeb 6944da8fa4e3SBjoern A. Zeeb config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG); 6945da8fa4e3SBjoern A. Zeeb config.gtk_offload_max_vdev = 6946da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV); 6947da8fa4e3SBjoern A. Zeeb config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx); 6948da8fa4e3SBjoern A. Zeeb config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS); 6949da8fa4e3SBjoern A. Zeeb config.max_peer_ext_stats = 6950da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS); 6951da8fa4e3SBjoern A. Zeeb config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP); 6952da8fa4e3SBjoern A. Zeeb 6953da8fa4e3SBjoern A. Zeeb config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE); 6954da8fa4e3SBjoern A. Zeeb config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE); 6955da8fa4e3SBjoern A. Zeeb config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE); 6956da8fa4e3SBjoern A. Zeeb config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE); 6957da8fa4e3SBjoern A. Zeeb 6958da8fa4e3SBjoern A. Zeeb config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE); 6959da8fa4e3SBjoern A. Zeeb config.tt_support = 6960da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG); 6961da8fa4e3SBjoern A. Zeeb config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG); 6962da8fa4e3SBjoern A. Zeeb config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG); 6963da8fa4e3SBjoern A. Zeeb config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG); 6964da8fa4e3SBjoern A. Zeeb 6965da8fa4e3SBjoern A. Zeeb buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items, 6966da8fa4e3SBjoern A. Zeeb ar->wmi.num_mem_chunks)); 6967da8fa4e3SBjoern A. Zeeb if (!buf) 6968da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 6969da8fa4e3SBjoern A. Zeeb 6970da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_init_cmd_10_4 *)buf->data; 6971da8fa4e3SBjoern A. Zeeb memcpy(&cmd->resource_config, &config, sizeof(config)); 6972da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 6973da8fa4e3SBjoern A. Zeeb 6974da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n"); 6975da8fa4e3SBjoern A. Zeeb return buf; 6976da8fa4e3SBjoern A. Zeeb } 6977da8fa4e3SBjoern A. Zeeb 6978da8fa4e3SBjoern A. Zeeb int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg) 6979da8fa4e3SBjoern A. Zeeb { 6980da8fa4e3SBjoern A. Zeeb if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN) 6981da8fa4e3SBjoern A. Zeeb return -EINVAL; 6982da8fa4e3SBjoern A. Zeeb if (arg->n_channels > ARRAY_SIZE(arg->channels)) 6983da8fa4e3SBjoern A. Zeeb return -EINVAL; 6984da8fa4e3SBjoern A. Zeeb if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID) 6985da8fa4e3SBjoern A. Zeeb return -EINVAL; 6986da8fa4e3SBjoern A. Zeeb if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID) 6987da8fa4e3SBjoern A. Zeeb return -EINVAL; 6988da8fa4e3SBjoern A. Zeeb 6989da8fa4e3SBjoern A. Zeeb return 0; 6990da8fa4e3SBjoern A. Zeeb } 6991da8fa4e3SBjoern A. Zeeb 6992da8fa4e3SBjoern A. Zeeb static size_t 6993da8fa4e3SBjoern A. Zeeb ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg) 6994da8fa4e3SBjoern A. Zeeb { 6995da8fa4e3SBjoern A. Zeeb int len = 0; 6996da8fa4e3SBjoern A. Zeeb 6997da8fa4e3SBjoern A. Zeeb if (arg->ie_len) { 6998da8fa4e3SBjoern A. Zeeb len += sizeof(struct wmi_ie_data); 6999da8fa4e3SBjoern A. Zeeb len += roundup(arg->ie_len, 4); 7000da8fa4e3SBjoern A. Zeeb } 7001da8fa4e3SBjoern A. Zeeb 7002da8fa4e3SBjoern A. Zeeb if (arg->n_channels) { 7003da8fa4e3SBjoern A. Zeeb len += sizeof(struct wmi_chan_list); 7004da8fa4e3SBjoern A. Zeeb len += sizeof(__le32) * arg->n_channels; 7005da8fa4e3SBjoern A. Zeeb } 7006da8fa4e3SBjoern A. Zeeb 7007da8fa4e3SBjoern A. Zeeb if (arg->n_ssids) { 7008da8fa4e3SBjoern A. Zeeb len += sizeof(struct wmi_ssid_list); 7009da8fa4e3SBjoern A. Zeeb len += sizeof(struct wmi_ssid) * arg->n_ssids; 7010da8fa4e3SBjoern A. Zeeb } 7011da8fa4e3SBjoern A. Zeeb 7012da8fa4e3SBjoern A. Zeeb if (arg->n_bssids) { 7013da8fa4e3SBjoern A. Zeeb len += sizeof(struct wmi_bssid_list); 7014da8fa4e3SBjoern A. Zeeb len += sizeof(struct wmi_mac_addr) * arg->n_bssids; 7015da8fa4e3SBjoern A. Zeeb } 7016da8fa4e3SBjoern A. Zeeb 7017da8fa4e3SBjoern A. Zeeb return len; 7018da8fa4e3SBjoern A. Zeeb } 7019da8fa4e3SBjoern A. Zeeb 7020da8fa4e3SBjoern A. Zeeb void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn, 7021da8fa4e3SBjoern A. Zeeb const struct wmi_start_scan_arg *arg) 7022da8fa4e3SBjoern A. Zeeb { 7023da8fa4e3SBjoern A. Zeeb u32 scan_id; 7024da8fa4e3SBjoern A. Zeeb u32 scan_req_id; 7025da8fa4e3SBjoern A. Zeeb 7026da8fa4e3SBjoern A. Zeeb scan_id = WMI_HOST_SCAN_REQ_ID_PREFIX; 7027da8fa4e3SBjoern A. Zeeb scan_id |= arg->scan_id; 7028da8fa4e3SBjoern A. Zeeb 7029da8fa4e3SBjoern A. Zeeb scan_req_id = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX; 7030da8fa4e3SBjoern A. Zeeb scan_req_id |= arg->scan_req_id; 7031da8fa4e3SBjoern A. Zeeb 7032da8fa4e3SBjoern A. Zeeb cmn->scan_id = __cpu_to_le32(scan_id); 7033da8fa4e3SBjoern A. Zeeb cmn->scan_req_id = __cpu_to_le32(scan_req_id); 7034da8fa4e3SBjoern A. Zeeb cmn->vdev_id = __cpu_to_le32(arg->vdev_id); 7035da8fa4e3SBjoern A. Zeeb cmn->scan_priority = __cpu_to_le32(arg->scan_priority); 7036da8fa4e3SBjoern A. Zeeb cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events); 7037da8fa4e3SBjoern A. Zeeb cmn->dwell_time_active = __cpu_to_le32(arg->dwell_time_active); 7038da8fa4e3SBjoern A. Zeeb cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive); 7039da8fa4e3SBjoern A. Zeeb cmn->min_rest_time = __cpu_to_le32(arg->min_rest_time); 7040da8fa4e3SBjoern A. Zeeb cmn->max_rest_time = __cpu_to_le32(arg->max_rest_time); 7041da8fa4e3SBjoern A. Zeeb cmn->repeat_probe_time = __cpu_to_le32(arg->repeat_probe_time); 7042da8fa4e3SBjoern A. Zeeb cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time); 7043da8fa4e3SBjoern A. Zeeb cmn->idle_time = __cpu_to_le32(arg->idle_time); 7044da8fa4e3SBjoern A. Zeeb cmn->max_scan_time = __cpu_to_le32(arg->max_scan_time); 7045da8fa4e3SBjoern A. Zeeb cmn->probe_delay = __cpu_to_le32(arg->probe_delay); 7046da8fa4e3SBjoern A. Zeeb cmn->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags); 7047da8fa4e3SBjoern A. Zeeb } 7048da8fa4e3SBjoern A. Zeeb 7049da8fa4e3SBjoern A. Zeeb static void 7050da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs, 7051da8fa4e3SBjoern A. Zeeb const struct wmi_start_scan_arg *arg) 7052da8fa4e3SBjoern A. Zeeb { 7053da8fa4e3SBjoern A. Zeeb struct wmi_ie_data *ie; 7054da8fa4e3SBjoern A. Zeeb struct wmi_chan_list *channels; 7055da8fa4e3SBjoern A. Zeeb struct wmi_ssid_list *ssids; 7056da8fa4e3SBjoern A. Zeeb struct wmi_bssid_list *bssids; 7057da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7058da8fa4e3SBjoern A. Zeeb void *ptr = tlvs->tlvs; 7059da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7060da8fa4e3SBjoern A. Zeeb u8 *ptr = (void *)tlvs->tlvs; 7061da8fa4e3SBjoern A. Zeeb #endif 7062da8fa4e3SBjoern A. Zeeb int i; 7063da8fa4e3SBjoern A. Zeeb 7064da8fa4e3SBjoern A. Zeeb if (arg->n_channels) { 7065da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7066da8fa4e3SBjoern A. Zeeb channels = ptr; 7067da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7068da8fa4e3SBjoern A. Zeeb channels = (void *)ptr; 7069da8fa4e3SBjoern A. Zeeb #endif 7070da8fa4e3SBjoern A. Zeeb channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG); 7071da8fa4e3SBjoern A. Zeeb channels->num_chan = __cpu_to_le32(arg->n_channels); 7072da8fa4e3SBjoern A. Zeeb 7073da8fa4e3SBjoern A. Zeeb for (i = 0; i < arg->n_channels; i++) 7074da8fa4e3SBjoern A. Zeeb channels->channel_list[i].freq = 7075da8fa4e3SBjoern A. Zeeb __cpu_to_le16(arg->channels[i]); 7076da8fa4e3SBjoern A. Zeeb 7077da8fa4e3SBjoern A. Zeeb ptr += sizeof(*channels); 7078da8fa4e3SBjoern A. Zeeb ptr += sizeof(__le32) * arg->n_channels; 7079da8fa4e3SBjoern A. Zeeb } 7080da8fa4e3SBjoern A. Zeeb 7081da8fa4e3SBjoern A. Zeeb if (arg->n_ssids) { 7082da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7083da8fa4e3SBjoern A. Zeeb ssids = ptr; 7084da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7085da8fa4e3SBjoern A. Zeeb ssids = (void *)ptr; 7086da8fa4e3SBjoern A. Zeeb #endif 7087da8fa4e3SBjoern A. Zeeb ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG); 7088da8fa4e3SBjoern A. Zeeb ssids->num_ssids = __cpu_to_le32(arg->n_ssids); 7089da8fa4e3SBjoern A. Zeeb 7090da8fa4e3SBjoern A. Zeeb for (i = 0; i < arg->n_ssids; i++) { 7091da8fa4e3SBjoern A. Zeeb ssids->ssids[i].ssid_len = 7092da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->ssids[i].len); 7093da8fa4e3SBjoern A. Zeeb memcpy(&ssids->ssids[i].ssid, 7094da8fa4e3SBjoern A. Zeeb arg->ssids[i].ssid, 7095da8fa4e3SBjoern A. Zeeb arg->ssids[i].len); 7096da8fa4e3SBjoern A. Zeeb } 7097da8fa4e3SBjoern A. Zeeb 7098da8fa4e3SBjoern A. Zeeb ptr += sizeof(*ssids); 7099da8fa4e3SBjoern A. Zeeb ptr += sizeof(struct wmi_ssid) * arg->n_ssids; 7100da8fa4e3SBjoern A. Zeeb } 7101da8fa4e3SBjoern A. Zeeb 7102da8fa4e3SBjoern A. Zeeb if (arg->n_bssids) { 7103da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7104da8fa4e3SBjoern A. Zeeb bssids = ptr; 7105da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7106da8fa4e3SBjoern A. Zeeb bssids = (void *)ptr; 7107da8fa4e3SBjoern A. Zeeb #endif 7108da8fa4e3SBjoern A. Zeeb bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG); 7109da8fa4e3SBjoern A. Zeeb bssids->num_bssid = __cpu_to_le32(arg->n_bssids); 7110da8fa4e3SBjoern A. Zeeb 7111da8fa4e3SBjoern A. Zeeb for (i = 0; i < arg->n_bssids; i++) 7112da8fa4e3SBjoern A. Zeeb ether_addr_copy(bssids->bssid_list[i].addr, 7113da8fa4e3SBjoern A. Zeeb arg->bssids[i].bssid); 7114da8fa4e3SBjoern A. Zeeb 7115da8fa4e3SBjoern A. Zeeb ptr += sizeof(*bssids); 7116da8fa4e3SBjoern A. Zeeb ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids; 7117da8fa4e3SBjoern A. Zeeb } 7118da8fa4e3SBjoern A. Zeeb 7119da8fa4e3SBjoern A. Zeeb if (arg->ie_len) { 7120da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7121da8fa4e3SBjoern A. Zeeb ie = ptr; 7122da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7123da8fa4e3SBjoern A. Zeeb ie = (void *)ptr; 7124da8fa4e3SBjoern A. Zeeb #endif 7125da8fa4e3SBjoern A. Zeeb ie->tag = __cpu_to_le32(WMI_IE_TAG); 7126da8fa4e3SBjoern A. Zeeb ie->ie_len = __cpu_to_le32(arg->ie_len); 7127da8fa4e3SBjoern A. Zeeb memcpy(ie->ie_data, arg->ie, arg->ie_len); 7128da8fa4e3SBjoern A. Zeeb 7129da8fa4e3SBjoern A. Zeeb ptr += sizeof(*ie); 7130da8fa4e3SBjoern A. Zeeb ptr += roundup(arg->ie_len, 4); 7131da8fa4e3SBjoern A. Zeeb } 7132da8fa4e3SBjoern A. Zeeb } 7133da8fa4e3SBjoern A. Zeeb 7134da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7135da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_start_scan(struct ath10k *ar, 7136da8fa4e3SBjoern A. Zeeb const struct wmi_start_scan_arg *arg) 7137da8fa4e3SBjoern A. Zeeb { 7138da8fa4e3SBjoern A. Zeeb struct wmi_start_scan_cmd *cmd; 7139da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7140da8fa4e3SBjoern A. Zeeb size_t len; 7141da8fa4e3SBjoern A. Zeeb int ret; 7142da8fa4e3SBjoern A. Zeeb 7143da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_start_scan_verify(arg); 7144da8fa4e3SBjoern A. Zeeb if (ret) 7145da8fa4e3SBjoern A. Zeeb return ERR_PTR(ret); 7146da8fa4e3SBjoern A. Zeeb 7147da8fa4e3SBjoern A. Zeeb len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg); 7148da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 7149da8fa4e3SBjoern A. Zeeb if (!skb) 7150da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7151da8fa4e3SBjoern A. Zeeb 7152da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_start_scan_cmd *)skb->data; 7153da8fa4e3SBjoern A. Zeeb 7154da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_start_scan_common(&cmd->common, arg); 7155da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg); 7156da8fa4e3SBjoern A. Zeeb 7157da8fa4e3SBjoern A. Zeeb cmd->burst_duration_ms = __cpu_to_le32(0); 7158da8fa4e3SBjoern A. Zeeb 7159da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n"); 7160da8fa4e3SBjoern A. Zeeb return skb; 7161da8fa4e3SBjoern A. Zeeb } 7162da8fa4e3SBjoern A. Zeeb 7163da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7164da8fa4e3SBjoern A. Zeeb ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar, 7165da8fa4e3SBjoern A. Zeeb const struct wmi_start_scan_arg *arg) 7166da8fa4e3SBjoern A. Zeeb { 7167da8fa4e3SBjoern A. Zeeb struct wmi_10x_start_scan_cmd *cmd; 7168da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7169da8fa4e3SBjoern A. Zeeb size_t len; 7170da8fa4e3SBjoern A. Zeeb int ret; 7171da8fa4e3SBjoern A. Zeeb 7172da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_start_scan_verify(arg); 7173da8fa4e3SBjoern A. Zeeb if (ret) 7174da8fa4e3SBjoern A. Zeeb return ERR_PTR(ret); 7175da8fa4e3SBjoern A. Zeeb 7176da8fa4e3SBjoern A. Zeeb len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg); 7177da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 7178da8fa4e3SBjoern A. Zeeb if (!skb) 7179da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7180da8fa4e3SBjoern A. Zeeb 7181da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_10x_start_scan_cmd *)skb->data; 7182da8fa4e3SBjoern A. Zeeb 7183da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_start_scan_common(&cmd->common, arg); 7184da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg); 7185da8fa4e3SBjoern A. Zeeb 7186da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n"); 7187da8fa4e3SBjoern A. Zeeb return skb; 7188da8fa4e3SBjoern A. Zeeb } 7189da8fa4e3SBjoern A. Zeeb 7190da8fa4e3SBjoern A. Zeeb void ath10k_wmi_start_scan_init(struct ath10k *ar, 7191da8fa4e3SBjoern A. Zeeb struct wmi_start_scan_arg *arg) 7192da8fa4e3SBjoern A. Zeeb { 7193da8fa4e3SBjoern A. Zeeb /* setup commonly used values */ 7194da8fa4e3SBjoern A. Zeeb arg->scan_req_id = 1; 7195da8fa4e3SBjoern A. Zeeb arg->scan_priority = WMI_SCAN_PRIORITY_LOW; 7196da8fa4e3SBjoern A. Zeeb arg->dwell_time_active = 50; 7197da8fa4e3SBjoern A. Zeeb arg->dwell_time_passive = 150; 7198da8fa4e3SBjoern A. Zeeb arg->min_rest_time = 50; 7199da8fa4e3SBjoern A. Zeeb arg->max_rest_time = 500; 7200da8fa4e3SBjoern A. Zeeb arg->repeat_probe_time = 0; 7201da8fa4e3SBjoern A. Zeeb arg->probe_spacing_time = 0; 7202da8fa4e3SBjoern A. Zeeb arg->idle_time = 0; 7203da8fa4e3SBjoern A. Zeeb arg->max_scan_time = 20000; 7204da8fa4e3SBjoern A. Zeeb arg->probe_delay = 5; 7205da8fa4e3SBjoern A. Zeeb arg->notify_scan_events = WMI_SCAN_EVENT_STARTED 7206da8fa4e3SBjoern A. Zeeb | WMI_SCAN_EVENT_COMPLETED 7207da8fa4e3SBjoern A. Zeeb | WMI_SCAN_EVENT_BSS_CHANNEL 7208da8fa4e3SBjoern A. Zeeb | WMI_SCAN_EVENT_FOREIGN_CHANNEL 7209da8fa4e3SBjoern A. Zeeb | WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT 7210da8fa4e3SBjoern A. Zeeb | WMI_SCAN_EVENT_DEQUEUED; 7211da8fa4e3SBjoern A. Zeeb arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT; 7212da8fa4e3SBjoern A. Zeeb arg->n_bssids = 1; 7213da8fa4e3SBjoern A. Zeeb arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF"; 7214da8fa4e3SBjoern A. Zeeb } 7215da8fa4e3SBjoern A. Zeeb 7216da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7217da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_stop_scan(struct ath10k *ar, 7218da8fa4e3SBjoern A. Zeeb const struct wmi_stop_scan_arg *arg) 7219da8fa4e3SBjoern A. Zeeb { 7220da8fa4e3SBjoern A. Zeeb struct wmi_stop_scan_cmd *cmd; 7221da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7222da8fa4e3SBjoern A. Zeeb u32 scan_id; 7223da8fa4e3SBjoern A. Zeeb u32 req_id; 7224da8fa4e3SBjoern A. Zeeb 7225da8fa4e3SBjoern A. Zeeb if (arg->req_id > 0xFFF) 7226da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7227da8fa4e3SBjoern A. Zeeb if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF) 7228da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7229da8fa4e3SBjoern A. Zeeb 7230da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7231da8fa4e3SBjoern A. Zeeb if (!skb) 7232da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7233da8fa4e3SBjoern A. Zeeb 7234da8fa4e3SBjoern A. Zeeb scan_id = arg->u.scan_id; 7235da8fa4e3SBjoern A. Zeeb scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX; 7236da8fa4e3SBjoern A. Zeeb 7237da8fa4e3SBjoern A. Zeeb req_id = arg->req_id; 7238da8fa4e3SBjoern A. Zeeb req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX; 7239da8fa4e3SBjoern A. Zeeb 7240da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_stop_scan_cmd *)skb->data; 7241da8fa4e3SBjoern A. Zeeb cmd->req_type = __cpu_to_le32(arg->req_type); 7242da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(arg->u.vdev_id); 7243da8fa4e3SBjoern A. Zeeb cmd->scan_id = __cpu_to_le32(scan_id); 7244da8fa4e3SBjoern A. Zeeb cmd->scan_req_id = __cpu_to_le32(req_id); 7245da8fa4e3SBjoern A. Zeeb 7246da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7247da8fa4e3SBjoern A. Zeeb "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n", 7248da8fa4e3SBjoern A. Zeeb arg->req_id, arg->req_type, arg->u.scan_id); 7249da8fa4e3SBjoern A. Zeeb return skb; 7250da8fa4e3SBjoern A. Zeeb } 7251da8fa4e3SBjoern A. Zeeb 7252da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7253da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id, 7254da8fa4e3SBjoern A. Zeeb enum wmi_vdev_type type, 7255da8fa4e3SBjoern A. Zeeb enum wmi_vdev_subtype subtype, 7256da8fa4e3SBjoern A. Zeeb const u8 macaddr[ETH_ALEN]) 7257da8fa4e3SBjoern A. Zeeb { 7258da8fa4e3SBjoern A. Zeeb struct wmi_vdev_create_cmd *cmd; 7259da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7260da8fa4e3SBjoern A. Zeeb 7261da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7262da8fa4e3SBjoern A. Zeeb if (!skb) 7263da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7264da8fa4e3SBjoern A. Zeeb 7265da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_create_cmd *)skb->data; 7266da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7267da8fa4e3SBjoern A. Zeeb cmd->vdev_type = __cpu_to_le32(type); 7268da8fa4e3SBjoern A. Zeeb cmd->vdev_subtype = __cpu_to_le32(subtype); 7269da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->vdev_macaddr.addr, macaddr); 7270da8fa4e3SBjoern A. Zeeb 7271da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7272da8fa4e3SBjoern A. Zeeb "WMI vdev create: id %d type %d subtype %d macaddr %pM\n", 7273da8fa4e3SBjoern A. Zeeb vdev_id, type, subtype, macaddr); 7274da8fa4e3SBjoern A. Zeeb return skb; 7275da8fa4e3SBjoern A. Zeeb } 7276da8fa4e3SBjoern A. Zeeb 7277da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7278da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id) 7279da8fa4e3SBjoern A. Zeeb { 7280da8fa4e3SBjoern A. Zeeb struct wmi_vdev_delete_cmd *cmd; 7281da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7282da8fa4e3SBjoern A. Zeeb 7283da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7284da8fa4e3SBjoern A. Zeeb if (!skb) 7285da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7286da8fa4e3SBjoern A. Zeeb 7287da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_delete_cmd *)skb->data; 7288da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7289da8fa4e3SBjoern A. Zeeb 7290da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7291da8fa4e3SBjoern A. Zeeb "WMI vdev delete id %d\n", vdev_id); 7292da8fa4e3SBjoern A. Zeeb return skb; 7293da8fa4e3SBjoern A. Zeeb } 7294da8fa4e3SBjoern A. Zeeb 7295da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7296da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_start(struct ath10k *ar, 7297da8fa4e3SBjoern A. Zeeb const struct wmi_vdev_start_request_arg *arg, 7298da8fa4e3SBjoern A. Zeeb bool restart) 7299da8fa4e3SBjoern A. Zeeb { 7300da8fa4e3SBjoern A. Zeeb struct wmi_vdev_start_request_cmd *cmd; 7301da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7302da8fa4e3SBjoern A. Zeeb const char *cmdname; 7303da8fa4e3SBjoern A. Zeeb u32 flags = 0; 7304da8fa4e3SBjoern A. Zeeb 7305da8fa4e3SBjoern A. Zeeb if (WARN_ON(arg->hidden_ssid && !arg->ssid)) 7306da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7307da8fa4e3SBjoern A. Zeeb if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid))) 7308da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7309da8fa4e3SBjoern A. Zeeb 7310da8fa4e3SBjoern A. Zeeb if (restart) 7311da8fa4e3SBjoern A. Zeeb cmdname = "restart"; 7312da8fa4e3SBjoern A. Zeeb else 7313da8fa4e3SBjoern A. Zeeb cmdname = "start"; 7314da8fa4e3SBjoern A. Zeeb 7315da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7316da8fa4e3SBjoern A. Zeeb if (!skb) 7317da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7318da8fa4e3SBjoern A. Zeeb 7319da8fa4e3SBjoern A. Zeeb if (arg->hidden_ssid) 7320da8fa4e3SBjoern A. Zeeb flags |= WMI_VDEV_START_HIDDEN_SSID; 7321da8fa4e3SBjoern A. Zeeb if (arg->pmf_enabled) 7322da8fa4e3SBjoern A. Zeeb flags |= WMI_VDEV_START_PMF_ENABLED; 7323da8fa4e3SBjoern A. Zeeb 7324da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_start_request_cmd *)skb->data; 7325da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 7326da8fa4e3SBjoern A. Zeeb cmd->disable_hw_ack = __cpu_to_le32(arg->disable_hw_ack); 7327da8fa4e3SBjoern A. Zeeb cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval); 7328da8fa4e3SBjoern A. Zeeb cmd->dtim_period = __cpu_to_le32(arg->dtim_period); 7329da8fa4e3SBjoern A. Zeeb cmd->flags = __cpu_to_le32(flags); 7330da8fa4e3SBjoern A. Zeeb cmd->bcn_tx_rate = __cpu_to_le32(arg->bcn_tx_rate); 7331da8fa4e3SBjoern A. Zeeb cmd->bcn_tx_power = __cpu_to_le32(arg->bcn_tx_power); 7332da8fa4e3SBjoern A. Zeeb 7333da8fa4e3SBjoern A. Zeeb if (arg->ssid) { 7334da8fa4e3SBjoern A. Zeeb cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len); 7335da8fa4e3SBjoern A. Zeeb memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len); 7336da8fa4e3SBjoern A. Zeeb } 7337da8fa4e3SBjoern A. Zeeb 7338da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_wmi_channel(ar, &cmd->chan, &arg->channel); 7339da8fa4e3SBjoern A. Zeeb 7340da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7341da8fa4e3SBjoern A. Zeeb "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n", 7342da8fa4e3SBjoern A. Zeeb cmdname, arg->vdev_id, 7343da8fa4e3SBjoern A. Zeeb flags, arg->channel.freq, arg->channel.mode, 7344da8fa4e3SBjoern A. Zeeb cmd->chan.flags, arg->channel.max_power); 7345da8fa4e3SBjoern A. Zeeb 7346da8fa4e3SBjoern A. Zeeb return skb; 7347da8fa4e3SBjoern A. Zeeb } 7348da8fa4e3SBjoern A. Zeeb 7349da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7350da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id) 7351da8fa4e3SBjoern A. Zeeb { 7352da8fa4e3SBjoern A. Zeeb struct wmi_vdev_stop_cmd *cmd; 7353da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7354da8fa4e3SBjoern A. Zeeb 7355da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7356da8fa4e3SBjoern A. Zeeb if (!skb) 7357da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7358da8fa4e3SBjoern A. Zeeb 7359da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_stop_cmd *)skb->data; 7360da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7361da8fa4e3SBjoern A. Zeeb 7362da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id); 7363da8fa4e3SBjoern A. Zeeb return skb; 7364da8fa4e3SBjoern A. Zeeb } 7365da8fa4e3SBjoern A. Zeeb 7366da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7367da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, 7368da8fa4e3SBjoern A. Zeeb const u8 *bssid) 7369da8fa4e3SBjoern A. Zeeb { 7370da8fa4e3SBjoern A. Zeeb struct wmi_vdev_up_cmd *cmd; 7371da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7372da8fa4e3SBjoern A. Zeeb 7373da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7374da8fa4e3SBjoern A. Zeeb if (!skb) 7375da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7376da8fa4e3SBjoern A. Zeeb 7377da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_up_cmd *)skb->data; 7378da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7379da8fa4e3SBjoern A. Zeeb cmd->vdev_assoc_id = __cpu_to_le32(aid); 7380da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->vdev_bssid.addr, bssid); 7381da8fa4e3SBjoern A. Zeeb 7382da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7383da8fa4e3SBjoern A. Zeeb "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n", 7384da8fa4e3SBjoern A. Zeeb vdev_id, aid, bssid); 7385da8fa4e3SBjoern A. Zeeb return skb; 7386da8fa4e3SBjoern A. Zeeb } 7387da8fa4e3SBjoern A. Zeeb 7388da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7389da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id) 7390da8fa4e3SBjoern A. Zeeb { 7391da8fa4e3SBjoern A. Zeeb struct wmi_vdev_down_cmd *cmd; 7392da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7393da8fa4e3SBjoern A. Zeeb 7394da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7395da8fa4e3SBjoern A. Zeeb if (!skb) 7396da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7397da8fa4e3SBjoern A. Zeeb 7398da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_down_cmd *)skb->data; 7399da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7400da8fa4e3SBjoern A. Zeeb 7401da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7402da8fa4e3SBjoern A. Zeeb "wmi mgmt vdev down id 0x%x\n", vdev_id); 7403da8fa4e3SBjoern A. Zeeb return skb; 7404da8fa4e3SBjoern A. Zeeb } 7405da8fa4e3SBjoern A. Zeeb 7406da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7407da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id, 7408da8fa4e3SBjoern A. Zeeb u32 param_id, u32 param_value) 7409da8fa4e3SBjoern A. Zeeb { 7410da8fa4e3SBjoern A. Zeeb struct wmi_vdev_set_param_cmd *cmd; 7411da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7412da8fa4e3SBjoern A. Zeeb 7413da8fa4e3SBjoern A. Zeeb if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) { 7414da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7415da8fa4e3SBjoern A. Zeeb "vdev param %d not supported by firmware\n", 7416da8fa4e3SBjoern A. Zeeb param_id); 7417da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EOPNOTSUPP); 7418da8fa4e3SBjoern A. Zeeb } 7419da8fa4e3SBjoern A. Zeeb 7420da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7421da8fa4e3SBjoern A. Zeeb if (!skb) 7422da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7423da8fa4e3SBjoern A. Zeeb 7424da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_set_param_cmd *)skb->data; 7425da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7426da8fa4e3SBjoern A. Zeeb cmd->param_id = __cpu_to_le32(param_id); 7427da8fa4e3SBjoern A. Zeeb cmd->param_value = __cpu_to_le32(param_value); 7428da8fa4e3SBjoern A. Zeeb 7429da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7430da8fa4e3SBjoern A. Zeeb "wmi vdev id 0x%x set param %d value %d\n", 7431da8fa4e3SBjoern A. Zeeb vdev_id, param_id, param_value); 7432da8fa4e3SBjoern A. Zeeb return skb; 7433da8fa4e3SBjoern A. Zeeb } 7434da8fa4e3SBjoern A. Zeeb 7435da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7436da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar, 7437da8fa4e3SBjoern A. Zeeb const struct wmi_vdev_install_key_arg *arg) 7438da8fa4e3SBjoern A. Zeeb { 7439da8fa4e3SBjoern A. Zeeb struct wmi_vdev_install_key_cmd *cmd; 7440da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7441da8fa4e3SBjoern A. Zeeb 7442da8fa4e3SBjoern A. Zeeb if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL) 7443da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7444da8fa4e3SBjoern A. Zeeb if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL) 7445da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7446da8fa4e3SBjoern A. Zeeb 7447da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len); 7448da8fa4e3SBjoern A. Zeeb if (!skb) 7449da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7450da8fa4e3SBjoern A. Zeeb 7451da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_install_key_cmd *)skb->data; 7452da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 7453da8fa4e3SBjoern A. Zeeb cmd->key_idx = __cpu_to_le32(arg->key_idx); 7454da8fa4e3SBjoern A. Zeeb cmd->key_flags = __cpu_to_le32(arg->key_flags); 7455da8fa4e3SBjoern A. Zeeb cmd->key_cipher = __cpu_to_le32(arg->key_cipher); 7456da8fa4e3SBjoern A. Zeeb cmd->key_len = __cpu_to_le32(arg->key_len); 7457da8fa4e3SBjoern A. Zeeb cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len); 7458da8fa4e3SBjoern A. Zeeb cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len); 7459da8fa4e3SBjoern A. Zeeb 7460da8fa4e3SBjoern A. Zeeb if (arg->macaddr) 7461da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr); 7462da8fa4e3SBjoern A. Zeeb if (arg->key_data) 7463da8fa4e3SBjoern A. Zeeb memcpy(cmd->key_data, arg->key_data, arg->key_len); 7464da8fa4e3SBjoern A. Zeeb 7465da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7466da8fa4e3SBjoern A. Zeeb "wmi vdev install key idx %d cipher %d len %d\n", 7467da8fa4e3SBjoern A. Zeeb arg->key_idx, arg->key_cipher, arg->key_len); 7468da8fa4e3SBjoern A. Zeeb return skb; 7469da8fa4e3SBjoern A. Zeeb } 7470da8fa4e3SBjoern A. Zeeb 7471da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7472da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar, 7473da8fa4e3SBjoern A. Zeeb const struct wmi_vdev_spectral_conf_arg *arg) 7474da8fa4e3SBjoern A. Zeeb { 7475da8fa4e3SBjoern A. Zeeb struct wmi_vdev_spectral_conf_cmd *cmd; 7476da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7477da8fa4e3SBjoern A. Zeeb 7478da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7479da8fa4e3SBjoern A. Zeeb if (!skb) 7480da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7481da8fa4e3SBjoern A. Zeeb 7482da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data; 7483da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 7484da8fa4e3SBjoern A. Zeeb cmd->scan_count = __cpu_to_le32(arg->scan_count); 7485da8fa4e3SBjoern A. Zeeb cmd->scan_period = __cpu_to_le32(arg->scan_period); 7486da8fa4e3SBjoern A. Zeeb cmd->scan_priority = __cpu_to_le32(arg->scan_priority); 7487da8fa4e3SBjoern A. Zeeb cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size); 7488da8fa4e3SBjoern A. Zeeb cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena); 7489da8fa4e3SBjoern A. Zeeb cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena); 7490da8fa4e3SBjoern A. Zeeb cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref); 7491da8fa4e3SBjoern A. Zeeb cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay); 7492da8fa4e3SBjoern A. Zeeb cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr); 7493da8fa4e3SBjoern A. Zeeb cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr); 7494da8fa4e3SBjoern A. Zeeb cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode); 7495da8fa4e3SBjoern A. Zeeb cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode); 7496da8fa4e3SBjoern A. Zeeb cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr); 7497da8fa4e3SBjoern A. Zeeb cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format); 7498da8fa4e3SBjoern A. Zeeb cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode); 7499da8fa4e3SBjoern A. Zeeb cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale); 7500da8fa4e3SBjoern A. Zeeb cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj); 7501da8fa4e3SBjoern A. Zeeb cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask); 7502da8fa4e3SBjoern A. Zeeb 7503da8fa4e3SBjoern A. Zeeb return skb; 7504da8fa4e3SBjoern A. Zeeb } 7505da8fa4e3SBjoern A. Zeeb 7506da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7507da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, 7508da8fa4e3SBjoern A. Zeeb u32 trigger, u32 enable) 7509da8fa4e3SBjoern A. Zeeb { 7510da8fa4e3SBjoern A. Zeeb struct wmi_vdev_spectral_enable_cmd *cmd; 7511da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7512da8fa4e3SBjoern A. Zeeb 7513da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7514da8fa4e3SBjoern A. Zeeb if (!skb) 7515da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7516da8fa4e3SBjoern A. Zeeb 7517da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data; 7518da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7519da8fa4e3SBjoern A. Zeeb cmd->trigger_cmd = __cpu_to_le32(trigger); 7520da8fa4e3SBjoern A. Zeeb cmd->enable_cmd = __cpu_to_le32(enable); 7521da8fa4e3SBjoern A. Zeeb 7522da8fa4e3SBjoern A. Zeeb return skb; 7523da8fa4e3SBjoern A. Zeeb } 7524da8fa4e3SBjoern A. Zeeb 7525da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7526da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id, 7527da8fa4e3SBjoern A. Zeeb const u8 peer_addr[ETH_ALEN], 7528da8fa4e3SBjoern A. Zeeb enum wmi_peer_type peer_type) 7529da8fa4e3SBjoern A. Zeeb { 7530da8fa4e3SBjoern A. Zeeb struct wmi_peer_create_cmd *cmd; 7531da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7532da8fa4e3SBjoern A. Zeeb 7533da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7534da8fa4e3SBjoern A. Zeeb if (!skb) 7535da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7536da8fa4e3SBjoern A. Zeeb 7537da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_peer_create_cmd *)skb->data; 7538da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7539da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 7540da8fa4e3SBjoern A. Zeeb cmd->peer_type = __cpu_to_le32(peer_type); 7541da8fa4e3SBjoern A. Zeeb 7542da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7543da8fa4e3SBjoern A. Zeeb "wmi peer create vdev_id %d peer_addr %pM\n", 7544da8fa4e3SBjoern A. Zeeb vdev_id, peer_addr); 7545da8fa4e3SBjoern A. Zeeb return skb; 7546da8fa4e3SBjoern A. Zeeb } 7547da8fa4e3SBjoern A. Zeeb 7548da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7549da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id, 7550da8fa4e3SBjoern A. Zeeb const u8 peer_addr[ETH_ALEN]) 7551da8fa4e3SBjoern A. Zeeb { 7552da8fa4e3SBjoern A. Zeeb struct wmi_peer_delete_cmd *cmd; 7553da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7554da8fa4e3SBjoern A. Zeeb 7555da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7556da8fa4e3SBjoern A. Zeeb if (!skb) 7557da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7558da8fa4e3SBjoern A. Zeeb 7559da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_peer_delete_cmd *)skb->data; 7560da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7561da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 7562da8fa4e3SBjoern A. Zeeb 7563da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7564da8fa4e3SBjoern A. Zeeb "wmi peer delete vdev_id %d peer_addr %pM\n", 7565da8fa4e3SBjoern A. Zeeb vdev_id, peer_addr); 7566da8fa4e3SBjoern A. Zeeb return skb; 7567da8fa4e3SBjoern A. Zeeb } 7568da8fa4e3SBjoern A. Zeeb 7569da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7570da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id, 7571da8fa4e3SBjoern A. Zeeb const u8 peer_addr[ETH_ALEN], u32 tid_bitmap) 7572da8fa4e3SBjoern A. Zeeb { 7573da8fa4e3SBjoern A. Zeeb struct wmi_peer_flush_tids_cmd *cmd; 7574da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7575da8fa4e3SBjoern A. Zeeb 7576da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7577da8fa4e3SBjoern A. Zeeb if (!skb) 7578da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7579da8fa4e3SBjoern A. Zeeb 7580da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_peer_flush_tids_cmd *)skb->data; 7581da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7582da8fa4e3SBjoern A. Zeeb cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap); 7583da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 7584da8fa4e3SBjoern A. Zeeb 7585da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7586da8fa4e3SBjoern A. Zeeb "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n", 7587da8fa4e3SBjoern A. Zeeb vdev_id, peer_addr, tid_bitmap); 7588da8fa4e3SBjoern A. Zeeb return skb; 7589da8fa4e3SBjoern A. Zeeb } 7590da8fa4e3SBjoern A. Zeeb 7591da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7592da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id, 7593da8fa4e3SBjoern A. Zeeb const u8 *peer_addr, 7594da8fa4e3SBjoern A. Zeeb enum wmi_peer_param param_id, 7595da8fa4e3SBjoern A. Zeeb u32 param_value) 7596da8fa4e3SBjoern A. Zeeb { 7597da8fa4e3SBjoern A. Zeeb struct wmi_peer_set_param_cmd *cmd; 7598da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7599da8fa4e3SBjoern A. Zeeb 7600da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7601da8fa4e3SBjoern A. Zeeb if (!skb) 7602da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7603da8fa4e3SBjoern A. Zeeb 7604da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_peer_set_param_cmd *)skb->data; 7605da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7606da8fa4e3SBjoern A. Zeeb cmd->param_id = __cpu_to_le32(param_id); 7607da8fa4e3SBjoern A. Zeeb cmd->param_value = __cpu_to_le32(param_value); 7608da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 7609da8fa4e3SBjoern A. Zeeb 7610da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7611da8fa4e3SBjoern A. Zeeb "wmi vdev %d peer 0x%pM set param %d value %d\n", 7612da8fa4e3SBjoern A. Zeeb vdev_id, peer_addr, param_id, param_value); 7613da8fa4e3SBjoern A. Zeeb return skb; 7614da8fa4e3SBjoern A. Zeeb } 7615da8fa4e3SBjoern A. Zeeb 7616da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7617da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, 7618da8fa4e3SBjoern A. Zeeb enum wmi_sta_ps_mode psmode) 7619da8fa4e3SBjoern A. Zeeb { 7620da8fa4e3SBjoern A. Zeeb struct wmi_sta_powersave_mode_cmd *cmd; 7621da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7622da8fa4e3SBjoern A. Zeeb 7623da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7624da8fa4e3SBjoern A. Zeeb if (!skb) 7625da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7626da8fa4e3SBjoern A. Zeeb 7627da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data; 7628da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7629da8fa4e3SBjoern A. Zeeb cmd->sta_ps_mode = __cpu_to_le32(psmode); 7630da8fa4e3SBjoern A. Zeeb 7631da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7632da8fa4e3SBjoern A. Zeeb "wmi set powersave id 0x%x mode %d\n", 7633da8fa4e3SBjoern A. Zeeb vdev_id, psmode); 7634da8fa4e3SBjoern A. Zeeb return skb; 7635da8fa4e3SBjoern A. Zeeb } 7636da8fa4e3SBjoern A. Zeeb 7637da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7638da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id, 7639da8fa4e3SBjoern A. Zeeb enum wmi_sta_powersave_param param_id, 7640da8fa4e3SBjoern A. Zeeb u32 value) 7641da8fa4e3SBjoern A. Zeeb { 7642da8fa4e3SBjoern A. Zeeb struct wmi_sta_powersave_param_cmd *cmd; 7643da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7644da8fa4e3SBjoern A. Zeeb 7645da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7646da8fa4e3SBjoern A. Zeeb if (!skb) 7647da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7648da8fa4e3SBjoern A. Zeeb 7649da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_sta_powersave_param_cmd *)skb->data; 7650da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7651da8fa4e3SBjoern A. Zeeb cmd->param_id = __cpu_to_le32(param_id); 7652da8fa4e3SBjoern A. Zeeb cmd->param_value = __cpu_to_le32(value); 7653da8fa4e3SBjoern A. Zeeb 7654da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_STA, 7655da8fa4e3SBjoern A. Zeeb "wmi sta ps param vdev_id 0x%x param %d value %d\n", 7656da8fa4e3SBjoern A. Zeeb vdev_id, param_id, value); 7657da8fa4e3SBjoern A. Zeeb return skb; 7658da8fa4e3SBjoern A. Zeeb } 7659da8fa4e3SBjoern A. Zeeb 7660da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7661da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac, 7662da8fa4e3SBjoern A. Zeeb enum wmi_ap_ps_peer_param param_id, u32 value) 7663da8fa4e3SBjoern A. Zeeb { 7664da8fa4e3SBjoern A. Zeeb struct wmi_ap_ps_peer_cmd *cmd; 7665da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7666da8fa4e3SBjoern A. Zeeb 7667da8fa4e3SBjoern A. Zeeb if (!mac) 7668da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7669da8fa4e3SBjoern A. Zeeb 7670da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7671da8fa4e3SBjoern A. Zeeb if (!skb) 7672da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7673da8fa4e3SBjoern A. Zeeb 7674da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_ap_ps_peer_cmd *)skb->data; 7675da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7676da8fa4e3SBjoern A. Zeeb cmd->param_id = __cpu_to_le32(param_id); 7677da8fa4e3SBjoern A. Zeeb cmd->param_value = __cpu_to_le32(value); 7678da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, mac); 7679da8fa4e3SBjoern A. Zeeb 7680da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7681da8fa4e3SBjoern A. Zeeb "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n", 7682da8fa4e3SBjoern A. Zeeb vdev_id, param_id, value, mac); 7683da8fa4e3SBjoern A. Zeeb return skb; 7684da8fa4e3SBjoern A. Zeeb } 7685da8fa4e3SBjoern A. Zeeb 7686da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7687da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar, 7688da8fa4e3SBjoern A. Zeeb const struct wmi_scan_chan_list_arg *arg) 7689da8fa4e3SBjoern A. Zeeb { 7690da8fa4e3SBjoern A. Zeeb struct wmi_scan_chan_list_cmd *cmd; 7691da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7692da8fa4e3SBjoern A. Zeeb struct wmi_channel_arg *ch; 7693da8fa4e3SBjoern A. Zeeb struct wmi_channel *ci; 7694da8fa4e3SBjoern A. Zeeb int i; 7695da8fa4e3SBjoern A. Zeeb 7696da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, struct_size(cmd, chan_info, arg->n_channels)); 7697da8fa4e3SBjoern A. Zeeb if (!skb) 7698da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 7699da8fa4e3SBjoern A. Zeeb 7700da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_scan_chan_list_cmd *)skb->data; 7701da8fa4e3SBjoern A. Zeeb cmd->num_scan_chans = __cpu_to_le32(arg->n_channels); 7702da8fa4e3SBjoern A. Zeeb 7703da8fa4e3SBjoern A. Zeeb for (i = 0; i < arg->n_channels; i++) { 7704da8fa4e3SBjoern A. Zeeb ch = &arg->channels[i]; 7705da8fa4e3SBjoern A. Zeeb ci = &cmd->chan_info[i]; 7706da8fa4e3SBjoern A. Zeeb 7707da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_wmi_channel(ar, ci, ch); 7708da8fa4e3SBjoern A. Zeeb } 7709da8fa4e3SBjoern A. Zeeb 7710da8fa4e3SBjoern A. Zeeb return skb; 7711da8fa4e3SBjoern A. Zeeb } 7712da8fa4e3SBjoern A. Zeeb 7713da8fa4e3SBjoern A. Zeeb static void 7714da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf, 7715da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7716da8fa4e3SBjoern A. Zeeb { 7717da8fa4e3SBjoern A. Zeeb struct wmi_common_peer_assoc_complete_cmd *cmd = buf; 7718da8fa4e3SBjoern A. Zeeb 7719da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 7720da8fa4e3SBjoern A. Zeeb cmd->peer_new_assoc = __cpu_to_le32(arg->peer_reassoc ? 0 : 1); 7721da8fa4e3SBjoern A. Zeeb cmd->peer_associd = __cpu_to_le32(arg->peer_aid); 7722da8fa4e3SBjoern A. Zeeb cmd->peer_flags = __cpu_to_le32(arg->peer_flags); 7723da8fa4e3SBjoern A. Zeeb cmd->peer_caps = __cpu_to_le32(arg->peer_caps); 7724da8fa4e3SBjoern A. Zeeb cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval); 7725da8fa4e3SBjoern A. Zeeb cmd->peer_ht_caps = __cpu_to_le32(arg->peer_ht_caps); 7726da8fa4e3SBjoern A. Zeeb cmd->peer_max_mpdu = __cpu_to_le32(arg->peer_max_mpdu); 7727da8fa4e3SBjoern A. Zeeb cmd->peer_mpdu_density = __cpu_to_le32(arg->peer_mpdu_density); 7728da8fa4e3SBjoern A. Zeeb cmd->peer_rate_caps = __cpu_to_le32(arg->peer_rate_caps); 7729da8fa4e3SBjoern A. Zeeb cmd->peer_nss = __cpu_to_le32(arg->peer_num_spatial_streams); 7730da8fa4e3SBjoern A. Zeeb cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps); 7731da8fa4e3SBjoern A. Zeeb cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode); 7732da8fa4e3SBjoern A. Zeeb 7733da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, arg->addr); 7734da8fa4e3SBjoern A. Zeeb 7735da8fa4e3SBjoern A. Zeeb cmd->peer_legacy_rates.num_rates = 7736da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_legacy_rates.num_rates); 7737da8fa4e3SBjoern A. Zeeb memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates, 7738da8fa4e3SBjoern A. Zeeb arg->peer_legacy_rates.num_rates); 7739da8fa4e3SBjoern A. Zeeb 7740da8fa4e3SBjoern A. Zeeb cmd->peer_ht_rates.num_rates = 7741da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_ht_rates.num_rates); 7742da8fa4e3SBjoern A. Zeeb memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates, 7743da8fa4e3SBjoern A. Zeeb arg->peer_ht_rates.num_rates); 7744da8fa4e3SBjoern A. Zeeb 7745da8fa4e3SBjoern A. Zeeb cmd->peer_vht_rates.rx_max_rate = 7746da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_vht_rates.rx_max_rate); 7747da8fa4e3SBjoern A. Zeeb cmd->peer_vht_rates.rx_mcs_set = 7748da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set); 7749da8fa4e3SBjoern A. Zeeb cmd->peer_vht_rates.tx_max_rate = 7750da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_vht_rates.tx_max_rate); 7751da8fa4e3SBjoern A. Zeeb cmd->peer_vht_rates.tx_mcs_set = 7752da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set); 7753da8fa4e3SBjoern A. Zeeb } 7754da8fa4e3SBjoern A. Zeeb 7755da8fa4e3SBjoern A. Zeeb static void 7756da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf, 7757da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7758da8fa4e3SBjoern A. Zeeb { 7759da8fa4e3SBjoern A. Zeeb struct wmi_main_peer_assoc_complete_cmd *cmd = buf; 7760da8fa4e3SBjoern A. Zeeb 7761da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill(ar, buf, arg); 7762da8fa4e3SBjoern A. Zeeb memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info)); 7763da8fa4e3SBjoern A. Zeeb } 7764da8fa4e3SBjoern A. Zeeb 7765da8fa4e3SBjoern A. Zeeb static void 7766da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf, 7767da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7768da8fa4e3SBjoern A. Zeeb { 7769da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill(ar, buf, arg); 7770da8fa4e3SBjoern A. Zeeb } 7771da8fa4e3SBjoern A. Zeeb 7772da8fa4e3SBjoern A. Zeeb static void 7773da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf, 7774da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7775da8fa4e3SBjoern A. Zeeb { 7776da8fa4e3SBjoern A. Zeeb struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf; 7777da8fa4e3SBjoern A. Zeeb int max_mcs, max_nss; 7778da8fa4e3SBjoern A. Zeeb u32 info0; 7779da8fa4e3SBjoern A. Zeeb 7780da8fa4e3SBjoern A. Zeeb /* TODO: Is using max values okay with firmware? */ 7781da8fa4e3SBjoern A. Zeeb max_mcs = 0xf; 7782da8fa4e3SBjoern A. Zeeb max_nss = 0xf; 7783da8fa4e3SBjoern A. Zeeb 7784da8fa4e3SBjoern A. Zeeb info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) | 7785da8fa4e3SBjoern A. Zeeb SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS); 7786da8fa4e3SBjoern A. Zeeb 7787da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill(ar, buf, arg); 7788da8fa4e3SBjoern A. Zeeb cmd->info0 = __cpu_to_le32(info0); 7789da8fa4e3SBjoern A. Zeeb } 7790da8fa4e3SBjoern A. Zeeb 7791da8fa4e3SBjoern A. Zeeb static void 7792da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf, 7793da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7794da8fa4e3SBjoern A. Zeeb { 7795da8fa4e3SBjoern A. Zeeb struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf; 7796da8fa4e3SBjoern A. Zeeb 7797da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg); 7798da8fa4e3SBjoern A. Zeeb cmd->peer_bw_rxnss_override = 7799da8fa4e3SBjoern A. Zeeb __cpu_to_le32(arg->peer_bw_rxnss_override); 7800da8fa4e3SBjoern A. Zeeb } 7801da8fa4e3SBjoern A. Zeeb 7802da8fa4e3SBjoern A. Zeeb static int 7803da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg) 7804da8fa4e3SBjoern A. Zeeb { 7805da8fa4e3SBjoern A. Zeeb if (arg->peer_mpdu_density > 16) 7806da8fa4e3SBjoern A. Zeeb return -EINVAL; 7807da8fa4e3SBjoern A. Zeeb if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES) 7808da8fa4e3SBjoern A. Zeeb return -EINVAL; 7809da8fa4e3SBjoern A. Zeeb if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES) 7810da8fa4e3SBjoern A. Zeeb return -EINVAL; 7811da8fa4e3SBjoern A. Zeeb 7812da8fa4e3SBjoern A. Zeeb return 0; 7813da8fa4e3SBjoern A. Zeeb } 7814da8fa4e3SBjoern A. Zeeb 7815da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7816da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar, 7817da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7818da8fa4e3SBjoern A. Zeeb { 7819da8fa4e3SBjoern A. Zeeb size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd); 7820da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7821da8fa4e3SBjoern A. Zeeb int ret; 7822da8fa4e3SBjoern A. Zeeb 7823da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_peer_assoc_check_arg(arg); 7824da8fa4e3SBjoern A. Zeeb if (ret) 7825da8fa4e3SBjoern A. Zeeb return ERR_PTR(ret); 7826da8fa4e3SBjoern A. Zeeb 7827da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 7828da8fa4e3SBjoern A. Zeeb if (!skb) 7829da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7830da8fa4e3SBjoern A. Zeeb 7831da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg); 7832da8fa4e3SBjoern A. Zeeb 7833da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7834da8fa4e3SBjoern A. Zeeb "wmi peer assoc vdev %d addr %pM (%s)\n", 7835da8fa4e3SBjoern A. Zeeb arg->vdev_id, arg->addr, 7836da8fa4e3SBjoern A. Zeeb arg->peer_reassoc ? "reassociate" : "new"); 7837da8fa4e3SBjoern A. Zeeb return skb; 7838da8fa4e3SBjoern A. Zeeb } 7839da8fa4e3SBjoern A. Zeeb 7840da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7841da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar, 7842da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7843da8fa4e3SBjoern A. Zeeb { 7844da8fa4e3SBjoern A. Zeeb size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd); 7845da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7846da8fa4e3SBjoern A. Zeeb int ret; 7847da8fa4e3SBjoern A. Zeeb 7848da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_peer_assoc_check_arg(arg); 7849da8fa4e3SBjoern A. Zeeb if (ret) 7850da8fa4e3SBjoern A. Zeeb return ERR_PTR(ret); 7851da8fa4e3SBjoern A. Zeeb 7852da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 7853da8fa4e3SBjoern A. Zeeb if (!skb) 7854da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7855da8fa4e3SBjoern A. Zeeb 7856da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg); 7857da8fa4e3SBjoern A. Zeeb 7858da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7859da8fa4e3SBjoern A. Zeeb "wmi peer assoc vdev %d addr %pM (%s)\n", 7860da8fa4e3SBjoern A. Zeeb arg->vdev_id, arg->addr, 7861da8fa4e3SBjoern A. Zeeb arg->peer_reassoc ? "reassociate" : "new"); 7862da8fa4e3SBjoern A. Zeeb return skb; 7863da8fa4e3SBjoern A. Zeeb } 7864da8fa4e3SBjoern A. Zeeb 7865da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7866da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar, 7867da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7868da8fa4e3SBjoern A. Zeeb { 7869da8fa4e3SBjoern A. Zeeb size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd); 7870da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7871da8fa4e3SBjoern A. Zeeb int ret; 7872da8fa4e3SBjoern A. Zeeb 7873da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_peer_assoc_check_arg(arg); 7874da8fa4e3SBjoern A. Zeeb if (ret) 7875da8fa4e3SBjoern A. Zeeb return ERR_PTR(ret); 7876da8fa4e3SBjoern A. Zeeb 7877da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 7878da8fa4e3SBjoern A. Zeeb if (!skb) 7879da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7880da8fa4e3SBjoern A. Zeeb 7881da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg); 7882da8fa4e3SBjoern A. Zeeb 7883da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7884da8fa4e3SBjoern A. Zeeb "wmi peer assoc vdev %d addr %pM (%s)\n", 7885da8fa4e3SBjoern A. Zeeb arg->vdev_id, arg->addr, 7886da8fa4e3SBjoern A. Zeeb arg->peer_reassoc ? "reassociate" : "new"); 7887da8fa4e3SBjoern A. Zeeb return skb; 7888da8fa4e3SBjoern A. Zeeb } 7889da8fa4e3SBjoern A. Zeeb 7890da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7891da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar, 7892da8fa4e3SBjoern A. Zeeb const struct wmi_peer_assoc_complete_arg *arg) 7893da8fa4e3SBjoern A. Zeeb { 7894da8fa4e3SBjoern A. Zeeb size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd); 7895da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7896da8fa4e3SBjoern A. Zeeb int ret; 7897da8fa4e3SBjoern A. Zeeb 7898da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_peer_assoc_check_arg(arg); 7899da8fa4e3SBjoern A. Zeeb if (ret) 7900da8fa4e3SBjoern A. Zeeb return ERR_PTR(ret); 7901da8fa4e3SBjoern A. Zeeb 7902da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 7903da8fa4e3SBjoern A. Zeeb if (!skb) 7904da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7905da8fa4e3SBjoern A. Zeeb 7906da8fa4e3SBjoern A. Zeeb ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg); 7907da8fa4e3SBjoern A. Zeeb 7908da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7909da8fa4e3SBjoern A. Zeeb "wmi peer assoc vdev %d addr %pM (%s)\n", 7910da8fa4e3SBjoern A. Zeeb arg->vdev_id, arg->addr, 7911da8fa4e3SBjoern A. Zeeb arg->peer_reassoc ? "reassociate" : "new"); 7912da8fa4e3SBjoern A. Zeeb return skb; 7913da8fa4e3SBjoern A. Zeeb } 7914da8fa4e3SBjoern A. Zeeb 7915da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7916da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar) 7917da8fa4e3SBjoern A. Zeeb { 7918da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7919da8fa4e3SBjoern A. Zeeb 7920da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, 0); 7921da8fa4e3SBjoern A. Zeeb if (!skb) 7922da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7923da8fa4e3SBjoern A. Zeeb 7924da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n"); 7925da8fa4e3SBjoern A. Zeeb return skb; 7926da8fa4e3SBjoern A. Zeeb } 7927da8fa4e3SBjoern A. Zeeb 7928da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7929da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar, 7930da8fa4e3SBjoern A. Zeeb enum wmi_bss_survey_req_type type) 7931da8fa4e3SBjoern A. Zeeb { 7932da8fa4e3SBjoern A. Zeeb struct wmi_pdev_chan_info_req_cmd *cmd; 7933da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7934da8fa4e3SBjoern A. Zeeb 7935da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7936da8fa4e3SBjoern A. Zeeb if (!skb) 7937da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7938da8fa4e3SBjoern A. Zeeb 7939da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_chan_info_req_cmd *)skb->data; 7940da8fa4e3SBjoern A. Zeeb cmd->type = __cpu_to_le32(type); 7941da8fa4e3SBjoern A. Zeeb 7942da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 7943da8fa4e3SBjoern A. Zeeb "wmi pdev bss info request type %d\n", type); 7944da8fa4e3SBjoern A. Zeeb 7945da8fa4e3SBjoern A. Zeeb return skb; 7946da8fa4e3SBjoern A. Zeeb } 7947da8fa4e3SBjoern A. Zeeb 7948da8fa4e3SBjoern A. Zeeb /* This function assumes the beacon is already DMA mapped */ 7949da8fa4e3SBjoern A. Zeeb static struct sk_buff * 7950da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn, 7951da8fa4e3SBjoern A. Zeeb size_t bcn_len, u32 bcn_paddr, bool dtim_zero, 7952da8fa4e3SBjoern A. Zeeb bool deliver_cab) 7953da8fa4e3SBjoern A. Zeeb { 7954da8fa4e3SBjoern A. Zeeb struct wmi_bcn_tx_ref_cmd *cmd; 7955da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 7956da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7957da8fa4e3SBjoern A. Zeeb struct ieee80211_hdr *hdr; 7958da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7959da8fa4e3SBjoern A. Zeeb const struct ieee80211_hdr *hdr; 7960da8fa4e3SBjoern A. Zeeb #endif 7961da8fa4e3SBjoern A. Zeeb u16 fc; 7962da8fa4e3SBjoern A. Zeeb 7963da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7964da8fa4e3SBjoern A. Zeeb if (!skb) 7965da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 7966da8fa4e3SBjoern A. Zeeb 7967da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 7968da8fa4e3SBjoern A. Zeeb hdr = (struct ieee80211_hdr *)bcn; 7969da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 7970da8fa4e3SBjoern A. Zeeb hdr = (const struct ieee80211_hdr *)bcn; 7971da8fa4e3SBjoern A. Zeeb #endif 7972da8fa4e3SBjoern A. Zeeb fc = le16_to_cpu(hdr->frame_control); 7973da8fa4e3SBjoern A. Zeeb 7974da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data; 7975da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 7976da8fa4e3SBjoern A. Zeeb cmd->data_len = __cpu_to_le32(bcn_len); 7977da8fa4e3SBjoern A. Zeeb cmd->data_ptr = __cpu_to_le32(bcn_paddr); 7978da8fa4e3SBjoern A. Zeeb cmd->msdu_id = 0; 7979da8fa4e3SBjoern A. Zeeb cmd->frame_control = __cpu_to_le32(fc); 7980da8fa4e3SBjoern A. Zeeb cmd->flags = 0; 7981da8fa4e3SBjoern A. Zeeb cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA); 7982da8fa4e3SBjoern A. Zeeb 7983da8fa4e3SBjoern A. Zeeb if (dtim_zero) 7984da8fa4e3SBjoern A. Zeeb cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO); 7985da8fa4e3SBjoern A. Zeeb 7986da8fa4e3SBjoern A. Zeeb if (deliver_cab) 7987da8fa4e3SBjoern A. Zeeb cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB); 7988da8fa4e3SBjoern A. Zeeb 7989da8fa4e3SBjoern A. Zeeb return skb; 7990da8fa4e3SBjoern A. Zeeb } 7991da8fa4e3SBjoern A. Zeeb 7992da8fa4e3SBjoern A. Zeeb void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params, 7993da8fa4e3SBjoern A. Zeeb const struct wmi_wmm_params_arg *arg) 7994da8fa4e3SBjoern A. Zeeb { 7995da8fa4e3SBjoern A. Zeeb params->cwmin = __cpu_to_le32(arg->cwmin); 7996da8fa4e3SBjoern A. Zeeb params->cwmax = __cpu_to_le32(arg->cwmax); 7997da8fa4e3SBjoern A. Zeeb params->aifs = __cpu_to_le32(arg->aifs); 7998da8fa4e3SBjoern A. Zeeb params->txop = __cpu_to_le32(arg->txop); 7999da8fa4e3SBjoern A. Zeeb params->acm = __cpu_to_le32(arg->acm); 8000da8fa4e3SBjoern A. Zeeb params->no_ack = __cpu_to_le32(arg->no_ack); 8001da8fa4e3SBjoern A. Zeeb } 8002da8fa4e3SBjoern A. Zeeb 8003da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8004da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar, 8005da8fa4e3SBjoern A. Zeeb const struct wmi_wmm_params_all_arg *arg) 8006da8fa4e3SBjoern A. Zeeb { 8007da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_wmm_params *cmd; 8008da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8009da8fa4e3SBjoern A. Zeeb 8010da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8011da8fa4e3SBjoern A. Zeeb if (!skb) 8012da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8013da8fa4e3SBjoern A. Zeeb 8014da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_wmm_params *)skb->data; 8015da8fa4e3SBjoern A. Zeeb ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be); 8016da8fa4e3SBjoern A. Zeeb ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk); 8017da8fa4e3SBjoern A. Zeeb ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi); 8018da8fa4e3SBjoern A. Zeeb ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo); 8019da8fa4e3SBjoern A. Zeeb 8020da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n"); 8021da8fa4e3SBjoern A. Zeeb return skb; 8022da8fa4e3SBjoern A. Zeeb } 8023da8fa4e3SBjoern A. Zeeb 8024da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8025da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask) 8026da8fa4e3SBjoern A. Zeeb { 8027da8fa4e3SBjoern A. Zeeb struct wmi_request_stats_cmd *cmd; 8028da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8029da8fa4e3SBjoern A. Zeeb 8030da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8031da8fa4e3SBjoern A. Zeeb if (!skb) 8032da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8033da8fa4e3SBjoern A. Zeeb 8034da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_request_stats_cmd *)skb->data; 8035da8fa4e3SBjoern A. Zeeb cmd->stats_id = __cpu_to_le32(stats_mask); 8036da8fa4e3SBjoern A. Zeeb 8037da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n", 8038da8fa4e3SBjoern A. Zeeb stats_mask); 8039da8fa4e3SBjoern A. Zeeb return skb; 8040da8fa4e3SBjoern A. Zeeb } 8041da8fa4e3SBjoern A. Zeeb 8042da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8043da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar, 8044da8fa4e3SBjoern A. Zeeb enum wmi_force_fw_hang_type type, u32 delay_ms) 8045da8fa4e3SBjoern A. Zeeb { 8046da8fa4e3SBjoern A. Zeeb struct wmi_force_fw_hang_cmd *cmd; 8047da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8048da8fa4e3SBjoern A. Zeeb 8049da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8050da8fa4e3SBjoern A. Zeeb if (!skb) 8051da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8052da8fa4e3SBjoern A. Zeeb 8053da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_force_fw_hang_cmd *)skb->data; 8054da8fa4e3SBjoern A. Zeeb cmd->type = __cpu_to_le32(type); 8055da8fa4e3SBjoern A. Zeeb cmd->delay_ms = __cpu_to_le32(delay_ms); 8056da8fa4e3SBjoern A. Zeeb 8057da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n", 8058da8fa4e3SBjoern A. Zeeb type, delay_ms); 8059da8fa4e3SBjoern A. Zeeb return skb; 8060da8fa4e3SBjoern A. Zeeb } 8061da8fa4e3SBjoern A. Zeeb 8062da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8063da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable, 8064da8fa4e3SBjoern A. Zeeb u32 log_level) 8065da8fa4e3SBjoern A. Zeeb { 8066da8fa4e3SBjoern A. Zeeb struct wmi_dbglog_cfg_cmd *cmd; 8067da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8068da8fa4e3SBjoern A. Zeeb u32 cfg; 8069da8fa4e3SBjoern A. Zeeb 8070da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8071da8fa4e3SBjoern A. Zeeb if (!skb) 8072da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8073da8fa4e3SBjoern A. Zeeb 8074da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_dbglog_cfg_cmd *)skb->data; 8075da8fa4e3SBjoern A. Zeeb 8076da8fa4e3SBjoern A. Zeeb if (module_enable) { 8077da8fa4e3SBjoern A. Zeeb cfg = SM(log_level, 8078da8fa4e3SBjoern A. Zeeb ATH10K_DBGLOG_CFG_LOG_LVL); 8079da8fa4e3SBjoern A. Zeeb } else { 8080da8fa4e3SBjoern A. Zeeb /* set back defaults, all modules with WARN level */ 8081da8fa4e3SBjoern A. Zeeb cfg = SM(ATH10K_DBGLOG_LEVEL_WARN, 8082da8fa4e3SBjoern A. Zeeb ATH10K_DBGLOG_CFG_LOG_LVL); 8083da8fa4e3SBjoern A. Zeeb module_enable = ~0; 8084da8fa4e3SBjoern A. Zeeb } 8085da8fa4e3SBjoern A. Zeeb 8086da8fa4e3SBjoern A. Zeeb cmd->module_enable = __cpu_to_le32(module_enable); 8087da8fa4e3SBjoern A. Zeeb cmd->module_valid = __cpu_to_le32(~0); 8088da8fa4e3SBjoern A. Zeeb cmd->config_enable = __cpu_to_le32(cfg); 8089da8fa4e3SBjoern A. Zeeb cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK); 8090da8fa4e3SBjoern A. Zeeb 8091da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8092da8fa4e3SBjoern A. Zeeb "wmi dbglog cfg modules %08x %08x config %08x %08x\n", 8093da8fa4e3SBjoern A. Zeeb __le32_to_cpu(cmd->module_enable), 8094da8fa4e3SBjoern A. Zeeb __le32_to_cpu(cmd->module_valid), 8095da8fa4e3SBjoern A. Zeeb __le32_to_cpu(cmd->config_enable), 8096da8fa4e3SBjoern A. Zeeb __le32_to_cpu(cmd->config_valid)); 8097da8fa4e3SBjoern A. Zeeb return skb; 8098da8fa4e3SBjoern A. Zeeb } 8099da8fa4e3SBjoern A. Zeeb 8100da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8101da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable, 8102da8fa4e3SBjoern A. Zeeb u32 log_level) 8103da8fa4e3SBjoern A. Zeeb { 8104da8fa4e3SBjoern A. Zeeb struct wmi_10_4_dbglog_cfg_cmd *cmd; 8105da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8106da8fa4e3SBjoern A. Zeeb u32 cfg; 8107da8fa4e3SBjoern A. Zeeb 8108da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8109da8fa4e3SBjoern A. Zeeb if (!skb) 8110da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8111da8fa4e3SBjoern A. Zeeb 8112da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_10_4_dbglog_cfg_cmd *)skb->data; 8113da8fa4e3SBjoern A. Zeeb 8114da8fa4e3SBjoern A. Zeeb if (module_enable) { 8115da8fa4e3SBjoern A. Zeeb cfg = SM(log_level, 8116da8fa4e3SBjoern A. Zeeb ATH10K_DBGLOG_CFG_LOG_LVL); 8117da8fa4e3SBjoern A. Zeeb } else { 8118da8fa4e3SBjoern A. Zeeb /* set back defaults, all modules with WARN level */ 8119da8fa4e3SBjoern A. Zeeb cfg = SM(ATH10K_DBGLOG_LEVEL_WARN, 8120da8fa4e3SBjoern A. Zeeb ATH10K_DBGLOG_CFG_LOG_LVL); 8121da8fa4e3SBjoern A. Zeeb module_enable = ~0; 8122da8fa4e3SBjoern A. Zeeb } 8123da8fa4e3SBjoern A. Zeeb 8124da8fa4e3SBjoern A. Zeeb cmd->module_enable = __cpu_to_le64(module_enable); 8125da8fa4e3SBjoern A. Zeeb cmd->module_valid = __cpu_to_le64(~0); 8126da8fa4e3SBjoern A. Zeeb cmd->config_enable = __cpu_to_le32(cfg); 8127da8fa4e3SBjoern A. Zeeb cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK); 8128da8fa4e3SBjoern A. Zeeb 8129da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8130da8fa4e3SBjoern A. Zeeb #if defined(__linux__) 8131da8fa4e3SBjoern A. Zeeb "wmi dbglog cfg modules 0x%016llx 0x%016llx config %08x %08x\n", 8132da8fa4e3SBjoern A. Zeeb __le64_to_cpu(cmd->module_enable), 8133da8fa4e3SBjoern A. Zeeb __le64_to_cpu(cmd->module_valid), 8134da8fa4e3SBjoern A. Zeeb #elif defined(__FreeBSD__) 8135da8fa4e3SBjoern A. Zeeb "wmi dbglog cfg modules 0x%016jx 0x%016jx config %08x %08x\n", 8136da8fa4e3SBjoern A. Zeeb (uintmax_t)__le64_to_cpu(cmd->module_enable), 8137da8fa4e3SBjoern A. Zeeb (uintmax_t)__le64_to_cpu(cmd->module_valid), 8138da8fa4e3SBjoern A. Zeeb #endif 8139da8fa4e3SBjoern A. Zeeb __le32_to_cpu(cmd->config_enable), 8140da8fa4e3SBjoern A. Zeeb __le32_to_cpu(cmd->config_valid)); 8141da8fa4e3SBjoern A. Zeeb return skb; 8142da8fa4e3SBjoern A. Zeeb } 8143da8fa4e3SBjoern A. Zeeb 8144da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8145da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap) 8146da8fa4e3SBjoern A. Zeeb { 8147da8fa4e3SBjoern A. Zeeb struct wmi_pdev_pktlog_enable_cmd *cmd; 8148da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8149da8fa4e3SBjoern A. Zeeb 8150da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8151da8fa4e3SBjoern A. Zeeb if (!skb) 8152da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8153da8fa4e3SBjoern A. Zeeb 8154da8fa4e3SBjoern A. Zeeb ev_bitmap &= ATH10K_PKTLOG_ANY; 8155da8fa4e3SBjoern A. Zeeb 8156da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data; 8157da8fa4e3SBjoern A. Zeeb cmd->ev_bitmap = __cpu_to_le32(ev_bitmap); 8158da8fa4e3SBjoern A. Zeeb 8159da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n", 8160da8fa4e3SBjoern A. Zeeb ev_bitmap); 8161da8fa4e3SBjoern A. Zeeb return skb; 8162da8fa4e3SBjoern A. Zeeb } 8163da8fa4e3SBjoern A. Zeeb 8164da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8165da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar) 8166da8fa4e3SBjoern A. Zeeb { 8167da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8168da8fa4e3SBjoern A. Zeeb 8169da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, 0); 8170da8fa4e3SBjoern A. Zeeb if (!skb) 8171da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8172da8fa4e3SBjoern A. Zeeb 8173da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n"); 8174da8fa4e3SBjoern A. Zeeb return skb; 8175da8fa4e3SBjoern A. Zeeb } 8176da8fa4e3SBjoern A. Zeeb 8177da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8178da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period, 8179da8fa4e3SBjoern A. Zeeb u32 duration, u32 next_offset, 8180da8fa4e3SBjoern A. Zeeb u32 enabled) 8181da8fa4e3SBjoern A. Zeeb { 8182da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_quiet_cmd *cmd; 8183da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8184da8fa4e3SBjoern A. Zeeb 8185da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8186da8fa4e3SBjoern A. Zeeb if (!skb) 8187da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8188da8fa4e3SBjoern A. Zeeb 8189da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data; 8190da8fa4e3SBjoern A. Zeeb cmd->period = __cpu_to_le32(period); 8191da8fa4e3SBjoern A. Zeeb cmd->duration = __cpu_to_le32(duration); 8192da8fa4e3SBjoern A. Zeeb cmd->next_start = __cpu_to_le32(next_offset); 8193da8fa4e3SBjoern A. Zeeb cmd->enabled = __cpu_to_le32(enabled); 8194da8fa4e3SBjoern A. Zeeb 8195da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8196da8fa4e3SBjoern A. Zeeb "wmi quiet param: period %u duration %u enabled %d\n", 8197da8fa4e3SBjoern A. Zeeb period, duration, enabled); 8198da8fa4e3SBjoern A. Zeeb return skb; 8199da8fa4e3SBjoern A. Zeeb } 8200da8fa4e3SBjoern A. Zeeb 8201da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8202da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id, 8203da8fa4e3SBjoern A. Zeeb const u8 *mac) 8204da8fa4e3SBjoern A. Zeeb { 8205da8fa4e3SBjoern A. Zeeb struct wmi_addba_clear_resp_cmd *cmd; 8206da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8207da8fa4e3SBjoern A. Zeeb 8208da8fa4e3SBjoern A. Zeeb if (!mac) 8209da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 8210da8fa4e3SBjoern A. Zeeb 8211da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8212da8fa4e3SBjoern A. Zeeb if (!skb) 8213da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8214da8fa4e3SBjoern A. Zeeb 8215da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_addba_clear_resp_cmd *)skb->data; 8216da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 8217da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, mac); 8218da8fa4e3SBjoern A. Zeeb 8219da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8220da8fa4e3SBjoern A. Zeeb "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n", 8221da8fa4e3SBjoern A. Zeeb vdev_id, mac); 8222da8fa4e3SBjoern A. Zeeb return skb; 8223da8fa4e3SBjoern A. Zeeb } 8224da8fa4e3SBjoern A. Zeeb 8225da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8226da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 8227da8fa4e3SBjoern A. Zeeb u32 tid, u32 buf_size) 8228da8fa4e3SBjoern A. Zeeb { 8229da8fa4e3SBjoern A. Zeeb struct wmi_addba_send_cmd *cmd; 8230da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8231da8fa4e3SBjoern A. Zeeb 8232da8fa4e3SBjoern A. Zeeb if (!mac) 8233da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 8234da8fa4e3SBjoern A. Zeeb 8235da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8236da8fa4e3SBjoern A. Zeeb if (!skb) 8237da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8238da8fa4e3SBjoern A. Zeeb 8239da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_addba_send_cmd *)skb->data; 8240da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 8241da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, mac); 8242da8fa4e3SBjoern A. Zeeb cmd->tid = __cpu_to_le32(tid); 8243da8fa4e3SBjoern A. Zeeb cmd->buffersize = __cpu_to_le32(buf_size); 8244da8fa4e3SBjoern A. Zeeb 8245da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8246da8fa4e3SBjoern A. Zeeb "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n", 8247da8fa4e3SBjoern A. Zeeb vdev_id, mac, tid, buf_size); 8248da8fa4e3SBjoern A. Zeeb return skb; 8249da8fa4e3SBjoern A. Zeeb } 8250da8fa4e3SBjoern A. Zeeb 8251da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8252da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac, 8253da8fa4e3SBjoern A. Zeeb u32 tid, u32 status) 8254da8fa4e3SBjoern A. Zeeb { 8255da8fa4e3SBjoern A. Zeeb struct wmi_addba_setresponse_cmd *cmd; 8256da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8257da8fa4e3SBjoern A. Zeeb 8258da8fa4e3SBjoern A. Zeeb if (!mac) 8259da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 8260da8fa4e3SBjoern A. Zeeb 8261da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8262da8fa4e3SBjoern A. Zeeb if (!skb) 8263da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8264da8fa4e3SBjoern A. Zeeb 8265da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_addba_setresponse_cmd *)skb->data; 8266da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 8267da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, mac); 8268da8fa4e3SBjoern A. Zeeb cmd->tid = __cpu_to_le32(tid); 8269da8fa4e3SBjoern A. Zeeb cmd->statuscode = __cpu_to_le32(status); 8270da8fa4e3SBjoern A. Zeeb 8271da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8272da8fa4e3SBjoern A. Zeeb "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n", 8273da8fa4e3SBjoern A. Zeeb vdev_id, mac, tid, status); 8274da8fa4e3SBjoern A. Zeeb return skb; 8275da8fa4e3SBjoern A. Zeeb } 8276da8fa4e3SBjoern A. Zeeb 8277da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8278da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 8279da8fa4e3SBjoern A. Zeeb u32 tid, u32 initiator, u32 reason) 8280da8fa4e3SBjoern A. Zeeb { 8281da8fa4e3SBjoern A. Zeeb struct wmi_delba_send_cmd *cmd; 8282da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8283da8fa4e3SBjoern A. Zeeb 8284da8fa4e3SBjoern A. Zeeb if (!mac) 8285da8fa4e3SBjoern A. Zeeb return ERR_PTR(-EINVAL); 8286da8fa4e3SBjoern A. Zeeb 8287da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8288da8fa4e3SBjoern A. Zeeb if (!skb) 8289da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8290da8fa4e3SBjoern A. Zeeb 8291da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_delba_send_cmd *)skb->data; 8292da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 8293da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, mac); 8294da8fa4e3SBjoern A. Zeeb cmd->tid = __cpu_to_le32(tid); 8295da8fa4e3SBjoern A. Zeeb cmd->initiator = __cpu_to_le32(initiator); 8296da8fa4e3SBjoern A. Zeeb cmd->reasoncode = __cpu_to_le32(reason); 8297da8fa4e3SBjoern A. Zeeb 8298da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8299da8fa4e3SBjoern A. Zeeb "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n", 8300da8fa4e3SBjoern A. Zeeb vdev_id, mac, tid, initiator, reason); 8301da8fa4e3SBjoern A. Zeeb return skb; 8302da8fa4e3SBjoern A. Zeeb } 8303da8fa4e3SBjoern A. Zeeb 8304da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8305da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param) 8306da8fa4e3SBjoern A. Zeeb { 8307da8fa4e3SBjoern A. Zeeb struct wmi_pdev_get_tpc_config_cmd *cmd; 8308da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8309da8fa4e3SBjoern A. Zeeb 8310da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8311da8fa4e3SBjoern A. Zeeb if (!skb) 8312da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8313da8fa4e3SBjoern A. Zeeb 8314da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data; 8315da8fa4e3SBjoern A. Zeeb cmd->param = __cpu_to_le32(param); 8316da8fa4e3SBjoern A. Zeeb 8317da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8318da8fa4e3SBjoern A. Zeeb "wmi pdev get tpc config param %d\n", param); 8319da8fa4e3SBjoern A. Zeeb return skb; 8320da8fa4e3SBjoern A. Zeeb } 8321da8fa4e3SBjoern A. Zeeb 8322da8fa4e3SBjoern A. Zeeb size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head) 8323da8fa4e3SBjoern A. Zeeb { 8324da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_peer *i; 8325da8fa4e3SBjoern A. Zeeb size_t num = 0; 8326da8fa4e3SBjoern A. Zeeb 8327da8fa4e3SBjoern A. Zeeb list_for_each_entry(i, head, list) 8328da8fa4e3SBjoern A. Zeeb ++num; 8329da8fa4e3SBjoern A. Zeeb 8330da8fa4e3SBjoern A. Zeeb return num; 8331da8fa4e3SBjoern A. Zeeb } 8332da8fa4e3SBjoern A. Zeeb 8333da8fa4e3SBjoern A. Zeeb size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head) 8334da8fa4e3SBjoern A. Zeeb { 8335da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_vdev *i; 8336da8fa4e3SBjoern A. Zeeb size_t num = 0; 8337da8fa4e3SBjoern A. Zeeb 8338da8fa4e3SBjoern A. Zeeb list_for_each_entry(i, head, list) 8339da8fa4e3SBjoern A. Zeeb ++num; 8340da8fa4e3SBjoern A. Zeeb 8341da8fa4e3SBjoern A. Zeeb return num; 8342da8fa4e3SBjoern A. Zeeb } 8343da8fa4e3SBjoern A. Zeeb 8344da8fa4e3SBjoern A. Zeeb static void 8345da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8346da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8347da8fa4e3SBjoern A. Zeeb { 8348da8fa4e3SBjoern A. Zeeb u32 len = *length; 8349da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8350da8fa4e3SBjoern A. Zeeb 8351da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8352da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n", 8353da8fa4e3SBjoern A. Zeeb "ath10k PDEV stats"); 8354da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8355da8fa4e3SBjoern A. Zeeb "================="); 8356da8fa4e3SBjoern A. Zeeb 8357da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8358da8fa4e3SBjoern A. Zeeb "Channel noise floor", pdev->ch_noise_floor); 8359da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8360da8fa4e3SBjoern A. Zeeb "Channel TX power", pdev->chan_tx_power); 8361da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8362da8fa4e3SBjoern A. Zeeb "TX frame count", pdev->tx_frame_count); 8363da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8364da8fa4e3SBjoern A. Zeeb "RX frame count", pdev->rx_frame_count); 8365da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8366da8fa4e3SBjoern A. Zeeb "RX clear count", pdev->rx_clear_count); 8367da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8368da8fa4e3SBjoern A. Zeeb "Cycle count", pdev->cycle_count); 8369da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8370da8fa4e3SBjoern A. Zeeb "PHY error count", pdev->phy_err_count); 8371da8fa4e3SBjoern A. Zeeb 8372da8fa4e3SBjoern A. Zeeb *length = len; 8373da8fa4e3SBjoern A. Zeeb } 8374da8fa4e3SBjoern A. Zeeb 8375da8fa4e3SBjoern A. Zeeb static void 8376da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8377da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8378da8fa4e3SBjoern A. Zeeb { 8379da8fa4e3SBjoern A. Zeeb u32 len = *length; 8380da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8381da8fa4e3SBjoern A. Zeeb 8382da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8383da8fa4e3SBjoern A. Zeeb "RTS bad count", pdev->rts_bad); 8384da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8385da8fa4e3SBjoern A. Zeeb "RTS good count", pdev->rts_good); 8386da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8387da8fa4e3SBjoern A. Zeeb "FCS bad count", pdev->fcs_bad); 8388da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8389da8fa4e3SBjoern A. Zeeb "No beacon count", pdev->no_beacons); 8390da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8391da8fa4e3SBjoern A. Zeeb "MIB int count", pdev->mib_int_count); 8392da8fa4e3SBjoern A. Zeeb 8393da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8394da8fa4e3SBjoern A. Zeeb *length = len; 8395da8fa4e3SBjoern A. Zeeb } 8396da8fa4e3SBjoern A. Zeeb 8397da8fa4e3SBjoern A. Zeeb static void 8398da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8399da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8400da8fa4e3SBjoern A. Zeeb { 8401da8fa4e3SBjoern A. Zeeb u32 len = *length; 8402da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8403da8fa4e3SBjoern A. Zeeb 8404da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n%30s\n", 8405da8fa4e3SBjoern A. Zeeb "ath10k PDEV TX stats"); 8406da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8407da8fa4e3SBjoern A. Zeeb "================="); 8408da8fa4e3SBjoern A. Zeeb 8409da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8410da8fa4e3SBjoern A. Zeeb "HTT cookies queued", pdev->comp_queued); 8411da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8412da8fa4e3SBjoern A. Zeeb "HTT cookies disp.", pdev->comp_delivered); 8413da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8414da8fa4e3SBjoern A. Zeeb "MSDU queued", pdev->msdu_enqued); 8415da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8416da8fa4e3SBjoern A. Zeeb "MPDU queued", pdev->mpdu_enqued); 8417da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8418da8fa4e3SBjoern A. Zeeb "MSDUs dropped", pdev->wmm_drop); 8419da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8420da8fa4e3SBjoern A. Zeeb "Local enqued", pdev->local_enqued); 8421da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8422da8fa4e3SBjoern A. Zeeb "Local freed", pdev->local_freed); 8423da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8424da8fa4e3SBjoern A. Zeeb "HW queued", pdev->hw_queued); 8425da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8426da8fa4e3SBjoern A. Zeeb "PPDUs reaped", pdev->hw_reaped); 8427da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8428da8fa4e3SBjoern A. Zeeb "Num underruns", pdev->underrun); 8429da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8430da8fa4e3SBjoern A. Zeeb "PPDUs cleaned", pdev->tx_abort); 8431da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8432da8fa4e3SBjoern A. Zeeb "MPDUs requeued", pdev->mpdus_requeued); 8433da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8434da8fa4e3SBjoern A. Zeeb "Excessive retries", pdev->tx_ko); 8435da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8436da8fa4e3SBjoern A. Zeeb "HW rate", pdev->data_rc); 8437da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8438da8fa4e3SBjoern A. Zeeb "Sched self triggers", pdev->self_triggers); 8439da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8440da8fa4e3SBjoern A. Zeeb "Dropped due to SW retries", 8441da8fa4e3SBjoern A. Zeeb pdev->sw_retry_failure); 8442da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8443da8fa4e3SBjoern A. Zeeb "Illegal rate phy errors", 8444da8fa4e3SBjoern A. Zeeb pdev->illgl_rate_phy_err); 8445da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8446da8fa4e3SBjoern A. Zeeb "Pdev continuous xretry", pdev->pdev_cont_xretry); 8447da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8448da8fa4e3SBjoern A. Zeeb "TX timeout", pdev->pdev_tx_timeout); 8449da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8450da8fa4e3SBjoern A. Zeeb "PDEV resets", pdev->pdev_resets); 8451da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8452da8fa4e3SBjoern A. Zeeb "PHY underrun", pdev->phy_underrun); 8453da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8454da8fa4e3SBjoern A. Zeeb "MPDU is more than txop limit", pdev->txop_ovf); 8455da8fa4e3SBjoern A. Zeeb *length = len; 8456da8fa4e3SBjoern A. Zeeb } 8457da8fa4e3SBjoern A. Zeeb 8458da8fa4e3SBjoern A. Zeeb static void 8459da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8460da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8461da8fa4e3SBjoern A. Zeeb { 8462da8fa4e3SBjoern A. Zeeb u32 len = *length; 8463da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8464da8fa4e3SBjoern A. Zeeb 8465da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n%30s\n", 8466da8fa4e3SBjoern A. Zeeb "ath10k PDEV RX stats"); 8467da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8468da8fa4e3SBjoern A. Zeeb "================="); 8469da8fa4e3SBjoern A. Zeeb 8470da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8471da8fa4e3SBjoern A. Zeeb "Mid PPDU route change", 8472da8fa4e3SBjoern A. Zeeb pdev->mid_ppdu_route_change); 8473da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8474da8fa4e3SBjoern A. Zeeb "Tot. number of statuses", pdev->status_rcvd); 8475da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8476da8fa4e3SBjoern A. Zeeb "Extra frags on rings 0", pdev->r0_frags); 8477da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8478da8fa4e3SBjoern A. Zeeb "Extra frags on rings 1", pdev->r1_frags); 8479da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8480da8fa4e3SBjoern A. Zeeb "Extra frags on rings 2", pdev->r2_frags); 8481da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8482da8fa4e3SBjoern A. Zeeb "Extra frags on rings 3", pdev->r3_frags); 8483da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8484da8fa4e3SBjoern A. Zeeb "MSDUs delivered to HTT", pdev->htt_msdus); 8485da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8486da8fa4e3SBjoern A. Zeeb "MPDUs delivered to HTT", pdev->htt_mpdus); 8487da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8488da8fa4e3SBjoern A. Zeeb "MSDUs delivered to stack", pdev->loc_msdus); 8489da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8490da8fa4e3SBjoern A. Zeeb "MPDUs delivered to stack", pdev->loc_mpdus); 8491da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8492da8fa4e3SBjoern A. Zeeb "Oversized AMSDUs", pdev->oversize_amsdu); 8493da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8494da8fa4e3SBjoern A. Zeeb "PHY errors", pdev->phy_errs); 8495da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8496da8fa4e3SBjoern A. Zeeb "PHY errors drops", pdev->phy_err_drop); 8497da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8498da8fa4e3SBjoern A. Zeeb "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs); 8499da8fa4e3SBjoern A. Zeeb *length = len; 8500da8fa4e3SBjoern A. Zeeb } 8501da8fa4e3SBjoern A. Zeeb 8502da8fa4e3SBjoern A. Zeeb static void 8503da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev, 8504da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8505da8fa4e3SBjoern A. Zeeb { 8506da8fa4e3SBjoern A. Zeeb u32 len = *length; 8507da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8508da8fa4e3SBjoern A. Zeeb int i; 8509da8fa4e3SBjoern A. Zeeb 8510da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8511da8fa4e3SBjoern A. Zeeb "vdev id", vdev->vdev_id); 8512da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8513da8fa4e3SBjoern A. Zeeb "beacon snr", vdev->beacon_snr); 8514da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8515da8fa4e3SBjoern A. Zeeb "data snr", vdev->data_snr); 8516da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8517da8fa4e3SBjoern A. Zeeb "num rx frames", vdev->num_rx_frames); 8518da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8519da8fa4e3SBjoern A. Zeeb "num rts fail", vdev->num_rts_fail); 8520da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8521da8fa4e3SBjoern A. Zeeb "num rts success", vdev->num_rts_success); 8522da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8523da8fa4e3SBjoern A. Zeeb "num rx err", vdev->num_rx_err); 8524da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8525da8fa4e3SBjoern A. Zeeb "num rx discard", vdev->num_rx_discard); 8526da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8527da8fa4e3SBjoern A. Zeeb "num tx not acked", vdev->num_tx_not_acked); 8528da8fa4e3SBjoern A. Zeeb 8529da8fa4e3SBjoern A. Zeeb for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++) 8530da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, 8531da8fa4e3SBjoern A. Zeeb "%25s [%02d] %u\n", 8532da8fa4e3SBjoern A. Zeeb "num tx frames", i, 8533da8fa4e3SBjoern A. Zeeb vdev->num_tx_frames[i]); 8534da8fa4e3SBjoern A. Zeeb 8535da8fa4e3SBjoern A. Zeeb for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++) 8536da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, 8537da8fa4e3SBjoern A. Zeeb "%25s [%02d] %u\n", 8538da8fa4e3SBjoern A. Zeeb "num tx frames retries", i, 8539da8fa4e3SBjoern A. Zeeb vdev->num_tx_frames_retries[i]); 8540da8fa4e3SBjoern A. Zeeb 8541da8fa4e3SBjoern A. Zeeb for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++) 8542da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, 8543da8fa4e3SBjoern A. Zeeb "%25s [%02d] %u\n", 8544da8fa4e3SBjoern A. Zeeb "num tx frames failures", i, 8545da8fa4e3SBjoern A. Zeeb vdev->num_tx_frames_failures[i]); 8546da8fa4e3SBjoern A. Zeeb 8547da8fa4e3SBjoern A. Zeeb for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++) 8548da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, 8549da8fa4e3SBjoern A. Zeeb "%25s [%02d] 0x%08x\n", 8550da8fa4e3SBjoern A. Zeeb "tx rate history", i, 8551da8fa4e3SBjoern A. Zeeb vdev->tx_rate_history[i]); 8552da8fa4e3SBjoern A. Zeeb 8553da8fa4e3SBjoern A. Zeeb for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++) 8554da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, 8555da8fa4e3SBjoern A. Zeeb "%25s [%02d] %u\n", 8556da8fa4e3SBjoern A. Zeeb "beacon rssi history", i, 8557da8fa4e3SBjoern A. Zeeb vdev->beacon_rssi_history[i]); 8558da8fa4e3SBjoern A. Zeeb 8559da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8560da8fa4e3SBjoern A. Zeeb *length = len; 8561da8fa4e3SBjoern A. Zeeb } 8562da8fa4e3SBjoern A. Zeeb 8563da8fa4e3SBjoern A. Zeeb static void 8564da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer, 8565da8fa4e3SBjoern A. Zeeb char *buf, u32 *length, bool extended_peer) 8566da8fa4e3SBjoern A. Zeeb { 8567da8fa4e3SBjoern A. Zeeb u32 len = *length; 8568da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8569da8fa4e3SBjoern A. Zeeb 8570da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %pM\n", 8571da8fa4e3SBjoern A. Zeeb "Peer MAC address", peer->peer_macaddr); 8572da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8573da8fa4e3SBjoern A. Zeeb "Peer RSSI", peer->peer_rssi); 8574da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8575da8fa4e3SBjoern A. Zeeb "Peer TX rate", peer->peer_tx_rate); 8576da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8577da8fa4e3SBjoern A. Zeeb "Peer RX rate", peer->peer_rx_rate); 8578da8fa4e3SBjoern A. Zeeb if (!extended_peer) 8579da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %llu\n", 8580da8fa4e3SBjoern A. Zeeb "Peer RX duration", peer->rx_duration); 8581da8fa4e3SBjoern A. Zeeb 8582da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8583da8fa4e3SBjoern A. Zeeb *length = len; 8584da8fa4e3SBjoern A. Zeeb } 8585da8fa4e3SBjoern A. Zeeb 8586da8fa4e3SBjoern A. Zeeb static void 8587da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_extd_peer_stats_fill(const struct ath10k_fw_extd_stats_peer *peer, 8588da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8589da8fa4e3SBjoern A. Zeeb { 8590da8fa4e3SBjoern A. Zeeb u32 len = *length; 8591da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8592da8fa4e3SBjoern A. Zeeb 8593da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %pM\n", 8594da8fa4e3SBjoern A. Zeeb "Peer MAC address", peer->peer_macaddr); 8595da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %llu\n", 8596da8fa4e3SBjoern A. Zeeb "Peer RX duration", peer->rx_duration); 8597da8fa4e3SBjoern A. Zeeb } 8598da8fa4e3SBjoern A. Zeeb 8599da8fa4e3SBjoern A. Zeeb void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar, 8600da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *fw_stats, 8601da8fa4e3SBjoern A. Zeeb char *buf) 8602da8fa4e3SBjoern A. Zeeb { 8603da8fa4e3SBjoern A. Zeeb u32 len = 0; 8604da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8605da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_pdev *pdev; 8606da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_vdev *vdev; 8607da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_peer *peer; 8608da8fa4e3SBjoern A. Zeeb size_t num_peers; 8609da8fa4e3SBjoern A. Zeeb size_t num_vdevs; 8610da8fa4e3SBjoern A. Zeeb 8611da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 8612da8fa4e3SBjoern A. Zeeb 8613da8fa4e3SBjoern A. Zeeb pdev = list_first_entry_or_null(&fw_stats->pdevs, 8614da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev, list); 8615da8fa4e3SBjoern A. Zeeb if (!pdev) { 8616da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to get pdev stats\n"); 8617da8fa4e3SBjoern A. Zeeb goto unlock; 8618da8fa4e3SBjoern A. Zeeb } 8619da8fa4e3SBjoern A. Zeeb 8620da8fa4e3SBjoern A. Zeeb num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers); 8621da8fa4e3SBjoern A. Zeeb num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs); 8622da8fa4e3SBjoern A. Zeeb 8623da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len); 8624da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len); 8625da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len); 8626da8fa4e3SBjoern A. Zeeb 8627da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8628da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8629da8fa4e3SBjoern A. Zeeb "ath10k VDEV stats", num_vdevs); 8630da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8631da8fa4e3SBjoern A. Zeeb "================="); 8632da8fa4e3SBjoern A. Zeeb 8633da8fa4e3SBjoern A. Zeeb list_for_each_entry(vdev, &fw_stats->vdevs, list) { 8634da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len); 8635da8fa4e3SBjoern A. Zeeb } 8636da8fa4e3SBjoern A. Zeeb 8637da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8638da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8639da8fa4e3SBjoern A. Zeeb "ath10k PEER stats", num_peers); 8640da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8641da8fa4e3SBjoern A. Zeeb "================="); 8642da8fa4e3SBjoern A. Zeeb 8643da8fa4e3SBjoern A. Zeeb list_for_each_entry(peer, &fw_stats->peers, list) { 8644da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_peer_stats_fill(peer, buf, &len, 8645da8fa4e3SBjoern A. Zeeb fw_stats->extended); 8646da8fa4e3SBjoern A. Zeeb } 8647da8fa4e3SBjoern A. Zeeb 8648da8fa4e3SBjoern A. Zeeb unlock: 8649da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 8650da8fa4e3SBjoern A. Zeeb 8651da8fa4e3SBjoern A. Zeeb if (len >= buf_len) 8652da8fa4e3SBjoern A. Zeeb buf[len - 1] = 0; 8653da8fa4e3SBjoern A. Zeeb else 8654da8fa4e3SBjoern A. Zeeb buf[len] = 0; 8655da8fa4e3SBjoern A. Zeeb } 8656da8fa4e3SBjoern A. Zeeb 8657da8fa4e3SBjoern A. Zeeb void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar, 8658da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *fw_stats, 8659da8fa4e3SBjoern A. Zeeb char *buf) 8660da8fa4e3SBjoern A. Zeeb { 8661da8fa4e3SBjoern A. Zeeb unsigned int len = 0; 8662da8fa4e3SBjoern A. Zeeb unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE; 8663da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_pdev *pdev; 8664da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_vdev *vdev; 8665da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_peer *peer; 8666da8fa4e3SBjoern A. Zeeb size_t num_peers; 8667da8fa4e3SBjoern A. Zeeb size_t num_vdevs; 8668da8fa4e3SBjoern A. Zeeb 8669da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 8670da8fa4e3SBjoern A. Zeeb 8671da8fa4e3SBjoern A. Zeeb pdev = list_first_entry_or_null(&fw_stats->pdevs, 8672da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev, list); 8673da8fa4e3SBjoern A. Zeeb if (!pdev) { 8674da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to get pdev stats\n"); 8675da8fa4e3SBjoern A. Zeeb goto unlock; 8676da8fa4e3SBjoern A. Zeeb } 8677da8fa4e3SBjoern A. Zeeb 8678da8fa4e3SBjoern A. Zeeb num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers); 8679da8fa4e3SBjoern A. Zeeb num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs); 8680da8fa4e3SBjoern A. Zeeb 8681da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len); 8682da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len); 8683da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len); 8684da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len); 8685da8fa4e3SBjoern A. Zeeb 8686da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8687da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8688da8fa4e3SBjoern A. Zeeb "ath10k VDEV stats", num_vdevs); 8689da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8690da8fa4e3SBjoern A. Zeeb "================="); 8691da8fa4e3SBjoern A. Zeeb 8692da8fa4e3SBjoern A. Zeeb list_for_each_entry(vdev, &fw_stats->vdevs, list) { 8693da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len); 8694da8fa4e3SBjoern A. Zeeb } 8695da8fa4e3SBjoern A. Zeeb 8696da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8697da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8698da8fa4e3SBjoern A. Zeeb "ath10k PEER stats", num_peers); 8699da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8700da8fa4e3SBjoern A. Zeeb "================="); 8701da8fa4e3SBjoern A. Zeeb 8702da8fa4e3SBjoern A. Zeeb list_for_each_entry(peer, &fw_stats->peers, list) { 8703da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_peer_stats_fill(peer, buf, &len, 8704da8fa4e3SBjoern A. Zeeb fw_stats->extended); 8705da8fa4e3SBjoern A. Zeeb } 8706da8fa4e3SBjoern A. Zeeb 8707da8fa4e3SBjoern A. Zeeb unlock: 8708da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 8709da8fa4e3SBjoern A. Zeeb 8710da8fa4e3SBjoern A. Zeeb if (len >= buf_len) 8711da8fa4e3SBjoern A. Zeeb buf[len - 1] = 0; 8712da8fa4e3SBjoern A. Zeeb else 8713da8fa4e3SBjoern A. Zeeb buf[len] = 0; 8714da8fa4e3SBjoern A. Zeeb } 8715da8fa4e3SBjoern A. Zeeb 8716da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8717da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable, 8718da8fa4e3SBjoern A. Zeeb u32 detect_level, u32 detect_margin) 8719da8fa4e3SBjoern A. Zeeb { 8720da8fa4e3SBjoern A. Zeeb struct wmi_pdev_set_adaptive_cca_params *cmd; 8721da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8722da8fa4e3SBjoern A. Zeeb 8723da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8724da8fa4e3SBjoern A. Zeeb if (!skb) 8725da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8726da8fa4e3SBjoern A. Zeeb 8727da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data; 8728da8fa4e3SBjoern A. Zeeb cmd->enable = __cpu_to_le32(enable); 8729da8fa4e3SBjoern A. Zeeb cmd->cca_detect_level = __cpu_to_le32(detect_level); 8730da8fa4e3SBjoern A. Zeeb cmd->cca_detect_margin = __cpu_to_le32(detect_margin); 8731da8fa4e3SBjoern A. Zeeb 8732da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8733da8fa4e3SBjoern A. Zeeb "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n", 8734da8fa4e3SBjoern A. Zeeb enable, detect_level, detect_margin); 8735da8fa4e3SBjoern A. Zeeb return skb; 8736da8fa4e3SBjoern A. Zeeb } 8737da8fa4e3SBjoern A. Zeeb 8738da8fa4e3SBjoern A. Zeeb static void 8739da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_vdev_stats_extd_fill(const struct ath10k_fw_stats_vdev_extd *vdev, 8740da8fa4e3SBjoern A. Zeeb char *buf, u32 *length) 8741da8fa4e3SBjoern A. Zeeb { 8742da8fa4e3SBjoern A. Zeeb u32 len = *length; 8743da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8744da8fa4e3SBjoern A. Zeeb u32 val; 8745da8fa4e3SBjoern A. Zeeb 8746da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8747da8fa4e3SBjoern A. Zeeb "vdev id", vdev->vdev_id); 8748da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8749da8fa4e3SBjoern A. Zeeb "ppdu aggr count", vdev->ppdu_aggr_cnt); 8750da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8751da8fa4e3SBjoern A. Zeeb "ppdu noack", vdev->ppdu_noack); 8752da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8753da8fa4e3SBjoern A. Zeeb "mpdu queued", vdev->mpdu_queued); 8754da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8755da8fa4e3SBjoern A. Zeeb "ppdu nonaggr count", vdev->ppdu_nonaggr_cnt); 8756da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8757da8fa4e3SBjoern A. Zeeb "mpdu sw requeued", vdev->mpdu_sw_requeued); 8758da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8759da8fa4e3SBjoern A. Zeeb "mpdu success retry", vdev->mpdu_suc_retry); 8760da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8761da8fa4e3SBjoern A. Zeeb "mpdu success multitry", vdev->mpdu_suc_multitry); 8762da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8763da8fa4e3SBjoern A. Zeeb "mpdu fail retry", vdev->mpdu_fail_retry); 8764da8fa4e3SBjoern A. Zeeb val = vdev->tx_ftm_suc; 8765da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8766da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8767da8fa4e3SBjoern A. Zeeb "tx ftm success", 8768da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8769da8fa4e3SBjoern A. Zeeb val = vdev->tx_ftm_suc_retry; 8770da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8771da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8772da8fa4e3SBjoern A. Zeeb "tx ftm success retry", 8773da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8774da8fa4e3SBjoern A. Zeeb val = vdev->tx_ftm_fail; 8775da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8776da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8777da8fa4e3SBjoern A. Zeeb "tx ftm fail", 8778da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8779da8fa4e3SBjoern A. Zeeb val = vdev->rx_ftmr_cnt; 8780da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8781da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8782da8fa4e3SBjoern A. Zeeb "rx ftm request count", 8783da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8784da8fa4e3SBjoern A. Zeeb val = vdev->rx_ftmr_dup_cnt; 8785da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8786da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8787da8fa4e3SBjoern A. Zeeb "rx ftm request dup count", 8788da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8789da8fa4e3SBjoern A. Zeeb val = vdev->rx_iftmr_cnt; 8790da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8791da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8792da8fa4e3SBjoern A. Zeeb "rx initial ftm req count", 8793da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8794da8fa4e3SBjoern A. Zeeb val = vdev->rx_iftmr_dup_cnt; 8795da8fa4e3SBjoern A. Zeeb if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 8796da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8797da8fa4e3SBjoern A. Zeeb "rx initial ftm req dup cnt", 8798da8fa4e3SBjoern A. Zeeb MS(val, WMI_VDEV_STATS_FTM_COUNT)); 8799da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8800da8fa4e3SBjoern A. Zeeb 8801da8fa4e3SBjoern A. Zeeb *length = len; 8802da8fa4e3SBjoern A. Zeeb } 8803da8fa4e3SBjoern A. Zeeb 8804da8fa4e3SBjoern A. Zeeb void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar, 8805da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats *fw_stats, 8806da8fa4e3SBjoern A. Zeeb char *buf) 8807da8fa4e3SBjoern A. Zeeb { 8808da8fa4e3SBjoern A. Zeeb u32 len = 0; 8809da8fa4e3SBjoern A. Zeeb u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8810da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_pdev *pdev; 8811da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_vdev_extd *vdev; 8812da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_stats_peer *peer; 8813da8fa4e3SBjoern A. Zeeb const struct ath10k_fw_extd_stats_peer *extd_peer; 8814da8fa4e3SBjoern A. Zeeb size_t num_peers; 8815da8fa4e3SBjoern A. Zeeb size_t num_vdevs; 8816da8fa4e3SBjoern A. Zeeb 8817da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 8818da8fa4e3SBjoern A. Zeeb 8819da8fa4e3SBjoern A. Zeeb pdev = list_first_entry_or_null(&fw_stats->pdevs, 8820da8fa4e3SBjoern A. Zeeb struct ath10k_fw_stats_pdev, list); 8821da8fa4e3SBjoern A. Zeeb if (!pdev) { 8822da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to get pdev stats\n"); 8823da8fa4e3SBjoern A. Zeeb goto unlock; 8824da8fa4e3SBjoern A. Zeeb } 8825da8fa4e3SBjoern A. Zeeb 8826da8fa4e3SBjoern A. Zeeb num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers); 8827da8fa4e3SBjoern A. Zeeb num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs); 8828da8fa4e3SBjoern A. Zeeb 8829da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len); 8830da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len); 8831da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len); 8832da8fa4e3SBjoern A. Zeeb 8833da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8834da8fa4e3SBjoern A. Zeeb "HW paused", pdev->hw_paused); 8835da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8836da8fa4e3SBjoern A. Zeeb "Seqs posted", pdev->seq_posted); 8837da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8838da8fa4e3SBjoern A. Zeeb "Seqs failed queueing", pdev->seq_failed_queueing); 8839da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8840da8fa4e3SBjoern A. Zeeb "Seqs completed", pdev->seq_completed); 8841da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8842da8fa4e3SBjoern A. Zeeb "Seqs restarted", pdev->seq_restarted); 8843da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8844da8fa4e3SBjoern A. Zeeb "MU Seqs posted", pdev->mu_seq_posted); 8845da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8846da8fa4e3SBjoern A. Zeeb "MPDUs SW flushed", pdev->mpdus_sw_flush); 8847da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8848da8fa4e3SBjoern A. Zeeb "MPDUs HW filtered", pdev->mpdus_hw_filter); 8849da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8850da8fa4e3SBjoern A. Zeeb "MPDUs truncated", pdev->mpdus_truncated); 8851da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8852da8fa4e3SBjoern A. Zeeb "MPDUs receive no ACK", pdev->mpdus_ack_failed); 8853da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8854da8fa4e3SBjoern A. Zeeb "MPDUs expired", pdev->mpdus_expired); 8855da8fa4e3SBjoern A. Zeeb 8856da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len); 8857da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8858da8fa4e3SBjoern A. Zeeb "Num Rx Overflow errors", pdev->rx_ovfl_errs); 8859da8fa4e3SBjoern A. Zeeb 8860da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8861da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8862da8fa4e3SBjoern A. Zeeb "ath10k VDEV stats", num_vdevs); 8863da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8864da8fa4e3SBjoern A. Zeeb "================="); 8865da8fa4e3SBjoern A. Zeeb list_for_each_entry(vdev, &fw_stats->vdevs, list) { 8866da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_vdev_stats_extd_fill(vdev, buf, &len); 8867da8fa4e3SBjoern A. Zeeb } 8868da8fa4e3SBjoern A. Zeeb 8869da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "\n"); 8870da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8871da8fa4e3SBjoern A. Zeeb "ath10k PEER stats", num_peers); 8872da8fa4e3SBjoern A. Zeeb len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8873da8fa4e3SBjoern A. Zeeb "================="); 8874da8fa4e3SBjoern A. Zeeb 8875da8fa4e3SBjoern A. Zeeb list_for_each_entry(peer, &fw_stats->peers, list) { 8876da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_peer_stats_fill(peer, buf, &len, 8877da8fa4e3SBjoern A. Zeeb fw_stats->extended); 8878da8fa4e3SBjoern A. Zeeb } 8879da8fa4e3SBjoern A. Zeeb 8880da8fa4e3SBjoern A. Zeeb if (fw_stats->extended) { 8881da8fa4e3SBjoern A. Zeeb list_for_each_entry(extd_peer, &fw_stats->peers_extd, list) { 8882da8fa4e3SBjoern A. Zeeb ath10k_wmi_fw_extd_peer_stats_fill(extd_peer, buf, 8883da8fa4e3SBjoern A. Zeeb &len); 8884da8fa4e3SBjoern A. Zeeb } 8885da8fa4e3SBjoern A. Zeeb } 8886da8fa4e3SBjoern A. Zeeb 8887da8fa4e3SBjoern A. Zeeb unlock: 8888da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 8889da8fa4e3SBjoern A. Zeeb 8890da8fa4e3SBjoern A. Zeeb if (len >= buf_len) 8891da8fa4e3SBjoern A. Zeeb buf[len - 1] = 0; 8892da8fa4e3SBjoern A. Zeeb else 8893da8fa4e3SBjoern A. Zeeb buf[len] = 0; 8894da8fa4e3SBjoern A. Zeeb } 8895da8fa4e3SBjoern A. Zeeb 8896da8fa4e3SBjoern A. Zeeb int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar, 8897da8fa4e3SBjoern A. Zeeb enum wmi_vdev_subtype subtype) 8898da8fa4e3SBjoern A. Zeeb { 8899da8fa4e3SBjoern A. Zeeb switch (subtype) { 8900da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_NONE: 8901da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_LEGACY_NONE; 8902da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_DEVICE: 8903da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV; 8904da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_CLIENT: 8905da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI; 8906da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_GO: 8907da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO; 8908da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_PROXY_STA: 8909da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA; 8910da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_MESH_11S: 8911da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_MESH_NON_11S: 8912da8fa4e3SBjoern A. Zeeb return -ENOTSUPP; 8913da8fa4e3SBjoern A. Zeeb } 8914da8fa4e3SBjoern A. Zeeb return -ENOTSUPP; 8915da8fa4e3SBjoern A. Zeeb } 8916da8fa4e3SBjoern A. Zeeb 8917da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar, 8918da8fa4e3SBjoern A. Zeeb enum wmi_vdev_subtype subtype) 8919da8fa4e3SBjoern A. Zeeb { 8920da8fa4e3SBjoern A. Zeeb switch (subtype) { 8921da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_NONE: 8922da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_2_4_NONE; 8923da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_DEVICE: 8924da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV; 8925da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_CLIENT: 8926da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI; 8927da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_GO: 8928da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO; 8929da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_PROXY_STA: 8930da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA; 8931da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_MESH_11S: 8932da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S; 8933da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_MESH_NON_11S: 8934da8fa4e3SBjoern A. Zeeb return -ENOTSUPP; 8935da8fa4e3SBjoern A. Zeeb } 8936da8fa4e3SBjoern A. Zeeb return -ENOTSUPP; 8937da8fa4e3SBjoern A. Zeeb } 8938da8fa4e3SBjoern A. Zeeb 8939da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar, 8940da8fa4e3SBjoern A. Zeeb enum wmi_vdev_subtype subtype) 8941da8fa4e3SBjoern A. Zeeb { 8942da8fa4e3SBjoern A. Zeeb switch (subtype) { 8943da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_NONE: 8944da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_NONE; 8945da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_DEVICE: 8946da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_P2P_DEV; 8947da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_CLIENT: 8948da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_P2P_CLI; 8949da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_P2P_GO: 8950da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_P2P_GO; 8951da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_PROXY_STA: 8952da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_PROXY_STA; 8953da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_MESH_11S: 8954da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_MESH_11S; 8955da8fa4e3SBjoern A. Zeeb case WMI_VDEV_SUBTYPE_MESH_NON_11S: 8956da8fa4e3SBjoern A. Zeeb return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S; 8957da8fa4e3SBjoern A. Zeeb } 8958da8fa4e3SBjoern A. Zeeb return -ENOTSUPP; 8959da8fa4e3SBjoern A. Zeeb } 8960da8fa4e3SBjoern A. Zeeb 8961da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8962da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar, 8963da8fa4e3SBjoern A. Zeeb enum wmi_host_platform_type type, 8964da8fa4e3SBjoern A. Zeeb u32 fw_feature_bitmap) 8965da8fa4e3SBjoern A. Zeeb { 8966da8fa4e3SBjoern A. Zeeb struct wmi_ext_resource_config_10_4_cmd *cmd; 8967da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 8968da8fa4e3SBjoern A. Zeeb u32 num_tdls_sleep_sta = 0; 8969da8fa4e3SBjoern A. Zeeb 8970da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8971da8fa4e3SBjoern A. Zeeb if (!skb) 8972da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 8973da8fa4e3SBjoern A. Zeeb 8974da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, ar->wmi.svc_map)) 8975da8fa4e3SBjoern A. Zeeb num_tdls_sleep_sta = TARGET_10_4_NUM_TDLS_SLEEP_STA; 8976da8fa4e3SBjoern A. Zeeb 8977da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_ext_resource_config_10_4_cmd *)skb->data; 8978da8fa4e3SBjoern A. Zeeb cmd->host_platform_config = __cpu_to_le32(type); 8979da8fa4e3SBjoern A. Zeeb cmd->fw_feature_bitmap = __cpu_to_le32(fw_feature_bitmap); 8980da8fa4e3SBjoern A. Zeeb cmd->wlan_gpio_priority = __cpu_to_le32(ar->coex_gpio_pin); 8981da8fa4e3SBjoern A. Zeeb cmd->coex_version = __cpu_to_le32(WMI_NO_COEX_VERSION_SUPPORT); 8982da8fa4e3SBjoern A. Zeeb cmd->coex_gpio_pin1 = __cpu_to_le32(-1); 8983da8fa4e3SBjoern A. Zeeb cmd->coex_gpio_pin2 = __cpu_to_le32(-1); 8984da8fa4e3SBjoern A. Zeeb cmd->coex_gpio_pin3 = __cpu_to_le32(-1); 8985da8fa4e3SBjoern A. Zeeb cmd->num_tdls_vdevs = __cpu_to_le32(TARGET_10_4_NUM_TDLS_VDEVS); 8986da8fa4e3SBjoern A. Zeeb cmd->num_tdls_conn_table_entries = __cpu_to_le32(20); 8987da8fa4e3SBjoern A. Zeeb cmd->max_tdls_concurrent_sleep_sta = __cpu_to_le32(num_tdls_sleep_sta); 8988da8fa4e3SBjoern A. Zeeb cmd->max_tdls_concurrent_buffer_sta = 8989da8fa4e3SBjoern A. Zeeb __cpu_to_le32(TARGET_10_4_NUM_TDLS_BUFFER_STA); 8990da8fa4e3SBjoern A. Zeeb 8991da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 8992da8fa4e3SBjoern A. Zeeb "wmi ext resource config host type %d firmware feature bitmap %08x\n", 8993da8fa4e3SBjoern A. Zeeb type, fw_feature_bitmap); 8994da8fa4e3SBjoern A. Zeeb return skb; 8995da8fa4e3SBjoern A. Zeeb } 8996da8fa4e3SBjoern A. Zeeb 8997da8fa4e3SBjoern A. Zeeb static struct sk_buff * 8998da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id, 8999da8fa4e3SBjoern A. Zeeb enum wmi_tdls_state state) 9000da8fa4e3SBjoern A. Zeeb { 9001da8fa4e3SBjoern A. Zeeb struct wmi_10_4_tdls_set_state_cmd *cmd; 9002da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9003da8fa4e3SBjoern A. Zeeb u32 options = 0; 9004da8fa4e3SBjoern A. Zeeb 9005da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 9006da8fa4e3SBjoern A. Zeeb if (!skb) 9007da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9008da8fa4e3SBjoern A. Zeeb 9009da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) && 9010da8fa4e3SBjoern A. Zeeb state == WMI_TDLS_ENABLE_ACTIVE) 9011da8fa4e3SBjoern A. Zeeb state = WMI_TDLS_ENABLE_PASSIVE; 9012da8fa4e3SBjoern A. Zeeb 9013da8fa4e3SBjoern A. Zeeb if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) 9014da8fa4e3SBjoern A. Zeeb options |= WMI_TDLS_BUFFER_STA_EN; 9015da8fa4e3SBjoern A. Zeeb 9016da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_10_4_tdls_set_state_cmd *)skb->data; 9017da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(vdev_id); 9018da8fa4e3SBjoern A. Zeeb cmd->state = __cpu_to_le32(state); 9019da8fa4e3SBjoern A. Zeeb cmd->notification_interval_ms = __cpu_to_le32(5000); 9020da8fa4e3SBjoern A. Zeeb cmd->tx_discovery_threshold = __cpu_to_le32(100); 9021da8fa4e3SBjoern A. Zeeb cmd->tx_teardown_threshold = __cpu_to_le32(5); 9022da8fa4e3SBjoern A. Zeeb cmd->rssi_teardown_threshold = __cpu_to_le32(-75); 9023da8fa4e3SBjoern A. Zeeb cmd->rssi_delta = __cpu_to_le32(-20); 9024da8fa4e3SBjoern A. Zeeb cmd->tdls_options = __cpu_to_le32(options); 9025da8fa4e3SBjoern A. Zeeb cmd->tdls_peer_traffic_ind_window = __cpu_to_le32(2); 9026da8fa4e3SBjoern A. Zeeb cmd->tdls_peer_traffic_response_timeout_ms = __cpu_to_le32(5000); 9027da8fa4e3SBjoern A. Zeeb cmd->tdls_puapsd_mask = __cpu_to_le32(0xf); 9028da8fa4e3SBjoern A. Zeeb cmd->tdls_puapsd_inactivity_time_ms = __cpu_to_le32(0); 9029da8fa4e3SBjoern A. Zeeb cmd->tdls_puapsd_rx_frame_threshold = __cpu_to_le32(10); 9030da8fa4e3SBjoern A. Zeeb cmd->teardown_notification_ms = __cpu_to_le32(10); 9031da8fa4e3SBjoern A. Zeeb cmd->tdls_peer_kickout_threshold = __cpu_to_le32(96); 9032da8fa4e3SBjoern A. Zeeb 9033da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi update fw tdls state %d for vdev %i\n", 9034da8fa4e3SBjoern A. Zeeb state, vdev_id); 9035da8fa4e3SBjoern A. Zeeb return skb; 9036da8fa4e3SBjoern A. Zeeb } 9037da8fa4e3SBjoern A. Zeeb 9038da8fa4e3SBjoern A. Zeeb static u32 ath10k_wmi_prepare_peer_qos(u8 uapsd_queues, u8 sp) 9039da8fa4e3SBjoern A. Zeeb { 9040da8fa4e3SBjoern A. Zeeb u32 peer_qos = 0; 9041da8fa4e3SBjoern A. Zeeb 9042da8fa4e3SBjoern A. Zeeb if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 9043da8fa4e3SBjoern A. Zeeb peer_qos |= WMI_TDLS_PEER_QOS_AC_VO; 9044da8fa4e3SBjoern A. Zeeb if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 9045da8fa4e3SBjoern A. Zeeb peer_qos |= WMI_TDLS_PEER_QOS_AC_VI; 9046da8fa4e3SBjoern A. Zeeb if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 9047da8fa4e3SBjoern A. Zeeb peer_qos |= WMI_TDLS_PEER_QOS_AC_BK; 9048da8fa4e3SBjoern A. Zeeb if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 9049da8fa4e3SBjoern A. Zeeb peer_qos |= WMI_TDLS_PEER_QOS_AC_BE; 9050da8fa4e3SBjoern A. Zeeb 9051da8fa4e3SBjoern A. Zeeb peer_qos |= SM(sp, WMI_TDLS_PEER_SP); 9052da8fa4e3SBjoern A. Zeeb 9053da8fa4e3SBjoern A. Zeeb return peer_qos; 9054da8fa4e3SBjoern A. Zeeb } 9055da8fa4e3SBjoern A. Zeeb 9056da8fa4e3SBjoern A. Zeeb static struct sk_buff * 9057da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param) 9058da8fa4e3SBjoern A. Zeeb { 9059da8fa4e3SBjoern A. Zeeb struct wmi_pdev_get_tpc_table_cmd *cmd; 9060da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9061da8fa4e3SBjoern A. Zeeb 9062da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 9063da8fa4e3SBjoern A. Zeeb if (!skb) 9064da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9065da8fa4e3SBjoern A. Zeeb 9066da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_get_tpc_table_cmd *)skb->data; 9067da8fa4e3SBjoern A. Zeeb cmd->param = __cpu_to_le32(param); 9068da8fa4e3SBjoern A. Zeeb 9069da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9070da8fa4e3SBjoern A. Zeeb "wmi pdev get tpc table param:%d\n", param); 9071da8fa4e3SBjoern A. Zeeb return skb; 9072da8fa4e3SBjoern A. Zeeb } 9073da8fa4e3SBjoern A. Zeeb 9074da8fa4e3SBjoern A. Zeeb static struct sk_buff * 9075da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_gen_tdls_peer_update(struct ath10k *ar, 9076da8fa4e3SBjoern A. Zeeb const struct wmi_tdls_peer_update_cmd_arg *arg, 9077da8fa4e3SBjoern A. Zeeb const struct wmi_tdls_peer_capab_arg *cap, 9078da8fa4e3SBjoern A. Zeeb const struct wmi_channel_arg *chan_arg) 9079da8fa4e3SBjoern A. Zeeb { 9080da8fa4e3SBjoern A. Zeeb struct wmi_10_4_tdls_peer_update_cmd *cmd; 9081da8fa4e3SBjoern A. Zeeb struct wmi_tdls_peer_capabilities *peer_cap; 9082da8fa4e3SBjoern A. Zeeb struct wmi_channel *chan; 9083da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9084da8fa4e3SBjoern A. Zeeb u32 peer_qos; 9085da8fa4e3SBjoern A. Zeeb int len, chan_len; 9086da8fa4e3SBjoern A. Zeeb int i; 9087da8fa4e3SBjoern A. Zeeb 9088da8fa4e3SBjoern A. Zeeb /* tdls peer update cmd has place holder for one channel*/ 9089da8fa4e3SBjoern A. Zeeb chan_len = cap->peer_chan_len ? (cap->peer_chan_len - 1) : 0; 9090da8fa4e3SBjoern A. Zeeb 9091da8fa4e3SBjoern A. Zeeb len = sizeof(*cmd) + chan_len * sizeof(*chan); 9092da8fa4e3SBjoern A. Zeeb 9093da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, len); 9094da8fa4e3SBjoern A. Zeeb if (!skb) 9095da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9096da8fa4e3SBjoern A. Zeeb 9097da8fa4e3SBjoern A. Zeeb memset(skb->data, 0, sizeof(*cmd)); 9098da8fa4e3SBjoern A. Zeeb 9099da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_10_4_tdls_peer_update_cmd *)skb->data; 9100da8fa4e3SBjoern A. Zeeb cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 9101da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, arg->addr); 9102da8fa4e3SBjoern A. Zeeb cmd->peer_state = __cpu_to_le32(arg->peer_state); 9103da8fa4e3SBjoern A. Zeeb 9104da8fa4e3SBjoern A. Zeeb peer_qos = ath10k_wmi_prepare_peer_qos(cap->peer_uapsd_queues, 9105da8fa4e3SBjoern A. Zeeb cap->peer_max_sp); 9106da8fa4e3SBjoern A. Zeeb 9107da8fa4e3SBjoern A. Zeeb peer_cap = &cmd->peer_capab; 9108da8fa4e3SBjoern A. Zeeb peer_cap->peer_qos = __cpu_to_le32(peer_qos); 9109da8fa4e3SBjoern A. Zeeb peer_cap->buff_sta_support = __cpu_to_le32(cap->buff_sta_support); 9110da8fa4e3SBjoern A. Zeeb peer_cap->off_chan_support = __cpu_to_le32(cap->off_chan_support); 9111da8fa4e3SBjoern A. Zeeb peer_cap->peer_curr_operclass = __cpu_to_le32(cap->peer_curr_operclass); 9112da8fa4e3SBjoern A. Zeeb peer_cap->self_curr_operclass = __cpu_to_le32(cap->self_curr_operclass); 9113da8fa4e3SBjoern A. Zeeb peer_cap->peer_chan_len = __cpu_to_le32(cap->peer_chan_len); 9114da8fa4e3SBjoern A. Zeeb peer_cap->peer_operclass_len = __cpu_to_le32(cap->peer_operclass_len); 9115da8fa4e3SBjoern A. Zeeb 9116da8fa4e3SBjoern A. Zeeb for (i = 0; i < WMI_TDLS_MAX_SUPP_OPER_CLASSES; i++) 9117da8fa4e3SBjoern A. Zeeb peer_cap->peer_operclass[i] = cap->peer_operclass[i]; 9118da8fa4e3SBjoern A. Zeeb 9119da8fa4e3SBjoern A. Zeeb peer_cap->is_peer_responder = __cpu_to_le32(cap->is_peer_responder); 9120da8fa4e3SBjoern A. Zeeb peer_cap->pref_offchan_num = __cpu_to_le32(cap->pref_offchan_num); 9121da8fa4e3SBjoern A. Zeeb peer_cap->pref_offchan_bw = __cpu_to_le32(cap->pref_offchan_bw); 9122da8fa4e3SBjoern A. Zeeb 9123da8fa4e3SBjoern A. Zeeb for (i = 0; i < cap->peer_chan_len; i++) { 9124da8fa4e3SBjoern A. Zeeb chan = (struct wmi_channel *)&peer_cap->peer_chan_list[i]; 9125da8fa4e3SBjoern A. Zeeb ath10k_wmi_put_wmi_channel(ar, chan, &chan_arg[i]); 9126da8fa4e3SBjoern A. Zeeb } 9127da8fa4e3SBjoern A. Zeeb 9128da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9129da8fa4e3SBjoern A. Zeeb "wmi tdls peer update vdev %i state %d n_chans %u\n", 9130da8fa4e3SBjoern A. Zeeb arg->vdev_id, arg->peer_state, cap->peer_chan_len); 9131da8fa4e3SBjoern A. Zeeb return skb; 9132da8fa4e3SBjoern A. Zeeb } 9133da8fa4e3SBjoern A. Zeeb 9134da8fa4e3SBjoern A. Zeeb static struct sk_buff * 9135da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_gen_radar_found(struct ath10k *ar, 9136da8fa4e3SBjoern A. Zeeb const struct ath10k_radar_found_info *arg) 9137da8fa4e3SBjoern A. Zeeb { 9138da8fa4e3SBjoern A. Zeeb struct wmi_radar_found_info *cmd; 9139da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9140da8fa4e3SBjoern A. Zeeb 9141da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 9142da8fa4e3SBjoern A. Zeeb if (!skb) 9143da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9144da8fa4e3SBjoern A. Zeeb 9145da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_radar_found_info *)skb->data; 9146da8fa4e3SBjoern A. Zeeb cmd->pri_min = __cpu_to_le32(arg->pri_min); 9147da8fa4e3SBjoern A. Zeeb cmd->pri_max = __cpu_to_le32(arg->pri_max); 9148da8fa4e3SBjoern A. Zeeb cmd->width_min = __cpu_to_le32(arg->width_min); 9149da8fa4e3SBjoern A. Zeeb cmd->width_max = __cpu_to_le32(arg->width_max); 9150da8fa4e3SBjoern A. Zeeb cmd->sidx_min = __cpu_to_le32(arg->sidx_min); 9151da8fa4e3SBjoern A. Zeeb cmd->sidx_max = __cpu_to_le32(arg->sidx_max); 9152da8fa4e3SBjoern A. Zeeb 9153da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9154da8fa4e3SBjoern A. Zeeb "wmi radar found pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n", 9155da8fa4e3SBjoern A. Zeeb arg->pri_min, arg->pri_max, arg->width_min, 9156da8fa4e3SBjoern A. Zeeb arg->width_max, arg->sidx_min, arg->sidx_max); 9157da8fa4e3SBjoern A. Zeeb return skb; 9158da8fa4e3SBjoern A. Zeeb } 9159da8fa4e3SBjoern A. Zeeb 9160da8fa4e3SBjoern A. Zeeb static struct sk_buff * 9161da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_gen_per_peer_per_tid_cfg(struct ath10k *ar, 9162da8fa4e3SBjoern A. Zeeb const struct wmi_per_peer_per_tid_cfg_arg *arg) 9163da8fa4e3SBjoern A. Zeeb { 9164da8fa4e3SBjoern A. Zeeb struct wmi_peer_per_tid_cfg_cmd *cmd; 9165da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9166da8fa4e3SBjoern A. Zeeb 9167da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 9168da8fa4e3SBjoern A. Zeeb if (!skb) 9169da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9170da8fa4e3SBjoern A. Zeeb 9171da8fa4e3SBjoern A. Zeeb memset(skb->data, 0, sizeof(*cmd)); 9172da8fa4e3SBjoern A. Zeeb 9173da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_peer_per_tid_cfg_cmd *)skb->data; 9174da8fa4e3SBjoern A. Zeeb cmd->vdev_id = cpu_to_le32(arg->vdev_id); 9175da8fa4e3SBjoern A. Zeeb ether_addr_copy(cmd->peer_macaddr.addr, arg->peer_macaddr.addr); 9176da8fa4e3SBjoern A. Zeeb cmd->tid = cpu_to_le32(arg->tid); 9177da8fa4e3SBjoern A. Zeeb cmd->ack_policy = cpu_to_le32(arg->ack_policy); 9178da8fa4e3SBjoern A. Zeeb cmd->aggr_control = cpu_to_le32(arg->aggr_control); 9179da8fa4e3SBjoern A. Zeeb cmd->rate_control = cpu_to_le32(arg->rate_ctrl); 9180da8fa4e3SBjoern A. Zeeb cmd->retry_count = cpu_to_le32(arg->retry_count); 9181da8fa4e3SBjoern A. Zeeb cmd->rcode_flags = cpu_to_le32(arg->rcode_flags); 9182da8fa4e3SBjoern A. Zeeb cmd->ext_tid_cfg_bitmap = cpu_to_le32(arg->ext_tid_cfg_bitmap); 9183da8fa4e3SBjoern A. Zeeb cmd->rtscts_ctrl = cpu_to_le32(arg->rtscts_ctrl); 9184da8fa4e3SBjoern A. Zeeb 9185da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9186da8fa4e3SBjoern A. Zeeb "wmi noack tid %d vdev id %d ack_policy %d aggr %u rate_ctrl %u rcflag %u retry_count %d rtscts %d ext_tid_cfg_bitmap %d mac_addr %pM\n", 9187da8fa4e3SBjoern A. Zeeb arg->tid, arg->vdev_id, arg->ack_policy, arg->aggr_control, 9188da8fa4e3SBjoern A. Zeeb arg->rate_ctrl, arg->rcode_flags, arg->retry_count, 9189da8fa4e3SBjoern A. Zeeb arg->rtscts_ctrl, arg->ext_tid_cfg_bitmap, arg->peer_macaddr.addr); 9190da8fa4e3SBjoern A. Zeeb return skb; 9191da8fa4e3SBjoern A. Zeeb } 9192da8fa4e3SBjoern A. Zeeb 9193da8fa4e3SBjoern A. Zeeb static struct sk_buff * 9194da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value) 9195da8fa4e3SBjoern A. Zeeb { 9196da8fa4e3SBjoern A. Zeeb struct wmi_echo_cmd *cmd; 9197da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9198da8fa4e3SBjoern A. Zeeb 9199da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 9200da8fa4e3SBjoern A. Zeeb if (!skb) 9201da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9202da8fa4e3SBjoern A. Zeeb 9203da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_echo_cmd *)skb->data; 9204da8fa4e3SBjoern A. Zeeb cmd->value = cpu_to_le32(value); 9205da8fa4e3SBjoern A. Zeeb 9206da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9207da8fa4e3SBjoern A. Zeeb "wmi echo value 0x%08x\n", value); 9208da8fa4e3SBjoern A. Zeeb return skb; 9209da8fa4e3SBjoern A. Zeeb } 9210da8fa4e3SBjoern A. Zeeb 9211da8fa4e3SBjoern A. Zeeb int 9212da8fa4e3SBjoern A. Zeeb ath10k_wmi_barrier(struct ath10k *ar) 9213da8fa4e3SBjoern A. Zeeb { 9214da8fa4e3SBjoern A. Zeeb int ret; 9215da8fa4e3SBjoern A. Zeeb int time_left; 9216da8fa4e3SBjoern A. Zeeb 9217da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 9218da8fa4e3SBjoern A. Zeeb reinit_completion(&ar->wmi.barrier); 9219da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 9220da8fa4e3SBjoern A. Zeeb 9221da8fa4e3SBjoern A. Zeeb ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID); 9222da8fa4e3SBjoern A. Zeeb if (ret) { 9223da8fa4e3SBjoern A. Zeeb ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret); 9224da8fa4e3SBjoern A. Zeeb return ret; 9225da8fa4e3SBjoern A. Zeeb } 9226da8fa4e3SBjoern A. Zeeb 9227da8fa4e3SBjoern A. Zeeb time_left = wait_for_completion_timeout(&ar->wmi.barrier, 9228da8fa4e3SBjoern A. Zeeb ATH10K_WMI_BARRIER_TIMEOUT_HZ); 9229da8fa4e3SBjoern A. Zeeb if (!time_left) 9230da8fa4e3SBjoern A. Zeeb return -ETIMEDOUT; 9231da8fa4e3SBjoern A. Zeeb 9232da8fa4e3SBjoern A. Zeeb return 0; 9233da8fa4e3SBjoern A. Zeeb } 9234da8fa4e3SBjoern A. Zeeb 9235da8fa4e3SBjoern A. Zeeb static struct sk_buff * 9236da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_2_4_op_gen_bb_timing(struct ath10k *ar, 9237da8fa4e3SBjoern A. Zeeb const struct wmi_bb_timing_cfg_arg *arg) 9238da8fa4e3SBjoern A. Zeeb { 9239da8fa4e3SBjoern A. Zeeb struct wmi_pdev_bb_timing_cfg_cmd *cmd; 9240da8fa4e3SBjoern A. Zeeb struct sk_buff *skb; 9241da8fa4e3SBjoern A. Zeeb 9242da8fa4e3SBjoern A. Zeeb skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 9243da8fa4e3SBjoern A. Zeeb if (!skb) 9244da8fa4e3SBjoern A. Zeeb return ERR_PTR(-ENOMEM); 9245da8fa4e3SBjoern A. Zeeb 9246da8fa4e3SBjoern A. Zeeb cmd = (struct wmi_pdev_bb_timing_cfg_cmd *)skb->data; 9247da8fa4e3SBjoern A. Zeeb cmd->bb_tx_timing = __cpu_to_le32(arg->bb_tx_timing); 9248da8fa4e3SBjoern A. Zeeb cmd->bb_xpa_timing = __cpu_to_le32(arg->bb_xpa_timing); 9249da8fa4e3SBjoern A. Zeeb 9250da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9251da8fa4e3SBjoern A. Zeeb "wmi pdev bb_tx_timing 0x%x bb_xpa_timing 0x%x\n", 9252da8fa4e3SBjoern A. Zeeb arg->bb_tx_timing, arg->bb_xpa_timing); 9253da8fa4e3SBjoern A. Zeeb return skb; 9254da8fa4e3SBjoern A. Zeeb } 9255da8fa4e3SBjoern A. Zeeb 9256da8fa4e3SBjoern A. Zeeb static const struct wmi_ops wmi_ops = { 9257da8fa4e3SBjoern A. Zeeb .rx = ath10k_wmi_op_rx, 9258da8fa4e3SBjoern A. Zeeb .map_svc = wmi_main_svc_map, 9259da8fa4e3SBjoern A. Zeeb 9260da8fa4e3SBjoern A. Zeeb .pull_scan = ath10k_wmi_op_pull_scan_ev, 9261da8fa4e3SBjoern A. Zeeb .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9262da8fa4e3SBjoern A. Zeeb .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9263da8fa4e3SBjoern A. Zeeb .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9264da8fa4e3SBjoern A. Zeeb .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9265da8fa4e3SBjoern A. Zeeb .pull_swba = ath10k_wmi_op_pull_swba_ev, 9266da8fa4e3SBjoern A. Zeeb .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9267da8fa4e3SBjoern A. Zeeb .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9268da8fa4e3SBjoern A. Zeeb .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev, 9269da8fa4e3SBjoern A. Zeeb .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9270da8fa4e3SBjoern A. Zeeb .pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats, 9271da8fa4e3SBjoern A. Zeeb .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 9272da8fa4e3SBjoern A. Zeeb .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9273da8fa4e3SBjoern A. Zeeb 9274da8fa4e3SBjoern A. Zeeb .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9275da8fa4e3SBjoern A. Zeeb .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9276da8fa4e3SBjoern A. Zeeb .gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd, 9277da8fa4e3SBjoern A. Zeeb .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9278da8fa4e3SBjoern A. Zeeb .gen_init = ath10k_wmi_op_gen_init, 9279da8fa4e3SBjoern A. Zeeb .gen_start_scan = ath10k_wmi_op_gen_start_scan, 9280da8fa4e3SBjoern A. Zeeb .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9281da8fa4e3SBjoern A. Zeeb .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9282da8fa4e3SBjoern A. Zeeb .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9283da8fa4e3SBjoern A. Zeeb .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9284da8fa4e3SBjoern A. Zeeb .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9285da8fa4e3SBjoern A. Zeeb .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9286da8fa4e3SBjoern A. Zeeb .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9287da8fa4e3SBjoern A. Zeeb .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9288da8fa4e3SBjoern A. Zeeb .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9289da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9290da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 9291da8fa4e3SBjoern A. Zeeb /* .gen_vdev_wmm_conf not implemented */ 9292da8fa4e3SBjoern A. Zeeb .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9293da8fa4e3SBjoern A. Zeeb .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9294da8fa4e3SBjoern A. Zeeb .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9295da8fa4e3SBjoern A. Zeeb .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9296da8fa4e3SBjoern A. Zeeb .gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc, 9297da8fa4e3SBjoern A. Zeeb .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9298da8fa4e3SBjoern A. Zeeb .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9299da8fa4e3SBjoern A. Zeeb .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9300da8fa4e3SBjoern A. Zeeb .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9301da8fa4e3SBjoern A. Zeeb .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9302da8fa4e3SBjoern A. Zeeb .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9303da8fa4e3SBjoern A. Zeeb .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9304da8fa4e3SBjoern A. Zeeb .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9305da8fa4e3SBjoern A. Zeeb .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9306da8fa4e3SBjoern A. Zeeb .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9307da8fa4e3SBjoern A. Zeeb .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9308da8fa4e3SBjoern A. Zeeb .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9309da8fa4e3SBjoern A. Zeeb .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9310da8fa4e3SBjoern A. Zeeb /* .gen_pdev_get_temperature not implemented */ 9311da8fa4e3SBjoern A. Zeeb .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 9312da8fa4e3SBjoern A. Zeeb .gen_addba_send = ath10k_wmi_op_gen_addba_send, 9313da8fa4e3SBjoern A. Zeeb .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 9314da8fa4e3SBjoern A. Zeeb .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9315da8fa4e3SBjoern A. Zeeb .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill, 9316da8fa4e3SBjoern A. Zeeb .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, 9317da8fa4e3SBjoern A. Zeeb .gen_echo = ath10k_wmi_op_gen_echo, 9318da8fa4e3SBjoern A. Zeeb /* .gen_bcn_tmpl not implemented */ 9319da8fa4e3SBjoern A. Zeeb /* .gen_prb_tmpl not implemented */ 9320da8fa4e3SBjoern A. Zeeb /* .gen_p2p_go_bcn_ie not implemented */ 9321da8fa4e3SBjoern A. Zeeb /* .gen_adaptive_qcs not implemented */ 9322da8fa4e3SBjoern A. Zeeb /* .gen_pdev_enable_adaptive_cca not implemented */ 9323da8fa4e3SBjoern A. Zeeb }; 9324da8fa4e3SBjoern A. Zeeb 9325da8fa4e3SBjoern A. Zeeb static const struct wmi_ops wmi_10_1_ops = { 9326da8fa4e3SBjoern A. Zeeb .rx = ath10k_wmi_10_1_op_rx, 9327da8fa4e3SBjoern A. Zeeb .map_svc = wmi_10x_svc_map, 9328da8fa4e3SBjoern A. Zeeb .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 9329da8fa4e3SBjoern A. Zeeb .pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats, 9330da8fa4e3SBjoern A. Zeeb .gen_init = ath10k_wmi_10_1_op_gen_init, 9331da8fa4e3SBjoern A. Zeeb .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9332da8fa4e3SBjoern A. Zeeb .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 9333da8fa4e3SBjoern A. Zeeb .gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc, 9334da8fa4e3SBjoern A. Zeeb /* .gen_pdev_get_temperature not implemented */ 9335da8fa4e3SBjoern A. Zeeb 9336da8fa4e3SBjoern A. Zeeb /* shared with main branch */ 9337da8fa4e3SBjoern A. Zeeb .pull_scan = ath10k_wmi_op_pull_scan_ev, 9338da8fa4e3SBjoern A. Zeeb .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9339da8fa4e3SBjoern A. Zeeb .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9340da8fa4e3SBjoern A. Zeeb .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9341da8fa4e3SBjoern A. Zeeb .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9342da8fa4e3SBjoern A. Zeeb .pull_swba = ath10k_wmi_op_pull_swba_ev, 9343da8fa4e3SBjoern A. Zeeb .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9344da8fa4e3SBjoern A. Zeeb .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9345da8fa4e3SBjoern A. Zeeb .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9346da8fa4e3SBjoern A. Zeeb .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 9347da8fa4e3SBjoern A. Zeeb .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9348da8fa4e3SBjoern A. Zeeb 9349da8fa4e3SBjoern A. Zeeb .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9350da8fa4e3SBjoern A. Zeeb .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9351da8fa4e3SBjoern A. Zeeb .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9352da8fa4e3SBjoern A. Zeeb .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9353da8fa4e3SBjoern A. Zeeb .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9354da8fa4e3SBjoern A. Zeeb .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9355da8fa4e3SBjoern A. Zeeb .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9356da8fa4e3SBjoern A. Zeeb .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9357da8fa4e3SBjoern A. Zeeb .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9358da8fa4e3SBjoern A. Zeeb .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9359da8fa4e3SBjoern A. Zeeb .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9360da8fa4e3SBjoern A. Zeeb .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9361da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9362da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 9363da8fa4e3SBjoern A. Zeeb /* .gen_vdev_wmm_conf not implemented */ 9364da8fa4e3SBjoern A. Zeeb .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9365da8fa4e3SBjoern A. Zeeb .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9366da8fa4e3SBjoern A. Zeeb .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9367da8fa4e3SBjoern A. Zeeb .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9368da8fa4e3SBjoern A. Zeeb .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9369da8fa4e3SBjoern A. Zeeb .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9370da8fa4e3SBjoern A. Zeeb .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9371da8fa4e3SBjoern A. Zeeb .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9372da8fa4e3SBjoern A. Zeeb .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9373da8fa4e3SBjoern A. Zeeb .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9374da8fa4e3SBjoern A. Zeeb .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9375da8fa4e3SBjoern A. Zeeb .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9376da8fa4e3SBjoern A. Zeeb .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9377da8fa4e3SBjoern A. Zeeb .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9378da8fa4e3SBjoern A. Zeeb .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9379da8fa4e3SBjoern A. Zeeb .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9380da8fa4e3SBjoern A. Zeeb .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9381da8fa4e3SBjoern A. Zeeb .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 9382da8fa4e3SBjoern A. Zeeb .gen_addba_send = ath10k_wmi_op_gen_addba_send, 9383da8fa4e3SBjoern A. Zeeb .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 9384da8fa4e3SBjoern A. Zeeb .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9385da8fa4e3SBjoern A. Zeeb .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, 9386da8fa4e3SBjoern A. Zeeb .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, 9387da8fa4e3SBjoern A. Zeeb .gen_echo = ath10k_wmi_op_gen_echo, 9388da8fa4e3SBjoern A. Zeeb /* .gen_bcn_tmpl not implemented */ 9389da8fa4e3SBjoern A. Zeeb /* .gen_prb_tmpl not implemented */ 9390da8fa4e3SBjoern A. Zeeb /* .gen_p2p_go_bcn_ie not implemented */ 9391da8fa4e3SBjoern A. Zeeb /* .gen_adaptive_qcs not implemented */ 9392da8fa4e3SBjoern A. Zeeb /* .gen_pdev_enable_adaptive_cca not implemented */ 9393da8fa4e3SBjoern A. Zeeb }; 9394da8fa4e3SBjoern A. Zeeb 9395da8fa4e3SBjoern A. Zeeb static const struct wmi_ops wmi_10_2_ops = { 9396da8fa4e3SBjoern A. Zeeb .rx = ath10k_wmi_10_2_op_rx, 9397da8fa4e3SBjoern A. Zeeb .pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats, 9398da8fa4e3SBjoern A. Zeeb .gen_init = ath10k_wmi_10_2_op_gen_init, 9399da8fa4e3SBjoern A. Zeeb .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc, 9400da8fa4e3SBjoern A. Zeeb /* .gen_pdev_get_temperature not implemented */ 9401da8fa4e3SBjoern A. Zeeb 9402da8fa4e3SBjoern A. Zeeb /* shared with 10.1 */ 9403da8fa4e3SBjoern A. Zeeb .map_svc = wmi_10x_svc_map, 9404da8fa4e3SBjoern A. Zeeb .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 9405da8fa4e3SBjoern A. Zeeb .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9406da8fa4e3SBjoern A. Zeeb .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 9407da8fa4e3SBjoern A. Zeeb .gen_echo = ath10k_wmi_op_gen_echo, 9408da8fa4e3SBjoern A. Zeeb 9409da8fa4e3SBjoern A. Zeeb .pull_scan = ath10k_wmi_op_pull_scan_ev, 9410da8fa4e3SBjoern A. Zeeb .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9411da8fa4e3SBjoern A. Zeeb .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9412da8fa4e3SBjoern A. Zeeb .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9413da8fa4e3SBjoern A. Zeeb .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9414da8fa4e3SBjoern A. Zeeb .pull_swba = ath10k_wmi_op_pull_swba_ev, 9415da8fa4e3SBjoern A. Zeeb .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9416da8fa4e3SBjoern A. Zeeb .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9417da8fa4e3SBjoern A. Zeeb .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9418da8fa4e3SBjoern A. Zeeb .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 9419da8fa4e3SBjoern A. Zeeb .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9420da8fa4e3SBjoern A. Zeeb 9421da8fa4e3SBjoern A. Zeeb .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9422da8fa4e3SBjoern A. Zeeb .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9423da8fa4e3SBjoern A. Zeeb .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9424da8fa4e3SBjoern A. Zeeb .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9425da8fa4e3SBjoern A. Zeeb .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9426da8fa4e3SBjoern A. Zeeb .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9427da8fa4e3SBjoern A. Zeeb .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9428da8fa4e3SBjoern A. Zeeb .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9429da8fa4e3SBjoern A. Zeeb .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9430da8fa4e3SBjoern A. Zeeb .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9431da8fa4e3SBjoern A. Zeeb .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9432da8fa4e3SBjoern A. Zeeb .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9433da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9434da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 9435da8fa4e3SBjoern A. Zeeb /* .gen_vdev_wmm_conf not implemented */ 9436da8fa4e3SBjoern A. Zeeb .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9437da8fa4e3SBjoern A. Zeeb .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9438da8fa4e3SBjoern A. Zeeb .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9439da8fa4e3SBjoern A. Zeeb .gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr, 9440da8fa4e3SBjoern A. Zeeb .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9441da8fa4e3SBjoern A. Zeeb .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9442da8fa4e3SBjoern A. Zeeb .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9443da8fa4e3SBjoern A. Zeeb .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9444da8fa4e3SBjoern A. Zeeb .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9445da8fa4e3SBjoern A. Zeeb .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9446da8fa4e3SBjoern A. Zeeb .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9447da8fa4e3SBjoern A. Zeeb .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9448da8fa4e3SBjoern A. Zeeb .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9449da8fa4e3SBjoern A. Zeeb .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9450da8fa4e3SBjoern A. Zeeb .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9451da8fa4e3SBjoern A. Zeeb .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9452da8fa4e3SBjoern A. Zeeb .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9453da8fa4e3SBjoern A. Zeeb .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9454da8fa4e3SBjoern A. Zeeb .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 9455da8fa4e3SBjoern A. Zeeb .gen_addba_send = ath10k_wmi_op_gen_addba_send, 9456da8fa4e3SBjoern A. Zeeb .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 9457da8fa4e3SBjoern A. Zeeb .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9458da8fa4e3SBjoern A. Zeeb .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, 9459da8fa4e3SBjoern A. Zeeb .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, 9460da8fa4e3SBjoern A. Zeeb /* .gen_pdev_enable_adaptive_cca not implemented */ 9461da8fa4e3SBjoern A. Zeeb }; 9462da8fa4e3SBjoern A. Zeeb 9463da8fa4e3SBjoern A. Zeeb static const struct wmi_ops wmi_10_2_4_ops = { 9464da8fa4e3SBjoern A. Zeeb .rx = ath10k_wmi_10_2_op_rx, 9465da8fa4e3SBjoern A. Zeeb .pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats, 9466da8fa4e3SBjoern A. Zeeb .gen_init = ath10k_wmi_10_2_op_gen_init, 9467da8fa4e3SBjoern A. Zeeb .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc, 9468da8fa4e3SBjoern A. Zeeb .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature, 9469da8fa4e3SBjoern A. Zeeb .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, 9470da8fa4e3SBjoern A. Zeeb 9471da8fa4e3SBjoern A. Zeeb /* shared with 10.1 */ 9472da8fa4e3SBjoern A. Zeeb .map_svc = wmi_10x_svc_map, 9473da8fa4e3SBjoern A. Zeeb .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 9474da8fa4e3SBjoern A. Zeeb .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9475da8fa4e3SBjoern A. Zeeb .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 9476da8fa4e3SBjoern A. Zeeb .gen_echo = ath10k_wmi_op_gen_echo, 9477da8fa4e3SBjoern A. Zeeb 9478da8fa4e3SBjoern A. Zeeb .pull_scan = ath10k_wmi_op_pull_scan_ev, 9479da8fa4e3SBjoern A. Zeeb .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9480da8fa4e3SBjoern A. Zeeb .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9481da8fa4e3SBjoern A. Zeeb .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9482da8fa4e3SBjoern A. Zeeb .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9483da8fa4e3SBjoern A. Zeeb .pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev, 9484da8fa4e3SBjoern A. Zeeb .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9485da8fa4e3SBjoern A. Zeeb .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9486da8fa4e3SBjoern A. Zeeb .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9487da8fa4e3SBjoern A. Zeeb .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 9488da8fa4e3SBjoern A. Zeeb .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9489da8fa4e3SBjoern A. Zeeb 9490da8fa4e3SBjoern A. Zeeb .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9491da8fa4e3SBjoern A. Zeeb .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9492da8fa4e3SBjoern A. Zeeb .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9493da8fa4e3SBjoern A. Zeeb .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9494da8fa4e3SBjoern A. Zeeb .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9495da8fa4e3SBjoern A. Zeeb .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9496da8fa4e3SBjoern A. Zeeb .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9497da8fa4e3SBjoern A. Zeeb .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9498da8fa4e3SBjoern A. Zeeb .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9499da8fa4e3SBjoern A. Zeeb .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9500da8fa4e3SBjoern A. Zeeb .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9501da8fa4e3SBjoern A. Zeeb .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9502da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9503da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 9504da8fa4e3SBjoern A. Zeeb .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9505da8fa4e3SBjoern A. Zeeb .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9506da8fa4e3SBjoern A. Zeeb .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9507da8fa4e3SBjoern A. Zeeb .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9508da8fa4e3SBjoern A. Zeeb .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9509da8fa4e3SBjoern A. Zeeb .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9510da8fa4e3SBjoern A. Zeeb .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9511da8fa4e3SBjoern A. Zeeb .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9512da8fa4e3SBjoern A. Zeeb .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9513da8fa4e3SBjoern A. Zeeb .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9514da8fa4e3SBjoern A. Zeeb .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9515da8fa4e3SBjoern A. Zeeb .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9516da8fa4e3SBjoern A. Zeeb .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9517da8fa4e3SBjoern A. Zeeb .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9518da8fa4e3SBjoern A. Zeeb .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9519da8fa4e3SBjoern A. Zeeb .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9520da8fa4e3SBjoern A. Zeeb .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9521da8fa4e3SBjoern A. Zeeb .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 9522da8fa4e3SBjoern A. Zeeb .gen_addba_send = ath10k_wmi_op_gen_addba_send, 9523da8fa4e3SBjoern A. Zeeb .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 9524da8fa4e3SBjoern A. Zeeb .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9525da8fa4e3SBjoern A. Zeeb .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, 9526da8fa4e3SBjoern A. Zeeb .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, 9527da8fa4e3SBjoern A. Zeeb .gen_pdev_enable_adaptive_cca = 9528da8fa4e3SBjoern A. Zeeb ath10k_wmi_op_gen_pdev_enable_adaptive_cca, 9529da8fa4e3SBjoern A. Zeeb .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype, 9530da8fa4e3SBjoern A. Zeeb .gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing, 9531da8fa4e3SBjoern A. Zeeb /* .gen_bcn_tmpl not implemented */ 9532da8fa4e3SBjoern A. Zeeb /* .gen_prb_tmpl not implemented */ 9533da8fa4e3SBjoern A. Zeeb /* .gen_p2p_go_bcn_ie not implemented */ 9534da8fa4e3SBjoern A. Zeeb /* .gen_adaptive_qcs not implemented */ 9535da8fa4e3SBjoern A. Zeeb }; 9536da8fa4e3SBjoern A. Zeeb 9537da8fa4e3SBjoern A. Zeeb static const struct wmi_ops wmi_10_4_ops = { 9538da8fa4e3SBjoern A. Zeeb .rx = ath10k_wmi_10_4_op_rx, 9539da8fa4e3SBjoern A. Zeeb .map_svc = wmi_10_4_svc_map, 9540da8fa4e3SBjoern A. Zeeb 9541da8fa4e3SBjoern A. Zeeb .pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats, 9542da8fa4e3SBjoern A. Zeeb .pull_scan = ath10k_wmi_op_pull_scan_ev, 9543da8fa4e3SBjoern A. Zeeb .pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev, 9544da8fa4e3SBjoern A. Zeeb .pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev, 9545da8fa4e3SBjoern A. Zeeb .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9546da8fa4e3SBjoern A. Zeeb .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9547da8fa4e3SBjoern A. Zeeb .pull_swba = ath10k_wmi_10_4_op_pull_swba_ev, 9548da8fa4e3SBjoern A. Zeeb .pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr, 9549da8fa4e3SBjoern A. Zeeb .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev, 9550da8fa4e3SBjoern A. Zeeb .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev, 9551da8fa4e3SBjoern A. Zeeb .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9552da8fa4e3SBjoern A. Zeeb .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 9553da8fa4e3SBjoern A. Zeeb .pull_dfs_status_ev = ath10k_wmi_10_4_op_pull_dfs_status_ev, 9554da8fa4e3SBjoern A. Zeeb .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme, 9555da8fa4e3SBjoern A. Zeeb 9556da8fa4e3SBjoern A. Zeeb .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9557da8fa4e3SBjoern A. Zeeb .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9558da8fa4e3SBjoern A. Zeeb .gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr, 9559da8fa4e3SBjoern A. Zeeb .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9560da8fa4e3SBjoern A. Zeeb .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9561da8fa4e3SBjoern A. Zeeb .gen_init = ath10k_wmi_10_4_op_gen_init, 9562da8fa4e3SBjoern A. Zeeb .gen_start_scan = ath10k_wmi_op_gen_start_scan, 9563da8fa4e3SBjoern A. Zeeb .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9564da8fa4e3SBjoern A. Zeeb .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9565da8fa4e3SBjoern A. Zeeb .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9566da8fa4e3SBjoern A. Zeeb .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9567da8fa4e3SBjoern A. Zeeb .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9568da8fa4e3SBjoern A. Zeeb .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9569da8fa4e3SBjoern A. Zeeb .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9570da8fa4e3SBjoern A. Zeeb .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9571da8fa4e3SBjoern A. Zeeb .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9572da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9573da8fa4e3SBjoern A. Zeeb .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 9574da8fa4e3SBjoern A. Zeeb .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9575da8fa4e3SBjoern A. Zeeb .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9576da8fa4e3SBjoern A. Zeeb .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9577da8fa4e3SBjoern A. Zeeb .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9578da8fa4e3SBjoern A. Zeeb .gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc, 9579da8fa4e3SBjoern A. Zeeb .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9580da8fa4e3SBjoern A. Zeeb .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9581da8fa4e3SBjoern A. Zeeb .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9582da8fa4e3SBjoern A. Zeeb .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9583da8fa4e3SBjoern A. Zeeb .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9584da8fa4e3SBjoern A. Zeeb .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9585da8fa4e3SBjoern A. Zeeb .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9586da8fa4e3SBjoern A. Zeeb .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9587da8fa4e3SBjoern A. Zeeb .gen_dbglog_cfg = ath10k_wmi_10_4_op_gen_dbglog_cfg, 9588da8fa4e3SBjoern A. Zeeb .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9589da8fa4e3SBjoern A. Zeeb .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9590da8fa4e3SBjoern A. Zeeb .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9591da8fa4e3SBjoern A. Zeeb .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 9592da8fa4e3SBjoern A. Zeeb .gen_addba_send = ath10k_wmi_op_gen_addba_send, 9593da8fa4e3SBjoern A. Zeeb .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 9594da8fa4e3SBjoern A. Zeeb .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9595da8fa4e3SBjoern A. Zeeb .fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill, 9596da8fa4e3SBjoern A. Zeeb .ext_resource_config = ath10k_wmi_10_4_ext_resource_config, 9597da8fa4e3SBjoern A. Zeeb .gen_update_fw_tdls_state = ath10k_wmi_10_4_gen_update_fw_tdls_state, 9598da8fa4e3SBjoern A. Zeeb .gen_tdls_peer_update = ath10k_wmi_10_4_gen_tdls_peer_update, 9599da8fa4e3SBjoern A. Zeeb .gen_pdev_get_tpc_table_cmdid = 9600da8fa4e3SBjoern A. Zeeb ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid, 9601da8fa4e3SBjoern A. Zeeb .gen_radar_found = ath10k_wmi_10_4_gen_radar_found, 9602da8fa4e3SBjoern A. Zeeb .gen_per_peer_per_tid_cfg = ath10k_wmi_10_4_gen_per_peer_per_tid_cfg, 9603da8fa4e3SBjoern A. Zeeb 9604da8fa4e3SBjoern A. Zeeb /* shared with 10.2 */ 9605da8fa4e3SBjoern A. Zeeb .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9606da8fa4e3SBjoern A. Zeeb .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9607da8fa4e3SBjoern A. Zeeb .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature, 9608da8fa4e3SBjoern A. Zeeb .get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype, 9609da8fa4e3SBjoern A. Zeeb .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, 9610da8fa4e3SBjoern A. Zeeb .gen_echo = ath10k_wmi_op_gen_echo, 9611da8fa4e3SBjoern A. Zeeb .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, 9612da8fa4e3SBjoern A. Zeeb }; 9613da8fa4e3SBjoern A. Zeeb 9614da8fa4e3SBjoern A. Zeeb int ath10k_wmi_attach(struct ath10k *ar) 9615da8fa4e3SBjoern A. Zeeb { 9616da8fa4e3SBjoern A. Zeeb switch (ar->running_fw->fw_file.wmi_op_version) { 9617da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_10_4: 9618da8fa4e3SBjoern A. Zeeb ar->wmi.ops = &wmi_10_4_ops; 9619da8fa4e3SBjoern A. Zeeb ar->wmi.cmd = &wmi_10_4_cmd_map; 9620da8fa4e3SBjoern A. Zeeb ar->wmi.vdev_param = &wmi_10_4_vdev_param_map; 9621da8fa4e3SBjoern A. Zeeb ar->wmi.pdev_param = &wmi_10_4_pdev_param_map; 9622da8fa4e3SBjoern A. Zeeb ar->wmi.peer_param = &wmi_peer_param_map; 9623da8fa4e3SBjoern A. Zeeb ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 9624da8fa4e3SBjoern A. Zeeb ar->wmi_key_cipher = wmi_key_cipher_suites; 9625da8fa4e3SBjoern A. Zeeb break; 9626da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_10_2_4: 9627da8fa4e3SBjoern A. Zeeb ar->wmi.cmd = &wmi_10_2_4_cmd_map; 9628da8fa4e3SBjoern A. Zeeb ar->wmi.ops = &wmi_10_2_4_ops; 9629da8fa4e3SBjoern A. Zeeb ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map; 9630da8fa4e3SBjoern A. Zeeb ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map; 9631da8fa4e3SBjoern A. Zeeb ar->wmi.peer_param = &wmi_peer_param_map; 9632da8fa4e3SBjoern A. Zeeb ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 9633da8fa4e3SBjoern A. Zeeb ar->wmi_key_cipher = wmi_key_cipher_suites; 9634da8fa4e3SBjoern A. Zeeb break; 9635da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_10_2: 9636da8fa4e3SBjoern A. Zeeb ar->wmi.cmd = &wmi_10_2_cmd_map; 9637da8fa4e3SBjoern A. Zeeb ar->wmi.ops = &wmi_10_2_ops; 9638da8fa4e3SBjoern A. Zeeb ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 9639da8fa4e3SBjoern A. Zeeb ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 9640da8fa4e3SBjoern A. Zeeb ar->wmi.peer_param = &wmi_peer_param_map; 9641da8fa4e3SBjoern A. Zeeb ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 9642da8fa4e3SBjoern A. Zeeb ar->wmi_key_cipher = wmi_key_cipher_suites; 9643da8fa4e3SBjoern A. Zeeb break; 9644da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_10_1: 9645da8fa4e3SBjoern A. Zeeb ar->wmi.cmd = &wmi_10x_cmd_map; 9646da8fa4e3SBjoern A. Zeeb ar->wmi.ops = &wmi_10_1_ops; 9647da8fa4e3SBjoern A. Zeeb ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 9648da8fa4e3SBjoern A. Zeeb ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 9649da8fa4e3SBjoern A. Zeeb ar->wmi.peer_param = &wmi_peer_param_map; 9650da8fa4e3SBjoern A. Zeeb ar->wmi.peer_flags = &wmi_10x_peer_flags_map; 9651da8fa4e3SBjoern A. Zeeb ar->wmi_key_cipher = wmi_key_cipher_suites; 9652da8fa4e3SBjoern A. Zeeb break; 9653da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_MAIN: 9654da8fa4e3SBjoern A. Zeeb ar->wmi.cmd = &wmi_cmd_map; 9655da8fa4e3SBjoern A. Zeeb ar->wmi.ops = &wmi_ops; 9656da8fa4e3SBjoern A. Zeeb ar->wmi.vdev_param = &wmi_vdev_param_map; 9657da8fa4e3SBjoern A. Zeeb ar->wmi.pdev_param = &wmi_pdev_param_map; 9658da8fa4e3SBjoern A. Zeeb ar->wmi.peer_param = &wmi_peer_param_map; 9659da8fa4e3SBjoern A. Zeeb ar->wmi.peer_flags = &wmi_peer_flags_map; 9660da8fa4e3SBjoern A. Zeeb ar->wmi_key_cipher = wmi_key_cipher_suites; 9661da8fa4e3SBjoern A. Zeeb break; 9662da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_TLV: 9663da8fa4e3SBjoern A. Zeeb ath10k_wmi_tlv_attach(ar); 9664da8fa4e3SBjoern A. Zeeb ar->wmi_key_cipher = wmi_tlv_key_cipher_suites; 9665da8fa4e3SBjoern A. Zeeb break; 9666da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_UNSET: 9667da8fa4e3SBjoern A. Zeeb case ATH10K_FW_WMI_OP_VERSION_MAX: 9668da8fa4e3SBjoern A. Zeeb ath10k_err(ar, "unsupported WMI op version: %d\n", 9669da8fa4e3SBjoern A. Zeeb ar->running_fw->fw_file.wmi_op_version); 9670da8fa4e3SBjoern A. Zeeb return -EINVAL; 9671da8fa4e3SBjoern A. Zeeb } 9672da8fa4e3SBjoern A. Zeeb 9673da8fa4e3SBjoern A. Zeeb init_completion(&ar->wmi.service_ready); 9674da8fa4e3SBjoern A. Zeeb init_completion(&ar->wmi.unified_ready); 9675da8fa4e3SBjoern A. Zeeb init_completion(&ar->wmi.barrier); 9676da8fa4e3SBjoern A. Zeeb init_completion(&ar->wmi.radar_confirm); 9677da8fa4e3SBjoern A. Zeeb 9678da8fa4e3SBjoern A. Zeeb INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work); 9679da8fa4e3SBjoern A. Zeeb INIT_WORK(&ar->radar_confirmation_work, 9680da8fa4e3SBjoern A. Zeeb ath10k_radar_confirmation_work); 9681da8fa4e3SBjoern A. Zeeb 9682da8fa4e3SBjoern A. Zeeb if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF, 9683da8fa4e3SBjoern A. Zeeb ar->running_fw->fw_file.fw_features)) { 9684da8fa4e3SBjoern A. Zeeb idr_init(&ar->wmi.mgmt_pending_tx); 9685da8fa4e3SBjoern A. Zeeb } 9686da8fa4e3SBjoern A. Zeeb 9687da8fa4e3SBjoern A. Zeeb return 0; 9688da8fa4e3SBjoern A. Zeeb } 9689da8fa4e3SBjoern A. Zeeb 9690da8fa4e3SBjoern A. Zeeb void ath10k_wmi_free_host_mem(struct ath10k *ar) 9691da8fa4e3SBjoern A. Zeeb { 9692da8fa4e3SBjoern A. Zeeb int i; 9693da8fa4e3SBjoern A. Zeeb 9694da8fa4e3SBjoern A. Zeeb /* free the host memory chunks requested by firmware */ 9695da8fa4e3SBjoern A. Zeeb for (i = 0; i < ar->wmi.num_mem_chunks; i++) { 9696da8fa4e3SBjoern A. Zeeb dma_free_coherent(ar->dev, 9697da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[i].len, 9698da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[i].vaddr, 9699da8fa4e3SBjoern A. Zeeb ar->wmi.mem_chunks[i].paddr); 9700da8fa4e3SBjoern A. Zeeb } 9701da8fa4e3SBjoern A. Zeeb 9702da8fa4e3SBjoern A. Zeeb ar->wmi.num_mem_chunks = 0; 9703da8fa4e3SBjoern A. Zeeb } 9704da8fa4e3SBjoern A. Zeeb 9705da8fa4e3SBjoern A. Zeeb static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr, 9706da8fa4e3SBjoern A. Zeeb void *ctx) 9707da8fa4e3SBjoern A. Zeeb { 9708da8fa4e3SBjoern A. Zeeb struct ath10k_mgmt_tx_pkt_addr *pkt_addr = ptr; 9709da8fa4e3SBjoern A. Zeeb struct ath10k *ar = ctx; 9710da8fa4e3SBjoern A. Zeeb struct sk_buff *msdu; 9711da8fa4e3SBjoern A. Zeeb 9712da8fa4e3SBjoern A. Zeeb ath10k_dbg(ar, ATH10K_DBG_WMI, 9713da8fa4e3SBjoern A. Zeeb "force cleanup mgmt msdu_id %u\n", msdu_id); 9714da8fa4e3SBjoern A. Zeeb 9715da8fa4e3SBjoern A. Zeeb msdu = pkt_addr->vaddr; 9716da8fa4e3SBjoern A. Zeeb dma_unmap_single(ar->dev, pkt_addr->paddr, 9717da8fa4e3SBjoern A. Zeeb msdu->len, DMA_TO_DEVICE); 9718da8fa4e3SBjoern A. Zeeb ieee80211_free_txskb(ar->hw, msdu); 9719da8fa4e3SBjoern A. Zeeb 9720da8fa4e3SBjoern A. Zeeb return 0; 9721da8fa4e3SBjoern A. Zeeb } 9722da8fa4e3SBjoern A. Zeeb 9723da8fa4e3SBjoern A. Zeeb void ath10k_wmi_detach(struct ath10k *ar) 9724da8fa4e3SBjoern A. Zeeb { 9725da8fa4e3SBjoern A. Zeeb if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF, 9726da8fa4e3SBjoern A. Zeeb ar->running_fw->fw_file.fw_features)) { 9727da8fa4e3SBjoern A. Zeeb spin_lock_bh(&ar->data_lock); 9728da8fa4e3SBjoern A. Zeeb idr_for_each(&ar->wmi.mgmt_pending_tx, 9729da8fa4e3SBjoern A. Zeeb ath10k_wmi_mgmt_tx_clean_up_pending, ar); 9730da8fa4e3SBjoern A. Zeeb idr_destroy(&ar->wmi.mgmt_pending_tx); 9731da8fa4e3SBjoern A. Zeeb spin_unlock_bh(&ar->data_lock); 9732da8fa4e3SBjoern A. Zeeb } 9733da8fa4e3SBjoern A. Zeeb 9734da8fa4e3SBjoern A. Zeeb cancel_work_sync(&ar->svc_rdy_work); 9735da8fa4e3SBjoern A. Zeeb dev_kfree_skb(ar->svc_rdy_skb); 9736da8fa4e3SBjoern A. Zeeb } 9737